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/hid/hid_api.h" | 5 #include "extensions/browser/api/hid/hid_api.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
11 #include "device/core/device_client.h" | 11 #include "device/core/device_client.h" |
12 #include "device/hid/hid_connection.h" | 12 #include "device/hid/hid_connection.h" |
13 #include "device/hid/hid_device_filter.h" | 13 #include "device/hid/hid_device_filter.h" |
14 #include "device/hid/hid_device_info.h" | 14 #include "device/hid/hid_device_info.h" |
15 #include "device/hid/hid_service.h" | 15 #include "device/hid/hid_service.h" |
16 #include "extensions/browser/api/api_resource_manager.h" | 16 #include "extensions/browser/api/api_resource_manager.h" |
17 #include "extensions/browser/api/device_permissions_prompt.h" | |
18 #include "extensions/browser/api/extensions_api_client.h" | |
17 #include "extensions/common/api/hid.h" | 19 #include "extensions/common/api/hid.h" |
18 #include "net/base/io_buffer.h" | 20 #include "net/base/io_buffer.h" |
19 | 21 |
20 namespace hid = extensions::core_api::hid; | 22 namespace hid = extensions::core_api::hid; |
21 | 23 |
22 using device::HidConnection; | 24 using device::HidConnection; |
23 using device::HidDeviceFilter; | 25 using device::HidDeviceFilter; |
24 using device::HidDeviceInfo; | 26 using device::HidDeviceInfo; |
25 using device::HidService; | 27 using device::HidService; |
26 | 28 |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
94 extension(), filters, | 96 extension(), filters, |
95 base::Bind(&HidGetDevicesFunction::OnEnumerationComplete, this)); | 97 base::Bind(&HidGetDevicesFunction::OnEnumerationComplete, this)); |
96 return RespondLater(); | 98 return RespondLater(); |
97 } | 99 } |
98 | 100 |
99 void HidGetDevicesFunction::OnEnumerationComplete( | 101 void HidGetDevicesFunction::OnEnumerationComplete( |
100 scoped_ptr<base::ListValue> devices) { | 102 scoped_ptr<base::ListValue> devices) { |
101 Respond(OneArgument(devices.release())); | 103 Respond(OneArgument(devices.release())); |
102 } | 104 } |
103 | 105 |
106 HidGetUserSelectedDevicesFunction::HidGetUserSelectedDevicesFunction() { | |
107 } | |
108 | |
109 HidGetUserSelectedDevicesFunction::~HidGetUserSelectedDevicesFunction() { | |
110 } | |
111 | |
112 ExtensionFunction::ResponseAction HidGetUserSelectedDevicesFunction::Run() { | |
Devlin
2015/05/05 22:19:50
I thought I saw something in the IDL about this ne
Reilly Grant (use Gerrit)
2015/05/06 00:52:52
Good catch.
| |
113 scoped_ptr<core_api::hid::GetUserSelectedDevices::Params> parameters = | |
114 hid::GetUserSelectedDevices::Params::Create(*args_); | |
115 EXTENSION_FUNCTION_VALIDATE(parameters.get()); | |
Devlin
2015/05/05 22:19:50
nit: scoped_ptrs are Testable, so you don't need t
Reilly Grant (use Gerrit)
2015/05/06 00:52:52
Fixed.
| |
116 | |
117 bool multiple = false; | |
118 if (parameters->options.multiple) { | |
Devlin
2015/05/05 22:19:50
inline all this?
bool multiple = parameters->optio
Reilly Grant (use Gerrit)
2015/05/06 00:52:52
Done.
| |
119 multiple = *parameters->options.multiple; | |
120 } | |
121 | |
122 std::vector<HidDeviceFilter> filters; | |
123 if (parameters->options.filters) { | |
124 filters.resize(parameters->options.filters->size()); | |
125 for (size_t i = 0; i < parameters->options.filters->size(); ++i) { | |
126 ConvertHidDeviceFilter(parameters->options.filters->at(i), &filters[i]); | |
127 } | |
128 } | |
129 | |
130 prompt_ = ExtensionsAPIClient::Get()->CreateDevicePermissionsPrompt( | |
131 GetAssociatedWebContents()); | |
Devlin
2015/05/05 22:19:50
Prefer GetSenderWebContents() in most cases.
Reilly Grant (use Gerrit)
2015/05/06 00:52:53
Done.
| |
132 if (!prompt_) { | |
133 return RespondNow(Error(kErrorServiceUnavailable)); | |
134 } | |
135 | |
136 prompt_->AskForHidDevices( | |
137 extension(), browser_context(), multiple, filters, | |
138 base::Bind(&HidGetUserSelectedDevicesFunction::OnDevicesChosen, this)); | |
139 return RespondLater(); | |
140 } | |
141 | |
142 void HidGetUserSelectedDevicesFunction::OnDevicesChosen( | |
143 const std::vector<scoped_refptr<HidDeviceInfo>>& devices) { | |
144 HidDeviceManager* device_manager = HidDeviceManager::Get(browser_context()); | |
145 if (!device_manager) { | |
Devlin
2015/05/05 22:19:50
I'm seeing a lot of these null checks in this patc
Reilly Grant (use Gerrit)
2015/05/06 00:52:53
I've moved the check into Run. HidDeviceManager sh
Devlin
2015/05/06 23:04:28
I can sympathize, but if something should always b
Reilly Grant (use Gerrit)
2015/05/06 23:48:52
I've removed the kErrorServiceUnavailable message
| |
146 Respond(Error(kErrorServiceUnavailable)); | |
147 return; | |
148 } | |
149 | |
150 Respond( | |
151 OneArgument(device_manager->GetApiDevicesFromList(devices).release())); | |
Devlin
2015/05/05 22:19:50
There's a OneArgument variation that takes a scope
Reilly Grant (use Gerrit)
2015/05/06 00:52:53
Done.
| |
152 } | |
153 | |
104 HidConnectFunction::HidConnectFunction() : connection_manager_(nullptr) { | 154 HidConnectFunction::HidConnectFunction() : connection_manager_(nullptr) { |
105 } | 155 } |
106 | 156 |
107 HidConnectFunction::~HidConnectFunction() {} | 157 HidConnectFunction::~HidConnectFunction() {} |
108 | 158 |
109 ExtensionFunction::ResponseAction HidConnectFunction::Run() { | 159 ExtensionFunction::ResponseAction HidConnectFunction::Run() { |
110 scoped_ptr<core_api::hid::Connect::Params> parameters = | 160 scoped_ptr<core_api::hid::Connect::Params> parameters = |
111 hid::Connect::Params::Create(*args_); | 161 hid::Connect::Params::Create(*args_); |
112 EXTENSION_FUNCTION_VALIDATE(parameters.get()); | 162 EXTENSION_FUNCTION_VALIDATE(parameters.get()); |
113 | 163 |
114 HidDeviceManager* device_manager = HidDeviceManager::Get(browser_context()); | 164 HidDeviceManager* device_manager = HidDeviceManager::Get(browser_context()); |
115 if (!device_manager) { | 165 if (!device_manager) { |
116 return RespondNow(Error(kErrorServiceUnavailable)); | 166 return RespondNow(Error(kErrorServiceUnavailable)); |
117 } | 167 } |
118 | 168 |
119 connection_manager_ = | 169 connection_manager_ = |
120 ApiResourceManager<HidConnectionResource>::Get(browser_context()); | 170 ApiResourceManager<HidConnectionResource>::Get(browser_context()); |
121 if (!connection_manager_) { | 171 if (!connection_manager_) { |
122 return RespondNow(Error(kErrorServiceUnavailable)); | 172 return RespondNow(Error(kErrorServiceUnavailable)); |
123 } | 173 } |
124 | 174 |
125 scoped_refptr<HidDeviceInfo> device_info = | 175 scoped_refptr<HidDeviceInfo> device_info = |
126 device_manager->GetDeviceInfo(parameters->device_id); | 176 device_manager->GetDeviceInfo(parameters->device_id); |
127 if (!device_info) { | 177 if (!device_info) { |
128 return RespondNow(Error(kErrorInvalidDeviceId)); | 178 return RespondNow(Error(kErrorInvalidDeviceId)); |
129 } | 179 } |
130 | 180 |
131 if (!HidDeviceManager::HasPermission(extension(), device_info)) { | 181 if (!device_manager->HasPermission(extension(), device_info, true)) { |
132 return RespondNow(Error(kErrorPermissionDenied)); | 182 return RespondNow(Error(kErrorPermissionDenied)); |
133 } | 183 } |
134 | 184 |
135 HidService* hid_service = device::DeviceClient::Get()->GetHidService(); | 185 HidService* hid_service = device::DeviceClient::Get()->GetHidService(); |
136 if (!hid_service) { | 186 if (!hid_service) { |
137 return RespondNow(Error(kErrorServiceUnavailable)); | 187 return RespondNow(Error(kErrorServiceUnavailable)); |
138 } | 188 } |
139 | 189 |
140 hid_service->Connect( | 190 hid_service->Connect( |
141 device_info->device_id(), | 191 device_info->device_id(), |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
321 | 371 |
322 void HidSendFeatureReportFunction::OnFinished(bool success) { | 372 void HidSendFeatureReportFunction::OnFinished(bool success) { |
323 if (success) { | 373 if (success) { |
324 Respond(NoArguments()); | 374 Respond(NoArguments()); |
325 } else { | 375 } else { |
326 Respond(Error(kErrorTransfer)); | 376 Respond(Error(kErrorTransfer)); |
327 } | 377 } |
328 } | 378 } |
329 | 379 |
330 } // namespace extensions | 380 } // namespace extensions |
OLD | NEW |