//
// 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