blob: 6447727e19bd889e9efdd69447c01e36ceabb928 [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;
Peter Qiufb39ba42014-11-21 09:09:59 -080013using std::string;
Peter Qiu376e4042014-11-13 09:40:28 -080014
Peter Qiu5dd242d2014-10-14 12:23:21 -070015namespace apmanager {
16
Peter Qiu376e4042014-11-13 09:40:28 -080017Manager::Manager()
18 : org::chromium::apmanager::ManagerAdaptor(this),
Peter Qiufb39ba42014-11-21 09:09:59 -080019 service_identifier_(0),
20 device_identifier_(0),
21 device_info_(this) {}
Peter Qiu5dd242d2014-10-14 12:23:21 -070022
23Manager::~Manager() {}
24
Peter Qiu376e4042014-11-13 09:40:28 -080025void Manager::RegisterAsync(ExportedObjectManager* object_manager,
26 AsyncEventSequencer* sequencer) {
Peter Qiuf0731732014-11-11 09:46:41 -080027 CHECK(!dbus_object_) << "Already registered";
Peter Qiu376e4042014-11-13 09:40:28 -080028 dbus_object_.reset(
29 new chromeos::dbus_utils::DBusObject(
30 object_manager,
31 object_manager ? object_manager->GetBus() : nullptr,
32 dbus::ObjectPath(kManagerPath)));
33 RegisterWithDBusObject(dbus_object_.get());
Peter Qiuf0731732014-11-11 09:46:41 -080034 dbus_object_->RegisterAsync(
Peter Qiu376e4042014-11-13 09:40:28 -080035 sequencer->GetHandler("Manager.RegisterAsync() failed.", true));
Peter Qiu5dd242d2014-10-14 12:23:21 -070036}
37
Peter Qiufb39ba42014-11-21 09:09:59 -080038void Manager::Start() {
39 device_info_.Start();
40}
41
42void Manager::Stop() {
43 device_info_.Stop();
44}
45
Peter Qiu376e4042014-11-13 09:40:28 -080046void Manager::CreateService(
47 scoped_ptr<DBusMethodResponse<dbus::ObjectPath>> response) {
Peter Qiufb39ba42014-11-21 09:09:59 -080048 LOG(INFO) << "Manager::CreateService";
Peter Qiu376e4042014-11-13 09:40:28 -080049 scoped_refptr<AsyncEventSequencer> sequencer(new AsyncEventSequencer());
Peter Qiufb39ba42014-11-21 09:09:59 -080050 scoped_ptr<Service> service(new Service(this, service_identifier_++));
Peter Qiu376e4042014-11-13 09:40:28 -080051
52 service->RegisterAsync(dbus_object_->GetObjectManager().get(), sequencer);
53 sequencer->OnAllTasksCompletedCall({
Peter Qiu1ff67a72014-11-22 07:06:10 -080054 base::Bind(&Manager::OnServiceRegistered,
Peter Qiu376e4042014-11-13 09:40:28 -080055 base::Unretained(this),
56 base::Passed(&response),
57 base::Passed(&service))
58 });
Peter Qiu5dd242d2014-10-14 12:23:21 -070059}
60
Peter Qiuf0731732014-11-11 09:46:41 -080061bool Manager::RemoveService(chromeos::ErrorPtr* error,
62 const dbus::ObjectPath& in_service) {
Peter Qiu376e4042014-11-13 09:40:28 -080063 for (auto it = services_.begin(); it != services_.end(); ++it) {
64 if ((*it)->dbus_path() == in_service) {
65 services_.erase(it);
66 return true;
67 }
68 }
69
70 chromeos::Error::AddTo(
71 error, FROM_HERE, chromeos::errors::dbus::kDomain, kManagerError,
72 "Service does not exist");
Peter Qiuf0731732014-11-11 09:46:41 -080073 return false;
Peter Qiu5dd242d2014-10-14 12:23:21 -070074}
75
Peter Qiufb39ba42014-11-21 09:09:59 -080076scoped_refptr<Device> Manager::GetAvailableDevice() {
77 for (const auto& device : devices_) {
Peter Qiu8e785b92014-11-24 10:01:08 -080078 // Look for an unused device with AP interface mode support.
79 if (!device->GetInUsed() && !device->GetPreferredApInterface().empty()) {
Peter Qiufb39ba42014-11-21 09:09:59 -080080 return device;
81 }
82 }
83 return nullptr;
84}
85
86scoped_refptr<Device> Manager::GetDeviceFromInterfaceName(
87 const string& interface_name) {
88 for (const auto& device : devices_) {
89 if (device->InterfaceExists(interface_name)) {
90 return device;
91 }
92 }
93 return nullptr;
94}
95
96void Manager::RegisterDevice(scoped_refptr<Device> device) {
97 LOG(INFO) << "Manager::RegisterDevice: registering device "
98 << device->GetDeviceName();
99 // Register device DBbus interfaces.
100 scoped_refptr<AsyncEventSequencer> sequencer(new AsyncEventSequencer());
101 device->RegisterAsync(dbus_object_->GetObjectManager().get(),
102 sequencer,
103 device_identifier_++);
104 sequencer->OnAllTasksCompletedCall({
Peter Qiu1ff67a72014-11-22 07:06:10 -0800105 base::Bind(&Manager::OnDeviceRegistered,
Peter Qiufb39ba42014-11-21 09:09:59 -0800106 base::Unretained(this),
107 device)
108 });
109}
110
Peter Qiu1ff67a72014-11-22 07:06:10 -0800111void Manager::OnServiceRegistered(
Peter Qiu376e4042014-11-13 09:40:28 -0800112 scoped_ptr<DBusMethodResponse<dbus::ObjectPath>> response,
113 scoped_ptr<Service> service,
114 bool success) {
Peter Qiufb39ba42014-11-21 09:09:59 -0800115 LOG(INFO) << "ServiceRegistered";
Peter Qiu376e4042014-11-13 09:40:28 -0800116 // Success should always be true since we've said that failures are fatal.
117 CHECK(success) << "Init of one or more objects has failed.";
118
119 // Add service to the service list and return the service dbus path for the
120 // CreateService call.
121 dbus::ObjectPath service_path = service->dbus_path();
122 services_.push_back(std::unique_ptr<Service>(service.release()));
123 response->Return(service_path);
124}
125
Peter Qiu1ff67a72014-11-22 07:06:10 -0800126void Manager::OnDeviceRegistered(scoped_refptr<Device> device, bool success) {
Peter Qiufb39ba42014-11-21 09:09:59 -0800127 // Success should always be true since we've said that failures are fatal.
128 CHECK(success) << "Init of one or more objects has failed.";
129
130 devices_.push_back(device);
131 // TODO(zqiu): Property update for available devices.
132}
133
Peter Qiu5dd242d2014-10-14 12:23:21 -0700134} // namespace apmanager