// Copyright (c) 2013 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 "mist/udev_device.h"

#include <libudev.h>

#include <base/logging.h>

namespace mist {

UdevDevice::UdevDevice() : device_(nullptr) {}

UdevDevice::UdevDevice(udev_device* device) : device_(device) {
  CHECK(device_);

  udev_device_ref(device_);
}

UdevDevice::~UdevDevice() {
  if (device_) {
    udev_device_unref(device_);
    device_ = nullptr;
  }
}

UdevDevice* UdevDevice::GetParent() const {
  // udev_device_get_parent does not increase the reference count of the
  // returned udev_device struct.
  udev_device* parent_device = udev_device_get_parent(device_);
  return parent_device ? new UdevDevice(parent_device) : nullptr;
}

UdevDevice* UdevDevice::GetParentWithSubsystemDeviceType(
    const char* subsystem,
    const char* device_type) const {
  // udev_device_get_parent_with_subsystem_devtype does not increase the
  // reference count of the returned udev_device struct.
  udev_device* parent_device = udev_device_get_parent_with_subsystem_devtype(
      device_, subsystem, device_type);
  return parent_device ? new UdevDevice(parent_device) : nullptr;
}

bool UdevDevice::IsInitialized() const {
  return udev_device_get_is_initialized(device_);
}

uint64_t UdevDevice::GetMicrosecondsSinceInitialized() const {
  return udev_device_get_usec_since_initialized(device_);
}

uint64_t UdevDevice::GetSequenceNumber() const {
  return udev_device_get_seqnum(device_);
}

const char* UdevDevice::GetDevicePath() const {
  return udev_device_get_devpath(device_);
}

const char* UdevDevice::GetDeviceNode() const {
  return udev_device_get_devnode(device_);
}

dev_t UdevDevice::GetDeviceNumber() const {
  return udev_device_get_devnum(device_);
}

const char* UdevDevice::GetDeviceType() const {
  return udev_device_get_devtype(device_);
}

const char* UdevDevice::GetDriver() const {
  return udev_device_get_driver(device_);
}

const char* UdevDevice::GetSubsystem() const {
  return udev_device_get_subsystem(device_);
}

const char* UdevDevice::GetSysPath() const {
  return udev_device_get_syspath(device_);
}

const char* UdevDevice::GetSysName() const {
  return udev_device_get_sysname(device_);
}

const char* UdevDevice::GetSysNumber() const {
  return udev_device_get_sysnum(device_);
}

const char* UdevDevice::GetAction() const {
  return udev_device_get_action(device_);
}

UdevListEntry* UdevDevice::GetDeviceLinksListEntry() const {
  udev_list_entry* list_entry = udev_device_get_devlinks_list_entry(device_);
  return list_entry ? new UdevListEntry(list_entry) : nullptr;
}

UdevListEntry* UdevDevice::GetPropertiesListEntry() const {
  udev_list_entry* list_entry = udev_device_get_properties_list_entry(device_);
  return list_entry ? new UdevListEntry(list_entry) : nullptr;
}

const char* UdevDevice::GetPropertyValue(const char* key) const {
  return udev_device_get_property_value(device_, key);
}

UdevListEntry* UdevDevice::GetTagsListEntry() const {
  udev_list_entry* list_entry = udev_device_get_tags_list_entry(device_);
  return list_entry ? new UdevListEntry(list_entry) : nullptr;
}

UdevListEntry* UdevDevice::GetSysAttributeListEntry() const {
  udev_list_entry* list_entry = udev_device_get_sysattr_list_entry(device_);
  return list_entry ? new UdevListEntry(list_entry) : nullptr;
}

const char* UdevDevice::GetSysAttributeValue(const char* attribute) const {
  return udev_device_get_sysattr_value(device_, attribute);
}

}  // namespace mist
