OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "chromeos/dbus/nfc_client_helpers.h" | 5 #include "chromeos/dbus/nfc_client_helpers.h" |
6 | 6 |
7 #include "base/stl_util.h" | 7 #include "base/stl_util.h" |
| 8 #include "dbus/values_util.h" |
8 | 9 |
9 namespace chromeos { | 10 namespace chromeos { |
10 namespace nfc_client_helpers { | 11 namespace nfc_client_helpers { |
11 | 12 |
12 const char kNoResponseError[] = "org.chromium.Error.NoResponse"; | 13 const char kNoResponseError[] = "org.chromium.Error.NoResponse"; |
13 const char kUnknownObjectError[] = "org.chromium.Error.UnknownObject"; | 14 const char kUnknownObjectError[] = "org.chromium.Error.UnknownObject"; |
14 | 15 |
15 void OnSuccess(const base::Closure& callback, dbus::Response* response) { | 16 void OnSuccess(const base::Closure& callback, dbus::Response* response) { |
16 DCHECK(response); | 17 DCHECK(response); |
17 callback.Run(); | 18 callback.Run(); |
18 } | 19 } |
19 | 20 |
20 void OnError(const ErrorCallback& error_callback, | 21 void OnError(const ErrorCallback& error_callback, |
21 dbus::ErrorResponse* response) { | 22 dbus::ErrorResponse* response) { |
22 // Error response has optional error message argument. | 23 // Error response has optional error message argument. |
23 std::string error_name; | 24 std::string error_name; |
24 std::string error_message; | 25 std::string error_message; |
25 if (response) { | 26 if (response) { |
26 dbus::MessageReader reader(response); | 27 dbus::MessageReader reader(response); |
27 error_name = response->GetErrorName(); | 28 error_name = response->GetErrorName(); |
28 reader.PopString(&error_message); | 29 reader.PopString(&error_message); |
29 } else { | 30 } else { |
30 error_name = kNoResponseError; | 31 error_name = kNoResponseError; |
31 error_message = ""; | 32 error_message = ""; |
32 } | 33 } |
33 error_callback.Run(error_name, error_message); | 34 error_callback.Run(error_name, error_message); |
34 } | 35 } |
35 | 36 |
| 37 void AppendValueDataAsVariant(dbus::MessageWriter* writer, |
| 38 const base::Value& value) { |
| 39 switch (value.GetType()) { |
| 40 case base::Value::TYPE_DICTIONARY: { |
| 41 const base::DictionaryValue* dictionary = NULL; |
| 42 value.GetAsDictionary(&dictionary); |
| 43 dbus::MessageWriter variant_writer(NULL); |
| 44 dbus::MessageWriter array_writer(NULL); |
| 45 writer->OpenVariant("a{sv}", &variant_writer); |
| 46 variant_writer.OpenArray("{sv}", &array_writer); |
| 47 for (base::DictionaryValue::Iterator iter(*dictionary); |
| 48 !iter.IsAtEnd(); iter.Advance()) { |
| 49 dbus::MessageWriter entry_writer(NULL); |
| 50 array_writer.OpenDictEntry(&entry_writer); |
| 51 entry_writer.AppendString(iter.key()); |
| 52 AppendValueDataAsVariant(&entry_writer, iter.value()); |
| 53 array_writer.CloseContainer(&entry_writer); |
| 54 } |
| 55 variant_writer.CloseContainer(&array_writer); |
| 56 writer->CloseContainer(&variant_writer); |
| 57 break; |
| 58 } |
| 59 case base::Value::TYPE_LIST: { |
| 60 const base::ListValue* list = NULL; |
| 61 value.GetAsList(&list); |
| 62 dbus::MessageWriter variant_writer(NULL); |
| 63 dbus::MessageWriter array_writer(NULL); |
| 64 writer->OpenVariant("av", &variant_writer); |
| 65 variant_writer.OpenArray("v", &array_writer); |
| 66 for (base::ListValue::const_iterator iter = list->begin(); |
| 67 iter != list->end(); ++iter) { |
| 68 const base::Value* value = *iter; |
| 69 AppendValueDataAsVariant(&array_writer, *value); |
| 70 } |
| 71 variant_writer.CloseContainer(&array_writer); |
| 72 writer->CloseContainer(&variant_writer); |
| 73 break; |
| 74 } |
| 75 case base::Value::TYPE_BOOLEAN: |
| 76 case base::Value::TYPE_INTEGER: |
| 77 case base::Value::TYPE_DOUBLE: |
| 78 case base::Value::TYPE_STRING: |
| 79 dbus::AppendBasicTypeValueDataAsVariant(writer, value); |
| 80 break; |
| 81 default: |
| 82 DLOG(ERROR) << "Unexpected type: " << value.GetType(); |
| 83 } |
| 84 } |
| 85 |
36 DBusObjectMap::DBusObjectMap(const std::string& service_name, | 86 DBusObjectMap::DBusObjectMap(const std::string& service_name, |
37 Delegate* delegate, | 87 Delegate* delegate, |
38 dbus::Bus* bus) | 88 dbus::Bus* bus) |
39 : bus_(bus), | 89 : bus_(bus), |
40 service_name_(service_name), | 90 service_name_(service_name), |
41 delegate_(delegate) { | 91 delegate_(delegate) { |
42 DCHECK(bus_); | 92 DCHECK(bus_); |
43 DCHECK(delegate_); | 93 DCHECK(delegate_); |
44 } | 94 } |
45 | 95 |
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
234 NfcPropertySet* properties = | 284 NfcPropertySet* properties = |
235 object_map->GetObjectProperties(object_proxy_path); | 285 object_map->GetObjectProperties(object_proxy_path); |
236 if (properties) | 286 if (properties) |
237 return properties; | 287 return properties; |
238 } | 288 } |
239 return NULL; | 289 return NULL; |
240 } | 290 } |
241 | 291 |
242 } // namespace nfc_client_helpers | 292 } // namespace nfc_client_helpers |
243 } // namespace chromeos | 293 } // namespace chromeos |
OLD | NEW |