1 // 2 // Copyright (C) 2015 The Android Open Source Project 3 // 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at 7 // 8 // http://www.apache.org/licenses/LICENSE-2.0 9 // 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 // 16 17 #include "shill/dbus/chromeos_device_dbus_adaptor.h" 18 19 #include "shill/device.h" 20 #include "shill/error.h" 21 #include "shill/logging.h" 22 23 using brillo::dbus_utils::AsyncEventSequencer; 24 using brillo::dbus_utils::DBusObject; 25 using brillo::dbus_utils::ExportedObjectManager; 26 using std::string; 27 using std::vector; 28 29 namespace shill { 30 31 namespace Logging { 32 static auto kModuleLogScope = ScopeLogger::kDBus; 33 static string ObjectID(ChromeosDeviceDBusAdaptor* d) { 34 return d->GetRpcIdentifier() + " (" + d->device()->UniqueName() + ")"; 35 } 36 } 37 38 // static 39 const char ChromeosDeviceDBusAdaptor::kPath[] = "/device/"; 40 41 ChromeosDeviceDBusAdaptor::ChromeosDeviceDBusAdaptor( 42 const scoped_refptr<dbus::Bus>& bus, 43 Device* device) 44 : org::chromium::flimflam::DeviceAdaptor(this), 45 ChromeosDBusAdaptor(bus, 46 kPath + SanitizePathElement(device->UniqueName())), 47 device_(device) { 48 // Register DBus object. 49 RegisterWithDBusObject(dbus_object()); 50 dbus_object()->RegisterAndBlock(); 51 } 52 53 ChromeosDeviceDBusAdaptor::~ChromeosDeviceDBusAdaptor() { 54 dbus_object()->UnregisterAsync(); 55 device_ = nullptr; 56 } 57 58 const string& ChromeosDeviceDBusAdaptor::GetRpcIdentifier() { 59 return dbus_path().value(); 60 } 61 62 void ChromeosDeviceDBusAdaptor::EmitBoolChanged(const string& name, 63 bool value) { 64 SLOG(this, 2) << __func__ << ": " << name; 65 SendPropertyChangedSignal(name, brillo::Any(value)); 66 } 67 68 void ChromeosDeviceDBusAdaptor::EmitUintChanged(const string& name, 69 uint32_t value) { 70 SLOG(this, 2) << __func__ << ": " << name; 71 SendPropertyChangedSignal(name, brillo::Any(value)); 72 } 73 74 void ChromeosDeviceDBusAdaptor::EmitUint16Changed(const string& name, 75 uint16_t value) { 76 SLOG(this, 2) << __func__ << ": " << name; 77 SendPropertyChangedSignal(name, brillo::Any(value)); 78 } 79 80 void ChromeosDeviceDBusAdaptor::EmitIntChanged(const string& name, int value) { 81 SLOG(this, 2) << __func__ << ": " << name; 82 SendPropertyChangedSignal(name, brillo::Any(value)); 83 } 84 85 void ChromeosDeviceDBusAdaptor::EmitStringChanged(const string& name, 86 const string& value) { 87 SLOG(this, 2) << __func__ << ": " << name; 88 SendPropertyChangedSignal(name, brillo::Any(value)); 89 } 90 91 void ChromeosDeviceDBusAdaptor::EmitStringmapChanged(const string& name, 92 const Stringmap& value) { 93 SLOG(this, 2) << __func__ << ": " << name; 94 SendPropertyChangedSignal(name, brillo::Any(value)); 95 } 96 97 void ChromeosDeviceDBusAdaptor::EmitStringmapsChanged(const string& name, 98 const Stringmaps& value) { 99 SLOG(this, 2) << __func__ << ": " << name; 100 SendPropertyChangedSignal(name, brillo::Any(value)); 101 } 102 103 void ChromeosDeviceDBusAdaptor::EmitStringsChanged(const string& name, 104 const Strings& value) { 105 SLOG(this, 2) << __func__ << ": " << name; 106 SendPropertyChangedSignal(name, brillo::Any(value)); 107 } 108 109 void ChromeosDeviceDBusAdaptor::EmitKeyValueStoreChanged( 110 const string& name, const KeyValueStore& value) { 111 SLOG(this, 2) << __func__ << ": " << name; 112 brillo::VariantDictionary dict; 113 KeyValueStore::ConvertToVariantDictionary(value, &dict); 114 SendPropertyChangedSignal(name, brillo::Any(dict)); 115 } 116 117 void ChromeosDeviceDBusAdaptor::EmitRpcIdentifierChanged( 118 const std::string& name, const std::string& value) { 119 SLOG(this, 2) << __func__ << ": " << name; 120 SendPropertyChangedSignal(name, brillo::Any(dbus::ObjectPath(value))); 121 } 122 123 void ChromeosDeviceDBusAdaptor::EmitRpcIdentifierArrayChanged( 124 const string& name, 125 const vector<string>& value) { 126 SLOG(this, 2) << __func__ << ": " << name; 127 vector<dbus::ObjectPath> paths; 128 for (const auto& element : value) { 129 paths.push_back(dbus::ObjectPath(element)); 130 } 131 132 SendPropertyChangedSignal(name, brillo::Any(paths)); 133 } 134 135 bool ChromeosDeviceDBusAdaptor::GetProperties( 136 brillo::ErrorPtr* error, brillo::VariantDictionary* out_properties) { 137 SLOG(this, 2) << __func__; 138 return ChromeosDBusAdaptor::GetProperties(device_->store(), 139 out_properties, 140 error); 141 } 142 143 bool ChromeosDeviceDBusAdaptor::SetProperty(brillo::ErrorPtr* error, 144 const string& name, 145 const brillo::Any& value) { 146 SLOG(this, 2) << __func__ << ": " << name; 147 return ChromeosDBusAdaptor::SetProperty(device_->mutable_store(), 148 name, 149 value, 150 error); 151 } 152 153 bool ChromeosDeviceDBusAdaptor::ClearProperty(brillo::ErrorPtr* error, 154 const string& name) { 155 SLOG(this, 2) << __func__ << ": " << name; 156 return ChromeosDBusAdaptor::ClearProperty(device_->mutable_store(), 157 name, 158 error); 159 } 160 161 void ChromeosDeviceDBusAdaptor::Enable(DBusMethodResponsePtr<> response) { 162 SLOG(this, 2) << __func__; 163 Error e(Error::kOperationInitiated); 164 ResultCallback callback = GetMethodReplyCallback(std::move(response)); 165 device_->SetEnabledPersistent(true, &e, callback); 166 ReturnResultOrDefer(callback, e); 167 } 168 169 void ChromeosDeviceDBusAdaptor::Disable(DBusMethodResponsePtr<> response) { 170 SLOG(this, 2) << __func__ << ": Device " << device_->UniqueName(); 171 Error e(Error::kOperationInitiated); 172 ResultCallback callback = GetMethodReplyCallback(std::move(response)); 173 device_->SetEnabledPersistent(false, &e, callback); 174 ReturnResultOrDefer(callback, e); 175 } 176 177 bool ChromeosDeviceDBusAdaptor::ProposeScan(brillo::ErrorPtr* error) { 178 SLOG(this, 2) << __func__; 179 Error e; 180 // User scan requests, which are the likely source of DBus requests, probably 181 // aren't time-critical so we might as well perform a complete scan. It 182 // also provides a failsafe for progressive scan. 183 device_->Scan(Device::kFullScan, &e, __func__); 184 185 return !e.ToChromeosError(error); 186 } 187 188 bool ChromeosDeviceDBusAdaptor::AddIPConfig(brillo::ErrorPtr* error, 189 const string& /*method*/, 190 dbus::ObjectPath* out_path) { 191 SLOG(this, 2) << __func__; 192 Error e(Error::kNotSupported, "This function is deprecated in shill"); 193 return !e.ToChromeosError(error); 194 } 195 196 void ChromeosDeviceDBusAdaptor::Register(DBusMethodResponsePtr<> response, 197 const string& network_id) { 198 SLOG(this, 2) << __func__ << ": " << network_id; 199 Error e(Error::kOperationInitiated); 200 ResultCallback callback = GetMethodReplyCallback(std::move(response)); 201 device_->RegisterOnNetwork(network_id, &e, callback); 202 ReturnResultOrDefer(callback, e); 203 } 204 205 void ChromeosDeviceDBusAdaptor::RequirePin( 206 DBusMethodResponsePtr<> response, const string& pin, bool require) { 207 SLOG(this, 2) << __func__; 208 209 Error e(Error::kOperationInitiated); 210 ResultCallback callback = GetMethodReplyCallback(std::move(response)); 211 device_->RequirePIN(pin, require, &e, callback); 212 ReturnResultOrDefer(callback, e); 213 } 214 215 void ChromeosDeviceDBusAdaptor::EnterPin(DBusMethodResponsePtr<> response, 216 const string& pin) { 217 SLOG(this, 2) << __func__; 218 219 Error e(Error::kOperationInitiated); 220 ResultCallback callback = GetMethodReplyCallback(std::move(response)); 221 device_->EnterPIN(pin, &e, callback); 222 ReturnResultOrDefer(callback, e); 223 } 224 225 void ChromeosDeviceDBusAdaptor::UnblockPin(DBusMethodResponsePtr<> response, 226 const string& unblock_code, 227 const string& pin) { 228 SLOG(this, 2) << __func__; 229 230 Error e(Error::kOperationInitiated); 231 ResultCallback callback = GetMethodReplyCallback(std::move(response)); 232 device_->UnblockPIN(unblock_code, pin, &e, callback); 233 ReturnResultOrDefer(callback, e); 234 } 235 236 void ChromeosDeviceDBusAdaptor::ChangePin(DBusMethodResponsePtr<> response, 237 const string& old_pin, 238 const string& new_pin) { 239 SLOG(this, 2) << __func__; 240 241 Error e(Error::kOperationInitiated); 242 ResultCallback callback = GetMethodReplyCallback(std::move(response)); 243 device_->ChangePIN(old_pin, new_pin, &e, callback); 244 ReturnResultOrDefer(callback, e); 245 } 246 247 void ChromeosDeviceDBusAdaptor::Reset(DBusMethodResponsePtr<> response) { 248 SLOG(this, 2) << __func__; 249 250 Error e(Error::kOperationInitiated); 251 ResultCallback callback = GetMethodReplyCallback(std::move(response)); 252 device_->Reset(&e, callback); 253 ReturnResultOrDefer(callback, e); 254 } 255 256 bool ChromeosDeviceDBusAdaptor::PerformTDLSOperation(brillo::ErrorPtr* error, 257 const string& operation, 258 const string& peer, 259 string* out_state) { 260 SLOG(this, 2) << __func__; 261 262 Error e; 263 *out_state = device_->PerformTDLSOperation(operation, peer, &e); 264 return !e.ToChromeosError(error); 265 } 266 267 bool ChromeosDeviceDBusAdaptor::ResetByteCounters(brillo::ErrorPtr* error) { 268 device_->ResetByteCounters(); 269 return true; 270 } 271 272 void ChromeosDeviceDBusAdaptor::SetCarrier(DBusMethodResponsePtr<> response, 273 const string& carrier) { 274 SLOG(this, 2) << __func__ << ": " << carrier; 275 276 Error e(Error::kOperationInitiated); 277 ResultCallback callback = GetMethodReplyCallback(std::move(response)); 278 device_->SetCarrier(carrier, &e, callback); 279 ReturnResultOrDefer(callback, e); 280 } 281 282 bool ChromeosDeviceDBusAdaptor::RequestRoam(brillo::ErrorPtr* error, 283 const std::string& addr) { 284 SLOG(this, 2) << __func__ << ": " << addr; 285 Error e; 286 device_->RequestRoam(addr, &e); 287 return !e.ToChromeosError(error); 288 } 289 290 bool ChromeosDeviceDBusAdaptor::AddWakeOnPacketConnection( 291 brillo::ErrorPtr* error, const string& ip_endpoint) { 292 SLOG(this, 2) << __func__; 293 294 Error e; 295 device_->AddWakeOnPacketConnection(ip_endpoint, &e); 296 return !e.ToChromeosError(error); 297 } 298 299 bool ChromeosDeviceDBusAdaptor::RemoveWakeOnPacketConnection( 300 brillo::ErrorPtr* error, const string& ip_endpoint) { 301 SLOG(this, 2) << __func__; 302 303 Error e; 304 device_->RemoveWakeOnPacketConnection(ip_endpoint, &e); 305 return !e.ToChromeosError(error); 306 } 307 308 bool ChromeosDeviceDBusAdaptor::RemoveAllWakeOnPacketConnections( 309 brillo::ErrorPtr* error) { 310 SLOG(this, 2) << __func__; 311 312 Error e; 313 device_->RemoveAllWakeOnPacketConnections(&e); 314 return !e.ToChromeosError(error); 315 } 316 317 } // namespace shill 318