OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "chrome/browser/chromeos/dbus/flimflam_client_helper.h" | |
6 | |
7 #include "base/bind.h" | |
8 #include "base/values.h" | |
9 #include "dbus/message.h" | |
10 #include "dbus/object_proxy.h" | |
11 #include "dbus/values_util.h" | |
12 #include "third_party/cros_system_api/dbus/service_constants.h" | |
13 | |
14 namespace chromeos { | |
15 | |
16 FlimflamClientHelper::FlimflamClientHelper(dbus::ObjectProxy* proxy) | |
17 : weak_ptr_factory_(this), | |
18 proxy_(proxy) { | |
19 } | |
20 | |
21 FlimflamClientHelper::~FlimflamClientHelper() { | |
22 } | |
23 | |
24 void FlimflamClientHelper::SetPropertyChangedHandler( | |
25 const PropertyChangedHandler& handler) { | |
26 property_changed_handler_ = handler; | |
27 } | |
28 | |
29 void FlimflamClientHelper::ResetPropertyChangedHandler() { | |
30 property_changed_handler_.Reset(); | |
31 } | |
32 | |
33 void FlimflamClientHelper::MonitorPropertyChanged( | |
34 const std::string& interface_name) { | |
35 // We are not using dbus::PropertySet to monitor PropertyChanged signal | |
36 // because the interface is not "org.freedesktop.DBus.Properties". | |
37 proxy_->ConnectToSignal(interface_name, | |
38 flimflam::kMonitorPropertyChanged, | |
39 base::Bind(&FlimflamClientHelper::OnPropertyChanged, | |
40 weak_ptr_factory_.GetWeakPtr()), | |
41 base::Bind(&FlimflamClientHelper::OnSignalConnected, | |
42 weak_ptr_factory_.GetWeakPtr())); | |
43 } | |
44 | |
45 void FlimflamClientHelper::CallVoidMethod(dbus::MethodCall* method_call, | |
46 const VoidCallback& callback) { | |
47 proxy_->CallMethod(method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, | |
48 base::Bind(&FlimflamClientHelper::OnVoidMethod, | |
49 weak_ptr_factory_.GetWeakPtr(), | |
50 callback)); | |
51 } | |
52 | |
53 void FlimflamClientHelper::CallDictionaryValueMethod( | |
54 dbus::MethodCall* method_call, | |
55 const DictionaryValueCallback& callback) { | |
56 proxy_->CallMethod(method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, | |
57 base::Bind(&FlimflamClientHelper::OnDictionaryValueMethod, | |
58 weak_ptr_factory_.GetWeakPtr(), | |
59 callback)); | |
60 } | |
61 | |
62 void FlimflamClientHelper::OnSignalConnected(const std::string& interface, | |
63 const std::string& signal, | |
64 bool success) { | |
65 LOG_IF(ERROR, !success) << "Connect to " << interface << " " << signal | |
66 << " failed."; | |
67 } | |
68 | |
69 void FlimflamClientHelper::OnPropertyChanged(dbus::Signal* signal) { | |
70 if (property_changed_handler_.is_null()) | |
71 return; | |
72 | |
73 dbus::MessageReader reader(signal); | |
74 std::string name; | |
75 if (!reader.PopString(&name)) | |
76 return; | |
77 scoped_ptr<base::Value> value(dbus::PopDataAsValue(&reader)); | |
78 if (!value.get()) | |
79 return; | |
80 property_changed_handler_.Run(name, *value); | |
81 } | |
82 | |
83 void FlimflamClientHelper::OnVoidMethod(const VoidCallback& callback, | |
84 dbus::Response* response) { | |
85 if (!response) { | |
86 callback.Run(DBUS_METHOD_CALL_FAILURE); | |
87 return; | |
88 } | |
89 callback.Run(DBUS_METHOD_CALL_SUCCESS); | |
90 } | |
91 | |
92 void FlimflamClientHelper::OnDictionaryValueMethod( | |
93 const DictionaryValueCallback& callback, | |
94 dbus::Response* response) { | |
95 if (!response) { | |
96 base::DictionaryValue result; | |
97 callback.Run(DBUS_METHOD_CALL_FAILURE, result); | |
98 return; | |
99 } | |
100 dbus::MessageReader reader(response); | |
101 scoped_ptr<base::Value> value(dbus::PopDataAsValue(&reader)); | |
102 base::DictionaryValue* result = NULL; | |
103 if (!value.get() || !value->GetAsDictionary(&result)) { | |
104 base::DictionaryValue result; | |
105 callback.Run(DBUS_METHOD_CALL_FAILURE, result); | |
106 return; | |
107 } | |
108 callback.Run(DBUS_METHOD_CALL_SUCCESS, *result); | |
109 } | |
110 | |
111 } // namespace chromeos | |
OLD | NEW |