// // Copyright (C) 2015 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #include "shill/dbus/chromeos_device_dbus_adaptor.h" #include "shill/device.h" #include "shill/error.h" #include "shill/logging.h" using brillo::dbus_utils::AsyncEventSequencer; using brillo::dbus_utils::DBusObject; using brillo::dbus_utils::ExportedObjectManager; using std::string; using std::vector; namespace shill { namespace Logging { static auto kModuleLogScope = ScopeLogger::kDBus; static string ObjectID(ChromeosDeviceDBusAdaptor* d) { return d->GetRpcIdentifier() + " (" + d->device()->UniqueName() + ")"; } } // static const char ChromeosDeviceDBusAdaptor::kPath[] = "/device/"; ChromeosDeviceDBusAdaptor::ChromeosDeviceDBusAdaptor( const scoped_refptr<dbus::Bus>& bus, Device* device) : org::chromium::flimflam::DeviceAdaptor(this), ChromeosDBusAdaptor(bus, kPath + SanitizePathElement(device->UniqueName())), device_(device) { // Register DBus object. RegisterWithDBusObject(dbus_object()); dbus_object()->RegisterAndBlock(); } ChromeosDeviceDBusAdaptor::~ChromeosDeviceDBusAdaptor() { dbus_object()->UnregisterAsync(); device_ = nullptr; } const string& ChromeosDeviceDBusAdaptor::GetRpcIdentifier() { return dbus_path().value(); } void ChromeosDeviceDBusAdaptor::EmitBoolChanged(const string& name, bool value) { SLOG(this, 2) << __func__ << ": " << name; SendPropertyChangedSignal(name, brillo::Any(value)); } void ChromeosDeviceDBusAdaptor::EmitUintChanged(const string& name, uint32_t value) { SLOG(this, 2) << __func__ << ": " << name; SendPropertyChangedSignal(name, brillo::Any(value)); } void ChromeosDeviceDBusAdaptor::EmitUint16Changed(const string& name, uint16_t value) { SLOG(this, 2) << __func__ << ": " << name; SendPropertyChangedSignal(name, brillo::Any(value)); } void ChromeosDeviceDBusAdaptor::EmitIntChanged(const string& name, int value) { SLOG(this, 2) << __func__ << ": " << name; SendPropertyChangedSignal(name, brillo::Any(value)); } void ChromeosDeviceDBusAdaptor::EmitStringChanged(const string& name, const string& value) { SLOG(this, 2) << __func__ << ": " << name; SendPropertyChangedSignal(name, brillo::Any(value)); } void ChromeosDeviceDBusAdaptor::EmitStringmapChanged(const string& name, const Stringmap& value) { SLOG(this, 2) << __func__ << ": " << name; SendPropertyChangedSignal(name, brillo::Any(value)); } void ChromeosDeviceDBusAdaptor::EmitStringmapsChanged(const string& name, const Stringmaps& value) { SLOG(this, 2) << __func__ << ": " << name; SendPropertyChangedSignal(name, brillo::Any(value)); } void ChromeosDeviceDBusAdaptor::EmitStringsChanged(const string& name, const Strings& value) { SLOG(this, 2) << __func__ << ": " << name; SendPropertyChangedSignal(name, brillo::Any(value)); } void ChromeosDeviceDBusAdaptor::EmitKeyValueStoreChanged( const string& name, const KeyValueStore& value) { SLOG(this, 2) << __func__ << ": " << name; brillo::VariantDictionary dict; KeyValueStore::ConvertToVariantDictionary(value, &dict); SendPropertyChangedSignal(name, brillo::Any(dict)); } void ChromeosDeviceDBusAdaptor::EmitRpcIdentifierChanged( const std::string& name, const std::string& value) { SLOG(this, 2) << __func__ << ": " << name; SendPropertyChangedSignal(name, brillo::Any(dbus::ObjectPath(value))); } void ChromeosDeviceDBusAdaptor::EmitRpcIdentifierArrayChanged( const string& name, const vector<string>& value) { SLOG(this, 2) << __func__ << ": " << name; vector<dbus::ObjectPath> paths; for (const auto& element : value) { paths.push_back(dbus::ObjectPath(element)); } SendPropertyChangedSignal(name, brillo::Any(paths)); } bool ChromeosDeviceDBusAdaptor::GetProperties( brillo::ErrorPtr* error, brillo::VariantDictionary* out_properties) { SLOG(this, 2) << __func__; return ChromeosDBusAdaptor::GetProperties(device_->store(), out_properties, error); } bool ChromeosDeviceDBusAdaptor::SetProperty(brillo::ErrorPtr* error, const string& name, const brillo::Any& value) { SLOG(this, 2) << __func__ << ": " << name; return ChromeosDBusAdaptor::SetProperty(device_->mutable_store(), name, value, error); } bool ChromeosDeviceDBusAdaptor::ClearProperty(brillo::ErrorPtr* error, const string& name) { SLOG(this, 2) << __func__ << ": " << name; return ChromeosDBusAdaptor::ClearProperty(device_->mutable_store(), name, error); } void ChromeosDeviceDBusAdaptor::Enable(DBusMethodResponsePtr<> response) { SLOG(this, 2) << __func__; Error e(Error::kOperationInitiated); ResultCallback callback = GetMethodReplyCallback(std::move(response)); device_->SetEnabledPersistent(true, &e, callback); ReturnResultOrDefer(callback, e); } void ChromeosDeviceDBusAdaptor::Disable(DBusMethodResponsePtr<> response) { SLOG(this, 2) << __func__ << ": Device " << device_->UniqueName(); Error e(Error::kOperationInitiated); ResultCallback callback = GetMethodReplyCallback(std::move(response)); device_->SetEnabledPersistent(false, &e, callback); ReturnResultOrDefer(callback, e); } bool ChromeosDeviceDBusAdaptor::ProposeScan(brillo::ErrorPtr* error) { SLOG(this, 2) << __func__; Error e; // User scan requests, which are the likely source of DBus requests, probably // aren't time-critical so we might as well perform a complete scan. It // also provides a failsafe for progressive scan. device_->Scan(Device::kFullScan, &e, __func__); return !e.ToChromeosError(error); } bool ChromeosDeviceDBusAdaptor::AddIPConfig(brillo::ErrorPtr* error, const string& /*method*/, dbus::ObjectPath* out_path) { SLOG(this, 2) << __func__; Error e(Error::kNotSupported, "This function is deprecated in shill"); return !e.ToChromeosError(error); } void ChromeosDeviceDBusAdaptor::Register(DBusMethodResponsePtr<> response, const string& network_id) { SLOG(this, 2) << __func__ << ": " << network_id; Error e(Error::kOperationInitiated); ResultCallback callback = GetMethodReplyCallback(std::move(response)); device_->RegisterOnNetwork(network_id, &e, callback); ReturnResultOrDefer(callback, e); } void ChromeosDeviceDBusAdaptor::RequirePin( DBusMethodResponsePtr<> response, const string& pin, bool require) { SLOG(this, 2) << __func__; Error e(Error::kOperationInitiated); ResultCallback callback = GetMethodReplyCallback(std::move(response)); device_->RequirePIN(pin, require, &e, callback); ReturnResultOrDefer(callback, e); } void ChromeosDeviceDBusAdaptor::EnterPin(DBusMethodResponsePtr<> response, const string& pin) { SLOG(this, 2) << __func__; Error e(Error::kOperationInitiated); ResultCallback callback = GetMethodReplyCallback(std::move(response)); device_->EnterPIN(pin, &e, callback); ReturnResultOrDefer(callback, e); } void ChromeosDeviceDBusAdaptor::UnblockPin(DBusMethodResponsePtr<> response, const string& unblock_code, const string& pin) { SLOG(this, 2) << __func__; Error e(Error::kOperationInitiated); ResultCallback callback = GetMethodReplyCallback(std::move(response)); device_->UnblockPIN(unblock_code, pin, &e, callback); ReturnResultOrDefer(callback, e); } void ChromeosDeviceDBusAdaptor::ChangePin(DBusMethodResponsePtr<> response, const string& old_pin, const string& new_pin) { SLOG(this, 2) << __func__; Error e(Error::kOperationInitiated); ResultCallback callback = GetMethodReplyCallback(std::move(response)); device_->ChangePIN(old_pin, new_pin, &e, callback); ReturnResultOrDefer(callback, e); } void ChromeosDeviceDBusAdaptor::Reset(DBusMethodResponsePtr<> response) { SLOG(this, 2) << __func__; Error e(Error::kOperationInitiated); ResultCallback callback = GetMethodReplyCallback(std::move(response)); device_->Reset(&e, callback); ReturnResultOrDefer(callback, e); } bool ChromeosDeviceDBusAdaptor::PerformTDLSOperation(brillo::ErrorPtr* error, const string& operation, const string& peer, string* out_state) { SLOG(this, 2) << __func__; Error e; *out_state = device_->PerformTDLSOperation(operation, peer, &e); return !e.ToChromeosError(error); } bool ChromeosDeviceDBusAdaptor::ResetByteCounters(brillo::ErrorPtr* error) { device_->ResetByteCounters(); return true; } void ChromeosDeviceDBusAdaptor::SetCarrier(DBusMethodResponsePtr<> response, const string& carrier) { SLOG(this, 2) << __func__ << ": " << carrier; Error e(Error::kOperationInitiated); ResultCallback callback = GetMethodReplyCallback(std::move(response)); device_->SetCarrier(carrier, &e, callback); ReturnResultOrDefer(callback, e); } bool ChromeosDeviceDBusAdaptor::RequestRoam(brillo::ErrorPtr* error, const std::string& addr) { SLOG(this, 2) << __func__ << ": " << addr; Error e; device_->RequestRoam(addr, &e); return !e.ToChromeosError(error); } bool ChromeosDeviceDBusAdaptor::AddWakeOnPacketConnection( brillo::ErrorPtr* error, const string& ip_endpoint) { SLOG(this, 2) << __func__; Error e; device_->AddWakeOnPacketConnection(ip_endpoint, &e); return !e.ToChromeosError(error); } bool ChromeosDeviceDBusAdaptor::RemoveWakeOnPacketConnection( brillo::ErrorPtr* error, const string& ip_endpoint) { SLOG(this, 2) << __func__; Error e; device_->RemoveWakeOnPacketConnection(ip_endpoint, &e); return !e.ToChromeosError(error); } bool ChromeosDeviceDBusAdaptor::RemoveAllWakeOnPacketConnections( brillo::ErrorPtr* error) { SLOG(this, 2) << __func__; Error e; device_->RemoveAllWakeOnPacketConnections(&e); return !e.ToChromeosError(error); } } // namespace shill