1 // Copyright 2014 The Chromium Authors. All rights reserved.
\r
2 // Use of this source code is governed by a BSD-style license that can be
\r
3 // found in the LICENSE file.
\r
5 #ifndef CONTENT_BROWSER_GAMEPAD_RAW_INPUT_DATA_FETCHER_WIN_H_
\r
6 #define CONTENT_BROWSER_GAMEPAD_RAW_INPUT_DATA_FETCHER_WIN_H_
\r
8 #include "build/build_config.h"
\r
13 #include <windows.h>
\r
19 #include "base/memory/scoped_ptr.h"
\r
20 #include "base/memory/weak_ptr.h"
\r
21 #include "base/message_loop/message_loop.h"
\r
22 #include "base/scoped_native_library.h"
\r
23 #include "base/win/message_window.h"
\r
24 #include "content/browser/gamepad/gamepad_data_fetcher.h"
\r
25 #include "content/browser/gamepad/gamepad_standard_mappings.h"
\r
26 #include "third_party/WebKit/public/platform/WebGamepads.h"
\r
30 struct RawGamepadAxis {
\r
31 HIDP_VALUE_CAPS caps;
\r
35 struct RawGamepadInfo {
\r
37 scoped_ptr<uint8[]> ppd_buffer;
\r
38 PHIDP_PREPARSED_DATA preparsed_data;
\r
42 uint32_t product_id;
\r
44 wchar_t id[blink::WebGamepad::idLengthCap];
\r
46 uint32_t button_caps_length;
\r
47 scoped_ptr<HIDP_BUTTON_CAPS[]> button_caps;
\r
49 uint32_t buttons_length;
\r
50 bool buttons[blink::WebGamepad::buttonsLengthCap];
\r
52 uint32_t axes_length;
\r
53 RawGamepadAxis axes[blink::WebGamepad::axesLengthCap];
\r
56 class RawInputDataFetcher
\r
57 : public base::SupportsWeakPtr<RawInputDataFetcher>,
\r
58 public base::MessageLoop::DestructionObserver {
\r
60 explicit RawInputDataFetcher();
\r
61 ~RawInputDataFetcher();
\r
63 // DestructionObserver overrides.
\r
64 virtual void WillDestroyCurrentMessageLoop() OVERRIDE;
\r
66 bool Available() { return rawinput_available_; }
\r
67 void StartMonitor();
\r
70 std::vector<RawGamepadInfo*> EnumerateDevices();
\r
71 RawGamepadInfo* GetGamepadInfo(HANDLE handle);
\r
74 RawGamepadInfo* ParseGamepadInfo(HANDLE hDevice);
\r
75 void UpdateGamepad(RAWINPUT* input, RawGamepadInfo* gamepad_info);
\r
76 // Handles WM_INPUT messages.
\r
77 LRESULT OnInput(HRAWINPUT input_handle);
\r
78 // Handles messages received by |window_|.
\r
79 bool HandleMessage(UINT message,
\r
83 RAWINPUTDEVICE* GetRawInputDevices(DWORD flags);
\r
84 void ClearControllers();
\r
86 // Function types we use from hid.dll.
\r
87 typedef NTSTATUS (__stdcall *HidPGetCapsFunc)(
\r
88 PHIDP_PREPARSED_DATA PreparsedData, PHIDP_CAPS Capabilities);
\r
89 typedef NTSTATUS (__stdcall *HidPGetButtonCapsFunc)(
\r
90 HIDP_REPORT_TYPE ReportType, PHIDP_BUTTON_CAPS ButtonCaps,
\r
91 PUSHORT ButtonCapsLength, PHIDP_PREPARSED_DATA PreparsedData);
\r
92 typedef NTSTATUS (__stdcall *HidPGetValueCapsFunc)(
\r
93 HIDP_REPORT_TYPE ReportType, PHIDP_VALUE_CAPS ValueCaps,
\r
94 PUSHORT ValueCapsLength, PHIDP_PREPARSED_DATA PreparsedData);
\r
95 typedef NTSTATUS (__stdcall *HidPGetUsagesFunc)(
\r
96 HIDP_REPORT_TYPE ReportType, USAGE UsagePage, USHORT LinkCollection,
\r
97 PUSAGE UsageList, PULONG UsageLength, PHIDP_PREPARSED_DATA PreparsedData,
\r
98 PCHAR Report, ULONG ReportLength);
\r
99 typedef NTSTATUS (__stdcall *HidPGetUsageValueFunc)(
\r
100 HIDP_REPORT_TYPE ReportType, USAGE UsagePage, USHORT LinkCollection,
\r
101 USAGE Usage, PULONG UsageValue, PHIDP_PREPARSED_DATA PreparsedData,
\r
102 PCHAR Report, ULONG ReportLength);
\r
103 typedef NTSTATUS (__stdcall *HidPGetScaledUsageValueFunc)(
\r
104 HIDP_REPORT_TYPE ReportType, USAGE UsagePage, USHORT LinkCollection,
\r
105 USAGE Usage, PLONG UsageValue, PHIDP_PREPARSED_DATA PreparsedData,
\r
106 PCHAR Report, ULONG ReportLength);
\r
107 typedef BOOLEAN (__stdcall *HidDGetStringFunc)(
\r
108 HANDLE HidDeviceObject, PVOID Buffer, ULONG BufferLength);
\r
110 // Get functions from dynamically loaded hid.dll. Returns true if loading was
\r
112 bool GetHidDllFunctions();
\r
114 base::ScopedNativeLibrary hid_dll_;
\r
115 scoped_ptr<base::win::MessageWindow> window_;
\r
116 bool rawinput_available_;
\r
117 bool filter_xinput_;
\r
118 bool events_monitored_;
\r
120 std::map<HANDLE, RawGamepadInfo*> controllers_;
\r
122 // Function pointers to HID functionality, retrieved in
\r
123 // |GetHidDllFunctions|.
\r
124 HidPGetCapsFunc hidp_get_caps_;
\r
125 HidPGetButtonCapsFunc hidp_get_button_caps_;
\r
126 HidPGetValueCapsFunc hidp_get_value_caps_;
\r
127 HidPGetUsagesFunc hidp_get_usages_;
\r
128 HidPGetUsageValueFunc hidp_get_usage_value_;
\r
129 HidPGetScaledUsageValueFunc hidp_get_scaled_usage_value_;
\r
130 HidDGetStringFunc hidd_get_product_string_;
\r
132 DISALLOW_COPY_AND_ASSIGN(RawInputDataFetcher);
\r
135 } // namespace content
\r
137 #endif // CONTENT_BROWSER_GAMEPAD_RAW_INPUT_DATA_FETCHER_WIN_H_
\r