Index: dbus/property.cc |
diff --git a/dbus/property.cc b/dbus/property.cc |
index faca4a0a1d76dd1d902c9da4353a2580d7bc524d..0ac65ef6991641d523fdd7f8b43ca045b44844e5 100644 |
--- a/dbus/property.cc |
+++ b/dbus/property.cc |
@@ -6,6 +6,8 @@ |
#include <stddef.h> |
+#include <memory> |
+ |
#include "base/bind.h" |
#include "base/logging.h" |
@@ -659,6 +661,70 @@ void Property<std::vector<std::pair<std::vector<uint8_t>, uint16_t>>>:: |
writer->CloseContainer(&variant_writer); |
} |
+// |
+// Property<std::map<std::string, std::vector<uint8_t>>> |
+// specialization. |
+// |
+ |
+template <> |
+bool Property<std::unordered_map<std::string, std::vector<uint8_t>>>:: |
+ PopValueFromReader(MessageReader* reader) { |
+ MessageReader variant_reader(nullptr); |
+ MessageReader dict_reader(nullptr); |
+ if (!reader->PopVariant(&variant_reader) || |
+ !variant_reader.PopArray(&dict_reader)) |
+ return false; |
+ |
+ value_.clear(); |
+ while (dict_reader.HasMoreData()) { |
+ MessageReader entry_reader(nullptr); |
+ if (!dict_reader.PopDictEntry(&entry_reader)) |
+ return false; |
+ |
+ std::string key; |
+ MessageReader value_varient_reader(nullptr); |
+ if (!entry_reader.PopString(&key) || |
+ !entry_reader.PopVariant(&value_varient_reader)) |
+ return false; |
+ |
+ const uint8_t* bytes = nullptr; |
+ size_t length = 0; |
+ if (!value_varient_reader.PopArrayOfBytes(&bytes, &length)) |
+ return false; |
+ |
+ value_[key].assign(bytes, bytes + length); |
+ } |
+ return true; |
+} |
+ |
+template <> |
+void Property<std::unordered_map<std::string, std::vector<uint8_t>>>:: |
+ AppendSetValueToWriter(MessageWriter* writer) { |
+ MessageWriter variant_writer(nullptr); |
+ MessageWriter dict_writer(nullptr); |
+ |
+ writer->OpenVariant("a{sv}", &variant_writer); |
+ variant_writer.OpenArray("{sv}", &dict_writer); |
+ |
+ for (const auto& pair : set_value_) { |
+ MessageWriter entry_writer(nullptr); |
+ dict_writer.OpenDictEntry(&entry_writer); |
+ |
+ entry_writer.AppendString(pair.first); |
+ |
+ MessageWriter value_varient_writer(nullptr); |
+ entry_writer.OpenVariant("ay", &value_varient_writer); |
+ value_varient_writer.AppendArrayOfBytes(pair.second.data(), |
+ pair.second.size()); |
+ entry_writer.CloseContainer(&value_varient_writer); |
+ |
+ dict_writer.CloseContainer(&entry_writer); |
+ } |
+ |
+ variant_writer.CloseContainer(&dict_writer); |
+ writer->CloseContainer(&variant_writer); |
+} |
+ |
template class Property<uint8_t>; |
template class Property<bool>; |
template class Property<int16_t>; |
@@ -675,5 +741,6 @@ template class Property<std::vector<ObjectPath> >; |
template class Property<std::vector<uint8_t>>; |
template class Property<std::map<std::string, std::string>>; |
template class Property<std::vector<std::pair<std::vector<uint8_t>, uint16_t>>>; |
+template class Property<std::unordered_map<std::string, std::vector<uint8_t>>>; |
} // namespace dbus |