diff options
author | charliea <charliea@chromium.org> | 2015-10-08 19:12:08 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-10-09 02:12:46 +0000 |
commit | cbca414b1aae0e5fae37a651d854132ef9138a9b (patch) | |
tree | 11bf2a054474dd0193144a9da1430cc44e8ff2d2 /device | |
parent | 3a8b16c9a3cd776d53ee540a74903abbb2277149 (diff) | |
download | chromium_src-cbca414b1aae0e5fae37a651d854132ef9138a9b.zip chromium_src-cbca414b1aae0e5fae37a651d854132ef9138a9b.tar.gz chromium_src-cbca414b1aae0e5fae37a651d854132ef9138a9b.tar.bz2 |
Revert "Extracts more information from serial devices on Windows"
This reverts commit e940c46e8e7b40367a4c151656550693476ea870.
The CL being reverted has caused a regression on Windows where
Arduino serial devices that were showing up before are no
longer showing up. I think that it makes sense to take a more
reasoned approach here and use a combination of the old method
and the new method until we're sure that the new method of
enumerating serial devices is strictly better than the old.
(We can verify this using UMA metrics.) For now, though, we'll
just want to eliminate the regression.
This CL will also need need to be cherrypicked onto current
release branches.
BUG=540889
Review URL: https://codereview.chromium.org/1395023002
Cr-Commit-Position: refs/heads/master@{#353212}
Diffstat (limited to 'device')
-rw-r--r-- | device/serial/BUILD.gn | 1 | ||||
-rw-r--r-- | device/serial/DEPS | 1 | ||||
-rw-r--r-- | device/serial/serial.gyp | 1 | ||||
-rw-r--r-- | device/serial/serial_device_enumerator_win.cc | 116 |
4 files changed, 10 insertions, 109 deletions
diff --git a/device/serial/BUILD.gn b/device/serial/BUILD.gn index fab490e..d307910 100644 --- a/device/serial/BUILD.gn +++ b/device/serial/BUILD.gn @@ -48,7 +48,6 @@ static_library("serial") { ] deps = [ "//third_party/mojo/src/mojo/public/cpp/system", - "//third_party/re2", ] if (use_udev) { diff --git a/device/serial/DEPS b/device/serial/DEPS index 4bebd41..fc30a89 100644 --- a/device/serial/DEPS +++ b/device/serial/DEPS @@ -1,5 +1,4 @@ include_rules = [ "+dbus", "+net/base", - "+third_party/re2", ] diff --git a/device/serial/serial.gyp b/device/serial/serial.gyp index 5d43bd1..650c8c6 100644 --- a/device/serial/serial.gyp +++ b/device/serial/serial.gyp @@ -44,7 +44,6 @@ 'device_serial_mojo', '../../net/net.gyp:net', '../../third_party/mojo/mojo_public.gyp:mojo_cpp_bindings', - '../../third_party/re2/re2.gyp:re2', ], 'export_dependent_settings': [ 'device_serial_mojo', diff --git a/device/serial/serial_device_enumerator_win.cc b/device/serial/serial_device_enumerator_win.cc index 0d1e8f1..124c6b7 100644 --- a/device/serial/serial_device_enumerator_win.cc +++ b/device/serial/serial_device_enumerator_win.cc @@ -6,75 +6,14 @@ #include <windows.h> -#include <ntddser.h> -#include <setupapi.h> - #include "base/memory/scoped_ptr.h" -#include "base/strings/string_number_conversions.h" +#include "base/strings/string_util.h" +#include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" -#include "third_party/re2/re2/re2.h" +#include "base/win/registry.h" namespace device { -namespace { - -// Searches the specified device info for a property with the specified key, -// assigns the result to value, and returns whether the operation was -// successful. -bool GetProperty(HDEVINFO dev_info, - SP_DEVINFO_DATA dev_info_data, - const int key, - std::string* value) { - // We don't know how much space the property's value will take up, so we call - // the property retrieval function once to fetch the size of the required - // value buffer, then again once we've allocated a sufficiently large buffer. - DWORD buffer_size = 0; - SetupDiGetDeviceRegistryProperty(dev_info, &dev_info_data, key, nullptr, - nullptr, buffer_size, &buffer_size); - if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) - return false; - - scoped_ptr<wchar_t[]> buffer(new wchar_t[buffer_size]); - if (!SetupDiGetDeviceRegistryProperty(dev_info, &dev_info_data, key, nullptr, - reinterpret_cast<PBYTE>(buffer.get()), - buffer_size, nullptr)) - return false; - - *value = base::WideToUTF8(buffer.get()); - return true; -} - -// Searches for the COM port in the device's friendly name, assigns its value to -// com_port, and returns whether the operation was successful. -bool GetCOMPort(const std::string friendly_name, std::string* com_port) { - return RE2::PartialMatch(friendly_name, ".* \\((COM[0-9]+)\\)", com_port); -} - -// Searches for the display name in the device's friendly name, assigns its -// value to display_name, and returns whether the operation was successful. -bool GetDisplayName(const std::string friendly_name, - std::string* display_name) { - return RE2::PartialMatch(friendly_name, "(.*) \\(COM[0-9]+\\)", display_name); -} - -// Searches for the vendor ID in the device's hardware ID, assigns its value to -// vendor_id, and returns whether the operation was successful. -bool GetVendorID(const std::string hardware_id, uint32_t* vendor_id) { - std::string vendor_id_str; - return RE2::PartialMatch(hardware_id, "VID_([0-9]+)", &vendor_id_str) && - base::HexStringToUInt(vendor_id_str, vendor_id); -} - -// Searches for the product ID in the device's product ID, assigns its value to -// product_id, and returns whether the operation was successful. -bool GetProductID(const std::string hardware_id, uint32_t* product_id) { - std::string product_id_str; - return RE2::PartialMatch(hardware_id, "PID_([0-9]+)", &product_id_str) && - base::HexStringToUInt(product_id_str, product_id); -} - -} // namespace - // static scoped_ptr<SerialDeviceEnumerator> SerialDeviceEnumerator::Create() { return scoped_ptr<SerialDeviceEnumerator>(new SerialDeviceEnumeratorWin()); @@ -84,53 +23,18 @@ SerialDeviceEnumeratorWin::SerialDeviceEnumeratorWin() {} SerialDeviceEnumeratorWin::~SerialDeviceEnumeratorWin() {} +// TODO(rockot): Query the system for more information than just device paths. +// This may or may not require using a different strategy than scanning the +// registry location below. mojo::Array<serial::DeviceInfoPtr> SerialDeviceEnumeratorWin::GetDevices() { + base::win::RegistryValueIterator iter_key( + HKEY_LOCAL_MACHINE, L"HARDWARE\\DEVICEMAP\\SERIALCOMM\\"); mojo::Array<serial::DeviceInfoPtr> devices(0); - - // Make a device interface query to find all serial devices. - HDEVINFO dev_info = - SetupDiGetClassDevs(&GUID_DEVINTERFACE_SERENUM_BUS_ENUMERATOR, 0, 0, - DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); - if (dev_info == INVALID_HANDLE_VALUE) - return devices.Pass(); - - SP_DEVINFO_DATA dev_info_data; - dev_info_data.cbSize = sizeof(SP_DEVINFO_DATA); - for (DWORD i = 0; SetupDiEnumDeviceInfo(dev_info, i, &dev_info_data); i++) { - std::string friendly_name, com_port; - // SPDRP_FRIENDLYNAME looks like "USB_SERIAL_PORT (COM3)". - if (!GetProperty(dev_info, dev_info_data, SPDRP_FRIENDLYNAME, - &friendly_name) || - !GetCOMPort(friendly_name, &com_port)) - // In Windows, the COM port is the path used to uniquely identify the - // serial device. If the COM can't be found, ignore the device. - continue; - + for (; iter_key.Valid(); ++iter_key) { serial::DeviceInfoPtr info(serial::DeviceInfo::New()); - info->path = com_port; - - std::string display_name; - if (GetDisplayName(friendly_name, &display_name)) - info->display_name = display_name; - - std::string hardware_id; - // SPDRP_HARDWAREID looks like "FTDIBUS\COMPORT&VID_0403&PID_6001". - if (GetProperty(dev_info, dev_info_data, SPDRP_HARDWAREID, &hardware_id)) { - uint32_t vendor_id, product_id; - if (GetVendorID(hardware_id, &vendor_id)) { - info->has_vendor_id = true; - info->vendor_id = vendor_id; - } - if (GetProductID(hardware_id, &product_id)) { - info->has_product_id = true; - info->product_id = product_id; - } - } - + info->path = base::UTF16ToASCII(iter_key.Value()); devices.push_back(info.Pass()); } - - SetupDiDestroyDeviceInfoList(dev_info); return devices.Pass(); } |