// 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.

#ifndef MIST_UDEV_ENUMERATE_H_
#define MIST_UDEV_ENUMERATE_H_

#include <base/macros.h>

#include "mist/udev_list_entry.h"

struct udev_enumerate;

namespace mist {

class UdevDevice;

// A udev enumerate class, which wraps a udev_enumerate C struct from libudev
// and related library functions into a C++ object.
class UdevEnumerate {
 public:
  // Constructs a UdevEnumerate object by taking a raw pointer to a
  // udev_enumerate struct as |enumerate|. The ownership of |enumerate| is not
  // transferred, but its reference count is increased by one during the
  // lifetime of this object.
  explicit UdevEnumerate(udev_enumerate* enumerate);

  // Destructs this UdevEnumerate object and decreases the reference count of
  // the underlying udev_enumerate struct by one.
  virtual ~UdevEnumerate();

  // Wraps udev_enumerate_add_match_subsystem(). Returns true on success.
  virtual bool AddMatchSubsystem(const char* subsystem);

  // Wraps udev_enumerate_add_nomatch_subsystem(). Returns true on success.
  virtual bool AddNoMatchSubsystem(const char* subsystem);

  // Wraps udev_enumerate_add_match_sysattr(). Returns true on success.
  virtual bool AddMatchSysAttribute(const char* attribute, const char* value);

  // Wraps udev_enumerate_add_nomatch_sysattr(). Returns true on success.
  virtual bool AddNoMatchSysAttribute(const char* attribute, const char* value);

  // Wraps udev_enumerate_add_match_property(). Returns true on success.
  virtual bool AddMatchProperty(const char* property, const char* value);

  // Wraps udev_enumerate_add_match_sysname(). Returns true on success.
  virtual bool AddMatchSysName(const char* sys_name);

  // Wraps udev_enumerate_add_match_tag(). Returns true on success.
  virtual bool AddMatchTag(const char* tag);

  // Wraps udev_enumerate_add_match_is_initialized(). Returns true on success.
  virtual bool AddMatchIsInitialized();

  // Wraps udev_enumerate_add_syspath(). Returns true on success.
  virtual bool AddSysPath(const char* sys_path);

  // Wraps udev_enumerate_scan_devices(). Returns true on success.
  virtual bool ScanDevices();

  // Wraps udev_enumerate_scan_subsystems(). Returns true on success.
  virtual bool ScanSubsystems();

  // Wraps udev_enumerate_get_list_entry(). The returned UdevListEntry
  // object is not managed and should be deleted by the caller after use.
  virtual UdevListEntry* GetListEntry() const;

 private:
  // Allows MockUdevEnumerate to invoke the private default constructor below.
  friend class MockUdevEnumerate;

  // Constructs a UdevEnumerate object without referencing a udev_enumerate
  // struct, which is only allowed to be called by MockUdevEnumerate.
  UdevEnumerate();

  udev_enumerate* enumerate_;

  DISALLOW_COPY_AND_ASSIGN(UdevEnumerate);
};

}  // namespace mist

#endif  // MIST_UDEV_ENUMERATE_H_
