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