summaryrefslogtreecommitdiffstats
path: root/device/core/device_info_query_win.cc
diff options
context:
space:
mode:
authorjuncai <juncai@chromium.org>2015-11-20 21:54:27 -0800
committerCommit bot <commit-bot@chromium.org>2015-11-21 05:55:25 +0000
commit0c9eb038cae670b299c303a5e18547ec85e6e3b0 (patch)
treef6fcebffd4e64adbb1ad659eeacc0e4897c6a241 /device/core/device_info_query_win.cc
parent1084bdca601104f8eb99fa4ff11cc1397d8dd1af (diff)
downloadchromium_src-0c9eb038cae670b299c303a5e18547ec85e6e3b0.zip
chromium_src-0c9eb038cae670b299c303a5e18547ec85e6e3b0.tar.gz
chromium_src-0c9eb038cae670b299c303a5e18547ec85e6e3b0.tar.bz2
Add code to deal with serial device disconnection
detection on Windows. This patch added code to deal with serial device disconnection detection problem on Windows. It gets the COM port information from the device path and compare the COM port information with the port information that serial io handler holds. If they match, cancel read for that port. BUG=361606 Committed: https://crrev.com/195a0f202c1b89540d4a385d881cd483abe757fa Cr-Commit-Position: refs/heads/master@{#360193} Committed: https://crrev.com/8d09d9564ea10012d55ed634c0c2835efbd8d01f Cr-Commit-Position: refs/heads/master@{#360347} Review URL: https://codereview.chromium.org/1439443002 Cr-Commit-Position: refs/heads/master@{#361009}
Diffstat (limited to 'device/core/device_info_query_win.cc')
-rw-r--r--device/core/device_info_query_win.cc66
1 files changed, 66 insertions, 0 deletions
diff --git a/device/core/device_info_query_win.cc b/device/core/device_info_query_win.cc
new file mode 100644
index 0000000..4d62b32
--- /dev/null
+++ b/device/core/device_info_query_win.cc
@@ -0,0 +1,66 @@
+// Copyright 2015 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/core/device_info_query_win.h"
+
+#include <string.h>
+
+#include "base/strings/string_util.h"
+
+namespace device {
+
+DeviceInfoQueryWin::DeviceInfoQueryWin()
+ : device_info_list_(SetupDiCreateDeviceInfoList(nullptr, nullptr)) {
+ memset(&device_info_data_, 0, sizeof(device_info_data_));
+}
+
+DeviceInfoQueryWin::~DeviceInfoQueryWin() {
+ if (device_info_list_valid()) {
+ // Release |device_info_data_| only when it is valid.
+ if (device_info_data_.cbSize != 0)
+ SetupDiDeleteDeviceInfo(device_info_list_, &device_info_data_);
+ SetupDiDestroyDeviceInfoList(device_info_list_);
+ }
+}
+
+bool DeviceInfoQueryWin::AddDevice(const char* device_path) {
+ return SetupDiOpenDeviceInterfaceA(device_info_list_, device_path, 0,
+ nullptr) != FALSE;
+}
+
+bool DeviceInfoQueryWin::GetDeviceInfo() {
+ DCHECK_EQ(0U, device_info_data_.cbSize);
+ device_info_data_.cbSize = sizeof(device_info_data_);
+ if (!SetupDiEnumDeviceInfo(device_info_list_, 0, &device_info_data_)) {
+ // Clear cbSize to maintain the invariant.
+ device_info_data_.cbSize = 0;
+ return false;
+ }
+ return true;
+}
+
+bool DeviceInfoQueryWin::GetDeviceStringProperty(DWORD property,
+ std::string* property_buffer) {
+ DWORD property_reg_data_type;
+ const size_t property_buffer_length = 512;
+ if (!SetupDiGetDeviceRegistryPropertyA(
+ device_info_list_, &device_info_data_, property,
+ &property_reg_data_type,
+ reinterpret_cast<PBYTE>(
+ base::WriteInto(property_buffer, property_buffer_length)),
+ static_cast<DWORD>(property_buffer_length), nullptr))
+ return false;
+
+ if (property_reg_data_type != REG_SZ)
+ return false;
+
+ // Shrink |property_buffer| down to its correct size.
+ size_t eos = property_buffer->find('\0');
+ if (eos != std::string::npos)
+ property_buffer->resize(eos);
+
+ return true;
+}
+
+} // namespace device