blob: 3e8cf9952627d238b0d62d636eeac8fbe224c789 [file] [log] [blame]
Paul Stewart75897df2011-04-27 09:05:53 -07001// Copyright (c) 2011 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
Chris Masone8fe2c7e2011-06-09 15:51:19 -07005#include "shill/manager.h"
6
Paul Stewart75897df2011-04-27 09:05:53 -07007#include <time.h>
Paul Stewart75897df2011-04-27 09:05:53 -07008#include <stdio.h>
Chris Masoneee929b72011-05-10 10:02:18 -07009
Paul Stewart75897df2011-04-27 09:05:53 -070010#include <string>
Chris Masone52cd19b2011-06-29 17:23:04 -070011#include <vector>
Paul Stewart75897df2011-04-27 09:05:53 -070012
Chris Masoneee929b72011-05-10 10:02:18 -070013#include <base/logging.h>
Chris Masone9be4a9d2011-05-16 15:44:09 -070014#include <base/memory/ref_counted.h>
Chris Masone3bd3c8c2011-06-13 08:20:26 -070015#include <chromeos/dbus/service_constants.h>
Chris Masoneee929b72011-05-10 10:02:18 -070016
Chris Masoned0ceb8c2011-06-02 10:05:39 -070017#include "shill/adaptor_interfaces.h"
Paul Stewart75897df2011-04-27 09:05:53 -070018#include "shill/control_interface.h"
Chris Masoned0ceb8c2011-06-02 10:05:39 -070019#include "shill/dbus_adaptor.h"
Chris Masone9be4a9d2011-05-16 15:44:09 -070020#include "shill/device.h"
21#include "shill/device_info.h"
Chris Masone8fe2c7e2011-06-09 15:51:19 -070022#include "shill/error.h"
Chris Masoneb925cc82011-06-22 15:39:57 -070023#include "shill/property_accessor.h"
Chris Masone9be4a9d2011-05-16 15:44:09 -070024#include "shill/shill_event.h"
25#include "shill/service.h"
Paul Stewart75897df2011-04-27 09:05:53 -070026
27using std::string;
Chris Masone9be4a9d2011-05-16 15:44:09 -070028using std::vector;
Paul Stewart75897df2011-04-27 09:05:53 -070029
30namespace shill {
31Manager::Manager(ControlInterface *control_interface,
Paul Stewart0af98bf2011-05-10 17:38:08 -070032 EventDispatcher *dispatcher)
Chris Masone413a3192011-05-09 17:10:05 -070033 : adaptor_(control_interface->CreateManagerAdaptor(this)),
Paul Stewartb50f0b92011-05-16 16:31:42 -070034 device_info_(control_interface, dispatcher, this),
Chris Masone3bd3c8c2011-06-13 08:20:26 -070035 running_(false),
36 offline_mode_(false),
37 state_(flimflam::kStateOffline) {
Chris Masoneee929b72011-05-10 10:02:18 -070038 // Initialize Interface monitor, so we can detect new interfaces
Chris Masone27c4aa52011-07-02 13:10:14 -070039 HelpRegisterDerivedStrings(flimflam::kAvailableTechnologiesProperty,
40 &Manager::AvailableTechnologies,
41 NULL);
42 HelpRegisterDerivedStrings(flimflam::kConnectedTechnologiesProperty,
43 &Manager::ConnectedTechnologies,
44 NULL);
45 HelpRegisterDerivedString(flimflam::kDefaultTechnologyProperty,
46 &Manager::DefaultTechnology,
47 NULL);
48 store_.RegisterString(flimflam::kCheckPortalListProperty,
49 &check_portal_list_);
50 store_.RegisterString(flimflam::kCountryProperty, &country_);
51 HelpRegisterDerivedStrings(flimflam::kEnabledTechnologiesProperty,
52 &Manager::EnabledTechnologies,
53 NULL);
54 store_.RegisterBool(flimflam::kOfflineModeProperty, &offline_mode_);
55 store_.RegisterString(flimflam::kPortalURLProperty, &portal_url_);
56 HelpRegisterDerivedString(flimflam::kStateProperty,
57 &Manager::CalculateState,
58 NULL);
Chris Masoneb925cc82011-06-22 15:39:57 -070059
Chris Masone27c4aa52011-07-02 13:10:14 -070060 HelpRegisterDerivedStrings(flimflam::kDevicesProperty,
61 &Manager::EnumerateDevices,
62 NULL);
63 HelpRegisterDerivedStrings(flimflam::kServicesProperty,
64 &Manager::EnumerateAvailableServices,
65 NULL);
66 HelpRegisterDerivedStrings(flimflam::kServiceWatchListProperty,
67 &Manager::EnumerateWatchedServices,
68 NULL);
Chris Masone3c3f6a12011-07-01 10:01:41 -070069
Chris Masoneb925cc82011-06-22 15:39:57 -070070 // TODO(cmasone): Add support for R/O properties that return DBus object paths
71 // known_properties_.push_back(flimflam::kActiveProfileProperty);
72 // known_properties_.push_back(flimflam::kProfilesProperty);
Chris Masoneb925cc82011-06-22 15:39:57 -070073
Chris Masoneb07006b2011-05-14 16:10:04 -070074 VLOG(2) << "Manager initialized.";
Paul Stewart75897df2011-04-27 09:05:53 -070075}
76
Paul Stewart0af98bf2011-05-10 17:38:08 -070077Manager::~Manager() {}
Paul Stewart75897df2011-04-27 09:05:53 -070078
79void Manager::Start() {
Paul Stewart0af98bf2011-05-10 17:38:08 -070080 LOG(INFO) << "Manager started.";
Paul Stewart75897df2011-04-27 09:05:53 -070081 running_ = true;
Chris Masone413a3192011-05-09 17:10:05 -070082 adaptor_->UpdateRunning();
Paul Stewart0af98bf2011-05-10 17:38:08 -070083 device_info_.Start();
Paul Stewart75897df2011-04-27 09:05:53 -070084}
85
86void Manager::Stop() {
87 running_ = false;
Chris Masone413a3192011-05-09 17:10:05 -070088 adaptor_->UpdateRunning();
Paul Stewart75897df2011-04-27 09:05:53 -070089}
90
Chris Masone2b105542011-06-22 10:58:09 -070091void Manager::RegisterDevice(const DeviceRefPtr &to_manage) {
Chris Masonec1e50412011-06-07 13:04:53 -070092 vector<DeviceRefPtr>::iterator it;
Chris Masone9be4a9d2011-05-16 15:44:09 -070093 for (it = devices_.begin(); it != devices_.end(); ++it) {
Chris Masonec1e50412011-06-07 13:04:53 -070094 if (to_manage.get() == it->get())
Chris Masone9be4a9d2011-05-16 15:44:09 -070095 return;
96 }
Chris Masonec1e50412011-06-07 13:04:53 -070097 devices_.push_back(to_manage);
Paul Stewartf1ce5d22011-05-19 13:10:20 -070098
99 // TODO(pstew): Should check configuration
100 if (running_)
101 to_manage->Start();
Chris Masone9be4a9d2011-05-16 15:44:09 -0700102}
103
Chris Masone2b105542011-06-22 10:58:09 -0700104void Manager::DeregisterDevice(const DeviceConstRefPtr &to_forget) {
Chris Masonec1e50412011-06-07 13:04:53 -0700105 vector<DeviceRefPtr>::iterator it;
Chris Masone9be4a9d2011-05-16 15:44:09 -0700106 for (it = devices_.begin(); it != devices_.end(); ++it) {
Chris Masonec1e50412011-06-07 13:04:53 -0700107 if (to_forget.get() == it->get()) {
Chris Masone9be4a9d2011-05-16 15:44:09 -0700108 devices_.erase(it);
109 return;
110 }
111 }
112}
113
Chris Masone2b105542011-06-22 10:58:09 -0700114void Manager::RegisterService(const ServiceRefPtr &to_manage) {
Chris Masonec1e50412011-06-07 13:04:53 -0700115 vector<ServiceRefPtr>::iterator it;
Chris Masone9be4a9d2011-05-16 15:44:09 -0700116 for (it = services_.begin(); it != services_.end(); ++it) {
Chris Masonec1e50412011-06-07 13:04:53 -0700117 if (to_manage.get() == it->get())
Chris Masone9be4a9d2011-05-16 15:44:09 -0700118 return;
119 }
Chris Masonec1e50412011-06-07 13:04:53 -0700120 services_.push_back(to_manage);
Chris Masone9be4a9d2011-05-16 15:44:09 -0700121}
122
Chris Masone2b105542011-06-22 10:58:09 -0700123void Manager::DeregisterService(const ServiceConstRefPtr &to_forget) {
Chris Masonec1e50412011-06-07 13:04:53 -0700124 vector<ServiceRefPtr>::iterator it;
Chris Masone9be4a9d2011-05-16 15:44:09 -0700125 for (it = services_.begin(); it != services_.end(); ++it) {
Chris Masonec1e50412011-06-07 13:04:53 -0700126 if (to_forget.get() == it->get()) {
Chris Masone9be4a9d2011-05-16 15:44:09 -0700127 services_.erase(it);
128 return;
129 }
130 }
131}
132
133void Manager::FilterByTechnology(Device::Technology tech,
Chris Masonec1e50412011-06-07 13:04:53 -0700134 vector<DeviceRefPtr> *found) {
Chris Masone9be4a9d2011-05-16 15:44:09 -0700135 CHECK(found);
Chris Masonec1e50412011-06-07 13:04:53 -0700136 vector<DeviceRefPtr>::iterator it;
Chris Masone9be4a9d2011-05-16 15:44:09 -0700137 for (it = devices_.begin(); it != devices_.end(); ++it) {
138 if ((*it)->TechnologyIs(tech))
139 found->push_back(*it);
140 }
141}
142
Chris Masonee0dea762011-06-09 09:06:03 -0700143ServiceRefPtr Manager::FindService(const std::string& name) {
Chris Masonec1e50412011-06-07 13:04:53 -0700144 vector<ServiceRefPtr>::iterator it;
Chris Masone9be4a9d2011-05-16 15:44:09 -0700145 for (it = services_.begin(); it != services_.end(); ++it) {
Chris Masonee0dea762011-06-09 09:06:03 -0700146 if (name == (*it)->UniqueName()) {
147 return *it;
148 }
Chris Masone9be4a9d2011-05-16 15:44:09 -0700149 }
Chris Masonee0dea762011-06-09 09:06:03 -0700150 return NULL;
Chris Masone9be4a9d2011-05-16 15:44:09 -0700151}
152
Chris Masone27c4aa52011-07-02 13:10:14 -0700153void Manager::HelpRegisterDerivedString(const string &name,
Chris Masoneb925cc82011-06-22 15:39:57 -0700154 string(Manager::*get)(void),
155 bool(Manager::*set)(const string&)) {
Chris Masone27c4aa52011-07-02 13:10:14 -0700156 store_.RegisterDerivedString(
157 name,
158 StringAccessor(new CustomAccessor<Manager, string>(this, get, set)));
Chris Masoneb925cc82011-06-22 15:39:57 -0700159}
160
Chris Masone27c4aa52011-07-02 13:10:14 -0700161void Manager::HelpRegisterDerivedStrings(const string &name,
Chris Masonea8a2c252011-06-27 22:16:30 -0700162 Strings(Manager::*get)(void),
163 bool(Manager::*set)(const Strings&)) {
Chris Masone27c4aa52011-07-02 13:10:14 -0700164 store_.RegisterDerivedStrings(
165 name,
166 StringsAccessor(new CustomAccessor<Manager, Strings>(this, get, set)));
Chris Masoneb925cc82011-06-22 15:39:57 -0700167}
168
169string Manager::CalculateState() {
170 return flimflam::kStateOffline;
171}
172
173vector<string> Manager::AvailableTechnologies() {
174 return vector<string>();
175}
176
177vector<string> Manager::ConnectedTechnologies() {
178 return vector<string>();
179}
180
181string Manager::DefaultTechnology() {
182 return "";
183}
184
185vector<string> Manager::EnabledTechnologies() {
186 return vector<string>();
187}
188
Chris Masone3c3f6a12011-07-01 10:01:41 -0700189vector<string> Manager::EnumerateDevices() {
190 vector<string> device_rpc_ids;
191 for (vector<DeviceRefPtr>::const_iterator it = devices_.begin();
192 it != devices_.end();
193 ++it) {
194 device_rpc_ids.push_back((*it)->GetRpcIdentifier());
195 }
196 return device_rpc_ids;
197}
198
199vector<string> Manager::EnumerateAvailableServices() {
200 // TODO(cmasone): This should, instead, be returned by calling into the
201 // currently active profile.
202 vector<string> service_rpc_ids;
203 for (vector<ServiceRefPtr>::const_iterator it = services_.begin();
204 it != services_.end();
205 ++it) {
206 service_rpc_ids.push_back((*it)->GetRpcIdentifier());
207 }
208 return service_rpc_ids;
209}
210
211vector<string> Manager::EnumerateWatchedServices() {
212 // TODO(cmasone): Implement this for real by querying the active profile.
213 return EnumerateAvailableServices();
214}
215
Paul Stewart75897df2011-04-27 09:05:53 -0700216} // namespace shill