Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(239)

Side by Side Diff: chromeos/dbus/shill_client_helper.cc

Issue 10949030: This converts the Shill clients to allow propagation of shill errors (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "chromeos/dbus/shill_client_helper.h" 5 #include "chromeos/dbus/shill_client_helper.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/values.h" 8 #include "base/values.h"
9 #include "dbus/message.h" 9 #include "dbus/message.h"
10 #include "dbus/object_proxy.h" 10 #include "dbus/object_proxy.h"
11 #include "dbus/values_util.h" 11 #include "dbus/values_util.h"
12 #include "third_party/cros_system_api/dbus/service_constants.h" 12 #include "third_party/cros_system_api/dbus/service_constants.h"
13 13
14 namespace chromeos { 14 namespace chromeos {
15 15
16 ShillClientHelper::ShillClientHelper(dbus::Bus* bus, 16 ShillClientHelper::ShillClientHelper(dbus::Bus* bus,
17 dbus::ObjectProxy* proxy) 17 dbus::ObjectProxy* proxy)
18 : blocking_method_caller_(bus, proxy), 18 : blocking_method_caller_(bus, proxy),
19 proxy_(proxy), 19 proxy_(proxy),
20 weak_ptr_factory_(this) { 20 weak_ptr_factory_(this) {
21 } 21 }
22 22
23 ShillClientHelper::~ShillClientHelper() { 23 ShillClientHelper::~ShillClientHelper() {
24 } 24 }
25 25
26 void ShillClientHelper::SetPropertyChangedHandler( 26 void ShillClientHelper::AddPropertyChangedObserver(
27 const PropertyChangedHandler& handler) { 27 PropertyChangedObserver* obs) {
hashimoto 2012/09/21 11:52:01 Rename this to |observer|
Greg Spencer (Chromium) 2012/09/21 22:03:47 Done.
28 property_changed_handler_ = handler; 28 observer_list_.AddObserver(obs);
29 } 29 }
30 30
31 void ShillClientHelper::ResetPropertyChangedHandler() { 31 void ShillClientHelper::RemovePropertyChangedObserver(
32 property_changed_handler_.Reset(); 32 PropertyChangedObserver* obs) {
hashimoto 2012/09/21 11:52:01 ditto.
Greg Spencer (Chromium) 2012/09/21 22:03:47 Done.
33 observer_list_.RemoveObserver(obs);
33 } 34 }
34 35
35 void ShillClientHelper::MonitorPropertyChanged( 36 void ShillClientHelper::MonitorPropertyChanged(
36 const std::string& interface_name) { 37 const std::string& interface_name) {
37 // We are not using dbus::PropertySet to monitor PropertyChanged signal 38 // We are not using dbus::PropertySet to monitor PropertyChanged signal
38 // because the interface is not "org.freedesktop.DBus.Properties". 39 // because the interface is not "org.freedesktop.DBus.Properties".
39 proxy_->ConnectToSignal(interface_name, 40 proxy_->ConnectToSignal(interface_name,
40 flimflam::kMonitorPropertyChanged, 41 flimflam::kMonitorPropertyChanged,
41 base::Bind(&ShillClientHelper::OnPropertyChanged, 42 base::Bind(&ShillClientHelper::OnPropertyChanged,
42 weak_ptr_factory_.GetWeakPtr()), 43 weak_ptr_factory_.GetWeakPtr()),
(...skipping 12 matching lines...) Expand all
55 56
56 void ShillClientHelper::CallObjectPathMethod( 57 void ShillClientHelper::CallObjectPathMethod(
57 dbus::MethodCall* method_call, 58 dbus::MethodCall* method_call,
58 const ObjectPathDBusMethodCallback& callback) { 59 const ObjectPathDBusMethodCallback& callback) {
59 proxy_->CallMethod(method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, 60 proxy_->CallMethod(method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
60 base::Bind(&ShillClientHelper::OnObjectPathMethod, 61 base::Bind(&ShillClientHelper::OnObjectPathMethod,
61 weak_ptr_factory_.GetWeakPtr(), 62 weak_ptr_factory_.GetWeakPtr(),
62 callback)); 63 callback));
63 } 64 }
64 65
66 void ShillClientHelper::CallObjectPathMethodWithErrorCallback(
67 dbus::MethodCall* method_call,
68 const ObjectPathDBusMethodCallback& callback,
69 const ErrorCallback& error_callback) {
70 proxy_->CallMethodWithErrorCallback(
71 method_call,
72 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
73 base::Bind(&ShillClientHelper::OnObjectPathMethod,
74 weak_ptr_factory_.GetWeakPtr(),
75 callback),
76 base::Bind(&ShillClientHelper::OnError,
77 weak_ptr_factory_.GetWeakPtr(),
78 error_callback));
79 }
80
65 void ShillClientHelper::CallDictionaryValueMethod( 81 void ShillClientHelper::CallDictionaryValueMethod(
66 dbus::MethodCall* method_call, 82 dbus::MethodCall* method_call,
67 const DictionaryValueCallback& callback) { 83 const DictionaryValueCallback& callback) {
68 proxy_->CallMethod(method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, 84 proxy_->CallMethod(method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
69 base::Bind(&ShillClientHelper::OnDictionaryValueMethod, 85 base::Bind(&ShillClientHelper::OnDictionaryValueMethod,
70 weak_ptr_factory_.GetWeakPtr(), 86 weak_ptr_factory_.GetWeakPtr(),
71 callback)); 87 callback));
72 } 88 }
73 89
74 void ShillClientHelper::CallVoidMethodWithErrorCallback( 90 void ShillClientHelper::CallVoidMethodWithErrorCallback(
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 base::DictionaryValue* result = NULL; 153 base::DictionaryValue* result = NULL;
138 if (!value || !value->GetAsDictionary(&result)) { 154 if (!value || !value->GetAsDictionary(&result)) {
139 delete value; 155 delete value;
140 return NULL; 156 return NULL;
141 } 157 }
142 return result; 158 return result;
143 } 159 }
144 160
145 // static 161 // static
146 void ShillClientHelper::AppendValueDataAsVariant(dbus::MessageWriter* writer, 162 void ShillClientHelper::AppendValueDataAsVariant(dbus::MessageWriter* writer,
147 const base::Value& value) { 163 const base::Value& value) {
148 // Support basic types and string-to-string dictionary. 164 // Support basic types and string-to-string dictionary.
149 switch (value.GetType()) { 165 switch (value.GetType()) {
150 case base::Value::TYPE_DICTIONARY: { 166 case base::Value::TYPE_DICTIONARY: {
151 const base::DictionaryValue* dictionary = NULL; 167 const base::DictionaryValue* dictionary = NULL;
152 value.GetAsDictionary(&dictionary); 168 value.GetAsDictionary(&dictionary);
153 dbus::MessageWriter variant_writer(NULL); 169 dbus::MessageWriter variant_writer(NULL);
154 writer->OpenVariant("a{ss}", &variant_writer); 170 writer->OpenVariant("a{ss}", &variant_writer);
155 dbus::MessageWriter array_writer(NULL); 171 dbus::MessageWriter array_writer(NULL);
156 variant_writer.OpenArray("{ss}", &array_writer); 172 variant_writer.OpenArray("{ss}", &array_writer);
157 for (base::DictionaryValue::Iterator it(*dictionary); 173 for (base::DictionaryValue::Iterator it(*dictionary);
(...skipping 20 matching lines...) Expand all
178 case base::Value::TYPE_STRING: 194 case base::Value::TYPE_STRING:
179 dbus::AppendBasicTypeValueDataAsVariant(writer, value); 195 dbus::AppendBasicTypeValueDataAsVariant(writer, value);
180 break; 196 break;
181 default: 197 default:
182 DLOG(ERROR) << "Unexpected type " << value.GetType(); 198 DLOG(ERROR) << "Unexpected type " << value.GetType();
183 } 199 }
184 200
185 } 201 }
186 202
187 void ShillClientHelper::OnSignalConnected(const std::string& interface, 203 void ShillClientHelper::OnSignalConnected(const std::string& interface,
188 const std::string& signal, 204 const std::string& signal,
189 bool success) { 205 bool success) {
190 LOG_IF(ERROR, !success) << "Connect to " << interface << " " << signal 206 LOG_IF(ERROR, !success) << "Connect to " << interface << " " << signal
191 << " failed."; 207 << " failed.";
192 } 208 }
193 209
194 void ShillClientHelper::OnPropertyChanged(dbus::Signal* signal) { 210 void ShillClientHelper::OnPropertyChanged(dbus::Signal* signal) {
195 if (property_changed_handler_.is_null()) 211 if (!observer_list_.might_have_observers())
hashimoto 2012/09/21 11:52:01 This early exit was necessary since calling Run()
Greg Spencer (Chromium) 2012/09/21 22:03:47 Sure, but why not early exit anyhow, to avoid havi
196 return; 212 return;
197 213
198 dbus::MessageReader reader(signal); 214 dbus::MessageReader reader(signal);
199 std::string name; 215 std::string name;
200 if (!reader.PopString(&name)) 216 if (!reader.PopString(&name))
201 return; 217 return;
202 scoped_ptr<base::Value> value(dbus::PopDataAsValue(&reader)); 218 scoped_ptr<base::Value> value(dbus::PopDataAsValue(&reader));
203 if (!value.get()) 219 if (!value.get())
204 return; 220 return;
205 property_changed_handler_.Run(name, *value); 221
222 FOR_EACH_OBSERVER(PropertyChangedObserver, observer_list_,
223 OnPropertyChanged(name, *value));
224
206 } 225 }
207 226
208 void ShillClientHelper::OnVoidMethod(const VoidDBusMethodCallback& callback, 227 void ShillClientHelper::OnVoidMethod(const VoidDBusMethodCallback& callback,
209 dbus::Response* response) { 228 dbus::Response* response) {
210 if (!response) { 229 if (!response) {
211 callback.Run(DBUS_METHOD_CALL_FAILURE); 230 callback.Run(DBUS_METHOD_CALL_FAILURE);
212 return; 231 return;
213 } 232 }
214 callback.Run(DBUS_METHOD_CALL_SUCCESS); 233 callback.Run(DBUS_METHOD_CALL_SUCCESS);
215 } 234 }
216 235
217 void ShillClientHelper::OnObjectPathMethod( 236 void ShillClientHelper::OnObjectPathMethod(
218 const ObjectPathDBusMethodCallback& callback, 237 const ObjectPathDBusMethodCallback& callback,
219 dbus::Response* response) { 238 dbus::Response* response) {
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 if (!value.get() || !value->GetAsDictionary(&result)) { 284 if (!value.get() || !value->GetAsDictionary(&result)) {
266 const std::string error_name; // No error name. 285 const std::string error_name; // No error name.
267 const std::string error_message = "Invalid response."; 286 const std::string error_message = "Invalid response.";
268 error_callback.Run(error_name, error_message); 287 error_callback.Run(error_name, error_message);
269 return; 288 return;
270 } 289 }
271 callback.Run(*result); 290 callback.Run(*result);
272 } 291 }
273 292
274 void ShillClientHelper::OnError(const ErrorCallback& error_callback, 293 void ShillClientHelper::OnError(const ErrorCallback& error_callback,
275 dbus::ErrorResponse* response) { 294 dbus::ErrorResponse* response) {
276 std::string error_name; 295 std::string error_name;
277 std::string error_message; 296 std::string error_message;
278 if (response) { 297 if (response) {
279 // Error message may contain the error message as string. 298 // Error message may contain the error message as string.
280 dbus::MessageReader reader(response); 299 dbus::MessageReader reader(response);
281 error_name = response->GetErrorName(); 300 error_name = response->GetErrorName();
282 reader.PopString(&error_message); 301 reader.PopString(&error_message);
283 } 302 }
284 error_callback.Run(error_name, error_message); 303 error_callback.Run(error_name, error_message);
285 } 304 }
286 305
287 } // namespace chromeos 306 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698