blob: 94bb55c386fe174d2ae4d086a8cecc4942f059ee [file] [log] [blame]
[email protected]26958d12014-02-27 17:29:101// Copyright 2014 The Chromium Authors. All rights reserved.
[email protected]125724f2014-01-31 20:13:232// 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_SERVICE_WIN_H_
6#define DEVICE_HID_HID_SERVICE_WIN_H_
7
[email protected]5a2284cf2014-08-22 23:30:178#include <windows.h>
thakisacd68a22016-04-11 16:12:239
10// Must be after windows.h.
[email protected]5a2284cf2014-08-22 23:30:1711#include <hidclass.h>
12
13extern "C" {
14#include <hidsdi.h>
15#include <hidpi.h>
16}
17
avi176e2692015-12-22 19:26:5218#include "base/macros.h"
reillyg8c5a2c5f32015-02-19 00:53:0019#include "base/memory/weak_ptr.h"
reillygec1f1c72015-01-06 04:06:2620#include "base/scoped_observer.h"
reillyg08f9e072014-12-06 00:44:2321#include "base/win/scoped_handle.h"
reillygec1f1c72015-01-06 04:06:2622#include "device/core/device_monitor_win.h"
reillyg08f9e072014-12-06 00:44:2323#include "device/hid/hid_device_info.h"
24#include "device/hid/hid_service.h"
25
26namespace base {
27namespace win {
28class MessageWindow;
29}
30}
[email protected]5a2284cf2014-08-22 23:30:1731
[email protected]125724f2014-01-31 20:13:2332namespace device {
33
reillygec1f1c72015-01-06 04:06:2634class HidServiceWin : public HidService, public DeviceMonitorWin::Observer {
[email protected]125724f2014-01-31 20:13:2335 public:
reillyg8c5a2c5f32015-02-19 00:53:0036 HidServiceWin(scoped_refptr<base::SingleThreadTaskRunner> file_task_runner);
reillyg33338fc02015-08-28 23:41:0937 ~HidServiceWin() override;
[email protected]125724f2014-01-31 20:13:2338
nick771373232015-04-23 19:40:3039 void Connect(const HidDeviceId& device_id,
40 const ConnectCallback& callback) override;
[email protected]125724f2014-01-31 20:13:2341
42 private:
reillyg8c5a2c5f32015-02-19 00:53:0043 static void EnumerateOnFileThread(
44 base::WeakPtr<HidServiceWin> service,
45 scoped_refptr<base::SingleThreadTaskRunner> task_runner);
[email protected]5a2284cf2014-08-22 23:30:1746 static void CollectInfoFromButtonCaps(PHIDP_PREPARSED_DATA preparsed_data,
47 HIDP_REPORT_TYPE report_type,
48 USHORT button_caps_length,
49 HidCollectionInfo* collection_info);
50 static void CollectInfoFromValueCaps(PHIDP_PREPARSED_DATA preparsed_data,
51 HIDP_REPORT_TYPE report_type,
52 USHORT value_caps_length,
53 HidCollectionInfo* collection_info);
reillyg8c5a2c5f32015-02-19 00:53:0054 static void AddDeviceOnFileThread(
55 base::WeakPtr<HidServiceWin> service,
56 scoped_refptr<base::SingleThreadTaskRunner> task_runner,
57 const std::string& device_path);
reillygec1f1c72015-01-06 04:06:2658
59 // DeviceMonitorWin::Observer implementation:
reillyg8cbc3ce2015-04-03 07:39:4360 void OnDeviceAdded(const GUID& class_guid,
61 const std::string& device_path) override;
62 void OnDeviceRemoved(const GUID& class_guid,
63 const std::string& device_path) override;
[email protected]125724f2014-01-31 20:13:2364
reillyg08f9e072014-12-06 00:44:2365 // Tries to open the device read-write and falls back to read-only.
reillyg8c5a2c5f32015-02-19 00:53:0066 static base::win::ScopedHandle OpenDevice(const std::string& device_path);
reillyg08f9e072014-12-06 00:44:2367
reillyg7f4f5082014-10-16 19:19:1468 scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
reillyg8c5a2c5f32015-02-19 00:53:0069 scoped_refptr<base::SingleThreadTaskRunner> file_task_runner_;
reillygec1f1c72015-01-06 04:06:2670 ScopedObserver<DeviceMonitorWin, DeviceMonitorWin::Observer> device_observer_;
reillyg8c5a2c5f32015-02-19 00:53:0071 base::WeakPtrFactory<HidServiceWin> weak_factory_;
reillyg7f4f5082014-10-16 19:19:1472
[email protected]125724f2014-01-31 20:13:2373 DISALLOW_COPY_AND_ASSIGN(HidServiceWin);
74};
75
76} // namespace device
77
78#endif // DEVICE_HID_HID_SERVICE_WIN_H_