Peter Qiu | 7e8b8ee | 2014-11-25 13:55:57 -0800 | [diff] [blame] | 1 | // 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 | |
| 9 | using std::string; |
| 10 | |
| 11 | namespace shill { |
| 12 | |
| 13 | DeviceClaimer::DeviceClaimer( |
Paul Stewart | a794cd6 | 2015-06-16 13:13:10 -0700 | [diff] [blame] | 14 | const std::string& dbus_service_name, |
| 15 | DeviceInfo* device_info, |
Peter Qiu | 1d499ed | 2015-01-30 16:01:27 -0800 | [diff] [blame] | 16 | bool default_claimer) |
Peter Qiu | 7e8b8ee | 2014-11-25 13:55:57 -0800 | [diff] [blame] | 17 | : dbus_service_name_(dbus_service_name), |
Peter Qiu | 1d499ed | 2015-01-30 16:01:27 -0800 | [diff] [blame] | 18 | device_info_(device_info), |
| 19 | default_claimer_(default_claimer) {} |
Peter Qiu | 7e8b8ee | 2014-11-25 13:55:57 -0800 | [diff] [blame] | 20 | |
| 21 | DeviceClaimer::~DeviceClaimer() { |
| 22 | // Release claimed devices if there is any. |
| 23 | if (DevicesClaimed()) { |
Paul Stewart | a794cd6 | 2015-06-16 13:13:10 -0700 | [diff] [blame] | 24 | for (const auto& device : claimed_device_names_) { |
Peter Qiu | 7e8b8ee | 2014-11-25 13:55:57 -0800 | [diff] [blame] | 25 | 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 | |
| 34 | bool DeviceClaimer::StartDBusNameWatcher( |
Paul Stewart | a794cd6 | 2015-06-16 13:13:10 -0700 | [diff] [blame] | 35 | DBusManager* dbus_manager, |
| 36 | const DBusNameWatcher::NameAppearedCallback& name_appeared_callback, |
| 37 | const DBusNameWatcher::NameVanishedCallback& name_vanished_callback) { |
Peter Qiu | 7e8b8ee | 2014-11-25 13:55:57 -0800 | [diff] [blame] | 38 | 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 Stewart | a794cd6 | 2015-06-16 13:13:10 -0700 | [diff] [blame] | 49 | bool DeviceClaimer::Claim(const string& device_name, Error* error) { |
Peter Qiu | 7e8b8ee | 2014-11-25 13:55:57 -0800 | [diff] [blame] | 50 | // Check if device is claimed already. |
| 51 | if (claimed_device_names_.find(device_name) != claimed_device_names_.end()) { |
Paul Stewart | 34f424e | 2015-01-16 15:30:20 -0800 | [diff] [blame] | 52 | Error::PopulateAndLog(FROM_HERE, error, Error::kInvalidArguments, |
Peter Qiu | 7e8b8ee | 2014-11-25 13:55:57 -0800 | [diff] [blame] | 53 | "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 Qiu | 1d499ed | 2015-01-30 16:01:27 -0800 | [diff] [blame] | 62 | released_device_names_.erase(device_name); |
Peter Qiu | 7e8b8ee | 2014-11-25 13:55:57 -0800 | [diff] [blame] | 63 | return true; |
| 64 | } |
| 65 | |
Paul Stewart | a794cd6 | 2015-06-16 13:13:10 -0700 | [diff] [blame] | 66 | bool DeviceClaimer::Release(const std::string& device_name, |
| 67 | Error* error) { |
Peter Qiu | 7e8b8ee | 2014-11-25 13:55:57 -0800 | [diff] [blame] | 68 | // Make sure this is a device that have been claimed. |
| 69 | if (claimed_device_names_.find(device_name) == claimed_device_names_.end()) { |
Paul Stewart | 34f424e | 2015-01-16 15:30:20 -0800 | [diff] [blame] | 70 | Error::PopulateAndLog(FROM_HERE, error, Error::kInvalidArguments, |
Peter Qiu | 7e8b8ee | 2014-11-25 13:55:57 -0800 | [diff] [blame] | 71 | "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 Qiu | 7e8b8ee | 2014-11-25 13:55:57 -0800 | [diff] [blame] | 79 | claimed_device_names_.erase(device_name); |
Peter Qiu | 1d499ed | 2015-01-30 16:01:27 -0800 | [diff] [blame] | 80 | released_device_names_.insert(device_name); |
Peter Qiu | 7e8b8ee | 2014-11-25 13:55:57 -0800 | [diff] [blame] | 81 | return true; |
| 82 | } |
| 83 | |
| 84 | bool DeviceClaimer::DevicesClaimed() { |
| 85 | return !claimed_device_names_.empty(); |
| 86 | } |
| 87 | |
Paul Stewart | a794cd6 | 2015-06-16 13:13:10 -0700 | [diff] [blame] | 88 | bool DeviceClaimer::IsDeviceReleased(const string& device_name) { |
Peter Qiu | 1d499ed | 2015-01-30 16:01:27 -0800 | [diff] [blame] | 89 | return released_device_names_.find(device_name) != |
| 90 | released_device_names_.end(); |
| 91 | } |
| 92 | |
Peter Qiu | 7e8b8ee | 2014-11-25 13:55:57 -0800 | [diff] [blame] | 93 | } // namespace shill |