| Index: dbus/property.cc
 | 
| diff --git a/dbus/property.cc b/dbus/property.cc
 | 
| index 9475a0728a6cca7e4de360caa10333593a4bda44..0e912f34daa20ec377b04ed7f302b61d6f58b242 100644
 | 
| --- a/dbus/property.cc
 | 
| +++ b/dbus/property.cc
 | 
| @@ -478,6 +478,103 @@ void Property<std::vector<uint8> >::AppendSetValueToWriter(
 | 
|    writer->CloseContainer(&variant_writer);
 | 
|  }
 | 
|  
 | 
| +//
 | 
| +// Property<std::map<std::string, std::string>> specialization.
 | 
| +//
 | 
| +
 | 
| +template <>
 | 
| +bool Property<std::map<std::string, std::string>>::PopValueFromReader(
 | 
| +    MessageReader* reader) {
 | 
| +  MessageReader variant_reader(NULL);
 | 
| +  MessageReader array_reader(NULL);
 | 
| +  if (!reader->PopVariant(&variant_reader) ||
 | 
| +      !variant_reader.PopArray(&array_reader))
 | 
| +    return false;
 | 
| +  value_.clear();
 | 
| +  while (array_reader.HasMoreData()) {
 | 
| +    dbus::MessageReader dict_entry_reader(NULL);
 | 
| +    if (!array_reader.PopDictEntry(&dict_entry_reader))
 | 
| +      return false;
 | 
| +    std::string key;
 | 
| +    std::string value;
 | 
| +    if (!dict_entry_reader.PopString(&key) ||
 | 
| +        !dict_entry_reader.PopString(&value))
 | 
| +      return false;
 | 
| +    value_[key] = value;
 | 
| +  }
 | 
| +  return true;
 | 
| +}
 | 
| +
 | 
| +template <>
 | 
| +void Property<std::map<std::string, std::string>>::AppendSetValueToWriter(
 | 
| +    MessageWriter* writer) {
 | 
| +  MessageWriter variant_writer(NULL);
 | 
| +  MessageWriter dict_writer(NULL);
 | 
| +  writer->OpenVariant("a{ss}", &variant_writer);
 | 
| +  variant_writer.OpenArray("{ss}", &dict_writer);
 | 
| +  for (const auto& pair : set_value_) {
 | 
| +    dbus::MessageWriter entry_writer(NULL);
 | 
| +    dict_writer.OpenDictEntry(&entry_writer);
 | 
| +    entry_writer.AppendString(pair.first);
 | 
| +    entry_writer.AppendString(pair.second);
 | 
| +    dict_writer.CloseContainer(&entry_writer);
 | 
| +  }
 | 
| +  variant_writer.CloseContainer(&dict_writer);
 | 
| +  writer->CloseContainer(&variant_writer);
 | 
| +}
 | 
| +
 | 
| +//
 | 
| +// Property<std::vector<std::pair<std::vector<uint8_t>, uint16_t>>>
 | 
| +// specialization.
 | 
| +//
 | 
| +
 | 
| +template <>
 | 
| +bool Property<std::vector<std::pair<std::vector<uint8_t>, uint16_t>>>::
 | 
| +    PopValueFromReader(MessageReader* reader) {
 | 
| +  MessageReader variant_reader(NULL);
 | 
| +  MessageReader array_reader(NULL);
 | 
| +  if (!reader->PopVariant(&variant_reader) ||
 | 
| +      !variant_reader.PopArray(&array_reader))
 | 
| +    return false;
 | 
| +
 | 
| +  value_.clear();
 | 
| +  while (array_reader.HasMoreData()) {
 | 
| +    dbus::MessageReader struct_reader(NULL);
 | 
| +    if (!array_reader.PopStruct(&struct_reader))
 | 
| +      return false;
 | 
| +
 | 
| +    std::pair<std::vector<uint8_t>, uint16_t> entry;
 | 
| +    const uint8* bytes = NULL;
 | 
| +    size_t length = 0;
 | 
| +    if (!struct_reader.PopArrayOfBytes(&bytes, &length))
 | 
| +      return false;
 | 
| +    entry.first.assign(bytes, bytes + length);
 | 
| +    if (!struct_reader.PopUint16(&entry.second))
 | 
| +      return false;
 | 
| +    value_.push_back(entry);
 | 
| +  }
 | 
| +  return true;
 | 
| +}
 | 
| +
 | 
| +template <>
 | 
| +void Property<std::vector<std::pair<std::vector<uint8_t>, uint16_t>>>::
 | 
| +    AppendSetValueToWriter(MessageWriter* writer) {
 | 
| +  MessageWriter variant_writer(NULL);
 | 
| +  MessageWriter array_writer(NULL);
 | 
| +  writer->OpenVariant("a(ayq)", &variant_writer);
 | 
| +  variant_writer.OpenArray("(ayq)", &array_writer);
 | 
| +  for (const auto& pair : set_value_) {
 | 
| +    dbus::MessageWriter struct_writer(nullptr);
 | 
| +    array_writer.OpenStruct(&struct_writer);
 | 
| +    struct_writer.AppendArrayOfBytes(std::get<0>(pair).data(),
 | 
| +                                     std::get<0>(pair).size());
 | 
| +    struct_writer.AppendUint16(std::get<1>(pair));
 | 
| +    array_writer.CloseContainer(&struct_writer);
 | 
| +  }
 | 
| +  variant_writer.CloseContainer(&array_writer);
 | 
| +  writer->CloseContainer(&variant_writer);
 | 
| +}
 | 
| +
 | 
|  template class Property<uint8>;
 | 
|  template class Property<bool>;
 | 
|  template class Property<int16>;
 | 
| @@ -492,5 +589,7 @@ template class Property<ObjectPath>;
 | 
|  template class Property<std::vector<std::string> >;
 | 
|  template class Property<std::vector<ObjectPath> >;
 | 
|  template class Property<std::vector<uint8> >;
 | 
| +template class Property<std::map<std::string, std::string>>;
 | 
| +template class Property<std::vector<std::pair<std::vector<uint8_t>, uint16_t>>>;
 | 
|  
 | 
|  }  // namespace dbus
 | 
| 
 |