Index: chrome/browser/devtools/device/usb/usb_device_provider.cc |
diff --git a/chrome/browser/devtools/device/usb/usb_device_provider.cc b/chrome/browser/devtools/device/usb/usb_device_provider.cc |
index 566f121c589ba8161ec438bb1e0dd8f6a3bdaec6..c05d63c402acfd2d0273695a89d52a3280eadc7b 100644 |
--- a/chrome/browser/devtools/device/usb/usb_device_provider.cc |
+++ b/chrome/browser/devtools/device/usb/usb_device_provider.cc |
@@ -18,123 +18,59 @@ const char kLocalAbstractCommand[] = "localabstract:%s"; |
const int kBufferSize = 16 * 1024; |
-class UsbDeviceImpl : public AndroidDeviceManager::Device { |
- public: |
- explicit UsbDeviceImpl(AndroidUsbDevice* device); |
- |
- virtual void QueryDeviceInfo(const DeviceInfoCallback& callback) OVERRIDE; |
- |
- virtual void OpenSocket(const std::string& name, |
- const SocketCallback& callback) OVERRIDE; |
- private: |
- void OnOpenSocket(const SocketCallback& callback, |
- net::StreamSocket* socket, |
- int result); |
- void RunCommand(const std::string& command, |
- const CommandCallback& callback); |
- void OpenedForCommand(const CommandCallback& callback, |
- net::StreamSocket* socket, |
- int result); |
- void OnRead(net::StreamSocket* socket, |
- scoped_refptr<net::IOBuffer> buffer, |
- const std::string& data, |
- const CommandCallback& callback, |
- int result); |
- |
- virtual ~UsbDeviceImpl() {} |
- scoped_refptr<AndroidUsbDevice> device_; |
-}; |
- |
- |
-UsbDeviceImpl::UsbDeviceImpl(AndroidUsbDevice* device) |
- : Device(device->serial(), device->is_connected()), |
- device_(device) { |
- device_->InitOnCallerThread(); |
-} |
- |
-void UsbDeviceImpl::QueryDeviceInfo(const DeviceInfoCallback& callback) { |
- AdbDeviceInfoQuery::Start( |
- base::Bind(&UsbDeviceImpl::RunCommand, this), callback); |
-} |
- |
-void UsbDeviceImpl::OpenSocket(const std::string& name, |
- const SocketCallback& callback) { |
- DCHECK(CalledOnValidThread()); |
- std::string socket_name = |
- base::StringPrintf(kLocalAbstractCommand, name.c_str()); |
- net::StreamSocket* socket = device_->CreateSocket(socket_name); |
- if (!socket) { |
- callback.Run(net::ERR_CONNECTION_FAILED, NULL); |
- return; |
- } |
- int result = socket->Connect(base::Bind(&UsbDeviceImpl::OnOpenSocket, this, |
- callback, socket)); |
- if (result != net::ERR_IO_PENDING) |
- callback.Run(result, NULL); |
-} |
- |
-void UsbDeviceImpl::OnOpenSocket(const SocketCallback& callback, |
- net::StreamSocket* socket, |
- int result) { |
+static void OnOpenSocket(const UsbDeviceProvider::SocketCallback& callback, |
pfeldman
2014/05/26 09:57:14
no need to declare as static in anonymous namespac
vkuzkokov
2014/05/26 10:54:03
Done.
|
+ net::StreamSocket* socket, |
+ int result) { |
callback.Run(result, result == net::OK ? socket : NULL); |
} |
-void UsbDeviceImpl::RunCommand(const std::string& command, |
- const CommandCallback& callback) { |
- DCHECK(CalledOnValidThread()); |
- net::StreamSocket* socket = device_->CreateSocket(command); |
- if (!socket) { |
- callback.Run(net::ERR_CONNECTION_FAILED, std::string()); |
+static void OnRead(net::StreamSocket* socket, |
pfeldman
2014/05/26 09:57:14
ditto
vkuzkokov
2014/05/26 10:54:03
Done.
|
+ scoped_refptr<net::IOBuffer> buffer, |
+ const std::string& data, |
+ const UsbDeviceProvider::CommandCallback& callback, |
+ int result) { |
+ if (result <= 0) { |
+ callback.Run(result, result == 0 ? data : std::string()); |
+ delete socket; |
return; |
} |
- int result = socket->Connect(base::Bind(&UsbDeviceImpl::OpenedForCommand, |
- this, callback, socket)); |
+ |
+ std::string new_data = data + std::string(buffer->data(), result); |
+ result = |
+ socket->Read(buffer, |
+ kBufferSize, |
+ base::Bind(&OnRead, socket, buffer, new_data, callback)); |
if (result != net::ERR_IO_PENDING) |
- callback.Run(result, std::string()); |
+ OnRead(socket, buffer, new_data, callback, result); |
} |
-void UsbDeviceImpl::OpenedForCommand(const CommandCallback& callback, |
- net::StreamSocket* socket, |
- int result) { |
+static void OpenedForCommand(const UsbDeviceProvider::CommandCallback& callback, |
pfeldman
2014/05/26 09:57:14
ditto
vkuzkokov
2014/05/26 10:54:03
Done.
|
+ net::StreamSocket* socket, |
+ int result) { |
if (result != net::OK) { |
callback.Run(result, std::string()); |
return; |
} |
scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(kBufferSize); |
- result = socket->Read(buffer, kBufferSize, |
- base::Bind(&UsbDeviceImpl::OnRead, this, |
- socket, buffer, std::string(), callback)); |
+ result = socket->Read( |
+ buffer, |
+ kBufferSize, |
+ base::Bind(&OnRead, socket, buffer, std::string(), callback)); |
if (result != net::ERR_IO_PENDING) |
OnRead(socket, buffer, std::string(), callback, result); |
} |
-void UsbDeviceImpl::OnRead(net::StreamSocket* socket, |
- scoped_refptr<net::IOBuffer> buffer, |
- const std::string& data, |
- const CommandCallback& callback, |
- int result) { |
- if (result <= 0) { |
- callback.Run(result, result == 0 ? data : std::string()); |
- delete socket; |
+static void RunCommand(scoped_refptr<AndroidUsbDevice> device, |
+ const std::string& command, |
+ const UsbDeviceProvider::CommandCallback& callback) { |
+ net::StreamSocket* socket = device->CreateSocket(command); |
+ if (!socket) { |
+ callback.Run(net::ERR_CONNECTION_FAILED, std::string()); |
return; |
} |
- |
- std::string new_data = data + std::string(buffer->data(), result); |
- result = socket->Read(buffer, kBufferSize, |
- base::Bind(&UsbDeviceImpl::OnRead, this, |
- socket, buffer, new_data, callback)); |
+ int result = socket->Connect(base::Bind(&OpenedForCommand, callback, socket)); |
if (result != net::ERR_IO_PENDING) |
- OnRead(socket, buffer, new_data, callback, result); |
-} |
- |
-static void EnumeratedDevices( |
- const UsbDeviceProvider::QueryDevicesCallback& callback, |
- const AndroidUsbDevices& devices) { |
- AndroidDeviceManager::Devices result; |
- for (AndroidUsbDevices::const_iterator it = devices.begin(); |
- it != devices.end(); ++it) |
- result.push_back(new UsbDeviceImpl(*it)); |
- callback.Run(result); |
+ callback.Run(result, std::string()); |
} |
} // namespace |
@@ -149,10 +85,61 @@ UsbDeviceProvider::UsbDeviceProvider(Profile* profile){ |
rsa_key_.reset(AndroidRSAPrivateKey(profile)); |
} |
+void UsbDeviceProvider::QueryDevices(const SerialsCallback& callback) { |
+ AndroidUsbDevice::Enumerate( |
+ rsa_key_.get(), |
+ base::Bind(&UsbDeviceProvider::EnumeratedDevices, this, callback)); |
+} |
+ |
+void UsbDeviceProvider::QueryDeviceInfo(const std::string& serial, |
+ const DeviceInfoCallback& callback) { |
+ UsbDeviceMap::iterator it = device_map_.find(serial); |
+ if (it == device_map_.end() || !it->second->is_connected()) { |
+ AndroidDeviceManager::DeviceInfo offline_info; |
+ callback.Run(offline_info); |
+ return; |
+ } |
+ AdbDeviceInfoQuery::Start(base::Bind(&RunCommand, it->second), callback); |
+} |
+ |
+void UsbDeviceProvider::OpenSocket(const std::string& serial, |
+ const std::string& name, |
+ const SocketCallback& callback) { |
+ UsbDeviceMap::iterator it = device_map_.find(serial); |
+ if (it == device_map_.end()) { |
+ callback.Run(net::ERR_CONNECTION_FAILED, NULL); |
+ return; |
+ } |
+ std::string socket_name = |
+ base::StringPrintf(kLocalAbstractCommand, name.c_str()); |
+ net::StreamSocket* socket = it->second->CreateSocket(socket_name); |
+ if (!socket) { |
+ callback.Run(net::ERR_CONNECTION_FAILED, NULL); |
+ return; |
+ } |
+ int result = socket->Connect(base::Bind(&OnOpenSocket, callback, socket)); |
+ if (result != net::ERR_IO_PENDING) |
+ callback.Run(result, NULL); |
+} |
+ |
+void UsbDeviceProvider::ReleaseDevice(const std::string& serial) { |
+ device_map_.erase(serial); |
+} |
+ |
UsbDeviceProvider::~UsbDeviceProvider() { |
} |
-void UsbDeviceProvider::QueryDevices(const QueryDevicesCallback& callback) { |
- AndroidUsbDevice::Enumerate( |
- rsa_key_.get(), base::Bind(&EnumeratedDevices, callback)); |
+void UsbDeviceProvider::EnumeratedDevices(const SerialsCallback& callback, |
+ const AndroidUsbDevices& devices) { |
+ std::vector<std::string> result; |
+ device_map_.clear(); |
+ for (AndroidUsbDevices::const_iterator it = devices.begin(); |
+ it != devices.end(); |
+ ++it) { |
pfeldman
2014/05/26 09:57:14
++it on the line above is fine
vkuzkokov
2014/05/26 10:54:03
Done.
|
+ result.push_back((*it)->serial()); |
+ device_map_[(*it)->serial()] = *it; |
+ (*it)->InitOnCallerThread(); |
+ } |
+ callback.Run(result); |
} |
+ |