| // Copyright 2017 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_UDEV_LINUX_UDEV_WATCHER_H_ |
| #define DEVICE_UDEV_LINUX_UDEV_WATCHER_H_ |
| |
| #include <memory> |
| |
| #include "base/files/file_descriptor_watcher_posix.h" |
| #include "base/macros.h" |
| #include "base/sequence_checker.h" |
| #include "device/udev_linux/scoped_udev.h" |
| |
| namespace device { |
| |
| // This class wraps an instance of udev_monitor, watching for devices that are |
| // added and removed from the system. This class has sequence affinity. |
| class UdevWatcher { |
| public: |
| class Observer { |
| public: |
| virtual ~Observer(); |
| virtual void OnDeviceAdded(ScopedUdevDevicePtr device); |
| virtual void OnDeviceRemoved(ScopedUdevDevicePtr device); |
| }; |
| |
| static std::unique_ptr<UdevWatcher> StartWatching(Observer* observer); |
| |
| ~UdevWatcher(); |
| |
| // Synchronously enumerates the all devices known to udev, calling |
| // OnDeviceAdded on the provided Observer for each. |
| void EnumerateExistingDevices(); |
| |
| private: |
| UdevWatcher(ScopedUdevPtr udev, |
| ScopedUdevMonitorPtr udev_monitor, |
| int monitor_fd, |
| Observer* observer); |
| |
| void OnMonitorReadable(); |
| |
| ScopedUdevPtr udev_; |
| ScopedUdevMonitorPtr udev_monitor_; |
| Observer* observer_; |
| std::unique_ptr<base::FileDescriptorWatcher::Controller> file_watcher_; |
| base::SequenceChecker sequence_checker_; |
| |
| DISALLOW_COPY_AND_ASSIGN(UdevWatcher); |
| }; |
| |
| } // namespace device |
| |
| #endif // DEVICE_UDEV_LINUX_UDEV_WATCHER_H_ |