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

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

Issue 980023002: Move device/usb classes from the FILE thread to UI thread. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 8 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/android_usb_device.h" 5 #include "chrome/browser/devtools/device/usb/android_usb_device.h"
6 6
7 #include <set> 7 #include <set>
8 8
9 #include "base/barrier_closure.h" 9 #include "base/barrier_closure.h"
10 #include "base/base64.h" 10 #include "base/base64.h"
11 #include "base/lazy_instance.h" 11 #include "base/lazy_instance.h"
12 #include "base/message_loop/message_loop.h" 12 #include "base/single_thread_task_runner.h"
13 #include "base/stl_util.h" 13 #include "base/stl_util.h"
14 #include "base/strings/string_util.h" 14 #include "base/strings/string_util.h"
15 #include "base/strings/stringprintf.h" 15 #include "base/strings/stringprintf.h"
16 #include "base/strings/utf_string_conversions.h" 16 #include "base/strings/utf_string_conversions.h"
17 #include "base/thread_task_runner_handle.h"
17 #include "chrome/browser/devtools/device/usb/android_rsa.h" 18 #include "chrome/browser/devtools/device/usb/android_rsa.h"
18 #include "chrome/browser/devtools/device/usb/android_usb_socket.h" 19 #include "chrome/browser/devtools/device/usb/android_usb_socket.h"
19 #include "content/public/browser/browser_thread.h" 20 #include "content/public/browser/browser_thread.h"
20 #include "crypto/rsa_private_key.h" 21 #include "crypto/rsa_private_key.h"
21 #include "device/core/device_client.h" 22 #include "device/core/device_client.h"
22 #include "device/usb/usb_descriptors.h" 23 #include "device/usb/usb_descriptors.h"
23 #include "device/usb/usb_device.h" 24 #include "device/usb/usb_device.h"
24 #include "device/usb/usb_service.h" 25 #include "device/usb/usb_service.h"
25 #include "net/base/ip_endpoint.h" 26 #include "net/base/ip_endpoint.h"
26 #include "net/base/net_errors.h" 27 #include "net/base/net_errors.h"
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 if (interface.alternate_setting != 0 || 63 if (interface.alternate_setting != 0 ||
63 interface.interface_class != kAdbClass || 64 interface.interface_class != kAdbClass ||
64 interface.interface_subclass != kAdbSubclass || 65 interface.interface_subclass != kAdbSubclass ||
65 interface.interface_protocol != kAdbProtocol || 66 interface.interface_protocol != kAdbProtocol ||
66 interface.endpoints.size() != 2) { 67 interface.endpoints.size() != 2) {
67 return false; 68 return false;
68 } 69 }
69 return true; 70 return true;
70 } 71 }
71 72
72 scoped_refptr<AndroidUsbDevice> ClaimInterface( 73 void CountAndroidDevices(const base::Callback<void(int)>& callback,
73 crypto::RSAPrivateKey* rsa_key, 74 const UsbDevices& devices) {
74 scoped_refptr<UsbDeviceHandle> usb_handle, 75 int device_count = 0;
75 const base::string16& serial, 76 for (const scoped_refptr<UsbDevice>& device : devices) {
76 const UsbInterfaceDescriptor& interface) { 77 const UsbConfigDescriptor* config = device->GetConfiguration();
77 int inbound_address = 0; 78 if (config) {
78 int outbound_address = 0; 79 for (const UsbInterfaceDescriptor& iface : config->interfaces) {
79 int zero_mask = 0; 80 if (IsAndroidInterface(iface)) {
80 81 ++device_count;
81 for (const UsbEndpointDescriptor& endpoint : interface.endpoints) { 82 }
82 if (endpoint.transfer_type != device::USB_TRANSFER_BULK) 83 }
83 continue; 84 }
84 if (endpoint.direction == device::USB_DIRECTION_INBOUND)
85 inbound_address = endpoint.address;
86 else
87 outbound_address = endpoint.address;
88 zero_mask = endpoint.maximum_packet_size - 1;
89 } 85 }
90 86
91 if (inbound_address == 0 || outbound_address == 0) 87 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
92 return NULL; 88 base::Bind(callback, device_count));
93
94 if (!usb_handle->ClaimInterface(interface.interface_number))
95 return NULL;
96
97 return new AndroidUsbDevice(rsa_key,
98 usb_handle,
99 base::UTF16ToASCII(serial),
100 inbound_address,
101 outbound_address,
102 zero_mask,
103 interface.interface_number);
104 } 89 }
105 90
106 uint32 Checksum(const std::string& data) { 91 uint32 Checksum(const std::string& data) {
107 unsigned char* x = (unsigned char*)data.data(); 92 unsigned char* x = (unsigned char*)data.data();
108 int count = data.length(); 93 int count = data.length();
109 uint32 sum = 0; 94 uint32 sum = 0;
110 while (count-- > 0) 95 while (count-- > 0)
111 sum += *x++; 96 sum += *x++;
112 return sum; 97 return sum;
113 } 98 }
(...skipping 26 matching lines...) Expand all
140 LOG(ERROR) << (outgoing ? "[out] " : "[ in] ") << result; 125 LOG(ERROR) << (outgoing ? "[out] " : "[ in] ") << result;
141 #endif // 0 126 #endif // 0
142 } 127 }
143 128
144 void ReleaseInterface(scoped_refptr<UsbDeviceHandle> usb_device, 129 void ReleaseInterface(scoped_refptr<UsbDeviceHandle> usb_device,
145 int interface_id) { 130 int interface_id) {
146 usb_device->ReleaseInterface(interface_id); 131 usb_device->ReleaseInterface(interface_id);
147 usb_device->Close(); 132 usb_device->Close();
148 } 133 }
149 134
150 } // namespace 135 void RespondOnCallerThread(const AndroidUsbDevicesCallback& callback,
151 136 AndroidUsbDevices* new_devices) {
152 AdbMessage::AdbMessage(uint32 command,
153 uint32 arg0,
154 uint32 arg1,
155 const std::string& body)
156 : command(command),
157 arg0(arg0),
158 arg1(arg1),
159 body(body) {
160 }
161
162 AdbMessage::~AdbMessage() {
163 }
164
165 static void RespondOnCallerThread(const AndroidUsbDevicesCallback& callback,
166 AndroidUsbDevices* new_devices) {
167 scoped_ptr<AndroidUsbDevices> devices(new_devices); 137 scoped_ptr<AndroidUsbDevices> devices(new_devices);
168 138
169 // Add raw pointers to the newly claimed devices. 139 // Add raw pointers to the newly claimed devices.
170 for (const scoped_refptr<AndroidUsbDevice>& device : *devices) { 140 for (const scoped_refptr<AndroidUsbDevice>& device : *devices) {
171 g_devices.Get().push_back(device.get()); 141 g_devices.Get().push_back(device.get());
172 } 142 }
173 143
174 // Return all claimed devices. 144 // Return all claimed devices.
175 AndroidUsbDevices result(g_devices.Get().begin(), g_devices.Get().end()); 145 AndroidUsbDevices result(g_devices.Get().begin(), g_devices.Get().end());
176 callback.Run(result); 146 callback.Run(result);
177 } 147 }
178 148
179 static void RespondOnFileThread( 149 void RespondOnUIThread(
180 const AndroidUsbDevicesCallback& callback, 150 const AndroidUsbDevicesCallback& callback,
181 AndroidUsbDevices* devices, 151 AndroidUsbDevices* devices,
182 scoped_refptr<base::MessageLoopProxy> caller_message_loop_proxy) { 152 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner) {
183 DCHECK_CURRENTLY_ON(BrowserThread::FILE); 153 DCHECK_CURRENTLY_ON(BrowserThread::UI);
184 caller_message_loop_proxy->PostTask( 154 caller_task_runner->PostTask(
185 FROM_HERE, 155 FROM_HERE, base::Bind(&RespondOnCallerThread, callback, devices));
186 base::Bind(&RespondOnCallerThread, callback, devices));
187 } 156 }
188 157
189 static void OpenAndroidDeviceOnFileThread( 158 void CreateDeviceOnInterfaceClaimed(AndroidUsbDevices* devices,
190 AndroidUsbDevices* devices, 159 crypto::RSAPrivateKey* rsa_key,
191 crypto::RSAPrivateKey* rsa_key, 160 scoped_refptr<UsbDeviceHandle> usb_handle,
192 const base::Closure& barrier, 161 int inbound_address,
193 scoped_refptr<UsbDevice> device, 162 int outbound_address,
194 int interface_id, 163 int zero_mask,
195 bool success) { 164 int interface_number,
196 DCHECK_CURRENTLY_ON(BrowserThread::FILE); 165 const base::Closure& barrier,
166 bool success) {
197 if (success) { 167 if (success) {
198 base::string16 serial; 168 devices->push_back(new AndroidUsbDevice(
199 if (device->GetSerialNumber(&serial) && !serial.empty()) { 169 rsa_key, usb_handle,
200 const UsbConfigDescriptor* config = device->GetConfiguration(); 170 base::UTF16ToASCII(usb_handle->GetDevice()->serial_number()),
201 if (config) { 171 inbound_address, outbound_address, zero_mask, interface_number));
202 scoped_refptr<UsbDeviceHandle> usb_handle = device->Open(); 172 } else {
203 if (usb_handle.get()) { 173 usb_handle->Close();
204 scoped_refptr<AndroidUsbDevice> android_device = ClaimInterface(
205 rsa_key, usb_handle, serial, config->interfaces[interface_id]);
206 if (android_device.get())
207 devices->push_back(android_device);
208 else
209 usb_handle->Close();
210 }
211 }
212 }
213 } 174 }
214 barrier.Run(); 175 barrier.Run();
215 } 176 }
216 177
217 static int CountOnFileThread() { 178 void OnDeviceOpened(AndroidUsbDevices* devices,
218 DCHECK_CURRENTLY_ON(BrowserThread::FILE); 179 crypto::RSAPrivateKey* rsa_key,
219 UsbService* service = device::DeviceClient::Get()->GetUsbService(); 180 int inbound_address,
220 UsbDevices usb_devices; 181 int outbound_address,
221 if (service != NULL) 182 int zero_mask,
222 service->GetDevices(&usb_devices); 183 int interface_number,
223 int device_count = 0; 184 const base::Closure& barrier,
224 for (const scoped_refptr<UsbDevice>& device : usb_devices) { 185 scoped_refptr<UsbDeviceHandle> usb_handle) {
225 const UsbConfigDescriptor* config = device->GetConfiguration(); 186 if (usb_handle.get()) {
226 if (config) { 187 usb_handle->ClaimInterface(
227 for (const UsbInterfaceDescriptor& iface : config->interfaces) { 188 interface_number,
228 if (IsAndroidInterface(iface)) { 189 base::Bind(&CreateDeviceOnInterfaceClaimed, devices, rsa_key,
229 ++device_count; 190 usb_handle, inbound_address, outbound_address, zero_mask,
230 } 191 interface_number, barrier));
231 } 192 } else {
232 } 193 barrier.Run();
233 } 194 }
234 return device_count;
235 } 195 }
236 196
237 static void EnumerateOnFileThread( 197 void OpenAndroidDevice(AndroidUsbDevices* devices,
198 crypto::RSAPrivateKey* rsa_key,
199 const base::Closure& barrier,
200 scoped_refptr<UsbDevice> device,
201 int interface_id,
202 bool success) {
203 if (!success) {
204 barrier.Run();
205 return;
206 }
207
208 if (device->serial_number().empty()) {
209 barrier.Run();
210 return;
211 }
212
213 const UsbConfigDescriptor* config = device->GetConfiguration();
214 if (!config) {
215 barrier.Run();
216 return;
217 }
218
219 const UsbInterfaceDescriptor& interface = config->interfaces[interface_id];
220 int inbound_address = 0;
221 int outbound_address = 0;
222 int zero_mask = 0;
223
224 for (const UsbEndpointDescriptor& endpoint : interface.endpoints) {
225 if (endpoint.transfer_type != device::USB_TRANSFER_BULK)
226 continue;
227 if (endpoint.direction == device::USB_DIRECTION_INBOUND)
228 inbound_address = endpoint.address;
229 else
230 outbound_address = endpoint.address;
231 zero_mask = endpoint.maximum_packet_size - 1;
232 }
233
234 if (inbound_address == 0 || outbound_address == 0) {
235 barrier.Run();
236 return;
237 }
238
239 device->Open(base::Bind(&OnDeviceOpened, devices, rsa_key, inbound_address,
240 outbound_address, zero_mask,
241 interface.interface_number, barrier));
242 }
243
244 void OpenAndroidDevices(
238 crypto::RSAPrivateKey* rsa_key, 245 crypto::RSAPrivateKey* rsa_key,
239 const AndroidUsbDevicesCallback& callback, 246 const AndroidUsbDevicesCallback& callback,
240 scoped_refptr<base::MessageLoopProxy> caller_message_loop_proxy) { 247 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner,
241 DCHECK_CURRENTLY_ON(BrowserThread::FILE); 248 const UsbDevices& usb_devices) {
242
243 UsbService* service = device::DeviceClient::Get()->GetUsbService();
244 UsbDevices usb_devices;
245 if (service != NULL)
246 service->GetDevices(&usb_devices);
247
248 // Add new devices. 249 // Add new devices.
249 AndroidUsbDevices* devices = new AndroidUsbDevices(); 250 AndroidUsbDevices* devices = new AndroidUsbDevices();
250 base::Closure barrier = base::BarrierClosure( 251 base::Closure barrier = base::BarrierClosure(
251 usb_devices.size(), base::Bind(&RespondOnFileThread, 252 usb_devices.size(),
252 callback, 253 base::Bind(&RespondOnUIThread, callback, devices, caller_task_runner));
253 devices,
254 caller_message_loop_proxy));
255 254
256 for (const scoped_refptr<UsbDevice>& device : usb_devices) { 255 for (const scoped_refptr<UsbDevice>& device : usb_devices) {
257 const UsbConfigDescriptor* config = device->GetConfiguration(); 256 const UsbConfigDescriptor* config = device->GetConfiguration();
258 if (!config) { 257 if (!config) {
259 barrier.Run(); 258 barrier.Run();
260 continue; 259 continue;
261 } 260 }
262 bool has_android_interface = false; 261 bool has_android_interface = false;
263 for (size_t j = 0; j < config->interfaces.size(); ++j) { 262 for (size_t j = 0; j < config->interfaces.size(); ++j) {
264 if (!IsAndroidInterface(config->interfaces[j])) { 263 if (!IsAndroidInterface(config->interfaces[j])) {
265 continue; 264 continue;
266 } 265 }
267 266
268 // Request permission on Chrome OS. 267 // Request permission on Chrome OS.
269 #if defined(OS_CHROMEOS) 268 #if defined(OS_CHROMEOS)
270 device->RequestUsbAccess( 269 device->RequestUsbAccess(j, base::Bind(&OpenAndroidDevice, devices,
271 j, base::Bind(&OpenAndroidDeviceOnFileThread, devices, rsa_key, 270 rsa_key, barrier, device, j));
272 barrier, device, j));
273 #else 271 #else
274 OpenAndroidDeviceOnFileThread(devices, rsa_key, barrier, device, j, true); 272 OpenAndroidDevice(devices, rsa_key, barrier, device, j, true);
275 #endif // defined(OS_CHROMEOS) 273 #endif // defined(OS_CHROMEOS)
276 274
277 has_android_interface = true; 275 has_android_interface = true;
278 break; 276 break;
279 } 277 }
280 if (!has_android_interface) 278 if (!has_android_interface) {
281 barrier.Run(); 279 barrier.Run();
280 }
282 } 281 }
283 } 282 }
284 283
284 void EnumerateOnUIThread(
285 crypto::RSAPrivateKey* rsa_key,
286 const AndroidUsbDevicesCallback& callback,
287 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner) {
288 DCHECK_CURRENTLY_ON(BrowserThread::UI);
289
290 UsbService* service = device::DeviceClient::Get()->GetUsbService();
291 if (service == NULL) {
292 caller_task_runner->PostTask(FROM_HERE,
293 base::Bind(callback, AndroidUsbDevices()));
294 } else {
295 service->GetDevices(
296 base::Bind(&OpenAndroidDevices, rsa_key, callback, caller_task_runner));
297 }
298 }
299
300 } // namespace
301
302 AdbMessage::AdbMessage(uint32 command,
303 uint32 arg0,
304 uint32 arg1,
305 const std::string& body)
306 : command(command), arg0(arg0), arg1(arg1), body(body) {
307 }
308
309 AdbMessage::~AdbMessage() {
310 }
311
285 // static 312 // static
286 void AndroidUsbDevice::CountDevices( 313 void AndroidUsbDevice::CountDevices(const base::Callback<void(int)>& callback) {
287 const base::Callback<void(int)>& callback) { 314 UsbService* service = device::DeviceClient::Get()->GetUsbService();
288 BrowserThread::PostTaskAndReplyWithResult( 315 if (service != NULL) {
289 BrowserThread::FILE, 316 service->GetDevices(base::Bind(&CountAndroidDevices, callback));
290 FROM_HERE, 317 } else {
291 base::Bind(&CountOnFileThread), 318 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
292 callback); 319 base::Bind(callback, 0));
320 }
293 } 321 }
294 322
295 // static 323 // static
296 void AndroidUsbDevice::Enumerate(crypto::RSAPrivateKey* rsa_key, 324 void AndroidUsbDevice::Enumerate(crypto::RSAPrivateKey* rsa_key,
297 const AndroidUsbDevicesCallback& callback) { 325 const AndroidUsbDevicesCallback& callback) {
298
299 // Collect devices with closed handles. 326 // Collect devices with closed handles.
300 for (AndroidUsbDevice* device : g_devices.Get()) { 327 for (AndroidUsbDevice* device : g_devices.Get()) {
301 if (device->usb_handle_.get()) { 328 if (device->usb_handle_.get()) {
302 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, 329 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
303 base::Bind(&AndroidUsbDevice::TerminateIfReleased, device, 330 base::Bind(&AndroidUsbDevice::TerminateIfReleased,
304 device->usb_handle_)); 331 device, device->usb_handle_));
305 } 332 }
306 } 333 }
307 334
308 // Then look for the new devices. 335 // Then look for the new devices.
309 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, 336 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
310 base::Bind(&EnumerateOnFileThread, rsa_key, callback, 337 base::Bind(&EnumerateOnUIThread, rsa_key, callback,
311 base::MessageLoopProxy::current())); 338 base::MessageLoopProxy::current()));
312 } 339 }
313 340
314 AndroidUsbDevice::AndroidUsbDevice(crypto::RSAPrivateKey* rsa_key, 341 AndroidUsbDevice::AndroidUsbDevice(crypto::RSAPrivateKey* rsa_key,
315 scoped_refptr<UsbDeviceHandle> usb_device, 342 scoped_refptr<UsbDeviceHandle> usb_device,
316 const std::string& serial, 343 const std::string& serial,
317 int inbound_address, 344 int inbound_address,
318 int outbound_address, 345 int outbound_address,
319 int zero_mask, 346 int zero_mask,
320 int interface_id) 347 int interface_id)
321 : message_loop_(NULL), 348 : rsa_key_(rsa_key->Copy()),
322 rsa_key_(rsa_key->Copy()),
323 usb_handle_(usb_device), 349 usb_handle_(usb_device),
324 serial_(serial), 350 serial_(serial),
325 inbound_address_(inbound_address), 351 inbound_address_(inbound_address),
326 outbound_address_(outbound_address), 352 outbound_address_(outbound_address),
327 zero_mask_(zero_mask), 353 zero_mask_(zero_mask),
328 interface_id_(interface_id), 354 interface_id_(interface_id),
329 is_connected_(false), 355 is_connected_(false),
330 signature_sent_(false), 356 signature_sent_(false),
331 last_socket_id_(256), 357 last_socket_id_(256),
332 weak_factory_(this) { 358 weak_factory_(this) {
333 } 359 }
334 360
335 void AndroidUsbDevice::InitOnCallerThread() { 361 void AndroidUsbDevice::InitOnCallerThread() {
336 if (message_loop_) 362 if (task_runner_)
337 return; 363 return;
338 message_loop_ = base::MessageLoop::current(); 364 task_runner_ = base::ThreadTaskRunnerHandle::Get();
339 Queue(make_scoped_ptr(new AdbMessage(AdbMessage::kCommandCNXN, kVersion, 365 Queue(make_scoped_ptr(new AdbMessage(AdbMessage::kCommandCNXN, kVersion,
340 kMaxPayload, kHostConnectMessage))); 366 kMaxPayload, kHostConnectMessage)));
341 ReadHeader(); 367 ReadHeader();
342 } 368 }
343 369
344 net::StreamSocket* AndroidUsbDevice::CreateSocket(const std::string& command) { 370 net::StreamSocket* AndroidUsbDevice::CreateSocket(const std::string& command) {
345 if (!usb_handle_.get()) 371 if (!usb_handle_.get())
346 return NULL; 372 return NULL;
347 373
348 uint32 socket_id = ++last_socket_id_; 374 uint32 socket_id = ++last_socket_id_;
349 sockets_[socket_id] = new AndroidUsbSocket(this, socket_id, command, 375 sockets_[socket_id] = new AndroidUsbSocket(this, socket_id, command,
350 base::Bind(&AndroidUsbDevice::SocketDeleted, this, socket_id)); 376 base::Bind(&AndroidUsbDevice::SocketDeleted, this, socket_id));
351 return sockets_[socket_id]; 377 return sockets_[socket_id];
352 } 378 }
353 379
354 void AndroidUsbDevice::Send(uint32 command, 380 void AndroidUsbDevice::Send(uint32 command,
355 uint32 arg0, 381 uint32 arg0,
356 uint32 arg1, 382 uint32 arg1,
357 const std::string& body) { 383 const std::string& body) {
358 scoped_ptr<AdbMessage> message(new AdbMessage(command, arg0, arg1, body)); 384 scoped_ptr<AdbMessage> message(new AdbMessage(command, arg0, arg1, body));
359 // Delay open request if not yet connected. 385 // Delay open request if not yet connected.
360 if (!is_connected_) { 386 if (!is_connected_) {
361 pending_messages_.push_back(message.release()); 387 pending_messages_.push_back(message.release());
362 return; 388 return;
363 } 389 }
364 Queue(message.Pass()); 390 Queue(message.Pass());
365 } 391 }
366 392
367 AndroidUsbDevice::~AndroidUsbDevice() { 393 AndroidUsbDevice::~AndroidUsbDevice() {
368 DCHECK(message_loop_ == base::MessageLoop::current()); 394 DCHECK(task_runner_->BelongsToCurrentThread());
369 Terminate(); 395 Terminate();
370 } 396 }
371 397
372 void AndroidUsbDevice::Queue(scoped_ptr<AdbMessage> message) { 398 void AndroidUsbDevice::Queue(scoped_ptr<AdbMessage> message) {
373 DCHECK(message_loop_ == base::MessageLoop::current()); 399 DCHECK(task_runner_->BelongsToCurrentThread());
374 400
375 // Queue header. 401 // Queue header.
376 std::vector<uint32> header; 402 std::vector<uint32> header;
377 header.push_back(message->command); 403 header.push_back(message->command);
378 header.push_back(message->arg0); 404 header.push_back(message->arg0);
379 header.push_back(message->arg1); 405 header.push_back(message->arg1);
380 bool append_zero = true; 406 bool append_zero = true;
381 if (message->body.empty()) 407 if (message->body.empty())
382 append_zero = false; 408 append_zero = false;
383 if (message->command == AdbMessage::kCommandAUTH && 409 if (message->command == AdbMessage::kCommandAUTH &&
(...skipping 21 matching lines...) Expand all
405 outgoing_queue_.push(body_buffer); 431 outgoing_queue_.push(body_buffer);
406 if (zero_mask_ && (body_length & zero_mask_) == 0) { 432 if (zero_mask_ && (body_length & zero_mask_) == 0) {
407 // Send a zero length packet. 433 // Send a zero length packet.
408 outgoing_queue_.push(new net::IOBufferWithSize(0)); 434 outgoing_queue_.push(new net::IOBufferWithSize(0));
409 } 435 }
410 } 436 }
411 ProcessOutgoing(); 437 ProcessOutgoing();
412 } 438 }
413 439
414 void AndroidUsbDevice::ProcessOutgoing() { 440 void AndroidUsbDevice::ProcessOutgoing() {
415 DCHECK(message_loop_ == base::MessageLoop::current()); 441 DCHECK(task_runner_->BelongsToCurrentThread());
416 442
417 if (outgoing_queue_.empty() || !usb_handle_.get()) 443 if (outgoing_queue_.empty() || !usb_handle_.get())
418 return; 444 return;
419 445
420 BulkMessage message = outgoing_queue_.front(); 446 BulkMessage message = outgoing_queue_.front();
421 outgoing_queue_.pop(); 447 outgoing_queue_.pop();
422 DumpMessage(true, message->data(), message->size()); 448 DumpMessage(true, message->data(), message->size());
423 usb_handle_->BulkTransfer(device::USB_DIRECTION_OUTBOUND, 449
424 outbound_address_, 450 BrowserThread::PostTask(
425 message.get(), 451 BrowserThread::UI, FROM_HERE,
426 message->size(), 452 base::Bind(&UsbDeviceHandle::BulkTransfer, usb_handle_,
427 kUsbTimeout, 453 device::USB_DIRECTION_OUTBOUND, outbound_address_, message,
428 base::Bind(&AndroidUsbDevice::OutgoingMessageSent, 454 message->size(), kUsbTimeout,
429 weak_factory_.GetWeakPtr())); 455 base::Bind(&AndroidUsbDevice::OutgoingMessageSent,
456 weak_factory_.GetWeakPtr(), task_runner_)));
430 } 457 }
431 458
432 void AndroidUsbDevice::OutgoingMessageSent(UsbTransferStatus status, 459 // static
433 scoped_refptr<net::IOBuffer> buffer, 460 void AndroidUsbDevice::OutgoingMessageSent(
434 size_t result) { 461 base::WeakPtr<AndroidUsbDevice> device,
435 DCHECK(message_loop_ == base::MessageLoop::current()); 462 scoped_refptr<base::SingleThreadTaskRunner> task_runner,
463 UsbTransferStatus status,
464 scoped_refptr<net::IOBuffer> buffer,
465 size_t result) {
466 if (status != device::USB_TRANSFER_COMPLETED) {
467 return;
468 }
436 469
437 if (status != device::USB_TRANSFER_COMPLETED) 470 task_runner->PostTask(FROM_HERE,
438 return; 471 base::Bind(&AndroidUsbDevice::ProcessOutgoing, device));
439 message_loop_->PostTask(FROM_HERE,
440 base::Bind(&AndroidUsbDevice::ProcessOutgoing, this));
441 } 472 }
442 473
443 void AndroidUsbDevice::ReadHeader() { 474 void AndroidUsbDevice::ReadHeader() {
444 DCHECK(message_loop_ == base::MessageLoop::current()); 475 DCHECK(task_runner_->BelongsToCurrentThread());
445 476
446 if (!usb_handle_.get()) 477 if (!usb_handle_.get()) {
447 return; 478 return;
479 }
480
448 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(kHeaderSize); 481 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(kHeaderSize);
449 usb_handle_->BulkTransfer( 482 BrowserThread::PostTask(
450 device::USB_DIRECTION_INBOUND, 483 BrowserThread::UI, FROM_HERE,
451 inbound_address_, 484 base::Bind(&UsbDeviceHandle::BulkTransfer, usb_handle_,
452 buffer.get(), 485 device::USB_DIRECTION_INBOUND, inbound_address_, buffer,
453 kHeaderSize, 486 kHeaderSize, kUsbTimeout,
454 kUsbTimeout, 487 base::Bind(&AndroidUsbDevice::ReceivedHeader,
455 base::Bind(&AndroidUsbDevice::ParseHeader, weak_factory_.GetWeakPtr())); 488 weak_factory_.GetWeakPtr(), task_runner_)));
489 }
490
491 // static
492 void AndroidUsbDevice::ReceivedHeader(
493 base::WeakPtr<AndroidUsbDevice> device,
494 scoped_refptr<base::SingleThreadTaskRunner> task_runner,
495 device::UsbTransferStatus status,
496 scoped_refptr<net::IOBuffer> buffer,
497 size_t result) {
498 task_runner->PostTask(FROM_HERE, base::Bind(&AndroidUsbDevice::ParseHeader,
499 device, status, buffer, result));
456 } 500 }
457 501
458 void AndroidUsbDevice::ParseHeader(UsbTransferStatus status, 502 void AndroidUsbDevice::ParseHeader(UsbTransferStatus status,
459 scoped_refptr<net::IOBuffer> buffer, 503 scoped_refptr<net::IOBuffer> buffer,
460 size_t result) { 504 size_t result) {
461 DCHECK(message_loop_ == base::MessageLoop::current()); 505 DCHECK(task_runner_->BelongsToCurrentThread());
462 506
463 if (status == device::USB_TRANSFER_TIMEOUT) { 507 if (status == device::USB_TRANSFER_TIMEOUT) {
464 message_loop_->PostTask(FROM_HERE, 508 ReadHeader();
465 base::Bind(&AndroidUsbDevice::ReadHeader, this));
466 return; 509 return;
467 } 510 }
468 511
469 if (status != device::USB_TRANSFER_COMPLETED || result != kHeaderSize) { 512 if (status != device::USB_TRANSFER_COMPLETED || result != kHeaderSize) {
470 TransferError(status); 513 TransferError(status);
471 return; 514 return;
472 } 515 }
473 516
474 DumpMessage(false, buffer->data(), result); 517 DumpMessage(false, buffer->data(), result);
475 std::vector<uint32> header(6); 518 std::vector<uint32> header(6);
476 memcpy(&header[0], buffer->data(), result); 519 memcpy(&header[0], buffer->data(), result);
477 scoped_ptr<AdbMessage> message( 520 scoped_ptr<AdbMessage> message(
478 new AdbMessage(header[0], header[1], header[2], "")); 521 new AdbMessage(header[0], header[1], header[2], ""));
479 uint32 data_length = header[3]; 522 uint32 data_length = header[3];
480 uint32 data_check = header[4]; 523 uint32 data_check = header[4];
481 uint32 magic = header[5]; 524 uint32 magic = header[5];
482 if ((message->command ^ 0xffffffff) != magic) { 525 if ((message->command ^ 0xffffffff) != magic) {
483 TransferError(device::USB_TRANSFER_ERROR); 526 TransferError(device::USB_TRANSFER_ERROR);
484 return; 527 return;
485 } 528 }
486 529
487 if (data_length == 0) { 530 if (data_length == 0) {
488 message_loop_->PostTask(FROM_HERE, 531 HandleIncoming(message.Pass());
489 base::Bind(&AndroidUsbDevice::HandleIncoming, this, 532 } else {
490 base::Passed(&message))); 533 ReadBody(message.Pass(), data_length, data_check);
491 return;
492 } 534 }
493
494 message_loop_->PostTask(FROM_HERE,
495 base::Bind(&AndroidUsbDevice::ReadBody, this,
496 base::Passed(&message), data_length, data_check));
497 } 535 }
498 536
499 void AndroidUsbDevice::ReadBody(scoped_ptr<AdbMessage> message, 537 void AndroidUsbDevice::ReadBody(scoped_ptr<AdbMessage> message,
500 uint32 data_length, 538 uint32 data_length,
501 uint32 data_check) { 539 uint32 data_check) {
502 DCHECK(message_loop_ == base::MessageLoop::current()); 540 DCHECK(task_runner_->BelongsToCurrentThread());
503 541
504 if (!usb_handle_.get()) 542 if (!usb_handle_.get()) {
505 return; 543 return;
544 }
545
506 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(data_length); 546 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(data_length);
507 usb_handle_->BulkTransfer(device::USB_DIRECTION_INBOUND, 547 BrowserThread::PostTask(
508 inbound_address_, 548 BrowserThread::UI, FROM_HERE,
509 buffer.get(), 549 base::Bind(&UsbDeviceHandle::BulkTransfer, usb_handle_,
510 data_length, 550 device::USB_DIRECTION_INBOUND, inbound_address_, buffer,
511 kUsbTimeout, 551 data_length, kUsbTimeout,
512 base::Bind(&AndroidUsbDevice::ParseBody, 552 base::Bind(&AndroidUsbDevice::ReceivedBody,
513 weak_factory_.GetWeakPtr(), 553 weak_factory_.GetWeakPtr(), task_runner_,
514 base::Passed(&message), 554 base::Passed(&message), data_length, data_check)));
515 data_length, 555 }
516 data_check)); 556
557 // static
558 void AndroidUsbDevice::ReceivedBody(
559 base::WeakPtr<AndroidUsbDevice> device,
560 scoped_refptr<base::SingleThreadTaskRunner> task_runner,
561 scoped_ptr<AdbMessage> message,
562 uint32 data_length,
563 uint32 data_check,
564 device::UsbTransferStatus status,
565 scoped_refptr<net::IOBuffer> buffer,
566 size_t result) {
567 task_runner->PostTask(
568 FROM_HERE,
569 base::Bind(&AndroidUsbDevice::ParseBody, device, base::Passed(&message),
570 data_length, data_check, status, buffer, result));
517 } 571 }
518 572
519 void AndroidUsbDevice::ParseBody(scoped_ptr<AdbMessage> message, 573 void AndroidUsbDevice::ParseBody(scoped_ptr<AdbMessage> message,
520 uint32 data_length, 574 uint32 data_length,
521 uint32 data_check, 575 uint32 data_check,
522 UsbTransferStatus status, 576 UsbTransferStatus status,
523 scoped_refptr<net::IOBuffer> buffer, 577 scoped_refptr<net::IOBuffer> buffer,
524 size_t result) { 578 size_t result) {
525 DCHECK(message_loop_ == base::MessageLoop::current()); 579 DCHECK(task_runner_->BelongsToCurrentThread());
526 580
527 if (status == device::USB_TRANSFER_TIMEOUT) { 581 if (status == device::USB_TRANSFER_TIMEOUT) {
528 message_loop_->PostTask(FROM_HERE, 582 ReadBody(message.Pass(), data_length, data_check);
529 base::Bind(&AndroidUsbDevice::ReadBody, this,
530 base::Passed(&message), data_length, data_check));
531 return; 583 return;
532 } 584 }
533 585
534 if (status != device::USB_TRANSFER_COMPLETED || 586 if (status != device::USB_TRANSFER_COMPLETED ||
535 static_cast<uint32>(result) != data_length) { 587 static_cast<uint32>(result) != data_length) {
536 TransferError(status); 588 TransferError(status);
537 return; 589 return;
538 } 590 }
539 591
540 DumpMessage(false, buffer->data(), data_length); 592 DumpMessage(false, buffer->data(), data_length);
541 message->body = std::string(buffer->data(), result); 593 message->body = std::string(buffer->data(), result);
542 if (Checksum(message->body) != data_check) { 594 if (Checksum(message->body) != data_check) {
543 TransferError(device::USB_TRANSFER_ERROR); 595 TransferError(device::USB_TRANSFER_ERROR);
544 return; 596 return;
545 } 597 }
546 598
547 message_loop_->PostTask(FROM_HERE, 599 HandleIncoming(message.Pass());
548 base::Bind(&AndroidUsbDevice::HandleIncoming, this,
549 base::Passed(&message)));
550 } 600 }
551 601
552 void AndroidUsbDevice::HandleIncoming(scoped_ptr<AdbMessage> message) { 602 void AndroidUsbDevice::HandleIncoming(scoped_ptr<AdbMessage> message) {
553 DCHECK(message_loop_ == base::MessageLoop::current()); 603 DCHECK(task_runner_->BelongsToCurrentThread());
554 604
555 switch (message->command) { 605 switch (message->command) {
556 case AdbMessage::kCommandAUTH: 606 case AdbMessage::kCommandAUTH:
557 { 607 {
558 DCHECK_EQ(message->arg0, static_cast<uint32>(AdbMessage::kAuthToken)); 608 DCHECK_EQ(message->arg0, static_cast<uint32>(AdbMessage::kAuthToken));
559 if (signature_sent_) { 609 if (signature_sent_) {
560 Queue(make_scoped_ptr(new AdbMessage( 610 Queue(make_scoped_ptr(new AdbMessage(
561 AdbMessage::kCommandAUTH, 611 AdbMessage::kCommandAUTH,
562 AdbMessage::kAuthRSAPublicKey, 0, 612 AdbMessage::kAuthRSAPublicKey, 0,
563 AndroidRSAPublicKey(rsa_key_.get())))); 613 AndroidRSAPublicKey(rsa_key_.get()))));
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
597 it->second->HandleIncoming(message.Pass()); 647 it->second->HandleIncoming(message.Pass());
598 } 648 }
599 break; 649 break;
600 default: 650 default:
601 break; 651 break;
602 } 652 }
603 ReadHeader(); 653 ReadHeader();
604 } 654 }
605 655
606 void AndroidUsbDevice::TransferError(UsbTransferStatus status) { 656 void AndroidUsbDevice::TransferError(UsbTransferStatus status) {
607 DCHECK(message_loop_ == base::MessageLoop::current()); 657 DCHECK(task_runner_->BelongsToCurrentThread());
608 658
609 message_loop_->PostTask(FROM_HERE, 659 Terminate();
610 base::Bind(&AndroidUsbDevice::Terminate, this));
611 } 660 }
612 661
613 void AndroidUsbDevice::TerminateIfReleased( 662 void AndroidUsbDevice::TerminateIfReleased(
614 scoped_refptr<UsbDeviceHandle> usb_handle) { 663 scoped_refptr<UsbDeviceHandle> usb_handle) {
615 DCHECK_CURRENTLY_ON(BrowserThread::FILE); 664 DCHECK_CURRENTLY_ON(BrowserThread::UI);
616 if (usb_handle->GetDevice().get()) 665 if (usb_handle->GetDevice().get()) {
617 return; 666 return;
618 message_loop_->PostTask(FROM_HERE, 667 }
619 base::Bind(&AndroidUsbDevice::Terminate, this)); 668
669 task_runner_->PostTask(FROM_HERE,
670 base::Bind(&AndroidUsbDevice::Terminate, this));
620 } 671 }
621 672
622 void AndroidUsbDevice::Terminate() { 673 void AndroidUsbDevice::Terminate() {
623 DCHECK(message_loop_ == base::MessageLoop::current()); 674 DCHECK(task_runner_->BelongsToCurrentThread());
624 675
625 std::vector<AndroidUsbDevice*>::iterator it = 676 std::vector<AndroidUsbDevice*>::iterator it =
626 std::find(g_devices.Get().begin(), g_devices.Get().end(), this); 677 std::find(g_devices.Get().begin(), g_devices.Get().end(), this);
627 if (it != g_devices.Get().end()) 678 if (it != g_devices.Get().end())
628 g_devices.Get().erase(it); 679 g_devices.Get().erase(it);
629 680
630 if (!usb_handle_.get()) 681 if (!usb_handle_.get())
631 return; 682 return;
632 683
633 // Make sure we zero-out handle so that closing connections did not open 684 // Make sure we zero-out handle so that closing connections did not open
634 // new connections. 685 // new connections.
635 scoped_refptr<UsbDeviceHandle> usb_handle = usb_handle_; 686 scoped_refptr<UsbDeviceHandle> usb_handle = usb_handle_;
636 usb_handle_ = NULL; 687 usb_handle_ = NULL;
637 688
638 // Iterate over copy. 689 // Iterate over copy.
639 AndroidUsbSockets sockets(sockets_); 690 AndroidUsbSockets sockets(sockets_);
640 for (AndroidUsbSockets::iterator it = sockets.begin(); 691 for (AndroidUsbSockets::iterator it = sockets.begin();
641 it != sockets.end(); ++it) { 692 it != sockets.end(); ++it) {
642 it->second->Terminated(true); 693 it->second->Terminated(true);
643 } 694 }
644 DCHECK(sockets_.empty()); 695 DCHECK(sockets_.empty());
645 696
646 BrowserThread::PostTask( 697 BrowserThread::PostTask(
647 BrowserThread::FILE, FROM_HERE, 698 BrowserThread::UI, FROM_HERE,
648 base::Bind(&ReleaseInterface, usb_handle, interface_id_)); 699 base::Bind(&ReleaseInterface, usb_handle, interface_id_));
649 } 700 }
650 701
651 void AndroidUsbDevice::SocketDeleted(uint32 socket_id) { 702 void AndroidUsbDevice::SocketDeleted(uint32 socket_id) {
652 DCHECK(message_loop_ == base::MessageLoop::current()); 703 DCHECK(task_runner_->BelongsToCurrentThread());
653 704
654 sockets_.erase(socket_id); 705 sockets_.erase(socket_id);
655 } 706 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698