15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright (c) 2014 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifndef DEVICE_HID_HID_CONNECTION_LINUX_H_ 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define DEVICE_HID_HID_CONNECTION_LINUX_H_ 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include <queue> 9a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/files/file.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/ref_counted.h" 12a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/message_loop/message_pump_libevent.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "device/hid/hid_connection.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "device/hid/hid_device_info.h" 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace device { 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class HidConnectionLinux : public HidConnection, 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public base::MessagePumpLibevent::Watcher { 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu HidConnectionLinux(HidDeviceInfo device_info, std::string dev_node); 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void Read(scoped_refptr<net::IOBufferWithSize> buffer, 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const IOCallback& callback) OVERRIDE; 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void Write(uint8_t report_id, 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_refptr<net::IOBufferWithSize> buffer, 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const IOCallback& callback) OVERRIDE; 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void GetFeatureReport(uint8_t report_id, 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_refptr<net::IOBufferWithSize> buffer, 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const IOCallback& callback) OVERRIDE; 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void SendFeatureReport(uint8_t report_id, 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_refptr<net::IOBufferWithSize> buffer, 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const IOCallback& callback) OVERRIDE; 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Implements base::MessagePumpLibevent::Watcher 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnFileCanReadWithoutBlocking(int fd) OVERRIDE; 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnFileCanWriteWithoutBlocking(int fd) OVERRIDE; 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) friend class base::RefCountedThreadSafe<HidConnectionLinux>; 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~HidConnectionLinux(); 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void ProcessReadQueue(); 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void Disconnect(); 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::File device_file_; 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::MessagePumpLibevent::FileDescriptorWatcher device_file_watcher_; 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::queue<PendingHidReport> pending_reports_; 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::queue<PendingHidRead> pending_reads_; 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::ThreadChecker thread_checker_; 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(HidConnectionLinux); 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace device 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#endif // DEVICE_HID_HID_CONNECTION_LINUX_H_ 60