• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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