Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "modules/webusb/USBDevice.h" | 5 #include "modules/webusb/USBDevice.h" |
| 6 | 6 |
| 7 #include "bindings/core/v8/CallbackPromiseAdapter.h" | 7 #include "bindings/core/v8/CallbackPromiseAdapter.h" |
| 8 #include "bindings/core/v8/ScriptPromise.h" | 8 #include "bindings/core/v8/ScriptPromise.h" |
| 9 #include "bindings/core/v8/ScriptPromiseResolver.h" | 9 #include "bindings/core/v8/ScriptPromiseResolver.h" |
| 10 #include "bindings/core/v8/ToV8.h" | 10 #include "bindings/core/v8/ToV8.h" |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 25 namespace blink { | 25 namespace blink { |
| 26 | 26 |
| 27 namespace { | 27 namespace { |
| 28 | 28 |
| 29 const char kDeviceStateChangeInProgress[] = "An operation that changes the devic e state is in progress."; | 29 const char kDeviceStateChangeInProgress[] = "An operation that changes the devic e state is in progress."; |
| 30 const char kInterfaceNotFound[] = "The interface number provided is not supporte d by the device in its current configuration."; | 30 const char kInterfaceNotFound[] = "The interface number provided is not supporte d by the device in its current configuration."; |
| 31 const char kInterfaceStateChangeInProgress[] = "An operation that changes interf ace state is in progress."; | 31 const char kInterfaceStateChangeInProgress[] = "An operation that changes interf ace state is in progress."; |
| 32 const char kOpenRequired[] = "The device must be opened first."; | 32 const char kOpenRequired[] = "The device must be opened first."; |
| 33 const char kVisibiltyError[] = "Connection is only allowed while the page is vis ible. This is a temporary measure until we are able to effectively communicate t o the user that the page is connected to a device."; | 33 const char kVisibiltyError[] = "Connection is only allowed while the page is vis ible. This is a temporary measure until we are able to effectively communicate t o the user that the page is connected to a device."; |
| 34 | 34 |
| 35 DOMException* convertControlTransferParameters( | |
| 36 WebUSBDevice::TransferDirection direction, | |
| 37 const USBControlTransferParameters& parameters, | |
| 38 WebUSBDevice::ControlTransferParameters* webParameters) | |
| 39 { | |
| 40 webParameters->direction = direction; | |
| 41 | 35 |
| 42 if (parameters.requestType() == "standard") | |
| 43 webParameters->type = WebUSBDevice::RequestType::Standard; | |
| 44 else if (parameters.requestType() == "class") | |
| 45 webParameters->type = WebUSBDevice::RequestType::Class; | |
| 46 else if (parameters.requestType() == "vendor") | |
| 47 webParameters->type = WebUSBDevice::RequestType::Vendor; | |
| 48 else | |
| 49 return DOMException::create(TypeMismatchError, "The control transfer req uestType parameter is invalid."); | |
| 50 | |
| 51 // TODO(reillyg): Check for interface and endpoint availability if that is | |
| 52 // the control transfer target. | |
| 53 if (parameters.recipient() == "device") | |
| 54 webParameters->recipient = WebUSBDevice::RequestRecipient::Device; | |
| 55 else if (parameters.recipient() == "interface") | |
| 56 webParameters->recipient = WebUSBDevice::RequestRecipient::Interface; | |
| 57 else if (parameters.recipient() == "endpoint") | |
| 58 webParameters->recipient = WebUSBDevice::RequestRecipient::Endpoint; | |
| 59 else if (parameters.recipient() == "other") | |
| 60 webParameters->recipient = WebUSBDevice::RequestRecipient::Other; | |
| 61 else | |
| 62 return DOMException::create(TypeMismatchError, "The control transfer rec ipient parameter is invalid."); | |
| 63 | |
| 64 webParameters->request = parameters.request(); | |
| 65 webParameters->value = parameters.value(); | |
| 66 webParameters->index = parameters.index(); | |
| 67 return nullptr; | |
| 68 } | |
| 69 | 36 |
| 70 String convertTransferStatus(const WebUSBTransferInfo::Status& status) | 37 String convertTransferStatus(const WebUSBTransferInfo::Status& status) |
| 71 { | 38 { |
| 72 switch (status) { | 39 switch (status) { |
| 73 case WebUSBTransferInfo::Status::Ok: | 40 case WebUSBTransferInfo::Status::Ok: |
| 74 return "ok"; | 41 return "ok"; |
| 75 case WebUSBTransferInfo::Status::Stall: | 42 case WebUSBTransferInfo::Status::Stall: |
| 76 return "stall"; | 43 return "stall"; |
| 77 case WebUSBTransferInfo::Status::Babble: | 44 case WebUSBTransferInfo::Status::Babble: |
| 78 return "babble"; | 45 return "babble"; |
| (...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 318 return USBDevice::create(device, resolver->getExecutionContext()); | 285 return USBDevice::create(device, resolver->getExecutionContext()); |
| 319 } | 286 } |
| 320 | 287 |
| 321 USBDevice::USBDevice(PassOwnPtr<WebUSBDevice> device, ExecutionContext* context) | 288 USBDevice::USBDevice(PassOwnPtr<WebUSBDevice> device, ExecutionContext* context) |
| 322 : ContextLifecycleObserver(context) | 289 : ContextLifecycleObserver(context) |
| 323 , PageLifecycleObserver(toDocument(context)->page()) | 290 , PageLifecycleObserver(toDocument(context)->page()) |
| 324 , m_device(device) | 291 , m_device(device) |
| 325 , m_opened(false) | 292 , m_opened(false) |
| 326 , m_deviceStateChangeInProgress(false) | 293 , m_deviceStateChangeInProgress(false) |
| 327 , m_configurationIndex(-1) | 294 , m_configurationIndex(-1) |
| 295 , m_inEndpoints(15) | |
| 296 , m_outEndpoints(15) | |
| 328 { | 297 { |
| 329 int configurationIndex = findConfigurationIndex(info().activeConfiguration); | 298 int configurationIndex = findConfigurationIndex(info().activeConfiguration); |
| 330 if (configurationIndex != -1) | 299 if (configurationIndex != -1) |
| 331 onConfigurationSelected(true /* success */, configurationIndex); | 300 onConfigurationSelected(true /* success */, configurationIndex); |
| 332 } | 301 } |
| 333 | 302 |
| 334 void USBDevice::onDeviceOpenedOrClosed(bool opened) | 303 void USBDevice::onDeviceOpenedOrClosed(bool opened) |
| 335 { | 304 { |
| 336 m_opened = opened; | 305 m_opened = opened; |
| 337 m_deviceStateChangeInProgress = false; | 306 m_deviceStateChangeInProgress = false; |
| 338 } | 307 } |
| 339 | 308 |
| 340 void USBDevice::onConfigurationSelected(bool success, size_t configurationIndex) | 309 void USBDevice::onConfigurationSelected(bool success, size_t configurationIndex) |
| 341 { | 310 { |
| 342 if (success) { | 311 if (success) { |
| 343 m_configurationIndex = configurationIndex; | 312 m_configurationIndex = configurationIndex; |
| 344 size_t numInterfaces = info().configurations[m_configurationIndex].inter faces.size(); | 313 size_t numInterfaces = info().configurations[m_configurationIndex].inter faces.size(); |
| 345 m_claimedInterfaces.clearAll(); | 314 m_claimedInterfaces.clearAll(); |
| 346 m_claimedInterfaces.resize(numInterfaces); | 315 m_claimedInterfaces.resize(numInterfaces); |
| 347 m_interfaceStateChangeInProgress.clearAll(); | 316 m_interfaceStateChangeInProgress.clearAll(); |
| 348 m_interfaceStateChangeInProgress.resize(numInterfaces); | 317 m_interfaceStateChangeInProgress.resize(numInterfaces); |
| 349 m_selectedAlternates.resize(numInterfaces); | 318 m_selectedAlternates.resize(numInterfaces); |
| 350 m_selectedAlternates.fill(0); | 319 m_selectedAlternates.fill(0); |
| 320 m_inEndpoints.clearAll(); | |
| 321 m_outEndpoints.clearAll(); | |
| 351 } | 322 } |
| 352 m_deviceStateChangeInProgress = false; | 323 m_deviceStateChangeInProgress = false; |
| 353 } | 324 } |
| 354 | 325 |
| 355 void USBDevice::onInterfaceClaimedOrUnclaimed(bool claimed, size_t interfaceInde x) | 326 void USBDevice::onInterfaceClaimedOrUnclaimed(bool claimed, size_t interfaceInde x) |
| 356 { | 327 { |
| 357 if (claimed) | 328 if (claimed) { |
| 358 m_claimedInterfaces.set(interfaceIndex); | 329 m_claimedInterfaces.set(interfaceIndex); |
| 359 else | 330 } else { |
| 360 m_claimedInterfaces.clear(interfaceIndex); | 331 m_claimedInterfaces.clear(interfaceIndex); |
| 332 m_selectedAlternates[interfaceIndex] = 0; | |
| 333 } | |
| 334 setEndpointsForInterface(interfaceIndex, claimed); | |
| 361 m_interfaceStateChangeInProgress.clear(interfaceIndex); | 335 m_interfaceStateChangeInProgress.clear(interfaceIndex); |
| 362 } | 336 } |
| 363 | 337 |
| 364 void USBDevice::onAlternateInterfaceSelected(bool success, size_t interfaceIndex , size_t alternateIndex) | 338 void USBDevice::onAlternateInterfaceSelected(bool success, size_t interfaceIndex , size_t alternateIndex) |
| 365 { | 339 { |
| 366 if (success) | 340 if (success) |
| 367 m_selectedAlternates[interfaceIndex] = alternateIndex; | 341 m_selectedAlternates[interfaceIndex] = alternateIndex; |
| 342 setEndpointsForInterface(interfaceIndex, success); | |
| 368 m_interfaceStateChangeInProgress.clear(interfaceIndex); | 343 m_interfaceStateChangeInProgress.clear(interfaceIndex); |
| 369 } | 344 } |
| 370 | 345 |
| 371 bool USBDevice::isInterfaceClaimed(size_t configurationIndex, size_t interfaceIn dex) const | 346 bool USBDevice::isInterfaceClaimed(size_t configurationIndex, size_t interfaceIn dex) const |
| 372 { | 347 { |
| 373 return m_configurationIndex != -1 && static_cast<size_t>(m_configurationInde x) == configurationIndex && m_claimedInterfaces.get(interfaceIndex); | 348 return m_configurationIndex != -1 && static_cast<size_t>(m_configurationInde x) == configurationIndex && m_claimedInterfaces.get(interfaceIndex); |
| 374 } | 349 } |
| 375 | 350 |
| 376 size_t USBDevice::selectedAlternateInterface(size_t interfaceIndex) const | 351 size_t USBDevice::selectedAlternateInterface(size_t interfaceIndex) const |
| 377 { | 352 { |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 472 ScriptPromise promise = resolver->promise(); | 447 ScriptPromise promise = resolver->promise(); |
| 473 if (ensureDeviceConfigured(resolver)) { | 448 if (ensureDeviceConfigured(resolver)) { |
| 474 int interfaceIndex = findInterfaceIndex(interfaceNumber); | 449 int interfaceIndex = findInterfaceIndex(interfaceNumber); |
| 475 if (interfaceIndex == -1) { | 450 if (interfaceIndex == -1) { |
| 476 resolver->reject(DOMException::create(NotFoundError, "The interface number provided is not supported by the device in its current configuration.")); | 451 resolver->reject(DOMException::create(NotFoundError, "The interface number provided is not supported by the device in its current configuration.")); |
| 477 } else if (m_interfaceStateChangeInProgress.get(interfaceIndex)) { | 452 } else if (m_interfaceStateChangeInProgress.get(interfaceIndex)) { |
| 478 resolver->reject(DOMException::create(InvalidStateError, kInterfaceS tateChangeInProgress)); | 453 resolver->reject(DOMException::create(InvalidStateError, kInterfaceS tateChangeInProgress)); |
| 479 } else if (!m_claimedInterfaces.get(interfaceIndex)) { | 454 } else if (!m_claimedInterfaces.get(interfaceIndex)) { |
| 480 resolver->resolve(); | 455 resolver->resolve(); |
| 481 } else { | 456 } else { |
| 457 setEndpointsForInterface(interfaceIndex, false); | |
|
juncai
2016/03/24 17:47:46
nit: add comment for false parameter.
Reilly Grant (use Gerrit)
2016/03/24 21:00:41
Done.
| |
| 482 m_interfaceStateChangeInProgress.set(interfaceIndex); | 458 m_interfaceStateChangeInProgress.set(interfaceIndex); |
| 483 m_device->releaseInterface(interfaceNumber, new ClaimInterfacePromis eAdapter(this, resolver, interfaceIndex, false /* release */)); | 459 m_device->releaseInterface(interfaceNumber, new ClaimInterfacePromis eAdapter(this, resolver, interfaceIndex, false /* release */)); |
| 484 } | 460 } |
| 485 } | 461 } |
| 486 return promise; | 462 return promise; |
| 487 } | 463 } |
| 488 | 464 |
| 489 ScriptPromise USBDevice::selectAlternateInterface(ScriptState* scriptState, uint 8_t interfaceNumber, uint8_t alternateSetting) | 465 ScriptPromise USBDevice::selectAlternateInterface(ScriptState* scriptState, uint 8_t interfaceNumber, uint8_t alternateSetting) |
| 490 { | 466 { |
| 491 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; | 467 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; |
| 492 ScriptPromise promise = resolver->promise(); | 468 ScriptPromise promise = resolver->promise(); |
| 493 if (ensureInterfaceClaimed(interfaceNumber, resolver)) { | 469 if (ensureInterfaceClaimed(interfaceNumber, resolver)) { |
| 494 // TODO(reillyg): This is duplicated work. | 470 // TODO(reillyg): This is duplicated work. |
| 495 int interfaceIndex = findInterfaceIndex(interfaceNumber); | 471 int interfaceIndex = findInterfaceIndex(interfaceNumber); |
| 496 ASSERT(interfaceIndex != -1); | 472 ASSERT(interfaceIndex != -1); |
| 497 int alternateIndex = findAlternateIndex(interfaceIndex, alternateSetting ); | 473 int alternateIndex = findAlternateIndex(interfaceIndex, alternateSetting ); |
| 498 if (alternateIndex == -1) { | 474 if (alternateIndex == -1) { |
| 499 resolver->reject(DOMException::create(NotFoundError, "The alternate setting provided is not supported by the device in its current configuration.")) ; | 475 resolver->reject(DOMException::create(NotFoundError, "The alternate setting provided is not supported by the device in its current configuration.")) ; |
| 500 } else { | 476 } else { |
| 477 setEndpointsForInterface(interfaceIndex, false); | |
|
juncai
2016/03/24 17:47:46
ditto.
Reilly Grant (use Gerrit)
2016/03/24 21:00:41
Done.
| |
| 501 m_interfaceStateChangeInProgress.set(interfaceIndex); | 478 m_interfaceStateChangeInProgress.set(interfaceIndex); |
| 502 m_device->setInterface(interfaceNumber, alternateSetting, new Select AlternateInterfacePromiseAdapter(this, resolver, interfaceIndex, alternateIndex) ); | 479 m_device->setInterface(interfaceNumber, alternateSetting, new Select AlternateInterfacePromiseAdapter(this, resolver, interfaceIndex, alternateIndex) ); |
| 503 } | 480 } |
| 504 } | 481 } |
| 505 return promise; | 482 return promise; |
| 506 } | 483 } |
| 507 | 484 |
| 508 ScriptPromise USBDevice::controlTransferIn(ScriptState* scriptState, const USBCo ntrolTransferParameters& setup, unsigned length) | 485 ScriptPromise USBDevice::controlTransferIn(ScriptState* scriptState, const USBCo ntrolTransferParameters& setup, unsigned length) |
| 509 { | 486 { |
| 510 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; | 487 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; |
| 511 ScriptPromise promise = resolver->promise(); | 488 ScriptPromise promise = resolver->promise(); |
| 512 if (ensureDeviceConfigured(resolver)) { | 489 if (ensureDeviceConfigured(resolver)) { |
| 513 WebUSBDevice::ControlTransferParameters parameters; | 490 WebUSBDevice::ControlTransferParameters parameters; |
| 514 DOMException* error = convertControlTransferParameters(WebUSBDevice::Tra nsferDirection::In, setup, ¶meters); | 491 if (convertControlTransferParameters(WebUSBDevice::TransferDirection::In , setup, ¶meters, resolver)) |
| 515 if (error) | |
| 516 resolver->reject(error); | |
| 517 else | |
| 518 m_device->controlTransfer(parameters, nullptr, length, 0, new Callba ckPromiseAdapter<InputTransferResult, USBError>(resolver)); | 492 m_device->controlTransfer(parameters, nullptr, length, 0, new Callba ckPromiseAdapter<InputTransferResult, USBError>(resolver)); |
| 519 } | 493 } |
| 520 return promise; | 494 return promise; |
| 521 } | 495 } |
| 522 | 496 |
| 523 ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC ontrolTransferParameters& setup) | 497 ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC ontrolTransferParameters& setup) |
| 524 { | 498 { |
| 525 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; | 499 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; |
| 526 ScriptPromise promise = resolver->promise(); | 500 ScriptPromise promise = resolver->promise(); |
| 527 if (ensureDeviceConfigured(resolver)) { | 501 if (ensureDeviceConfigured(resolver)) { |
| 528 WebUSBDevice::ControlTransferParameters parameters; | 502 WebUSBDevice::ControlTransferParameters parameters; |
| 529 DOMException* error = convertControlTransferParameters(WebUSBDevice::Tra nsferDirection::Out, setup, ¶meters); | 503 if (convertControlTransferParameters(WebUSBDevice::TransferDirection::Ou t, setup, ¶meters, resolver)) |
| 530 if (error) | |
| 531 resolver->reject(error); | |
| 532 else | |
| 533 m_device->controlTransfer(parameters, nullptr, 0, 0, new CallbackPro miseAdapter<OutputTransferResult, USBError>(resolver)); | 504 m_device->controlTransfer(parameters, nullptr, 0, 0, new CallbackPro miseAdapter<OutputTransferResult, USBError>(resolver)); |
| 534 } | 505 } |
| 535 return promise; | 506 return promise; |
| 536 } | 507 } |
| 537 | 508 |
| 538 ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC ontrolTransferParameters& setup, const ArrayBufferOrArrayBufferView& data) | 509 ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC ontrolTransferParameters& setup, const ArrayBufferOrArrayBufferView& data) |
| 539 { | 510 { |
| 540 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; | 511 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; |
| 541 ScriptPromise promise = resolver->promise(); | 512 ScriptPromise promise = resolver->promise(); |
| 542 if (ensureDeviceConfigured(resolver)) { | 513 if (ensureDeviceConfigured(resolver)) { |
| 543 WebUSBDevice::ControlTransferParameters parameters; | 514 WebUSBDevice::ControlTransferParameters parameters; |
| 544 DOMException* error = convertControlTransferParameters(WebUSBDevice::Tra nsferDirection::Out, setup, ¶meters); | 515 if (convertControlTransferParameters(WebUSBDevice::TransferDirection::Ou t, setup, ¶meters, resolver)) { |
| 545 if (error) { | |
| 546 resolver->reject(error); | |
| 547 } else { | |
| 548 BufferSource buffer(data); | 516 BufferSource buffer(data); |
| 549 m_device->controlTransfer(parameters, buffer.data(), buffer.size(), 0, new CallbackPromiseAdapter<OutputTransferResult, USBError>(resolver)); | 517 m_device->controlTransfer(parameters, buffer.data(), buffer.size(), 0, new CallbackPromiseAdapter<OutputTransferResult, USBError>(resolver)); |
| 550 } | 518 } |
| 551 } | 519 } |
| 552 return promise; | 520 return promise; |
| 553 } | 521 } |
| 554 | 522 |
| 555 ScriptPromise USBDevice::clearHalt(ScriptState* scriptState, String direction, u int8_t endpointNumber) | 523 ScriptPromise USBDevice::clearHalt(ScriptState* scriptState, String direction, u int8_t endpointNumber) |
| 556 { | 524 { |
| 557 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; | 525 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 716 resolver->reject(DOMException::create(InvalidStateError, kInterfaceState ChangeInProgress)); | 684 resolver->reject(DOMException::create(InvalidStateError, kInterfaceState ChangeInProgress)); |
| 717 else if (!m_claimedInterfaces.get(interfaceIndex)) | 685 else if (!m_claimedInterfaces.get(interfaceIndex)) |
| 718 resolver->reject(DOMException::create(InvalidStateError, "The specified interface has not been claimed.")); | 686 resolver->reject(DOMException::create(InvalidStateError, "The specified interface has not been claimed.")); |
| 719 else | 687 else |
| 720 return true; | 688 return true; |
| 721 return false; | 689 return false; |
| 722 } | 690 } |
| 723 | 691 |
| 724 bool USBDevice::ensureEndpointAvailable(bool inTransfer, uint8_t endpointNumber, ScriptPromiseResolver* resolver) const | 692 bool USBDevice::ensureEndpointAvailable(bool inTransfer, uint8_t endpointNumber, ScriptPromiseResolver* resolver) const |
| 725 { | 693 { |
| 726 // TODO(reillyg): Check endpoint availability once Blink is tracking which | 694 if (!ensureDeviceConfigured(resolver)) |
| 727 // alternate interfaces are selected. | 695 return false; |
| 728 return ensureDeviceConfigured(resolver); | 696 if (endpointNumber <= 0 || endpointNumber >= 16) { |
|
juncai
2016/03/24 17:47:46
endpointNumber is uint8_t, checking < 0 seems redu
Reilly Grant (use Gerrit)
2016/03/24 21:00:41
Done.
| |
| 697 resolver->reject(DOMException::create(IndexSizeError, "The specified end point number is out of range.")); | |
| 698 return false; | |
| 699 } | |
| 700 auto& bitVector = inTransfer ? m_inEndpoints : m_outEndpoints; | |
| 701 if (!bitVector.get(endpointNumber - 1)) { | |
| 702 resolver->reject(DOMException::create(NotFoundError, "The specified endp oint is not part of a claimed and selected alternate interface.")); | |
| 703 return false; | |
| 704 } | |
| 705 return true; | |
| 729 } | 706 } |
| 730 | 707 |
| 731 bool USBDevice::anyInterfaceChangeInProgress() const | 708 bool USBDevice::anyInterfaceChangeInProgress() const |
| 732 { | 709 { |
| 733 for (size_t i = 0; i < m_interfaceStateChangeInProgress.size(); ++i) { | 710 for (size_t i = 0; i < m_interfaceStateChangeInProgress.size(); ++i) { |
| 734 if (m_interfaceStateChangeInProgress.quickGet(i)) | 711 if (m_interfaceStateChangeInProgress.quickGet(i)) |
| 735 return true; | 712 return true; |
| 736 } | 713 } |
| 737 return false; | 714 return false; |
| 738 } | 715 } |
| 739 | 716 |
| 717 bool USBDevice::convertControlTransferParameters( | |
| 718 WebUSBDevice::TransferDirection direction, | |
| 719 const USBControlTransferParameters& parameters, | |
| 720 WebUSBDevice::ControlTransferParameters* webParameters, | |
| 721 ScriptPromiseResolver* resolver) const | |
| 722 { | |
| 723 webParameters->direction = direction; | |
| 724 | |
| 725 if (parameters.requestType() == "standard") { | |
|
juncai
2016/03/24 17:47:46
maybe can use a variable to store parameters.reque
Reilly Grant (use Gerrit)
2016/03/24 21:00:41
These are simple inline accessors. There is no ben
| |
| 726 webParameters->type = WebUSBDevice::RequestType::Standard; | |
| 727 } else if (parameters.requestType() == "class") { | |
| 728 webParameters->type = WebUSBDevice::RequestType::Class; | |
| 729 } else if (parameters.requestType() == "vendor") { | |
| 730 webParameters->type = WebUSBDevice::RequestType::Vendor; | |
| 731 } else { | |
| 732 resolver->reject(DOMException::create(TypeMismatchError, "The control tr ansfer requestType parameter is invalid.")); | |
| 733 return false; | |
| 734 } | |
| 735 | |
| 736 if (parameters.recipient() == "device") { | |
|
juncai
2016/03/24 17:47:46
ditto for parameters.recipient().
| |
| 737 webParameters->recipient = WebUSBDevice::RequestRecipient::Device; | |
| 738 } else if (parameters.recipient() == "interface") { | |
| 739 size_t interfaceNumber = parameters.index() & 0xff; | |
| 740 if (!ensureInterfaceClaimed(interfaceNumber, resolver)) | |
| 741 return false; | |
| 742 webParameters->recipient = WebUSBDevice::RequestRecipient::Interface; | |
| 743 } else if (parameters.recipient() == "endpoint") { | |
| 744 bool inTransfer = parameters.index() & 0x80; | |
| 745 size_t endpointNumber = parameters.index() & 0x0f; | |
| 746 if (!ensureEndpointAvailable(inTransfer, endpointNumber, resolver)) | |
| 747 return false; | |
| 748 webParameters->recipient = WebUSBDevice::RequestRecipient::Endpoint; | |
| 749 } else if (parameters.recipient() == "other") { | |
| 750 webParameters->recipient = WebUSBDevice::RequestRecipient::Other; | |
| 751 } else { | |
| 752 resolver->reject(DOMException::create(TypeMismatchError, "The control tr ansfer recipient parameter is invalid.")); | |
| 753 return false; | |
| 754 } | |
| 755 | |
| 756 webParameters->request = parameters.request(); | |
| 757 webParameters->value = parameters.value(); | |
| 758 webParameters->index = parameters.index(); | |
| 759 return true; | |
| 760 } | |
| 761 | |
| 762 void USBDevice::setEndpointsForInterface(size_t interfaceIndex, bool set) | |
| 763 { | |
| 764 const auto& configuration = info().configurations[m_configurationIndex]; | |
| 765 const auto& interface = configuration.interfaces[interfaceIndex]; | |
| 766 const auto& alternate = interface.alternates[m_selectedAlternates[interfaceI ndex]]; | |
| 767 for (const auto& endpoint : alternate.endpoints) { | |
| 768 if (endpoint.endpointNumber == 0 || endpoint.endpointNumber >= 16) | |
| 769 continue; // Ignore endpoints with invalid indices. | |
| 770 auto& bitVector = endpoint.direction == WebUSBDevice::TransferDirection: :In ? m_inEndpoints : m_outEndpoints; | |
| 771 if (set) | |
| 772 bitVector.set(endpoint.endpointNumber - 1); | |
| 773 else | |
| 774 bitVector.clear(endpoint.endpointNumber - 1); | |
| 775 } | |
| 776 } | |
| 777 | |
| 740 } // namespace blink | 778 } // namespace blink |
| OLD | NEW |