Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / content / browser / gamepad / raw_input_data_fetcher_win.h
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
4 \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
7 \r
8 #include "build/build_config.h"\r
9 \r
10 #include <stdlib.h>\r
11 #include <Unknwn.h>\r
12 #include <WinDef.h>\r
13 #include <windows.h>\r
14 \r
15 #include <hidsdi.h>\r
16 #include <map>\r
17 #include <vector>\r
18 \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
27 \r
28 namespace content {\r
29 \r
30 struct RawGamepadAxis {\r
31   HIDP_VALUE_CAPS caps;\r
32   float value;\r
33 };\r
34 \r
35 struct RawGamepadInfo {\r
36   HANDLE handle;\r
37   scoped_ptr<uint8[]> ppd_buffer;\r
38   PHIDP_PREPARSED_DATA preparsed_data;\r
39 \r
40   uint32_t report_id;\r
41   uint32_t vendor_id;\r
42   uint32_t product_id;\r
43 \r
44   wchar_t id[blink::WebGamepad::idLengthCap];\r
45 \r
46   uint32_t button_caps_length;\r
47   scoped_ptr<HIDP_BUTTON_CAPS[]> button_caps;\r
48 \r
49   uint32_t buttons_length;\r
50   bool buttons[blink::WebGamepad::buttonsLengthCap];\r
51 \r
52   uint32_t axes_length;\r
53   RawGamepadAxis axes[blink::WebGamepad::axesLengthCap];\r
54 };\r
55 \r
56 class RawInputDataFetcher\r
57     : public base::SupportsWeakPtr<RawInputDataFetcher>,\r
58       public base::MessageLoop::DestructionObserver {\r
59  public:\r
60   explicit RawInputDataFetcher();\r
61   ~RawInputDataFetcher();\r
62 \r
63   // DestructionObserver overrides.\r
64   virtual void WillDestroyCurrentMessageLoop() OVERRIDE;\r
65 \r
66   bool Available() { return rawinput_available_; }\r
67   void StartMonitor();\r
68   void StopMonitor();\r
69 \r
70   std::vector<RawGamepadInfo*> EnumerateDevices();\r
71   RawGamepadInfo* GetGamepadInfo(HANDLE handle);\r
72 \r
73  private:\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
80                      WPARAM wparam,\r
81                      LPARAM lparam,\r
82                      LRESULT* result);\r
83   RAWINPUTDEVICE* GetRawInputDevices(DWORD flags);\r
84   void ClearControllers();\r
85 \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
109 \r
110   // Get functions from dynamically loaded hid.dll. Returns true if loading was\r
111   // successful.\r
112   bool GetHidDllFunctions();\r
113 \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
119 \r
120   std::map<HANDLE, RawGamepadInfo*> controllers_;\r
121 \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
131 \r
132   DISALLOW_COPY_AND_ASSIGN(RawInputDataFetcher);\r
133 };\r
134 \r
135 }  // namespace content\r
136 \r
137 #endif  // CONTENT_BROWSER_GAMEPAD_RAW_INPUT_DATA_FETCHER_WIN_H_\r