// Copyright 2018 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "shill/device_claimer.h"

#include "shill/control_interface.h"
#include "shill/device_info.h"

using std::string;

namespace shill {

DeviceClaimer::DeviceClaimer(const std::string& service_name,
                             DeviceInfo* device_info,
                             bool default_claimer)
    : service_name_(service_name),
      device_info_(device_info),
      default_claimer_(default_claimer) {}

DeviceClaimer::~DeviceClaimer() {
  // Release claimed devices if there is any.
  if (DevicesClaimed()) {
    for (const auto& device : claimed_device_names_) {
      device_info_->AllowDevice(device);
    }
    // Clear claimed device list.
    claimed_device_names_.clear();
  }
}

bool DeviceClaimer::Claim(const string& device_name, Error* error) {
  // Check if device is claimed already.
  if (claimed_device_names_.find(device_name) != claimed_device_names_.end()) {
    Error::PopulateAndLog(
        FROM_HERE, error, Error::kInvalidArguments,
        "Device " + device_name + " had already been claimed");
    return false;
  }

  // Block the device.
  device_info_->BlockDevice(device_name);

  claimed_device_names_.insert(device_name);
  released_device_names_.erase(device_name);
  return true;
}

bool DeviceClaimer::Release(const std::string& device_name, Error* error) {
  // Make sure this is a device that have been claimed.
  if (claimed_device_names_.find(device_name) == claimed_device_names_.end()) {
    Error::PopulateAndLog(FROM_HERE, error, Error::kInvalidArguments,
                          "Device " + device_name + " have not been claimed");
    return false;
  }

  // Unblock the device.
  device_info_->AllowDevice(device_name);

  claimed_device_names_.erase(device_name);
  released_device_names_.insert(device_name);
  return true;
}

bool DeviceClaimer::DevicesClaimed() {
  return !claimed_device_names_.empty();
}

bool DeviceClaimer::IsDeviceReleased(const string& device_name) {
  return released_device_names_.find(device_name) !=
         released_device_names_.end();
}

}  // namespace shill
