shill_service_client.cc revision 424c4d7b64af9d0d8fd9624f381f469654d5e3d2
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/shill_service_client.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 89ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/shill_property_changed_observer.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/dbus/shill_service_client_stub.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/bus.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/message.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/object_proxy.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#ifndef DBUS_ERROR_UNKNOWN_OBJECT 2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// The linux_chromeos ASAN builder has an older version of dbus-protocol.h 2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// so make sure this is defined. 2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define DBUS_ERROR_UNKNOWN_OBJECT "org.freedesktop.DBus.Error.UnknownObject" 2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif 2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Error callback for GetProperties. 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid OnGetDictionaryError( 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& method_name, 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const dbus::ObjectPath& service_path, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ShillServiceClient::DictionaryValueCallback& callback, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& error_name, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& error_message) { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string log_string = 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "Failed to call org.chromium.shill.Service." + method_name + 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " for: " + service_path.value() + ": " + 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch error_name + ": " + error_message; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Suppress ERROR messages for UnknownMethod/Object" since this can 4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // happen under normal conditions. See crbug.com/130660 and crbug.com/222210. 4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (error_name == DBUS_ERROR_UNKNOWN_METHOD || 4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) error_name == DBUS_ERROR_UNKNOWN_OBJECT) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << log_string; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << log_string; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue empty_dictionary; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(DBUS_METHOD_CALL_FAILURE, empty_dictionary); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The ShillServiceClient implementation. 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ShillServiceClientImpl : public ShillServiceClient { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 55424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) explicit ShillServiceClientImpl() 56424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) : bus_(NULL), 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) helpers_deleter_(&helpers_) { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void AddPropertyChangedObserver( 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const dbus::ObjectPath& service_path, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShillPropertyChangedObserver* observer) OVERRIDE { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetHelper(service_path)->AddPropertyChangedObserver(observer); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RemovePropertyChangedObserver( 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const dbus::ObjectPath& service_path, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShillPropertyChangedObserver* observer) OVERRIDE { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetHelper(service_path)->RemovePropertyChangedObserver(observer); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void GetProperties(const dbus::ObjectPath& service_path, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DictionaryValueCallback& callback) OVERRIDE { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MethodCall method_call(flimflam::kFlimflamServiceInterface, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flimflam::kGetPropertiesFunction); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetHelper(service_path)->CallDictionaryValueMethodWithErrorCallback( 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &method_call, 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(callback, DBUS_METHOD_CALL_SUCCESS), 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&OnGetDictionaryError, "GetProperties", 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch service_path, callback)); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetProperty(const dbus::ObjectPath& service_path, 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& name, 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Value& value, 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& callback, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ErrorCallback& error_callback) OVERRIDE { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MethodCall method_call(flimflam::kFlimflamServiceInterface, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flimflam::kSetPropertyFunction); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MessageWriter writer(&method_call); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) writer.AppendString(name); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShillClientHelper::AppendValueDataAsVariant(&writer, value); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetHelper(service_path)->CallVoidMethodWithErrorCallback(&method_call, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback, 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_callback); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void SetProperties(const dbus::ObjectPath& service_path, 997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const base::DictionaryValue& properties, 1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const base::Closure& callback, 1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const ErrorCallback& error_callback) OVERRIDE { 1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch dbus::MethodCall method_call(flimflam::kFlimflamServiceInterface, 1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch shill::kSetPropertiesFunction); 1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch dbus::MessageWriter writer(&method_call); 1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ShillClientHelper::AppendServicePropertiesDictionary(&writer, properties); 1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GetHelper(service_path)->CallVoidMethodWithErrorCallback(&method_call, 1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch callback, 1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch error_callback); 1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ClearProperty(const dbus::ObjectPath& service_path, 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& name, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& callback, 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ErrorCallback& error_callback) OVERRIDE { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MethodCall method_call(flimflam::kFlimflamServiceInterface, 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flimflam::kClearPropertyFunction); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MessageWriter writer(&method_call); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) writer.AppendString(name); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetHelper(service_path)->CallVoidMethodWithErrorCallback(&method_call, 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback, 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_callback); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ClearProperties(const dbus::ObjectPath& service_path, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<std::string>& names, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ListValueCallback& callback, 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ErrorCallback& error_callback) OVERRIDE { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MethodCall method_call(flimflam::kFlimflamServiceInterface, 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shill::kClearPropertiesFunction); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MessageWriter writer(&method_call); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) writer.AppendArrayOfStrings(names); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetHelper(service_path)->CallListValueMethodWithErrorCallback( 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &method_call, 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback, 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_callback); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Connect(const dbus::ObjectPath& service_path, 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& callback, 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ErrorCallback& error_callback) OVERRIDE { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MethodCall method_call(flimflam::kFlimflamServiceInterface, 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flimflam::kConnectFunction); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetHelper(service_path)->CallVoidMethodWithErrorCallback( 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &method_call, callback, error_callback); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Disconnect(const dbus::ObjectPath& service_path, 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& callback, 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ErrorCallback& error_callback) OVERRIDE { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MethodCall method_call(flimflam::kFlimflamServiceInterface, 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flimflam::kDisconnectFunction); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetHelper(service_path)->CallVoidMethodWithErrorCallback(&method_call, 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback, 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_callback); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Remove(const dbus::ObjectPath& service_path, 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& callback, 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ErrorCallback& error_callback) OVERRIDE { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MethodCall method_call(flimflam::kFlimflamServiceInterface, 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flimflam::kRemoveServiceFunction); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetHelper(service_path)->CallVoidMethodWithErrorCallback(&method_call, 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback, 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_callback); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ActivateCellularModem( 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const dbus::ObjectPath& service_path, 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& carrier, 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& callback, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ErrorCallback& error_callback) OVERRIDE { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MethodCall method_call(flimflam::kFlimflamServiceInterface, 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flimflam::kActivateCellularModemFunction); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MessageWriter writer(&method_call); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) writer.AppendString(carrier); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetHelper(service_path)->CallVoidMethodWithErrorCallback(&method_call, 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback, 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_callback); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CompleteCellularActivation( 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const dbus::ObjectPath& service_path, 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Closure& callback, 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ErrorCallback& error_callback) OVERRIDE { 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::MethodCall method_call(flimflam::kFlimflamServiceInterface, 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shill::kCompleteCellularActivationFunction); 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::MessageWriter writer(&method_call); 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetHelper(service_path)->CallVoidMethodWithErrorCallback(&method_call, 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback, 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) error_callback); 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool CallActivateCellularModemAndBlock( 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const dbus::ObjectPath& service_path, 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& carrier) OVERRIDE { 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MethodCall method_call(flimflam::kFlimflamServiceInterface, 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flimflam::kActivateCellularModemFunction); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MessageWriter writer(&method_call); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) writer.AppendString(carrier); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetHelper(service_path)->CallVoidMethodAndBlock(&method_call); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void GetLoadableProfileEntries( 205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const dbus::ObjectPath& service_path, 206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const DictionaryValueCallback& callback) OVERRIDE { 207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch dbus::MethodCall method_call(flimflam::kFlimflamServiceInterface, 208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch shill::kGetLoadableProfileEntriesFunction); 209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetHelper(service_path)->CallDictionaryValueMethodWithErrorCallback( 210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch &method_call, 211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(callback, DBUS_METHOD_CALL_SUCCESS), 212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&OnGetDictionaryError, "GetLoadableProfileEntries", 213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch service_path, callback)); 214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ShillServiceClient::TestInterface* GetTestInterface() OVERRIDE { 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 220424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) protected: 221424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual void Init(dbus::Bus* bus) OVERRIDE { 222424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) bus_ = bus; 223424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 224424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::map<std::string, ShillClientHelper*> HelperMap; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the corresponding ShillClientHelper for the profile. 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShillClientHelper* GetHelper(const dbus::ObjectPath& service_path) { 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HelperMap::iterator it = helpers_.find(service_path.value()); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it != helpers_.end()) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return it->second; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There is no helper for the profile, create it. 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::ObjectProxy* object_proxy = 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bus_->GetObjectProxy(flimflam::kFlimflamServiceName, service_path); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShillClientHelper* helper = new ShillClientHelper(bus_, object_proxy); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) helper->MonitorPropertyChanged(flimflam::kFlimflamServiceInterface); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) helpers_.insert(HelperMap::value_type(service_path.value(), helper)); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return helper; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::Bus* bus_; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HelperMap helpers_; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STLValueDeleter<HelperMap> helpers_deleter_; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ShillServiceClientImpl); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShillServiceClient::ShillServiceClient() {} 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShillServiceClient::~ShillServiceClient() {} 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShillServiceClient* ShillServiceClient::Create( 258424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) DBusClientImplementationType type) { 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type == REAL_DBUS_CLIENT_IMPLEMENTATION) 260424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return new ShillServiceClientImpl(); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type); 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return new ShillServiceClientStub(); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 266