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

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

Issue 11192024: Add chromeos::NetworkStateManager (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Clang fixes Created 8 years, 1 month 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 | Annotate | Revision Log
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_manager_client.h" 5 #include "chromeos/dbus/shill_manager_client.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/chromeos/chromeos_version.h" 8 #include "base/chromeos/chromeos_version.h"
9 #include "base/message_loop.h" 9 #include "base/message_loop.h"
10 #include "base/values.h" 10 #include "base/values.h"
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
154 const ErrorCallback& error_callback) OVERRIDE { 154 const ErrorCallback& error_callback) OVERRIDE {
155 dbus::MethodCall method_call(flimflam::kFlimflamManagerInterface, 155 dbus::MethodCall method_call(flimflam::kFlimflamManagerInterface,
156 flimflam::kGetServiceFunction); 156 flimflam::kGetServiceFunction);
157 dbus::MessageWriter writer(&method_call); 157 dbus::MessageWriter writer(&method_call);
158 AppendServicePropertiesDictionary(&writer, properties); 158 AppendServicePropertiesDictionary(&writer, properties);
159 helper_.CallObjectPathMethodWithErrorCallback(&method_call, 159 helper_.CallObjectPathMethodWithErrorCallback(&method_call,
160 callback, 160 callback,
161 error_callback); 161 error_callback);
162 } 162 }
163 163
164 virtual TestInterface* GetTestInterface() OVERRIDE {
165 return NULL;
166 }
167
164 private: 168 private:
165 dbus::ObjectProxy* proxy_; 169 dbus::ObjectProxy* proxy_;
166 ShillClientHelper helper_; 170 ShillClientHelper helper_;
167 171
168 DISALLOW_COPY_AND_ASSIGN(ShillManagerClientImpl); 172 DISALLOW_COPY_AND_ASSIGN(ShillManagerClientImpl);
169 }; 173 };
170 174
175 namespace {
176
177 struct ValueEquals {
178 ValueEquals(const Value* first) : first_(first) {}
179 bool operator ()(const Value* second) const {
180 return first_->Equals(second);
181 }
182 const Value* first_;
183 };
184
185 } // namespace
186
171 // A stub implementation of ShillManagerClient. 187 // A stub implementation of ShillManagerClient.
172 // Implemented: Stub cellular DeviceList entry for SMS testing. 188 // Implemented: Stub devices and services for NetworkStateManager tests.
173 class ShillManagerClientStubImpl : public ShillManagerClient { 189 // Implemented: Stub cellular device entry for SMS tests.
190 class ShillManagerClientStubImpl : public ShillManagerClient,
191 public ShillManagerClient::TestInterface {
174 public: 192 public:
175 ShillManagerClientStubImpl() : weak_ptr_factory_(this) { 193 ShillManagerClientStubImpl()
176 base::ListValue* device_list = new base::ListValue; 194 : initialized_(false),
177 // Note: names match Device stub map. 195 weak_ptr_factory_(this) {
178 const char kStubCellular1[] = "stub_cellular1"; 196 SetDefaultProperties();
179 const char kStubCellular2[] = "stub_cellular2"; 197 initialized_ = true;
180 device_list->Append(base::Value::CreateStringValue(kStubCellular1));
181 device_list->Append(base::Value::CreateStringValue(kStubCellular2));
182 stub_properties_.Set(flimflam::kDevicesProperty, device_list);
183 } 198 }
184 199
185 virtual ~ShillManagerClientStubImpl() {} 200 virtual ~ShillManagerClientStubImpl() {}
186 201
187 //////////////////////////////////
188 // ShillManagerClient overrides. 202 // ShillManagerClient overrides.
203
189 virtual void AddPropertyChangedObserver( 204 virtual void AddPropertyChangedObserver(
190 ShillPropertyChangedObserver* observer) OVERRIDE {} 205 ShillPropertyChangedObserver* observer) OVERRIDE {
206 observer_list_.AddObserver(observer);
207 }
191 208
192 virtual void RemovePropertyChangedObserver( 209 virtual void RemovePropertyChangedObserver(
193 ShillPropertyChangedObserver* observer) OVERRIDE {} 210 ShillPropertyChangedObserver* observer) OVERRIDE {
211 observer_list_.RemoveObserver(observer);
212 }
194 213
195 // ShillManagerClient override.
196 virtual void GetProperties(const DictionaryValueCallback& callback) OVERRIDE { 214 virtual void GetProperties(const DictionaryValueCallback& callback) OVERRIDE {
197 MessageLoop::current()->PostTask( 215 MessageLoop::current()->PostTask(
198 FROM_HERE, base::Bind( 216 FROM_HERE, base::Bind(
199 &ShillManagerClientStubImpl::PassStubProperties, 217 &ShillManagerClientStubImpl::PassStubProperties,
200 weak_ptr_factory_.GetWeakPtr(), 218 weak_ptr_factory_.GetWeakPtr(),
201 callback)); 219 callback));
202 } 220 }
203 221
204 // ShillManagerClient override.
205 virtual base::DictionaryValue* CallGetPropertiesAndBlock() OVERRIDE { 222 virtual base::DictionaryValue* CallGetPropertiesAndBlock() OVERRIDE {
206 return new base::DictionaryValue; 223 return stub_properties_.DeepCopy();
207 } 224 }
208 225
209 // ShillManagerClient override.
210 virtual void SetProperty(const std::string& name, 226 virtual void SetProperty(const std::string& name,
211 const base::Value& value, 227 const base::Value& value,
212 const base::Closure& callback, 228 const base::Closure& callback,
213 const ErrorCallback& error_callback) OVERRIDE { 229 const ErrorCallback& error_callback) OVERRIDE {
214 stub_properties_.Set(name, value.DeepCopy()); 230 stub_properties_.Set(name, value.DeepCopy());
215 MessageLoop::current()->PostTask(FROM_HERE, callback); 231 MessageLoop::current()->PostTask(FROM_HERE, callback);
216 } 232 }
217 233
218 // ShillManagerClient override.
219 virtual void RequestScan(const std::string& type, 234 virtual void RequestScan(const std::string& type,
220 const base::Closure& callback, 235 const base::Closure& callback,
221 const ErrorCallback& error_callback) OVERRIDE { 236 const ErrorCallback& error_callback) OVERRIDE {
222 MessageLoop::current()->PostTask(FROM_HERE, callback); 237 MessageLoop::current()->PostTask(FROM_HERE, callback);
238 const int kScanDelaySeconds = 3;
239 CallNotifyObserversPropertyChanged(
240 flimflam::kServicesProperty, kScanDelaySeconds);
223 } 241 }
224 242
225 // ShillManagerClient override.
226 virtual void EnableTechnology( 243 virtual void EnableTechnology(
227 const std::string& type, 244 const std::string& type,
228 const base::Closure& callback, 245 const base::Closure& callback,
229 const ErrorCallback& error_callback) OVERRIDE { 246 const ErrorCallback& error_callback) OVERRIDE {
247 base::ListValue* enabled_list = NULL;
248 if (!stub_properties_.GetListWithoutPathExpansion(
249 flimflam::kEnabledTechnologiesProperty, &enabled_list)) {
250 MessageLoop::current()->PostTask(
251 FROM_HERE,
252 base::Bind(error_callback, "StubError", "Property not found"));
253 return;
254 }
230 MessageLoop::current()->PostTask(FROM_HERE, callback); 255 MessageLoop::current()->PostTask(FROM_HERE, callback);
256 enabled_list->AppendIfNotPresent(new base::StringValue(type));
257 CallNotifyObserversPropertyChanged(
258 flimflam::kEnabledTechnologiesProperty, 0);
231 } 259 }
232 260
233 // ShillManagerClient override.
234 virtual void DisableTechnology( 261 virtual void DisableTechnology(
235 const std::string& type, 262 const std::string& type,
236 const base::Closure& callback, 263 const base::Closure& callback,
237 const ErrorCallback& error_callback) OVERRIDE { 264 const ErrorCallback& error_callback) OVERRIDE {
265 base::ListValue* enabled_list = NULL;
266 if (!stub_properties_.GetListWithoutPathExpansion(
267 flimflam::kEnabledTechnologiesProperty, &enabled_list)) {
268 MessageLoop::current()->PostTask(
269 FROM_HERE,
270 base::Bind(error_callback, "StubError", "Property not found"));
271 return;
272 }
238 MessageLoop::current()->PostTask(FROM_HERE, callback); 273 MessageLoop::current()->PostTask(FROM_HERE, callback);
274 base::StringValue type_value(type);
275 enabled_list->Remove(type_value, NULL);
276 CallNotifyObserversPropertyChanged(
277 flimflam::kEnabledTechnologiesProperty, 0);
239 } 278 }
240 279
241 // ShillManagerClient override.
242 virtual void ConfigureService( 280 virtual void ConfigureService(
243 const base::DictionaryValue& properties, 281 const base::DictionaryValue& properties,
244 const base::Closure& callback, 282 const base::Closure& callback,
245 const ErrorCallback& error_callback) OVERRIDE { 283 const ErrorCallback& error_callback) OVERRIDE {
246 MessageLoop::current()->PostTask(FROM_HERE, callback); 284 MessageLoop::current()->PostTask(FROM_HERE, callback);
247 } 285 }
248 286
249 // ShillManagerClient override.
250 virtual void GetService( 287 virtual void GetService(
251 const base::DictionaryValue& properties, 288 const base::DictionaryValue& properties,
252 const ObjectPathCallback& callback, 289 const ObjectPathCallback& callback,
253 const ErrorCallback& error_callback) OVERRIDE { 290 const ErrorCallback& error_callback) OVERRIDE {
254 MessageLoop::current()->PostTask(FROM_HERE, 291 MessageLoop::current()->PostTask(
255 base::Bind(callback, 292 FROM_HERE, base::Bind(callback, dbus::ObjectPath()));
256 dbus::ObjectPath())); 293 }
294
295 virtual ShillManagerClient::TestInterface* GetTestInterface() OVERRIDE {
296 return this;
297 }
298
299 // ShillManagerClient::TestInterface overrides.
300
301 virtual void AddDevice(const std::string& device_path) OVERRIDE {
302 if (GetListProperty(flimflam::kDevicesProperty)->AppendIfNotPresent(
303 base::Value::CreateStringValue(device_path))) {
304 CallNotifyObserversPropertyChanged(flimflam::kDevicesProperty, 0);
305 }
306 }
307
308 virtual void RemoveDevice(const std::string& device_path) OVERRIDE {
309 base::StringValue device_path_value(device_path);
310 if (GetListProperty(flimflam::kDevicesProperty)->Remove(
311 device_path_value, NULL)) {
312 CallNotifyObserversPropertyChanged(flimflam::kDevicesProperty, 0);
313 }
314 }
315
316 virtual void AddService(const std::string& service_path,
317 bool add_to_watch_list) OVERRIDE {
318 if (GetListProperty(flimflam::kServicesProperty)->AppendIfNotPresent(
319 base::Value::CreateStringValue(service_path))) {
320 CallNotifyObserversPropertyChanged(flimflam::kServicesProperty, 0);
321 }
322 if (add_to_watch_list &&
323 GetListProperty(
324 flimflam::kServiceWatchListProperty)->AppendIfNotPresent(
325 base::Value::CreateStringValue(service_path))) {
326 CallNotifyObserversPropertyChanged(
327 flimflam::kServiceWatchListProperty, 0);
328 }
329 }
330
331 virtual void InsertService(const std::string& service_path,
332 size_t index) OVERRIDE {
333 base::StringValue path_value(service_path);
334 base::ListValue* service_list =
335 GetListProperty(flimflam::kServicesProperty);
336 base::ListValue::iterator iter =
337 std::find_if(service_list->begin(), service_list->end(),
338 ValueEquals(&path_value));
339 service_list->Find(path_value);
340 if (iter != service_list->end())
341 service_list->Erase(iter, NULL);
342 service_list->Insert(index, path_value.DeepCopy());
343 CallNotifyObserversPropertyChanged(flimflam::kServicesProperty, 0);
344 }
345
346 virtual void RemoveService(const std::string& service_path) OVERRIDE {
347 base::StringValue service_path_value(service_path);
348 if (GetListProperty(flimflam::kServicesProperty)->Remove(
349 service_path_value, NULL)) {
350 CallNotifyObserversPropertyChanged(flimflam::kServicesProperty, 0);
351 }
352 if (GetListProperty(flimflam::kServiceWatchListProperty)->Remove(
353 service_path_value, NULL)) {
354 CallNotifyObserversPropertyChanged(
355 flimflam::kServiceWatchListProperty, 0);
356 }
357 }
358
359 virtual void AddTechnology(const std::string& type, bool enabled) OVERRIDE {
360 if (GetListProperty(flimflam::kAvailableTechnologiesProperty)->
361 AppendIfNotPresent(base::Value::CreateStringValue(type))) {
362 CallNotifyObserversPropertyChanged(
363 flimflam::kAvailableTechnologiesProperty, 0);
364 }
365 if (enabled &&
366 GetListProperty(flimflam::kEnabledTechnologiesProperty)->
367 AppendIfNotPresent(base::Value::CreateStringValue(type))) {
368 CallNotifyObserversPropertyChanged(
369 flimflam::kEnabledTechnologiesProperty, 0);
370 }
371 }
372
373 virtual void RemoveTechnology(const std::string& type) OVERRIDE {
374 base::StringValue type_value(type);
375 if (GetListProperty(flimflam::kAvailableTechnologiesProperty)->Remove(
376 type_value, NULL)) {
377 CallNotifyObserversPropertyChanged(
378 flimflam::kAvailableTechnologiesProperty, 0);
379 }
380 if (GetListProperty(flimflam::kEnabledTechnologiesProperty)->Remove(
381 type_value, NULL)) {
382 CallNotifyObserversPropertyChanged(
383 flimflam::kEnabledTechnologiesProperty, 0);
384 }
385 }
386
387 virtual void ClearProperties() OVERRIDE {
388 stub_properties_.Clear();
257 } 389 }
258 390
259 private: 391 private:
392 void SetDefaultProperties() {
393 // Stub Devices, Note: names match Device stub map.
394 AddDevice("stub_wifi_device1");
395 AddDevice("stub_cellular_device1");
396
397 // Stub Services, Note: names match Service stub map.
398 AddService("stub_ethernet", true);
399 AddService("stub_wifi1", true);
400 AddService("stub_wifi2", true);
401 AddService("stub_cellular1", true);
402
403 // Stub Technologies
404 AddTechnology(flimflam::kTypeEthernet, true);
405 AddTechnology(flimflam::kTypeWifi, true);
406 AddTechnology(flimflam::kTypeCellular, true);
407 }
408
260 void PassStubProperties(const DictionaryValueCallback& callback) const { 409 void PassStubProperties(const DictionaryValueCallback& callback) const {
261 callback.Run(DBUS_METHOD_CALL_SUCCESS, stub_properties_); 410 callback.Run(DBUS_METHOD_CALL_SUCCESS, stub_properties_);
262 } 411 }
263 412
413 void CallNotifyObserversPropertyChanged(const std::string& property,
414 int delay_seconds) {
415 if (!initialized_)
416 return;
417 MessageLoop::current()->PostDelayedTask(
418 FROM_HERE,
419 base::Bind(&ShillManagerClientStubImpl::NotifyObserversPropertyChanged,
420 weak_ptr_factory_.GetWeakPtr(),
421 property),
422 base::TimeDelta::FromSeconds(delay_seconds));
423 }
424
425 void NotifyObserversPropertyChanged(const std::string& property) {
426 base::Value* value = NULL;
427 if (!stub_properties_.GetWithoutPathExpansion(property, &value)) {
428 LOG(ERROR) << "Notify for unknown property: " << property;
429 return;
430 }
431 FOR_EACH_OBSERVER(ShillPropertyChangedObserver,
432 observer_list_,
433 OnPropertyChanged(property, *value));
434 }
435
436 base::ListValue* GetListProperty(const std::string& property) {
437 base::ListValue* list_property = NULL;
438 if (!stub_properties_.GetListWithoutPathExpansion(
439 property, &list_property)) {
440 list_property = new base::ListValue;
441 stub_properties_.Set(property, list_property);
442 }
443 return list_property;
444 }
445
446 bool initialized_;
264 base::DictionaryValue stub_properties_; 447 base::DictionaryValue stub_properties_;
448 ObserverList<ShillPropertyChangedObserver> observer_list_;
265 449
266 // Note: This should remain the last member so it'll be destroyed and 450 // Note: This should remain the last member so it'll be destroyed and
267 // invalidate its weak pointers before any other members are destroyed. 451 // invalidate its weak pointers before any other members are destroyed.
268 base::WeakPtrFactory<ShillManagerClientStubImpl> weak_ptr_factory_; 452 base::WeakPtrFactory<ShillManagerClientStubImpl> weak_ptr_factory_;
269 453
270 DISALLOW_COPY_AND_ASSIGN(ShillManagerClientStubImpl); 454 DISALLOW_COPY_AND_ASSIGN(ShillManagerClientStubImpl);
271 }; 455 };
272 456
273 } // namespace 457 } // namespace
274 458
275 ShillManagerClient::ShillManagerClient() {} 459 ShillManagerClient::ShillManagerClient() {}
276 460
277 ShillManagerClient::~ShillManagerClient() {} 461 ShillManagerClient::~ShillManagerClient() {}
278 462
279 // static 463 // static
280 ShillManagerClient* ShillManagerClient::Create( 464 ShillManagerClient* ShillManagerClient::Create(
281 DBusClientImplementationType type, 465 DBusClientImplementationType type,
282 dbus::Bus* bus) { 466 dbus::Bus* bus) {
283 if (type == REAL_DBUS_CLIENT_IMPLEMENTATION) 467 if (type == REAL_DBUS_CLIENT_IMPLEMENTATION)
284 return new ShillManagerClientImpl(bus); 468 return new ShillManagerClientImpl(bus);
285 DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type); 469 DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type);
286 return new ShillManagerClientStubImpl(); 470 return new ShillManagerClientStubImpl();
287 } 471 }
288 472
289 } // namespace chromeos 473 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698