| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "dbus/values_util.h" | 5 #include "dbus/values_util.h" |
| 6 | 6 |
| 7 #include <memory> |
| 8 |
| 7 #include "base/json/json_writer.h" | 9 #include "base/json/json_writer.h" |
| 8 #include "base/logging.h" | 10 #include "base/logging.h" |
| 9 #include "base/memory/scoped_ptr.h" | |
| 10 #include "base/values.h" | 11 #include "base/values.h" |
| 11 #include "dbus/message.h" | 12 #include "dbus/message.h" |
| 12 | 13 |
| 13 namespace dbus { | 14 namespace dbus { |
| 14 | 15 |
| 15 namespace { | 16 namespace { |
| 16 | 17 |
| 17 // Returns whether |value| is exactly representable by double or not. | 18 // Returns whether |value| is exactly representable by double or not. |
| 18 template<typename T> | 19 template<typename T> |
| 19 bool IsExactlyRepresentableByDouble(T value) { | 20 bool IsExactlyRepresentableByDouble(T value) { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 40 if (!reader->PopDictEntry(&entry_reader)) | 41 if (!reader->PopDictEntry(&entry_reader)) |
| 41 return false; | 42 return false; |
| 42 // Get key as a string. | 43 // Get key as a string. |
| 43 std::string key_string; | 44 std::string key_string; |
| 44 if (entry_reader.GetDataType() == Message::STRING) { | 45 if (entry_reader.GetDataType() == Message::STRING) { |
| 45 // If the type of keys is STRING, pop it directly. | 46 // If the type of keys is STRING, pop it directly. |
| 46 if (!entry_reader.PopString(&key_string)) | 47 if (!entry_reader.PopString(&key_string)) |
| 47 return false; | 48 return false; |
| 48 } else { | 49 } else { |
| 49 // If the type of keys is not STRING, convert it to string. | 50 // If the type of keys is not STRING, convert it to string. |
| 50 scoped_ptr<base::Value> key(PopDataAsValue(&entry_reader)); | 51 std::unique_ptr<base::Value> key(PopDataAsValue(&entry_reader)); |
| 51 if (!key) | 52 if (!key) |
| 52 return false; | 53 return false; |
| 53 // Use JSONWriter to convert an arbitrary value to a string. | 54 // Use JSONWriter to convert an arbitrary value to a string. |
| 54 base::JSONWriter::Write(*key, &key_string); | 55 base::JSONWriter::Write(*key, &key_string); |
| 55 } | 56 } |
| 56 // Get the value and set the key-value pair. | 57 // Get the value and set the key-value pair. |
| 57 base::Value* value = PopDataAsValue(&entry_reader); | 58 base::Value* value = PopDataAsValue(&entry_reader); |
| 58 if (!value) | 59 if (!value) |
| 59 return false; | 60 return false; |
| 60 dictionary_value->SetWithoutPathExpansion(key_string, value); | 61 dictionary_value->SetWithoutPathExpansion(key_string, value); |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 169 // Cannot distinguish a file descriptor from an int | 170 // Cannot distinguish a file descriptor from an int |
| 170 NOTREACHED(); | 171 NOTREACHED(); |
| 171 break; | 172 break; |
| 172 } | 173 } |
| 173 case Message::ARRAY: { | 174 case Message::ARRAY: { |
| 174 MessageReader sub_reader(NULL); | 175 MessageReader sub_reader(NULL); |
| 175 if (reader->PopArray(&sub_reader)) { | 176 if (reader->PopArray(&sub_reader)) { |
| 176 // If the type of the array's element is DICT_ENTRY, create a | 177 // If the type of the array's element is DICT_ENTRY, create a |
| 177 // DictionaryValue, otherwise create a ListValue. | 178 // DictionaryValue, otherwise create a ListValue. |
| 178 if (sub_reader.GetDataType() == Message::DICT_ENTRY) { | 179 if (sub_reader.GetDataType() == Message::DICT_ENTRY) { |
| 179 scoped_ptr<base::DictionaryValue> dictionary_value( | 180 std::unique_ptr<base::DictionaryValue> dictionary_value( |
| 180 new base::DictionaryValue); | 181 new base::DictionaryValue); |
| 181 if (PopDictionaryEntries(&sub_reader, dictionary_value.get())) | 182 if (PopDictionaryEntries(&sub_reader, dictionary_value.get())) |
| 182 result = dictionary_value.release(); | 183 result = dictionary_value.release(); |
| 183 } else { | 184 } else { |
| 184 scoped_ptr<base::ListValue> list_value(new base::ListValue); | 185 std::unique_ptr<base::ListValue> list_value(new base::ListValue); |
| 185 if (PopListElements(&sub_reader, list_value.get())) | 186 if (PopListElements(&sub_reader, list_value.get())) |
| 186 result = list_value.release(); | 187 result = list_value.release(); |
| 187 } | 188 } |
| 188 } | 189 } |
| 189 break; | 190 break; |
| 190 } | 191 } |
| 191 case Message::STRUCT: { | 192 case Message::STRUCT: { |
| 192 MessageReader sub_reader(NULL); | 193 MessageReader sub_reader(NULL); |
| 193 if (reader->PopStruct(&sub_reader)) { | 194 if (reader->PopStruct(&sub_reader)) { |
| 194 scoped_ptr<base::ListValue> list_value(new base::ListValue); | 195 std::unique_ptr<base::ListValue> list_value(new base::ListValue); |
| 195 if (PopListElements(&sub_reader, list_value.get())) | 196 if (PopListElements(&sub_reader, list_value.get())) |
| 196 result = list_value.release(); | 197 result = list_value.release(); |
| 197 } | 198 } |
| 198 break; | 199 break; |
| 199 } | 200 } |
| 200 case Message::DICT_ENTRY: | 201 case Message::DICT_ENTRY: |
| 201 // DICT_ENTRY must be popped as an element of an array. | 202 // DICT_ENTRY must be popped as an element of an array. |
| 202 NOTREACHED(); | 203 NOTREACHED(); |
| 203 break; | 204 break; |
| 204 case Message::VARIANT: { | 205 case Message::VARIANT: { |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 298 } | 299 } |
| 299 | 300 |
| 300 void AppendValueDataAsVariant(MessageWriter* writer, const base::Value& value) { | 301 void AppendValueDataAsVariant(MessageWriter* writer, const base::Value& value) { |
| 301 MessageWriter variant_writer(NULL); | 302 MessageWriter variant_writer(NULL); |
| 302 writer->OpenVariant(GetTypeSignature(value), &variant_writer); | 303 writer->OpenVariant(GetTypeSignature(value), &variant_writer); |
| 303 AppendValueData(&variant_writer, value); | 304 AppendValueData(&variant_writer, value); |
| 304 writer->CloseContainer(&variant_writer); | 305 writer->CloseContainer(&variant_writer); |
| 305 } | 306 } |
| 306 | 307 |
| 307 } // namespace dbus | 308 } // namespace dbus |
| OLD | NEW |