blob: 7282760ecb128ada613c20a8757e17429de44397 [file] [log] [blame]
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +00001// Copyright (c) 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef DEVICE_HID_HID_CONNECTION_MAC_H_
6#define DEVICE_HID_HID_CONNECTION_MAC_H_
7
Torne (Richard Coles)a1401312014-03-18 10:20:56 +00008#include <CoreFoundation/CoreFoundation.h>
9#include <IOKit/hid/IOHIDManager.h>
10
11#include <queue>
12
13#include "base/mac/foundation_util.h"
Torne (Richard Coles)a1401312014-03-18 10:20:56 +000014#include "base/memory/scoped_ptr.h"
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +000015#include "device/hid/hid_connection.h"
Torne (Richard Coles)a1401312014-03-18 10:20:56 +000016
17namespace base {
18class MessageLoopProxy;
19}
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +000020
21namespace net {
22class IOBuffer;
23}
24
25namespace device {
26
27class HidConnectionMac : public HidConnection {
28 public:
Torne (Richard Coles)a1401312014-03-18 10:20:56 +000029 explicit HidConnectionMac(HidDeviceInfo device_info);
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +000030
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +000031 private:
32 virtual ~HidConnectionMac();
33
Primiano Tucci1320f922014-09-30 14:45:55 +010034 // HidConnection implementation.
35 virtual void PlatformRead(const ReadCallback& callback) OVERRIDE;
36 virtual void PlatformWrite(scoped_refptr<net::IOBuffer> buffer,
37 size_t size,
38 const WriteCallback& callback) OVERRIDE;
39 virtual void PlatformGetFeatureReport(uint8_t report_id,
40 const ReadCallback& callback) OVERRIDE;
41 virtual void PlatformSendFeatureReport(
42 scoped_refptr<net::IOBuffer> buffer,
43 size_t size,
44 const WriteCallback& callback) OVERRIDE;
45
Torne (Richard Coles)a1401312014-03-18 10:20:56 +000046 static void InputReportCallback(void* context,
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +000047 IOReturn result,
Torne (Richard Coles)a1401312014-03-18 10:20:56 +000048 void* sender,
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +000049 IOHIDReportType type,
Torne (Richard Coles)a1401312014-03-18 10:20:56 +000050 uint32_t report_id,
51 uint8_t* report_bytes,
52 CFIndex report_length);
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +000053
54 void WriteReport(IOHIDReportType type,
Primiano Tucci1320f922014-09-30 14:45:55 +010055 scoped_refptr<net::IOBuffer> buffer,
56 size_t size,
57 const WriteCallback& callback);
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +000058
Ben Murdoch116680a2014-07-20 18:25:52 -070059 void Flush();
60 void ProcessInputReport(scoped_refptr<net::IOBufferWithSize> buffer);
61 void ProcessReadQueue();
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +000062
Torne (Richard Coles)a1401312014-03-18 10:20:56 +000063 base::ScopedCFTypeRef<IOHIDDeviceRef> device_;
Ben Murdoch116680a2014-07-20 18:25:52 -070064 scoped_refptr<base::MessageLoopProxy> message_loop_;
Primiano Tucci1320f922014-09-30 14:45:55 +010065 std::vector<uint8_t> inbound_buffer_;
Torne (Richard Coles)a1401312014-03-18 10:20:56 +000066
67 std::queue<PendingHidReport> pending_reports_;
68 std::queue<PendingHidRead> pending_reads_;
69
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +000070 DISALLOW_COPY_AND_ASSIGN(HidConnectionMac);
71};
72
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +000073} // namespace device
74
75#endif // DEVICE_HID_HID_CONNECTION_MAC_H_