Index: dbus/message.cc |
diff --git a/dbus/message.cc b/dbus/message.cc |
index aa9cc550e46ce792db8fdb1a4289d80fa7933865..7f8e071e6213cf85b279d01d20c53e51c03a4fe7 100644 |
--- a/dbus/message.cc |
+++ b/dbus/message.cc |
@@ -793,6 +793,143 @@ bool MessageReader::PopArrayOfObjectPaths( |
return true; |
} |
+// TODO(vlaviano): |
+// - Can we handle integral types better? |
+// - Add support for nested complex types. |
+// - Write an equivalent function for MessageWriter. |
+// - Write unit tests. |
+bool MessageReader::PopArrayOfDictEntries(DictionaryValue* dictionary) { |
+ CHECK(dictionary != NULL); |
+ MessageReader array_reader(message_); |
+ if (!PopArray(&array_reader)) { |
+ return false; |
+ } |
+ while (array_reader.HasMoreData()) { |
+ MessageReader dict_entry_reader(message_); |
+ if (!array_reader.PopContainer(DBUS_TYPE_DICT_ENTRY, &dict_entry_reader)) { |
+ return false; |
+ } |
+ std::string key; |
+ if (!dict_entry_reader.PopString(&key)) { |
+ return false; |
+ } |
+ MessageReader variant_reader(message_); |
+ if (!dict_entry_reader.PopVariant(&variant_reader)) { |
+ return false; |
+ } |
+ const Message::DataType type = variant_reader.GetDataType(); |
+ switch (type) { |
+ case Message::BYTE: { |
+ uint8 value = 0; |
+ if (!variant_reader.PopByte(&value)) { |
+ return false; |
+ } |
+ dictionary->SetInteger(key, value); |
+ break; |
+ } |
+ case Message::BOOL: { |
+ bool value = false; |
+ if (!variant_reader.PopBool(&value)) { |
+ return false; |
+ } |
+ dictionary->SetBoolean(key, value); |
+ break; |
+ } |
+ case Message::INT16: { |
+ int16 value = 0; |
+ if (!variant_reader.PopInt16(&value)) { |
+ return false; |
+ } |
+ dictionary->SetInteger(key, value); |
+ break; |
+ } |
+ case Message::UINT16: { |
+ uint16 value = 0; |
+ if (!variant_reader.PopUint16(&value)) { |
+ return false; |
+ } |
+ dictionary->SetInteger(key, value); |
+ break; |
+ } |
+ case Message::INT32: { |
+ int32 value = 0; |
+ if (!variant_reader.PopInt32(&value)) { |
+ return false; |
+ } |
+ dictionary->SetInteger(key, value); |
+ break; |
+ } |
+ case Message::UINT32: { |
+ uint32 value = 0; |
+ if (!variant_reader.PopUint32(&value)) { |
+ return false; |
+ } |
+ dictionary->SetInteger(key, value); |
+ break; |
+ } |
+ case Message::INT64: { |
+ int64 value = 0; |
+ if (!variant_reader.PopInt64(&value)) { |
+ return false; |
+ } |
+ dictionary->SetDouble(key, value); |
+ break; |
+ } |
+ case Message::UINT64: { |
+ uint64 value = 0; |
+ if (!variant_reader.PopUint64(&value)) { |
+ return false; |
+ } |
+ dictionary->SetDouble(key, value); |
+ break; |
+ } |
+ case Message::DOUBLE: { |
+ double value = 0; |
+ if (!variant_reader.PopDouble(&value)) { |
+ return false; |
+ } |
+ dictionary->SetDouble(key, value); |
+ break; |
+ } |
+ case Message::STRING: { |
+ std::string value; |
+ if (!variant_reader.PopString(&value)) { |
+ return false; |
+ } |
+ dictionary->SetString(key, value); |
+ break; |
+ } |
+ case Message::OBJECT_PATH: { |
+ std::string value; |
+ if (!variant_reader.PopObjectPath(&value)) { |
+ return false; |
+ } |
+ dictionary->SetString(key, value); |
+ break; |
+ } |
+ case Message::ARRAY: { |
+ // Not yet supported. |
+ return false; |
+ } |
+ case Message::STRUCT: { |
+ // Not yet supported. |
+ return false; |
+ } |
+ case Message::DICT_ENTRY: { |
+ // Not yet supported. |
+ return false; |
+ } |
+ case Message::VARIANT: { |
+ // Not yet supported. |
+ return false; |
+ } |
+ default: |
+ LOG(FATAL) << "Unknown type: " << type; |
+ } |
+ } |
+ return true; |
+} |
+ |
bool MessageReader::PopVariantOfByte(uint8* value) { |
return PopVariantOfBasic(DBUS_TYPE_BYTE, value); |
} |