blob: a7aeafc08c6cfcb8e1bd2c5acf20b2f2dbe2eaa4 [file] [log] [blame]
// 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 <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(const UdevDevice&) = delete;
UdevDevice& operator=(const UdevDevice&) = delete;
~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);
};
} // namespace cros_disks
#endif // CROS_DISKS_UDEV_DEVICE_H_