blob: 2f219dc9e242f689d54f3c95022d499ac67d1eb3 [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_HID_DEVICE_MONITOR_LINUX_H_
#define DEVICE_HID_DEVICE_MONITOR_LINUX_H_
#include <string>
#include "base/compiler_specific.h"
#include "base/macros.h"
#include "base/memory/scoped_ptr.h"
#include "base/message_loop/message_loop.h"
#include "base/message_loop/message_pump_libevent.h"
#include "base/observer_list.h"
#include "base/threading/thread_checker.h"
#include "device/udev_linux/udev.h"
struct udev_device;
namespace device {
// This class listends for notifications from libudev about
// connected/disconnected devices. This class is *NOT* thread-safe and
// all methods must be accessed from the FILE thread.
class DeviceMonitorLinux : public base::MessageLoop::DestructionObserver,
public base::MessagePumpLibevent::Watcher {
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();
static bool HasInstance();
void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer);
ScopedUdevDevicePtr GetDeviceFromPath(const std::string& path);
void Enumerate(const EnumerateCallback& callback);
// Implements base::MessageLoop::DestructionObserver
virtual void WillDestroyCurrentMessageLoop() OVERRIDE;
// Implements base::MessagePumpLibevent::Watcher
virtual void OnFileCanReadWithoutBlocking(int fd) OVERRIDE;
virtual void OnFileCanWriteWithoutBlocking(int fd) OVERRIDE;
private:
friend struct base::DefaultDeleter<DeviceMonitorLinux>;
virtual ~DeviceMonitorLinux();
ScopedUdevPtr udev_;
ScopedUdevMonitorPtr monitor_;
int monitor_fd_;
base::MessagePumpLibevent::FileDescriptorWatcher monitor_watcher_;
ObserverList<Observer> observers_;
base::ThreadChecker thread_checker_;
DISALLOW_COPY_AND_ASSIGN(DeviceMonitorLinux);
};
} // namespace device
#endif // DEVICE_HID_DEVICE_MONITOR_LINUX_H_