1 //
2 // Copyright (C) 2015 The Android Open Source Project
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16
17 #include "shill/dbus/chromeos_manager_dbus_adaptor.h"
18
19 #include <map>
20 #include <string>
21 #include <vector>
22
23 #include "shill/callbacks.h"
24 #include "shill/dbus/dbus_service_watcher_factory.h"
25 #include "shill/device.h"
26 #include "shill/error.h"
27 #include "shill/geolocation_info.h"
28 #include "shill/key_value_store.h"
29 #include "shill/logging.h"
30 #include "shill/manager.h"
31 #include "shill/property_store.h"
32
33 using base::Unretained;
34 using std::map;
35 using std::string;
36 using std::vector;
37
38 namespace shill {
39
40 namespace Logging {
41 static auto kModuleLogScope = ScopeLogger::kDBus;
ObjectID(ChromeosManagerDBusAdaptor * m)42 static string ObjectID(ChromeosManagerDBusAdaptor* m) {
43 return m->GetRpcIdentifier();
44 }
45 }
46
47 // static
48 const char ChromeosManagerDBusAdaptor::kPath[] = "/";
49
ChromeosManagerDBusAdaptor(const scoped_refptr<dbus::Bus> & adaptor_bus,const scoped_refptr<dbus::Bus> proxy_bus,Manager * manager)50 ChromeosManagerDBusAdaptor::ChromeosManagerDBusAdaptor(
51 const scoped_refptr<dbus::Bus>& adaptor_bus,
52 const scoped_refptr<dbus::Bus> proxy_bus,
53 Manager* manager)
54 : org::chromium::flimflam::ManagerAdaptor(this),
55 ChromeosDBusAdaptor(adaptor_bus, kPath),
56 manager_(manager),
57 proxy_bus_(proxy_bus),
58 dbus_service_watcher_factory_(DBusServiceWatcherFactory::GetInstance()) {}
59
~ChromeosManagerDBusAdaptor()60 ChromeosManagerDBusAdaptor::~ChromeosManagerDBusAdaptor() {
61 manager_ = nullptr;
62 }
63
RegisterAsync(const base::Callback<void (bool)> & completion_callback)64 void ChromeosManagerDBusAdaptor::RegisterAsync(
65 const base::Callback<void(bool)>& completion_callback) {
66 RegisterWithDBusObject(dbus_object());
67 dbus_object()->RegisterAsync(completion_callback);
68 }
69
EmitBoolChanged(const string & name,bool value)70 void ChromeosManagerDBusAdaptor::EmitBoolChanged(const string& name,
71 bool value) {
72 SLOG(this, 2) << __func__ << ": " << name;
73 SendPropertyChangedSignal(name, brillo::Any(value));
74 }
75
EmitUintChanged(const string & name,uint32_t value)76 void ChromeosManagerDBusAdaptor::EmitUintChanged(const string& name,
77 uint32_t value) {
78 SLOG(this, 2) << __func__ << ": " << name;
79 SendPropertyChangedSignal(name, brillo::Any(value));
80 }
81
EmitIntChanged(const string & name,int value)82 void ChromeosManagerDBusAdaptor::EmitIntChanged(const string& name, int value) {
83 SLOG(this, 2) << __func__ << ": " << name;
84 SendPropertyChangedSignal(name, brillo::Any(value));
85 }
86
EmitStringChanged(const string & name,const string & value)87 void ChromeosManagerDBusAdaptor::EmitStringChanged(const string& name,
88 const string& value) {
89 SLOG(this, 2) << __func__ << ": " << name;
90 SendPropertyChangedSignal(name, brillo::Any(value));
91 }
92
EmitStringsChanged(const string & name,const vector<string> & value)93 void ChromeosManagerDBusAdaptor::EmitStringsChanged(const string& name,
94 const vector<string>& value) {
95 SLOG(this, 2) << __func__ << ": " << name;
96 SendPropertyChangedSignal(name, brillo::Any(value));
97 }
98
EmitRpcIdentifierChanged(const string & name,const string & value)99 void ChromeosManagerDBusAdaptor::EmitRpcIdentifierChanged(
100 const string& name,
101 const string& value) {
102 SLOG(this, 2) << __func__ << ": " << name;
103 SendPropertyChangedSignal(name, brillo::Any(dbus::ObjectPath(value)));
104 }
105
EmitRpcIdentifierArrayChanged(const string & name,const vector<string> & value)106 void ChromeosManagerDBusAdaptor::EmitRpcIdentifierArrayChanged(
107 const string& name,
108 const vector<string>& value) {
109 SLOG(this, 2) << __func__ << ": " << name;
110 vector<dbus::ObjectPath> paths;
111 for (const auto& element : value) {
112 paths.push_back(dbus::ObjectPath(element));
113 }
114
115 SendPropertyChangedSignal(name, brillo::Any(paths));
116 }
117
GetProperties(brillo::ErrorPtr * error,brillo::VariantDictionary * properties)118 bool ChromeosManagerDBusAdaptor::GetProperties(
119 brillo::ErrorPtr* error, brillo::VariantDictionary* properties) {
120 SLOG(this, 2) << __func__;
121 return ChromeosDBusAdaptor::GetProperties(manager_->store(),
122 properties,
123 error);
124 }
125
SetProperty(brillo::ErrorPtr * error,const string & name,const brillo::Any & value)126 bool ChromeosManagerDBusAdaptor::SetProperty(brillo::ErrorPtr* error,
127 const string& name,
128 const brillo::Any& value) {
129 SLOG(this, 2) << __func__ << ": " << name;
130 return ChromeosDBusAdaptor::SetProperty(manager_->mutable_store(),
131 name,
132 value,
133 error);
134 }
135
GetState(brillo::ErrorPtr *,string * state)136 bool ChromeosManagerDBusAdaptor::GetState(brillo::ErrorPtr* /*error*/,
137 string* state) {
138 SLOG(this, 2) << __func__;
139 *state = manager_->CalculateState(nullptr);
140 return true;
141 }
142
CreateProfile(brillo::ErrorPtr * error,const string & name,dbus::ObjectPath * profile_path)143 bool ChromeosManagerDBusAdaptor::CreateProfile(brillo::ErrorPtr* error,
144 const string& name,
145 dbus::ObjectPath* profile_path) {
146 SLOG(this, 2) << __func__ << ": " << name;
147 Error e;
148 string path;
149 manager_->CreateProfile(name, &path, &e);
150 if (e.ToChromeosError(error)) {
151 return false;
152 }
153 *profile_path = dbus::ObjectPath(path);
154 return true;
155 }
156
RemoveProfile(brillo::ErrorPtr * error,const string & name)157 bool ChromeosManagerDBusAdaptor::RemoveProfile(brillo::ErrorPtr* error,
158 const string& name) {
159 SLOG(this, 2) << __func__ << ": " << name;
160 Error e;
161 manager_->RemoveProfile(name, &e);
162 return !e.ToChromeosError(error);
163 }
164
PushProfile(brillo::ErrorPtr * error,const string & name,dbus::ObjectPath * profile_path)165 bool ChromeosManagerDBusAdaptor::PushProfile(brillo::ErrorPtr* error,
166 const string& name,
167 dbus::ObjectPath* profile_path) {
168 SLOG(this, 2) << __func__ << ": " << name;
169 Error e;
170 string path;
171 manager_->PushProfile(name, &path, &e);
172 if (e.ToChromeosError(error)) {
173 return false;
174 }
175 *profile_path = dbus::ObjectPath(path);
176 return true;
177 }
178
InsertUserProfile(brillo::ErrorPtr * error,const string & name,const string & user_hash,dbus::ObjectPath * profile_path)179 bool ChromeosManagerDBusAdaptor::InsertUserProfile(
180 brillo::ErrorPtr* error,
181 const string& name,
182 const string& user_hash,
183 dbus::ObjectPath* profile_path) {
184 SLOG(this, 2) << __func__ << ": " << name;
185 Error e;
186 string path;
187 manager_->InsertUserProfile(name, user_hash, &path, &e);
188 if (e.ToChromeosError(error)) {
189 return false;
190 }
191 *profile_path = dbus::ObjectPath(path);
192 return true;;
193 }
194
PopProfile(brillo::ErrorPtr * error,const string & name)195 bool ChromeosManagerDBusAdaptor::PopProfile(brillo::ErrorPtr* error,
196 const string& name) {
197 SLOG(this, 2) << __func__ << ": " << name;
198 Error e;
199 manager_->PopProfile(name, &e);
200 return !e.ToChromeosError(error);
201 }
202
PopAnyProfile(brillo::ErrorPtr * error)203 bool ChromeosManagerDBusAdaptor::PopAnyProfile(brillo::ErrorPtr* error) {
204 SLOG(this, 2) << __func__;
205 Error e;
206 manager_->PopAnyProfile(&e);
207 return !e.ToChromeosError(error);
208 }
209
PopAllUserProfiles(brillo::ErrorPtr * error)210 bool ChromeosManagerDBusAdaptor::PopAllUserProfiles(brillo::ErrorPtr* error) {
211 SLOG(this, 2) << __func__;
212 Error e;
213 manager_->PopAllUserProfiles(&e);
214 return !e.ToChromeosError(error);
215 }
216
RecheckPortal(brillo::ErrorPtr * error)217 bool ChromeosManagerDBusAdaptor::RecheckPortal(brillo::ErrorPtr* error) {
218 SLOG(this, 2) << __func__;
219 Error e;
220 manager_->RecheckPortal(&e);
221 return !e.ToChromeosError(error);
222 }
223
RequestScan(brillo::ErrorPtr * error,const string & technology)224 bool ChromeosManagerDBusAdaptor::RequestScan(brillo::ErrorPtr* error,
225 const string& technology) { // NOLINT
226 SLOG(this, 2) << __func__ << ": " << technology;
227 Error e;
228 manager_->RequestScan(Device::kFullScan, technology, &e);
229 return !e.ToChromeosError(error);
230 }
231
EnableTechnology(DBusMethodResponsePtr<> response,const string & technology_name)232 void ChromeosManagerDBusAdaptor::EnableTechnology(
233 DBusMethodResponsePtr<> response, const string& technology_name) {
234 SLOG(this, 2) << __func__ << ": " << technology_name;
235 Error e(Error::kOperationInitiated);
236 ResultCallback callback = GetMethodReplyCallback(std::move(response));
237 const bool kPersistentSave = true;
238 manager_->SetEnabledStateForTechnology(technology_name, true,
239 kPersistentSave, &e, callback);
240 ReturnResultOrDefer(callback, e);
241 }
242
DisableTechnology(DBusMethodResponsePtr<> response,const string & technology_name)243 void ChromeosManagerDBusAdaptor::DisableTechnology(
244 DBusMethodResponsePtr<> response, const string& technology_name) {
245 SLOG(this, 2) << __func__ << ": " << technology_name;
246 Error e(Error::kOperationInitiated);
247 ResultCallback callback = GetMethodReplyCallback(std::move(response));
248 const bool kPersistentSave = true;
249 manager_->SetEnabledStateForTechnology(technology_name, false,
250 kPersistentSave, &e, callback);
251 ReturnResultOrDefer(callback, e);
252 }
253
254 // Called, e.g., to get WiFiService handle for a hidden SSID.
GetService(brillo::ErrorPtr * error,const brillo::VariantDictionary & args,dbus::ObjectPath * service_path)255 bool ChromeosManagerDBusAdaptor::GetService(
256 brillo::ErrorPtr* error,
257 const brillo::VariantDictionary& args,
258 dbus::ObjectPath* service_path) {
259 SLOG(this, 2) << __func__;
260 ServiceRefPtr service;
261 KeyValueStore args_store;
262 Error e;
263 KeyValueStore::ConvertFromVariantDictionary(args, &args_store);
264 service = manager_->GetService(args_store, &e);
265 if (e.ToChromeosError(error)) {
266 return false;
267 }
268 *service_path = dbus::ObjectPath(service->GetRpcIdentifier());
269 return true;
270 }
271
272 // Obsolete, use GetService instead.
GetVPNService(brillo::ErrorPtr * error,const brillo::VariantDictionary & args,dbus::ObjectPath * service_path)273 bool ChromeosManagerDBusAdaptor::GetVPNService(
274 brillo::ErrorPtr* error,
275 const brillo::VariantDictionary& args,
276 dbus::ObjectPath* service_path) {
277 SLOG(this, 2) << __func__;
278 return GetService(error, args, service_path);
279 }
280
281 // Obsolete, use GetService instead.
GetWifiService(brillo::ErrorPtr * error,const brillo::VariantDictionary & args,dbus::ObjectPath * service_path)282 bool ChromeosManagerDBusAdaptor::GetWifiService(
283 brillo::ErrorPtr* error,
284 const brillo::VariantDictionary& args,
285 dbus::ObjectPath* service_path) {
286 SLOG(this, 2) << __func__;
287 return GetService(error, args, service_path);
288 }
289
290
ConfigureService(brillo::ErrorPtr * error,const brillo::VariantDictionary & args,dbus::ObjectPath * service_path)291 bool ChromeosManagerDBusAdaptor::ConfigureService(
292 brillo::ErrorPtr* error,
293 const brillo::VariantDictionary& args,
294 dbus::ObjectPath* service_path) {
295 SLOG(this, 2) << __func__;
296 ServiceRefPtr service;
297 KeyValueStore args_store;
298 KeyValueStore::ConvertFromVariantDictionary(args, &args_store);
299 Error configure_error;
300 service = manager_->ConfigureService(args_store, &configure_error);
301 if (configure_error.ToChromeosError(error)) {
302 return false;
303 }
304 *service_path = dbus::ObjectPath(service->GetRpcIdentifier());
305 return true;
306 }
307
ConfigureServiceForProfile(brillo::ErrorPtr * error,const dbus::ObjectPath & profile_rpcid,const brillo::VariantDictionary & args,dbus::ObjectPath * service_path)308 bool ChromeosManagerDBusAdaptor::ConfigureServiceForProfile(
309 brillo::ErrorPtr* error,
310 const dbus::ObjectPath& profile_rpcid,
311 const brillo::VariantDictionary& args,
312 dbus::ObjectPath* service_path) {
313 SLOG(this, 2) << __func__;
314 ServiceRefPtr service;
315 KeyValueStore args_store;
316 KeyValueStore::ConvertFromVariantDictionary(args, &args_store);
317 Error configure_error;
318 service = manager_->ConfigureServiceForProfile(
319 profile_rpcid.value(), args_store, &configure_error);
320 if (!service || configure_error.ToChromeosError(error)) {
321 return false;
322 }
323 *service_path = dbus::ObjectPath(service->GetRpcIdentifier());
324 return true;
325 }
326
FindMatchingService(brillo::ErrorPtr * error,const brillo::VariantDictionary & args,dbus::ObjectPath * service_path)327 bool ChromeosManagerDBusAdaptor::FindMatchingService(
328 brillo::ErrorPtr* error,
329 const brillo::VariantDictionary& args,
330 dbus::ObjectPath* service_path) { // NOLINT
331 SLOG(this, 2) << __func__;
332 KeyValueStore args_store;
333 KeyValueStore::ConvertFromVariantDictionary(args, &args_store);
334
335 Error find_error;
336 ServiceRefPtr service =
337 manager_->FindMatchingService(args_store, &find_error);
338 if (find_error.ToChromeosError(error)) {
339 return false;
340 }
341
342 *service_path = dbus::ObjectPath(service->GetRpcIdentifier());
343 return true;
344 }
345
GetDebugLevel(brillo::ErrorPtr *,int32_t * level)346 bool ChromeosManagerDBusAdaptor::GetDebugLevel(brillo::ErrorPtr* /*error*/,
347 int32_t* level) {
348 SLOG(this, 2) << __func__;
349 *level = logging::GetMinLogLevel();
350 return true;
351 }
352
SetDebugLevel(brillo::ErrorPtr *,int32_t level)353 bool ChromeosManagerDBusAdaptor::SetDebugLevel(brillo::ErrorPtr* /*error*/,
354 int32_t level) {
355 SLOG(this, 2) << __func__ << ": " << level;
356 if (level < logging::LOG_NUM_SEVERITIES) {
357 logging::SetMinLogLevel(level);
358 // Like VLOG, SLOG uses negative verbose level.
359 ScopeLogger::GetInstance()->set_verbose_level(-level);
360 } else {
361 LOG(WARNING) << "Ignoring attempt to set log level to " << level;
362 }
363 return true;
364 }
365
GetServiceOrder(brillo::ErrorPtr *,string * order)366 bool ChromeosManagerDBusAdaptor::GetServiceOrder(brillo::ErrorPtr* /*error*/,
367 string* order) {
368 SLOG(this, 2) << __func__;
369 *order = manager_->GetTechnologyOrder();
370 return true;
371 }
372
SetServiceOrder(brillo::ErrorPtr * error,const string & order)373 bool ChromeosManagerDBusAdaptor::SetServiceOrder(brillo::ErrorPtr* error,
374 const string& order) {
375 SLOG(this, 2) << __func__ << ": " << order;
376 Error e;
377 manager_->SetTechnologyOrder(order, &e);
378 return !e.ToChromeosError(error);
379 }
380
GetDebugTags(brillo::ErrorPtr *,string * tags)381 bool ChromeosManagerDBusAdaptor::GetDebugTags(brillo::ErrorPtr* /*error*/,
382 string* tags) {
383 SLOG(this, 2) << __func__;
384 *tags = ScopeLogger::GetInstance()->GetEnabledScopeNames();
385 return true;
386 }
387
SetDebugTags(brillo::ErrorPtr *,const string & tags)388 bool ChromeosManagerDBusAdaptor::SetDebugTags(brillo::ErrorPtr* /*error*/,
389 const string& tags) {
390 SLOG(this, 2) << __func__ << ": " << tags;
391 ScopeLogger::GetInstance()->EnableScopesByName(tags);
392 return true;
393 }
394
ListDebugTags(brillo::ErrorPtr *,string * tags)395 bool ChromeosManagerDBusAdaptor::ListDebugTags(brillo::ErrorPtr* /*error*/,
396 string* tags) {
397 SLOG(this, 2) << __func__;
398 *tags = ScopeLogger::GetInstance()->GetAllScopeNames();
399 return true;
400 }
401
GetNetworksForGeolocation(brillo::ErrorPtr *,brillo::VariantDictionary * networks)402 bool ChromeosManagerDBusAdaptor::GetNetworksForGeolocation(
403 brillo::ErrorPtr* /*error*/,
404 brillo::VariantDictionary* networks) {
405 SLOG(this, 2) << __func__;
406 for (const auto& network : manager_->GetNetworksForGeolocation()) {
407 Stringmaps value;
408 // Convert GeolocationInfos to their Stringmaps equivalent.
409 for (const auto& info : network.second) {
410 value.push_back(info.properties());
411 }
412 networks->insert(std::make_pair(network.first, brillo::Any(value)));
413 }
414 return true;
415 }
416
VerifyDestination(DBusMethodResponsePtr<bool> response,const string & certificate,const string & public_key,const string & nonce,const string & signed_data,const string & destination_udn,const string & hotspot_ssid,const string & hotspot_bssid)417 void ChromeosManagerDBusAdaptor::VerifyDestination(
418 DBusMethodResponsePtr<bool> response,
419 const string& certificate,
420 const string& public_key,
421 const string& nonce,
422 const string& signed_data,
423 const string& destination_udn,
424 const string& hotspot_ssid,
425 const string& hotspot_bssid) {
426 SLOG(this, 2) << __func__;
427 ResultBoolCallback callback = GetBoolMethodReplyCallback(std::move(response));
428 #if !defined(DISABLE_WIFI)
429 Error e(Error::kOperationInitiated);
430 manager_->VerifyDestination(certificate, public_key, nonce,
431 signed_data, destination_udn,
432 hotspot_ssid, hotspot_bssid,
433 callback, &e);
434 #else
435 Error e(Error::kNotImplemented);
436 #endif // DISABLE_WIFI
437 if (e.IsOngoing()) {
438 return;
439 }
440 // Command failed synchronously.
441 CHECK(e.IsFailure()) << __func__ << " should only return directly on error.";
442 callback.Run(e, false);
443 }
444
VerifyAndEncryptCredentials(DBusMethodResponsePtr<string> response,const string & certificate,const string & public_key,const string & nonce,const string & signed_data,const string & destination_udn,const string & hotspot_ssid,const string & hotspot_bssid,const dbus::ObjectPath & network)445 void ChromeosManagerDBusAdaptor::VerifyAndEncryptCredentials(
446 DBusMethodResponsePtr<string> response,
447 const string& certificate,
448 const string& public_key,
449 const string& nonce,
450 const string& signed_data,
451 const string& destination_udn,
452 const string& hotspot_ssid,
453 const string& hotspot_bssid,
454 const dbus::ObjectPath& network) {
455 SLOG(this, 2) << __func__;
456 ResultStringCallback callback =
457 GetStringMethodReplyCallback(std::move(response));
458 #if !defined(DISABLE_WIFI)
459 Error e(Error::kOperationInitiated);
460 manager_->VerifyAndEncryptCredentials(certificate, public_key, nonce,
461 signed_data, destination_udn,
462 hotspot_ssid, hotspot_bssid,
463 network.value(),
464 callback,
465 &e);
466 #else
467 Error e(Error::kNotImplemented);
468 #endif // DISABLE_WIFI
469 if (e.IsOngoing()) {
470 return;
471 }
472 // Command failed synchronously.
473 CHECK(e.IsFailure()) << __func__ << " should only return directly on error.";
474 callback.Run(e, "");
475 }
476
VerifyAndEncryptData(DBusMethodResponsePtr<string> response,const string & certificate,const string & public_key,const string & nonce,const string & signed_data,const string & destination_udn,const string & hotspot_ssid,const string & hotspot_bssid,const string & data)477 void ChromeosManagerDBusAdaptor::VerifyAndEncryptData(
478 DBusMethodResponsePtr<string> response,
479 const string& certificate,
480 const string& public_key,
481 const string& nonce,
482 const string& signed_data,
483 const string& destination_udn,
484 const string& hotspot_ssid,
485 const string& hotspot_bssid,
486 const string& data) {
487 SLOG(this, 2) << __func__;
488 ResultStringCallback callback =
489 GetStringMethodReplyCallback(std::move(response));
490 #if !defined(DISABLE_WIFI)
491 Error e(Error::kOperationInitiated);
492 manager_->VerifyAndEncryptData(certificate, public_key, nonce,
493 signed_data, destination_udn,
494 hotspot_ssid, hotspot_bssid,
495 data, callback,
496 &e);
497 #else
498 Error e(Error::kNotImplemented);
499 #endif // DISABLE_WIFI
500 if (e.IsOngoing()) {
501 return;
502 }
503 // Command failed synchronously.
504 CHECK(e.IsFailure()) << __func__ << " should only return directly on error.";
505 callback.Run(e, "");
506 }
507
ConnectToBestServices(brillo::ErrorPtr * error)508 bool ChromeosManagerDBusAdaptor::ConnectToBestServices(
509 brillo::ErrorPtr* error) {
510 SLOG(this, 2) << __func__;
511 Error e;
512 manager_->ConnectToBestServices(&e);
513 return !e.ToChromeosError(error);
514 }
515
CreateConnectivityReport(brillo::ErrorPtr * error)516 bool ChromeosManagerDBusAdaptor::CreateConnectivityReport(
517 brillo::ErrorPtr* error) {
518 SLOG(this, 2) << __func__;
519 Error e;
520 manager_->CreateConnectivityReport(&e);
521 return !e.ToChromeosError(error);
522 }
523
ClaimInterface(brillo::ErrorPtr * error,dbus::Message * message,const string & claimer_name,const string & interface_name)524 bool ChromeosManagerDBusAdaptor::ClaimInterface(
525 brillo::ErrorPtr* error,
526 dbus::Message* message,
527 const string& claimer_name,
528 const string& interface_name) {
529 SLOG(this, 2) << __func__;
530 Error e;
531 // Empty claimer name is used to indicate default claimer.
532 // TODO(zqiu): update this API or make a new API to use a flag to indicate
533 // default claimer instead.
534 string claimer = (claimer_name == "" ? "" : message->GetSender());
535 manager_->ClaimDevice(claimer, interface_name, &e);
536 if (e.IsSuccess() && claimer_name != "") {
537 // Only setup watcher for non-default claimer.
538 watcher_for_device_claimer_.reset(
539 dbus_service_watcher_factory_->CreateDBusServiceWatcher(
540 proxy_bus_, claimer,
541 Bind(&ChromeosManagerDBusAdaptor::OnDeviceClaimerVanished,
542 Unretained(this))));
543 }
544 return !e.ToChromeosError(error);
545 }
546
ReleaseInterface(brillo::ErrorPtr * error,dbus::Message * message,const string & claimer_name,const string & interface_name)547 bool ChromeosManagerDBusAdaptor::ReleaseInterface(
548 brillo::ErrorPtr* error,
549 dbus::Message* message,
550 const string& claimer_name,
551 const string& interface_name) {
552 SLOG(this, 2) << __func__;
553 Error e;
554 bool claimer_removed;
555 // Empty claimer name is used to indicate default claimer.
556 // TODO(zqiu): update this API or make a new API to use a flag to indicate
557 // default claimer instead.
558 manager_->ReleaseDevice(
559 claimer_name == "" ? "" : message->GetSender(),
560 interface_name,
561 &claimer_removed,
562 &e);
563 if (claimer_removed) {
564 watcher_for_device_claimer_.reset();
565 }
566 return !e.ToChromeosError(error);
567 }
568
SetSchedScan(brillo::ErrorPtr * error,bool enable)569 bool ChromeosManagerDBusAdaptor::SetSchedScan(brillo::ErrorPtr* error,
570 bool enable) {
571 SLOG(this, 2) << __func__ << ": " << enable;
572 Error e;
573 manager_->SetSchedScan(enable, &e);
574 return !e.ToChromeosError(error);
575 }
576
SetupApModeInterface(brillo::ErrorPtr * error,dbus::Message * message,string * out_interface_name)577 bool ChromeosManagerDBusAdaptor::SetupApModeInterface(
578 brillo::ErrorPtr* error,
579 dbus::Message* message,
580 string* out_interface_name) {
581 SLOG(this, 2) << __func__;
582 Error e;
583 #if !defined(DISABLE_WIFI) && defined(__BRILLO__)
584 manager_->SetupApModeInterface(out_interface_name, &e);
585 if (e.IsSuccess()) {
586 // Setup a service watcher for the caller. This will restore interface mode
587 // back to station mode if the caller vanished.
588 watcher_for_ap_mode_setter_.reset(
589 dbus_service_watcher_factory_->CreateDBusServiceWatcher(
590 proxy_bus_, message->GetSender(),
591 Bind(&ChromeosManagerDBusAdaptor::OnApModeSetterVanished,
592 Unretained(this))));
593 }
594 #else
595 e.Populate(Error::kNotSupported);
596 #endif // !DISABLE_WIFI && __BRILLO__
597 return !e.ToChromeosError(error);
598 }
599
SetupStationModeInterface(brillo::ErrorPtr * error,string * out_interface_name)600 bool ChromeosManagerDBusAdaptor::SetupStationModeInterface(
601 brillo::ErrorPtr* error,
602 string* out_interface_name) {
603 SLOG(this, 2) << __func__;
604 Error e;
605 #if !defined(DISABLE_WIFI) && defined(__BRILLO__)
606 manager_->SetupStationModeInterface(out_interface_name, &e);
607 // Remove the service watcher for the AP mode setter.
608 watcher_for_ap_mode_setter_.reset();
609 #else
610 e.Populate(Error::kNotSupported);
611 #endif // !DISABLE_WIFI && __BRILLO__
612 return !e.ToChromeosError(error);
613 }
614
OnApModeSetterVanished()615 void ChromeosManagerDBusAdaptor::OnApModeSetterVanished() {
616 SLOG(this, 3) << __func__;
617 #if !defined(DISABLE_WIFI) && defined(__BRILLO__)
618 manager_->OnApModeSetterVanished();
619 #endif // !DISABLE_WIFI && __BRILLO__
620 watcher_for_ap_mode_setter_.reset();
621 }
622
OnDeviceClaimerVanished()623 void ChromeosManagerDBusAdaptor::OnDeviceClaimerVanished() {
624 SLOG(this, 3) << __func__;
625 manager_->OnDeviceClaimerVanished();
626 watcher_for_device_claimer_.reset();
627 }
628
629 } // namespace shill
630