| 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 <algorithm> | 7 #include <algorithm> |
| 8 #include <numeric> | 8 #include <numeric> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 310 case device::USB_USAGE_FEEDBACK: | 310 case device::USB_USAGE_FEEDBACK: |
| 311 return usb::USAGE_TYPE_FEEDBACK; | 311 return usb::USAGE_TYPE_FEEDBACK; |
| 312 case device::USB_USAGE_EXPLICIT_FEEDBACK: | 312 case device::USB_USAGE_EXPLICIT_FEEDBACK: |
| 313 return usb::USAGE_TYPE_EXPLICITFEEDBACK; | 313 return usb::USAGE_TYPE_EXPLICITFEEDBACK; |
| 314 default: | 314 default: |
| 315 NOTREACHED(); | 315 NOTREACHED(); |
| 316 return usb::USAGE_TYPE_NONE; | 316 return usb::USAGE_TYPE_NONE; |
| 317 } | 317 } |
| 318 } | 318 } |
| 319 | 319 |
| 320 void ConvertEndpointDescriptor(const UsbEndpointDescriptor& input, | 320 EndpointDescriptor ConvertEndpointDescriptor( |
| 321 EndpointDescriptor* output) { | 321 const UsbEndpointDescriptor& input) { |
| 322 output->address = input.address; | 322 EndpointDescriptor output; |
| 323 output->type = ConvertTransferTypeToApi(input.transfer_type); | 323 output.address = input.address; |
| 324 output->direction = ConvertDirectionToApi(input.direction); | 324 output.type = ConvertTransferTypeToApi(input.transfer_type); |
| 325 output->maximum_packet_size = input.maximum_packet_size; | 325 output.direction = ConvertDirectionToApi(input.direction); |
| 326 output->synchronization = | 326 output.maximum_packet_size = input.maximum_packet_size; |
| 327 output.synchronization = |
| 327 ConvertSynchronizationTypeToApi(input.synchronization_type); | 328 ConvertSynchronizationTypeToApi(input.synchronization_type); |
| 328 output->usage = ConvertUsageTypeToApi(input.usage_type); | 329 output.usage = ConvertUsageTypeToApi(input.usage_type); |
| 329 output->polling_interval.reset(new int(input.polling_interval)); | 330 output.polling_interval.reset(new int(input.polling_interval)); |
| 330 output->extra_data.assign(input.extra_data.begin(), input.extra_data.end()); | 331 output.extra_data.assign(input.extra_data.begin(), input.extra_data.end()); |
| 332 return output; |
| 331 } | 333 } |
| 332 | 334 |
| 333 void ConvertInterfaceDescriptor(const UsbInterfaceDescriptor& input, | 335 InterfaceDescriptor ConvertInterfaceDescriptor( |
| 334 InterfaceDescriptor* output) { | 336 const UsbInterfaceDescriptor& input) { |
| 335 output->interface_number = input.interface_number; | 337 InterfaceDescriptor output; |
| 336 output->alternate_setting = input.alternate_setting; | 338 output.interface_number = input.interface_number; |
| 337 output->interface_class = input.interface_class; | 339 output.alternate_setting = input.alternate_setting; |
| 338 output->interface_subclass = input.interface_subclass; | 340 output.interface_class = input.interface_class; |
| 339 output->interface_protocol = input.interface_protocol; | 341 output.interface_subclass = input.interface_subclass; |
| 340 for (const UsbEndpointDescriptor& input_endpoint : input.endpoints) { | 342 output.interface_protocol = input.interface_protocol; |
| 341 linked_ptr<EndpointDescriptor> endpoint(new EndpointDescriptor); | 343 for (const UsbEndpointDescriptor& input_endpoint : input.endpoints) |
| 342 ConvertEndpointDescriptor(input_endpoint, endpoint.get()); | 344 output.endpoints.push_back(ConvertEndpointDescriptor(input_endpoint)); |
| 343 output->endpoints.push_back(endpoint); | 345 output.extra_data.assign(input.extra_data.begin(), input.extra_data.end()); |
| 344 } | 346 return output; |
| 345 output->extra_data.assign(input.extra_data.begin(), input.extra_data.end()); | |
| 346 } | 347 } |
| 347 | 348 |
| 348 void ConvertConfigDescriptor(const UsbConfigDescriptor& input, | 349 ConfigDescriptor ConvertConfigDescriptor(const UsbConfigDescriptor& input) { |
| 349 ConfigDescriptor* output) { | 350 ConfigDescriptor output; |
| 350 output->configuration_value = input.configuration_value; | 351 output.configuration_value = input.configuration_value; |
| 351 output->self_powered = input.self_powered; | 352 output.self_powered = input.self_powered; |
| 352 output->remote_wakeup = input.remote_wakeup; | 353 output.remote_wakeup = input.remote_wakeup; |
| 353 output->max_power = input.maximum_power; | 354 output.max_power = input.maximum_power; |
| 354 for (const UsbInterfaceDescriptor& input_interface : input.interfaces) { | 355 for (const UsbInterfaceDescriptor& input_interface : input.interfaces) |
| 355 linked_ptr<InterfaceDescriptor> interface(new InterfaceDescriptor); | 356 output.interfaces.push_back(ConvertInterfaceDescriptor(input_interface)); |
| 356 ConvertInterfaceDescriptor(input_interface, interface.get()); | 357 output.extra_data.assign(input.extra_data.begin(), input.extra_data.end()); |
| 357 output->interfaces.push_back(interface); | 358 return output; |
| 358 } | |
| 359 output->extra_data.assign(input.extra_data.begin(), input.extra_data.end()); | |
| 360 } | 359 } |
| 361 | 360 |
| 362 void ConvertDeviceFilter(const usb::DeviceFilter& input, | 361 void ConvertDeviceFilter(const usb::DeviceFilter& input, |
| 363 UsbDeviceFilter* output) { | 362 UsbDeviceFilter* output) { |
| 364 if (input.vendor_id) { | 363 if (input.vendor_id) { |
| 365 output->SetVendorId(*input.vendor_id); | 364 output->SetVendorId(*input.vendor_id); |
| 366 } | 365 } |
| 367 if (input.product_id) { | 366 if (input.product_id) { |
| 368 output->SetProductId(*input.product_id); | 367 output->SetProductId(*input.product_id); |
| 369 } | 368 } |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 550 } | 549 } |
| 551 | 550 |
| 552 ExtensionFunction::ResponseAction UsbGetDevicesFunction::Run() { | 551 ExtensionFunction::ResponseAction UsbGetDevicesFunction::Run() { |
| 553 scoped_ptr<extensions::api::usb::GetDevices::Params> parameters = | 552 scoped_ptr<extensions::api::usb::GetDevices::Params> parameters = |
| 554 GetDevices::Params::Create(*args_); | 553 GetDevices::Params::Create(*args_); |
| 555 EXTENSION_FUNCTION_VALIDATE(parameters.get()); | 554 EXTENSION_FUNCTION_VALIDATE(parameters.get()); |
| 556 | 555 |
| 557 if (parameters->options.filters) { | 556 if (parameters->options.filters) { |
| 558 filters_.resize(parameters->options.filters->size()); | 557 filters_.resize(parameters->options.filters->size()); |
| 559 for (size_t i = 0; i < parameters->options.filters->size(); ++i) { | 558 for (size_t i = 0; i < parameters->options.filters->size(); ++i) { |
| 560 ConvertDeviceFilter(*parameters->options.filters->at(i).get(), | 559 ConvertDeviceFilter(parameters->options.filters->at(i), &filters_[i]); |
| 561 &filters_[i]); | |
| 562 } | 560 } |
| 563 } | 561 } |
| 564 if (parameters->options.vendor_id) { | 562 if (parameters->options.vendor_id) { |
| 565 filters_.resize(filters_.size() + 1); | 563 filters_.resize(filters_.size() + 1); |
| 566 filters_.back().SetVendorId(*parameters->options.vendor_id); | 564 filters_.back().SetVendorId(*parameters->options.vendor_id); |
| 567 if (parameters->options.product_id) { | 565 if (parameters->options.product_id) { |
| 568 filters_.back().SetProductId(*parameters->options.product_id); | 566 filters_.back().SetProductId(*parameters->options.product_id); |
| 569 } | 567 } |
| 570 } | 568 } |
| 571 | 569 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 612 | 610 |
| 613 bool multiple = false; | 611 bool multiple = false; |
| 614 if (parameters->options.multiple) { | 612 if (parameters->options.multiple) { |
| 615 multiple = *parameters->options.multiple; | 613 multiple = *parameters->options.multiple; |
| 616 } | 614 } |
| 617 | 615 |
| 618 std::vector<UsbDeviceFilter> filters; | 616 std::vector<UsbDeviceFilter> filters; |
| 619 if (parameters->options.filters) { | 617 if (parameters->options.filters) { |
| 620 filters.resize(parameters->options.filters->size()); | 618 filters.resize(parameters->options.filters->size()); |
| 621 for (size_t i = 0; i < parameters->options.filters->size(); ++i) { | 619 for (size_t i = 0; i < parameters->options.filters->size(); ++i) { |
| 622 ConvertDeviceFilter(*parameters->options.filters->at(i).get(), | 620 ConvertDeviceFilter(parameters->options.filters->at(i), &filters[i]); |
| 623 &filters[i]); | |
| 624 } | 621 } |
| 625 } | 622 } |
| 626 | 623 |
| 627 prompt_ = ExtensionsAPIClient::Get()->CreateDevicePermissionsPrompt( | 624 prompt_ = ExtensionsAPIClient::Get()->CreateDevicePermissionsPrompt( |
| 628 GetAssociatedWebContents()); | 625 GetAssociatedWebContents()); |
| 629 if (!prompt_) { | 626 if (!prompt_) { |
| 630 return RespondNow(Error(kErrorNotSupported)); | 627 return RespondNow(Error(kErrorNotSupported)); |
| 631 } | 628 } |
| 632 | 629 |
| 633 prompt_->AskForUsbDevices( | 630 prompt_->AskForUsbDevices( |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 676 | 673 |
| 677 if (!HasDevicePermission(device)) { | 674 if (!HasDevicePermission(device)) { |
| 678 // This function must act as if there is no such device. Otherwise it can be | 675 // This function must act as if there is no such device. Otherwise it can be |
| 679 // used to fingerprint unauthorized devices. | 676 // used to fingerprint unauthorized devices. |
| 680 return RespondNow(Error(kErrorNoDevice)); | 677 return RespondNow(Error(kErrorNoDevice)); |
| 681 } | 678 } |
| 682 | 679 |
| 683 scoped_ptr<base::ListValue> configs(new base::ListValue()); | 680 scoped_ptr<base::ListValue> configs(new base::ListValue()); |
| 684 const UsbConfigDescriptor* active_config = device->GetActiveConfiguration(); | 681 const UsbConfigDescriptor* active_config = device->GetActiveConfiguration(); |
| 685 for (const UsbConfigDescriptor& config : device->configurations()) { | 682 for (const UsbConfigDescriptor& config : device->configurations()) { |
| 686 ConfigDescriptor api_config; | 683 ConfigDescriptor api_config = ConvertConfigDescriptor(config); |
| 687 ConvertConfigDescriptor(config, &api_config); | |
| 688 if (active_config && | 684 if (active_config && |
| 689 config.configuration_value == active_config->configuration_value) { | 685 config.configuration_value == active_config->configuration_value) { |
| 690 api_config.active = true; | 686 api_config.active = true; |
| 691 } | 687 } |
| 692 configs->Append(api_config.ToValue()); | 688 configs->Append(api_config.ToValue()); |
| 693 } | 689 } |
| 694 return RespondNow(OneArgument(std::move(configs))); | 690 return RespondNow(OneArgument(std::move(configs))); |
| 695 } | 691 } |
| 696 | 692 |
| 697 UsbRequestAccessFunction::UsbRequestAccessFunction() { | 693 UsbRequestAccessFunction::UsbRequestAccessFunction() { |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 805 | 801 |
| 806 scoped_refptr<UsbDeviceHandle> device_handle = | 802 scoped_refptr<UsbDeviceHandle> device_handle = |
| 807 GetDeviceHandle(parameters->handle); | 803 GetDeviceHandle(parameters->handle); |
| 808 if (!device_handle.get()) { | 804 if (!device_handle.get()) { |
| 809 return RespondNow(Error(kErrorNoConnection)); | 805 return RespondNow(Error(kErrorNoConnection)); |
| 810 } | 806 } |
| 811 | 807 |
| 812 const UsbConfigDescriptor* config_descriptor = | 808 const UsbConfigDescriptor* config_descriptor = |
| 813 device_handle->GetDevice()->GetActiveConfiguration(); | 809 device_handle->GetDevice()->GetActiveConfiguration(); |
| 814 if (config_descriptor) { | 810 if (config_descriptor) { |
| 815 ConfigDescriptor config; | 811 ConfigDescriptor config = ConvertConfigDescriptor(*config_descriptor); |
| 816 ConvertConfigDescriptor(*config_descriptor, &config); | |
| 817 config.active = true; | 812 config.active = true; |
| 818 return RespondNow(OneArgument(config.ToValue())); | 813 return RespondNow(OneArgument(config.ToValue())); |
| 819 } else { | 814 } else { |
| 820 return RespondNow(Error(kErrorNotConfigured)); | 815 return RespondNow(Error(kErrorNotConfigured)); |
| 821 } | 816 } |
| 822 } | 817 } |
| 823 | 818 |
| 824 UsbListInterfacesFunction::UsbListInterfacesFunction() { | 819 UsbListInterfacesFunction::UsbListInterfacesFunction() { |
| 825 } | 820 } |
| 826 | 821 |
| 827 UsbListInterfacesFunction::~UsbListInterfacesFunction() { | 822 UsbListInterfacesFunction::~UsbListInterfacesFunction() { |
| 828 } | 823 } |
| 829 | 824 |
| 830 ExtensionFunction::ResponseAction UsbListInterfacesFunction::Run() { | 825 ExtensionFunction::ResponseAction UsbListInterfacesFunction::Run() { |
| 831 scoped_ptr<extensions::api::usb::ListInterfaces::Params> parameters = | 826 scoped_ptr<extensions::api::usb::ListInterfaces::Params> parameters = |
| 832 ListInterfaces::Params::Create(*args_); | 827 ListInterfaces::Params::Create(*args_); |
| 833 EXTENSION_FUNCTION_VALIDATE(parameters.get()); | 828 EXTENSION_FUNCTION_VALIDATE(parameters.get()); |
| 834 | 829 |
| 835 scoped_refptr<UsbDeviceHandle> device_handle = | 830 scoped_refptr<UsbDeviceHandle> device_handle = |
| 836 GetDeviceHandle(parameters->handle); | 831 GetDeviceHandle(parameters->handle); |
| 837 if (!device_handle.get()) { | 832 if (!device_handle.get()) { |
| 838 return RespondNow(Error(kErrorNoConnection)); | 833 return RespondNow(Error(kErrorNoConnection)); |
| 839 } | 834 } |
| 840 | 835 |
| 841 const UsbConfigDescriptor* config_descriptor = | 836 const UsbConfigDescriptor* config_descriptor = |
| 842 device_handle->GetDevice()->GetActiveConfiguration(); | 837 device_handle->GetDevice()->GetActiveConfiguration(); |
| 843 if (config_descriptor) { | 838 if (config_descriptor) { |
| 844 ConfigDescriptor config; | 839 ConfigDescriptor config = ConvertConfigDescriptor(*config_descriptor); |
| 845 ConvertConfigDescriptor(*config_descriptor, &config); | |
| 846 | 840 |
| 847 scoped_ptr<base::ListValue> result(new base::ListValue); | 841 scoped_ptr<base::ListValue> result(new base::ListValue); |
| 848 for (size_t i = 0; i < config.interfaces.size(); ++i) { | 842 for (size_t i = 0; i < config.interfaces.size(); ++i) { |
| 849 result->Append(config.interfaces[i]->ToValue()); | 843 result->Append(config.interfaces[i].ToValue()); |
| 850 } | 844 } |
| 851 | 845 |
| 852 return RespondNow(OneArgument(std::move(result))); | 846 return RespondNow(OneArgument(std::move(result))); |
| 853 } else { | 847 } else { |
| 854 return RespondNow(Error(kErrorNotConfigured)); | 848 return RespondNow(Error(kErrorNotConfigured)); |
| 855 } | 849 } |
| 856 } | 850 } |
| 857 | 851 |
| 858 UsbCloseDeviceFunction::UsbCloseDeviceFunction() { | 852 UsbCloseDeviceFunction::UsbCloseDeviceFunction() { |
| 859 } | 853 } |
| (...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1260 | 1254 |
| 1261 scoped_ptr<base::ListValue> error_args(new base::ListValue()); | 1255 scoped_ptr<base::ListValue> error_args(new base::ListValue()); |
| 1262 error_args->AppendBoolean(false); | 1256 error_args->AppendBoolean(false); |
| 1263 // Using ErrorWithArguments is discouraged but required to maintain | 1257 // Using ErrorWithArguments is discouraged but required to maintain |
| 1264 // compatibility with existing applications. | 1258 // compatibility with existing applications. |
| 1265 Respond(ErrorWithArguments(std::move(error_args), kErrorResetDevice)); | 1259 Respond(ErrorWithArguments(std::move(error_args), kErrorResetDevice)); |
| 1266 } | 1260 } |
| 1267 } | 1261 } |
| 1268 | 1262 |
| 1269 } // namespace extensions | 1263 } // namespace extensions |
| OLD | NEW |