Index: device/usb/usb_device_win.cc |
diff --git a/device/usb/usb_device_win.cc b/device/usb/usb_device_win.cc |
index 172858d5fa0a6c9c135b902f272007ec05b91282..e54d1c88d7b1dc5ffc1efaf8bc2aab5dcd0cacfd 100644 |
--- a/device/usb/usb_device_win.cc |
+++ b/device/usb/usb_device_win.cc |
@@ -10,7 +10,7 @@ |
#include "base/single_thread_task_runner.h" |
#include "base/threading/thread_task_runner_handle.h" |
#include "components/device_event_log/device_event_log.h" |
-#include "device/usb/usb_device_handle.h" |
+#include "device/usb/usb_device_handle_win.h" |
namespace device { |
@@ -32,4 +32,67 @@ void UsbDeviceWin::Open(const OpenCallback& callback) { |
task_runner_->PostTask(FROM_HERE, base::Bind(callback, nullptr)); |
} |
+void UsbDeviceWin::ReadDescriptors(const base::Callback<void(bool)>& callback) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ scoped_refptr<UsbDeviceHandle> device_handle; |
+ base::win::ScopedHandle handle( |
+ CreateFileA(hub_path_.c_str(), GENERIC_WRITE, FILE_SHARE_WRITE, nullptr, |
+ OPEN_EXISTING, FILE_FLAG_OVERLAPPED, nullptr)); |
+ if (handle.IsValid()) { |
+ device_handle = |
+ new UsbDeviceHandleWin(this, std::move(handle), blocking_task_runner_); |
+ } else { |
+ USB_PLOG(ERROR) << "Failed to open " << hub_path_; |
+ callback.Run(false); |
+ return; |
+ } |
+ |
+ ReadUsbDescriptors(device_handle, base::Bind(&UsbDeviceWin::OnReadDescriptors, |
+ this, callback, device_handle)); |
+} |
+ |
+void UsbDeviceWin::OnReadDescriptors( |
+ const base::Callback<void(bool)>& callback, |
+ scoped_refptr<UsbDeviceHandle> device_handle, |
+ std::unique_ptr<UsbDeviceDescriptor> descriptor) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ if (!descriptor) { |
+ USB_LOG(ERROR) << "Failed to read descriptors from " << device_path_ << "."; |
+ device_handle->Close(); |
+ callback.Run(false); |
+ return; |
+ } |
+ |
+ descriptor_ = *descriptor; |
+ |
+ auto string_map = base::MakeUnique<std::map<uint8_t, base::string16>>(); |
+ if (descriptor_.i_manufacturer) |
+ (*string_map)[descriptor_.i_manufacturer] = base::string16(); |
+ if (descriptor_.i_product) |
+ (*string_map)[descriptor_.i_product] = base::string16(); |
+ if (descriptor_.i_serial_number) |
+ (*string_map)[descriptor_.i_serial_number] = base::string16(); |
+ |
+ ReadUsbStringDescriptors(device_handle, std::move(string_map), |
+ base::Bind(&UsbDeviceWin::OnReadStringDescriptors, |
+ this, callback, device_handle)); |
+} |
+ |
+void UsbDeviceWin::OnReadStringDescriptors( |
+ const base::Callback<void(bool)>& callback, |
+ scoped_refptr<UsbDeviceHandle> device_handle, |
+ std::unique_ptr<std::map<uint8_t, base::string16>> string_map) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ device_handle->Close(); |
+ |
+ if (descriptor_.i_manufacturer) |
+ manufacturer_string_ = (*string_map)[descriptor_.i_manufacturer]; |
+ if (descriptor_.i_product) |
+ product_string_ = (*string_map)[descriptor_.i_product]; |
+ if (descriptor_.i_serial_number) |
+ serial_number_ = (*string_map)[descriptor_.i_serial_number]; |
+ |
+ callback.Run(true); |
+} |
+ |
} // namespace device |