blob: 9842b4182a541ef5a7de5dbce590f4f0c379e2e8 [file] [log] [blame]
Peter Qiu5dd242d2014-10-14 12:23:21 -07001// Copyright 2014 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "apmanager/manager.h"
6
Peter Qiu376e4042014-11-13 09:40:28 -08007#include <base/bind.h>
Peter Qiu5dd242d2014-10-14 12:23:21 -07008#include <chromeos/dbus/service_constants.h>
9
Peter Qiu376e4042014-11-13 09:40:28 -080010using chromeos::dbus_utils::AsyncEventSequencer;
11using chromeos::dbus_utils::ExportedObjectManager;
12using chromeos::dbus_utils::DBusMethodResponse;
13
Peter Qiu5dd242d2014-10-14 12:23:21 -070014namespace apmanager {
15
Peter Qiu376e4042014-11-13 09:40:28 -080016Manager::Manager()
17 : org::chromium::apmanager::ManagerAdaptor(this),
18 service_identifier_(0) {}
Peter Qiu5dd242d2014-10-14 12:23:21 -070019
20Manager::~Manager() {}
21
Peter Qiu376e4042014-11-13 09:40:28 -080022void Manager::RegisterAsync(ExportedObjectManager* object_manager,
23 AsyncEventSequencer* sequencer) {
Peter Qiuf0731732014-11-11 09:46:41 -080024 CHECK(!dbus_object_) << "Already registered";
Peter Qiu376e4042014-11-13 09:40:28 -080025 dbus_object_.reset(
26 new chromeos::dbus_utils::DBusObject(
27 object_manager,
28 object_manager ? object_manager->GetBus() : nullptr,
29 dbus::ObjectPath(kManagerPath)));
30 RegisterWithDBusObject(dbus_object_.get());
Peter Qiuf0731732014-11-11 09:46:41 -080031 dbus_object_->RegisterAsync(
Peter Qiu376e4042014-11-13 09:40:28 -080032 sequencer->GetHandler("Manager.RegisterAsync() failed.", true));
Peter Qiu5dd242d2014-10-14 12:23:21 -070033}
34
Peter Qiu376e4042014-11-13 09:40:28 -080035void Manager::CreateService(
36 scoped_ptr<DBusMethodResponse<dbus::ObjectPath>> response) {
37 scoped_refptr<AsyncEventSequencer> sequencer(new AsyncEventSequencer());
38 scoped_ptr<Service> service(new Service(service_identifier_++));
39
40 service->RegisterAsync(dbus_object_->GetObjectManager().get(), sequencer);
41 sequencer->OnAllTasksCompletedCall({
42 base::Bind(&Manager::ServiceRegistered,
43 base::Unretained(this),
44 base::Passed(&response),
45 base::Passed(&service))
46 });
Peter Qiu5dd242d2014-10-14 12:23:21 -070047}
48
Peter Qiuf0731732014-11-11 09:46:41 -080049bool Manager::RemoveService(chromeos::ErrorPtr* error,
50 const dbus::ObjectPath& in_service) {
Peter Qiu376e4042014-11-13 09:40:28 -080051 for (auto it = services_.begin(); it != services_.end(); ++it) {
52 if ((*it)->dbus_path() == in_service) {
53 services_.erase(it);
54 return true;
55 }
56 }
57
58 chromeos::Error::AddTo(
59 error, FROM_HERE, chromeos::errors::dbus::kDomain, kManagerError,
60 "Service does not exist");
Peter Qiuf0731732014-11-11 09:46:41 -080061 return false;
Peter Qiu5dd242d2014-10-14 12:23:21 -070062}
63
Peter Qiu376e4042014-11-13 09:40:28 -080064void Manager::ServiceRegistered(
65 scoped_ptr<DBusMethodResponse<dbus::ObjectPath>> response,
66 scoped_ptr<Service> service,
67 bool success) {
68 // Success should always be true since we've said that failures are fatal.
69 CHECK(success) << "Init of one or more objects has failed.";
70
71 // Add service to the service list and return the service dbus path for the
72 // CreateService call.
73 dbus::ObjectPath service_path = service->dbus_path();
74 services_.push_back(std::unique_ptr<Service>(service.release()));
75 response->Return(service_path);
76}
77
Peter Qiu5dd242d2014-10-14 12:23:21 -070078} // namespace apmanager