Remove D-Bus dependency from Manager
Here are the main changes:
1. Cleanup Manager::CreateService and Manager::RemoveService API
to remove D-Bus dependency.
1. Use refptr for Service since it will be maintained by both
Manager and its adaptor.
2. Move the monitoring of the service creator/owner to the adaptor,
since the DBusServiceWatcher is D-Bus specific.
Bug: 24194427
TEST=Start AP service on Brillo board, stop weaved, verify service
is destroyed and removed from apmanager.
TEST=Verify device setup works on Brillo board.
TEST=Verify apmanager does not crash on restart.
TEST=Run unittests on both Brillo and Chrome OS.
Change-Id: I33fd4eec2c1adf12830484ca087bd9dd56767288
diff --git a/manager.cc b/manager.cc
index c5b1cb4..88c54ef 100644
--- a/manager.cc
+++ b/manager.cc
@@ -18,51 +18,29 @@
#include <base/bind.h>
-#if !defined(__ANDROID__)
-#include <chromeos/dbus/service_constants.h>
-#else
-#include "dbus/apmanager/dbus-constants.h"
-#endif // __ANDROID__
+#include "apmanager/control_interface.h"
+#include "apmanager/manager.h"
-using brillo::dbus_utils::AsyncEventSequencer;
-using brillo::dbus_utils::ExportedObjectManager;
-using brillo::dbus_utils::DBusMethodResponse;
using std::string;
namespace apmanager {
Manager::Manager(ControlInterface* control_interface)
- : org::chromium::apmanager::ManagerAdaptor(this),
- control_interface_(control_interface),
+ : control_interface_(control_interface),
service_identifier_(0),
- device_info_(this) {}
+ device_info_(this),
+ adaptor_(control_interface->CreateManagerAdaptor(this)) {}
-Manager::~Manager() {
- // Terminate all services before cleanup other resources.
- for (auto& service : services_) {
- service.reset();
- }
-}
+Manager::~Manager() {}
void Manager::RegisterAsync(
- ExportedObjectManager* object_manager,
- const scoped_refptr<dbus::Bus>& bus,
const base::Callback<void(bool)>& completion_callback) {
- CHECK(!dbus_object_) << "Already registered";
- dbus_object_.reset(
- new brillo::dbus_utils::DBusObject(
- object_manager,
- bus,
- org::chromium::apmanager::ManagerAdaptor::GetObjectPath()));
- RegisterWithDBusObject(dbus_object_.get());
- dbus_object_->RegisterAsync(completion_callback);
- bus_ = bus;
-
- shill_manager_.Init(control_interface_);
- firewall_manager_.Init(control_interface_);
+ adaptor_->RegisterAsync(completion_callback);
}
void Manager::Start() {
+ shill_manager_.Init(control_interface_);
+ firewall_manager_.Init(control_interface_);
device_info_.Start();
}
@@ -70,51 +48,26 @@
device_info_.Stop();
}
-bool Manager::CreateService(brillo::ErrorPtr* error,
- dbus::Message* message,
- dbus::ObjectPath* out_service) {
+scoped_refptr<Service> Manager::CreateService() {
LOG(INFO) << "Manager::CreateService";
- std::unique_ptr<Service> service(new Service(this, service_identifier_));
- *out_service = service->adaptor()->GetRpcObjectIdentifier();
- services_.push_back(std::move(service));
-
- base::Closure on_connection_vanish = base::Bind(
- &Manager::OnAPServiceOwnerDisappeared,
- base::Unretained(this),
- service_identifier_);
- service_watchers_[service_identifier_].reset(
- new DBusServiceWatcher{bus_, message->GetSender(), on_connection_vanish});
- service_identifier_++;
-
- return true;
+ scoped_refptr<Service> service = new Service(this, service_identifier_++);
+ services_.push_back(service);
+ return service;
}
-bool Manager::RemoveService(brillo::ErrorPtr* error,
- dbus::Message* message,
- const dbus::ObjectPath& in_service) {
+bool Manager::RemoveService(const scoped_refptr<Service>& service,
+ Error* error) {
for (auto it = services_.begin(); it != services_.end(); ++it) {
- if ((*it)->adaptor()->GetRpcObjectIdentifier() == in_service) {
- // Verify the owner.
- auto watcher = service_watchers_.find((*it)->identifier());
- CHECK(watcher != service_watchers_.end())
- << "DBus watcher not created for service: " << (*it)->identifier();
- if (watcher->second->connection_name() != message->GetSender()) {
- brillo::Error::AddToPrintf(
- error, FROM_HERE, brillo::errors::dbus::kDomain, kManagerError,
- "Service %d is owned by another local process.",
- (*it)->identifier());
- return false;
- }
- service_watchers_.erase(watcher);
-
+ if (*it == service) {
services_.erase(it);
return true;
}
}
- brillo::Error::AddTo(
- error, FROM_HERE, brillo::errors::dbus::kDomain, kManagerError,
- "Service does not exist");
+ Error::PopulateAndLog(error,
+ Error::kInvalidArguments,
+ "Service does not exist",
+ FROM_HERE);
return false;
}
@@ -138,7 +91,7 @@
return nullptr;
}
-void Manager::RegisterDevice(scoped_refptr<Device> device) {
+void Manager::RegisterDevice(const scoped_refptr<Device>& device) {
LOG(INFO) << "Manager::RegisterDevice: registering device "
<< device->GetDeviceName();
devices_.push_back(device);
@@ -171,23 +124,4 @@
firewall_manager_.ReleaseDHCPPortAccess(interface);
}
-void Manager::OnAPServiceOwnerDisappeared(int service_identifier) {
- LOG(INFO) << "Owner for service " << service_identifier << " disappeared";
- // Remove service watcher.
- auto watcher = service_watchers_.find(service_identifier);
- CHECK(watcher != service_watchers_.end())
- << "Owner disappeared without watcher setup";
- service_watchers_.erase(watcher);
-
- // Remove the service.
- for (auto it = services_.begin(); it != services_.end(); ++it) {
- if ((*it)->identifier() == service_identifier) {
- services_.erase(it);
- return;
- }
- }
- LOG(INFO) << "Owner for service " << service_identifier
- << " disappeared before it is registered";
-}
-
} // namespace apmanager