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

Side by Side Diff: device/usb/usb_device_handle_impl.cc

Issue 1658953003: Revert of Update device/usb and its Mojo interface for variable size ISO packets. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 10 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
« no previous file with comments | « device/usb/usb_device_handle_impl.h ('k') | extensions/browser/api/usb/usb_api.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "device/usb/usb_device_handle_impl.h" 5 #include "device/usb/usb_device_handle_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <numeric>
9 #include <utility> 8 #include <utility>
10 #include <vector> 9 #include <vector>
11 10
12 #include "base/bind.h" 11 #include "base/bind.h"
13 #include "base/location.h" 12 #include "base/location.h"
14 #include "base/macros.h" 13 #include "base/macros.h"
15 #include "base/single_thread_task_runner.h" 14 #include "base/single_thread_task_runner.h"
16 #include "base/stl_util.h" 15 #include "base/stl_util.h"
17 #include "base/strings/string16.h" 16 #include "base/strings/string16.h"
18 #include "base/synchronization/lock.h" 17 #include "base/synchronization/lock.h"
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
114 scoped_refptr<net::IOBuffer> buffer, 113 scoped_refptr<net::IOBuffer> buffer,
115 size_t result) { 114 size_t result) {
116 if (callback_task_runner->RunsTasksOnCurrentThread()) { 115 if (callback_task_runner->RunsTasksOnCurrentThread()) {
117 callback.Run(status, buffer, result); 116 callback.Run(status, buffer, result);
118 } else { 117 } else {
119 callback_task_runner->PostTask( 118 callback_task_runner->PostTask(
120 FROM_HERE, base::Bind(callback, status, buffer, result)); 119 FROM_HERE, base::Bind(callback, status, buffer, result));
121 } 120 }
122 } 121 }
123 122
124 void ReportIsochronousTransferError(
125 scoped_refptr<base::TaskRunner> callback_task_runner,
126 const UsbDeviceHandle::IsochronousTransferCallback& callback,
127 const std::vector<uint32_t> packet_lengths,
128 UsbTransferStatus status) {
129 std::vector<UsbDeviceHandle::IsochronousPacket> packets(
130 packet_lengths.size());
131 for (size_t i = 0; i < packet_lengths.size(); ++i) {
132 packets[i].length = packet_lengths[i];
133 packets[i].transferred_length = 0;
134 packets[i].status = status;
135 }
136 if (callback_task_runner->RunsTasksOnCurrentThread()) {
137 callback.Run(nullptr, packets);
138 } else {
139 callback_task_runner->PostTask(FROM_HERE,
140 base::Bind(callback, nullptr, packets));
141 }
142 }
143
144 } // namespace 123 } // namespace
145 124
146 class UsbDeviceHandleImpl::InterfaceClaimer 125 class UsbDeviceHandleImpl::InterfaceClaimer
147 : public base::RefCountedThreadSafe<UsbDeviceHandleImpl::InterfaceClaimer> { 126 : public base::RefCountedThreadSafe<UsbDeviceHandleImpl::InterfaceClaimer> {
148 public: 127 public:
149 InterfaceClaimer(scoped_refptr<UsbDeviceHandleImpl> handle, 128 InterfaceClaimer(scoped_refptr<UsbDeviceHandleImpl> handle,
150 int interface_number); 129 int interface_number);
151 130
152 int alternate_setting() const { return alternate_setting_; } 131 int alternate_setting() const { return alternate_setting_; }
153 void set_alternate_setting(const int alternate_setting) { 132 void set_alternate_setting(const int alternate_setting) {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
205 scoped_refptr<net::IOBuffer> buffer, 184 scoped_refptr<net::IOBuffer> buffer,
206 int length, 185 int length,
207 unsigned int timeout, 186 unsigned int timeout,
208 scoped_refptr<base::TaskRunner> callback_task_runner, 187 scoped_refptr<base::TaskRunner> callback_task_runner,
209 const TransferCallback& callback); 188 const TransferCallback& callback);
210 static scoped_ptr<Transfer> CreateIsochronousTransfer( 189 static scoped_ptr<Transfer> CreateIsochronousTransfer(
211 scoped_refptr<UsbDeviceHandleImpl> device_handle, 190 scoped_refptr<UsbDeviceHandleImpl> device_handle,
212 uint8_t endpoint, 191 uint8_t endpoint,
213 scoped_refptr<net::IOBuffer> buffer, 192 scoped_refptr<net::IOBuffer> buffer,
214 size_t length, 193 size_t length,
215 const std::vector<uint32_t>& packet_lengths, 194 unsigned int packets,
195 unsigned int packet_length,
216 unsigned int timeout, 196 unsigned int timeout,
217 scoped_refptr<base::TaskRunner> callback_task_runner, 197 scoped_refptr<base::TaskRunner> task_runner,
218 const IsochronousTransferCallback& callback); 198 const TransferCallback& callback);
219 199
220 ~Transfer(); 200 ~Transfer();
221 201
222 void Submit(); 202 void Submit();
223 void Cancel(); 203 void Cancel();
224 void ProcessCompletion(); 204 void ProcessCompletion();
225 void TransferComplete(UsbTransferStatus status, size_t bytes_transferred); 205 void TransferComplete(UsbTransferStatus status, size_t bytes_transferred);
226 206
227 const UsbDeviceHandleImpl::InterfaceClaimer* claimed_interface() const { 207 const UsbDeviceHandleImpl::InterfaceClaimer* claimed_interface() const {
228 return claimed_interface_.get(); 208 return claimed_interface_.get();
229 } 209 }
230 210
231 scoped_refptr<base::TaskRunner> callback_task_runner() const { 211 scoped_refptr<base::TaskRunner> callback_task_runner() const {
232 return callback_task_runner_; 212 return callback_task_runner_;
233 } 213 }
234 214
235 private: 215 private:
236 Transfer(scoped_refptr<UsbDeviceHandleImpl> device_handle, 216 Transfer(scoped_refptr<UsbDeviceHandleImpl> device_handle,
237 scoped_refptr<InterfaceClaimer> claimed_interface, 217 scoped_refptr<InterfaceClaimer> claimed_interface,
238 UsbTransferType transfer_type, 218 UsbTransferType transfer_type,
239 scoped_refptr<net::IOBuffer> buffer, 219 scoped_refptr<net::IOBuffer> buffer,
240 size_t length, 220 size_t length,
241 scoped_refptr<base::TaskRunner> callback_task_runner, 221 scoped_refptr<base::TaskRunner> callback_task_runner,
242 const TransferCallback& callback); 222 const TransferCallback& callback);
243 Transfer(scoped_refptr<UsbDeviceHandleImpl> device_handle,
244 scoped_refptr<InterfaceClaimer> claimed_interface,
245 scoped_refptr<net::IOBuffer> buffer,
246 scoped_refptr<base::TaskRunner> callback_task_runner,
247 const IsochronousTransferCallback& callback);
248 223
249 static void LIBUSB_CALL PlatformCallback(PlatformUsbTransferHandle handle); 224 static void LIBUSB_CALL PlatformCallback(PlatformUsbTransferHandle handle);
250 225
251 void IsochronousTransferComplete();
252
253 UsbTransferType transfer_type_; 226 UsbTransferType transfer_type_;
254 scoped_refptr<UsbDeviceHandleImpl> device_handle_; 227 scoped_refptr<UsbDeviceHandleImpl> device_handle_;
255 PlatformUsbTransferHandle platform_transfer_ = nullptr; 228 PlatformUsbTransferHandle platform_transfer_ = nullptr;
256 scoped_refptr<net::IOBuffer> buffer_; 229 scoped_refptr<net::IOBuffer> buffer_;
257 scoped_refptr<UsbDeviceHandleImpl::InterfaceClaimer> claimed_interface_; 230 scoped_refptr<UsbDeviceHandleImpl::InterfaceClaimer> claimed_interface_;
258 size_t length_; 231 size_t length_;
259 bool cancelled_ = false; 232 bool cancelled_ = false;
260 scoped_refptr<base::SequencedTaskRunner> task_runner_; 233 scoped_refptr<base::SequencedTaskRunner> task_runner_;
261 scoped_refptr<base::TaskRunner> callback_task_runner_; 234 scoped_refptr<base::TaskRunner> callback_task_runner_;
262 TransferCallback callback_; 235 TransferCallback callback_;
263 IsochronousTransferCallback iso_callback_;
264 }; 236 };
265 237
266 // static 238 // static
267 scoped_ptr<UsbDeviceHandleImpl::Transfer> 239 scoped_ptr<UsbDeviceHandleImpl::Transfer>
268 UsbDeviceHandleImpl::Transfer::CreateControlTransfer( 240 UsbDeviceHandleImpl::Transfer::CreateControlTransfer(
269 scoped_refptr<UsbDeviceHandleImpl> device_handle, 241 scoped_refptr<UsbDeviceHandleImpl> device_handle,
270 uint8_t type, 242 uint8_t type,
271 uint8_t request, 243 uint8_t request,
272 uint16_t value, 244 uint16_t value,
273 uint16_t index, 245 uint16_t index,
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
310 scoped_ptr<Transfer> transfer(new Transfer( 282 scoped_ptr<Transfer> transfer(new Transfer(
311 device_handle, device_handle->GetClaimedInterfaceForEndpoint(endpoint), 283 device_handle, device_handle->GetClaimedInterfaceForEndpoint(endpoint),
312 USB_TRANSFER_BULK, buffer, length, callback_task_runner, callback)); 284 USB_TRANSFER_BULK, buffer, length, callback_task_runner, callback));
313 285
314 transfer->platform_transfer_ = libusb_alloc_transfer(0); 286 transfer->platform_transfer_ = libusb_alloc_transfer(0);
315 if (!transfer->platform_transfer_) { 287 if (!transfer->platform_transfer_) {
316 USB_LOG(ERROR) << "Failed to allocate bulk transfer."; 288 USB_LOG(ERROR) << "Failed to allocate bulk transfer.";
317 return nullptr; 289 return nullptr;
318 } 290 }
319 291
320 libusb_fill_bulk_transfer(transfer->platform_transfer_, 292 libusb_fill_bulk_transfer(
321 device_handle->handle_, endpoint, 293 transfer->platform_transfer_, device_handle->handle_, endpoint,
322 reinterpret_cast<uint8_t*>(buffer->data()), length, 294 reinterpret_cast<uint8_t*>(buffer->data()), static_cast<int>(length),
323 &UsbDeviceHandleImpl::Transfer::PlatformCallback, 295 &UsbDeviceHandleImpl::Transfer::PlatformCallback, transfer.get(),
324 transfer.get(), timeout); 296 timeout);
325 297
326 return transfer; 298 return transfer;
327 } 299 }
328 300
329 // static 301 // static
330 scoped_ptr<UsbDeviceHandleImpl::Transfer> 302 scoped_ptr<UsbDeviceHandleImpl::Transfer>
331 UsbDeviceHandleImpl::Transfer::CreateInterruptTransfer( 303 UsbDeviceHandleImpl::Transfer::CreateInterruptTransfer(
332 scoped_refptr<UsbDeviceHandleImpl> device_handle, 304 scoped_refptr<UsbDeviceHandleImpl> device_handle,
333 uint8_t endpoint, 305 uint8_t endpoint,
334 scoped_refptr<net::IOBuffer> buffer, 306 scoped_refptr<net::IOBuffer> buffer,
335 int length, 307 int length,
336 unsigned int timeout, 308 unsigned int timeout,
337 scoped_refptr<base::TaskRunner> callback_task_runner, 309 scoped_refptr<base::TaskRunner> callback_task_runner,
338 const TransferCallback& callback) { 310 const TransferCallback& callback) {
339 scoped_ptr<Transfer> transfer(new Transfer( 311 scoped_ptr<Transfer> transfer(new Transfer(
340 device_handle, device_handle->GetClaimedInterfaceForEndpoint(endpoint), 312 device_handle, device_handle->GetClaimedInterfaceForEndpoint(endpoint),
341 USB_TRANSFER_INTERRUPT, buffer, length, callback_task_runner, callback)); 313 USB_TRANSFER_INTERRUPT, buffer, length, callback_task_runner, callback));
342 314
343 transfer->platform_transfer_ = libusb_alloc_transfer(0); 315 transfer->platform_transfer_ = libusb_alloc_transfer(0);
344 if (!transfer->platform_transfer_) { 316 if (!transfer->platform_transfer_) {
345 USB_LOG(ERROR) << "Failed to allocate interrupt transfer."; 317 USB_LOG(ERROR) << "Failed to allocate interrupt transfer.";
346 return nullptr; 318 return nullptr;
347 } 319 }
348 320
349 libusb_fill_interrupt_transfer( 321 libusb_fill_interrupt_transfer(
350 transfer->platform_transfer_, device_handle->handle_, endpoint, 322 transfer->platform_transfer_, device_handle->handle_, endpoint,
351 reinterpret_cast<uint8_t*>(buffer->data()), length, 323 reinterpret_cast<uint8_t*>(buffer->data()), static_cast<int>(length),
352 &UsbDeviceHandleImpl::Transfer::PlatformCallback, transfer.get(), 324 &UsbDeviceHandleImpl::Transfer::PlatformCallback, transfer.get(),
353 timeout); 325 timeout);
354 326
355 return transfer; 327 return transfer;
356 } 328 }
357 329
358 // static 330 // static
359 scoped_ptr<UsbDeviceHandleImpl::Transfer> 331 scoped_ptr<UsbDeviceHandleImpl::Transfer>
360 UsbDeviceHandleImpl::Transfer::CreateIsochronousTransfer( 332 UsbDeviceHandleImpl::Transfer::CreateIsochronousTransfer(
361 scoped_refptr<UsbDeviceHandleImpl> device_handle, 333 scoped_refptr<UsbDeviceHandleImpl> device_handle,
362 uint8_t endpoint, 334 uint8_t endpoint,
363 scoped_refptr<net::IOBuffer> buffer, 335 scoped_refptr<net::IOBuffer> buffer,
364 size_t length, 336 size_t length,
365 const std::vector<uint32_t>& packet_lengths, 337 unsigned int packets,
338 unsigned int packet_length,
366 unsigned int timeout, 339 unsigned int timeout,
367 scoped_refptr<base::TaskRunner> callback_task_runner, 340 scoped_refptr<base::TaskRunner> callback_task_runner,
368 const IsochronousTransferCallback& callback) { 341 const TransferCallback& callback) {
342 DCHECK(packets <= length && (packets * packet_length) <= length)
343 << "transfer length is too small";
344
369 scoped_ptr<Transfer> transfer(new Transfer( 345 scoped_ptr<Transfer> transfer(new Transfer(
370 device_handle, device_handle->GetClaimedInterfaceForEndpoint(endpoint), 346 device_handle, device_handle->GetClaimedInterfaceForEndpoint(endpoint),
371 buffer, callback_task_runner, callback)); 347 USB_TRANSFER_ISOCHRONOUS, buffer, length, callback_task_runner,
348 callback));
372 349
373 int num_packets = static_cast<int>(packet_lengths.size()); 350 transfer->platform_transfer_ = libusb_alloc_transfer(packets);
374 transfer->platform_transfer_ = libusb_alloc_transfer(num_packets);
375 if (!transfer->platform_transfer_) { 351 if (!transfer->platform_transfer_) {
376 USB_LOG(ERROR) << "Failed to allocate isochronous transfer."; 352 USB_LOG(ERROR) << "Failed to allocate isochronous transfer.";
377 return nullptr; 353 return nullptr;
378 } 354 }
379 355
380 libusb_fill_iso_transfer( 356 libusb_fill_iso_transfer(
381 transfer->platform_transfer_, device_handle->handle_, endpoint, 357 transfer->platform_transfer_, device_handle->handle_, endpoint,
382 reinterpret_cast<uint8_t*>(buffer->data()), static_cast<int>(length), 358 reinterpret_cast<uint8_t*>(buffer->data()), static_cast<int>(length),
383 num_packets, &Transfer::PlatformCallback, transfer.get(), timeout); 359 packets, &Transfer::PlatformCallback, transfer.get(), timeout);
384 360 libusb_set_iso_packet_lengths(transfer->platform_transfer_, packet_length);
385 for (size_t i = 0; i < packet_lengths.size(); ++i)
386 transfer->platform_transfer_->iso_packet_desc[i].length = packet_lengths[i];
387 361
388 return transfer; 362 return transfer;
389 } 363 }
390 364
391 UsbDeviceHandleImpl::Transfer::Transfer( 365 UsbDeviceHandleImpl::Transfer::Transfer(
392 scoped_refptr<UsbDeviceHandleImpl> device_handle, 366 scoped_refptr<UsbDeviceHandleImpl> device_handle,
393 scoped_refptr<InterfaceClaimer> claimed_interface, 367 scoped_refptr<InterfaceClaimer> claimed_interface,
394 UsbTransferType transfer_type, 368 UsbTransferType transfer_type,
395 scoped_refptr<net::IOBuffer> buffer, 369 scoped_refptr<net::IOBuffer> buffer,
396 size_t length, 370 size_t length,
397 scoped_refptr<base::TaskRunner> callback_task_runner, 371 scoped_refptr<base::TaskRunner> callback_task_runner,
398 const TransferCallback& callback) 372 const TransferCallback& callback)
399 : transfer_type_(transfer_type), 373 : transfer_type_(transfer_type),
400 device_handle_(device_handle), 374 device_handle_(device_handle),
401 buffer_(buffer), 375 buffer_(buffer),
402 claimed_interface_(claimed_interface), 376 claimed_interface_(claimed_interface),
403 length_(length), 377 length_(length),
404 callback_task_runner_(callback_task_runner), 378 callback_task_runner_(callback_task_runner),
405 callback_(callback) { 379 callback_(callback) {
406 task_runner_ = base::ThreadTaskRunnerHandle::Get(); 380 task_runner_ = base::ThreadTaskRunnerHandle::Get();
407 } 381 }
408 382
409 UsbDeviceHandleImpl::Transfer::Transfer(
410 scoped_refptr<UsbDeviceHandleImpl> device_handle,
411 scoped_refptr<InterfaceClaimer> claimed_interface,
412 scoped_refptr<net::IOBuffer> buffer,
413 scoped_refptr<base::TaskRunner> callback_task_runner,
414 const IsochronousTransferCallback& callback)
415 : transfer_type_(USB_TRANSFER_ISOCHRONOUS),
416 device_handle_(device_handle),
417 buffer_(buffer),
418 claimed_interface_(claimed_interface),
419 callback_task_runner_(callback_task_runner),
420 iso_callback_(callback) {
421 task_runner_ = base::ThreadTaskRunnerHandle::Get();
422 }
423
424 UsbDeviceHandleImpl::Transfer::~Transfer() { 383 UsbDeviceHandleImpl::Transfer::~Transfer() {
425 if (platform_transfer_) { 384 if (platform_transfer_) {
426 libusb_free_transfer(platform_transfer_); 385 libusb_free_transfer(platform_transfer_);
427 } 386 }
428 } 387 }
429 388
430 void UsbDeviceHandleImpl::Transfer::Submit() { 389 void UsbDeviceHandleImpl::Transfer::Submit() {
431 const int rv = libusb_submit_transfer(platform_transfer_); 390 const int rv = libusb_submit_transfer(platform_transfer_);
432 if (rv != LIBUSB_SUCCESS) { 391 if (rv != LIBUSB_SUCCESS) {
433 USB_LOG(EVENT) << "Failed to submit transfer: " 392 USB_LOG(EVENT) << "Failed to submit transfer: "
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
465 if (length_ >= (LIBUSB_CONTROL_SETUP_SIZE + actual_length)) { 424 if (length_ >= (LIBUSB_CONTROL_SETUP_SIZE + actual_length)) {
466 // If the payload is zero bytes long, pad out the allocated buffer 425 // If the payload is zero bytes long, pad out the allocated buffer
467 // size to one byte so that an IOBuffer of that size can be allocated. 426 // size to one byte so that an IOBuffer of that size can be allocated.
468 scoped_refptr<net::IOBuffer> resized_buffer = new net::IOBuffer( 427 scoped_refptr<net::IOBuffer> resized_buffer = new net::IOBuffer(
469 std::max(actual_length, static_cast<size_t>(1))); 428 std::max(actual_length, static_cast<size_t>(1)));
470 memcpy(resized_buffer->data(), 429 memcpy(resized_buffer->data(),
471 buffer_->data() + LIBUSB_CONTROL_SETUP_SIZE, actual_length); 430 buffer_->data() + LIBUSB_CONTROL_SETUP_SIZE, actual_length);
472 buffer_ = resized_buffer; 431 buffer_ = resized_buffer;
473 } 432 }
474 } 433 }
475 // Fall through! 434 break;
435
436 case USB_TRANSFER_ISOCHRONOUS:
437 // Isochronous replies might carry data in the different isoc packets even
438 // if the transfer actual_data value is zero. Furthermore, not all of the
439 // received packets might contain data, so we need to calculate how many
440 // data bytes we are effectively providing and pack the results.
441 if (actual_length == 0) {
442 size_t packet_buffer_start = 0;
443 for (int i = 0; i < platform_transfer_->num_iso_packets; ++i) {
444 PlatformUsbIsoPacketDescriptor packet =
445 &platform_transfer_->iso_packet_desc[i];
446 if (packet->actual_length > 0) {
447 // We don't need to copy as long as all packets until now provide
448 // all the data the packet can hold.
449 if (actual_length < packet_buffer_start) {
450 CHECK(packet_buffer_start + packet->actual_length <= length_);
451 memmove(buffer_->data() + actual_length,
452 buffer_->data() + packet_buffer_start,
453 packet->actual_length);
454 }
455 actual_length += packet->actual_length;
456 }
457
458 packet_buffer_start += packet->length;
459 }
460 }
461 break;
476 462
477 case USB_TRANSFER_BULK: 463 case USB_TRANSFER_BULK:
478 case USB_TRANSFER_INTERRUPT: 464 case USB_TRANSFER_INTERRUPT:
479 TransferComplete(ConvertTransferStatus(platform_transfer_->status),
480 actual_length);
481 break;
482
483 case USB_TRANSFER_ISOCHRONOUS:
484 IsochronousTransferComplete();
485 break; 465 break;
486 466
487 default: 467 default:
488 NOTREACHED() << "Invalid usb transfer type"; 468 NOTREACHED() << "Invalid usb transfer type";
489 break; 469 break;
490 } 470 }
471
472 TransferComplete(ConvertTransferStatus(platform_transfer_->status),
473 actual_length);
491 } 474 }
492 475
493 /* static */ 476 /* static */
494 void LIBUSB_CALL UsbDeviceHandleImpl::Transfer::PlatformCallback( 477 void LIBUSB_CALL UsbDeviceHandleImpl::Transfer::PlatformCallback(
495 PlatformUsbTransferHandle platform_transfer) { 478 PlatformUsbTransferHandle platform_transfer) {
496 Transfer* transfer = 479 Transfer* transfer =
497 reinterpret_cast<Transfer*>(platform_transfer->user_data); 480 reinterpret_cast<Transfer*>(platform_transfer->user_data);
498 DCHECK(transfer->platform_transfer_ == platform_transfer); 481 DCHECK(transfer->platform_transfer_ == platform_transfer);
499 transfer->ProcessCompletion(); 482 transfer->ProcessCompletion();
500 } 483 }
501 484
502 void UsbDeviceHandleImpl::Transfer::TransferComplete(UsbTransferStatus status, 485 void UsbDeviceHandleImpl::Transfer::TransferComplete(UsbTransferStatus status,
503 size_t bytes_transferred) { 486 size_t bytes_transferred) {
504 base::Closure closure;
505 if (transfer_type_ == USB_TRANSFER_ISOCHRONOUS) {
506 DCHECK_NE(LIBUSB_TRANSFER_COMPLETED, platform_transfer_->status);
507 std::vector<IsochronousPacket> packets(platform_transfer_->num_iso_packets);
508 for (size_t i = 0; i < packets.size(); ++i) {
509 packets[i].length = platform_transfer_->iso_packet_desc[i].length;
510 packets[i].transferred_length = 0;
511 packets[i].status = status;
512 }
513 closure = base::Bind(iso_callback_, buffer_, packets);
514 } else {
515 closure = base::Bind(callback_, status, buffer_, bytes_transferred);
516 }
517 task_runner_->PostTask( 487 task_runner_->PostTask(
518 FROM_HERE, base::Bind(&UsbDeviceHandleImpl::TransferComplete, 488 FROM_HERE,
519 device_handle_, base::Unretained(this), closure)); 489 base::Bind(&UsbDeviceHandleImpl::TransferComplete, device_handle_,
520 } 490 base::Unretained(this),
521 491 base::Bind(callback_, status, buffer_, bytes_transferred)));
522 void UsbDeviceHandleImpl::Transfer::IsochronousTransferComplete() {
523 std::vector<IsochronousPacket> packets(platform_transfer_->num_iso_packets);
524 for (size_t i = 0; i < packets.size(); ++i) {
525 packets[i].length = platform_transfer_->iso_packet_desc[i].length;
526 packets[i].transferred_length =
527 platform_transfer_->iso_packet_desc[i].actual_length;
528 packets[i].status =
529 ConvertTransferStatus(platform_transfer_->iso_packet_desc[i].status);
530 }
531 task_runner_->PostTask(
532 FROM_HERE, base::Bind(&UsbDeviceHandleImpl::TransferComplete,
533 device_handle_, base::Unretained(this),
534 base::Bind(iso_callback_, buffer_, packets)));
535 } 492 }
536 493
537 scoped_refptr<UsbDevice> UsbDeviceHandleImpl::GetDevice() const { 494 scoped_refptr<UsbDevice> UsbDeviceHandleImpl::GetDevice() const {
538 return device_; 495 return device_;
539 } 496 }
540 497
541 void UsbDeviceHandleImpl::Close() { 498 void UsbDeviceHandleImpl::Close() {
542 DCHECK(thread_checker_.CalledOnValidThread()); 499 DCHECK(thread_checker_.CalledOnValidThread());
543 if (device_) 500 if (device_)
544 device_->Close(this); 501 device_->Close(this);
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
668 callback); 625 callback);
669 } else { 626 } else {
670 task_runner_->PostTask( 627 task_runner_->PostTask(
671 FROM_HERE, base::Bind(&UsbDeviceHandleImpl::ControlTransferInternal, 628 FROM_HERE, base::Bind(&UsbDeviceHandleImpl::ControlTransferInternal,
672 this, direction, request_type, recipient, request, 629 this, direction, request_type, recipient, request,
673 value, index, buffer, length, timeout, 630 value, index, buffer, length, timeout,
674 base::ThreadTaskRunnerHandle::Get(), callback)); 631 base::ThreadTaskRunnerHandle::Get(), callback));
675 } 632 }
676 } 633 }
677 634
678 void UsbDeviceHandleImpl::IsochronousTransferIn( 635 void UsbDeviceHandleImpl::IsochronousTransfer(
636 UsbEndpointDirection direction,
679 uint8_t endpoint_number, 637 uint8_t endpoint_number,
680 const std::vector<uint32_t>& packet_lengths, 638 scoped_refptr<net::IOBuffer> buffer,
639 size_t length,
640 unsigned int packets,
641 unsigned int packet_length,
681 unsigned int timeout, 642 unsigned int timeout,
682 const IsochronousTransferCallback& callback) { 643 const TransferCallback& callback) {
683 uint8_t endpoint_address = 644 uint8_t endpoint_address =
684 ConvertTransferDirection(USB_DIRECTION_INBOUND) | endpoint_number; 645 ConvertTransferDirection(direction) | endpoint_number;
685 if (task_runner_->BelongsToCurrentThread()) { 646 if (task_runner_->BelongsToCurrentThread()) {
686 IsochronousTransferInInternal(endpoint_address, packet_lengths, timeout, 647 IsochronousTransferInternal(endpoint_address, buffer, length, packets,
687 task_runner_, callback); 648 packet_length, timeout, task_runner_, callback);
688 } else { 649 } else {
689 task_runner_->PostTask( 650 task_runner_->PostTask(
690 FROM_HERE, 651 FROM_HERE,
691 base::Bind(&UsbDeviceHandleImpl::IsochronousTransferInInternal, this, 652 base::Bind(&UsbDeviceHandleImpl::IsochronousTransferInternal, this,
692 endpoint_address, packet_lengths, timeout, 653 endpoint_address, buffer, length, packets, packet_length,
693 base::ThreadTaskRunnerHandle::Get(), callback)); 654 timeout, base::ThreadTaskRunnerHandle::Get(), callback));
694 } 655 }
695 } 656 }
696 657
697 void UsbDeviceHandleImpl::IsochronousTransferOut(
698 uint8_t endpoint_number,
699 scoped_refptr<net::IOBuffer> buffer,
700 const std::vector<uint32_t>& packet_lengths,
701 unsigned int timeout,
702 const IsochronousTransferCallback& callback) {
703 uint8_t endpoint_address =
704 ConvertTransferDirection(USB_DIRECTION_OUTBOUND) | endpoint_number;
705 if (task_runner_->BelongsToCurrentThread()) {
706 IsochronousTransferOutInternal(endpoint_address, buffer, packet_lengths,
707 timeout, task_runner_, callback);
708 } else {
709 task_runner_->PostTask(
710 FROM_HERE,
711 base::Bind(&UsbDeviceHandleImpl::IsochronousTransferOutInternal, this,
712 endpoint_address, buffer, packet_lengths, timeout,
713 base::ThreadTaskRunnerHandle::Get(), callback));
714 }
715 }
716
717 void UsbDeviceHandleImpl::GenericTransfer(UsbEndpointDirection direction, 658 void UsbDeviceHandleImpl::GenericTransfer(UsbEndpointDirection direction,
718 uint8_t endpoint_number, 659 uint8_t endpoint_number,
719 scoped_refptr<net::IOBuffer> buffer, 660 scoped_refptr<net::IOBuffer> buffer,
720 size_t length, 661 size_t length,
721 unsigned int timeout, 662 unsigned int timeout,
722 const TransferCallback& callback) { 663 const TransferCallback& callback) {
723 uint8_t endpoint_address = 664 uint8_t endpoint_address =
724 ConvertTransferDirection(direction) | endpoint_number; 665 ConvertTransferDirection(direction) | endpoint_number;
725 if (task_runner_->BelongsToCurrentThread()) { 666 if (task_runner_->BelongsToCurrentThread()) {
726 GenericTransferInternal(endpoint_address, buffer, length, timeout, 667 GenericTransferInternal(endpoint_address, buffer, length, timeout,
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
938 callback_task_runner, callback); 879 callback_task_runner, callback);
939 if (!transfer) { 880 if (!transfer) {
940 RunTransferCallback(callback_task_runner, callback, USB_TRANSFER_ERROR, 881 RunTransferCallback(callback_task_runner, callback, USB_TRANSFER_ERROR,
941 buffer, 0); 882 buffer, 0);
942 return; 883 return;
943 } 884 }
944 885
945 SubmitTransfer(std::move(transfer)); 886 SubmitTransfer(std::move(transfer));
946 } 887 }
947 888
948 void UsbDeviceHandleImpl::IsochronousTransferInInternal( 889 void UsbDeviceHandleImpl::IsochronousTransferInternal(
949 uint8_t endpoint_address, 890 uint8_t endpoint_address,
950 const std::vector<uint32_t>& packet_lengths, 891 scoped_refptr<net::IOBuffer> buffer,
892 size_t length,
893 unsigned int packets,
894 unsigned int packet_length,
951 unsigned int timeout, 895 unsigned int timeout,
952 scoped_refptr<base::TaskRunner> callback_task_runner, 896 scoped_refptr<base::TaskRunner> callback_task_runner,
953 const IsochronousTransferCallback& callback) { 897 const TransferCallback& callback) {
954 DCHECK(thread_checker_.CalledOnValidThread()); 898 DCHECK(thread_checker_.CalledOnValidThread());
955 899
956 if (!device_) { 900 if (!device_) {
957 ReportIsochronousTransferError(callback_task_runner, callback, 901 RunTransferCallback(callback_task_runner, callback, USB_TRANSFER_DISCONNECT,
958 packet_lengths, USB_TRANSFER_DISCONNECT); 902 buffer, 0);
959 return; 903 return;
960 } 904 }
961 905
962 size_t length = 906 if (!base::IsValueInRangeForNumericType<int>(length)) {
963 std::accumulate(packet_lengths.begin(), packet_lengths.end(), 0u); 907 USB_LOG(USER) << "Transfer too long.";
964 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(length)); 908 RunTransferCallback(callback_task_runner, callback, USB_TRANSFER_ERROR,
909 buffer, 0);
910 return;
911 }
912
965 scoped_ptr<Transfer> transfer = Transfer::CreateIsochronousTransfer( 913 scoped_ptr<Transfer> transfer = Transfer::CreateIsochronousTransfer(
966 this, endpoint_address, buffer, length, packet_lengths, timeout, 914 this, endpoint_address, buffer, static_cast<int>(length), packets,
967 callback_task_runner, callback); 915 packet_length, timeout, callback_task_runner, callback);
968 916
969 SubmitTransfer(std::move(transfer)); 917 SubmitTransfer(std::move(transfer));
970 } 918 }
971
972 void UsbDeviceHandleImpl::IsochronousTransferOutInternal(
973 uint8_t endpoint_address,
974 scoped_refptr<net::IOBuffer> buffer,
975 const std::vector<uint32_t>& packet_lengths,
976 unsigned int timeout,
977 scoped_refptr<base::TaskRunner> callback_task_runner,
978 const IsochronousTransferCallback& callback) {
979 DCHECK(thread_checker_.CalledOnValidThread());
980
981 if (!device_) {
982 ReportIsochronousTransferError(callback_task_runner, callback,
983 packet_lengths, USB_TRANSFER_DISCONNECT);
984 return;
985 }
986
987 size_t length =
988 std::accumulate(packet_lengths.begin(), packet_lengths.end(), 0u);
989 scoped_ptr<Transfer> transfer = Transfer::CreateIsochronousTransfer(
990 this, endpoint_address, buffer, length, packet_lengths, timeout,
991 callback_task_runner, callback);
992
993 SubmitTransfer(std::move(transfer));
994 }
995 919
996 void UsbDeviceHandleImpl::GenericTransferInternal( 920 void UsbDeviceHandleImpl::GenericTransferInternal(
997 uint8_t endpoint_address, 921 uint8_t endpoint_address,
998 scoped_refptr<net::IOBuffer> buffer, 922 scoped_refptr<net::IOBuffer> buffer,
999 size_t length, 923 size_t length,
1000 unsigned int timeout, 924 unsigned int timeout,
1001 scoped_refptr<base::TaskRunner> callback_task_runner, 925 scoped_refptr<base::TaskRunner> callback_task_runner,
1002 const TransferCallback& callback) { 926 const TransferCallback& callback) {
1003 DCHECK(thread_checker_.CalledOnValidThread()); 927 DCHECK(thread_checker_.CalledOnValidThread());
1004 928
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
1088 // Attempt-release all the interfaces. 1012 // Attempt-release all the interfaces.
1089 // It will be retained until the transfer cancellation is finished. 1013 // It will be retained until the transfer cancellation is finished.
1090 claimed_interfaces_.clear(); 1014 claimed_interfaces_.clear();
1091 1015
1092 // Cannot close device handle here. Need to wait for libusb_cancel_transfer to 1016 // Cannot close device handle here. Need to wait for libusb_cancel_transfer to
1093 // finish. 1017 // finish.
1094 device_ = NULL; 1018 device_ = NULL;
1095 } 1019 }
1096 1020
1097 } // namespace device 1021 } // namespace device
OLDNEW
« no previous file with comments | « device/usb/usb_device_handle_impl.h ('k') | extensions/browser/api/usb/usb_api.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698