blob: a177250596cfc6b953d527ebe53bcaf4a6e198d5 [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),
Peter Qiu1810c012015-02-05 14:35:41 -080021 device_info_(this) {}
Peter Qiu5dd242d2014-10-14 12:23:21 -070022
Peter Qiubf8e36c2014-12-03 22:59:45 -080023Manager::~Manager() {
24 // Terminate all services before cleanup other resources.
25 for (auto& service : services_) {
26 service.reset();
27 }
28}
Peter Qiu5dd242d2014-10-14 12:23:21 -070029
Peter Qiu376e4042014-11-13 09:40:28 -080030void Manager::RegisterAsync(ExportedObjectManager* object_manager,
Peter Qiuc9ce1f12014-12-05 11:14:29 -080031 const scoped_refptr<dbus::Bus>& bus,
Peter Qiu376e4042014-11-13 09:40:28 -080032 AsyncEventSequencer* sequencer) {
Peter Qiuf0731732014-11-11 09:46:41 -080033 CHECK(!dbus_object_) << "Already registered";
Peter Qiu376e4042014-11-13 09:40:28 -080034 dbus_object_.reset(
35 new chromeos::dbus_utils::DBusObject(
36 object_manager,
Peter Qiuc9ce1f12014-12-05 11:14:29 -080037 bus,
Vitaly Bukaa4630922014-12-11 18:46:46 -080038 org::chromium::apmanager::ManagerAdaptor::GetObjectPath()));
Peter Qiu376e4042014-11-13 09:40:28 -080039 RegisterWithDBusObject(dbus_object_.get());
Peter Qiuf0731732014-11-11 09:46:41 -080040 dbus_object_->RegisterAsync(
Peter Qiu376e4042014-11-13 09:40:28 -080041 sequencer->GetHandler("Manager.RegisterAsync() failed.", true));
Peter Qiuc9ce1f12014-12-05 11:14:29 -080042 bus_ = bus;
43
Peter Qiu1810c012015-02-05 14:35:41 -080044 shill_proxy_.Init(bus);
Peter Qiu943cf3a2015-02-24 10:59:17 -080045 firewall_manager_.Init(bus);
Peter Qiu5dd242d2014-10-14 12:23:21 -070046}
47
Peter Qiufb39ba42014-11-21 09:09:59 -080048void Manager::Start() {
49 device_info_.Start();
50}
51
52void Manager::Stop() {
53 device_info_.Stop();
54}
55
Peter Qiu376e4042014-11-13 09:40:28 -080056void Manager::CreateService(
57 scoped_ptr<DBusMethodResponse<dbus::ObjectPath>> response) {
Peter Qiufb39ba42014-11-21 09:09:59 -080058 LOG(INFO) << "Manager::CreateService";
Peter Qiu376e4042014-11-13 09:40:28 -080059 scoped_refptr<AsyncEventSequencer> sequencer(new AsyncEventSequencer());
Peter Qiufb39ba42014-11-21 09:09:59 -080060 scoped_ptr<Service> service(new Service(this, service_identifier_++));
Peter Qiu376e4042014-11-13 09:40:28 -080061
Peter Qiuc9ce1f12014-12-05 11:14:29 -080062 service->RegisterAsync(
Alex Vakulenkoe7a8bc52014-12-10 12:52:31 -080063 dbus_object_->GetObjectManager().get(), bus_, sequencer.get());
Peter Qiu376e4042014-11-13 09:40:28 -080064 sequencer->OnAllTasksCompletedCall({
Peter Qiu1ff67a72014-11-22 07:06:10 -080065 base::Bind(&Manager::OnServiceRegistered,
Peter Qiu376e4042014-11-13 09:40:28 -080066 base::Unretained(this),
67 base::Passed(&response),
68 base::Passed(&service))
69 });
Peter Qiu5dd242d2014-10-14 12:23:21 -070070}
71
Peter Qiuf0731732014-11-11 09:46:41 -080072bool Manager::RemoveService(chromeos::ErrorPtr* error,
73 const dbus::ObjectPath& in_service) {
Peter Qiu376e4042014-11-13 09:40:28 -080074 for (auto it = services_.begin(); it != services_.end(); ++it) {
75 if ((*it)->dbus_path() == in_service) {
76 services_.erase(it);
77 return true;
78 }
79 }
80
81 chromeos::Error::AddTo(
82 error, FROM_HERE, chromeos::errors::dbus::kDomain, kManagerError,
83 "Service does not exist");
Peter Qiuf0731732014-11-11 09:46:41 -080084 return false;
Peter Qiu5dd242d2014-10-14 12:23:21 -070085}
86
Peter Qiufb39ba42014-11-21 09:09:59 -080087scoped_refptr<Device> Manager::GetAvailableDevice() {
88 for (const auto& device : devices_) {
Peter Qiu8e785b92014-11-24 10:01:08 -080089 // Look for an unused device with AP interface mode support.
90 if (!device->GetInUsed() && !device->GetPreferredApInterface().empty()) {
Peter Qiufb39ba42014-11-21 09:09:59 -080091 return device;
92 }
93 }
94 return nullptr;
95}
96
97scoped_refptr<Device> Manager::GetDeviceFromInterfaceName(
98 const string& interface_name) {
99 for (const auto& device : devices_) {
100 if (device->InterfaceExists(interface_name)) {
101 return device;
102 }
103 }
104 return nullptr;
105}
106
107void Manager::RegisterDevice(scoped_refptr<Device> device) {
108 LOG(INFO) << "Manager::RegisterDevice: registering device "
109 << device->GetDeviceName();
110 // Register device DBbus interfaces.
111 scoped_refptr<AsyncEventSequencer> sequencer(new AsyncEventSequencer());
112 device->RegisterAsync(dbus_object_->GetObjectManager().get(),
Peter Qiuc9ce1f12014-12-05 11:14:29 -0800113 bus_,
Alex Vakulenkoe7a8bc52014-12-10 12:52:31 -0800114 sequencer.get(),
Peter Qiufb39ba42014-11-21 09:09:59 -0800115 device_identifier_++);
116 sequencer->OnAllTasksCompletedCall({
Peter Qiu1ff67a72014-11-22 07:06:10 -0800117 base::Bind(&Manager::OnDeviceRegistered,
Peter Qiufb39ba42014-11-21 09:09:59 -0800118 base::Unretained(this),
119 device)
120 });
121}
122
Peter Qiu7e0ffcf2014-12-02 12:53:27 -0800123void Manager::ClaimInterface(const string& interface_name) {
Peter Qiu1810c012015-02-05 14:35:41 -0800124 shill_proxy_.ClaimInterface(interface_name);
Peter Qiu7e0ffcf2014-12-02 12:53:27 -0800125}
126
127void Manager::ReleaseInterface(const string& interface_name) {
Peter Qiu1810c012015-02-05 14:35:41 -0800128 shill_proxy_.ReleaseInterface(interface_name);
Peter Qiu7e0ffcf2014-12-02 12:53:27 -0800129}
130
Peter Qiu943cf3a2015-02-24 10:59:17 -0800131void Manager::RequestDHCPPortAccess(const string& interface) {
132 firewall_manager_.RequestDHCPPortAccess(interface);
133}
134
135void Manager::ReleaseDHCPPortAccess(const string& interface) {
136 firewall_manager_.ReleaseDHCPPortAccess(interface);
137}
138
Peter Qiu1ff67a72014-11-22 07:06:10 -0800139void Manager::OnServiceRegistered(
Peter Qiu376e4042014-11-13 09:40:28 -0800140 scoped_ptr<DBusMethodResponse<dbus::ObjectPath>> response,
141 scoped_ptr<Service> service,
142 bool success) {
Peter Qiufb39ba42014-11-21 09:09:59 -0800143 LOG(INFO) << "ServiceRegistered";
Peter Qiu376e4042014-11-13 09:40:28 -0800144 // Success should always be true since we've said that failures are fatal.
145 CHECK(success) << "Init of one or more objects has failed.";
146
147 // Add service to the service list and return the service dbus path for the
148 // CreateService call.
149 dbus::ObjectPath service_path = service->dbus_path();
150 services_.push_back(std::unique_ptr<Service>(service.release()));
151 response->Return(service_path);
152}
153
Peter Qiu1ff67a72014-11-22 07:06:10 -0800154void Manager::OnDeviceRegistered(scoped_refptr<Device> device, bool success) {
Peter Qiufb39ba42014-11-21 09:09:59 -0800155 // Success should always be true since we've said that failures are fatal.
156 CHECK(success) << "Init of one or more objects has failed.";
157
158 devices_.push_back(device);
159 // TODO(zqiu): Property update for available devices.
160}
161
Peter Qiu5dd242d2014-10-14 12:23:21 -0700162} // namespace apmanager