summaryrefslogtreecommitdiffstats
path: root/device
diff options
context:
space:
mode:
authorcharliea <charliea@chromium.org>2015-10-08 19:12:08 -0700
committerCommit bot <commit-bot@chromium.org>2015-10-09 02:12:46 +0000
commitcbca414b1aae0e5fae37a651d854132ef9138a9b (patch)
tree11bf2a054474dd0193144a9da1430cc44e8ff2d2 /device
parent3a8b16c9a3cd776d53ee540a74903abbb2277149 (diff)
downloadchromium_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.gn1
-rw-r--r--device/serial/DEPS1
-rw-r--r--device/serial/serial.gyp1
-rw-r--r--device/serial/serial_device_enumerator_win.cc116
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();
}