blob: 319cefed861d8bc11a2f1a6f9ece28a851ce5abf [file] [log] [blame]
// Copyright 2014 The Chromium 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 DEVICE_BASE_DEVICE_MONITOR_LINUX_H_
#define DEVICE_BASE_DEVICE_MONITOR_LINUX_H_
#include <memory>
#include "base/compiler_specific.h"
#include "base/files/file_descriptor_watcher_posix.h"
#include "base/macros.h"
#include "base/observer_list.h"
#include "base/threading/thread_checker.h"
#include "device/base/device_base_export.h"
#include "device/udev_linux/scoped_udev.h"
struct udev_device;
namespace device {
// This class listends for notifications from libudev about
// connected/disconnected devices. This class is *NOT* thread-safe.
class DEVICE_BASE_EXPORT DeviceMonitorLinux {
public:
typedef base::Callback<void(udev_device* device)> EnumerateCallback;
class Observer {
public:
virtual ~Observer() {}
virtual void OnDeviceAdded(udev_device* device) = 0;
virtual void OnDeviceRemoved(udev_device* device) = 0;
};
DeviceMonitorLinux();
static DeviceMonitorLinux* GetInstance();
void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer);
void Enumerate(const EnumerateCallback& callback);
private:
friend std::default_delete<DeviceMonitorLinux>;
~DeviceMonitorLinux();
void OnMonitorCanReadWithoutBlocking();
ScopedUdevPtr udev_;
ScopedUdevMonitorPtr monitor_;
int monitor_fd_;
std::unique_ptr<base::FileDescriptorWatcher::Controller>
monitor_watch_controller_;
base::ObserverList<Observer, true>::Unchecked observers_;
base::ThreadChecker thread_checker_;
DISALLOW_COPY_AND_ASSIGN(DeviceMonitorLinux);
};
} // namespace device
#endif // DEVICE_BASE_DEVICE_MONITOR_LINUX_H_