| OLD | NEW |
| 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 "extensions/browser/api/usb/usb_api.h" | 5 #include "extensions/browser/api/usb/usb_api.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/barrier_closure.h" |
| 10 #include "base/memory/scoped_ptr.h" | 11 #include "base/memory/scoped_ptr.h" |
| 11 #include "base/message_loop/message_loop_proxy.h" | |
| 12 #include "device/core/device_client.h" | 12 #include "device/core/device_client.h" |
| 13 #include "device/usb/usb_device_handle.h" | 13 #include "device/usb/usb_device_handle.h" |
| 14 #include "device/usb/usb_service.h" | 14 #include "device/usb/usb_service.h" |
| 15 #include "extensions/browser/api/device_permissions_manager.h" | 15 #include "extensions/browser/api/device_permissions_manager.h" |
| 16 #include "extensions/browser/api/device_permissions_prompt.h" | 16 #include "extensions/browser/api/device_permissions_prompt.h" |
| 17 #include "extensions/browser/api/extensions_api_client.h" | 17 #include "extensions/browser/api/extensions_api_client.h" |
| 18 #include "extensions/browser/api/usb/usb_device_resource.h" | 18 #include "extensions/browser/api/usb/usb_device_resource.h" |
| 19 #include "extensions/browser/extension_system.h" | 19 #include "extensions/browser/extension_system.h" |
| 20 #include "extensions/common/api/usb.h" | 20 #include "extensions/common/api/usb.h" |
| 21 #include "extensions/common/permissions/permissions_data.h" | 21 #include "extensions/common/permissions/permissions_data.h" |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 63 using usb::EndpointDescriptor; | 63 using usb::EndpointDescriptor; |
| 64 using usb::GenericTransferInfo; | 64 using usb::GenericTransferInfo; |
| 65 using usb::InterfaceDescriptor; | 65 using usb::InterfaceDescriptor; |
| 66 using usb::IsochronousTransferInfo; | 66 using usb::IsochronousTransferInfo; |
| 67 using usb::Recipient; | 67 using usb::Recipient; |
| 68 using usb::RequestType; | 68 using usb::RequestType; |
| 69 using usb::SynchronizationType; | 69 using usb::SynchronizationType; |
| 70 using usb::TransferType; | 70 using usb::TransferType; |
| 71 using usb::UsageType; | 71 using usb::UsageType; |
| 72 | 72 |
| 73 typedef std::vector<scoped_refptr<UsbDevice> > DeviceVector; | |
| 74 typedef scoped_ptr<DeviceVector> ScopedDeviceVector; | |
| 75 | |
| 76 namespace { | 73 namespace { |
| 77 | 74 |
| 78 const char kDataKey[] = "data"; | 75 const char kDataKey[] = "data"; |
| 79 const char kResultCodeKey[] = "resultCode"; | 76 const char kResultCodeKey[] = "resultCode"; |
| 80 | 77 |
| 81 const char kErrorInitService[] = "Failed to initialize USB service."; | 78 const char kErrorInitService[] = "Failed to initialize USB service."; |
| 82 | 79 |
| 83 const char kErrorOpen[] = "Failed to open device."; | 80 const char kErrorOpen[] = "Failed to open device."; |
| 84 const char kErrorCancelled[] = "Transfer was cancelled."; | 81 const char kErrorCancelled[] = "Transfer was cancelled."; |
| 85 const char kErrorDisconnect[] = "Device disconnected."; | 82 const char kErrorDisconnect[] = "Device disconnected."; |
| 86 const char kErrorGeneric[] = "Transfer failed."; | 83 const char kErrorGeneric[] = "Transfer failed."; |
| 87 const char kErrorNotSupported[] = "Not supported on this platform."; | 84 const char kErrorNotSupported[] = "Not supported on this platform."; |
| 88 const char kErrorNotConfigured[] = "The device is not in a configured state."; | 85 const char kErrorNotConfigured[] = "The device is not in a configured state."; |
| 89 const char kErrorOverflow[] = "Inbound transfer overflow."; | 86 const char kErrorOverflow[] = "Inbound transfer overflow."; |
| 90 const char kErrorStalled[] = "Transfer stalled."; | 87 const char kErrorStalled[] = "Transfer stalled."; |
| 91 const char kErrorTimeout[] = "Transfer timed out."; | 88 const char kErrorTimeout[] = "Transfer timed out."; |
| 92 const char kErrorTransferLength[] = "Transfer length is insufficient."; | 89 const char kErrorTransferLength[] = "Transfer length is insufficient."; |
| 93 const char kErrorCannotSetConfiguration[] = | 90 const char kErrorCannotSetConfiguration[] = |
| 94 "Error setting device configuration."; | 91 "Error setting device configuration."; |
| 95 const char kErrorCannotClaimInterface[] = "Error claiming interface."; | 92 const char kErrorCannotClaimInterface[] = "Error claiming interface."; |
| 96 const char kErrorCannotReleaseInterface[] = "Error releasing interface."; | 93 const char kErrorCannotReleaseInterface[] = "Error releasing interface."; |
| 97 const char kErrorCannotSetInterfaceAlternateSetting[] = | 94 const char kErrorCannotSetInterfaceAlternateSetting[] = |
| 98 "Error setting alternate interface setting."; | 95 "Error setting alternate interface setting."; |
| 99 const char kErrorConvertDirection[] = "Invalid transfer direction."; | 96 const char kErrorConvertDirection[] = "Invalid transfer direction."; |
| 100 const char kErrorConvertRecipient[] = "Invalid transfer recipient."; | 97 const char kErrorConvertRecipient[] = "Invalid transfer recipient."; |
| 101 const char kErrorConvertRequestType[] = "Invalid request type."; | 98 const char kErrorConvertRequestType[] = "Invalid request type."; |
| 102 const char kErrorMalformedParameters[] = "Error parsing parameters."; | 99 const char kErrorMalformedParameters[] = "Error parsing parameters."; |
| 100 const char kErrorNoConnection[] = "No such connection."; |
| 103 const char kErrorNoDevice[] = "No such device."; | 101 const char kErrorNoDevice[] = "No such device."; |
| 104 const char kErrorPermissionDenied[] = "Permission to access device was denied"; | 102 const char kErrorPermissionDenied[] = "Permission to access device was denied"; |
| 105 const char kErrorInvalidTransferLength[] = | 103 const char kErrorInvalidTransferLength[] = |
| 106 "Transfer length must be a positive number less than 104,857,600."; | 104 "Transfer length must be a positive number less than 104,857,600."; |
| 107 const char kErrorInvalidNumberOfPackets[] = | 105 const char kErrorInvalidNumberOfPackets[] = |
| 108 "Number of packets must be a positive number less than 4,194,304."; | 106 "Number of packets must be a positive number less than 4,194,304."; |
| 109 const char kErrorInvalidPacketLength[] = | 107 const char kErrorInvalidPacketLength[] = |
| 110 "Packet length must be a positive number less than 65,536."; | 108 "Packet length must be a positive number less than 65,536."; |
| 111 const char kErrorInvalidTimeout[] = | 109 const char kErrorInvalidTimeout[] = |
| 112 "Transfer timeout must be greater than or equal to 0."; | 110 "Transfer timeout must be greater than or equal to 0."; |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 235 case device::USB_TRANSFER_OVERFLOW: | 233 case device::USB_TRANSFER_OVERFLOW: |
| 236 return kErrorOverflow; | 234 return kErrorOverflow; |
| 237 case device::USB_TRANSFER_LENGTH_SHORT: | 235 case device::USB_TRANSFER_LENGTH_SHORT: |
| 238 return kErrorTransferLength; | 236 return kErrorTransferLength; |
| 239 default: | 237 default: |
| 240 NOTREACHED(); | 238 NOTREACHED(); |
| 241 return ""; | 239 return ""; |
| 242 } | 240 } |
| 243 } | 241 } |
| 244 | 242 |
| 245 void RequestUsbDevicesAccessHelper( | |
| 246 ScopedDeviceVector devices, | |
| 247 std::vector<scoped_refptr<UsbDevice> >::iterator i, | |
| 248 int interface_id, | |
| 249 const base::Callback<void(ScopedDeviceVector result)>& callback, | |
| 250 bool success) { | |
| 251 if (success) { | |
| 252 ++i; | |
| 253 } else { | |
| 254 i = devices->erase(i); | |
| 255 } | |
| 256 if (i == devices->end()) { | |
| 257 callback.Run(devices.Pass()); | |
| 258 return; | |
| 259 } | |
| 260 (*i)->RequestUsbAccess(interface_id, | |
| 261 base::Bind(RequestUsbDevicesAccessHelper, | |
| 262 base::Passed(devices.Pass()), | |
| 263 i, | |
| 264 interface_id, | |
| 265 callback)); | |
| 266 } | |
| 267 | |
| 268 void RequestUsbDevicesAccess( | |
| 269 ScopedDeviceVector devices, | |
| 270 int interface_id, | |
| 271 const base::Callback<void(ScopedDeviceVector result)>& callback) { | |
| 272 if (devices->empty()) { | |
| 273 callback.Run(devices.Pass()); | |
| 274 return; | |
| 275 } | |
| 276 std::vector<scoped_refptr<UsbDevice> >::iterator i = devices->begin(); | |
| 277 (*i)->RequestUsbAccess(interface_id, | |
| 278 base::Bind(RequestUsbDevicesAccessHelper, | |
| 279 base::Passed(devices.Pass()), | |
| 280 i, | |
| 281 interface_id, | |
| 282 callback)); | |
| 283 } | |
| 284 | |
| 285 base::DictionaryValue* CreateTransferInfo(UsbTransferStatus status, | |
| 286 scoped_refptr<net::IOBuffer> data, | |
| 287 size_t length) { | |
| 288 base::DictionaryValue* result = new base::DictionaryValue(); | |
| 289 result->SetInteger(kResultCodeKey, status); | |
| 290 result->Set(kDataKey, | |
| 291 base::BinaryValue::CreateWithCopiedBuffer(data->data(), length)); | |
| 292 return result; | |
| 293 } | |
| 294 | |
| 295 base::Value* PopulateConnectionHandle(int handle, | 243 base::Value* PopulateConnectionHandle(int handle, |
| 296 int vendor_id, | 244 int vendor_id, |
| 297 int product_id) { | 245 int product_id) { |
| 298 ConnectionHandle result; | 246 ConnectionHandle result; |
| 299 result.handle = handle; | 247 result.handle = handle; |
| 300 result.vendor_id = vendor_id; | 248 result.vendor_id = vendor_id; |
| 301 result.product_id = product_id; | 249 result.product_id = product_id; |
| 302 return result.ToValue().release(); | 250 return result.ToValue().release(); |
| 303 } | 251 } |
| 304 | 252 |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 427 } | 375 } |
| 428 if (input.interface_protocol) { | 376 if (input.interface_protocol) { |
| 429 output->SetInterfaceProtocol(*input.interface_protocol); | 377 output->SetInterfaceProtocol(*input.interface_protocol); |
| 430 } | 378 } |
| 431 } | 379 } |
| 432 | 380 |
| 433 } // namespace | 381 } // namespace |
| 434 | 382 |
| 435 namespace extensions { | 383 namespace extensions { |
| 436 | 384 |
| 437 UsbAsyncApiFunction::UsbAsyncApiFunction() : manager_(NULL) { | 385 UsbPermissionCheckingFunction::UsbPermissionCheckingFunction() |
| 386 : device_permissions_manager_(nullptr) { |
| 438 } | 387 } |
| 439 | 388 |
| 440 UsbAsyncApiFunction::~UsbAsyncApiFunction() { | 389 UsbPermissionCheckingFunction::~UsbPermissionCheckingFunction() { |
| 441 } | 390 } |
| 442 | 391 |
| 443 bool UsbAsyncApiFunction::PrePrepare() { | 392 bool UsbPermissionCheckingFunction::HasDevicePermission( |
| 444 manager_ = ApiResourceManager<UsbDeviceResource>::Get(browser_context()); | 393 scoped_refptr<UsbDevice> device) { |
| 445 set_work_thread_id(BrowserThread::FILE); | 394 if (!device_permissions_manager_) { |
| 446 return manager_ != NULL; | 395 device_permissions_manager_ = |
| 447 } | 396 DevicePermissionsManager::Get(browser_context()); |
| 397 } |
| 448 | 398 |
| 449 bool UsbAsyncApiFunction::Respond() { | 399 DevicePermissions* device_permissions = |
| 450 return error_.empty(); | 400 device_permissions_manager_->GetForExtension(extension_id()); |
| 451 } | 401 DCHECK(device_permissions); |
| 452 | 402 |
| 453 bool UsbAsyncApiFunction::HasDevicePermission(scoped_refptr<UsbDevice> device) { | 403 permission_entry_ = device_permissions->FindEntry(device); |
| 454 DCHECK(device_permissions_); | |
| 455 | |
| 456 // Check the DevicePermissionsManager first so that if an entry is found | |
| 457 // it can be stored for later. This requires the serial number. | |
| 458 base::string16 serial_number; | |
| 459 device->GetSerialNumber(&serial_number); | |
| 460 | |
| 461 permission_entry_ = device_permissions_->FindEntry(device, serial_number); | |
| 462 if (permission_entry_.get()) { | 404 if (permission_entry_.get()) { |
| 463 return true; | 405 return true; |
| 464 } | 406 } |
| 465 | 407 |
| 466 UsbDevicePermission::CheckParam param( | 408 UsbDevicePermission::CheckParam param( |
| 467 device->vendor_id(), | 409 device->vendor_id(), |
| 468 device->product_id(), | 410 device->product_id(), |
| 469 UsbDevicePermissionData::UNSPECIFIED_INTERFACE); | 411 UsbDevicePermissionData::UNSPECIFIED_INTERFACE); |
| 470 if (extension()->permissions_data()->CheckAPIPermissionWithParam( | 412 if (extension()->permissions_data()->CheckAPIPermissionWithParam( |
| 471 APIPermission::kUsbDevice, ¶m)) { | 413 APIPermission::kUsbDevice, ¶m)) { |
| 472 return true; | 414 return true; |
| 473 } | 415 } |
| 474 | 416 |
| 475 return false; | 417 return false; |
| 476 } | 418 } |
| 477 | 419 |
| 478 scoped_refptr<UsbDeviceHandle> | 420 void UsbPermissionCheckingFunction::RecordDeviceLastUsed() { |
| 479 UsbAsyncApiFunction::GetDeviceHandleOrCompleteWithError( | 421 if (permission_entry_.get()) { |
| 480 const ConnectionHandle& input_device_handle) { | 422 device_permissions_manager_->UpdateLastUsed(extension_id(), |
| 481 UsbDeviceResource* resource = | 423 permission_entry_); |
| 482 manager_->Get(extension_->id(), input_device_handle.handle); | 424 } |
| 483 if (!resource) { | 425 } |
| 484 CompleteWithError(kErrorNoDevice); | 426 |
| 485 return NULL; | 427 UsbConnectionFunction::UsbConnectionFunction() { |
| 428 } |
| 429 |
| 430 UsbConnectionFunction::~UsbConnectionFunction() { |
| 431 } |
| 432 |
| 433 scoped_refptr<device::UsbDeviceHandle> UsbConnectionFunction::GetDeviceHandle( |
| 434 const extensions::core_api::usb::ConnectionHandle& handle) { |
| 435 ApiResourceManager<UsbDeviceResource>* manager = |
| 436 ApiResourceManager<UsbDeviceResource>::Get(browser_context()); |
| 437 if (!manager) { |
| 438 return nullptr; |
| 486 } | 439 } |
| 487 | 440 |
| 488 if (!resource->device().get() || !resource->device()->GetDevice().get()) { | 441 UsbDeviceResource* resource = manager->Get(extension_id(), handle.handle); |
| 489 CompleteWithError(kErrorDisconnect); | 442 if (!resource) { |
| 490 manager_->Remove(extension_->id(), input_device_handle.handle); | 443 return nullptr; |
| 491 return NULL; | |
| 492 } | |
| 493 | |
| 494 if (resource->device()->GetDevice()->vendor_id() != | |
| 495 input_device_handle.vendor_id || | |
| 496 resource->device()->GetDevice()->product_id() != | |
| 497 input_device_handle.product_id) { | |
| 498 CompleteWithError(kErrorNoDevice); | |
| 499 return NULL; | |
| 500 } | 444 } |
| 501 | 445 |
| 502 return resource->device(); | 446 return resource->device(); |
| 503 } | 447 } |
| 504 | 448 |
| 505 void UsbAsyncApiFunction::RemoveUsbDeviceResource(int api_resource_id) { | 449 void UsbConnectionFunction::ReleaseDeviceHandle( |
| 506 manager_->Remove(extension_->id(), api_resource_id); | 450 const extensions::core_api::usb::ConnectionHandle& handle) { |
| 451 ApiResourceManager<UsbDeviceResource>* manager = |
| 452 ApiResourceManager<UsbDeviceResource>::Get(browser_context()); |
| 453 manager->Remove(extension_id(), handle.handle); |
| 507 } | 454 } |
| 508 | 455 |
| 509 void UsbAsyncApiFunction::CompleteWithError(const std::string& error) { | 456 UsbTransferFunction::UsbTransferFunction() { |
| 510 SetError(error); | |
| 511 AsyncWorkCompleted(); | |
| 512 } | 457 } |
| 513 | 458 |
| 514 UsbAsyncApiTransferFunction::UsbAsyncApiTransferFunction() { | 459 UsbTransferFunction::~UsbTransferFunction() { |
| 515 } | 460 } |
| 516 | 461 |
| 517 UsbAsyncApiTransferFunction::~UsbAsyncApiTransferFunction() { | 462 void UsbTransferFunction::OnCompleted(UsbTransferStatus status, |
| 518 } | 463 scoped_refptr<net::IOBuffer> data, |
| 464 size_t length) { |
| 465 scoped_ptr<base::DictionaryValue> transfer_info(new base::DictionaryValue()); |
| 466 transfer_info->SetInteger(kResultCodeKey, status); |
| 467 transfer_info->Set(kDataKey, base::BinaryValue::CreateWithCopiedBuffer( |
| 468 data->data(), length)); |
| 519 | 469 |
| 520 void UsbAsyncApiTransferFunction::OnCompleted(UsbTransferStatus status, | 470 if (status == device::USB_TRANSFER_COMPLETED) { |
| 521 scoped_refptr<net::IOBuffer> data, | 471 Respond(OneArgument(transfer_info.release())); |
| 522 size_t length) { | 472 } else { |
| 523 if (status != device::USB_TRANSFER_COMPLETED) | 473 scoped_ptr<base::ListValue> error_args(new base::ListValue()); |
| 524 SetError(ConvertTransferStatusToApi(status)); | 474 error_args->Append(transfer_info.release()); |
| 525 | 475 // Returning arguments with an error is wrong but we're stuck with it. |
| 526 SetResult(CreateTransferInfo(status, data, length)); | 476 Respond(ErrorWithArguments(error_args.Pass(), |
| 527 AsyncWorkCompleted(); | 477 ConvertTransferStatusToApi(status))); |
| 528 } | 478 } |
| 529 | |
| 530 bool UsbAsyncApiTransferFunction::ConvertDirectionSafely( | |
| 531 const Direction& input, | |
| 532 UsbEndpointDirection* output) { | |
| 533 const bool converted = ConvertDirectionFromApi(input, output); | |
| 534 if (!converted) | |
| 535 SetError(kErrorConvertDirection); | |
| 536 return converted; | |
| 537 } | |
| 538 | |
| 539 bool UsbAsyncApiTransferFunction::ConvertRequestTypeSafely( | |
| 540 const RequestType& input, | |
| 541 UsbDeviceHandle::TransferRequestType* output) { | |
| 542 const bool converted = ConvertRequestTypeFromApi(input, output); | |
| 543 if (!converted) | |
| 544 SetError(kErrorConvertRequestType); | |
| 545 return converted; | |
| 546 } | |
| 547 | |
| 548 bool UsbAsyncApiTransferFunction::ConvertRecipientSafely( | |
| 549 const Recipient& input, | |
| 550 UsbDeviceHandle::TransferRecipient* output) { | |
| 551 const bool converted = ConvertRecipientFromApi(input, output); | |
| 552 if (!converted) | |
| 553 SetError(kErrorConvertRecipient); | |
| 554 return converted; | |
| 555 } | 479 } |
| 556 | 480 |
| 557 UsbFindDevicesFunction::UsbFindDevicesFunction() { | 481 UsbFindDevicesFunction::UsbFindDevicesFunction() { |
| 558 } | 482 } |
| 559 | 483 |
| 560 UsbFindDevicesFunction::~UsbFindDevicesFunction() { | 484 UsbFindDevicesFunction::~UsbFindDevicesFunction() { |
| 561 } | 485 } |
| 562 | 486 |
| 563 bool UsbFindDevicesFunction::Prepare() { | 487 ExtensionFunction::ResponseAction UsbFindDevicesFunction::Run() { |
| 564 parameters_ = FindDevices::Params::Create(*args_); | 488 scoped_ptr<extensions::core_api::usb::FindDevices::Params> parameters = |
| 565 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); | 489 FindDevices::Params::Create(*args_); |
| 566 return true; | 490 EXTENSION_FUNCTION_VALIDATE(parameters.get()); |
| 567 } | |
| 568 | 491 |
| 569 void UsbFindDevicesFunction::AsyncWorkStart() { | 492 vendor_id_ = parameters->options.vendor_id; |
| 570 scoped_ptr<base::ListValue> result(new base::ListValue()); | 493 product_id_ = parameters->options.product_id; |
| 571 const uint16_t vendor_id = parameters_->options.vendor_id; | 494 interface_id_ = parameters->options.interface_id.get() |
| 572 const uint16_t product_id = parameters_->options.product_id; | 495 ? *parameters->options.interface_id.get() |
| 573 int interface_id = parameters_->options.interface_id.get() | 496 : UsbDevicePermissionData::ANY_INTERFACE; |
| 574 ? *parameters_->options.interface_id.get() | 497 UsbDevicePermission::CheckParam param(vendor_id_, product_id_, interface_id_); |
| 575 : UsbDevicePermissionData::ANY_INTERFACE; | |
| 576 UsbDevicePermission::CheckParam param(vendor_id, product_id, interface_id); | |
| 577 if (!extension()->permissions_data()->CheckAPIPermissionWithParam( | 498 if (!extension()->permissions_data()->CheckAPIPermissionWithParam( |
| 578 APIPermission::kUsbDevice, ¶m)) { | 499 APIPermission::kUsbDevice, ¶m)) { |
| 579 LOG(WARNING) << "Insufficient permissions to access device."; | 500 return RespondNow(Error(kErrorPermissionDenied)); |
| 580 CompleteWithError(kErrorPermissionDenied); | |
| 581 return; | |
| 582 } | 501 } |
| 583 | 502 |
| 584 UsbService* service = device::DeviceClient::Get()->GetUsbService(); | 503 UsbService* service = device::DeviceClient::Get()->GetUsbService(); |
| 585 if (!service) { | 504 if (!service) { |
| 586 CompleteWithError(kErrorInitService); | 505 return RespondNow(Error(kErrorInitService)); |
| 587 return; | |
| 588 } | 506 } |
| 589 | 507 |
| 590 ScopedDeviceVector devices(new DeviceVector()); | 508 service->GetDevices( |
| 591 service->GetDevices(devices.get()); | 509 base::Bind(&UsbFindDevicesFunction::OnGetDevicesComplete, this)); |
| 510 return RespondLater(); |
| 511 } |
| 592 | 512 |
| 593 for (DeviceVector::iterator it = devices->begin(); it != devices->end();) { | 513 void UsbFindDevicesFunction::OnGetDevicesComplete( |
| 594 if ((*it)->vendor_id() != vendor_id || (*it)->product_id() != product_id) { | 514 const std::vector<scoped_refptr<UsbDevice>>& devices) { |
| 595 it = devices->erase(it); | 515 result_.reset(new base::ListValue()); |
| 516 barrier_ = base::BarrierClosure( |
| 517 devices.size(), base::Bind(&UsbFindDevicesFunction::OpenComplete, this)); |
| 518 |
| 519 for (const scoped_refptr<UsbDevice>& device : devices) { |
| 520 if (device->vendor_id() != vendor_id_ || |
| 521 device->product_id() != product_id_) { |
| 522 barrier_.Run(); |
| 596 } else { | 523 } else { |
| 597 ++it; | 524 device->RequestUsbAccess( |
| 525 interface_id_, |
| 526 base::Bind(&UsbFindDevicesFunction::OnRequestAccessComplete, this, |
| 527 device)); |
| 598 } | 528 } |
| 599 } | 529 } |
| 600 | |
| 601 RequestUsbDevicesAccess( | |
| 602 devices.Pass(), | |
| 603 interface_id, | |
| 604 base::Bind(&UsbFindDevicesFunction::OpenDevices, this)); | |
| 605 } | 530 } |
| 606 | 531 |
| 607 void UsbFindDevicesFunction::OpenDevices(ScopedDeviceVector devices) { | 532 void UsbFindDevicesFunction::OnRequestAccessComplete( |
| 608 base::ListValue* result = new base::ListValue(); | 533 scoped_refptr<UsbDevice> device, |
| 534 bool success) { |
| 535 if (success) { |
| 536 device->Open(base::Bind(&UsbFindDevicesFunction::OnDeviceOpened, this)); |
| 537 } else { |
| 538 barrier_.Run(); |
| 539 } |
| 540 } |
| 609 | 541 |
| 610 for (size_t i = 0; i < devices->size(); ++i) { | 542 void UsbFindDevicesFunction::OnDeviceOpened( |
| 611 scoped_refptr<UsbDeviceHandle> device_handle = devices->at(i)->Open(); | 543 scoped_refptr<UsbDeviceHandle> device_handle) { |
| 612 if (device_handle.get()) | 544 if (device_handle.get()) { |
| 613 device_handles_.push_back(device_handle); | 545 ApiResourceManager<UsbDeviceResource>* manager = |
| 546 ApiResourceManager<UsbDeviceResource>::Get(browser_context()); |
| 547 UsbDeviceResource* resource = |
| 548 new UsbDeviceResource(extension_id(), device_handle); |
| 549 scoped_refptr<UsbDevice> device = device_handle->GetDevice(); |
| 550 result_->Append(PopulateConnectionHandle( |
| 551 manager->Add(resource), device->vendor_id(), device->product_id())); |
| 614 } | 552 } |
| 553 barrier_.Run(); |
| 554 } |
| 615 | 555 |
| 616 for (size_t i = 0; i < device_handles_.size(); ++i) { | 556 void UsbFindDevicesFunction::OpenComplete() { |
| 617 UsbDeviceHandle* const device_handle = device_handles_[i].get(); | 557 Respond(OneArgument(result_.release())); |
| 618 UsbDeviceResource* const resource = | |
| 619 new UsbDeviceResource(extension_->id(), device_handle); | |
| 620 | |
| 621 result->Append(PopulateConnectionHandle(manager_->Add(resource), | |
| 622 parameters_->options.vendor_id, | |
| 623 parameters_->options.product_id)); | |
| 624 } | |
| 625 | |
| 626 SetResult(result); | |
| 627 AsyncWorkCompleted(); | |
| 628 } | 558 } |
| 629 | 559 |
| 630 UsbGetDevicesFunction::UsbGetDevicesFunction() { | 560 UsbGetDevicesFunction::UsbGetDevicesFunction() { |
| 631 } | 561 } |
| 632 | 562 |
| 633 UsbGetDevicesFunction::~UsbGetDevicesFunction() { | 563 UsbGetDevicesFunction::~UsbGetDevicesFunction() { |
| 634 } | 564 } |
| 635 | 565 |
| 636 bool UsbGetDevicesFunction::Prepare() { | 566 ExtensionFunction::ResponseAction UsbGetDevicesFunction::Run() { |
| 637 parameters_ = GetDevices::Params::Create(*args_); | 567 scoped_ptr<extensions::core_api::usb::GetDevices::Params> parameters = |
| 638 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); | 568 GetDevices::Params::Create(*args_); |
| 639 device_permissions_ = DevicePermissionsManager::Get(browser_context()) | 569 EXTENSION_FUNCTION_VALIDATE(parameters.get()); |
| 640 ->GetForExtension(extension()->id()); | |
| 641 return true; | |
| 642 } | |
| 643 | 570 |
| 644 void UsbGetDevicesFunction::AsyncWorkStart() { | 571 if (parameters->options.filters) { |
| 645 std::vector<UsbDeviceFilter> filters; | 572 filters_.resize(parameters->options.filters->size()); |
| 646 if (parameters_->options.filters) { | 573 for (size_t i = 0; i < parameters->options.filters->size(); ++i) { |
| 647 filters.resize(parameters_->options.filters->size()); | 574 ConvertDeviceFilter(*parameters->options.filters->at(i).get(), |
| 648 for (size_t i = 0; i < parameters_->options.filters->size(); ++i) { | 575 &filters_[i]); |
| 649 ConvertDeviceFilter(*parameters_->options.filters->at(i).get(), | |
| 650 &filters[i]); | |
| 651 } | 576 } |
| 652 } | 577 } |
| 653 if (parameters_->options.vendor_id) { | 578 if (parameters->options.vendor_id) { |
| 654 filters.resize(filters.size() + 1); | 579 filters_.resize(filters_.size() + 1); |
| 655 filters.back().SetVendorId(*parameters_->options.vendor_id); | 580 filters_.back().SetVendorId(*parameters->options.vendor_id); |
| 656 if (parameters_->options.product_id) { | 581 if (parameters->options.product_id) { |
| 657 filters.back().SetProductId(*parameters_->options.product_id); | 582 filters_.back().SetProductId(*parameters->options.product_id); |
| 658 } | 583 } |
| 659 } | 584 } |
| 660 | 585 |
| 661 UsbService* service = device::DeviceClient::Get()->GetUsbService(); | 586 UsbService* service = device::DeviceClient::Get()->GetUsbService(); |
| 662 if (!service) { | 587 if (!service) { |
| 663 CompleteWithError(kErrorInitService); | 588 return RespondNow(Error(kErrorInitService)); |
| 664 return; | |
| 665 } | 589 } |
| 666 | 590 |
| 667 DeviceVector devices; | 591 service->GetDevices( |
| 668 service->GetDevices(&devices); | 592 base::Bind(&UsbGetDevicesFunction::OnGetDevicesComplete, this)); |
| 593 return RespondLater(); |
| 594 } |
| 669 | 595 |
| 596 void UsbGetDevicesFunction::OnGetDevicesComplete( |
| 597 const std::vector<scoped_refptr<UsbDevice>>& devices) { |
| 670 scoped_ptr<base::ListValue> result(new base::ListValue()); | 598 scoped_ptr<base::ListValue> result(new base::ListValue()); |
| 671 for (DeviceVector::iterator it = devices.begin(); it != devices.end(); ++it) { | 599 for (const scoped_refptr<UsbDevice>& device : devices) { |
| 672 scoped_refptr<UsbDevice> device = *it; | 600 if ((filters_.empty() || UsbDeviceFilter::MatchesAny(device, filters_)) && |
| 673 if ((filters.empty() || UsbDeviceFilter::MatchesAny(device, filters)) && | |
| 674 HasDevicePermission(device)) { | 601 HasDevicePermission(device)) { |
| 675 result->Append(PopulateDevice(it->get())); | 602 result->Append(PopulateDevice(device.get())); |
| 676 } | 603 } |
| 677 } | 604 } |
| 678 | 605 |
| 679 SetResult(result.release()); | 606 Respond(OneArgument(result.release())); |
| 680 AsyncWorkCompleted(); | |
| 681 } | 607 } |
| 682 | 608 |
| 683 UsbGetUserSelectedDevicesFunction::UsbGetUserSelectedDevicesFunction() { | 609 UsbGetUserSelectedDevicesFunction::UsbGetUserSelectedDevicesFunction() { |
| 684 } | 610 } |
| 685 | 611 |
| 686 UsbGetUserSelectedDevicesFunction::~UsbGetUserSelectedDevicesFunction() { | 612 UsbGetUserSelectedDevicesFunction::~UsbGetUserSelectedDevicesFunction() { |
| 687 } | 613 } |
| 688 | 614 |
| 689 AsyncApiFunction::ResponseAction UsbGetUserSelectedDevicesFunction::Run() { | 615 ExtensionFunction::ResponseAction UsbGetUserSelectedDevicesFunction::Run() { |
| 690 scoped_ptr<extensions::core_api::usb::GetUserSelectedDevices::Params> | 616 scoped_ptr<extensions::core_api::usb::GetUserSelectedDevices::Params> |
| 691 parameters = GetUserSelectedDevices::Params::Create(*args_); | 617 parameters = GetUserSelectedDevices::Params::Create(*args_); |
| 692 EXTENSION_FUNCTION_VALIDATE(parameters.get()); | 618 EXTENSION_FUNCTION_VALIDATE(parameters.get()); |
| 693 | 619 |
| 694 if (!user_gesture()) { | 620 if (!user_gesture()) { |
| 695 return RespondNow(OneArgument(new base::ListValue())); | 621 return RespondNow(OneArgument(new base::ListValue())); |
| 696 } | 622 } |
| 697 | 623 |
| 698 bool multiple = false; | 624 bool multiple = false; |
| 699 if (parameters->options.multiple) { | 625 if (parameters->options.multiple) { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 721 return RespondLater(); | 647 return RespondLater(); |
| 722 } | 648 } |
| 723 | 649 |
| 724 void UsbGetUserSelectedDevicesFunction::OnUsbDevicesChosen( | 650 void UsbGetUserSelectedDevicesFunction::OnUsbDevicesChosen( |
| 725 const std::vector<scoped_refptr<UsbDevice>>& devices) { | 651 const std::vector<scoped_refptr<UsbDevice>>& devices) { |
| 726 scoped_ptr<base::ListValue> result(new base::ListValue()); | 652 scoped_ptr<base::ListValue> result(new base::ListValue()); |
| 727 for (const auto& device : devices) { | 653 for (const auto& device : devices) { |
| 728 result->Append(PopulateDevice(device.get())); | 654 result->Append(PopulateDevice(device.get())); |
| 729 } | 655 } |
| 730 | 656 |
| 731 SetResult(result.release()); | 657 Respond(OneArgument(result.release())); |
| 732 SendResponse(true); | |
| 733 Release(); | 658 Release(); |
| 734 } | 659 } |
| 735 | 660 |
| 736 UsbRequestAccessFunction::UsbRequestAccessFunction() { | 661 UsbRequestAccessFunction::UsbRequestAccessFunction() { |
| 737 } | 662 } |
| 738 | 663 |
| 739 UsbRequestAccessFunction::~UsbRequestAccessFunction() { | 664 UsbRequestAccessFunction::~UsbRequestAccessFunction() { |
| 740 } | 665 } |
| 741 | 666 |
| 742 bool UsbRequestAccessFunction::Prepare() { | 667 ExtensionFunction::ResponseAction UsbRequestAccessFunction::Run() { |
| 743 parameters_ = RequestAccess::Params::Create(*args_); | 668 scoped_ptr<extensions::core_api::usb::RequestAccess::Params> parameters = |
| 744 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); | 669 RequestAccess::Params::Create(*args_); |
| 745 return true; | 670 EXTENSION_FUNCTION_VALIDATE(parameters.get()); |
| 746 } | 671 return RespondNow(OneArgument(new base::FundamentalValue(true))); |
| 747 | |
| 748 void UsbRequestAccessFunction::AsyncWorkStart() { | |
| 749 SetResult(new base::FundamentalValue(true)); | |
| 750 AsyncWorkCompleted(); | |
| 751 } | 672 } |
| 752 | 673 |
| 753 UsbOpenDeviceFunction::UsbOpenDeviceFunction() { | 674 UsbOpenDeviceFunction::UsbOpenDeviceFunction() { |
| 754 } | 675 } |
| 755 | 676 |
| 756 UsbOpenDeviceFunction::~UsbOpenDeviceFunction() { | 677 UsbOpenDeviceFunction::~UsbOpenDeviceFunction() { |
| 757 } | 678 } |
| 758 | 679 |
| 759 bool UsbOpenDeviceFunction::Prepare() { | 680 ExtensionFunction::ResponseAction UsbOpenDeviceFunction::Run() { |
| 760 parameters_ = OpenDevice::Params::Create(*args_); | 681 scoped_ptr<extensions::core_api::usb::OpenDevice::Params> parameters = |
| 761 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); | 682 OpenDevice::Params::Create(*args_); |
| 762 device_permissions_manager_ = | 683 EXTENSION_FUNCTION_VALIDATE(parameters.get()); |
| 763 DevicePermissionsManager::Get(browser_context()); | 684 |
| 764 device_permissions_ = | 685 UsbService* service = device::DeviceClient::Get()->GetUsbService(); |
| 765 device_permissions_manager_->GetForExtension(extension()->id()); | 686 if (!service) { |
| 766 return true; | 687 return RespondNow(Error(kErrorInitService)); |
| 688 } |
| 689 |
| 690 scoped_refptr<UsbDevice> device = |
| 691 service->GetDeviceById(parameters->device.device); |
| 692 if (!device.get()) { |
| 693 return RespondNow(Error(kErrorNoDevice)); |
| 694 } |
| 695 |
| 696 if (!HasDevicePermission(device)) { |
| 697 // This function must act as if there is no such device. Otherwise it can be |
| 698 // used to fingerprint unauthorized devices. |
| 699 return RespondNow(Error(kErrorNoDevice)); |
| 700 } |
| 701 |
| 702 device->RequestUsbAccess( |
| 703 -1, /* any interface, unused by the permission broker */ |
| 704 base::Bind(&UsbOpenDeviceFunction::OnRequestAccessComplete, this, |
| 705 device)); |
| 706 return RespondLater(); |
| 767 } | 707 } |
| 768 | 708 |
| 769 void UsbOpenDeviceFunction::AsyncWorkStart() { | 709 void UsbOpenDeviceFunction::OnRequestAccessComplete( |
| 770 UsbService* service = device::DeviceClient::Get()->GetUsbService(); | 710 scoped_refptr<UsbDevice> device, |
| 771 if (!service) { | 711 bool success) { |
| 772 CompleteWithError(kErrorInitService); | 712 if (success) { |
| 713 device->Open(base::Bind(&UsbOpenDeviceFunction::OnDeviceOpened, this)); |
| 714 } else { |
| 715 Respond(Error(kErrorPermissionDenied)); |
| 716 } |
| 717 } |
| 718 |
| 719 void UsbOpenDeviceFunction::OnDeviceOpened( |
| 720 scoped_refptr<UsbDeviceHandle> device_handle) { |
| 721 if (!device_handle.get()) { |
| 722 Respond(Error(kErrorOpen)); |
| 773 return; | 723 return; |
| 774 } | 724 } |
| 775 | 725 |
| 776 device_ = service->GetDeviceById(parameters_->device.device); | 726 RecordDeviceLastUsed(); |
| 777 if (!device_.get()) { | |
| 778 CompleteWithError(kErrorNoDevice); | |
| 779 return; | |
| 780 } | |
| 781 | 727 |
| 782 if (!HasDevicePermission(device_)) { | 728 ApiResourceManager<UsbDeviceResource>* manager = |
| 783 // This function must act as if there is no such device. Otherwise it can be | 729 ApiResourceManager<UsbDeviceResource>::Get(browser_context()); |
| 784 // used to fingerprint unauthorized devices. | 730 scoped_refptr<UsbDevice> device = device_handle->GetDevice(); |
| 785 CompleteWithError(kErrorNoDevice); | 731 Respond(OneArgument(PopulateConnectionHandle( |
| 786 return; | 732 manager->Add(new UsbDeviceResource(extension_id(), device_handle)), |
| 787 } | 733 device->vendor_id(), device->product_id()))); |
| 788 | |
| 789 device_->RequestUsbAccess( | |
| 790 -1, /* any interface, unused by the permission broker */ | |
| 791 base::Bind(&UsbOpenDeviceFunction::OnRequestAccessComplete, this)); | |
| 792 } | |
| 793 | |
| 794 void UsbOpenDeviceFunction::OnRequestAccessComplete(bool success) { | |
| 795 if (!success) { | |
| 796 SetError(kErrorPermissionDenied); | |
| 797 AsyncWorkCompleted(); | |
| 798 return; | |
| 799 } | |
| 800 | |
| 801 scoped_refptr<UsbDeviceHandle> handle = device_->Open(); | |
| 802 if (!handle.get()) { | |
| 803 SetError(kErrorOpen); | |
| 804 AsyncWorkCompleted(); | |
| 805 return; | |
| 806 } | |
| 807 | |
| 808 SetResult(PopulateConnectionHandle( | |
| 809 manager_->Add(new UsbDeviceResource(extension_->id(), handle)), | |
| 810 device_->vendor_id(), device_->product_id())); | |
| 811 AsyncWorkCompleted(); | |
| 812 } | |
| 813 | |
| 814 bool UsbOpenDeviceFunction::Respond() { | |
| 815 if (permission_entry_.get()) { | |
| 816 device_permissions_manager_->UpdateLastUsed(extension_->id(), | |
| 817 permission_entry_); | |
| 818 } | |
| 819 return UsbAsyncApiFunction::Respond(); | |
| 820 } | 734 } |
| 821 | 735 |
| 822 UsbSetConfigurationFunction::UsbSetConfigurationFunction() { | 736 UsbSetConfigurationFunction::UsbSetConfigurationFunction() { |
| 823 } | 737 } |
| 824 | 738 |
| 825 UsbSetConfigurationFunction::~UsbSetConfigurationFunction() { | 739 UsbSetConfigurationFunction::~UsbSetConfigurationFunction() { |
| 826 } | 740 } |
| 827 | 741 |
| 828 bool UsbSetConfigurationFunction::Prepare() { | 742 ExtensionFunction::ResponseAction UsbSetConfigurationFunction::Run() { |
| 829 parameters_ = SetConfiguration::Params::Create(*args_); | 743 scoped_ptr<extensions::core_api::usb::SetConfiguration::Params> parameters = |
| 830 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); | 744 SetConfiguration::Params::Create(*args_); |
| 831 return true; | 745 EXTENSION_FUNCTION_VALIDATE(parameters.get()); |
| 746 |
| 747 scoped_refptr<UsbDeviceHandle> device_handle = |
| 748 GetDeviceHandle(parameters->handle); |
| 749 if (!device_handle.get()) { |
| 750 return RespondNow(Error(kErrorNoConnection)); |
| 751 } |
| 752 |
| 753 device_handle->SetConfiguration( |
| 754 parameters->configuration_value, |
| 755 base::Bind(&UsbSetConfigurationFunction::OnComplete, this)); |
| 756 return RespondLater(); |
| 832 } | 757 } |
| 833 | 758 |
| 834 void UsbSetConfigurationFunction::AsyncWorkStart() { | 759 void UsbSetConfigurationFunction::OnComplete(bool success) { |
| 835 scoped_refptr<UsbDeviceHandle> device_handle = | 760 if (success) { |
| 836 GetDeviceHandleOrCompleteWithError(parameters_->handle); | 761 Respond(NoArguments()); |
| 837 if (!device_handle.get()) { | 762 } else { |
| 838 return; | 763 Respond(Error(kErrorCannotSetConfiguration)); |
| 839 } | 764 } |
| 840 | |
| 841 if (!device_handle->SetConfiguration(parameters_->configuration_value)) { | |
| 842 SetError(kErrorCannotSetConfiguration); | |
| 843 } | |
| 844 AsyncWorkCompleted(); | |
| 845 } | 765 } |
| 846 | 766 |
| 847 UsbGetConfigurationFunction::UsbGetConfigurationFunction() { | 767 UsbGetConfigurationFunction::UsbGetConfigurationFunction() { |
| 848 } | 768 } |
| 849 | 769 |
| 850 UsbGetConfigurationFunction::~UsbGetConfigurationFunction() { | 770 UsbGetConfigurationFunction::~UsbGetConfigurationFunction() { |
| 851 } | 771 } |
| 852 | 772 |
| 853 bool UsbGetConfigurationFunction::Prepare() { | 773 ExtensionFunction::ResponseAction UsbGetConfigurationFunction::Run() { |
| 854 parameters_ = GetConfiguration::Params::Create(*args_); | 774 scoped_ptr<extensions::core_api::usb::GetConfiguration::Params> parameters = |
| 855 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); | 775 GetConfiguration::Params::Create(*args_); |
| 856 return true; | 776 EXTENSION_FUNCTION_VALIDATE(parameters.get()); |
| 857 } | |
| 858 | 777 |
| 859 void UsbGetConfigurationFunction::AsyncWorkStart() { | |
| 860 scoped_refptr<UsbDeviceHandle> device_handle = | 778 scoped_refptr<UsbDeviceHandle> device_handle = |
| 861 GetDeviceHandleOrCompleteWithError(parameters_->handle); | 779 GetDeviceHandle(parameters->handle); |
| 862 if (!device_handle.get()) { | 780 if (!device_handle.get()) { |
| 863 return; | 781 return RespondNow(Error(kErrorNoConnection)); |
| 864 } | 782 } |
| 865 | 783 |
| 866 const UsbConfigDescriptor* config_descriptor = | 784 const UsbConfigDescriptor* config_descriptor = |
| 867 device_handle->GetDevice()->GetConfiguration(); | 785 device_handle->GetDevice()->GetConfiguration(); |
| 868 if (config_descriptor) { | 786 if (config_descriptor) { |
| 869 ConfigDescriptor config; | 787 ConfigDescriptor config; |
| 870 ConvertConfigDescriptor(*config_descriptor, &config); | 788 ConvertConfigDescriptor(*config_descriptor, &config); |
| 871 SetResult(config.ToValue().release()); | 789 return RespondNow(OneArgument(config.ToValue().release())); |
| 872 } else { | 790 } else { |
| 873 SetError(kErrorNotConfigured); | 791 return RespondNow(Error(kErrorNotConfigured)); |
| 874 } | 792 } |
| 875 | |
| 876 AsyncWorkCompleted(); | |
| 877 } | 793 } |
| 878 | 794 |
| 879 UsbListInterfacesFunction::UsbListInterfacesFunction() { | 795 UsbListInterfacesFunction::UsbListInterfacesFunction() { |
| 880 } | 796 } |
| 881 | 797 |
| 882 UsbListInterfacesFunction::~UsbListInterfacesFunction() { | 798 UsbListInterfacesFunction::~UsbListInterfacesFunction() { |
| 883 } | 799 } |
| 884 | 800 |
| 885 bool UsbListInterfacesFunction::Prepare() { | 801 ExtensionFunction::ResponseAction UsbListInterfacesFunction::Run() { |
| 886 parameters_ = ListInterfaces::Params::Create(*args_); | 802 scoped_ptr<extensions::core_api::usb::ListInterfaces::Params> parameters = |
| 887 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); | 803 ListInterfaces::Params::Create(*args_); |
| 888 return true; | 804 EXTENSION_FUNCTION_VALIDATE(parameters.get()); |
| 889 } | |
| 890 | 805 |
| 891 void UsbListInterfacesFunction::AsyncWorkStart() { | |
| 892 scoped_refptr<UsbDeviceHandle> device_handle = | 806 scoped_refptr<UsbDeviceHandle> device_handle = |
| 893 GetDeviceHandleOrCompleteWithError(parameters_->handle); | 807 GetDeviceHandle(parameters->handle); |
| 894 if (!device_handle.get()) { | 808 if (!device_handle.get()) { |
| 895 return; | 809 return RespondNow(Error(kErrorNoConnection)); |
| 896 } | 810 } |
| 897 | 811 |
| 898 const UsbConfigDescriptor* config_descriptor = | 812 const UsbConfigDescriptor* config_descriptor = |
| 899 device_handle->GetDevice()->GetConfiguration(); | 813 device_handle->GetDevice()->GetConfiguration(); |
| 900 if (config_descriptor) { | 814 if (config_descriptor) { |
| 901 ConfigDescriptor config; | 815 ConfigDescriptor config; |
| 902 ConvertConfigDescriptor(*config_descriptor, &config); | 816 ConvertConfigDescriptor(*config_descriptor, &config); |
| 903 | 817 |
| 904 scoped_ptr<base::ListValue> result(new base::ListValue); | 818 scoped_ptr<base::ListValue> result(new base::ListValue); |
| 905 for (size_t i = 0; i < config.interfaces.size(); ++i) { | 819 for (size_t i = 0; i < config.interfaces.size(); ++i) { |
| 906 result->Append(config.interfaces[i]->ToValue().release()); | 820 result->Append(config.interfaces[i]->ToValue().release()); |
| 907 } | 821 } |
| 908 | 822 |
| 909 SetResult(result.release()); | 823 return RespondNow(OneArgument(result.release())); |
| 910 } else { | 824 } else { |
| 911 SetError(kErrorNotConfigured); | 825 return RespondNow(Error(kErrorNotConfigured)); |
| 912 } | 826 } |
| 913 | |
| 914 AsyncWorkCompleted(); | |
| 915 } | 827 } |
| 916 | 828 |
| 917 UsbCloseDeviceFunction::UsbCloseDeviceFunction() { | 829 UsbCloseDeviceFunction::UsbCloseDeviceFunction() { |
| 918 } | 830 } |
| 919 | 831 |
| 920 UsbCloseDeviceFunction::~UsbCloseDeviceFunction() { | 832 UsbCloseDeviceFunction::~UsbCloseDeviceFunction() { |
| 921 } | 833 } |
| 922 | 834 |
| 923 bool UsbCloseDeviceFunction::Prepare() { | 835 ExtensionFunction::ResponseAction UsbCloseDeviceFunction::Run() { |
| 924 parameters_ = CloseDevice::Params::Create(*args_); | 836 scoped_ptr<extensions::core_api::usb::CloseDevice::Params> parameters = |
| 925 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); | 837 CloseDevice::Params::Create(*args_); |
| 926 return true; | 838 EXTENSION_FUNCTION_VALIDATE(parameters.get()); |
| 927 } | |
| 928 | 839 |
| 929 void UsbCloseDeviceFunction::AsyncWorkStart() { | |
| 930 scoped_refptr<UsbDeviceHandle> device_handle = | 840 scoped_refptr<UsbDeviceHandle> device_handle = |
| 931 GetDeviceHandleOrCompleteWithError(parameters_->handle); | 841 GetDeviceHandle(parameters->handle); |
| 932 if (!device_handle.get()) | 842 if (!device_handle.get()) { |
| 933 return; | 843 return RespondNow(Error(kErrorNoConnection)); |
| 844 } |
| 934 | 845 |
| 935 // The device handle is closed when the resource is destroyed. | 846 // The device handle is closed when the resource is destroyed. |
| 936 RemoveUsbDeviceResource(parameters_->handle.handle); | 847 ReleaseDeviceHandle(parameters->handle); |
| 937 AsyncWorkCompleted(); | 848 return RespondNow(NoArguments()); |
| 938 } | 849 } |
| 939 | 850 |
| 940 UsbClaimInterfaceFunction::UsbClaimInterfaceFunction() { | 851 UsbClaimInterfaceFunction::UsbClaimInterfaceFunction() { |
| 941 } | 852 } |
| 942 | 853 |
| 943 UsbClaimInterfaceFunction::~UsbClaimInterfaceFunction() { | 854 UsbClaimInterfaceFunction::~UsbClaimInterfaceFunction() { |
| 944 } | 855 } |
| 945 | 856 |
| 946 bool UsbClaimInterfaceFunction::Prepare() { | 857 ExtensionFunction::ResponseAction UsbClaimInterfaceFunction::Run() { |
| 947 parameters_ = ClaimInterface::Params::Create(*args_); | 858 scoped_ptr<extensions::core_api::usb::ClaimInterface::Params> parameters = |
| 948 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); | 859 ClaimInterface::Params::Create(*args_); |
| 949 return true; | 860 EXTENSION_FUNCTION_VALIDATE(parameters.get()); |
| 861 |
| 862 scoped_refptr<UsbDeviceHandle> device_handle = |
| 863 GetDeviceHandle(parameters->handle); |
| 864 if (!device_handle.get()) { |
| 865 return RespondNow(Error(kErrorNoConnection)); |
| 866 } |
| 867 |
| 868 device_handle->ClaimInterface( |
| 869 parameters->interface_number, |
| 870 base::Bind(&UsbClaimInterfaceFunction::OnComplete, this)); |
| 871 return RespondLater(); |
| 950 } | 872 } |
| 951 | 873 |
| 952 void UsbClaimInterfaceFunction::AsyncWorkStart() { | 874 void UsbClaimInterfaceFunction::OnComplete(bool success) { |
| 953 scoped_refptr<UsbDeviceHandle> device_handle = | 875 if (success) { |
| 954 GetDeviceHandleOrCompleteWithError(parameters_->handle); | 876 Respond(NoArguments()); |
| 955 if (!device_handle.get()) | 877 } else { |
| 956 return; | 878 Respond(Error(kErrorCannotClaimInterface)); |
| 957 | 879 } |
| 958 bool success = device_handle->ClaimInterface(parameters_->interface_number); | |
| 959 | |
| 960 if (!success) | |
| 961 SetError(kErrorCannotClaimInterface); | |
| 962 AsyncWorkCompleted(); | |
| 963 } | 880 } |
| 964 | 881 |
| 965 UsbReleaseInterfaceFunction::UsbReleaseInterfaceFunction() { | 882 UsbReleaseInterfaceFunction::UsbReleaseInterfaceFunction() { |
| 966 } | 883 } |
| 967 | 884 |
| 968 UsbReleaseInterfaceFunction::~UsbReleaseInterfaceFunction() { | 885 UsbReleaseInterfaceFunction::~UsbReleaseInterfaceFunction() { |
| 969 } | 886 } |
| 970 | 887 |
| 971 bool UsbReleaseInterfaceFunction::Prepare() { | 888 ExtensionFunction::ResponseAction UsbReleaseInterfaceFunction::Run() { |
| 972 parameters_ = ReleaseInterface::Params::Create(*args_); | 889 scoped_ptr<extensions::core_api::usb::ReleaseInterface::Params> parameters = |
| 973 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); | 890 ReleaseInterface::Params::Create(*args_); |
| 974 return true; | 891 EXTENSION_FUNCTION_VALIDATE(parameters.get()); |
| 975 } | |
| 976 | 892 |
| 977 void UsbReleaseInterfaceFunction::AsyncWorkStart() { | |
| 978 scoped_refptr<UsbDeviceHandle> device_handle = | 893 scoped_refptr<UsbDeviceHandle> device_handle = |
| 979 GetDeviceHandleOrCompleteWithError(parameters_->handle); | 894 GetDeviceHandle(parameters->handle); |
| 980 if (!device_handle.get()) | 895 if (!device_handle.get()) { |
| 981 return; | 896 return RespondNow(Error(kErrorNoConnection)); |
| 897 } |
| 982 | 898 |
| 983 bool success = device_handle->ReleaseInterface(parameters_->interface_number); | 899 if (device_handle->ReleaseInterface(parameters->interface_number)) { |
| 984 if (!success) | 900 return RespondNow(NoArguments()); |
| 985 SetError(kErrorCannotReleaseInterface); | 901 } else { |
| 986 AsyncWorkCompleted(); | 902 return RespondNow(Error(kErrorCannotReleaseInterface)); |
| 903 } |
| 987 } | 904 } |
| 988 | 905 |
| 989 UsbSetInterfaceAlternateSettingFunction:: | 906 UsbSetInterfaceAlternateSettingFunction:: |
| 990 UsbSetInterfaceAlternateSettingFunction() { | 907 UsbSetInterfaceAlternateSettingFunction() { |
| 991 } | 908 } |
| 992 | 909 |
| 993 UsbSetInterfaceAlternateSettingFunction:: | 910 UsbSetInterfaceAlternateSettingFunction:: |
| 994 ~UsbSetInterfaceAlternateSettingFunction() { | 911 ~UsbSetInterfaceAlternateSettingFunction() { |
| 995 } | 912 } |
| 996 | 913 |
| 997 bool UsbSetInterfaceAlternateSettingFunction::Prepare() { | 914 ExtensionFunction::ResponseAction |
| 998 parameters_ = SetInterfaceAlternateSetting::Params::Create(*args_); | 915 UsbSetInterfaceAlternateSettingFunction::Run() { |
| 999 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); | 916 scoped_ptr<extensions::core_api::usb::SetInterfaceAlternateSetting::Params> |
| 1000 return true; | 917 parameters = SetInterfaceAlternateSetting::Params::Create(*args_); |
| 918 EXTENSION_FUNCTION_VALIDATE(parameters.get()); |
| 919 |
| 920 scoped_refptr<UsbDeviceHandle> device_handle = |
| 921 GetDeviceHandle(parameters->handle); |
| 922 if (!device_handle.get()) { |
| 923 return RespondNow(Error(kErrorNoConnection)); |
| 924 } |
| 925 |
| 926 device_handle->SetInterfaceAlternateSetting( |
| 927 parameters->interface_number, parameters->alternate_setting, |
| 928 base::Bind(&UsbSetInterfaceAlternateSettingFunction::OnComplete, this)); |
| 929 return RespondLater(); |
| 1001 } | 930 } |
| 1002 | 931 |
| 1003 void UsbSetInterfaceAlternateSettingFunction::AsyncWorkStart() { | 932 void UsbSetInterfaceAlternateSettingFunction::OnComplete(bool success) { |
| 1004 scoped_refptr<UsbDeviceHandle> device_handle = | 933 if (success) { |
| 1005 GetDeviceHandleOrCompleteWithError(parameters_->handle); | 934 Respond(NoArguments()); |
| 1006 if (!device_handle.get()) | 935 } else { |
| 1007 return; | 936 Respond(Error(kErrorCannotSetInterfaceAlternateSetting)); |
| 1008 | 937 } |
| 1009 bool success = device_handle->SetInterfaceAlternateSetting( | |
| 1010 parameters_->interface_number, parameters_->alternate_setting); | |
| 1011 if (!success) | |
| 1012 SetError(kErrorCannotSetInterfaceAlternateSetting); | |
| 1013 | |
| 1014 AsyncWorkCompleted(); | |
| 1015 } | 938 } |
| 1016 | 939 |
| 1017 UsbControlTransferFunction::UsbControlTransferFunction() { | 940 UsbControlTransferFunction::UsbControlTransferFunction() { |
| 1018 } | 941 } |
| 1019 | 942 |
| 1020 UsbControlTransferFunction::~UsbControlTransferFunction() { | 943 UsbControlTransferFunction::~UsbControlTransferFunction() { |
| 1021 } | 944 } |
| 1022 | 945 |
| 1023 bool UsbControlTransferFunction::Prepare() { | 946 ExtensionFunction::ResponseAction UsbControlTransferFunction::Run() { |
| 1024 parameters_ = ControlTransfer::Params::Create(*args_); | 947 scoped_ptr<extensions::core_api::usb::ControlTransfer::Params> parameters = |
| 1025 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); | 948 ControlTransfer::Params::Create(*args_); |
| 1026 return true; | 949 EXTENSION_FUNCTION_VALIDATE(parameters.get()); |
| 1027 } | |
| 1028 | 950 |
| 1029 void UsbControlTransferFunction::AsyncWorkStart() { | |
| 1030 scoped_refptr<UsbDeviceHandle> device_handle = | 951 scoped_refptr<UsbDeviceHandle> device_handle = |
| 1031 GetDeviceHandleOrCompleteWithError(parameters_->handle); | 952 GetDeviceHandle(parameters->handle); |
| 1032 if (!device_handle.get()) | 953 if (!device_handle.get()) { |
| 1033 return; | 954 return RespondNow(Error(kErrorNoConnection)); |
| 955 } |
| 1034 | 956 |
| 1035 const ControlTransferInfo& transfer = parameters_->transfer_info; | 957 const ControlTransferInfo& transfer = parameters->transfer_info; |
| 1036 | |
| 1037 UsbEndpointDirection direction; | 958 UsbEndpointDirection direction; |
| 1038 UsbDeviceHandle::TransferRequestType request_type; | 959 UsbDeviceHandle::TransferRequestType request_type; |
| 1039 UsbDeviceHandle::TransferRecipient recipient; | 960 UsbDeviceHandle::TransferRecipient recipient; |
| 1040 size_t size = 0; | 961 size_t size = 0; |
| 1041 | 962 |
| 1042 if (!ConvertDirectionSafely(transfer.direction, &direction) || | 963 if (!ConvertDirectionFromApi(transfer.direction, &direction)) { |
| 1043 !ConvertRequestTypeSafely(transfer.request_type, &request_type) || | 964 return RespondNow(Error(kErrorConvertDirection)); |
| 1044 !ConvertRecipientSafely(transfer.recipient, &recipient)) { | 965 } |
| 1045 AsyncWorkCompleted(); | 966 |
| 1046 return; | 967 if (!ConvertRequestTypeFromApi(transfer.request_type, &request_type)) { |
| 968 return RespondNow(Error(kErrorConvertRequestType)); |
| 969 } |
| 970 |
| 971 if (!ConvertRecipientFromApi(transfer.recipient, &recipient)) { |
| 972 return RespondNow(Error(kErrorConvertRecipient)); |
| 1047 } | 973 } |
| 1048 | 974 |
| 1049 if (!GetTransferSize(transfer, &size)) { | 975 if (!GetTransferSize(transfer, &size)) { |
| 1050 CompleteWithError(kErrorInvalidTransferLength); | 976 return RespondNow(Error(kErrorInvalidTransferLength)); |
| 1051 return; | |
| 1052 } | 977 } |
| 1053 | 978 |
| 1054 scoped_refptr<net::IOBuffer> buffer = | 979 scoped_refptr<net::IOBuffer> buffer = |
| 1055 CreateBufferForTransfer(transfer, direction, size); | 980 CreateBufferForTransfer(transfer, direction, size); |
| 1056 if (!buffer.get()) { | 981 if (!buffer.get()) { |
| 1057 CompleteWithError(kErrorMalformedParameters); | 982 return RespondNow(Error(kErrorMalformedParameters)); |
| 1058 return; | |
| 1059 } | 983 } |
| 1060 | 984 |
| 1061 int timeout = transfer.timeout ? *transfer.timeout : 0; | 985 int timeout = transfer.timeout ? *transfer.timeout : 0; |
| 1062 if (timeout < 0) { | 986 if (timeout < 0) { |
| 1063 CompleteWithError(kErrorInvalidTimeout); | 987 return RespondNow(Error(kErrorInvalidTimeout)); |
| 1064 return; | |
| 1065 } | 988 } |
| 1066 | 989 |
| 1067 device_handle->ControlTransfer( | 990 device_handle->ControlTransfer( |
| 1068 direction, request_type, recipient, transfer.request, transfer.value, | 991 direction, request_type, recipient, transfer.request, transfer.value, |
| 1069 transfer.index, buffer.get(), size, timeout, | 992 transfer.index, buffer.get(), size, timeout, |
| 1070 base::Bind(&UsbControlTransferFunction::OnCompleted, this)); | 993 base::Bind(&UsbControlTransferFunction::OnCompleted, this)); |
| 994 return RespondLater(); |
| 1071 } | 995 } |
| 1072 | 996 |
| 1073 UsbBulkTransferFunction::UsbBulkTransferFunction() { | 997 UsbBulkTransferFunction::UsbBulkTransferFunction() { |
| 1074 } | 998 } |
| 1075 | 999 |
| 1076 UsbBulkTransferFunction::~UsbBulkTransferFunction() { | 1000 UsbBulkTransferFunction::~UsbBulkTransferFunction() { |
| 1077 } | 1001 } |
| 1078 | 1002 |
| 1079 bool UsbBulkTransferFunction::Prepare() { | 1003 ExtensionFunction::ResponseAction UsbBulkTransferFunction::Run() { |
| 1080 parameters_ = BulkTransfer::Params::Create(*args_); | 1004 scoped_ptr<extensions::core_api::usb::BulkTransfer::Params> parameters = |
| 1081 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); | 1005 BulkTransfer::Params::Create(*args_); |
| 1082 return true; | 1006 EXTENSION_FUNCTION_VALIDATE(parameters.get()); |
| 1083 } | |
| 1084 | 1007 |
| 1085 void UsbBulkTransferFunction::AsyncWorkStart() { | |
| 1086 scoped_refptr<UsbDeviceHandle> device_handle = | 1008 scoped_refptr<UsbDeviceHandle> device_handle = |
| 1087 GetDeviceHandleOrCompleteWithError(parameters_->handle); | 1009 GetDeviceHandle(parameters->handle); |
| 1088 if (!device_handle.get()) | 1010 if (!device_handle.get()) { |
| 1089 return; | 1011 return RespondNow(Error(kErrorNoConnection)); |
| 1012 } |
| 1090 | 1013 |
| 1091 const GenericTransferInfo& transfer = parameters_->transfer_info; | 1014 const GenericTransferInfo& transfer = parameters->transfer_info; |
| 1092 | |
| 1093 UsbEndpointDirection direction; | 1015 UsbEndpointDirection direction; |
| 1094 size_t size = 0; | 1016 size_t size = 0; |
| 1095 | 1017 |
| 1096 if (!ConvertDirectionSafely(transfer.direction, &direction)) { | 1018 if (!ConvertDirectionFromApi(transfer.direction, &direction)) { |
| 1097 AsyncWorkCompleted(); | 1019 return RespondNow(Error(kErrorConvertDirection)); |
| 1098 return; | |
| 1099 } | 1020 } |
| 1100 | 1021 |
| 1101 if (!GetTransferSize(transfer, &size)) { | 1022 if (!GetTransferSize(transfer, &size)) { |
| 1102 CompleteWithError(kErrorInvalidTransferLength); | 1023 return RespondNow(Error(kErrorInvalidTransferLength)); |
| 1103 return; | |
| 1104 } | 1024 } |
| 1105 | 1025 |
| 1106 scoped_refptr<net::IOBuffer> buffer = | 1026 scoped_refptr<net::IOBuffer> buffer = |
| 1107 CreateBufferForTransfer(transfer, direction, size); | 1027 CreateBufferForTransfer(transfer, direction, size); |
| 1108 if (!buffer.get()) { | 1028 if (!buffer.get()) { |
| 1109 CompleteWithError(kErrorMalformedParameters); | 1029 return RespondNow(Error(kErrorMalformedParameters)); |
| 1110 return; | |
| 1111 } | 1030 } |
| 1112 | 1031 |
| 1113 int timeout = transfer.timeout ? *transfer.timeout : 0; | 1032 int timeout = transfer.timeout ? *transfer.timeout : 0; |
| 1114 if (timeout < 0) { | 1033 if (timeout < 0) { |
| 1115 CompleteWithError(kErrorInvalidTimeout); | 1034 return RespondNow(Error(kErrorInvalidTimeout)); |
| 1116 return; | |
| 1117 } | 1035 } |
| 1118 | 1036 |
| 1119 device_handle->BulkTransfer( | 1037 device_handle->BulkTransfer( |
| 1120 direction, transfer.endpoint, buffer.get(), size, timeout, | 1038 direction, transfer.endpoint, buffer.get(), size, timeout, |
| 1121 base::Bind(&UsbBulkTransferFunction::OnCompleted, this)); | 1039 base::Bind(&UsbBulkTransferFunction::OnCompleted, this)); |
| 1040 return RespondLater(); |
| 1122 } | 1041 } |
| 1123 | 1042 |
| 1124 UsbInterruptTransferFunction::UsbInterruptTransferFunction() { | 1043 UsbInterruptTransferFunction::UsbInterruptTransferFunction() { |
| 1125 } | 1044 } |
| 1126 | 1045 |
| 1127 UsbInterruptTransferFunction::~UsbInterruptTransferFunction() { | 1046 UsbInterruptTransferFunction::~UsbInterruptTransferFunction() { |
| 1128 } | 1047 } |
| 1129 | 1048 |
| 1130 bool UsbInterruptTransferFunction::Prepare() { | 1049 ExtensionFunction::ResponseAction UsbInterruptTransferFunction::Run() { |
| 1131 parameters_ = InterruptTransfer::Params::Create(*args_); | 1050 scoped_ptr<extensions::core_api::usb::InterruptTransfer::Params> parameters = |
| 1132 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); | 1051 InterruptTransfer::Params::Create(*args_); |
| 1133 return true; | 1052 EXTENSION_FUNCTION_VALIDATE(parameters.get()); |
| 1134 } | |
| 1135 | 1053 |
| 1136 void UsbInterruptTransferFunction::AsyncWorkStart() { | |
| 1137 scoped_refptr<UsbDeviceHandle> device_handle = | 1054 scoped_refptr<UsbDeviceHandle> device_handle = |
| 1138 GetDeviceHandleOrCompleteWithError(parameters_->handle); | 1055 GetDeviceHandle(parameters->handle); |
| 1139 if (!device_handle.get()) | 1056 if (!device_handle.get()) { |
| 1140 return; | 1057 return RespondNow(Error(kErrorNoConnection)); |
| 1058 } |
| 1141 | 1059 |
| 1142 const GenericTransferInfo& transfer = parameters_->transfer_info; | 1060 const GenericTransferInfo& transfer = parameters->transfer_info; |
| 1143 | |
| 1144 UsbEndpointDirection direction; | 1061 UsbEndpointDirection direction; |
| 1145 size_t size = 0; | 1062 size_t size = 0; |
| 1146 | 1063 |
| 1147 if (!ConvertDirectionSafely(transfer.direction, &direction)) { | 1064 if (!ConvertDirectionFromApi(transfer.direction, &direction)) { |
| 1148 AsyncWorkCompleted(); | 1065 return RespondNow(Error(kErrorConvertDirection)); |
| 1149 return; | |
| 1150 } | 1066 } |
| 1151 | 1067 |
| 1152 if (!GetTransferSize(transfer, &size)) { | 1068 if (!GetTransferSize(transfer, &size)) { |
| 1153 CompleteWithError(kErrorInvalidTransferLength); | 1069 return RespondNow(Error(kErrorInvalidTransferLength)); |
| 1154 return; | |
| 1155 } | 1070 } |
| 1156 | 1071 |
| 1157 scoped_refptr<net::IOBuffer> buffer = | 1072 scoped_refptr<net::IOBuffer> buffer = |
| 1158 CreateBufferForTransfer(transfer, direction, size); | 1073 CreateBufferForTransfer(transfer, direction, size); |
| 1159 if (!buffer.get()) { | 1074 if (!buffer.get()) { |
| 1160 CompleteWithError(kErrorMalformedParameters); | 1075 return RespondNow(Error(kErrorMalformedParameters)); |
| 1161 return; | |
| 1162 } | 1076 } |
| 1163 | 1077 |
| 1164 int timeout = transfer.timeout ? *transfer.timeout : 0; | 1078 int timeout = transfer.timeout ? *transfer.timeout : 0; |
| 1165 if (timeout < 0) { | 1079 if (timeout < 0) { |
| 1166 CompleteWithError(kErrorInvalidTimeout); | 1080 return RespondNow(Error(kErrorInvalidTimeout)); |
| 1167 return; | |
| 1168 } | 1081 } |
| 1169 | 1082 |
| 1170 device_handle->InterruptTransfer( | 1083 device_handle->InterruptTransfer( |
| 1171 direction, transfer.endpoint, buffer.get(), size, timeout, | 1084 direction, transfer.endpoint, buffer.get(), size, timeout, |
| 1172 base::Bind(&UsbInterruptTransferFunction::OnCompleted, this)); | 1085 base::Bind(&UsbInterruptTransferFunction::OnCompleted, this)); |
| 1086 return RespondLater(); |
| 1173 } | 1087 } |
| 1174 | 1088 |
| 1175 UsbIsochronousTransferFunction::UsbIsochronousTransferFunction() { | 1089 UsbIsochronousTransferFunction::UsbIsochronousTransferFunction() { |
| 1176 } | 1090 } |
| 1177 | 1091 |
| 1178 UsbIsochronousTransferFunction::~UsbIsochronousTransferFunction() { | 1092 UsbIsochronousTransferFunction::~UsbIsochronousTransferFunction() { |
| 1179 } | 1093 } |
| 1180 | 1094 |
| 1181 bool UsbIsochronousTransferFunction::Prepare() { | 1095 ExtensionFunction::ResponseAction UsbIsochronousTransferFunction::Run() { |
| 1182 parameters_ = IsochronousTransfer::Params::Create(*args_); | 1096 scoped_ptr<extensions::core_api::usb::IsochronousTransfer::Params> |
| 1183 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); | 1097 parameters = IsochronousTransfer::Params::Create(*args_); |
| 1184 return true; | 1098 EXTENSION_FUNCTION_VALIDATE(parameters.get()); |
| 1185 } | |
| 1186 | 1099 |
| 1187 void UsbIsochronousTransferFunction::AsyncWorkStart() { | |
| 1188 scoped_refptr<UsbDeviceHandle> device_handle = | 1100 scoped_refptr<UsbDeviceHandle> device_handle = |
| 1189 GetDeviceHandleOrCompleteWithError(parameters_->handle); | 1101 GetDeviceHandle(parameters->handle); |
| 1190 if (!device_handle.get()) | 1102 if (!device_handle.get()) { |
| 1191 return; | 1103 return RespondNow(Error(kErrorNoConnection)); |
| 1104 } |
| 1192 | 1105 |
| 1193 const IsochronousTransferInfo& transfer = parameters_->transfer_info; | 1106 const IsochronousTransferInfo& transfer = parameters->transfer_info; |
| 1194 const GenericTransferInfo& generic_transfer = transfer.transfer_info; | 1107 const GenericTransferInfo& generic_transfer = transfer.transfer_info; |
| 1195 | |
| 1196 size_t size = 0; | 1108 size_t size = 0; |
| 1197 UsbEndpointDirection direction; | 1109 UsbEndpointDirection direction; |
| 1198 | 1110 |
| 1199 if (!ConvertDirectionSafely(generic_transfer.direction, &direction)) { | 1111 if (!ConvertDirectionFromApi(generic_transfer.direction, &direction)) { |
| 1200 AsyncWorkCompleted(); | 1112 return RespondNow(Error(kErrorConvertDirection)); |
| 1201 return; | |
| 1202 } | 1113 } |
| 1114 |
| 1203 if (!GetTransferSize(generic_transfer, &size)) { | 1115 if (!GetTransferSize(generic_transfer, &size)) { |
| 1204 CompleteWithError(kErrorInvalidTransferLength); | 1116 return RespondNow(Error(kErrorInvalidTransferLength)); |
| 1205 return; | |
| 1206 } | 1117 } |
| 1118 |
| 1207 if (transfer.packets < 0 || transfer.packets >= kMaxPackets) { | 1119 if (transfer.packets < 0 || transfer.packets >= kMaxPackets) { |
| 1208 CompleteWithError(kErrorInvalidNumberOfPackets); | 1120 return RespondNow(Error(kErrorInvalidNumberOfPackets)); |
| 1209 return; | |
| 1210 } | 1121 } |
| 1122 |
| 1211 unsigned int packets = transfer.packets; | 1123 unsigned int packets = transfer.packets; |
| 1212 if (transfer.packet_length < 0 || | 1124 if (transfer.packet_length < 0 || |
| 1213 transfer.packet_length >= kMaxPacketLength) { | 1125 transfer.packet_length >= kMaxPacketLength) { |
| 1214 CompleteWithError(kErrorInvalidPacketLength); | 1126 return RespondNow(Error(kErrorInvalidPacketLength)); |
| 1215 return; | |
| 1216 } | 1127 } |
| 1128 |
| 1217 unsigned int packet_length = transfer.packet_length; | 1129 unsigned int packet_length = transfer.packet_length; |
| 1218 const uint64 total_length = packets * packet_length; | 1130 const uint64 total_length = packets * packet_length; |
| 1219 if (packets > size || total_length > size) { | 1131 if (packets > size || total_length > size) { |
| 1220 CompleteWithError(kErrorTransferLength); | 1132 return RespondNow(Error(kErrorTransferLength)); |
| 1221 return; | |
| 1222 } | 1133 } |
| 1223 | 1134 |
| 1224 scoped_refptr<net::IOBuffer> buffer = | 1135 scoped_refptr<net::IOBuffer> buffer = |
| 1225 CreateBufferForTransfer(generic_transfer, direction, size); | 1136 CreateBufferForTransfer(generic_transfer, direction, size); |
| 1226 if (!buffer.get()) { | 1137 if (!buffer.get()) { |
| 1227 CompleteWithError(kErrorMalformedParameters); | 1138 return RespondNow(Error(kErrorMalformedParameters)); |
| 1228 return; | |
| 1229 } | 1139 } |
| 1230 | 1140 |
| 1231 int timeout = generic_transfer.timeout ? *generic_transfer.timeout : 0; | 1141 int timeout = generic_transfer.timeout ? *generic_transfer.timeout : 0; |
| 1232 if (timeout < 0) { | 1142 if (timeout < 0) { |
| 1233 CompleteWithError(kErrorInvalidTimeout); | 1143 return RespondNow(Error(kErrorInvalidTimeout)); |
| 1234 return; | |
| 1235 } | 1144 } |
| 1236 | 1145 |
| 1237 device_handle->IsochronousTransfer( | 1146 device_handle->IsochronousTransfer( |
| 1238 direction, generic_transfer.endpoint, buffer.get(), size, packets, | 1147 direction, generic_transfer.endpoint, buffer.get(), size, packets, |
| 1239 packet_length, timeout, | 1148 packet_length, timeout, |
| 1240 base::Bind(&UsbIsochronousTransferFunction::OnCompleted, this)); | 1149 base::Bind(&UsbIsochronousTransferFunction::OnCompleted, this)); |
| 1150 return RespondLater(); |
| 1241 } | 1151 } |
| 1242 | 1152 |
| 1243 UsbResetDeviceFunction::UsbResetDeviceFunction() { | 1153 UsbResetDeviceFunction::UsbResetDeviceFunction() { |
| 1244 } | 1154 } |
| 1245 | 1155 |
| 1246 UsbResetDeviceFunction::~UsbResetDeviceFunction() { | 1156 UsbResetDeviceFunction::~UsbResetDeviceFunction() { |
| 1247 } | 1157 } |
| 1248 | 1158 |
| 1249 bool UsbResetDeviceFunction::Prepare() { | 1159 ExtensionFunction::ResponseAction UsbResetDeviceFunction::Run() { |
| 1250 parameters_ = ResetDevice::Params::Create(*args_); | 1160 parameters_ = ResetDevice::Params::Create(*args_); |
| 1251 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); | 1161 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); |
| 1252 return true; | 1162 |
| 1163 scoped_refptr<UsbDeviceHandle> device_handle = |
| 1164 GetDeviceHandle(parameters_->handle); |
| 1165 if (!device_handle.get()) { |
| 1166 return RespondNow(Error(kErrorNoConnection)); |
| 1167 } |
| 1168 |
| 1169 device_handle->ResetDevice( |
| 1170 base::Bind(&UsbResetDeviceFunction::OnComplete, this)); |
| 1171 return RespondLater(); |
| 1253 } | 1172 } |
| 1254 | 1173 |
| 1255 void UsbResetDeviceFunction::AsyncWorkStart() { | 1174 void UsbResetDeviceFunction::OnComplete(bool success) { |
| 1256 scoped_refptr<UsbDeviceHandle> device_handle = | 1175 if (success) { |
| 1257 GetDeviceHandleOrCompleteWithError(parameters_->handle); | 1176 Respond(OneArgument(new base::FundamentalValue(true))); |
| 1258 if (!device_handle.get()) | 1177 } else { |
| 1259 return; | 1178 scoped_refptr<UsbDeviceHandle> device_handle = |
| 1179 GetDeviceHandle(parameters_->handle); |
| 1180 if (device_handle.get()) { |
| 1181 device_handle->Close(); |
| 1182 } |
| 1183 ReleaseDeviceHandle(parameters_->handle); |
| 1260 | 1184 |
| 1261 bool success = device_handle->ResetDevice(); | 1185 scoped_ptr<base::ListValue> error_args(new base::ListValue()); |
| 1262 if (!success) { | 1186 error_args->AppendBoolean(false); |
| 1263 device_handle->Close(); | 1187 // Returning arguments with an error is wrong but we're stuck with it. |
| 1264 RemoveUsbDeviceResource(parameters_->handle.handle); | 1188 Respond(ErrorWithArguments(error_args.Pass(), kErrorResetDevice)); |
| 1265 SetResult(new base::FundamentalValue(false)); | |
| 1266 CompleteWithError(kErrorResetDevice); | |
| 1267 return; | |
| 1268 } | 1189 } |
| 1269 | |
| 1270 SetResult(new base::FundamentalValue(true)); | |
| 1271 AsyncWorkCompleted(); | |
| 1272 } | 1190 } |
| 1273 | 1191 |
| 1274 } // namespace extensions | 1192 } // namespace extensions |
| OLD | NEW |