diff options
author | juncai <juncai@chromium.org> | 2015-11-17 15:08:45 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-11-17 23:09:43 +0000 |
commit | 195a0f202c1b89540d4a385d881cd483abe757fa (patch) | |
tree | 2c82e93bf743da75a558ced2d16d02d7e7242503 /device/core/device_info_query_win.cc | |
parent | 8d84ed55c7976a97706f4f29350209f5184d699b (diff) | |
download | chromium_src-195a0f202c1b89540d4a385d881cd483abe757fa.zip chromium_src-195a0f202c1b89540d4a385d881cd483abe757fa.tar.gz chromium_src-195a0f202c1b89540d4a385d881cd483abe757fa.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
Review URL: https://codereview.chromium.org/1439443002
Cr-Commit-Position: refs/heads/master@{#360193}
Diffstat (limited to 'device/core/device_info_query_win.cc')
-rw-r--r-- | device/core/device_info_query_win.cc | 66 |
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 |