| Index: device/core/device_info_query_win.cc
|
| diff --git a/device/core/device_info_query_win.cc b/device/core/device_info_query_win.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..a631f13dff8ce8eaa60cb01a3e95f456fa1c2dfe
|
| --- /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
|
|
|