// Copyright (c) 2011 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.

#ifndef CROS_DISKS_UDEV_DEVICE_H_
#define CROS_DISKS_UDEV_DEVICE_H_

#include <blkid/blkid.h>
#include <stdint.h>

#include <memory>
#include <string>
#include <vector>

#include <base/callback.h>
#include <base/macros.h>
#include <chromeos/dbus/service_constants.h>
#include <gtest/gtest_prod.h>

#include "cros-disks/disk.h"

namespace brillo {
class UdevDevice;
}  // namespace brillo

namespace cros_disks {

// A utility class that helps query information about a udev device.
class UdevDevice {
 public:
  explicit UdevDevice(std::unique_ptr<brillo::UdevDevice> dev);
  ~UdevDevice();

  // Gets the string value of a device attribute.
  std::string GetAttribute(const char* key) const;

  // Checks if the value of a device attribute represents a Boolean true.
  bool IsAttributeTrue(const char* key) const;

  // Checks if a device attribute exists.
  bool HasAttribute(const char* key) const;

  // Gets the string value of a device property.
  std::string GetProperty(const char* key) const;

  // Checks if the value of a device property represents a Boolean true.
  bool IsPropertyTrue(const char* key) const;

  // Checks if a device property exists.
  bool HasProperty(const char* key) const;

  // Gets the string value of a device property from blkid.
  std::string GetPropertyFromBlkId(const char* key);

  // Gets the total and remaining capacity of the device.
  void GetSizeInfo(uint64_t* total_size, uint64_t* remaining_size) const;

  // Gets the number of partitions on the device.
  size_t GetPartitionCount() const;

  // Gets the device media type used on the device.
  DeviceMediaType GetDeviceMediaType() const;

  // Gets the USB vendor and product ID of the device. Returns true if the
  // IDs are found.
  bool GetVendorAndProductId(std::string* vendor_id,
                             std::string* product_id) const;

  // Gets the bus and device numbers for the device.
  void GetBusAndDeviceNumber(int* bus_number, int* device_number) const;

  // Checks if a device should be auto-mounted. Currently, all external
  // disk devices, which are neither on the boot device nor virtual,
  // are considered auto-mountable.
  bool IsAutoMountable() const;

  // Checks if a device should be hidden from the file browser.
  bool IsHidden();

  // Checks if the device is completely ignored by cros-disks. Unlike
  // IsAutoMountable() or IsHidden(), IsIgnored() prevents a device from being
  // reported by cros-disks during device enumeration and udev events, such that
  // the system does not even gather properties of the device. Currently, all
  // virtual devices, except loop devices, are ignored. Loop devices are used
  // by automated tests to simulate removable devices and thus not ignored.
  bool IsIgnored() const;

  // Checks if any media is available in the device.
  bool IsMediaAvailable() const;

  // Checks if the device is a mobile broadband device.
  bool IsMobileBroadbandDevice() const;

  // Checks if the device is on the boot device.
  bool IsOnBootDevice() const;

  // Checks if the device is on the removable device.
  bool IsOnRemovableDevice() const;

  // Checks if the device is a virtual device.
  bool IsVirtual() const;

  // Checks if the device is a loop device.
  bool IsLoopDevice() const;

  // Gets the native sysfs path of the device.
  std::string NativePath() const;

  // Gets the path of the storage device this device is a part of, if any.
  std::string StorageDevicePath() const;

  // Gets the mount paths for the device.
  std::vector<std::string> GetMountPaths() const;

  // Gets the mount paths for a given device path.
  static std::vector<std::string> GetMountPaths(const std::string& device_path);

  // Returns a Disk object based on the device information.
  Disk ToDisk();

 private:
  using EnumerateCallback =
      base::RepeatingCallback<bool(const brillo::UdevDevice& device)>;

  // Returns |str| if |str| is a valid UTF8 string (determined by
  // base::IsStringUTF8) or an empty string otherwise.
  static std::string EnsureUTF8String(const std::string& str);

  // Checks if the device is on a SD card device.
  bool IsOnSdDevice() const;

  // Walks up the device parents, starting at the current device, invoking
  // |callback| until |callback| returns true. Returns true if |callback|
  // returned true, and false if finished walking up the device tree.
  bool EnumerateParentDevices(EnumerateCallback callback) const;

  // Checks if a string contains a "1" (as Boolean true).
  static bool IsValueBooleanTrue(const char* value);

  const std::unique_ptr<brillo::UdevDevice> dev_;
  blkid_cache blkid_cache_;

  FRIEND_TEST(UdevDeviceTest, EnsureUTF8String);
  FRIEND_TEST(UdevDeviceTest, IsValueBooleanTrue);

  DISALLOW_COPY_AND_ASSIGN(UdevDevice);
};

}  // namespace cros_disks

#endif  // CROS_DISKS_UDEV_DEVICE_H_
