| Index: trunk/src/device/hid/hid_service_win.cc | 
| =================================================================== | 
| --- trunk/src/device/hid/hid_service_win.cc	(revision 247933) | 
| +++ trunk/src/device/hid/hid_service_win.cc	(working copy) | 
| @@ -1,240 +0,0 @@ | 
| -// Copyright 2014 The Chromium Authors. All rights reserved. | 
| -// Use of this source code is governed by a BSD-style license that can be | 
| -// found in the LICENSE file. | 
| - | 
| -#include "device/hid/hid_service_win.h" | 
| - | 
| -#include <cstdlib> | 
| -#include <string> | 
| - | 
| -#include "base/callback_helpers.h" | 
| -#include "base/lazy_instance.h" | 
| -#include "base/memory/scoped_ptr.h" | 
| -#include "base/stl_util.h" | 
| -#include "base/strings/sys_string_conversions.h" | 
| -#include "device/hid/hid_connection.h" | 
| -#include "device/hid/hid_connection_win.h" | 
| -#include "device/hid/hid_service.h" | 
| -#include "net/base/io_buffer.h" | 
| - | 
| -#if defined(OS_WIN) | 
| - | 
| -#define INITGUID | 
| - | 
| -#include <windows.h> | 
| -#include <hidclass.h> | 
| - | 
| -extern "C" { | 
| - | 
| -#include <hidsdi.h> | 
| -#include <hidpi.h> | 
| - | 
| -} | 
| - | 
| -#include <setupapi.h> | 
| -#include <winioctl.h> | 
| -#include "base/win/scoped_handle.h" | 
| - | 
| -#endif  // defined(OS_WIN) | 
| - | 
| -// Setup API is required to enumerate HID devices. | 
| -#pragma comment(lib, "setupapi.lib") | 
| -#pragma comment(lib, "hid.lib") | 
| - | 
| -namespace device { | 
| -namespace { | 
| - | 
| -const char kHIDClass[] = "HIDClass"; | 
| - | 
| -}  // namespace | 
| - | 
| -HidServiceWin::HidServiceWin() { | 
| -  initialized_ = Enumerate(); | 
| -} | 
| -HidServiceWin::~HidServiceWin() {} | 
| - | 
| -bool HidServiceWin::Enumerate() { | 
| -  BOOL res; | 
| -  HDEVINFO device_info_set; | 
| -  SP_DEVINFO_DATA devinfo_data; | 
| -  SP_DEVICE_INTERFACE_DATA device_interface_data; | 
| - | 
| -  memset(&devinfo_data, 0, sizeof(SP_DEVINFO_DATA)); | 
| -  devinfo_data.cbSize = sizeof(SP_DEVINFO_DATA); | 
| -  device_interface_data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); | 
| - | 
| -  device_info_set = SetupDiGetClassDevs( | 
| -      &GUID_DEVINTERFACE_HID, | 
| -      NULL, | 
| -      NULL, | 
| -      DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); | 
| - | 
| -  if (device_info_set == INVALID_HANDLE_VALUE) | 
| -    return false; | 
| - | 
| -  for (int device_index = 0; | 
| -      SetupDiEnumDeviceInterfaces(device_info_set, | 
| -                                  NULL, | 
| -                                  &GUID_DEVINTERFACE_HID, | 
| -                                  device_index, | 
| -                                  &device_interface_data); | 
| -      device_index++) { | 
| -    DWORD required_size = 0; | 
| - | 
| -    // Determime the required size of detail struct. | 
| -    SetupDiGetDeviceInterfaceDetailA(device_info_set, | 
| -                                     &device_interface_data, | 
| -                                     NULL, | 
| -                                     0, | 
| -                                     &required_size, | 
| -                                     NULL); | 
| - | 
| -    scoped_ptr_malloc<SP_DEVICE_INTERFACE_DETAIL_DATA_A> | 
| -        device_interface_detail_data( | 
| -            reinterpret_cast<SP_DEVICE_INTERFACE_DETAIL_DATA_A*>( | 
| -                malloc(required_size))); | 
| -    device_interface_detail_data->cbSize = | 
| -        sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_A); | 
| - | 
| -    // Get the detailed data for this device. | 
| -    res = SetupDiGetDeviceInterfaceDetailA(device_info_set, | 
| -                                           &device_interface_data, | 
| -                                           device_interface_detail_data.get(), | 
| -                                           required_size, | 
| -                                           NULL, | 
| -                                           NULL); | 
| -    if (!res) | 
| -      continue; | 
| - | 
| -    // Enumerate device info. Looking for Setup Class "HIDClass". | 
| -    for (DWORD i = 0; | 
| -        SetupDiEnumDeviceInfo(device_info_set, i, &devinfo_data); | 
| -        i++) { | 
| -      char class_name[256] = {0}; | 
| -      res = SetupDiGetDeviceRegistryPropertyA(device_info_set, | 
| -                                              &devinfo_data, | 
| -                                              SPDRP_CLASS, | 
| -                                              NULL, | 
| -                                              (PBYTE) class_name, | 
| -                                              sizeof(class_name) - 1, | 
| -                                              NULL); | 
| -      if (!res) | 
| -        break; | 
| -      if (memcmp(class_name, kHIDClass, sizeof(kHIDClass)) == 0) { | 
| -        char driver_name[256] = {0}; | 
| -        // Get bounded driver. | 
| -        res = SetupDiGetDeviceRegistryPropertyA(device_info_set, | 
| -                                                &devinfo_data, | 
| -                                                SPDRP_DRIVER, | 
| -                                                NULL, | 
| -                                                (PBYTE) driver_name, | 
| -                                                sizeof(driver_name) - 1, | 
| -                                                NULL); | 
| -        if (res) { | 
| -          // Found the drive. | 
| -          break; | 
| -        } | 
| -      } | 
| -    } | 
| - | 
| -    if (!res) | 
| -      continue; | 
| - | 
| -    PlatformAddDevice(device_interface_detail_data->DevicePath); | 
| -  } | 
| - | 
| -  return true; | 
| -} | 
| - | 
| -void HidServiceWin::PlatformAddDevice(std::string device_path) { | 
| -  HidDeviceInfo device_info; | 
| -  device_info.device_id = device_path; | 
| - | 
| -  // Try to open the device. | 
| -  base::win::ScopedHandle device_handle( | 
| -      CreateFileA(device_path.c_str(), | 
| -                  0, | 
| -                  FILE_SHARE_READ | FILE_SHARE_WRITE, | 
| -                  NULL, | 
| -                  OPEN_EXISTING, | 
| -                  FILE_FLAG_OVERLAPPED, | 
| -                  0)); | 
| -  if (!device_handle.IsValid()) | 
| -    return; | 
| - | 
| -  // Get VID/PID pair. | 
| -  HIDD_ATTRIBUTES attrib = {0}; | 
| -  attrib.Size = sizeof(HIDD_ATTRIBUTES); | 
| -  if (!HidD_GetAttributes(device_handle.Get(), &attrib)) | 
| -    return; | 
| - | 
| -  device_info.vendor_id = attrib.VendorID; | 
| -  device_info.product_id = attrib.ProductID; | 
| - | 
| -  for (ULONG i = 32; | 
| -      HidD_SetNumInputBuffers(device_handle.Get(), i); | 
| -      i <<= 1); | 
| - | 
| -  // Get usage and usage page (optional). | 
| -  PHIDP_PREPARSED_DATA preparsed_data; | 
| -  if (HidD_GetPreparsedData(device_handle.Get(), &preparsed_data) && | 
| -      preparsed_data) { | 
| -    HIDP_CAPS capabilities; | 
| -    if (HidP_GetCaps(preparsed_data, &capabilities) == HIDP_STATUS_SUCCESS) { | 
| -      device_info.usage = capabilities.Usage; | 
| -      device_info.usage_page = capabilities.UsagePage; | 
| -      device_info.input_report_size = capabilities.InputReportByteLength; | 
| -      device_info.output_report_size = capabilities.OutputReportByteLength; | 
| -      device_info.feature_report_size = capabilities.FeatureReportByteLength; | 
| -    } | 
| -    // Detect if the device supports report ids. | 
| -    if (capabilities.NumberInputValueCaps > 0) { | 
| -      scoped_ptr<HIDP_VALUE_CAPS[]> value_caps( | 
| -          new HIDP_VALUE_CAPS[capabilities.NumberInputValueCaps]); | 
| -      USHORT value_caps_length = capabilities.NumberInputValueCaps; | 
| -      if (HidP_GetValueCaps(HidP_Input, &value_caps[0], &value_caps_length, | 
| -                            preparsed_data) == HIDP_STATUS_SUCCESS) { | 
| -        device_info.has_report_id = (value_caps[0].ReportID != 0); | 
| -      } | 
| -    } | 
| -    HidD_FreePreparsedData(preparsed_data); | 
| -  } | 
| - | 
| -  // Get the serial number | 
| -  wchar_t str_property[512] = { 0 }; | 
| -  if (HidD_GetSerialNumberString(device_handle.Get(), | 
| -                                 str_property, | 
| -                                 sizeof(str_property))) { | 
| -    device_info.serial_number = base::SysWideToUTF8(str_property); | 
| -  } | 
| - | 
| -  if (HidD_GetProductString(device_handle.Get(), | 
| -                            str_property, | 
| -                            sizeof(str_property))) { | 
| -    device_info.product_name = base::SysWideToUTF8(str_property); | 
| -  } | 
| - | 
| -  HidService::AddDevice(device_info); | 
| -} | 
| - | 
| -void HidServiceWin::PlatformRemoveDevice(std::string device_path) { | 
| -  HidService::RemoveDevice(device_path); | 
| -} | 
| - | 
| -void HidServiceWin::GetDevices(std::vector<HidDeviceInfo>* devices) { | 
| -  Enumerate(); | 
| -  HidService::GetDevices(devices); | 
| -} | 
| - | 
| -scoped_refptr<HidConnection> HidServiceWin::Connect(std::string device_id) { | 
| -  if (!ContainsKey(devices_, device_id)) return NULL; | 
| -  scoped_refptr<HidConnectionWin> connection( | 
| -      new HidConnectionWin(devices_[device_id])); | 
| -  if (!connection->available()) { | 
| -    LOG_GETLASTERROR(ERROR) << "Failed to open device."; | 
| -    return NULL; | 
| -  } | 
| -  return connection; | 
| -} | 
| - | 
| -}  // namespace device | 
|  |