1 /*
2 * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "usb_service.h"
17
18 #include <cstdio>
19 #include <iostream>
20 #include <ipc_skeleton.h>
21 #include <sstream>
22 #include <string>
23 #include <unistd.h>
24 #include <unordered_map>
25
26 #include "parameters.h"
27 #include "bundle_mgr_interface.h"
28 #include "bundle_mgr_proxy.h"
29 #include "common_timer_errors.h"
30 #include "file_ex.h"
31 #include "if_system_ability_manager.h"
32 #include "iproxy_broker.h"
33 #include "iservice_registry.h"
34 #include "iusb_srv.h"
35 #include "securec.h"
36 #include "system_ability_definition.h"
37 #include "usb_common.h"
38 #include "usb_descriptor_parser.h"
39 #include "usb_errors.h"
40 #include "usb_port_manager.h"
41 #include "usb_right_manager.h"
42 #include "usbd_bulkcallback_impl.h"
43 #include "tokenid_kit.h"
44 #include "accesstoken_kit.h"
45 #include "mem_mgr_proxy.h"
46 #include "mem_mgr_client.h"
47 #include "usb_function_switch_window.h"
48 using OHOS::sptr;
49 using namespace OHOS::HDI::Usb::V1_1;
50
51 namespace OHOS {
52 namespace USB {
53 namespace {
54 constexpr int32_t COMMEVENT_REGISTER_RETRY_TIMES = 10;
55 constexpr int32_t COMMEVENT_REGISTER_WAIT_DELAY_US = 20000;
56 constexpr uint32_t CURSOR_INIT = 18;
57 constexpr int32_t DESCRIPTOR_TYPE_STRING = 3;
58 constexpr int32_t DESCRIPTOR_VALUE_START_OFFSET = 2;
59 constexpr int32_t HALF = 2;
60 constexpr int32_t BIT_SHIFT_4 = 4;
61 constexpr int32_t BIT_HIGH_4 = 0xF0;
62 constexpr int32_t BIT_LOW_4 = 0x0F;
63 constexpr int32_t SERVICE_STARTUP_MAX_TIME = 30;
64 constexpr uint32_t UNLOAD_SA_TIMER_INTERVAL = 30 * 1000;
65 constexpr uint32_t MANAGE_INTERFACE_INTERVAL = 100;
66 constexpr uint32_t EDM_SA_MAX_TIME_OUT = 5000;
67 constexpr uint32_t EDM_SYSTEM_ABILITY_ID = 1601;
68 const std::u16string DESCRIPTOR = u"ohos.edm.IEnterpriseDeviceMgr";
69 constexpr uint32_t WITHOUT_USERID = 0;
70 constexpr uint32_t WITHOUT_ADMIN = 1;
71 constexpr uint32_t EMD_MASK_CODE = 20;
72 constexpr uint32_t DISABLE_USB = 1043;
73 constexpr uint32_t ALLOWED_USB_DEVICES = 1044;
74 constexpr uint32_t USB_STORAGE_DEVICE_ACCESS_POLICY = 1026;
75 constexpr int32_t WHITELIST_POLICY_MAX_DEVICES = 1000;
76 constexpr uint32_t EDM_SA_TIME_OUT_CODE = 9200007;
77 constexpr int32_t BASECLASS_INDEX = 0;
78 constexpr int32_t SUBCLASS_INDEX = 1;
79 constexpr int32_t PROTOCAL_INDEX = 2;
80 constexpr int32_t GET_EDM_STORAGE_DISABLE_TYPE = 2;
81 constexpr int32_t RANDOM_VALUE_INDICATE = -1;
82 constexpr int32_t USB_RIGHT_USERID_INVALID = -1;
83 constexpr const char *USB_DEFAULT_TOKEN = "UsbServiceTokenId";
84 } // namespace
85 auto g_serviceInstance = DelayedSpSingleton<UsbService>::GetInstance();
86 const bool G_REGISTER_RESULT =
87 SystemAbility::MakeAndRegisterAbility(DelayedSpSingleton<UsbService>::GetInstance().GetRefPtr());
88
UsbService()89 UsbService::UsbService() : SystemAbility(USB_SYSTEM_ABILITY_ID, true)
90 {
91 usbHostManager_ = std::make_shared<UsbHostManager>(nullptr);
92 usbRightManager_ = std::make_shared<UsbRightManager>();
93 usbPortManager_ = std::make_shared<UsbPortManager>();
94 usbDeviceManager_ = std::make_shared<UsbDeviceManager>();
95 usbd_ = OHOS::HDI::Usb::V1_1::IUsbInterface::Get();
96 if (usbd_ == nullptr) {
97 USB_HILOGE(MODULE_USB_SERVICE, "IUsbInterface::Get inteface failed");
98 }
99 }
100
~UsbService()101 UsbService::~UsbService() {}
102
SetUsbd(const sptr<OHOS::HDI::Usb::V1_1::IUsbInterface> & usbd)103 int32_t UsbService::SetUsbd(const sptr<OHOS::HDI::Usb::V1_1::IUsbInterface> &usbd)
104 {
105 if (usbd == nullptr) {
106 USB_HILOGE(MODULE_USB_SERVICE, "UsbService usbd is nullptr");
107 return UEC_SERVICE_INVALID_VALUE;
108 }
109 usbd_ = usbd;
110
111 if (usbPortManager_ == nullptr) {
112 USB_HILOGE(MODULE_USB_SERVICE, "invalid usbPortManager_");
113 return UEC_SERVICE_INVALID_VALUE;
114 }
115 usbPortManager_->SetUsbd(usbd);
116
117 if (usbDeviceManager_ == nullptr) {
118 USB_HILOGE(MODULE_USB_SERVICE, "invalid usbDeviceManager_");
119 return UEC_SERVICE_INVALID_VALUE;
120 }
121 usbDeviceManager_->SetUsbd(usbd);
122 return UEC_OK;
123 }
124
SystemAbilityStatusChangeListener(sptr<UsbServiceSubscriber> usbdSubscriber)125 UsbService::SystemAbilityStatusChangeListener::SystemAbilityStatusChangeListener(
126 sptr<UsbServiceSubscriber> usbdSubscriber)
127 : usbdSubscriber_(usbdSubscriber)
128 {
129 }
130
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)131 void UsbService::SystemAbilityStatusChangeListener::OnAddSystemAbility(
132 int32_t systemAbilityId, const std::string &deviceId)
133 {
134 USB_HILOGI(MODULE_USB_SERVICE, "OnAddSystemAbility ID = %{public}d", systemAbilityId);
135 }
136
OnRemoveSystemAbility(int32_t systemAbilityId,const std::string & deviceId)137 void UsbService::SystemAbilityStatusChangeListener::OnRemoveSystemAbility(
138 int32_t systemAbilityId, const std::string &deviceId)
139 {
140 USB_HILOGI(MODULE_USB_SERVICE, "OnRemoveSystemAbility ID = %{public}d", systemAbilityId);
141 if (systemAbilityId == USB_SYSTEM_ABILITY_ID) {
142 sptr<OHOS::HDI::Usb::V1_1::IUsbInterface> usbd_ = OHOS::HDI::Usb::V1_1::IUsbInterface::Get();
143 if (usbd_ != nullptr) {
144 usbd_->UnbindUsbdSubscriber(usbdSubscriber_);
145 }
146 }
147 }
148
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)149 void UsbService::OnAddSystemAbility(int32_t systemAbilityId, const std::string &deviceId)
150 {
151 USB_HILOGI(MODULE_USB_SERVICE, "OnAddSystemAbility systemAbilityId:%{public}d", systemAbilityId);
152 if (systemAbilityId == MEMORY_MANAGER_SA_ID) {
153 Memory::MemMgrClient::GetInstance().NotifyProcessStatus(getpid(), 1, 1, USB_SYSTEM_ABILITY_ID);
154 Memory::MemMgrClient::GetInstance().SetCritical(getpid(), true, USB_SYSTEM_ABILITY_ID);
155 }
156 }
157
OnStart()158 void UsbService::OnStart()
159 {
160 USB_HILOGI(MODULE_USB_SERVICE, "usb_service OnStart enter");
161 if (ready_) {
162 USB_HILOGE(MODULE_USB_SERVICE, "OnStart is ready, nothing to do");
163 return;
164 }
165
166 if (!(Init())) {
167 USB_HILOGE(MODULE_USB_SERVICE, "OnStart call init fail");
168 return;
169 }
170
171 // wait for the usbd service to start and bind usb service and usbd service
172 int32_t retryTimes = 0;
173 while (retryTimes < SERVICE_STARTUP_MAX_TIME) {
174 if (InitUsbd()) {
175 break;
176 }
177 sleep(1);
178 retryTimes++;
179
180 if (retryTimes == SERVICE_STARTUP_MAX_TIME) {
181 USB_HILOGE(MODULE_USB_SERVICE, "OnStart call initUsbd failed");
182 return;
183 }
184 }
185
186 if (usbPortManager_ == nullptr || usbDeviceManager_ == nullptr) {
187 USB_HILOGE(MODULE_USB_SERVICE, "invalid usbPortManager_ or invalid usbDeviceManager_");
188 return;
189 }
190
191 usbPortManager_->Init();
192 (void)usbDeviceManager_->Init();
193 (void)InitUsbRight();
194 ready_ = true;
195 auto samgrProxy = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
196 sptr<ISystemAbilityStatusChange> status = new (std::nothrow) SystemAbilityStatusChangeListener(usbdSubscriber_);
197 if (samgrProxy == nullptr || status == nullptr) {
198 USB_HILOGE(MODULE_USB_SERVICE, "samgrProxy or SystemAbilityStatusChangeListener is nullptr");
199 return;
200 }
201 int32_t ret = samgrProxy->SubscribeSystemAbility(USB_SYSTEM_ABILITY_ID, status);
202 if (ret != UEC_OK) {
203 USB_HILOGE(MODULE_USB_SERVICE, "SubscribeSystemAbility failed. ret = %{public}d", ret);
204 return;
205 }
206 AddSystemAbilityListener(MEMORY_MANAGER_SA_ID);
207 USB_HILOGE(MODULE_USB_SERVICE, "OnStart and add system ability success");
208 }
209
Init()210 bool UsbService::Init()
211 {
212 USB_HILOGI(MODULE_USB_SERVICE, "usb_service Init enter");
213 if (!Publish(g_serviceInstance)) {
214 USB_HILOGE(MODULE_USB_SERVICE, "OnStart register to system ability manager failed.");
215 return false;
216 }
217
218 while (commEventRetryTimes_ <= COMMEVENT_REGISTER_RETRY_TIMES) {
219 if (!IsCommonEventServiceAbilityExist()) {
220 ++commEventRetryTimes_;
221 usleep(COMMEVENT_REGISTER_WAIT_DELAY_US);
222 } else {
223 commEventRetryTimes_ = 0;
224 break;
225 }
226 }
227 USB_HILOGI(MODULE_USB_SERVICE, "Init success");
228 return true;
229 }
230
InitUsbd()231 bool UsbService::InitUsbd()
232 {
233 usbd_ = OHOS::HDI::Usb::V1_1::IUsbInterface::Get();
234 if (usbd_ == nullptr) {
235 USB_HILOGE(MODULE_USB_SERVICE, " get usbd_ is nullptr");
236 return false;
237 }
238
239 usbdSubscriber_ = new (std::nothrow) UsbServiceSubscriber();
240 if (usbdSubscriber_ == nullptr) {
241 USB_HILOGE(MODULE_USB_SERVICE, "Init failed");
242 return false;
243 }
244 recipient_ = new UsbdDeathRecipient();
245 sptr<IRemoteObject> remote = OHOS::HDI::hdi_objcast<HDI::Usb::V1_0::IUsbInterface>(usbd_);
246 if (!remote->AddDeathRecipient(recipient_)) {
247 USB_HILOGE(MODULE_USB_SERVICE, "add DeathRecipient failed");
248 return false;
249 }
250
251 ErrCode ret = usbd_->BindUsbdSubscriber(usbdSubscriber_);
252 USB_HILOGI(MODULE_USB_SERVICE, "entry InitUsbd ret: %{public}d", ret);
253 return SUCCEEDED(ret);
254 }
255
OnStop()256 void UsbService::OnStop()
257 {
258 USB_HILOGI(MODULE_USB_SERVICE, "entry stop service %{public}d", ready_);
259 if (!ready_) {
260 return;
261 }
262 ready_ = false;
263
264 if (usbd_ == nullptr) {
265 USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbd_ is nullptr");
266 return;
267 }
268 sptr<IRemoteObject> remote = OHOS::HDI::hdi_objcast<HDI::Usb::V1_0::IUsbInterface>(usbd_);
269 remote->RemoveDeathRecipient(recipient_);
270 recipient_.clear();
271 usbd_->UnbindUsbdSubscriber(usbdSubscriber_);
272 Memory::MemMgrClient::GetInstance().NotifyProcessStatus(getpid(), 1, 0, USB_SYSTEM_ABILITY_ID);
273 }
274
IsCommonEventServiceAbilityExist()275 bool UsbService::IsCommonEventServiceAbilityExist()
276 {
277 sptr<ISystemAbilityManager> sm = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
278 if (sm == nullptr) {
279 USB_HILOGE(MODULE_USB_SERVICE,
280 "IsCommonEventServiceAbilityExist Get ISystemAbilityManager "
281 "failed, no SystemAbilityManager");
282 return false;
283 }
284 sptr<IRemoteObject> remote = sm->CheckSystemAbility(COMMON_EVENT_SERVICE_ID);
285 if (!remote) {
286 USB_HILOGE(MODULE_USB_SERVICE, "No CesServiceAbility");
287 return false;
288 }
289 return true;
290 }
291
OpenDevice(uint8_t busNum,uint8_t devAddr)292 int32_t UsbService::OpenDevice(uint8_t busNum, uint8_t devAddr)
293 {
294 if (!UsbService::CheckDevicePermission(busNum, devAddr)) {
295 return UEC_SERVICE_PERMISSION_DENIED;
296 }
297
298 const UsbDev dev = {busNum, devAddr};
299 if (usbd_ == nullptr) {
300 USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbd_ is nullptr");
301 return UEC_SERVICE_INVALID_VALUE;
302 }
303 int32_t ret = usbd_->OpenDevice(dev);
304 if (ret != UEC_OK) {
305 USB_HILOGE(MODULE_USB_SERVICE, "OpenDevice failed ret:%{public}d", ret);
306 }
307
308 return ret;
309 }
310
GetDeviceVidPidSerialNumber(std::string deviceName)311 std::string UsbService::GetDeviceVidPidSerialNumber(std::string deviceName)
312 {
313 std::string strDesc = "test";
314 std::lock_guard<std::mutex> guard(mutex_);
315 for (auto it = deviceVidPidMap_.begin(); it != deviceVidPidMap_.end(); ++it) {
316 USB_HILOGI(MODULE_USB_SERVICE, " it->first = %{public}s", it->first.c_str());
317 if (it->first == deviceName) {
318 strDesc = it->second;
319 break;
320 }
321 }
322 return strDesc;
323 }
324
GetDeviceVidPidSerialNumber(std::string deviceName,std::string & strDesc)325 int32_t UsbService::GetDeviceVidPidSerialNumber(std::string deviceName, std::string& strDesc)
326 {
327 int32_t isMatched = UEC_INTERFACE_INVALID_VALUE;
328 std::lock_guard<std::mutex> guard(mutex_);
329 for (auto it = deviceVidPidMap_.begin(); it != deviceVidPidMap_.end(); ++it) {
330 USB_HILOGI(MODULE_USB_SERVICE, " it->first = %{public}s", it->first.c_str());
331 if (it->first == deviceName) {
332 strDesc = it->second;
333 isMatched = UEC_OK;
334 break;
335 }
336 }
337 return isMatched;
338 }
339
CheckDevicePermission(uint8_t busNum,uint8_t devAddr)340 bool UsbService::CheckDevicePermission(uint8_t busNum, uint8_t devAddr)
341 {
342 std::string name = std::to_string(busNum) + "-" + std::to_string(devAddr);
343 if (!UsbService::HasRight(name)) {
344 USB_HILOGE(MODULE_USB_SERVICE, "No permission");
345 return false;
346 }
347 return true;
348 }
349
HasRight(std::string deviceName)350 bool UsbService::HasRight(std::string deviceName)
351 {
352 USB_HILOGI(MODULE_USB_SERVICE, "calling usbRightManager HasRight");
353 if (usbRightManager_ == nullptr) {
354 USB_HILOGE(MODULE_USB_SERVICE, "invalid usbRightManager_");
355 return false;
356 }
357
358 std::string deviceVidPidSerialNum = "";
359 if (GetDeviceVidPidSerialNumber(deviceName, deviceVidPidSerialNum) != UEC_OK) {
360 USB_HILOGE(MODULE_USB_SERVICE, "can not find deviceName.");
361 return false;
362 }
363
364 if (usbRightManager_->IsSystemAppOrSa()) {
365 USB_HILOGW(MODULE_USB_SERVICE, "system app, bypass: dev=%{public}s", deviceName.c_str());
366 return true;
367 }
368
369 std::string bundleName;
370 std::string tokenId;
371 int32_t userId = USB_RIGHT_USERID_INVALID;
372 if (!GetCallingInfo(bundleName, tokenId, userId)) {
373 USB_HILOGE(MODULE_USB_SERVICE, "HasRight GetCallingInfo false");
374 return false;
375 }
376
377 USB_HILOGI(MODULE_USB_SERVICE, "bundle=%{public}s, device=%{public}s", bundleName.c_str(), deviceName.c_str());
378 if (usbRightManager_->HasRight(deviceVidPidSerialNum, bundleName, tokenId, userId)) {
379 return true;
380 }
381
382 return usbRightManager_->HasRight(deviceVidPidSerialNum, bundleName, USB_DEFAULT_TOKEN, userId);
383 }
384
RequestRight(std::string deviceName)385 int32_t UsbService::RequestRight(std::string deviceName)
386 {
387 USB_HILOGI(MODULE_USB_SERVICE, "calling usbRightManager RequestRight");
388 if (usbRightManager_ == nullptr) {
389 USB_HILOGE(MODULE_USB_SERVICE, "invalid usbRightManager_");
390 return UEC_SERVICE_INNER_ERR;
391 }
392 std::string deviceVidPidSerialNum = "";
393 int32_t ret = GetDeviceVidPidSerialNumber(deviceName, deviceVidPidSerialNum);
394 if (ret != UEC_OK) {
395 USB_HILOGE(MODULE_USB_SERVICE, "can not find deviceName.");
396 return ret;
397 }
398 if (usbRightManager_->IsSystemAppOrSa()) {
399 USB_HILOGW(MODULE_USB_SERVICE, "system app, bypass: dev=%{public}s", deviceName.c_str());
400 return UEC_OK;
401 }
402 std::string bundleName;
403 std::string tokenId;
404 int32_t userId = USB_RIGHT_USERID_INVALID;
405 if (!GetCallingInfo(bundleName, tokenId, userId)) {
406 USB_HILOGE(MODULE_USB_SERVICE, "GetCallingInfo false");
407 return false;
408 }
409
410 USB_HILOGI(MODULE_USB_SERVICE, "bundle=%{public}s, device=%{public}s", bundleName.c_str(), deviceName.c_str());
411 return usbRightManager_->RequestRight(deviceName, deviceVidPidSerialNum, bundleName, tokenId, userId);
412 }
413
RemoveRight(std::string deviceName)414 int32_t UsbService::RemoveRight(std::string deviceName)
415 {
416 if (usbRightManager_ == nullptr) {
417 USB_HILOGE(MODULE_USB_SERVICE, "invalid usbRightManager_");
418 return UEC_SERVICE_INVALID_VALUE;
419 }
420 std::string deviceVidPidSerialNum = "";
421 int32_t ret = GetDeviceVidPidSerialNumber(deviceName, deviceVidPidSerialNum);
422 if (ret != UEC_OK) {
423 USB_HILOGE(MODULE_USB_SERVICE, "can not find deviceName.");
424 return ret;
425 }
426 if (usbRightManager_->IsSystemAppOrSa()) {
427 USB_HILOGW(MODULE_USB_SERVICE, "system app, bypass: dev=%{public}s", deviceName.c_str());
428 return UEC_OK;
429 }
430 std::string bundleName;
431 std::string tokenId;
432 int32_t userId = USB_RIGHT_USERID_INVALID;
433 if (!GetCallingInfo(bundleName, tokenId, userId)) {
434 USB_HILOGE(MODULE_USB_SERVICE, "GetCallingInfo false");
435 return false;
436 }
437
438 if (usbRightManager_->RemoveDeviceRight(deviceVidPidSerialNum, bundleName, tokenId, userId)) {
439 USB_HILOGI(MODULE_USB_SERVICE, "RemoveDeviceRight done");
440 return UEC_OK;
441 }
442
443 if (!usbRightManager_->RemoveDeviceRight(deviceVidPidSerialNum, bundleName, USB_DEFAULT_TOKEN, userId)) {
444 USB_HILOGE(MODULE_USB_SERVICE, "RemoveDeviceRight failed");
445 return UEC_SERVICE_INNER_ERR;
446 }
447 USB_HILOGI(MODULE_USB_SERVICE, "RemoveRight done");
448 return UEC_OK;
449 }
450
GetDevices(std::vector<UsbDevice> & deviceList)451 int32_t UsbService::GetDevices(std::vector<UsbDevice> &deviceList)
452 {
453 std::map<std::string, UsbDevice *> devices;
454 if (usbHostManager_ == nullptr) {
455 USB_HILOGE(MODULE_USB_SERVICE, "invalid usbHostManager_");
456 return UEC_SERVICE_INVALID_VALUE;
457 }
458
459 usbHostManager_->GetDevices(devices);
460 USB_HILOGI(MODULE_USB_SERVICE, "list size %{public}zu", devices.size());
461 for (auto it = devices.begin(); it != devices.end(); ++it) {
462 if (!(usbRightManager_->IsSystemAppOrSa())) {
463 it->second->SetmSerial("");
464 }
465 deviceList.push_back(*it->second);
466 }
467 return UEC_OK;
468 }
469
GetCurrentFunctions(int32_t & functions)470 int32_t UsbService::GetCurrentFunctions(int32_t &functions)
471 {
472 std::lock_guard<std::mutex> guard(mutex_);
473 if (usbRightManager_ == nullptr) {
474 USB_HILOGE(MODULE_USB_SERVICE, "invalid usbRightManager_");
475 return UEC_SERVICE_INVALID_VALUE;
476 }
477 if (!(usbRightManager_->IsSystemAppOrSa() && usbRightManager_->VerifyPermission())) {
478 return UEC_SERVICE_PERMISSION_DENIED_SYSAPI;
479 }
480 if (usbd_ == nullptr) {
481 USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbd_ is nullptr");
482 return UEC_SERVICE_INVALID_VALUE;
483 }
484 return usbd_->GetCurrentFunctions(functions);
485 }
486
SetCurrentFunctions(int32_t functions)487 int32_t UsbService::SetCurrentFunctions(int32_t functions)
488 {
489 std::lock_guard<std::mutex> guard(mutex_);
490 USB_HILOGI(MODULE_USB_SERVICE, "func = %{public}d", functions);
491 if (usbRightManager_ == nullptr) {
492 USB_HILOGE(MODULE_USB_SERVICE, "invalid usbRightManager_");
493 return UEC_SERVICE_INVALID_VALUE;
494 }
495
496 int32_t ret = usbRightManager_->HasSetFuncRight(functions);
497 if (ret != 0) {
498 USB_HILOGE(MODULE_USB_SERVICE, "HasSetFuncRight fail");
499 return ret;
500 }
501 if (usbDeviceManager_ == nullptr) {
502 USB_HILOGE(MODULE_USB_SERVICE, "invalid usbDeviceManager_");
503 return UEC_SERVICE_INVALID_VALUE;
504 }
505 usbDeviceManager_->UpdateFunctions(functions);
506
507 if (usbd_ == nullptr) {
508 USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbd_ is nullptr");
509 return UEC_SERVICE_INVALID_VALUE;
510 }
511
512 return usbd_->SetCurrentFunctions(functions);
513 }
514
UsbFunctionsFromString(std::string_view funcs)515 int32_t UsbService::UsbFunctionsFromString(std::string_view funcs)
516 {
517 if (usbRightManager_ == nullptr) {
518 USB_HILOGE(MODULE_USB_SERVICE, "invalid usbRightManager_");
519 return UEC_SERVICE_INVALID_VALUE;
520 }
521 if (!(usbRightManager_->IsSystemAppOrSa() && usbRightManager_->VerifyPermission())) {
522 return UEC_SERVICE_PERMISSION_DENIED_SYSAPI;
523 }
524 USB_HILOGI(MODULE_USB_SERVICE, "calling UsbFunctionsFromString");
525 return UsbDeviceManager::ConvertFromString(funcs);
526 }
527
UsbFunctionsToString(int32_t funcs)528 std::string UsbService::UsbFunctionsToString(int32_t funcs)
529 {
530 if (usbRightManager_ == nullptr) {
531 USB_HILOGE(MODULE_USB_SERVICE, "invalid usbRightManager_");
532 return "";
533 }
534 if (!(usbRightManager_->IsSystemAppOrSa() && usbRightManager_->VerifyPermission())) {
535 return PERMISSION_DENIED_SYSAPI;
536 }
537 USB_HILOGI(MODULE_USB_SERVICE, "calling UsbFunctionsToString");
538 return UsbDeviceManager::ConvertToString(funcs);
539 }
540
GetPorts(std::vector<UsbPort> & ports)541 int32_t UsbService::GetPorts(std::vector<UsbPort> &ports)
542 {
543 USB_HILOGI(MODULE_USB_SERVICE, "calling usbPortManager getPorts");
544 if (usbRightManager_ == nullptr) {
545 USB_HILOGE(MODULE_USB_SERVICE, "invalid usbRightManager_");
546 return UEC_SERVICE_INVALID_VALUE;
547 }
548 if (!(usbRightManager_->IsSystemAppOrSa() && usbRightManager_->VerifyPermission())) {
549 return UEC_SERVICE_PERMISSION_DENIED_SYSAPI;
550 }
551 if (usbPortManager_ == nullptr) {
552 USB_HILOGE(MODULE_USB_SERVICE, "invalid usbPortManager_");
553 return UEC_SERVICE_INVALID_VALUE;
554 }
555 return usbPortManager_->GetPorts(ports);
556 }
557
GetSupportedModes(int32_t portId,int32_t & supportedModes)558 int32_t UsbService::GetSupportedModes(int32_t portId, int32_t &supportedModes)
559 {
560 USB_HILOGI(MODULE_USB_SERVICE, "calling usbPortManager getSupportedModes");
561 if (usbRightManager_ == nullptr) {
562 USB_HILOGE(MODULE_USB_SERVICE, "invalid usbRightManager_");
563 return UEC_SERVICE_INVALID_VALUE;
564 }
565 if (!(usbRightManager_->IsSystemAppOrSa() && usbRightManager_->VerifyPermission())) {
566 return UEC_SERVICE_PERMISSION_DENIED_SYSAPI;
567 }
568 if (usbPortManager_ == nullptr) {
569 USB_HILOGE(MODULE_USB_SERVICE, "invalid usbPortManager_");
570 return UEC_SERVICE_INVALID_VALUE;
571 }
572 return usbPortManager_->GetSupportedModes(portId, supportedModes);
573 }
574
SetPortRole(int32_t portId,int32_t powerRole,int32_t dataRole)575 int32_t UsbService::SetPortRole(int32_t portId, int32_t powerRole, int32_t dataRole)
576 {
577 USB_HILOGI(MODULE_USB_SERVICE, "calling usbd getPorts");
578 if (usbRightManager_ == nullptr) {
579 USB_HILOGE(MODULE_USB_SERVICE, "invalid usbRightManager_");
580 return UEC_SERVICE_INVALID_VALUE;
581 }
582 if (!(usbRightManager_->IsSystemAppOrSa() && usbRightManager_->VerifyPermission())) {
583 return UEC_SERVICE_PERMISSION_DENIED_SYSAPI;
584 }
585 if (usbd_ == nullptr) {
586 USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbd_ is nullptr");
587 return UEC_SERVICE_INVALID_VALUE;
588 }
589 auto ret = usbd_->SetPortRole(portId, powerRole, dataRole);
590 if (ret == HDF_ERR_NOT_SUPPORT) {
591 USB_HILOGE(MODULE_USB_SERVICE, "SetPortRole not support");
592 return UEC_SERVICE_NOT_SUPPORT_SWITCH_PORT;
593 }
594 return ret;
595 }
596
ClaimInterface(uint8_t busNum,uint8_t devAddr,uint8_t interface,uint8_t force)597 int32_t UsbService::ClaimInterface(uint8_t busNum, uint8_t devAddr, uint8_t interface, uint8_t force)
598 {
599 if (!UsbService::CheckDevicePermission(busNum, devAddr)) {
600 return UEC_SERVICE_PERMISSION_DENIED;
601 }
602
603 const UsbDev dev = {busNum, devAddr};
604 if (usbd_ == nullptr) {
605 USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbd_ is nullptr");
606 return UEC_SERVICE_INVALID_VALUE;
607 }
608
609 int32_t ret = usbd_->ClaimInterface(dev, interface, force);
610 if (ret != UEC_OK) {
611 USB_HILOGE(MODULE_USB_SERVICE, "claim interface false.");
612 }
613 return ret;
614 }
615
ReleaseInterface(uint8_t busNum,uint8_t devAddr,uint8_t interface)616 int32_t UsbService::ReleaseInterface(uint8_t busNum, uint8_t devAddr, uint8_t interface)
617 {
618 if (!UsbService::CheckDevicePermission(busNum, devAddr)) {
619 return UEC_SERVICE_PERMISSION_DENIED;
620 }
621
622 const UsbDev dev = {busNum, devAddr};
623 if (usbd_ == nullptr) {
624 USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbd_ is nullptr");
625 return UEC_SERVICE_INVALID_VALUE;
626 }
627 return usbd_->ReleaseInterface(dev, interface);
628 }
629
BulkTransferRead(const UsbDev & devInfo,const UsbPipe & pipe,std::vector<uint8_t> & bufferData,int32_t timeOut)630 int32_t UsbService::BulkTransferRead(
631 const UsbDev &devInfo, const UsbPipe &pipe, std::vector<uint8_t> &bufferData, int32_t timeOut)
632 {
633 if (!UsbService::CheckDevicePermission(devInfo.busNum, devInfo.devAddr)) {
634 return UEC_SERVICE_PERMISSION_DENIED;
635 }
636 if (usbd_ == nullptr) {
637 USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbd_ is nullptr");
638 return UEC_SERVICE_INVALID_VALUE;
639 }
640
641 int32_t ret = usbd_->BulkTransferRead(devInfo, pipe, timeOut, bufferData);
642 if (ret != UEC_OK) {
643 USB_HILOGE(MODULE_USB_SERVICE, "BulkTransferRead error ret:%{public}d", ret);
644 }
645 return ret;
646 }
647
BulkTransferReadwithLength(const UsbDev & devInfo,const UsbPipe & pipe,int32_t length,std::vector<uint8_t> & bufferData,int32_t timeOut)648 int32_t UsbService::BulkTransferReadwithLength(const UsbDev &devInfo, const UsbPipe &pipe,
649 int32_t length, std::vector<uint8_t> &bufferData, int32_t timeOut)
650 {
651 if (!UsbService::CheckDevicePermission(devInfo.busNum, devInfo.devAddr)) {
652 return UEC_SERVICE_PERMISSION_DENIED;
653 }
654 if (usbd_ == nullptr) {
655 USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbd_ is nullptr");
656 return UEC_SERVICE_INVALID_VALUE;
657 }
658
659 int32_t ret = usbd_->BulkTransferReadwithLength(devInfo, pipe, timeOut, length, bufferData);
660 if (ret != UEC_OK) {
661 USB_HILOGE(MODULE_USB_SERVICE, "BulkTransferRead error ret:%{public}d", ret);
662 }
663 return ret;
664 }
665
BulkTransferWrite(const UsbDev & dev,const UsbPipe & pipe,const std::vector<uint8_t> & bufferData,int32_t timeOut)666 int32_t UsbService::BulkTransferWrite(
667 const UsbDev &dev, const UsbPipe &pipe, const std::vector<uint8_t> &bufferData, int32_t timeOut)
668 {
669 if (!UsbService::CheckDevicePermission(dev.busNum, dev.devAddr)) {
670 return UEC_SERVICE_PERMISSION_DENIED;
671 }
672 if (usbd_ == nullptr) {
673 USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbd_ is nullptr");
674 return UEC_SERVICE_INVALID_VALUE;
675 }
676
677 int32_t ret = usbd_->BulkTransferWrite(dev, pipe, timeOut, bufferData);
678 if (ret != UEC_OK) {
679 USB_HILOGE(MODULE_USB_SERVICE, "BulkTransferWrite error ret:%{public}d", ret);
680 }
681 return ret;
682 }
683
ControlTransfer(const UsbDev & dev,const UsbCtrlTransfer & ctrl,std::vector<uint8_t> & bufferData)684 int32_t UsbService::ControlTransfer(const UsbDev &dev, const UsbCtrlTransfer &ctrl, std::vector<uint8_t> &bufferData)
685 {
686 if (!UsbService::CheckDevicePermission(dev.busNum, dev.devAddr)) {
687 return UEC_SERVICE_PERMISSION_DENIED;
688 }
689 std::lock_guard<std::mutex> guard(mutex_);
690 if (usbd_ == nullptr) {
691 USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbd_ is nullptr");
692 return UEC_SERVICE_INVALID_VALUE;
693 }
694
695 int32_t ret = UEC_SERVICE_INNER_ERR;
696 if (((uint32_t)ctrl.requestType & USB_ENDPOINT_DIR_MASK) == USB_ENDPOINT_DIR_OUT) {
697 ret = usbd_->ControlTransferWrite(dev, ctrl, bufferData);
698 if (ret != UEC_OK) {
699 USB_HILOGE(MODULE_USB_SERVICE, "ControlTransferWrite error ret:%{public}d", ret);
700 }
701 } else {
702 bufferData.clear();
703 ret = usbd_->ControlTransferRead(dev, ctrl, bufferData);
704 if (ret != UEC_OK) {
705 USB_HILOGE(MODULE_USB_SERVICE, "ControlTransferRead error ret:%{public}d", ret);
706 }
707 }
708 return ret;
709 }
710
UsbControlTransfer(const UsbDev & dev,const UsbCtrlTransferParams & ctrlParams,std::vector<uint8_t> & bufferData)711 int32_t UsbService::UsbControlTransfer(
712 const UsbDev &dev, const UsbCtrlTransferParams &ctrlParams, std::vector<uint8_t> &bufferData)
713 {
714 if (!UsbService::CheckDevicePermission(dev.busNum, dev.devAddr)) {
715 return UEC_SERVICE_PERMISSION_DENIED;
716 }
717 std::lock_guard<std::mutex> guard(mutex_);
718 if (usbd_ == nullptr) {
719 USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbd_ is nullptr");
720 return UEC_SERVICE_INVALID_VALUE;
721 }
722
723 int32_t ret = UEC_SERVICE_INNER_ERR;
724 UsbCtrlTransfer ctrl = {
725 ctrlParams.requestType, ctrlParams.requestCmd, ctrlParams.value, ctrlParams.index, ctrlParams.timeout};
726 if (((uint32_t)ctrlParams.requestType & USB_ENDPOINT_DIR_MASK) == USB_ENDPOINT_DIR_OUT) {
727 ret = usbd_->ControlTransferWrite(dev, ctrl, bufferData);
728 if (ret != UEC_OK) {
729 USB_HILOGE(MODULE_USB_SERVICE, "ControlTransferWrite error ret:%{public}d", ret);
730 }
731 } else {
732 bufferData.clear();
733 ret = usbd_->ControlTransferReadwithLength(dev, ctrlParams, bufferData);
734 if (ret != UEC_OK) {
735 USB_HILOGE(MODULE_USB_SERVICE, "ControlTransferWritewithLength error ret:%{public}d", ret);
736 }
737 }
738 return ret;
739 }
740
SetActiveConfig(uint8_t busNum,uint8_t devAddr,uint8_t configIndex)741 int32_t UsbService::SetActiveConfig(uint8_t busNum, uint8_t devAddr, uint8_t configIndex)
742 {
743 if (!UsbService::CheckDevicePermission(busNum, devAddr)) {
744 return UEC_SERVICE_PERMISSION_DENIED;
745 }
746
747 const UsbDev dev = {busNum, devAddr};
748 if (usbd_ == nullptr) {
749 USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbd_ is nullptr");
750 return UEC_SERVICE_INVALID_VALUE;
751 }
752 return usbd_->SetConfig(dev, configIndex);
753 }
754
GetActiveConfig(uint8_t busNum,uint8_t devAddr,uint8_t & configIndex)755 int32_t UsbService::GetActiveConfig(uint8_t busNum, uint8_t devAddr, uint8_t &configIndex)
756 {
757 const UsbDev dev = {busNum, devAddr};
758 if (usbd_ == nullptr) {
759 USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbd_ is nullptr");
760 return UEC_SERVICE_INVALID_VALUE;
761 }
762
763 if (!UsbService::CheckDevicePermission(busNum, devAddr)) {
764 return UEC_SERVICE_PERMISSION_DENIED;
765 }
766
767 return usbd_->GetConfig(dev, configIndex);
768 }
769
SetInterface(uint8_t busNum,uint8_t devAddr,uint8_t interfaceid,uint8_t altIndex)770 int32_t UsbService::SetInterface(uint8_t busNum, uint8_t devAddr, uint8_t interfaceid, uint8_t altIndex)
771 {
772 if (!UsbService::CheckDevicePermission(busNum, devAddr)) {
773 return UEC_SERVICE_PERMISSION_DENIED;
774 }
775
776 const UsbDev dev = {busNum, devAddr};
777 if (usbd_ == nullptr) {
778 USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbd_ is nullptr");
779 return UEC_SERVICE_INVALID_VALUE;
780 }
781 return usbd_->SetInterface(dev, interfaceid, altIndex);
782 }
783
GetRawDescriptor(uint8_t busNum,uint8_t devAddr,std::vector<uint8_t> & bufferData)784 int32_t UsbService::GetRawDescriptor(uint8_t busNum, uint8_t devAddr, std::vector<uint8_t> &bufferData)
785 {
786 if (!UsbService::CheckDevicePermission(busNum, devAddr)) {
787 return UEC_SERVICE_PERMISSION_DENIED;
788 }
789
790 const UsbDev dev = {busNum, devAddr};
791 if (usbd_ == nullptr) {
792 USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbd_ is nullptr");
793 return UEC_SERVICE_INVALID_VALUE;
794 }
795 int32_t ret = usbd_->GetRawDescriptor(dev, bufferData);
796 if (ret != UEC_OK) {
797 USB_HILOGE(MODULE_USB_SERVICE, "error ret:%{public}d", ret);
798 }
799 return ret;
800 }
801
GetFileDescriptor(uint8_t busNum,uint8_t devAddr,int32_t & fd)802 int32_t UsbService::GetFileDescriptor(uint8_t busNum, uint8_t devAddr, int32_t &fd)
803 {
804 if (!UsbService::CheckDevicePermission(busNum, devAddr)) {
805 return UEC_SERVICE_PERMISSION_DENIED;
806 }
807
808 const UsbDev dev = {busNum, devAddr};
809 if (usbd_ == nullptr) {
810 USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbd_ is nullptr");
811 return UEC_SERVICE_INVALID_VALUE;
812 }
813 int32_t ret = usbd_->GetDeviceFileDescriptor(dev, fd);
814 if (ret != UEC_OK) {
815 USB_HILOGE(MODULE_USB_SERVICE, "error ret:%{public}d", ret);
816 }
817 return ret;
818 }
819
RequestQueue(const UsbDev & dev,const UsbPipe & pipe,const std::vector<uint8_t> & clientData,const std::vector<uint8_t> & bufferData)820 int32_t UsbService::RequestQueue(const UsbDev &dev, const UsbPipe &pipe, const std::vector<uint8_t> &clientData,
821 const std::vector<uint8_t> &bufferData)
822 {
823 if (usbd_ == nullptr) {
824 USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbd_ is nullptr");
825 return UEC_SERVICE_INVALID_VALUE;
826 }
827 if (!UsbService::CheckDevicePermission(dev.busNum, dev.devAddr)) {
828 return UEC_SERVICE_PERMISSION_DENIED;
829 }
830
831 int32_t ret = usbd_->RequestQueue(dev, pipe, clientData, bufferData);
832 if (ret != UEC_OK) {
833 USB_HILOGE(MODULE_USB_SERVICE, "error ret:%{public}d", ret);
834 }
835 return ret;
836 }
837
RequestWait(const UsbDev & dev,int32_t timeOut,std::vector<uint8_t> & clientData,std::vector<uint8_t> & bufferData)838 int32_t UsbService::RequestWait(
839 const UsbDev &dev, int32_t timeOut, std::vector<uint8_t> &clientData, std::vector<uint8_t> &bufferData)
840 {
841 if (usbd_ == nullptr) {
842 USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbd_ is nullptr");
843 return UEC_SERVICE_INVALID_VALUE;
844 }
845 if (!UsbService::CheckDevicePermission(dev.busNum, dev.devAddr)) {
846 return UEC_SERVICE_PERMISSION_DENIED;
847 }
848
849 int32_t ret = usbd_->RequestWait(dev, clientData, bufferData, timeOut);
850 if (ret != UEC_OK) {
851 USB_HILOGE(MODULE_USB_SERVICE, "error ret:%{public}d", ret);
852 }
853 return ret;
854 }
855
RequestCancel(uint8_t busNum,uint8_t devAddr,uint8_t interfaceId,uint8_t endpointId)856 int32_t UsbService::RequestCancel(uint8_t busNum, uint8_t devAddr, uint8_t interfaceId, uint8_t endpointId)
857 {
858 const UsbDev dev = {busNum, devAddr};
859 const UsbPipe pipe = {interfaceId, endpointId};
860 if (usbd_ == nullptr) {
861 USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbd_ is nullptr");
862 return UEC_SERVICE_INVALID_VALUE;
863 }
864 if (!UsbService::CheckDevicePermission(dev.busNum, dev.devAddr)) {
865 return UEC_SERVICE_PERMISSION_DENIED;
866 }
867
868 return usbd_->RequestCancel(dev, pipe);
869 }
870
Close(uint8_t busNum,uint8_t devAddr)871 int32_t UsbService::Close(uint8_t busNum, uint8_t devAddr)
872 {
873 if (!UsbService::CheckDevicePermission(busNum, devAddr)) {
874 return UEC_SERVICE_PERMISSION_DENIED;
875 }
876
877 const UsbDev dev = {busNum, devAddr};
878 if (usbd_ == nullptr) {
879 USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbd_ is nullptr");
880 return UEC_SERVICE_INVALID_VALUE;
881 }
882 return usbd_->CloseDevice(dev);
883 }
884
GetDevStringValFromIdx(uint8_t busNum,uint8_t devAddr,uint8_t idx)885 std::string UsbService::GetDevStringValFromIdx(uint8_t busNum, uint8_t devAddr, uint8_t idx)
886 {
887 const UsbDev dev = {busNum, devAddr};
888 std::vector<uint8_t> strV;
889 std::string strDesc = " ";
890
891 if (idx == 0) {
892 return strDesc;
893 }
894
895 if (usbd_ == nullptr) {
896 USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbd_ is nullptr");
897 return nullptr;
898 }
899 int32_t ret = usbd_->GetStringDescriptor(dev, idx, strV);
900 if (ret != UEC_OK) {
901 USB_HILOGE(MODULE_USB_SERVICE, "get string[%{public}hhu] failed ret:%{public}d", idx, ret);
902 return strDesc;
903 }
904 size_t length = strV.size();
905 if ((length < DESCRIPTOR_VALUE_START_OFFSET) || (strV[1] != DESCRIPTOR_TYPE_STRING)) {
906 USB_HILOGI(MODULE_USB_SERVICE, "type or length error, len:%{public}zu", length);
907 return strDesc;
908 }
909
910 uint16_t *tbuf = new (std::nothrow) uint16_t[length + 1]();
911 if (tbuf == nullptr) {
912 USB_HILOGI(MODULE_USB_SERVICE, "new failed");
913 return strDesc;
914 }
915
916 for (uint32_t i = 0; i < length - DESCRIPTOR_VALUE_START_OFFSET; ++i) {
917 tbuf[i] = strV[i + DESCRIPTOR_VALUE_START_OFFSET];
918 }
919 size_t bufLen = (length - DESCRIPTOR_VALUE_START_OFFSET) / HALF;
920 size_t wstrLen = wcslen((wchar_t*)tbuf) <= bufLen ? wcslen((wchar_t*)tbuf) : bufLen;
921 std::wstring wstr(reinterpret_cast<wchar_t *>(tbuf), wstrLen);
922 strDesc = std::string(wstr.begin(), wstr.end());
923 USB_HILOGI(MODULE_USB_SERVICE, "getString idx:%{public}d length:%{public}zu, str: %{public}s",
924 idx, strDesc.length(), strDesc.c_str());
925 delete[] tbuf;
926 return strDesc;
927 }
928
BcdToString(const std::vector<uint8_t> & bcd)929 static std::string BcdToString(const std::vector<uint8_t> &bcd)
930 {
931 std::string tstr;
932 for (uint32_t i = 0; i < bcd.size(); ++i) {
933 tstr += std::to_string((bcd[i] & BIT_HIGH_4) >> BIT_SHIFT_4);
934 tstr += std::to_string((bcd[i] & BIT_LOW_4));
935 }
936 return tstr;
937 }
938
FillDevStrings(UsbDevice & dev)939 int32_t UsbService::FillDevStrings(UsbDevice &dev)
940 {
941 uint8_t busNum;
942 uint8_t devAddr;
943 uint8_t offsetValue = 8;
944
945 busNum = dev.GetBusNum();
946 devAddr = dev.GetDevAddr();
947 uint16_t bcdUsb = dev.GetbcdUSB();
948 const std::vector<uint8_t> bcdData {(bcdUsb & 0xff), ((bcdUsb >> offsetValue) & 0xff)};
949 dev.SetVersion(BcdToString(bcdData));
950 dev.SetManufacturerName(GetDevStringValFromIdx(busNum, devAddr, dev.GetiManufacturer()));
951 dev.SetProductName(GetDevStringValFromIdx(busNum, devAddr, dev.GetiProduct()));
952 dev.SetmSerial(GetDevStringValFromIdx(busNum, devAddr, dev.GetiSerialNumber()));
953 USB_HILOGI(MODULE_USB_SERVICE,
954 "iSerial:%{public}d Manufactur:%{public}s product:%{public}s "
955 "version:%{public}s",
956 dev.GetiSerialNumber(), dev.GetManufacturerName().c_str(), dev.GetProductName().c_str(),
957 dev.GetVersion().c_str());
958
959 std::vector<USBConfig> configs;
960 configs = dev.GetConfigs();
961 for (auto it = configs.begin(); it != configs.end(); ++it) {
962 it->SetName(GetDevStringValFromIdx(busNum, devAddr, it->GetiConfiguration()));
963 USB_HILOGI(MODULE_USB_SERVICE, "Config:%{public}d %{public}s", it->GetiConfiguration(), it->GetName().c_str());
964 std::vector<UsbInterface> interfaces = it->GetInterfaces();
965 for (auto itIF = interfaces.begin(); itIF != interfaces.end(); ++itIF) {
966 itIF->SetName(GetDevStringValFromIdx(busNum, devAddr, itIF->GetiInterface()));
967 USB_HILOGI(MODULE_USB_SERVICE, "interface:%{public}hhu %{public}s", itIF->GetiInterface(),
968 itIF->GetName().c_str());
969 }
970 it->SetInterfaces(interfaces);
971 }
972 dev.SetConfigs(configs);
973
974 return UEC_OK;
975 }
976
GetDeviceInfoDescriptor(const UsbDev & uDev,std::vector<uint8_t> & descriptor,UsbDevice & dev)977 int32_t UsbService::GetDeviceInfoDescriptor(const UsbDev &uDev, std::vector<uint8_t> &descriptor, UsbDevice &dev)
978 {
979 if (usbd_ == nullptr) {
980 USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbd_ is nullptr");
981 return UEC_SERVICE_INVALID_VALUE;
982 }
983 int32_t ret = usbd_->GetRawDescriptor(uDev, descriptor);
984 if (ret != UEC_OK) {
985 USB_HILOGE(MODULE_USB_SERVICE, "GetRawDescriptor failed ret=%{public}d busNum:%{public}d devAddr:%{public}d",
986 ret, uDev.busNum, uDev.devAddr);
987 return ret;
988 }
989 uint8_t *buffer = descriptor.data();
990 uint32_t length = descriptor.size();
991 if ((!buffer) || (length == 0)) {
992 USB_HILOGE(MODULE_USB_SERVICE, "GetRawDescriptor failed len=%{public}d busNum:%{public}d devAddr:%{public}d",
993 length, uDev.busNum, uDev.devAddr);
994 return UEC_SERVICE_INVALID_VALUE;
995 }
996 dev.SetBusNum(uDev.busNum);
997 dev.SetDevAddr(uDev.devAddr);
998 dev.SetName(std::to_string(uDev.busNum) + "-" + std::to_string(uDev.devAddr));
999
1000 ret = UsbDescriptorParser::ParseDeviceDescriptor(buffer, length, dev);
1001 if (ret != UEC_OK) {
1002 USB_HILOGE(MODULE_USB_SERVICE, "ParseDeviceDescriptor failed ret=%{public}d", ret);
1003 return ret;
1004 }
1005 return ret;
1006 }
1007
GetConfigDescriptor(UsbDevice & dev,std::vector<uint8_t> & descriptor)1008 int32_t UsbService::GetConfigDescriptor(UsbDevice &dev, std::vector<uint8_t> &descriptor)
1009 {
1010 std::vector<USBConfig> configs;
1011 int32_t ret = UsbDescriptorParser::ParseConfigDescriptors(descriptor, CURSOR_INIT, configs);
1012 if (ret != UEC_OK) {
1013 USB_HILOGE(MODULE_USB_SERVICE, "ParseConfigDescriptors failed ret=%{public}d", ret);
1014 return ret;
1015 }
1016 dev.SetConfigs(configs);
1017 ret = FillDevStrings(dev);
1018 USB_HILOGI(MODULE_USB_SERVICE, "FillDevStrings ret=%{public}d", ret);
1019 return ret;
1020 }
1021
GetDeviceInfo(uint8_t busNum,uint8_t devAddr,UsbDevice & dev)1022 int32_t UsbService::GetDeviceInfo(uint8_t busNum, uint8_t devAddr, UsbDevice &dev)
1023 {
1024 const UsbDev uDev = {busNum, devAddr};
1025 std::vector<uint8_t> descriptor;
1026
1027 if (usbd_ == nullptr) {
1028 USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbd_ is nullptr");
1029 return UEC_SERVICE_INVALID_VALUE;
1030 }
1031 int32_t ret = usbd_->OpenDevice(uDev);
1032 if (ret != UEC_OK) {
1033 USB_HILOGE(MODULE_USB_SERVICE, "OpenDevice failed ret=%{public}d", ret);
1034 return ret;
1035 }
1036
1037 ret = GetDeviceInfoDescriptor(uDev, descriptor, dev);
1038 if (ret != UEC_OK) {
1039 USB_HILOGE(MODULE_USB_SERVICE, "GetDeviceInfoDescriptor ret=%{public}d", ret);
1040 }
1041 ret = GetConfigDescriptor(dev, descriptor);
1042 if (ret != UEC_OK) {
1043 USB_HILOGE(MODULE_USB_SERVICE, "GetConfigDescriptor ret=%{public}d", ret);
1044 return ret;
1045 }
1046
1047 return UEC_OK;
1048 }
1049
GetEdmGlobalPolicy(sptr<IRemoteObject> remote,bool & IsGlobalDisabled)1050 int32_t UsbService::GetEdmGlobalPolicy(sptr<IRemoteObject> remote, bool &IsGlobalDisabled)
1051 {
1052 if (remote == nullptr) {
1053 USB_HILOGE(MODULE_USB_SERVICE, "Remote is nullpter.");
1054 return UEC_SERVICE_INVALID_VALUE;
1055 }
1056 MessageParcel data;
1057 MessageParcel reply;
1058 MessageOption option;
1059 data.WriteInterfaceToken(DESCRIPTOR);
1060 data.WriteInt32(WITHOUT_USERID);
1061 data.WriteString("");
1062 data.WriteInt32(WITHOUT_ADMIN);
1063
1064 uint32_t funcCode = (1 << EMD_MASK_CODE) | DISABLE_USB;
1065 int32_t ErrCode = remote->SendRequest(funcCode, data, reply, option);
1066 int32_t ret = ERR_INVALID_VALUE;
1067 bool isSuccess = reply.ReadInt32(ret) && (ret == UEC_OK);
1068 if (!isSuccess) {
1069 USB_HILOGE(MODULE_USB_SERVICE, "GetGlobalPolicy failed. ErrCode = %{public}d, ret = %{public}d",
1070 ErrCode, ret);
1071 return UEC_SERVICE_EDM_SEND_REQUEST_FAILED;
1072 }
1073
1074 reply.ReadBool(IsGlobalDisabled);
1075 return UEC_OK;
1076 }
1077
GetEdmTypePolicy(sptr<IRemoteObject> remote,std::unordered_map<InterfaceType,bool> & typeDisableMap)1078 int32_t UsbService::GetEdmTypePolicy(sptr<IRemoteObject> remote,
1079 std::unordered_map<InterfaceType, bool> &typeDisableMap)
1080 {
1081 if (remote == nullptr) {
1082 USB_HILOGE(MODULE_USB_SERVICE, "Remote is nullpter.");
1083 return UEC_SERVICE_INVALID_VALUE;
1084 }
1085 int32_t StorageDisableType = 0;
1086 bool IsStorageDisabled = false;
1087 MessageParcel data;
1088 MessageParcel reply;
1089 MessageOption option;
1090 data.WriteInterfaceToken(DESCRIPTOR);
1091 data.WriteInt32(WITHOUT_USERID);
1092 data.WriteString("");
1093 data.WriteInt32(WITHOUT_ADMIN);
1094
1095 uint32_t funcCode = (1 << EMD_MASK_CODE) | USB_STORAGE_DEVICE_ACCESS_POLICY;
1096 int32_t ErrCode = remote->SendRequest(funcCode, data, reply, option);
1097 int32_t ret = ERR_INVALID_VALUE;
1098 bool isSuccess = reply.ReadInt32(ret) && (ret == ERR_OK);
1099 if (!isSuccess) {
1100 USB_HILOGE(MODULE_USB_SERVICE, "GetEdmTypePolicy failed. ErrCode = %{public}d, ret = %{public}d",
1101 ErrCode, ret);
1102 return UEC_SERVICE_EDM_SEND_REQUEST_FAILED;
1103 }
1104
1105 reply.ReadInt32(StorageDisableType);
1106 if (StorageDisableType == GET_EDM_STORAGE_DISABLE_TYPE) {
1107 IsStorageDisabled = true;
1108 }
1109 typeDisableMap[InterfaceType::TYPE_STORAGE] = IsStorageDisabled;
1110 return UEC_OK;
1111 }
1112
GetEdmWhiteListPolicy(sptr<IRemoteObject> remote,std::vector<UsbDeviceId> & trustUsbDeviceIds)1113 int32_t UsbService::GetEdmWhiteListPolicy(sptr<IRemoteObject> remote, std::vector<UsbDeviceId> &trustUsbDeviceIds)
1114 {
1115 if (remote == nullptr) {
1116 USB_HILOGE(MODULE_USB_SERVICE, "Remote is nullpter.");
1117 return UEC_SERVICE_INVALID_VALUE;
1118 }
1119 MessageParcel data;
1120 MessageParcel reply;
1121 MessageOption option;
1122 data.WriteInterfaceToken(DESCRIPTOR);
1123 data.WriteInt32(WITHOUT_USERID);
1124 data.WriteString("");
1125 data.WriteInt32(WITHOUT_ADMIN);
1126
1127 uint32_t funcCode = (1 << EMD_MASK_CODE) | ALLOWED_USB_DEVICES;
1128 int32_t ErrCode = remote->SendRequest(funcCode, data, reply, option);
1129 int32_t ret = ERR_INVALID_VALUE;
1130 bool IsSuccess = reply.ReadInt32(ret) && (ret == ERR_OK);
1131 if (!IsSuccess) {
1132 USB_HILOGE(MODULE_USB_SERVICE, "GetEdmWhiteListPolicy failed. ErrCode = %{public}d, ret = %{public}d",
1133 ErrCode, ret);
1134 return UEC_SERVICE_EDM_SEND_REQUEST_FAILED;
1135 }
1136
1137 int32_t size = reply.ReadInt32();
1138 if (size > WHITELIST_POLICY_MAX_DEVICES) {
1139 USB_HILOGE(MODULE_USB_SERVICE, "EdmWhiteList size=[%{public}d] is too large", size);
1140 return UEC_SERVICE_EDM_DEVICE_SIZE_EXCEED;
1141 }
1142 USB_HILOGI(MODULE_USB_SERVICE, "GetEdmWhiteListPolicy return size:%{public}d", size);
1143 for (int32_t i = 0; i < size; i++) {
1144 UsbDeviceId usbDeviceId;
1145 usbDeviceId.vendorId = reply.ReadInt32();
1146 usbDeviceId.productId = reply.ReadInt32();
1147 trustUsbDeviceIds.emplace_back(usbDeviceId);
1148 }
1149 return UEC_OK;
1150 }
1151
GetEdmPolicy(bool & IsGlobalDisabled,std::unordered_map<InterfaceType,bool> & typeDisableMap,std::vector<UsbDeviceId> & trustUsbDeviceIds)1152 int32_t UsbService::GetEdmPolicy(bool &IsGlobalDisabled, std::unordered_map<InterfaceType, bool> &typeDisableMap,
1153 std::vector<UsbDeviceId> &trustUsbDeviceIds)
1154 {
1155 sptr<ISystemAbilityManager> sm = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
1156 if (sm == nullptr) {
1157 USB_HILOGE(MODULE_USB_SERVICE, "fail to get SystemAbilityManager");
1158 return UEC_SERVICE_GET_SYSTEM_ABILITY_MANAGER_FAILED;
1159 }
1160 sptr<IRemoteObject> remote = sm->CheckSystemAbility(EDM_SYSTEM_ABILITY_ID);
1161 if (remote == nullptr) {
1162 USB_HILOGE(MODULE_USB_SERVICE, "Get Edm SystemAbility failed.");
1163 return UEC_SERVICE_GET_EDM_SERVICE_FAILED;
1164 }
1165
1166 int32_t ret = GetEdmGlobalPolicy(remote, IsGlobalDisabled);
1167 if (ret != UEC_OK) {
1168 USB_HILOGE(MODULE_USB_SERVICE, "GetEdmGlobalPolicy failed.");
1169 return ret;
1170 }
1171 ret = GetEdmTypePolicy(remote, typeDisableMap);
1172 if (ret != UEC_OK) {
1173 USB_HILOGE(MODULE_USB_SERVICE, "GetEdmTypePolicy failed.");
1174 return ret;
1175 }
1176 ret = GetEdmWhiteListPolicy(remote, trustUsbDeviceIds);
1177 if (ret != UEC_OK) {
1178 USB_HILOGE(MODULE_USB_SERVICE, "GetEdmWhiteListPolicy failed.");
1179 return ret;
1180 }
1181 return UEC_OK;
1182 }
1183
GetUsbPolicy(bool & IsGlobalDisabled,std::unordered_map<InterfaceType,bool> & typeDisableMap,std::vector<UsbDeviceId> & trustUsbDeviceIds)1184 int32_t UsbService::GetUsbPolicy(bool &IsGlobalDisabled, std::unordered_map<InterfaceType, bool> &typeDisableMap,
1185 std::vector<UsbDeviceId> &trustUsbDeviceIds)
1186 {
1187 auto startTime = std::chrono::steady_clock::now();
1188 while (true) {
1189 int32_t ret = GetEdmPolicy(IsGlobalDisabled, typeDisableMap, trustUsbDeviceIds);
1190 if (ret == UEC_OK) {
1191 USB_HILOGI(MODULE_USB_SERVICE, "GetUsbPolicy succeed");
1192 break;
1193 } else if (ret == EDM_SA_TIME_OUT_CODE) {
1194 auto currentTime = std::chrono::steady_clock::now();
1195 auto elapsedTime = std::chrono::duration_cast<std::chrono::milliseconds>(currentTime - startTime).count();
1196 if (elapsedTime >= EDM_SA_MAX_TIME_OUT) {
1197 USB_HILOGE(MODULE_USB_SERVICE, "Time out, exit loop");
1198 return UEC_SERVICE_EDM_SA_TIME_OUT_FAILED;
1199 }
1200 std::this_thread::sleep_for(std::chrono::milliseconds(MANAGE_INTERFACE_INTERVAL));
1201 } else {
1202 USB_HILOGE(MODULE_USB_SERVICE, "EDM sa failed");
1203 return UEC_SERVICE_PREPARE_EDM_SA_FAILED;
1204 }
1205 }
1206 return UEC_OK;
1207 }
1208
ExecuteManageInterfaceType(const std::vector<UsbDeviceType> & disableType,bool disable)1209 int32_t UsbService::ExecuteManageInterfaceType(const std::vector<UsbDeviceType> &disableType, bool disable)
1210 {
1211 int32_t ret = UEC_INTERFACE_NO_MEMORY;
1212 std::map<std::string, UsbDevice *>devices;
1213 usbHostManager_->GetDevices(devices);
1214 USB_HILOGI(MODULE_USB_SERVICE, "list size %{public}zu", devices.size());
1215 for (auto dev : disableType) {
1216 for (auto& [interfaceTypeValues, typeValues] : g_typeMap) {
1217 if ((!dev.isDeviceType) &&
1218 (typeValues[0] == dev.baseClass) &&
1219 (typeValues[1] == -1 || typeValues[1] == dev.subClass)&&
1220 (typeValues[HALF] == -1 || typeValues[HALF] == dev.protocol)) {
1221 ret = ManageInterfaceTypeImpl(interfaceTypeValues, disable);
1222 }
1223 }
1224 if (dev.isDeviceType) {
1225 for (auto it = devices.begin(); it != devices.end(); ++it) {
1226 ret = ManageDeviceImpl(it->second->GetVendorId(), it->second->GetProductId(), disable);
1227 }
1228 }
1229 }
1230 if (ret < UEC_OK) {
1231 USB_HILOGI(MODULE_USB_SERVICE, "ExecuteManageInterfaceType failed");
1232 return UEC_SERVICE_EXECUTE_POLICY_FAILED;
1233 }
1234 return UEC_OK;
1235 }
1236
ExecuteManageDevicePolicy(std::vector<UsbDeviceId> & whiteList)1237 int32_t UsbService::ExecuteManageDevicePolicy(std::vector<UsbDeviceId> &whiteList)
1238 {
1239 std::map<std::string, UsbDevice *> devices;
1240 usbHostManager_->GetDevices(devices);
1241 int32_t ret = UEC_INTERFACE_NO_MEMORY;
1242 USB_HILOGI(MODULE_USB_SERVICE, "list size %{public}zu", devices.size());
1243 for (auto it = devices.begin(); it != devices.end(); ++it) {
1244 bool inWhiteList = false;
1245 for (auto dev : whiteList) {
1246 if (it->second->GetProductId() == dev.productId && it->second->GetVendorId() == dev.vendorId) {
1247 inWhiteList = true;
1248 break;
1249 }
1250 }
1251 if (inWhiteList) {
1252 ret = ManageDeviceImpl(it->second->GetVendorId(), it->second->GetProductId(), false);
1253 } else {
1254 ret = ManageDeviceImpl(it->second->GetVendorId(), it->second->GetProductId(), true);
1255 }
1256 std::this_thread::sleep_for(std::chrono::milliseconds(MANAGE_INTERFACE_INTERVAL));
1257 }
1258 if (ret != UEC_OK) {
1259 USB_HILOGI(MODULE_USB_SERVICE, "ManageDevice failed");
1260 return UEC_SERVICE_EXECUTE_POLICY_FAILED;
1261 }
1262 return UEC_OK;
1263 }
1264
IsEdmEnabled()1265 bool UsbService::IsEdmEnabled()
1266 {
1267 std::string edmParaValue = OHOS::system::GetParameter("persist.edm.edm_enable", "false");
1268 USB_HILOGI(MODULE_USB_SERVICE, "edmParaValue is %{public}s", edmParaValue.c_str());
1269 return edmParaValue == "true";
1270 }
1271
ExecuteStrategy(UsbDevice * devInfo)1272 void UsbService::ExecuteStrategy(UsbDevice *devInfo)
1273 {
1274 USB_HILOGI(MODULE_USB_SERVICE, "start");
1275 if (!IsEdmEnabled()) {
1276 USB_HILOGE(MODULE_USB_SERVICE, "edm is not activate, skip");
1277 return;
1278 }
1279 bool isGlobalDisabled = false;
1280 std::unordered_map<InterfaceType, bool> typeDisableMap{};
1281 std::vector<UsbDeviceId> trustUsbDeviceIds{};
1282
1283 int32_t ret = GetUsbPolicy(isGlobalDisabled, typeDisableMap, trustUsbDeviceIds);
1284 if (ret == UEC_SERVICE_EDM_SA_TIME_OUT_FAILED || ret == UEC_SERVICE_PREPARE_EDM_SA_FAILED) {
1285 USB_HILOGE(MODULE_USB_SERVICE, "EDM sa time out or prepare failed, ret = %{public}d", ret);
1286 return;
1287 }
1288
1289 if (isGlobalDisabled) {
1290 ret = ManageGlobalInterfaceImpl(isGlobalDisabled);
1291 if (ret != UEC_OK) {
1292 USB_HILOGE(MODULE_USB_SERVICE, "ManageGlobalInterface failed");
1293 }
1294 return;
1295 }
1296 bool flag = false;
1297 for (auto result : typeDisableMap) {
1298 flag = flag || result.second;
1299 if (result.second) {
1300 ret = ManageInterfaceTypeImpl(result.first, true);
1301 }
1302 if (ret != UEC_OK) {
1303 USB_HILOGE(MODULE_USB_SERVICE, "ManageInterfaceType failed, type is %{public}d", (int32_t)result.first);
1304 }
1305 }
1306 if (flag) {
1307 USB_HILOGI(MODULE_USB_SERVICE, "Execute ManageInterfaceType finish");
1308 return;
1309 }
1310
1311 if (trustUsbDeviceIds.empty()) {
1312 USB_HILOGI(MODULE_USB_SERVICE, "trustUsbDeviceIds is empty, no devices disable");
1313 return;
1314 }
1315 ret = ExecuteManageDevicePolicy(trustUsbDeviceIds);
1316 if (ret != UEC_OK) {
1317 USB_HILOGE(MODULE_USB_SERVICE, "ExecuteManageDevicePolicy failed");
1318 }
1319 return;
1320 }
1321
AddDevice(uint8_t busNum,uint8_t devAddr)1322 bool UsbService::AddDevice(uint8_t busNum, uint8_t devAddr)
1323 {
1324 UsbDevice *devInfo = new (std::nothrow) UsbDevice();
1325 if (devInfo == nullptr) {
1326 USB_HILOGE(MODULE_USB_SERVICE, "new failed");
1327 return false;
1328 }
1329
1330 int32_t ret = GetDeviceInfo(busNum, devAddr, *devInfo);
1331 USB_HILOGI(MODULE_USB_SERVICE, "GetDeviceInfo ret=%{public}d", ret);
1332 if (ret != UEC_OK) {
1333 delete devInfo;
1334 return false;
1335 }
1336
1337 std::string name = std::to_string(busNum) + "-" + std::to_string(devAddr);
1338 std::string uniqueName = std::to_string(devInfo->GetVendorId()) + "-" + std::to_string(devInfo->GetProductId()) +
1339 "-" + devInfo->GetmSerial();
1340 USB_HILOGI(MODULE_USB_SERVICE, "map+: %{public}s", name.c_str());
1341 {
1342 std::lock_guard<std::mutex> guard(mutex_);
1343 deviceVidPidMap_.insert(std::pair<std::string, std::string>(name, uniqueName));
1344 }
1345
1346 if (usbHostManager_ == nullptr) {
1347 USB_HILOGE(MODULE_USB_SERVICE, "invalid usbHostManager_");
1348 return false;
1349 }
1350
1351 usbHostManager_->AddDevice(devInfo);
1352 ExecuteStrategy(devInfo);
1353 return true;
1354 }
1355
DelDevice(uint8_t busNum,uint8_t devAddr)1356 bool UsbService::DelDevice(uint8_t busNum, uint8_t devAddr)
1357 {
1358 USB_HILOGI(MODULE_USBD, "entry");
1359 int32_t ret = Close(busNum, devAddr);
1360 if (ret != UEC_OK) {
1361 USB_HILOGE(MODULE_USBD, "Close device failed width ret = %{public}d", ret);
1362 }
1363
1364 if (usbHostManager_ == nullptr || usbRightManager_ == nullptr) {
1365 USB_HILOGE(MODULE_USB_SERVICE, "invalid usbHostManager_ or usbRightManager_");
1366 return false;
1367 }
1368
1369 std::string name = std::to_string(busNum) + "-" + std::to_string(devAddr);
1370 if (!usbRightManager_->RemoveDeviceAllRight(GetDeviceVidPidSerialNumber(name))) {
1371 USB_HILOGW(MODULE_USB_SERVICE, "remove right failed: %{public}s", name.c_str());
1372 }
1373
1374 {
1375 std::lock_guard<std::mutex> guard(mutex_);
1376 for (auto it = deviceVidPidMap_.begin(); it != deviceVidPidMap_.end(); ++it) {
1377 if (it->first == name) {
1378 deviceVidPidMap_.erase(it);
1379 break;
1380 }
1381 }
1382 }
1383
1384 return usbHostManager_->DelDevice(busNum, devAddr);
1385 }
1386
InitUsbRight()1387 int32_t UsbService::InitUsbRight()
1388 {
1389 if (usbRightManager_ == nullptr) {
1390 USB_HILOGE(MODULE_USB_SERVICE, "invalid usbRightManager_");
1391 return UEC_SERVICE_INVALID_VALUE;
1392 }
1393 int32_t ret = usbRightManager_->Init();
1394 if (ret != UEC_OK) {
1395 USB_HILOGE(MODULE_USBD, "Init usb right manager failed: %{public}d", ret);
1396 return ret;
1397 }
1398 std::vector<std::string> devices;
1399 for (auto it = deviceVidPidMap_.begin(); it != deviceVidPidMap_.end(); ++it) {
1400 devices.push_back(it->second);
1401 }
1402 USB_HILOGI(MODULE_USBD, "clean: %{public}zu/%{public}zu", devices.size(), deviceVidPidMap_.size());
1403 ret = usbRightManager_->CleanUpRightExpired(devices);
1404 if (ret != USB_RIGHT_OK) {
1405 USB_HILOGE(MODULE_USBD, "clean expired usb right failed: %{public}d", ret);
1406 }
1407 return ret;
1408 }
1409
UpdateUsbPort(int32_t portId,int32_t powerRole,int32_t dataRole,int32_t mode)1410 void UsbService::UpdateUsbPort(int32_t portId, int32_t powerRole, int32_t dataRole, int32_t mode)
1411 {
1412 if (usbPortManager_ == nullptr) {
1413 USB_HILOGE(MODULE_USB_SERVICE, "invalid usbPortManager_");
1414 return;
1415 }
1416
1417 usbPortManager_->UpdatePort(portId, powerRole, dataRole, mode);
1418 }
1419
UpdateDeviceState(int32_t status)1420 void UsbService::UpdateDeviceState(int32_t status)
1421 {
1422 if (usbDeviceManager_ == nullptr) {
1423 USB_HILOGE(MODULE_USB_SERVICE, "invalid usbDeviceManager_");
1424 return;
1425 }
1426
1427 usbDeviceManager_->HandleEvent(status);
1428 }
1429
GetBundleName(std::string & bundleName)1430 bool UsbService::GetBundleName(std::string &bundleName)
1431 {
1432 #ifdef USB_RIGHT_TEST
1433 bundleName = "com.usb.right";
1434 return true;
1435 #endif
1436 pid_t uid = GetCallingUid();
1437 sptr<ISystemAbilityManager> systemAbilityManager =
1438 SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
1439 if (systemAbilityManager == nullptr) {
1440 return false;
1441 }
1442 sptr<IRemoteObject> remoteObject = systemAbilityManager->GetSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
1443 if (remoteObject == nullptr) {
1444 return false;
1445 }
1446
1447 sptr<AppExecFwk::IBundleMgr> bundleMgr(new AppExecFwk::BundleMgrProxy(remoteObject));
1448 if (bundleMgr == nullptr) {
1449 return false;
1450 }
1451
1452 ErrCode ret = bundleMgr->GetNameForUid(uid, bundleName);
1453 if (ret != ERR_OK) {
1454 USB_HILOGE(MODULE_USB_SERVICE, "failed to obtain bundleName");
1455 return false;
1456 }
1457 return true;
1458 }
1459
GetCallingInfo(std::string & bundleName,std::string & tokenId,int32_t & userId)1460 bool UsbService::GetCallingInfo(std::string &bundleName, std::string &tokenId, int32_t &userId)
1461 {
1462 OHOS::Security::AccessToken::AccessTokenID token = IPCSkeleton::GetCallingTokenID();
1463 OHOS::Security::AccessToken::HapTokenInfo hapTokenInfoRes;
1464 int32_t ret = OHOS::Security::AccessToken::AccessTokenKit::GetHapTokenInfo(token, hapTokenInfoRes);
1465 if (ret != ERR_OK) {
1466 USB_HILOGE(MODULE_USB_SERVICE, "failed, ret: %{public}d, app: %{public}s",
1467 ret, bundleName.c_str());
1468 return false;
1469 }
1470 bundleName = hapTokenInfoRes.bundleName;
1471 tokenId = std::to_string((uint32_t)token);
1472 userId = hapTokenInfoRes.userID;
1473 USB_HILOGD(MODULE_USB_SERVICE, "ret: %{public}d, app: %{public}s, user: %{public}d",
1474 ret, bundleName.c_str(), hapTokenInfoRes.userID);
1475 return true;
1476 }
1477
GetBundleInfo(std::string & tokenId,int32_t & userId)1478 bool UsbService::GetBundleInfo(std::string &tokenId, int32_t &userId)
1479 {
1480 OHOS::Security::AccessToken::AccessTokenID token = IPCSkeleton::GetCallingTokenID();
1481 OHOS::Security::AccessToken::HapTokenInfo hapTokenInfoRes;
1482 int32_t ret = OHOS::Security::AccessToken::AccessTokenKit::GetHapTokenInfo(token, hapTokenInfoRes);
1483 if (ret != ERR_OK) {
1484 USB_HILOGE(MODULE_USB_SERVICE, "failed, ret: %{public}d", ret);
1485 return false;
1486 }
1487 tokenId = USB_DEFAULT_TOKEN;
1488 userId = hapTokenInfoRes.userID;
1489 return true;
1490 }
1491
RegBulkCallback(const UsbDev & devInfo,const UsbPipe & pipe,const sptr<IRemoteObject> & cb)1492 int32_t UsbService::RegBulkCallback(const UsbDev &devInfo, const UsbPipe &pipe, const sptr<IRemoteObject> &cb)
1493 {
1494 if (cb == nullptr) {
1495 USB_HILOGE(MODULE_USB_SERVICE, "cb is nullptr");
1496 return UEC_SERVICE_INVALID_VALUE;
1497 }
1498 if (!UsbService::CheckDevicePermission(devInfo.busNum, devInfo.devAddr)) {
1499 return UEC_SERVICE_PERMISSION_DENIED;
1500 }
1501 std::lock_guard<std::mutex> guard(hdiCbMutex_);
1502 if (hdiCb_ == nullptr) {
1503 hdiCb_ = new UsbdBulkCallbackImpl(cb);
1504 }
1505 if (usbd_ == nullptr) {
1506 USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbd_ is nullptr");
1507 return UEC_SERVICE_INVALID_VALUE;
1508 }
1509
1510 int32_t ret = usbd_->RegBulkCallback(devInfo, pipe, hdiCb_);
1511 if (ret != UEC_OK) {
1512 USB_HILOGE(MODULE_USB_SERVICE, "RegBulkCallback error ret:%{public}d", ret);
1513 }
1514 return ret;
1515 }
1516
UnRegBulkCallback(const UsbDev & devInfo,const UsbPipe & pipe)1517 int32_t UsbService::UnRegBulkCallback(const UsbDev &devInfo, const UsbPipe &pipe)
1518 {
1519 if (usbd_ == nullptr) {
1520 USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbd_ is nullptr");
1521 return UEC_SERVICE_INVALID_VALUE;
1522 }
1523 if (!UsbService::CheckDevicePermission(devInfo.busNum, devInfo.devAddr)) {
1524 return UEC_SERVICE_PERMISSION_DENIED;
1525 }
1526
1527 std::lock_guard<std::mutex> guard(hdiCbMutex_);
1528 hdiCb_ = nullptr;
1529 int32_t ret = usbd_->UnRegBulkCallback(devInfo, pipe);
1530 if (ret != UEC_OK) {
1531 USB_HILOGE(MODULE_USB_SERVICE, "UnRegBulkCallback error ret:%{public}d", ret);
1532 }
1533 return ret;
1534 }
1535
BulkRead(const UsbDev & devInfo,const UsbPipe & pipe,sptr<Ashmem> & ashmem)1536 int32_t UsbService::BulkRead(const UsbDev &devInfo, const UsbPipe &pipe, sptr<Ashmem> &ashmem)
1537 {
1538 if (ashmem == nullptr) {
1539 USB_HILOGE(MODULE_USB_SERVICE, "BulkRead error ashmem");
1540 return UEC_SERVICE_INVALID_VALUE;
1541 }
1542
1543 if (usbd_ == nullptr) {
1544 USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbd_ is nullptr");
1545 return UEC_SERVICE_INVALID_VALUE;
1546 }
1547
1548 if (!UsbService::CheckDevicePermission(devInfo.busNum, devInfo.devAddr)) {
1549 return UEC_SERVICE_PERMISSION_DENIED;
1550 }
1551
1552 int32_t ret = usbd_->BulkRead(devInfo, pipe, ashmem);
1553 if (ret != UEC_OK) {
1554 USB_HILOGE(MODULE_USB_SERVICE, "BulkRead error ret:%{public}d", ret);
1555 }
1556 return ret;
1557 }
1558
BulkWrite(const UsbDev & devInfo,const UsbPipe & pipe,sptr<Ashmem> & ashmem)1559 int32_t UsbService::BulkWrite(const UsbDev &devInfo, const UsbPipe &pipe, sptr<Ashmem> &ashmem)
1560 {
1561 if (ashmem == nullptr) {
1562 USB_HILOGE(MODULE_USB_SERVICE, "BulkWrite error ashmem");
1563 return UEC_SERVICE_INVALID_VALUE;
1564 }
1565
1566 if (usbd_ == nullptr) {
1567 USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbd_ is nullptr");
1568 return UEC_SERVICE_INVALID_VALUE;
1569 }
1570
1571 if (!UsbService::CheckDevicePermission(devInfo.busNum, devInfo.devAddr)) {
1572 return UEC_SERVICE_PERMISSION_DENIED;
1573 }
1574
1575 int32_t ret = usbd_->BulkWrite(devInfo, pipe, ashmem);
1576 if (ret != UEC_OK) {
1577 USB_HILOGE(MODULE_USB_SERVICE, "BulkWrite error ret:%{public}d", ret);
1578 }
1579 return ret;
1580 }
1581
BulkCancel(const UsbDev & devInfo,const UsbPipe & pipe)1582 int32_t UsbService::BulkCancel(const UsbDev &devInfo, const UsbPipe &pipe)
1583 {
1584 if (usbd_ == nullptr) {
1585 USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbd_ is nullptr");
1586 return UEC_SERVICE_INVALID_VALUE;
1587 }
1588
1589 if (!UsbService::CheckDevicePermission(devInfo.busNum, devInfo.devAddr)) {
1590 return UEC_SERVICE_PERMISSION_DENIED;
1591 }
1592
1593 int32_t ret = usbd_->BulkCancel(devInfo, pipe);
1594 if (ret != UEC_OK) {
1595 USB_HILOGE(MODULE_USB_SERVICE, "BulkCancel error ret:%{public}d", ret);
1596 }
1597 return ret;
1598 }
1599
AddRight(const std::string & bundleName,const std::string & deviceName)1600 int32_t UsbService::AddRight(const std::string &bundleName, const std::string &deviceName)
1601 {
1602 if (usbRightManager_ == nullptr) {
1603 USB_HILOGE(MODULE_USB_SERVICE, "invalid usbRightManager_");
1604 return UEC_SERVICE_INVALID_VALUE;
1605 }
1606 std::string deviceVidPidSerialNum = "";
1607 int32_t ret = GetDeviceVidPidSerialNumber(deviceName, deviceVidPidSerialNum);
1608 if (ret != UEC_OK) {
1609 USB_HILOGE(MODULE_USB_SERVICE, "can not find deviceName.");
1610 return ret;
1611 }
1612 if (!(usbRightManager_->IsSystemAppOrSa() && usbRightManager_->VerifyPermission())) {
1613 return UEC_SERVICE_PERMISSION_DENIED_SYSAPI;
1614 }
1615 std::string tokenId;
1616 int32_t userId = USB_RIGHT_USERID_INVALID;
1617 if (!GetBundleInfo(tokenId, userId)) {
1618 USB_HILOGE(MODULE_USB_SERVICE, "GetCallingInfo false");
1619 return false;
1620 }
1621 USB_HILOGI(MODULE_USB_SERVICE, "AddRight bundleName = %{public}s, deviceName = %{public}s", bundleName.c_str(),
1622 deviceName.c_str());
1623 if (!usbRightManager_->AddDeviceRight(deviceVidPidSerialNum, bundleName, tokenId, userId)) {
1624 USB_HILOGE(MODULE_USB_SERVICE, "AddDeviceRight failed");
1625 return UEC_SERVICE_INNER_ERR;
1626 }
1627 USB_HILOGI(MODULE_USB_SERVICE, "AddRight done");
1628 return UEC_OK;
1629 }
1630
AddAccessRight(const std::string & tokenId,const std::string & deviceName)1631 int32_t UsbService::AddAccessRight(const std::string &tokenId, const std::string &deviceName)
1632 {
1633 if (usbRightManager_ == nullptr) {
1634 USB_HILOGE(MODULE_USB_SERVICE, "invalid usbRightManager_");
1635 return UEC_SERVICE_INVALID_VALUE;
1636 }
1637 std::string deviceVidPidSerialNum = "";
1638 int32_t ret = GetDeviceVidPidSerialNumber(deviceName, deviceVidPidSerialNum);
1639 if (ret != UEC_OK) {
1640 USB_HILOGE(MODULE_USB_SERVICE, "can not find deviceName.");
1641 return ret;
1642 }
1643 if (!(usbRightManager_->IsSystemAppOrSa() && usbRightManager_->VerifyPermission())) {
1644 return UEC_SERVICE_PERMISSION_DENIED_SYSAPI;
1645 }
1646 USB_HILOGI(MODULE_USB_SERVICE, "AddRight deviceName = %{public}s", deviceName.c_str());
1647 if (!usbRightManager_->AddDeviceRight(deviceVidPidSerialNum, tokenId)) {
1648 USB_HILOGE(MODULE_USB_SERVICE, "AddDeviceRight failed");
1649 return UEC_SERVICE_INNER_ERR;
1650 }
1651 USB_HILOGI(MODULE_USB_SERVICE, "AddRight done");
1652 return UEC_OK;
1653 }
1654
Dump(int fd,const std::vector<std::u16string> & args)1655 int UsbService::Dump(int fd, const std::vector<std::u16string> &args)
1656 {
1657 if (fd < 0) {
1658 USB_HILOGE(MODULE_USB_SERVICE, "fd is invalid fd:%{public}d", fd);
1659 return UEC_SERVICE_INVALID_VALUE;
1660 }
1661
1662 if (usbHostManager_ == nullptr || usbDeviceManager_ == nullptr) {
1663 USB_HILOGE(MODULE_USB_SERVICE, "usbHostManager_ is nullptr or usbDeviceManager_ is nullptr");
1664 return UEC_SERVICE_INVALID_VALUE;
1665 }
1666
1667 std::vector<std::string> argList;
1668 std::transform(args.begin(), args.end(), std::back_inserter(argList), [](const std::u16string &arg) {
1669 return Str16ToStr8(arg);
1670 });
1671
1672 if (argList.empty()) {
1673 USB_HILOGE(MODULE_USB_SERVICE, "argList is empty");
1674 DumpHelp(fd);
1675 return UEC_SERVICE_INVALID_VALUE;
1676 }
1677 if (argList[0] == USB_HOST) {
1678 usbHostManager_->Dump(fd, argList[1]);
1679 } else if (argList[0] == USB_DEVICE) {
1680 usbDeviceManager_->Dump(fd, argList);
1681 } else if (argList[0] == USB_PORT) {
1682 usbPortManager_->Dump(fd, argList);
1683 } else if (argList[0] == USB_HELP) {
1684 DumpHelp(fd);
1685 } else {
1686 dprintf(fd, "Usb Dump service:invalid parameter.\n");
1687 DumpHelp(fd);
1688 }
1689 return UEC_OK;
1690 }
1691
DumpHelp(int32_t fd)1692 void UsbService::DumpHelp(int32_t fd)
1693 {
1694 if (usbDeviceManager_ == nullptr || usbPortManager_ == nullptr) {
1695 USB_HILOGE(MODULE_USB_SERVICE, "usbDeviceManager_ is nullptr or usbPortManager_ is nullptr");
1696 return;
1697 }
1698 dprintf(fd, "Refer to the following usage:\n");
1699 dprintf(fd, "-h: dump help\n");
1700 dprintf(fd, "============= dump the all device ==============\n");
1701 dprintf(fd, "usb_host -a: dump the all device list info\n");
1702 dprintf(fd, "------------------------------------------------\n");
1703 usbDeviceManager_->GetDumpHelp(fd);
1704 usbPortManager_->GetDumpHelp(fd);
1705 }
1706
UnLoadSelf(UnLoadSaType type)1707 void UsbService::UnLoadSelf(UnLoadSaType type)
1708 {
1709 if (OHOS::system::GetBoolParameter("const.security.developermode.state", true)) {
1710 USB_HILOGI(MODULE_USB_SERVICE, "no need to unload in dev mode");
1711 return;
1712 }
1713
1714 auto task = []() {
1715 auto samgrProxy = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
1716 if (samgrProxy == nullptr) {
1717 USB_HILOGE(MODULE_USB_SERVICE, "get samgr failed");
1718 return;
1719 }
1720
1721 auto ret = samgrProxy->UnloadSystemAbility(USB_SYSTEM_ABILITY_ID);
1722 if (ret != UEC_OK) {
1723 USB_HILOGE(MODULE_USB_SERVICE, "unload failed");
1724 }
1725 };
1726 if (type == UNLOAD_SA_IMMEDIATELY) {
1727 task();
1728 return;
1729 }
1730
1731 if (usbHostManager_ == nullptr || usbDeviceManager_ == nullptr) {
1732 USB_HILOGE(MODULE_USB_SERVICE, "invalid usbHostManager_ or usbDeviceManager_");
1733 return;
1734 }
1735
1736 unloadSelfTimer_.Unregister(unloadSelfTimerId_);
1737 unloadSelfTimer_.Shutdown();
1738
1739 std::map<std::string, UsbDevice *> devices;
1740 usbHostManager_->GetDevices(devices);
1741 if (devices.size() != 0 || usbDeviceManager_->IsGadgetConnected()) { // delay unload conditions
1742 USB_HILOGW(MODULE_USB_SERVICE, "not need unload");
1743 Memory::MemMgrClient::GetInstance().SetCritical(getpid(), true, USB_SYSTEM_ABILITY_ID);
1744 return;
1745 } else {
1746 Memory::MemMgrClient::GetInstance().SetCritical(getpid(), false, USB_SYSTEM_ABILITY_ID);
1747 }
1748
1749 if (auto ret = unloadSelfTimer_.Setup(); ret != Utils::TIMER_ERR_OK) {
1750 USB_HILOGE(MODULE_USB_SERVICE, "set up timer failed %{public}u", ret);
1751 return;
1752 }
1753 unloadSelfTimerId_ = unloadSelfTimer_.Register(task, UNLOAD_SA_TIMER_INTERVAL, true);
1754 }
1755
OnRemoteDied(const wptr<IRemoteObject> & object)1756 void UsbService::UsbdDeathRecipient::OnRemoteDied(const wptr<IRemoteObject> &object)
1757 {
1758 auto samgrProxy = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
1759 if (samgrProxy == nullptr) {
1760 USB_HILOGE(MODULE_USB_SERVICE, "get samgr failed");
1761 return;
1762 }
1763
1764 auto ret = samgrProxy->UnloadSystemAbility(USB_SYSTEM_ABILITY_ID);
1765 if (ret != UEC_OK) {
1766 USB_HILOGE(MODULE_USB_SERVICE, "unload failed");
1767 }
1768 }
1769
GetGlobalInstance()1770 sptr<UsbService> UsbService::GetGlobalInstance()
1771 {
1772 return g_serviceInstance;
1773 }
1774
PreCallFunction()1775 int32_t UsbService::PreCallFunction()
1776 {
1777 usbd_ = OHOS::HDI::Usb::V1_1::IUsbInterface::Get();
1778 if (usbRightManager_ == nullptr) {
1779 USB_HILOGE(MODULE_USB_SERVICE, "invalid usbRightManager_");
1780 return UEC_SERVICE_INVALID_VALUE;
1781 }
1782 if (!(usbRightManager_->IsSystemAppOrSa())) {
1783 return UEC_SERVICE_PERMISSION_DENIED_SYSAPI;
1784 }
1785
1786 if (usbHostManager_ == nullptr) {
1787 USB_HILOGE(MODULE_USB_SERVICE, "invalid usbHostManager_");
1788 return UEC_SERVICE_INVALID_VALUE;
1789 }
1790
1791 if (usbd_ == nullptr) {
1792 USB_HILOGE(MODULE_USB_SERVICE, "usbd_ is nullptr");
1793 return UEC_SERVICE_INVALID_VALUE;
1794 }
1795 return UEC_OK;
1796 }
1797
ManageGlobalInterface(bool disable)1798 int32_t UsbService::ManageGlobalInterface(bool disable)
1799 {
1800 if (PreCallFunction() != UEC_OK) {
1801 USB_HILOGE(MODULE_USB_SERVICE, "PreCallFunction failed");
1802 return UEC_SERVICE_PRE_MANAGE_INTERFACE_FAILED;
1803 }
1804
1805 return ManageGlobalInterfaceImpl(disable);
1806 }
1807
ManageDevice(int32_t vendorId,int32_t productId,bool disable)1808 int32_t UsbService::ManageDevice(int32_t vendorId, int32_t productId, bool disable)
1809 {
1810 if (PreCallFunction() != UEC_OK) {
1811 USB_HILOGE(MODULE_USB_SERVICE, "PreCallFunction failed");
1812 return UEC_SERVICE_PRE_MANAGE_INTERFACE_FAILED;
1813 }
1814
1815 return ManageDeviceImpl(vendorId, productId, disable);
1816 }
1817
ManageInterfaceStorage(InterfaceType interfaceType,bool disable)1818 int32_t UsbService::ManageInterfaceStorage(InterfaceType interfaceType, bool disable)
1819 {
1820 if (PreCallFunction() != UEC_OK) {
1821 USB_HILOGE(MODULE_USB_SERVICE, "PreCallFunction failed");
1822 return UEC_SERVICE_PRE_MANAGE_INTERFACE_FAILED;
1823 }
1824 return ManageInterfaceTypeImpl(interfaceType, disable);
1825 }
1826
ManageInterfaceType(const std::vector<UsbDeviceType> & disableType,bool disable)1827 int32_t UsbService::ManageInterfaceType(const std::vector<UsbDeviceType> &disableType, bool disable)
1828 {
1829 if (PreCallFunction() != UEC_OK) {
1830 USB_HILOGE(MODULE_USB_SERVICE, "PreCallFunction failed");
1831 return UEC_SERVICE_PRE_MANAGE_INTERFACE_FAILED;
1832 }
1833 return ExecuteManageInterfaceType(disableType, disable);
1834 }
1835
ManageGlobalInterfaceImpl(bool disable)1836 int32_t UsbService::ManageGlobalInterfaceImpl(bool disable)
1837 {
1838 if (usbHostManager_ == nullptr) {
1839 USB_HILOGE(MODULE_USB_SERVICE, "usbHostManager_ is nullptr");
1840 return UEC_SERVICE_INVALID_VALUE;
1841 }
1842 if (usbd_ == nullptr) {
1843 USB_HILOGE(MODULE_USB_SERVICE, "usbd_ is nullptr");
1844 return UEC_SERVICE_INVALID_VALUE;
1845 }
1846 std::map<std::string, UsbDevice *> devices;
1847 usbHostManager_->GetDevices(devices);
1848 USB_HILOGI(MODULE_USB_SERVICE, "list size %{public}zu", devices.size());
1849 for (auto it = devices.begin(); it != devices.end(); ++it) {
1850 UsbDev dev = {it->second->GetBusNum(), it->second->GetDevAddr()};
1851 uint8_t configIndex = 0;
1852 if (usbd_->GetConfig(dev, configIndex)) {
1853 USB_HILOGW(MODULE_USB_SERVICE, "get device active config failed.");
1854 continue;
1855 }
1856 USBConfig configs;
1857 if (it->second->GetConfig(static_cast<uint8_t>(configIndex) - 1, configs)) {
1858 USB_HILOGW(MODULE_USB_SERVICE, "get device config info failed.");
1859 continue;
1860 }
1861
1862 std::vector<UsbInterface> interfaces = configs.GetInterfaces();
1863 for (uint32_t i = 0; i < interfaces.size(); i++) {
1864 ManageInterface(dev, interfaces[i].GetId(), disable);
1865 std::this_thread::sleep_for(std::chrono::milliseconds(MANAGE_INTERFACE_INTERVAL));
1866 }
1867 }
1868 return UEC_OK;
1869 }
1870
ManageDeviceImpl(int32_t vendorId,int32_t productId,bool disable)1871 int32_t UsbService::ManageDeviceImpl(int32_t vendorId, int32_t productId, bool disable)
1872 {
1873 if (usbHostManager_ == nullptr) {
1874 USB_HILOGE(MODULE_USB_SERVICE, "usbHostManager_ is nullptr");
1875 return UEC_SERVICE_INVALID_VALUE;
1876 }
1877 if (usbd_ == nullptr) {
1878 USB_HILOGE(MODULE_USB_SERVICE, "usbd_ is nullptr");
1879 return UEC_SERVICE_INVALID_VALUE;
1880 }
1881 std::map<std::string, UsbDevice *> devices;
1882 usbHostManager_->GetDevices(devices);
1883 USB_HILOGI(MODULE_USB_SERVICE, "list size %{public}zu, vId: %{public}d, pId: %{public}d, b: %{public}d",
1884 devices.size(), vendorId, productId, disable);
1885 for (auto it = devices.begin(); it != devices.end(); ++it) {
1886 if ((it->second->GetVendorId() == vendorId) && (it->second->GetProductId() == productId)) {
1887 UsbDev dev = {it->second->GetBusNum(), it->second->GetDevAddr()};
1888 uint8_t configIndex = 0;
1889 if (usbd_->GetConfig(dev, configIndex)) {
1890 USB_HILOGW(MODULE_USB_SERVICE, "get device active config failed.");
1891 continue;
1892 }
1893 USBConfig configs;
1894 if (it->second->GetConfig(static_cast<uint8_t>(configIndex) - 1, configs)) {
1895 USB_HILOGW(MODULE_USB_SERVICE, "get device config info failed.");
1896 continue;
1897 }
1898 std::vector<UsbInterface> interfaces = configs.GetInterfaces();
1899 for (uint32_t i = 0; i < interfaces.size(); i++) {
1900 ManageInterface(dev, interfaces[i].GetId(), disable);
1901 std::this_thread::sleep_for(std::chrono::milliseconds(MANAGE_INTERFACE_INTERVAL));
1902 }
1903 }
1904 }
1905 return UEC_OK;
1906 }
1907
ManageInterfaceTypeImpl(InterfaceType interfaceType,bool disable)1908 int32_t UsbService::ManageInterfaceTypeImpl(InterfaceType interfaceType, bool disable)
1909 {
1910 if (usbHostManager_ == nullptr || usbd_ == nullptr) {
1911 USB_HILOGE(MODULE_USB_SERVICE, "usbHostManager_ or usbd_ is nullptr");
1912 return UEC_SERVICE_INVALID_VALUE;
1913 }
1914 auto iterInterface = g_typeMap.find(interfaceType);
1915 if (iterInterface == g_typeMap.end()) {
1916 USB_HILOGE(MODULE_USB_SERVICE, "UsbService::not find interface type");
1917 return UEC_SERVICE_INVALID_VALUE;
1918 }
1919
1920 std::map<std::string, UsbDevice *> devices;
1921 usbHostManager_->GetDevices(devices);
1922 for (auto it = devices.begin(); it != devices.end(); ++it) {
1923 UsbDev dev = {it->second->GetBusNum(), it->second->GetDevAddr()};
1924 uint8_t configIndex = 0;
1925 if (usbd_->GetConfig(dev, configIndex)) {
1926 USB_HILOGW(MODULE_USB_SERVICE, "get device active config failed.");
1927 continue;
1928 }
1929 USBConfig configs;
1930 if (it->second->GetConfig(static_cast<uint8_t>(configIndex) - 1, configs)) {
1931 USB_HILOGW(MODULE_USB_SERVICE, "get device config info failed.");
1932 continue;
1933 }
1934 std::vector<UsbInterface> interfaces = configs.GetInterfaces();
1935
1936 for (uint32_t i = 0; i < interfaces.size(); i++) {
1937 // 0 indicate base class, 1 indicate subclass, 2 indicate protocol. -1 indicate any value.
1938 if ((interfaces[i].GetClass() == iterInterface->second[BASECLASS_INDEX]) && (interfaces[i].GetClass() ==
1939 iterInterface->second[SUBCLASS_INDEX] || iterInterface->second[SUBCLASS_INDEX] ==
1940 RANDOM_VALUE_INDICATE) && (interfaces[i].GetProtocol() == iterInterface->second[PROTOCAL_INDEX] ||
1941 iterInterface->second[PROTOCAL_INDEX] == RANDOM_VALUE_INDICATE)) {
1942 ManageInterface(dev, interfaces[i].GetId(), disable);
1943 USB_HILOGI(MODULE_USB_SERVICE, "size %{public}zu, interfaceType: %{public}d, disable: %{public}d",
1944 devices.size(), (int32_t)interfaceType, disable);
1945 std::this_thread::sleep_for(std::chrono::milliseconds(MANAGE_INTERFACE_INTERVAL));
1946 }
1947 }
1948 }
1949 return UEC_OK;
1950 }
1951
ManageInterface(const HDI::Usb::V1_0::UsbDev & dev,uint8_t interfaceId,bool disable)1952 int32_t UsbService::ManageInterface(const HDI::Usb::V1_0::UsbDev &dev, uint8_t interfaceId, bool disable)
1953 {
1954 if (usbd_ == nullptr) {
1955 USB_HILOGE(MODULE_USB_SERVICE, "usbd_ is nullptr");
1956 return UEC_SERVICE_INVALID_VALUE;
1957 }
1958 return usbd_->ManageInterface(dev, interfaceId, disable);
1959 }
1960
GetInterfaceActiveStatus(uint8_t busNum,uint8_t devAddr,uint8_t interfaceid,bool & unactivated)1961 int32_t UsbService::GetInterfaceActiveStatus(uint8_t busNum, uint8_t devAddr, uint8_t interfaceid, bool &unactivated)
1962 {
1963 if (PreCallFunction() != UEC_OK) {
1964 USB_HILOGE(MODULE_USB_SERVICE, "PreCallFunction failed");
1965 return UEC_SERVICE_PRE_MANAGE_INTERFACE_FAILED;
1966 }
1967
1968 const UsbDev dev = {busNum, devAddr};
1969 if (usbd_ == nullptr) {
1970 USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbd_ is nullptr");
1971 return UEC_SERVICE_INVALID_VALUE;
1972 }
1973 int32_t ret = usbd_->GetInterfaceActiveStatus(dev, interfaceid, unactivated);
1974 if (ret != UEC_OK) {
1975 USB_HILOGE(MODULE_USB_SERVICE, "error ret:%{public}d", ret);
1976 }
1977 return ret;
1978 }
1979
GetDeviceSpeed(uint8_t busNum,uint8_t devAddr,uint8_t & speed)1980 int32_t UsbService::GetDeviceSpeed(uint8_t busNum, uint8_t devAddr, uint8_t &speed)
1981 {
1982 if (PreCallFunction() != UEC_OK) {
1983 USB_HILOGE(MODULE_USB_SERVICE, "PreCallFunction failed");
1984 return UEC_SERVICE_PRE_MANAGE_INTERFACE_FAILED;
1985 }
1986
1987 const UsbDev dev = {busNum, devAddr};
1988 if (usbd_ == nullptr) {
1989 USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbd_ is nullptr");
1990 return UEC_SERVICE_INVALID_VALUE;
1991 }
1992 int32_t ret = usbd_->GetDeviceSpeed(dev, speed);
1993 if (ret != UEC_OK) {
1994 USB_HILOGE(MODULE_USB_SERVICE, "error ret:%{public}d", ret);
1995 }
1996 USB_HILOGE(MODULE_USB_SERVICE, "GetDeviceSpeedImpl:%{public}u", speed);
1997 return ret;
1998 }
1999
GetDeviceProductName(const std::string & deviceName,std::string & productName)2000 bool UsbService::GetDeviceProductName(const std::string &deviceName, std::string &productName)
2001 {
2002 if (usbHostManager_ == nullptr) {
2003 USB_HILOGE(MODULE_USB_SERVICE, "usbHostManager_ is nullptr");
2004 return false;
2005 }
2006 return usbHostManager_->GetProductName(deviceName, productName);
2007 }
2008 } // namespace USB
2009 } // namespace OHOS
2010