| Index: device/hid/hid_connection_linux.h
|
| diff --git a/device/hid/hid_connection_linux.h b/device/hid/hid_connection_linux.h
|
| index 4850d6a04edd06838928f369b7c59f6f3cba0a9c..d6befe44e3b20e4ffd83952d44d5447e6eaf9b78 100644
|
| --- a/device/hid/hid_connection_linux.h
|
| +++ b/device/hid/hid_connection_linux.h
|
| @@ -8,18 +8,30 @@
|
| #include <queue>
|
|
|
| #include "base/files/file.h"
|
| -#include "base/message_loop/message_pump_libevent.h"
|
| +#include "base/memory/weak_ptr.h"
|
| #include "device/hid/hid_connection.h"
|
|
|
| +namespace base {
|
| +class SingleThreadTaskRunner;
|
| +}
|
| +
|
| namespace device {
|
|
|
| -class HidConnectionLinux : public HidConnection,
|
| - public base::MessagePumpLibevent::Watcher {
|
| +class HidConnectionLinux : public HidConnection {
|
| public:
|
| - HidConnectionLinux(HidDeviceInfo device_info, std::string dev_node);
|
| + HidConnectionLinux(
|
| + HidDeviceInfo device_info,
|
| + base::File device_file,
|
| + scoped_refptr<base::SingleThreadTaskRunner> file_thread_runner);
|
|
|
| private:
|
| + class Helper;
|
| + friend class Helper;
|
| friend class base::RefCountedThreadSafe<HidConnectionLinux>;
|
| +
|
| + typedef base::Callback<void(ssize_t)> InternalWriteCallback;
|
| + typedef base::Callback<void(int)> IoctlCallback;
|
| +
|
| ~HidConnectionLinux() override;
|
|
|
| // HidConnection implementation.
|
| @@ -34,22 +46,52 @@ class HidConnectionLinux : public HidConnection,
|
| size_t size,
|
| const WriteCallback& callback) override;
|
|
|
| - // base::MessagePumpLibevent::Watcher implementation.
|
| - void OnFileCanReadWithoutBlocking(int fd) override;
|
| - void OnFileCanWriteWithoutBlocking(int fd) override;
|
| + // Callbacks for blocking operations run on the FILE thread.
|
| + void FinishWrite(size_t expected_size,
|
| + const WriteCallback& callback,
|
| + ssize_t result);
|
| + void FinishGetFeatureReport(uint8_t report_id,
|
| + scoped_refptr<net::IOBuffer> buffer,
|
| + const ReadCallback& callback,
|
| + int result);
|
| + void FinishSendFeatureReport(const WriteCallback& callback, int result);
|
| +
|
| + // Starts the FileDescriptorWatcher that reads input events from the device.
|
| + // Must be called on a thread that has a base::MessageLoopForIO.
|
| + void StartHelper(base::WeakPtr<HidConnectionLinux> weak_ptr);
|
|
|
| - void Disconnect();
|
| + // Writes to the device. This operation may block.
|
| + static void BlockingWrite(
|
| + base::PlatformFile platform_file,
|
| + scoped_refptr<net::IOBuffer> buffer,
|
| + size_t size,
|
| + const InternalWriteCallback& callback,
|
| + scoped_refptr<base::SingleThreadTaskRunner> task_runner);
|
| + // Performs an ioctl on the device. This operation may block.
|
| + static void BlockingIoctl(
|
| + base::PlatformFile platform_file,
|
| + int request,
|
| + scoped_refptr<net::IOBuffer> buffer,
|
| + const IoctlCallback& callback,
|
| + scoped_refptr<base::SingleThreadTaskRunner> task_runner);
|
| +
|
| + // Closes the device file descriptor. Must be called on the FILE thread.
|
| + static void CloseDevice(base::File device_file);
|
|
|
| - void Flush();
|
| void ProcessInputReport(scoped_refptr<net::IOBuffer> buffer, size_t size);
|
| void ProcessReadQueue();
|
|
|
| base::File device_file_;
|
| - base::MessagePumpLibevent::FileDescriptorWatcher device_file_watcher_;
|
| + scoped_ptr<Helper> helper_;
|
| +
|
| + scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
|
| + scoped_refptr<base::SingleThreadTaskRunner> file_task_runner_;
|
|
|
| std::queue<PendingHidReport> pending_reports_;
|
| std::queue<PendingHidRead> pending_reads_;
|
|
|
| + base::WeakPtrFactory<HidConnectionLinux> weak_factory_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(HidConnectionLinux);
|
| };
|
|
|
|
|