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); |
}; |