void prop_kv_config::g_save(const t_map & data, stream_writer * writer, abort_callback & abort) throw() { try { // Write count writer->write_lendian_t(data.get_count(), abort); for (t_map::const_iterator iter = data.first(); iter.is_valid(); ++iter) { // Write key writer->write_string(iter->m_key, abort); // Write vt writer->write_lendian_t(iter->m_value.vt, abort); // Write value int cbWrite = 0; switch (iter->m_value.vt) { case VT_UI1: case VT_I1: cbWrite = sizeof(BYTE); break; case VT_I2: case VT_UI2: case VT_BOOL: cbWrite = sizeof(short); break; case VT_I4: case VT_UI4: case VT_R4: case VT_INT: case VT_UINT: cbWrite = sizeof(long); break; case VT_I8: case VT_UI8: cbWrite = sizeof(LONGLONG); break; case VT_R8: case VT_CY: case VT_DATE: cbWrite = sizeof(double); break; } if (cbWrite != 0) { writer->write(&iter->m_value.bVal, cbWrite, abort); } else if (iter->m_value.vt == VT_BSTR) { pfc::stringcvt::string_utf8_from_wide conv = iter->m_value.bstrVal; writer->write_string(conv, abort); } } } catch (std::exception &) { } }