138 lines
4.7 KiB
C++
138 lines
4.7 KiB
C++
//
|
|
// 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 "apmanager/dbus/dbus_control.h"
|
|
|
|
#include "apmanager/dbus/config_dbus_adaptor.h"
|
|
#include "apmanager/dbus/device_dbus_adaptor.h"
|
|
#include "apmanager/dbus/manager_dbus_adaptor.h"
|
|
#include "apmanager/dbus/service_dbus_adaptor.h"
|
|
#include "apmanager/dbus/shill_dbus_proxy.h"
|
|
#include "apmanager/manager.h"
|
|
|
|
#if !defined(__ANDROID__)
|
|
#include "apmanager/dbus/permission_broker_dbus_proxy.h"
|
|
#else
|
|
#include "apmanager/dbus/firewalld_dbus_proxy.h"
|
|
#endif //__ANDROID__
|
|
|
|
using brillo::dbus_utils::AsyncEventSequencer;
|
|
using brillo::dbus_utils::ExportedObjectManager;
|
|
|
|
namespace apmanager {
|
|
|
|
namespace {
|
|
const char kServiceName[] = "org.chromium.apmanager";
|
|
const char kServicePath[] = "/org/chromium/apmanager";
|
|
} // namespace
|
|
|
|
DBusControl::DBusControl() {}
|
|
|
|
DBusControl::~DBusControl() {}
|
|
|
|
void DBusControl::Init() {
|
|
// Setup bus connection.
|
|
dbus::Bus::Options options;
|
|
options.bus_type = dbus::Bus::SYSTEM;
|
|
bus_ = new dbus::Bus(options);
|
|
CHECK(bus_->Connect());
|
|
|
|
// Create and register ObjectManager.
|
|
scoped_refptr<AsyncEventSequencer> sequencer(new AsyncEventSequencer());
|
|
object_manager_.reset(
|
|
new ExportedObjectManager(bus_, dbus::ObjectPath(kServicePath)));
|
|
object_manager_->RegisterAsync(
|
|
sequencer->GetHandler("ObjectManager.RegisterAsync() failed.", true));
|
|
|
|
// Create and register Manager.
|
|
manager_.reset(new Manager(this));
|
|
manager_->RegisterAsync(
|
|
sequencer->GetHandler("Manager.RegisterAsync() failed.", true));
|
|
|
|
// Take over the service ownership once the objects registration is completed.
|
|
sequencer->OnAllTasksCompletedCall({
|
|
base::Bind(&DBusControl::OnObjectRegistrationCompleted,
|
|
base::Unretained(this))
|
|
});
|
|
}
|
|
|
|
void DBusControl::Shutdown() {
|
|
manager_.reset();
|
|
object_manager_.reset();
|
|
if (bus_) {
|
|
bus_->ShutdownAndBlock();
|
|
}
|
|
}
|
|
|
|
void DBusControl::OnObjectRegistrationCompleted(bool registration_success) {
|
|
// Success should always be true since we've said that failures are fatal.
|
|
CHECK(registration_success) << "Init of one or more objects has failed.";
|
|
CHECK(bus_->RequestOwnershipAndBlock(kServiceName,
|
|
dbus::Bus::REQUIRE_PRIMARY))
|
|
<< "Unable to take ownership of " << kServiceName;
|
|
|
|
// D-Bus service is ready, now we can start the Manager.
|
|
manager_->Start();
|
|
}
|
|
|
|
std::unique_ptr<ConfigAdaptorInterface> DBusControl::CreateConfigAdaptor(
|
|
Config* config, int service_identifier) {
|
|
return std::unique_ptr<ConfigAdaptorInterface>(
|
|
new ConfigDBusAdaptor(
|
|
bus_, object_manager_.get(), config, service_identifier));
|
|
}
|
|
|
|
std::unique_ptr<DeviceAdaptorInterface> DBusControl::CreateDeviceAdaptor(
|
|
Device* device) {
|
|
return std::unique_ptr<DeviceAdaptorInterface>(
|
|
new DeviceDBusAdaptor(bus_, object_manager_.get(), device));
|
|
}
|
|
|
|
std::unique_ptr<ManagerAdaptorInterface> DBusControl::CreateManagerAdaptor(
|
|
Manager* manager) {
|
|
return std::unique_ptr<ManagerAdaptorInterface>(
|
|
new ManagerDBusAdaptor(bus_, object_manager_.get(), manager));
|
|
}
|
|
|
|
std::unique_ptr<ServiceAdaptorInterface> DBusControl::CreateServiceAdaptor(
|
|
Service* service) {
|
|
return std::unique_ptr<ServiceAdaptorInterface>(
|
|
new ServiceDBusAdaptor(bus_, object_manager_.get(), service));
|
|
}
|
|
|
|
std::unique_ptr<FirewallProxyInterface> DBusControl::CreateFirewallProxy(
|
|
const base::Closure& service_appeared_callback,
|
|
const base::Closure& service_vanished_callback) {
|
|
#if !defined(__ANDROID__)
|
|
return std::unique_ptr<FirewallProxyInterface>(
|
|
new PermissionBrokerDBusProxy(
|
|
bus_, service_appeared_callback, service_vanished_callback));
|
|
#else
|
|
return std::unique_ptr<FirewallProxyInterface>(
|
|
new FirewalldDBusProxy(
|
|
bus_, service_appeared_callback, service_vanished_callback));
|
|
#endif // __ANDROID__
|
|
}
|
|
|
|
std::unique_ptr<ShillProxyInterface> DBusControl::CreateShillProxy(
|
|
const base::Closure& service_appeared_callback,
|
|
const base::Closure& service_vanished_callback) {
|
|
return std::unique_ptr<ShillProxyInterface>(
|
|
new ShillDBusProxy(
|
|
bus_, service_appeared_callback, service_vanished_callback));
|
|
}
|
|
|
|
} // namespace apmanager
|