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

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

Issue 1874313002: Convert device to std::unique_ptr (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: . Created 4 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
« no previous file with comments | « device/usb/usb_device_handle_impl.h ('k') | device/usb/usb_device_handle_unittest.cc » ('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 <memory>
8 #include <numeric> 9 #include <numeric>
9 #include <utility> 10 #include <utility>
10 #include <vector> 11 #include <vector>
11 12
12 #include "base/bind.h" 13 #include "base/bind.h"
13 #include "base/location.h" 14 #include "base/location.h"
14 #include "base/macros.h" 15 #include "base/macros.h"
15 #include "base/single_thread_task_runner.h" 16 #include "base/single_thread_task_runner.h"
16 #include "base/stl_util.h" 17 #include "base/stl_util.h"
17 #include "base/strings/string16.h" 18 #include "base/strings/string16.h"
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
193 if (!release_callback_.is_null()) { 194 if (!release_callback_.is_null()) {
194 task_runner_->PostTask(FROM_HERE, 195 task_runner_->PostTask(FROM_HERE,
195 base::Bind(release_callback_, rc == LIBUSB_SUCCESS)); 196 base::Bind(release_callback_, rc == LIBUSB_SUCCESS));
196 } 197 }
197 } 198 }
198 199
199 // This inner class owns the underlying libusb_transfer and may outlast 200 // This inner class owns the underlying libusb_transfer and may outlast
200 // the UsbDeviceHandle that created it. 201 // the UsbDeviceHandle that created it.
201 class UsbDeviceHandleImpl::Transfer { 202 class UsbDeviceHandleImpl::Transfer {
202 public: 203 public:
203 static scoped_ptr<Transfer> CreateControlTransfer( 204 static std::unique_ptr<Transfer> CreateControlTransfer(
204 scoped_refptr<UsbDeviceHandleImpl> device_handle, 205 scoped_refptr<UsbDeviceHandleImpl> device_handle,
205 uint8_t type, 206 uint8_t type,
206 uint8_t request, 207 uint8_t request,
207 uint16_t value, 208 uint16_t value,
208 uint16_t index, 209 uint16_t index,
209 uint16_t length, 210 uint16_t length,
210 scoped_refptr<net::IOBuffer> buffer, 211 scoped_refptr<net::IOBuffer> buffer,
211 unsigned int timeout, 212 unsigned int timeout,
212 scoped_refptr<base::TaskRunner> callback_task_runner, 213 scoped_refptr<base::TaskRunner> callback_task_runner,
213 const TransferCallback& callback); 214 const TransferCallback& callback);
214 static scoped_ptr<Transfer> CreateBulkTransfer( 215 static std::unique_ptr<Transfer> CreateBulkTransfer(
215 scoped_refptr<UsbDeviceHandleImpl> device_handle, 216 scoped_refptr<UsbDeviceHandleImpl> device_handle,
216 uint8_t endpoint, 217 uint8_t endpoint,
217 scoped_refptr<net::IOBuffer> buffer, 218 scoped_refptr<net::IOBuffer> buffer,
218 int length, 219 int length,
219 unsigned int timeout, 220 unsigned int timeout,
220 scoped_refptr<base::TaskRunner> callback_task_runner, 221 scoped_refptr<base::TaskRunner> callback_task_runner,
221 const TransferCallback& callback); 222 const TransferCallback& callback);
222 static scoped_ptr<Transfer> CreateInterruptTransfer( 223 static std::unique_ptr<Transfer> CreateInterruptTransfer(
223 scoped_refptr<UsbDeviceHandleImpl> device_handle, 224 scoped_refptr<UsbDeviceHandleImpl> device_handle,
224 uint8_t endpoint, 225 uint8_t endpoint,
225 scoped_refptr<net::IOBuffer> buffer, 226 scoped_refptr<net::IOBuffer> buffer,
226 int length, 227 int length,
227 unsigned int timeout, 228 unsigned int timeout,
228 scoped_refptr<base::TaskRunner> callback_task_runner, 229 scoped_refptr<base::TaskRunner> callback_task_runner,
229 const TransferCallback& callback); 230 const TransferCallback& callback);
230 static scoped_ptr<Transfer> CreateIsochronousTransfer( 231 static std::unique_ptr<Transfer> CreateIsochronousTransfer(
231 scoped_refptr<UsbDeviceHandleImpl> device_handle, 232 scoped_refptr<UsbDeviceHandleImpl> device_handle,
232 uint8_t endpoint, 233 uint8_t endpoint,
233 scoped_refptr<net::IOBuffer> buffer, 234 scoped_refptr<net::IOBuffer> buffer,
234 size_t length, 235 size_t length,
235 const std::vector<uint32_t>& packet_lengths, 236 const std::vector<uint32_t>& packet_lengths,
236 unsigned int timeout, 237 unsigned int timeout,
237 scoped_refptr<base::TaskRunner> callback_task_runner, 238 scoped_refptr<base::TaskRunner> callback_task_runner,
238 const IsochronousTransferCallback& callback); 239 const IsochronousTransferCallback& callback);
239 240
240 ~Transfer(); 241 ~Transfer();
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
277 scoped_refptr<UsbDeviceHandleImpl::InterfaceClaimer> claimed_interface_; 278 scoped_refptr<UsbDeviceHandleImpl::InterfaceClaimer> claimed_interface_;
278 size_t length_; 279 size_t length_;
279 bool cancelled_ = false; 280 bool cancelled_ = false;
280 scoped_refptr<base::SequencedTaskRunner> task_runner_; 281 scoped_refptr<base::SequencedTaskRunner> task_runner_;
281 scoped_refptr<base::TaskRunner> callback_task_runner_; 282 scoped_refptr<base::TaskRunner> callback_task_runner_;
282 TransferCallback callback_; 283 TransferCallback callback_;
283 IsochronousTransferCallback iso_callback_; 284 IsochronousTransferCallback iso_callback_;
284 }; 285 };
285 286
286 // static 287 // static
287 scoped_ptr<UsbDeviceHandleImpl::Transfer> 288 std::unique_ptr<UsbDeviceHandleImpl::Transfer>
288 UsbDeviceHandleImpl::Transfer::CreateControlTransfer( 289 UsbDeviceHandleImpl::Transfer::CreateControlTransfer(
289 scoped_refptr<UsbDeviceHandleImpl> device_handle, 290 scoped_refptr<UsbDeviceHandleImpl> device_handle,
290 uint8_t type, 291 uint8_t type,
291 uint8_t request, 292 uint8_t request,
292 uint16_t value, 293 uint16_t value,
293 uint16_t index, 294 uint16_t index,
294 uint16_t length, 295 uint16_t length,
295 scoped_refptr<net::IOBuffer> buffer, 296 scoped_refptr<net::IOBuffer> buffer,
296 unsigned int timeout, 297 unsigned int timeout,
297 scoped_refptr<base::TaskRunner> callback_task_runner, 298 scoped_refptr<base::TaskRunner> callback_task_runner,
298 const TransferCallback& callback) { 299 const TransferCallback& callback) {
299 scoped_ptr<Transfer> transfer(new Transfer( 300 std::unique_ptr<Transfer> transfer(new Transfer(
300 device_handle, nullptr, USB_TRANSFER_CONTROL, buffer, 301 device_handle, nullptr, USB_TRANSFER_CONTROL, buffer,
301 length + LIBUSB_CONTROL_SETUP_SIZE, callback_task_runner, callback)); 302 length + LIBUSB_CONTROL_SETUP_SIZE, callback_task_runner, callback));
302 303
303 transfer->platform_transfer_ = libusb_alloc_transfer(0); 304 transfer->platform_transfer_ = libusb_alloc_transfer(0);
304 if (!transfer->platform_transfer_) { 305 if (!transfer->platform_transfer_) {
305 USB_LOG(ERROR) << "Failed to allocate control transfer."; 306 USB_LOG(ERROR) << "Failed to allocate control transfer.";
306 return nullptr; 307 return nullptr;
307 } 308 }
308 309
309 libusb_fill_control_setup(reinterpret_cast<uint8_t*>(buffer->data()), type, 310 libusb_fill_control_setup(reinterpret_cast<uint8_t*>(buffer->data()), type,
310 request, value, index, length); 311 request, value, index, length);
311 libusb_fill_control_transfer(transfer->platform_transfer_, 312 libusb_fill_control_transfer(transfer->platform_transfer_,
312 device_handle->handle_, 313 device_handle->handle_,
313 reinterpret_cast<uint8_t*>(buffer->data()), 314 reinterpret_cast<uint8_t*>(buffer->data()),
314 &UsbDeviceHandleImpl::Transfer::PlatformCallback, 315 &UsbDeviceHandleImpl::Transfer::PlatformCallback,
315 transfer.get(), timeout); 316 transfer.get(), timeout);
316 317
317 return transfer; 318 return transfer;
318 } 319 }
319 320
320 // static 321 // static
321 scoped_ptr<UsbDeviceHandleImpl::Transfer> 322 std::unique_ptr<UsbDeviceHandleImpl::Transfer>
322 UsbDeviceHandleImpl::Transfer::CreateBulkTransfer( 323 UsbDeviceHandleImpl::Transfer::CreateBulkTransfer(
323 scoped_refptr<UsbDeviceHandleImpl> device_handle, 324 scoped_refptr<UsbDeviceHandleImpl> device_handle,
324 uint8_t endpoint, 325 uint8_t endpoint,
325 scoped_refptr<net::IOBuffer> buffer, 326 scoped_refptr<net::IOBuffer> buffer,
326 int length, 327 int length,
327 unsigned int timeout, 328 unsigned int timeout,
328 scoped_refptr<base::TaskRunner> callback_task_runner, 329 scoped_refptr<base::TaskRunner> callback_task_runner,
329 const TransferCallback& callback) { 330 const TransferCallback& callback) {
330 scoped_ptr<Transfer> transfer(new Transfer( 331 std::unique_ptr<Transfer> transfer(new Transfer(
331 device_handle, device_handle->GetClaimedInterfaceForEndpoint(endpoint), 332 device_handle, device_handle->GetClaimedInterfaceForEndpoint(endpoint),
332 USB_TRANSFER_BULK, buffer, length, callback_task_runner, callback)); 333 USB_TRANSFER_BULK, buffer, length, callback_task_runner, callback));
333 334
334 transfer->platform_transfer_ = libusb_alloc_transfer(0); 335 transfer->platform_transfer_ = libusb_alloc_transfer(0);
335 if (!transfer->platform_transfer_) { 336 if (!transfer->platform_transfer_) {
336 USB_LOG(ERROR) << "Failed to allocate bulk transfer."; 337 USB_LOG(ERROR) << "Failed to allocate bulk transfer.";
337 return nullptr; 338 return nullptr;
338 } 339 }
339 340
340 libusb_fill_bulk_transfer(transfer->platform_transfer_, 341 libusb_fill_bulk_transfer(transfer->platform_transfer_,
341 device_handle->handle_, endpoint, 342 device_handle->handle_, endpoint,
342 reinterpret_cast<uint8_t*>(buffer->data()), length, 343 reinterpret_cast<uint8_t*>(buffer->data()), length,
343 &UsbDeviceHandleImpl::Transfer::PlatformCallback, 344 &UsbDeviceHandleImpl::Transfer::PlatformCallback,
344 transfer.get(), timeout); 345 transfer.get(), timeout);
345 346
346 return transfer; 347 return transfer;
347 } 348 }
348 349
349 // static 350 // static
350 scoped_ptr<UsbDeviceHandleImpl::Transfer> 351 std::unique_ptr<UsbDeviceHandleImpl::Transfer>
351 UsbDeviceHandleImpl::Transfer::CreateInterruptTransfer( 352 UsbDeviceHandleImpl::Transfer::CreateInterruptTransfer(
352 scoped_refptr<UsbDeviceHandleImpl> device_handle, 353 scoped_refptr<UsbDeviceHandleImpl> device_handle,
353 uint8_t endpoint, 354 uint8_t endpoint,
354 scoped_refptr<net::IOBuffer> buffer, 355 scoped_refptr<net::IOBuffer> buffer,
355 int length, 356 int length,
356 unsigned int timeout, 357 unsigned int timeout,
357 scoped_refptr<base::TaskRunner> callback_task_runner, 358 scoped_refptr<base::TaskRunner> callback_task_runner,
358 const TransferCallback& callback) { 359 const TransferCallback& callback) {
359 scoped_ptr<Transfer> transfer(new Transfer( 360 std::unique_ptr<Transfer> transfer(new Transfer(
360 device_handle, device_handle->GetClaimedInterfaceForEndpoint(endpoint), 361 device_handle, device_handle->GetClaimedInterfaceForEndpoint(endpoint),
361 USB_TRANSFER_INTERRUPT, buffer, length, callback_task_runner, callback)); 362 USB_TRANSFER_INTERRUPT, buffer, length, callback_task_runner, callback));
362 363
363 transfer->platform_transfer_ = libusb_alloc_transfer(0); 364 transfer->platform_transfer_ = libusb_alloc_transfer(0);
364 if (!transfer->platform_transfer_) { 365 if (!transfer->platform_transfer_) {
365 USB_LOG(ERROR) << "Failed to allocate interrupt transfer."; 366 USB_LOG(ERROR) << "Failed to allocate interrupt transfer.";
366 return nullptr; 367 return nullptr;
367 } 368 }
368 369
369 libusb_fill_interrupt_transfer( 370 libusb_fill_interrupt_transfer(
370 transfer->platform_transfer_, device_handle->handle_, endpoint, 371 transfer->platform_transfer_, device_handle->handle_, endpoint,
371 reinterpret_cast<uint8_t*>(buffer->data()), length, 372 reinterpret_cast<uint8_t*>(buffer->data()), length,
372 &UsbDeviceHandleImpl::Transfer::PlatformCallback, transfer.get(), 373 &UsbDeviceHandleImpl::Transfer::PlatformCallback, transfer.get(),
373 timeout); 374 timeout);
374 375
375 return transfer; 376 return transfer;
376 } 377 }
377 378
378 // static 379 // static
379 scoped_ptr<UsbDeviceHandleImpl::Transfer> 380 std::unique_ptr<UsbDeviceHandleImpl::Transfer>
380 UsbDeviceHandleImpl::Transfer::CreateIsochronousTransfer( 381 UsbDeviceHandleImpl::Transfer::CreateIsochronousTransfer(
381 scoped_refptr<UsbDeviceHandleImpl> device_handle, 382 scoped_refptr<UsbDeviceHandleImpl> device_handle,
382 uint8_t endpoint, 383 uint8_t endpoint,
383 scoped_refptr<net::IOBuffer> buffer, 384 scoped_refptr<net::IOBuffer> buffer,
384 size_t length, 385 size_t length,
385 const std::vector<uint32_t>& packet_lengths, 386 const std::vector<uint32_t>& packet_lengths,
386 unsigned int timeout, 387 unsigned int timeout,
387 scoped_refptr<base::TaskRunner> callback_task_runner, 388 scoped_refptr<base::TaskRunner> callback_task_runner,
388 const IsochronousTransferCallback& callback) { 389 const IsochronousTransferCallback& callback) {
389 scoped_ptr<Transfer> transfer(new Transfer( 390 std::unique_ptr<Transfer> transfer(new Transfer(
390 device_handle, device_handle->GetClaimedInterfaceForEndpoint(endpoint), 391 device_handle, device_handle->GetClaimedInterfaceForEndpoint(endpoint),
391 buffer, callback_task_runner, callback)); 392 buffer, callback_task_runner, callback));
392 393
393 int num_packets = static_cast<int>(packet_lengths.size()); 394 int num_packets = static_cast<int>(packet_lengths.size());
394 transfer->platform_transfer_ = libusb_alloc_transfer(num_packets); 395 transfer->platform_transfer_ = libusb_alloc_transfer(num_packets);
395 if (!transfer->platform_transfer_) { 396 if (!transfer->platform_transfer_) {
396 USB_LOG(ERROR) << "Failed to allocate isochronous transfer."; 397 USB_LOG(ERROR) << "Failed to allocate isochronous transfer.";
397 return nullptr; 398 return nullptr;
398 } 399 }
399 400
(...skipping 577 matching lines...) Expand 10 before | Expand all | Expand 10 after
977 scoped_refptr<net::IOBuffer> resized_buffer = 978 scoped_refptr<net::IOBuffer> resized_buffer =
978 new net::IOBufferWithSize(resized_length); 979 new net::IOBufferWithSize(resized_length);
979 if (!resized_buffer.get()) { 980 if (!resized_buffer.get()) {
980 RunTransferCallback(callback_task_runner, callback, USB_TRANSFER_ERROR, 981 RunTransferCallback(callback_task_runner, callback, USB_TRANSFER_ERROR,
981 buffer, 0); 982 buffer, 0);
982 return; 983 return;
983 } 984 }
984 memcpy(resized_buffer->data() + LIBUSB_CONTROL_SETUP_SIZE, buffer->data(), 985 memcpy(resized_buffer->data() + LIBUSB_CONTROL_SETUP_SIZE, buffer->data(),
985 length); 986 length);
986 987
987 scoped_ptr<Transfer> transfer = Transfer::CreateControlTransfer( 988 std::unique_ptr<Transfer> transfer = Transfer::CreateControlTransfer(
988 this, CreateRequestType(direction, request_type, recipient), request, 989 this, CreateRequestType(direction, request_type, recipient), request,
989 value, index, static_cast<uint16_t>(length), resized_buffer, timeout, 990 value, index, static_cast<uint16_t>(length), resized_buffer, timeout,
990 callback_task_runner, callback); 991 callback_task_runner, callback);
991 if (!transfer) { 992 if (!transfer) {
992 RunTransferCallback(callback_task_runner, callback, USB_TRANSFER_ERROR, 993 RunTransferCallback(callback_task_runner, callback, USB_TRANSFER_ERROR,
993 buffer, 0); 994 buffer, 0);
994 return; 995 return;
995 } 996 }
996 997
997 SubmitTransfer(std::move(transfer)); 998 SubmitTransfer(std::move(transfer));
998 } 999 }
999 1000
1000 void UsbDeviceHandleImpl::IsochronousTransferInInternal( 1001 void UsbDeviceHandleImpl::IsochronousTransferInInternal(
1001 uint8_t endpoint_address, 1002 uint8_t endpoint_address,
1002 const std::vector<uint32_t>& packet_lengths, 1003 const std::vector<uint32_t>& packet_lengths,
1003 unsigned int timeout, 1004 unsigned int timeout,
1004 scoped_refptr<base::TaskRunner> callback_task_runner, 1005 scoped_refptr<base::TaskRunner> callback_task_runner,
1005 const IsochronousTransferCallback& callback) { 1006 const IsochronousTransferCallback& callback) {
1006 DCHECK(thread_checker_.CalledOnValidThread()); 1007 DCHECK(thread_checker_.CalledOnValidThread());
1007 1008
1008 if (!device_) { 1009 if (!device_) {
1009 ReportIsochronousTransferError(callback_task_runner, callback, 1010 ReportIsochronousTransferError(callback_task_runner, callback,
1010 packet_lengths, USB_TRANSFER_DISCONNECT); 1011 packet_lengths, USB_TRANSFER_DISCONNECT);
1011 return; 1012 return;
1012 } 1013 }
1013 1014
1014 size_t length = 1015 size_t length =
1015 std::accumulate(packet_lengths.begin(), packet_lengths.end(), 0u); 1016 std::accumulate(packet_lengths.begin(), packet_lengths.end(), 0u);
1016 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(length)); 1017 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(length));
1017 scoped_ptr<Transfer> transfer = Transfer::CreateIsochronousTransfer( 1018 std::unique_ptr<Transfer> transfer = Transfer::CreateIsochronousTransfer(
1018 this, endpoint_address, buffer, length, packet_lengths, timeout, 1019 this, endpoint_address, buffer, length, packet_lengths, timeout,
1019 callback_task_runner, callback); 1020 callback_task_runner, callback);
1020 1021
1021 SubmitTransfer(std::move(transfer)); 1022 SubmitTransfer(std::move(transfer));
1022 } 1023 }
1023 1024
1024 void UsbDeviceHandleImpl::IsochronousTransferOutInternal( 1025 void UsbDeviceHandleImpl::IsochronousTransferOutInternal(
1025 uint8_t endpoint_address, 1026 uint8_t endpoint_address,
1026 scoped_refptr<net::IOBuffer> buffer, 1027 scoped_refptr<net::IOBuffer> buffer,
1027 const std::vector<uint32_t>& packet_lengths, 1028 const std::vector<uint32_t>& packet_lengths,
1028 unsigned int timeout, 1029 unsigned int timeout,
1029 scoped_refptr<base::TaskRunner> callback_task_runner, 1030 scoped_refptr<base::TaskRunner> callback_task_runner,
1030 const IsochronousTransferCallback& callback) { 1031 const IsochronousTransferCallback& callback) {
1031 DCHECK(thread_checker_.CalledOnValidThread()); 1032 DCHECK(thread_checker_.CalledOnValidThread());
1032 1033
1033 if (!device_) { 1034 if (!device_) {
1034 ReportIsochronousTransferError(callback_task_runner, callback, 1035 ReportIsochronousTransferError(callback_task_runner, callback,
1035 packet_lengths, USB_TRANSFER_DISCONNECT); 1036 packet_lengths, USB_TRANSFER_DISCONNECT);
1036 return; 1037 return;
1037 } 1038 }
1038 1039
1039 size_t length = 1040 size_t length =
1040 std::accumulate(packet_lengths.begin(), packet_lengths.end(), 0u); 1041 std::accumulate(packet_lengths.begin(), packet_lengths.end(), 0u);
1041 scoped_ptr<Transfer> transfer = Transfer::CreateIsochronousTransfer( 1042 std::unique_ptr<Transfer> transfer = Transfer::CreateIsochronousTransfer(
1042 this, endpoint_address, buffer, length, packet_lengths, timeout, 1043 this, endpoint_address, buffer, length, packet_lengths, timeout,
1043 callback_task_runner, callback); 1044 callback_task_runner, callback);
1044 1045
1045 SubmitTransfer(std::move(transfer)); 1046 SubmitTransfer(std::move(transfer));
1046 } 1047 }
1047 1048
1048 void UsbDeviceHandleImpl::GenericTransferInternal( 1049 void UsbDeviceHandleImpl::GenericTransferInternal(
1049 uint8_t endpoint_address, 1050 uint8_t endpoint_address,
1050 scoped_refptr<net::IOBuffer> buffer, 1051 scoped_refptr<net::IOBuffer> buffer,
1051 size_t length, 1052 size_t length,
(...skipping 18 matching lines...) Expand all
1070 return; 1071 return;
1071 } 1072 }
1072 1073
1073 if (!base::IsValueInRangeForNumericType<int>(length)) { 1074 if (!base::IsValueInRangeForNumericType<int>(length)) {
1074 USB_LOG(DEBUG) << "Transfer too long."; 1075 USB_LOG(DEBUG) << "Transfer too long.";
1075 RunTransferCallback(callback_task_runner, callback, USB_TRANSFER_ERROR, 1076 RunTransferCallback(callback_task_runner, callback, USB_TRANSFER_ERROR,
1076 buffer, 0); 1077 buffer, 0);
1077 return; 1078 return;
1078 } 1079 }
1079 1080
1080 scoped_ptr<Transfer> transfer; 1081 std::unique_ptr<Transfer> transfer;
1081 UsbTransferType transfer_type = endpoint_it->second.endpoint->transfer_type; 1082 UsbTransferType transfer_type = endpoint_it->second.endpoint->transfer_type;
1082 if (transfer_type == USB_TRANSFER_BULK) { 1083 if (transfer_type == USB_TRANSFER_BULK) {
1083 transfer = Transfer::CreateBulkTransfer(this, endpoint_address, buffer, 1084 transfer = Transfer::CreateBulkTransfer(this, endpoint_address, buffer,
1084 static_cast<int>(length), timeout, 1085 static_cast<int>(length), timeout,
1085 callback_task_runner, callback); 1086 callback_task_runner, callback);
1086 } else if (transfer_type == USB_TRANSFER_INTERRUPT) { 1087 } else if (transfer_type == USB_TRANSFER_INTERRUPT) {
1087 transfer = Transfer::CreateInterruptTransfer( 1088 transfer = Transfer::CreateInterruptTransfer(
1088 this, endpoint_address, buffer, static_cast<int>(length), timeout, 1089 this, endpoint_address, buffer, static_cast<int>(length), timeout,
1089 callback_task_runner, callback); 1090 callback_task_runner, callback);
1090 } else { 1091 } else {
1091 USB_LOG(DEBUG) << "Endpoint " << static_cast<int>(endpoint_address) 1092 USB_LOG(DEBUG) << "Endpoint " << static_cast<int>(endpoint_address)
1092 << " is not a bulk or interrupt endpoint."; 1093 << " is not a bulk or interrupt endpoint.";
1093 RunTransferCallback(callback_task_runner, callback, USB_TRANSFER_ERROR, 1094 RunTransferCallback(callback_task_runner, callback, USB_TRANSFER_ERROR,
1094 buffer, 0); 1095 buffer, 0);
1095 return; 1096 return;
1096 } 1097 }
1097 1098
1098 SubmitTransfer(std::move(transfer)); 1099 SubmitTransfer(std::move(transfer));
1099 } 1100 }
1100 1101
1101 void UsbDeviceHandleImpl::SubmitTransfer(scoped_ptr<Transfer> transfer) { 1102 void UsbDeviceHandleImpl::SubmitTransfer(std::unique_ptr<Transfer> transfer) {
1102 DCHECK(thread_checker_.CalledOnValidThread()); 1103 DCHECK(thread_checker_.CalledOnValidThread());
1103 1104
1104 // Transfer is owned by libusb until its completion callback is run. This 1105 // Transfer is owned by libusb until its completion callback is run. This
1105 // object holds a weak reference. 1106 // object holds a weak reference.
1106 transfers_.insert(transfer.get()); 1107 transfers_.insert(transfer.get());
1107 blocking_task_runner_->PostTask( 1108 blocking_task_runner_->PostTask(
1108 FROM_HERE, 1109 FROM_HERE,
1109 base::Bind(&Transfer::Submit, base::Unretained(transfer.release()))); 1110 base::Bind(&Transfer::Submit, base::Unretained(transfer.release())));
1110 } 1111 }
1111 1112
1112 void UsbDeviceHandleImpl::TransferComplete(Transfer* transfer, 1113 void UsbDeviceHandleImpl::TransferComplete(Transfer* transfer,
1113 const base::Closure& callback) { 1114 const base::Closure& callback) {
1114 DCHECK(thread_checker_.CalledOnValidThread()); 1115 DCHECK(thread_checker_.CalledOnValidThread());
1115 DCHECK(ContainsKey(transfers_, transfer)) << "Missing transfer completed"; 1116 DCHECK(ContainsKey(transfers_, transfer)) << "Missing transfer completed";
1116 transfers_.erase(transfer); 1117 transfers_.erase(transfer);
1117 1118
1118 if (transfer->callback_task_runner()->RunsTasksOnCurrentThread()) { 1119 if (transfer->callback_task_runner()->RunsTasksOnCurrentThread()) {
1119 callback.Run(); 1120 callback.Run();
1120 } else { 1121 } else {
1121 transfer->callback_task_runner()->PostTask(FROM_HERE, callback); 1122 transfer->callback_task_runner()->PostTask(FROM_HERE, callback);
1122 } 1123 }
1123 1124
1124 // libusb_free_transfer races with libusb_submit_transfer and only work- 1125 // libusb_free_transfer races with libusb_submit_transfer and only work-
1125 // around is to make sure to call them on the same thread. 1126 // around is to make sure to call them on the same thread.
1126 blocking_task_runner_->DeleteSoon(FROM_HERE, transfer); 1127 blocking_task_runner_->DeleteSoon(FROM_HERE, transfer);
1127 } 1128 }
1128 1129
1129 } // namespace device 1130 } // namespace device
OLDNEW
« no previous file with comments | « device/usb/usb_device_handle_impl.h ('k') | device/usb/usb_device_handle_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698