blob: c3f99d5ea557a97d77ba37365033b448aebc1d92 [file] [log] [blame]
Peter Qiu7e8b8ee2014-11-25 13:55:57 -08001// 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 "shill/device_claimer.h"
6
7#include "shill/device_info.h"
8
9using std::string;
10
11namespace shill {
12
13DeviceClaimer::DeviceClaimer(
Paul Stewarta794cd62015-06-16 13:13:10 -070014 const std::string& dbus_service_name,
15 DeviceInfo* device_info,
Peter Qiu1d499ed2015-01-30 16:01:27 -080016 bool default_claimer)
Peter Qiu7e8b8ee2014-11-25 13:55:57 -080017 : dbus_service_name_(dbus_service_name),
Peter Qiu1d499ed2015-01-30 16:01:27 -080018 device_info_(device_info),
19 default_claimer_(default_claimer) {}
Peter Qiu7e8b8ee2014-11-25 13:55:57 -080020
21DeviceClaimer::~DeviceClaimer() {
22 // Release claimed devices if there is any.
23 if (DevicesClaimed()) {
Paul Stewarta794cd62015-06-16 13:13:10 -070024 for (const auto& device : claimed_device_names_) {
Peter Qiu7e8b8ee2014-11-25 13:55:57 -080025 device_info_->RemoveDeviceFromBlackList(device);
26 }
27 // Clear claimed device list.
28 claimed_device_names_.clear();
29 }
30 // Reset DBus name watcher.
31 dbus_name_watcher_.reset();
32}
33
34bool DeviceClaimer::StartDBusNameWatcher(
Paul Stewarta794cd62015-06-16 13:13:10 -070035 DBusManager* dbus_manager,
36 const DBusNameWatcher::NameAppearedCallback& name_appeared_callback,
37 const DBusNameWatcher::NameVanishedCallback& name_vanished_callback) {
Peter Qiu7e8b8ee2014-11-25 13:55:57 -080038 if (dbus_name_watcher_) {
39 LOG(ERROR) << "DBus name watcher already started";
40 return false;
41 }
42 dbus_name_watcher_.reset(
43 dbus_manager->CreateNameWatcher(dbus_service_name_,
44 name_appeared_callback,
45 name_vanished_callback));
46 return true;
47}
48
Paul Stewarta794cd62015-06-16 13:13:10 -070049bool DeviceClaimer::Claim(const string& device_name, Error* error) {
Peter Qiu7e8b8ee2014-11-25 13:55:57 -080050 // Check if device is claimed already.
51 if (claimed_device_names_.find(device_name) != claimed_device_names_.end()) {
Paul Stewart34f424e2015-01-16 15:30:20 -080052 Error::PopulateAndLog(FROM_HERE, error, Error::kInvalidArguments,
Peter Qiu7e8b8ee2014-11-25 13:55:57 -080053 "Device " + device_name +
54 " had already been claimed");
55 return false;
56 }
57
58 // Add device to the black list.
59 device_info_->AddDeviceToBlackList(device_name);
60
61 claimed_device_names_.insert(device_name);
Peter Qiu1d499ed2015-01-30 16:01:27 -080062 released_device_names_.erase(device_name);
Peter Qiu7e8b8ee2014-11-25 13:55:57 -080063 return true;
64}
65
Paul Stewarta794cd62015-06-16 13:13:10 -070066bool DeviceClaimer::Release(const std::string& device_name,
67 Error* error) {
Peter Qiu7e8b8ee2014-11-25 13:55:57 -080068 // Make sure this is a device that have been claimed.
69 if (claimed_device_names_.find(device_name) == claimed_device_names_.end()) {
Paul Stewart34f424e2015-01-16 15:30:20 -080070 Error::PopulateAndLog(FROM_HERE, error, Error::kInvalidArguments,
Peter Qiu7e8b8ee2014-11-25 13:55:57 -080071 "Device " + device_name +
72 " have not been claimed");
73 return false;
74 }
75
76 // Remove the device from the black list.
77 device_info_->RemoveDeviceFromBlackList(device_name);
78
Peter Qiu7e8b8ee2014-11-25 13:55:57 -080079 claimed_device_names_.erase(device_name);
Peter Qiu1d499ed2015-01-30 16:01:27 -080080 released_device_names_.insert(device_name);
Peter Qiu7e8b8ee2014-11-25 13:55:57 -080081 return true;
82}
83
84bool DeviceClaimer::DevicesClaimed() {
85 return !claimed_device_names_.empty();
86}
87
Paul Stewarta794cd62015-06-16 13:13:10 -070088bool DeviceClaimer::IsDeviceReleased(const string& device_name) {
Peter Qiu1d499ed2015-01-30 16:01:27 -080089 return released_device_names_.find(device_name) !=
90 released_device_names_.end();
91}
92
Peter Qiu7e8b8ee2014-11-25 13:55:57 -080093} // namespace shill