Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(191)

Side by Side Diff: chrome/browser/devtools/device/usb/usb_device_provider.cc

Issue 287643002: DevTools: Partially redesigned DevToolsAndroidBridge and AndroidDeviceManager (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Removed unused include Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/devtools/device/usb/usb_device_provider.h" 5 #include "chrome/browser/devtools/device/usb/usb_device_provider.h"
6 6
7 #include "base/strings/stringprintf.h" 7 #include "base/strings/stringprintf.h"
8 #include "chrome/browser/devtools/device/adb/adb_device_info_query.h" 8 #include "chrome/browser/devtools/device/adb/adb_device_info_query.h"
9 #include "chrome/browser/devtools/device/usb/android_rsa.h" 9 #include "chrome/browser/devtools/device/usb/android_rsa.h"
10 #include "chrome/browser/devtools/device/usb/android_usb_device.h" 10 #include "chrome/browser/devtools/device/usb/android_usb_device.h"
11 #include "crypto/rsa_private_key.h" 11 #include "crypto/rsa_private_key.h"
12 #include "net/base/net_errors.h" 12 #include "net/base/net_errors.h"
13 #include "net/socket/stream_socket.h" 13 #include "net/socket/stream_socket.h"
14 14
15 namespace { 15 namespace {
16 16
17 const char kLocalAbstractCommand[] = "localabstract:%s"; 17 const char kLocalAbstractCommand[] = "localabstract:%s";
18 18
19 const int kBufferSize = 16 * 1024; 19 const int kBufferSize = 16 * 1024;
20 20
21 class UsbDeviceImpl : public AndroidDeviceManager::Device { 21 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.
22 public: 22 net::StreamSocket* socket,
23 explicit UsbDeviceImpl(AndroidUsbDevice* device); 23 int result) {
24
25 virtual void QueryDeviceInfo(const DeviceInfoCallback& callback) OVERRIDE;
26
27 virtual void OpenSocket(const std::string& name,
28 const SocketCallback& callback) OVERRIDE;
29 private:
30 void OnOpenSocket(const SocketCallback& callback,
31 net::StreamSocket* socket,
32 int result);
33 void RunCommand(const std::string& command,
34 const CommandCallback& callback);
35 void OpenedForCommand(const CommandCallback& callback,
36 net::StreamSocket* socket,
37 int result);
38 void OnRead(net::StreamSocket* socket,
39 scoped_refptr<net::IOBuffer> buffer,
40 const std::string& data,
41 const CommandCallback& callback,
42 int result);
43
44 virtual ~UsbDeviceImpl() {}
45 scoped_refptr<AndroidUsbDevice> device_;
46 };
47
48
49 UsbDeviceImpl::UsbDeviceImpl(AndroidUsbDevice* device)
50 : Device(device->serial(), device->is_connected()),
51 device_(device) {
52 device_->InitOnCallerThread();
53 }
54
55 void UsbDeviceImpl::QueryDeviceInfo(const DeviceInfoCallback& callback) {
56 AdbDeviceInfoQuery::Start(
57 base::Bind(&UsbDeviceImpl::RunCommand, this), callback);
58 }
59
60 void UsbDeviceImpl::OpenSocket(const std::string& name,
61 const SocketCallback& callback) {
62 DCHECK(CalledOnValidThread());
63 std::string socket_name =
64 base::StringPrintf(kLocalAbstractCommand, name.c_str());
65 net::StreamSocket* socket = device_->CreateSocket(socket_name);
66 if (!socket) {
67 callback.Run(net::ERR_CONNECTION_FAILED, NULL);
68 return;
69 }
70 int result = socket->Connect(base::Bind(&UsbDeviceImpl::OnOpenSocket, this,
71 callback, socket));
72 if (result != net::ERR_IO_PENDING)
73 callback.Run(result, NULL);
74 }
75
76 void UsbDeviceImpl::OnOpenSocket(const SocketCallback& callback,
77 net::StreamSocket* socket,
78 int result) {
79 callback.Run(result, result == net::OK ? socket : NULL); 24 callback.Run(result, result == net::OK ? socket : NULL);
80 } 25 }
81 26
82 void UsbDeviceImpl::RunCommand(const std::string& command, 27 static void OnRead(net::StreamSocket* socket,
pfeldman 2014/05/26 09:57:14 ditto
vkuzkokov 2014/05/26 10:54:03 Done.
83 const CommandCallback& callback) { 28 scoped_refptr<net::IOBuffer> buffer,
84 DCHECK(CalledOnValidThread()); 29 const std::string& data,
85 net::StreamSocket* socket = device_->CreateSocket(command); 30 const UsbDeviceProvider::CommandCallback& callback,
86 if (!socket) { 31 int result) {
87 callback.Run(net::ERR_CONNECTION_FAILED, std::string());
88 return;
89 }
90 int result = socket->Connect(base::Bind(&UsbDeviceImpl::OpenedForCommand,
91 this, callback, socket));
92 if (result != net::ERR_IO_PENDING)
93 callback.Run(result, std::string());
94 }
95
96 void UsbDeviceImpl::OpenedForCommand(const CommandCallback& callback,
97 net::StreamSocket* socket,
98 int result) {
99 if (result != net::OK) {
100 callback.Run(result, std::string());
101 return;
102 }
103 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(kBufferSize);
104 result = socket->Read(buffer, kBufferSize,
105 base::Bind(&UsbDeviceImpl::OnRead, this,
106 socket, buffer, std::string(), callback));
107 if (result != net::ERR_IO_PENDING)
108 OnRead(socket, buffer, std::string(), callback, result);
109 }
110
111 void UsbDeviceImpl::OnRead(net::StreamSocket* socket,
112 scoped_refptr<net::IOBuffer> buffer,
113 const std::string& data,
114 const CommandCallback& callback,
115 int result) {
116 if (result <= 0) { 32 if (result <= 0) {
117 callback.Run(result, result == 0 ? data : std::string()); 33 callback.Run(result, result == 0 ? data : std::string());
118 delete socket; 34 delete socket;
119 return; 35 return;
120 } 36 }
121 37
122 std::string new_data = data + std::string(buffer->data(), result); 38 std::string new_data = data + std::string(buffer->data(), result);
123 result = socket->Read(buffer, kBufferSize, 39 result =
124 base::Bind(&UsbDeviceImpl::OnRead, this, 40 socket->Read(buffer,
125 socket, buffer, new_data, callback)); 41 kBufferSize,
42 base::Bind(&OnRead, socket, buffer, new_data, callback));
126 if (result != net::ERR_IO_PENDING) 43 if (result != net::ERR_IO_PENDING)
127 OnRead(socket, buffer, new_data, callback, result); 44 OnRead(socket, buffer, new_data, callback, result);
128 } 45 }
129 46
130 static void EnumeratedDevices( 47 static void OpenedForCommand(const UsbDeviceProvider::CommandCallback& callback,
pfeldman 2014/05/26 09:57:14 ditto
vkuzkokov 2014/05/26 10:54:03 Done.
131 const UsbDeviceProvider::QueryDevicesCallback& callback, 48 net::StreamSocket* socket,
132 const AndroidUsbDevices& devices) { 49 int result) {
133 AndroidDeviceManager::Devices result; 50 if (result != net::OK) {
134 for (AndroidUsbDevices::const_iterator it = devices.begin(); 51 callback.Run(result, std::string());
135 it != devices.end(); ++it) 52 return;
136 result.push_back(new UsbDeviceImpl(*it)); 53 }
137 callback.Run(result); 54 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(kBufferSize);
55 result = socket->Read(
56 buffer,
57 kBufferSize,
58 base::Bind(&OnRead, socket, buffer, std::string(), callback));
59 if (result != net::ERR_IO_PENDING)
60 OnRead(socket, buffer, std::string(), callback, result);
61 }
62
63 static void RunCommand(scoped_refptr<AndroidUsbDevice> device,
64 const std::string& command,
65 const UsbDeviceProvider::CommandCallback& callback) {
66 net::StreamSocket* socket = device->CreateSocket(command);
67 if (!socket) {
68 callback.Run(net::ERR_CONNECTION_FAILED, std::string());
69 return;
70 }
71 int result = socket->Connect(base::Bind(&OpenedForCommand, callback, socket));
72 if (result != net::ERR_IO_PENDING)
73 callback.Run(result, std::string());
138 } 74 }
139 75
140 } // namespace 76 } // namespace
141 77
142 // static 78 // static
143 void UsbDeviceProvider::CountDevices( 79 void UsbDeviceProvider::CountDevices(
144 const base::Callback<void(int)>& callback) { 80 const base::Callback<void(int)>& callback) {
145 AndroidUsbDevice::CountDevices(callback); 81 AndroidUsbDevice::CountDevices(callback);
146 } 82 }
147 83
148 UsbDeviceProvider::UsbDeviceProvider(Profile* profile){ 84 UsbDeviceProvider::UsbDeviceProvider(Profile* profile){
149 rsa_key_.reset(AndroidRSAPrivateKey(profile)); 85 rsa_key_.reset(AndroidRSAPrivateKey(profile));
150 } 86 }
151 87
88 void UsbDeviceProvider::QueryDevices(const SerialsCallback& callback) {
89 AndroidUsbDevice::Enumerate(
90 rsa_key_.get(),
91 base::Bind(&UsbDeviceProvider::EnumeratedDevices, this, callback));
92 }
93
94 void UsbDeviceProvider::QueryDeviceInfo(const std::string& serial,
95 const DeviceInfoCallback& callback) {
96 UsbDeviceMap::iterator it = device_map_.find(serial);
97 if (it == device_map_.end() || !it->second->is_connected()) {
98 AndroidDeviceManager::DeviceInfo offline_info;
99 callback.Run(offline_info);
100 return;
101 }
102 AdbDeviceInfoQuery::Start(base::Bind(&RunCommand, it->second), callback);
103 }
104
105 void UsbDeviceProvider::OpenSocket(const std::string& serial,
106 const std::string& name,
107 const SocketCallback& callback) {
108 UsbDeviceMap::iterator it = device_map_.find(serial);
109 if (it == device_map_.end()) {
110 callback.Run(net::ERR_CONNECTION_FAILED, NULL);
111 return;
112 }
113 std::string socket_name =
114 base::StringPrintf(kLocalAbstractCommand, name.c_str());
115 net::StreamSocket* socket = it->second->CreateSocket(socket_name);
116 if (!socket) {
117 callback.Run(net::ERR_CONNECTION_FAILED, NULL);
118 return;
119 }
120 int result = socket->Connect(base::Bind(&OnOpenSocket, callback, socket));
121 if (result != net::ERR_IO_PENDING)
122 callback.Run(result, NULL);
123 }
124
125 void UsbDeviceProvider::ReleaseDevice(const std::string& serial) {
126 device_map_.erase(serial);
127 }
128
152 UsbDeviceProvider::~UsbDeviceProvider() { 129 UsbDeviceProvider::~UsbDeviceProvider() {
153 } 130 }
154 131
155 void UsbDeviceProvider::QueryDevices(const QueryDevicesCallback& callback) { 132 void UsbDeviceProvider::EnumeratedDevices(const SerialsCallback& callback,
156 AndroidUsbDevice::Enumerate( 133 const AndroidUsbDevices& devices) {
157 rsa_key_.get(), base::Bind(&EnumeratedDevices, callback)); 134 std::vector<std::string> result;
135 device_map_.clear();
136 for (AndroidUsbDevices::const_iterator it = devices.begin();
137 it != devices.end();
138 ++it) {
pfeldman 2014/05/26 09:57:14 ++it on the line above is fine
vkuzkokov 2014/05/26 10:54:03 Done.
139 result.push_back((*it)->serial());
140 device_map_[(*it)->serial()] = *it;
141 (*it)->InitOnCallerThread();
142 }
143 callback.Run(result);
158 } 144 }
145
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698