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 "chromeos/dbus/shill_manager_client.h" 6 7 #include "base/bind.h" 8 #include "base/logging.h" 9 #include "base/message_loop/message_loop.h" 10 #include "base/values.h" 11 #include "chromeos/dbus/shill_property_changed_observer.h" 12 #include "dbus/bus.h" 13 #include "dbus/message.h" 14 #include "dbus/object_path.h" 15 #include "dbus/object_proxy.h" 16 #include "dbus/values_util.h" 17 #include "net/base/ip_endpoint.h" 18 #include "third_party/cros_system_api/dbus/service_constants.h" 19 20 namespace chromeos { 21 22 namespace { 23 24 // The ShillManagerClient implementation. 25 class ShillManagerClientImpl : public ShillManagerClient { 26 public: 27 ShillManagerClientImpl() : proxy_(NULL) {} 28 29 //////////////////////////////////// 30 // ShillManagerClient overrides. 31 virtual void AddPropertyChangedObserver( 32 ShillPropertyChangedObserver* observer) OVERRIDE { 33 helper_->AddPropertyChangedObserver(observer); 34 } 35 36 virtual void RemovePropertyChangedObserver( 37 ShillPropertyChangedObserver* observer) OVERRIDE { 38 helper_->RemovePropertyChangedObserver(observer); 39 } 40 41 virtual void GetProperties(const DictionaryValueCallback& callback) OVERRIDE { 42 dbus::MethodCall method_call(shill::kFlimflamManagerInterface, 43 shill::kGetPropertiesFunction); 44 helper_->CallDictionaryValueMethod(&method_call, callback); 45 } 46 47 virtual void GetNetworksForGeolocation( 48 const DictionaryValueCallback& callback) OVERRIDE { 49 dbus::MethodCall method_call(shill::kFlimflamManagerInterface, 50 shill::kGetNetworksForGeolocation); 51 helper_->CallDictionaryValueMethod(&method_call, callback); 52 } 53 54 virtual void SetProperty(const std::string& name, 55 const base::Value& value, 56 const base::Closure& callback, 57 const ErrorCallback& error_callback) OVERRIDE { 58 dbus::MethodCall method_call(shill::kFlimflamManagerInterface, 59 shill::kSetPropertyFunction); 60 dbus::MessageWriter writer(&method_call); 61 writer.AppendString(name); 62 ShillClientHelper::AppendValueDataAsVariant(&writer, value); 63 helper_->CallVoidMethodWithErrorCallback(&method_call, 64 callback, 65 error_callback); 66 } 67 68 virtual void RequestScan(const std::string& type, 69 const base::Closure& callback, 70 const ErrorCallback& error_callback) OVERRIDE { 71 dbus::MethodCall method_call(shill::kFlimflamManagerInterface, 72 shill::kRequestScanFunction); 73 dbus::MessageWriter writer(&method_call); 74 writer.AppendString(type); 75 helper_->CallVoidMethodWithErrorCallback(&method_call, 76 callback, 77 error_callback); 78 } 79 80 virtual void EnableTechnology( 81 const std::string& type, 82 const base::Closure& callback, 83 const ErrorCallback& error_callback) OVERRIDE { 84 dbus::MethodCall method_call(shill::kFlimflamManagerInterface, 85 shill::kEnableTechnologyFunction); 86 dbus::MessageWriter writer(&method_call); 87 writer.AppendString(type); 88 helper_->CallVoidMethodWithErrorCallback(&method_call, 89 callback, 90 error_callback); 91 } 92 93 virtual void DisableTechnology( 94 const std::string& type, 95 const base::Closure& callback, 96 const ErrorCallback& error_callback) OVERRIDE { 97 dbus::MethodCall method_call(shill::kFlimflamManagerInterface, 98 shill::kDisableTechnologyFunction); 99 dbus::MessageWriter writer(&method_call); 100 writer.AppendString(type); 101 helper_->CallVoidMethodWithErrorCallback(&method_call, 102 callback, 103 error_callback); 104 } 105 106 virtual void ConfigureService( 107 const base::DictionaryValue& properties, 108 const ObjectPathCallback& callback, 109 const ErrorCallback& error_callback) OVERRIDE { 110 dbus::MethodCall method_call(shill::kFlimflamManagerInterface, 111 shill::kConfigureServiceFunction); 112 dbus::MessageWriter writer(&method_call); 113 ShillClientHelper::AppendServicePropertiesDictionary(&writer, properties); 114 helper_->CallObjectPathMethodWithErrorCallback(&method_call, 115 callback, 116 error_callback); 117 } 118 119 virtual void ConfigureServiceForProfile( 120 const dbus::ObjectPath& profile_path, 121 const base::DictionaryValue& properties, 122 const ObjectPathCallback& callback, 123 const ErrorCallback& error_callback) OVERRIDE { 124 dbus::MethodCall method_call(shill::kFlimflamManagerInterface, 125 shill::kConfigureServiceForProfileFunction); 126 dbus::MessageWriter writer(&method_call); 127 writer.AppendObjectPath(dbus::ObjectPath(profile_path)); 128 ShillClientHelper::AppendServicePropertiesDictionary(&writer, properties); 129 helper_->CallObjectPathMethodWithErrorCallback(&method_call, 130 callback, 131 error_callback); 132 } 133 134 virtual void GetService( 135 const base::DictionaryValue& properties, 136 const ObjectPathCallback& callback, 137 const ErrorCallback& error_callback) OVERRIDE { 138 dbus::MethodCall method_call(shill::kFlimflamManagerInterface, 139 shill::kGetServiceFunction); 140 dbus::MessageWriter writer(&method_call); 141 ShillClientHelper::AppendServicePropertiesDictionary(&writer, properties); 142 helper_->CallObjectPathMethodWithErrorCallback(&method_call, 143 callback, 144 error_callback); 145 } 146 147 virtual void VerifyDestination(const VerificationProperties& properties, 148 const BooleanCallback& callback, 149 const ErrorCallback& error_callback) OVERRIDE { 150 dbus::MethodCall method_call(shill::kFlimflamManagerInterface, 151 shill::kVerifyDestinationFunction); 152 dbus::MessageWriter writer(&method_call); 153 writer.AppendString(properties.certificate); 154 writer.AppendString(properties.public_key); 155 writer.AppendString(properties.nonce); 156 writer.AppendString(properties.signed_data); 157 writer.AppendString(properties.device_serial); 158 writer.AppendString(properties.device_ssid); 159 writer.AppendString(properties.device_bssid); 160 helper_->CallBooleanMethodWithErrorCallback( 161 &method_call, callback, error_callback); 162 } 163 164 virtual void VerifyAndEncryptCredentials( 165 const VerificationProperties& properties, 166 const std::string& service_path, 167 const StringCallback& callback, 168 const ErrorCallback& error_callback) OVERRIDE { 169 dbus::MethodCall method_call(shill::kFlimflamManagerInterface, 170 shill::kVerifyAndEncryptCredentialsFunction); 171 dbus::MessageWriter writer(&method_call); 172 writer.AppendString(properties.certificate); 173 writer.AppendString(properties.public_key); 174 writer.AppendString(properties.nonce); 175 writer.AppendString(properties.signed_data); 176 writer.AppendString(properties.device_serial); 177 writer.AppendString(properties.device_ssid); 178 writer.AppendString(properties.device_bssid); 179 writer.AppendObjectPath(dbus::ObjectPath(service_path)); 180 helper_->CallStringMethodWithErrorCallback( 181 &method_call, callback, error_callback); 182 } 183 184 virtual void VerifyAndEncryptData( 185 const VerificationProperties& properties, 186 const std::string& data, 187 const StringCallback& callback, 188 const ErrorCallback& error_callback) OVERRIDE { 189 dbus::MethodCall method_call(shill::kFlimflamManagerInterface, 190 shill::kVerifyAndEncryptDataFunction); 191 dbus::MessageWriter writer(&method_call); 192 writer.AppendString(properties.certificate); 193 writer.AppendString(properties.public_key); 194 writer.AppendString(properties.nonce); 195 writer.AppendString(properties.signed_data); 196 writer.AppendString(properties.device_serial); 197 writer.AppendString(properties.device_ssid); 198 writer.AppendString(properties.device_bssid); 199 writer.AppendString(data); 200 helper_->CallStringMethodWithErrorCallback( 201 &method_call, callback, error_callback); 202 } 203 204 virtual void ConnectToBestServices( 205 const base::Closure& callback, 206 const ErrorCallback& error_callback) OVERRIDE { 207 dbus::MethodCall method_call(shill::kFlimflamManagerInterface, 208 shill::kConnectToBestServicesFunction); 209 helper_->CallVoidMethodWithErrorCallback(&method_call, 210 callback, 211 error_callback); 212 } 213 214 virtual void AddWakeOnPacketConnection( 215 const net::IPEndPoint& ip_endpoint, 216 const base::Closure& callback, 217 const ErrorCallback& error_callback) OVERRIDE { 218 if (ip_endpoint.address().empty()) { 219 LOG(ERROR) << "AddWakeOnPacketConnection: null address"; 220 return; 221 } 222 dbus::MethodCall method_call(shill::kFlimflamManagerInterface, 223 shill::kAddWakeOnPacketConnectionFunction); 224 dbus::MessageWriter writer(&method_call); 225 writer.AppendString(net::IPAddressToString(ip_endpoint.address())); 226 helper_->CallVoidMethodWithErrorCallback(&method_call, 227 callback, 228 error_callback); 229 } 230 231 virtual void RemoveWakeOnPacketConnection( 232 const net::IPEndPoint& ip_endpoint, 233 const base::Closure& callback, 234 const ErrorCallback& error_callback) OVERRIDE { 235 if (ip_endpoint.address().empty()) { 236 LOG(ERROR) << "RemoveWakeOnPacketConnection: null address"; 237 return; 238 } 239 dbus::MethodCall method_call(shill::kFlimflamManagerInterface, 240 shill::kRemoveWakeOnPacketConnectionFunction); 241 dbus::MessageWriter writer(&method_call); 242 writer.AppendString(net::IPAddressToString(ip_endpoint.address())); 243 helper_->CallVoidMethodWithErrorCallback(&method_call, 244 callback, 245 error_callback); 246 } 247 248 virtual void RemoveAllWakeOnPacketConnections( 249 const base::Closure& callback, 250 const ErrorCallback& error_callback) OVERRIDE { 251 dbus::MethodCall method_call( 252 shill::kFlimflamManagerInterface, 253 shill::kRemoveAllWakeOnPacketConnectionsFunction); 254 helper_->CallVoidMethodWithErrorCallback(&method_call, 255 callback, 256 error_callback); 257 } 258 259 virtual TestInterface* GetTestInterface() OVERRIDE { 260 return NULL; 261 } 262 263 protected: 264 virtual void Init(dbus::Bus* bus) OVERRIDE { 265 proxy_ = bus->GetObjectProxy(shill::kFlimflamServiceName, 266 dbus::ObjectPath(shill::kFlimflamServicePath)); 267 helper_.reset(new ShillClientHelper(proxy_)); 268 helper_->MonitorPropertyChanged(shill::kFlimflamManagerInterface); 269 } 270 271 private: 272 dbus::ObjectProxy* proxy_; 273 scoped_ptr<ShillClientHelper> helper_; 274 275 DISALLOW_COPY_AND_ASSIGN(ShillManagerClientImpl); 276 }; 277 278 } // namespace 279 280 ShillManagerClient::ShillManagerClient() {} 281 282 ShillManagerClient::~ShillManagerClient() {} 283 284 // static 285 ShillManagerClient* ShillManagerClient::Create() { 286 return new ShillManagerClientImpl(); 287 } 288 289 // ShillManagerClient::VerificationProperties implementation. 290 ShillManagerClient::VerificationProperties::VerificationProperties() { 291 } 292 293 ShillManagerClient::VerificationProperties::~VerificationProperties() { 294 } 295 296 } // namespace chromeos 297