//
// 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_dbus_adaptor.h"
#include <string>
#include <base/bind.h>
#include <base/callback.h>
#include "shill/error.h"
#include "shill/logging.h"
using base::Bind;
using base::Passed;
using brillo::dbus_utils::DBusObject;
using brillo::dbus_utils::ExportedObjectManager;
using std::string;
namespace shill {
namespace Logging {
static auto kModuleLogScope = ScopeLogger::kDBus;
static string ObjectID(ChromeosDBusAdaptor* d) {
if (d == nullptr)
return "(dbus_adaptor)";
return d->dbus_path().value();
}
}
// public static
const char ChromeosDBusAdaptor::kNullPath[] = "/";
ChromeosDBusAdaptor::ChromeosDBusAdaptor(const scoped_refptr<dbus::Bus>& bus,
const std::string& object_path)
: dbus_path_(object_path),
dbus_object_(new DBusObject(nullptr, bus, dbus_path_)) {
SLOG(this, 2) << "DBusAdaptor: " << object_path;
}
ChromeosDBusAdaptor::~ChromeosDBusAdaptor() {}
// static
bool ChromeosDBusAdaptor::SetProperty(PropertyStore* store,
const std::string& name,
const brillo::Any& value,
brillo::ErrorPtr* error) {
Error e;
store->SetAnyProperty(name, value, &e);
return !e.ToChromeosError(error);
}
// static
bool ChromeosDBusAdaptor::GetProperties(
const PropertyStore& store,
brillo::VariantDictionary* out_properties,
brillo::ErrorPtr* error) {
Error e;
store.GetProperties(out_properties, &e);
return !e.ToChromeosError(error);
}
// static
bool ChromeosDBusAdaptor::ClearProperty(PropertyStore* store,
const std::string& name,
brillo::ErrorPtr* error) {
Error e;
store->ClearProperty(name, &e);
return !e.ToChromeosError(error);
}
// static
string ChromeosDBusAdaptor::SanitizePathElement(const string& object_path) {
string sanitized_path(object_path);
size_t length = sanitized_path.length();
for (size_t i = 0; i < length; ++i) {
char c = sanitized_path[i];
// The D-Bus specification
// (http://dbus.freedesktop.org/doc/dbus-specification.html) states:
// Each element must only contain the ASCII characters "[A-Z][a-z][0-9]_"
if (!(c >= 'A' && c <= 'Z') &&
!(c >= 'a' && c <= 'z') &&
!(c >= '0' && c <= '9') &&
c != '_') {
sanitized_path[i] = '_';
}
}
return sanitized_path;
}
ResultCallback ChromeosDBusAdaptor::GetMethodReplyCallback(
DBusMethodResponsePtr<> response) {
return Bind(&ChromeosDBusAdaptor::MethodReplyCallback,
AsWeakPtr(),
Passed(&response));
}
ResultStringCallback ChromeosDBusAdaptor::GetStringMethodReplyCallback(
DBusMethodResponsePtr<string> response) {
return Bind(&ChromeosDBusAdaptor::StringMethodReplyCallback,
AsWeakPtr(),
Passed(&response));
}
ResultBoolCallback ChromeosDBusAdaptor::GetBoolMethodReplyCallback(
DBusMethodResponsePtr<bool> response) {
return Bind(&ChromeosDBusAdaptor::BoolMethodReplyCallback,
AsWeakPtr(),
Passed(&response));
}
void ChromeosDBusAdaptor::ReturnResultOrDefer(
const ResultCallback& callback, const Error& error) {
// Invoke response if command is completed synchronously (either
// success or failure).
if (!error.IsOngoing()) {
callback.Run(error);
}
}
void ChromeosDBusAdaptor::MethodReplyCallback(DBusMethodResponsePtr<> response,
const Error& error) {
brillo::ErrorPtr chromeos_error;
if (error.ToChromeosError(&chromeos_error)) {
response->ReplyWithError(chromeos_error.get());
} else {
response->Return();
}
}
template<typename T>
void ChromeosDBusAdaptor::TypedMethodReplyCallback(
DBusMethodResponsePtr<T> response, const Error& error, const T& returned) {
brillo::ErrorPtr chromeos_error;
if (error.ToChromeosError(&chromeos_error)) {
response->ReplyWithError(chromeos_error.get());
} else {
response->Return(returned);
}
}
void ChromeosDBusAdaptor::StringMethodReplyCallback(
DBusMethodResponsePtr<string> response,
const Error& error,
const string& returned) {
TypedMethodReplyCallback(std::move(response), error, returned);
}
void ChromeosDBusAdaptor::BoolMethodReplyCallback(
DBusMethodResponsePtr<bool> response,
const Error& error,
bool returned) {
TypedMethodReplyCallback(std::move(response), error, returned);
}
} // namespace shill