• 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 #include <iostream>
16 #include <sstream>
17 #include <map>
18 #include <string>
19 #include <set>
20 #include <thread>
21 #include <ipc_skeleton.h>
22 
23 #include "usb_host_manager.h"
24 #include "common_event_data.h"
25 #include "common_event_manager.h"
26 #include "common_event_support.h"
27 #include "hilog_wrapper.h"
28 #include "hisysevent.h"
29 #include "cJSON.h"
30 #include "usb_serial_reader.h"
31 #include "usb_device.h"
32 #include "usb_config.h"
33 #include "usb_interface.h"
34 #include "usb_errors.h"
35 #include "if_system_ability_manager.h"
36 #include "iservice_registry.h"
37 #include "parameters.h"
38 #include "usbd_bulkcallback_impl.h"
39 #include "usb_descriptor_parser.h"
40 #include "usbd_transfer_callback_impl.h"
41 #include "usb_napi_errors.h"
42 #include "accesstoken_kit.h"
43 
44 using namespace OHOS::AAFwk;
45 using namespace OHOS::EventFwk;
46 using namespace OHOS::HiviewDFX;
47 using namespace OHOS::HDI::Usb::V1_2;
48 
49 namespace OHOS {
50 namespace USB {
51 constexpr int32_t CLASS_PRINT_LENGTH = 2;
52 constexpr int32_t USAGE_IN_INTERFACE_CLASS = 0;
53 constexpr uint8_t DES_USAGE_IN_INTERFACE = 0x02;
54 constexpr int LAST_FIVE = 5;
55 std::map<int32_t, DeviceClassUsage> deviceUsageMap = {
56     {0x00, {DeviceClassUsage(2, "Use class information in the Interface Descriptors")}},
57     {0x01, {DeviceClassUsage(2, "Audio")}},
58     {0x02, {DeviceClassUsage(3, "Communications and CDC Control")}},
59     {0x03, {DeviceClassUsage(2, "HID(Human Interface Device)")}},
60     {0x05, {DeviceClassUsage(2, "Physical")}},
61     {0x06, {DeviceClassUsage(2, "Image")}},
62     {0x07, {DeviceClassUsage(2, "Printer")}},
63     {0x08, {DeviceClassUsage(2, "Mass Storage")}},
64     {0x09, {DeviceClassUsage(1, "Hub")}},
65     {0x0a, {DeviceClassUsage(2, "CDC-Data")}},
66     {0x0b, {DeviceClassUsage(2, "Smart Card")}},
67     {0x0d, {DeviceClassUsage(2, "Content Security")}},
68     {0x0e, {DeviceClassUsage(2, "Video")}},
69     {0x0f, {DeviceClassUsage(2, "Personal Healthcare")}},
70     {0x10, {DeviceClassUsage(2, "Audio/Video Device")}},
71     {0x11, {DeviceClassUsage(1, "Billboard Device Class")}},
72     {0x12, {DeviceClassUsage(2, "USB Type-C Bridge Class")}}
73 };
74 
75 std::map<UsbDeviceType, std::string> interfaceUsageMap = {
76     {{UsbDeviceType(0x03, 0x01, 0x01, 0)}, "KeyBoard"},
77     {{UsbDeviceType(0x03, 0x01, 0x02, 0)}, "Mouse/Table/Touch screen"},
78 };
79 constexpr uint32_t CURSOR_INIT = 18;
80 constexpr int32_t DESCRIPTOR_TYPE_STRING = 3;
81 constexpr int32_t DESCRIPTOR_VALUE_START_OFFSET = 2;
82 constexpr int32_t HALF = 2;
83 constexpr int32_t BIT_SHIFT_4 = 4;
84 constexpr int32_t BIT_HIGH_4 = 0xF0;
85 constexpr int32_t BIT_LOW_4 = 0x0F;
86 constexpr uint32_t MANAGE_INTERFACE_INTERVAL = 100;
87 constexpr uint32_t EDM_SA_MAX_TIME_OUT = 5000;
88 constexpr uint32_t EDM_SYSTEM_ABILITY_ID = 1601;
89 const std::u16string DESCRIPTOR = u"ohos.edm.IEnterpriseDeviceMgr";
90 constexpr uint32_t WITHOUT_USERID = 0;
91 constexpr uint32_t WITHOUT_ADMIN = 1;
92 constexpr uint32_t EMD_MASK_CODE = 20;
93 constexpr uint32_t DISABLE_USB = 1043;
94 constexpr uint32_t ALLOWED_USB_DEVICES = 1044;
95 constexpr uint32_t USB_STORAGE_DEVICE_ACCESS_POLICY = 1026;
96 constexpr uint32_t USB_DEVICE_ACCESS_POLICY = 1059;
97 constexpr int32_t WHITELIST_POLICY_MAX_DEVICES = 1000;
98 constexpr uint32_t EDM_SA_TIME_OUT_CODE = 9200007;
99 constexpr int32_t BASECLASS_INDEX = 0;
100 constexpr int32_t SUBCLASS_INDEX = 1;
101 constexpr int32_t PROTOCAL_INDEX = 2;
102 constexpr int32_t STORAGE_BASE_CLASS = 8;
103 constexpr int32_t GET_EDM_STORAGE_DISABLE_TYPE = 2;
104 constexpr int32_t RANDOM_VALUE_INDICATE = -1;
105 #ifdef USB_MANAGER_PASS_THROUGH
106 const std::string SERVICE_NAME = "usb_host_interface_service";
107 #endif // USB_MANAGER_PASS_THROUGH
UsbHostManager(SystemAbility * systemAbility)108 UsbHostManager::UsbHostManager(SystemAbility *systemAbility)
109 {
110     systemAbility_ = systemAbility;
111     usbRightManager_ = std::make_shared<UsbRightManager>();
112 #ifndef USB_MANAGER_PASS_THROUGH
113     usbd_ = OHOS::HDI::Usb::V1_2::IUsbInterface::Get();
114 #endif // USB_MANAGER_PASS_THROUGH
115 }
116 
~UsbHostManager()117 UsbHostManager::~UsbHostManager()
118 {
119     for (auto &pair : devices_) {
120         delete pair.second;
121     }
122     devices_.clear();
123 }
124 
125 #ifdef USB_MANAGER_PASS_THROUGH
InitUsbHostInterface()126 bool UsbHostManager::InitUsbHostInterface()
127 {
128     USB_HILOGI(MODULE_USB_SERVICE, "InitUsbHostInterface in");
129     usbHostInterface_ = HDI::Usb::V2_0::IUsbHostInterface::Get(SERVICE_NAME, true);
130     if (usbHostInterface_ == nullptr) {
131         USB_HILOGE(MODULE_USB_SERVICE, "InitUsbHostInterface get usbHostInterface_ is nullptr");
132         return false;
133     }
134     usbManagerSubscriber_ = new (std::nothrow) UsbManagerSubscriber();
135     if (usbManagerSubscriber_ == nullptr) {
136         USB_HILOGE(MODULE_USB_SERVICE, "usbManagerSubscriber_ is nullptr");
137         return false;
138     }
139     ErrCode ret = usbHostInterface_->BindUsbdHostSubscriber(usbManagerSubscriber_);
140     USB_HILOGI(MODULE_USB_SERVICE, "entry InitUsbHostInterface ret: %{public}d", ret);
141     return SUCCEEDED(ret);
142 }
143 
Stop()144 void UsbHostManager::Stop()
145 {
146     if (usbHostInterface_ == nullptr) {
147         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbHostInterface_ is nullptr");
148         return;
149     }
150     usbHostInterface_->UnbindUsbdHostSubscriber(usbManagerSubscriber_);
151     Memory::MemMgrClient::GetInstance().NotifyProcessStatus(getpid(), 1, 0, USB_SYSTEM_ABILITY_ID);
152 }
153 
BindUsbdSubscriber(const sptr<HDI::Usb::V2_0::IUsbdSubscriber> & subscriber)154 int32_t UsbHostManager::BindUsbdSubscriber(const sptr<HDI::Usb::V2_0::IUsbdSubscriber> &subscriber)
155 {
156     if (usbHostInterface_ == nullptr) {
157         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::BindUsbdSubscriber usbHostInterface_ is nullptr");
158         return UEC_SERVICE_INVALID_VALUE;
159     }
160     return usbHostInterface_->BindUsbdHostSubscriber(subscriber);
161 }
162 
UnbindUsbdSubscriber(const sptr<HDI::Usb::V2_0::IUsbdSubscriber> & subscriber)163 int32_t UsbHostManager::UnbindUsbdSubscriber(const sptr<HDI::Usb::V2_0::IUsbdSubscriber> &subscriber)
164 {
165     if (usbHostInterface_ == nullptr) {
166         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::UnbindUsbdSubscriber usbHostInterface_ is nullptr");
167         return UEC_SERVICE_INVALID_VALUE;
168     }
169     return usbHostInterface_->UnbindUsbdHostSubscriber(subscriber);
170 }
171 #endif // USB_MANAGER_PASS_THROUGH
172 
173 // LCOV_EXCL_START
OnRemoteDied(const wptr<IRemoteObject> & object)174 void UsbHostManager::UsbSubmitTransferDeathRecipient::OnRemoteDied(const wptr<IRemoteObject> &object)
175 {
176     USB_HILOGI(MODULE_USBD, "UsbHostManager UsbSubmitTransferDeathRecipient enter");
177     int32_t ret = service_->UsbCancelTransfer(devInfo_, endpoint_);
178     if (ret == UEC_OK) {
179         USB_HILOGI(MODULE_USBD, "UsbHostManager OnRemoteDied Close.");
180         service_->Close(devInfo_.busNum, devInfo_.devAddr);
181     }
182 }
183 // LCOV_EXCL_STOP
184 
ExecuteStrategy(UsbDevice * devInfo)185 void UsbHostManager::ExecuteStrategy(UsbDevice *devInfo)
186 {
187     USB_HILOGI(MODULE_USB_SERVICE, "UsbHostManager::ExecuteStrategy start");
188     if (!IsEdmEnabled()) {
189         USB_HILOGE(MODULE_USB_SERVICE, "edm is not activate, skip");
190         return;
191     }
192     bool isGlobalDisabled = false;
193     std::vector<UsbDeviceType> disableType{};
194     std::vector<UsbDeviceId> trustUsbDeviceIds{};
195 
196     int32_t ret = GetUsbPolicy(isGlobalDisabled, disableType, trustUsbDeviceIds);
197     if (ret == UEC_SERVICE_EDM_SA_TIME_OUT_FAILED || ret == UEC_SERVICE_PREPARE_EDM_SA_FAILED) {
198         USB_HILOGE(MODULE_USB_SERVICE, "EDM sa time out or prepare failed, ret = %{public}d", ret);
199         return;
200     }
201 
202     if (isGlobalDisabled) {
203         ret = ManageGlobalInterfaceImpl(isGlobalDisabled);
204         if (ret != UEC_OK) {
205             USB_HILOGE(MODULE_USB_SERVICE, "ManageGlobalInterface failed");
206         }
207         return;
208     }
209 
210     if (!disableType.empty()) {
211         ret = ExecuteManageInterfaceType(disableType, true);
212         if (ret != UEC_OK) {
213             USB_HILOGE(MODULE_USB_SERVICE, "ExecuteManageInterfaceType failed");
214         }
215         return;
216     }
217 
218     if (trustUsbDeviceIds.empty()) {
219         USB_HILOGI(MODULE_USB_SERVICE, "trustUsbDeviceIds is empty, no devices disable");
220         return;
221     }
222     ret = ExecuteManageDevicePolicy(trustUsbDeviceIds);
223     if (ret != UEC_OK) {
224         USB_HILOGE(MODULE_USB_SERVICE, "ExecuteManageDevicePolicy failed");
225     }
226     return;
227 }
228 
OpenDevice(uint8_t busNum,uint8_t devAddr)229 int32_t UsbHostManager::OpenDevice(uint8_t busNum, uint8_t devAddr)
230 {
231 #ifdef USB_MANAGER_PASS_THROUGH
232     if (usbHostInterface_ == nullptr) {
233         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::OpenDevice usbHostInterface_ is nullptr");
234         return UEC_SERVICE_INVALID_VALUE;
235     }
236     const HDI::Usb::V2_0::UsbDev dev = {busNum, devAddr};
237     return usbHostInterface_->OpenDevice(dev);
238 #else
239     const UsbDev dev = {busNum, devAddr};
240     if (usbd_ == nullptr) {
241         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
242         return UEC_SERVICE_INVALID_VALUE;
243     }
244     return usbd_->OpenDevice(dev);
245 #endif // USB_MANAGER_PASS_THROUGH
246 }
247 
Close(uint8_t busNum,uint8_t devAddr)248 int32_t UsbHostManager::Close(uint8_t busNum, uint8_t devAddr)
249 {
250 #ifdef USB_MANAGER_PASS_THROUGH
251     if (usbHostInterface_ == nullptr) {
252         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::Close usbHostInterface_ is nullptr");
253         return UEC_SERVICE_INVALID_VALUE;
254     }
255     const HDI::Usb::V2_0::UsbDev dev = {busNum, devAddr};
256     return usbHostInterface_->CloseDevice(dev);
257 #else
258     const UsbDev dev = {busNum, devAddr};
259     if (usbd_ == nullptr) {
260         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
261         return UEC_SERVICE_INVALID_VALUE;
262     }
263     return usbd_->CloseDevice(dev);
264 #endif // USB_MANAGER_PASS_THROUGH
265 }
266 
ResetDevice(uint8_t busNum,uint8_t devAddr)267 int32_t UsbHostManager::ResetDevice(uint8_t busNum, uint8_t devAddr)
268 {
269 #ifdef USB_MANAGER_PASS_THROUGH
270     if (usbHostInterface_ == nullptr) {
271         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::ResetDevice usbHostInterface_ is nullptr");
272         return UEC_SERVICE_INVALID_VALUE;
273     }
274     const HDI::Usb::V2_0::UsbDev dev = {busNum, devAddr};
275     return usbHostInterface_->ResetDevice(dev);
276 #else
277     const UsbDev dev = {busNum, devAddr};
278     if (usbd_ == nullptr) {
279         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
280         return UEC_SERVICE_INVALID_VALUE;
281     }
282     return usbd_->ResetDevice(dev);
283 #endif // USB_MANAGER_PASS_THROUGH
284 }
285 
ClaimInterface(uint8_t busNum,uint8_t devAddr,uint8_t interfaceid,uint8_t force)286 int32_t UsbHostManager::ClaimInterface(uint8_t busNum, uint8_t devAddr, uint8_t interfaceid, uint8_t force)
287 {
288 #ifdef USB_MANAGER_PASS_THROUGH
289     if (usbHostInterface_ == nullptr) {
290         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::ClaimInterface usbHostInterface_ is nullptr");
291         return UEC_SERVICE_INVALID_VALUE;
292     }
293     const HDI::Usb::V2_0::UsbDev dev = {busNum, devAddr};
294     return usbHostInterface_->ClaimInterface(dev, interfaceid, force);
295 #else
296     const UsbDev dev = {busNum, devAddr};
297     if (usbd_ == nullptr) {
298         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
299         return UEC_SERVICE_INVALID_VALUE;
300     }
301     return usbd_->ClaimInterface(dev, interfaceid, force);
302 #endif // USB_MANAGER_PASS_THROUGH
303 }
304 
SetInterface(uint8_t busNum,uint8_t devAddr,uint8_t interfaceid,uint8_t altIndex)305 int32_t UsbHostManager::SetInterface(uint8_t busNum, uint8_t devAddr, uint8_t interfaceid, uint8_t altIndex)
306 {
307 #ifdef USB_MANAGER_PASS_THROUGH
308     if (usbHostInterface_ == nullptr) {
309         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::SetInterface usbHostInterface_ is nullptr");
310         return UEC_SERVICE_INVALID_VALUE;
311     }
312     const HDI::Usb::V2_0::UsbDev dev = {busNum, devAddr};
313     return usbHostInterface_->SetInterface(dev, interfaceid, altIndex);
314 #else
315     const UsbDev dev = {busNum, devAddr};
316     if (usbd_ == nullptr) {
317         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
318         return UEC_SERVICE_INVALID_VALUE;
319     }
320     return usbd_->SetInterface(dev, interfaceid, altIndex);
321 #endif // USB_MANAGER_PASS_THROUGH
322 }
323 
ReleaseInterface(uint8_t busNum,uint8_t devAddr,uint8_t interface)324 int32_t UsbHostManager::ReleaseInterface(uint8_t busNum, uint8_t devAddr, uint8_t interface)
325 {
326 #ifdef USB_MANAGER_PASS_THROUGH
327     if (usbHostInterface_ == nullptr) {
328         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::ReleaseInterface usbHostInterface_ is nullptr");
329         return UEC_SERVICE_INVALID_VALUE;
330     }
331     const HDI::Usb::V2_0::UsbDev dev = {busNum, devAddr};
332     return usbHostInterface_->ReleaseInterface(dev, interface);
333 #else
334     const UsbDev dev = {busNum, devAddr};
335     if (usbd_ == nullptr) {
336         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
337         return UEC_SERVICE_INVALID_VALUE;
338     }
339     return usbd_->ReleaseInterface(dev, interface);
340 #endif // USB_MANAGER_PASS_THROUGH
341 }
342 
SetActiveConfig(uint8_t busNum,uint8_t devAddr,uint8_t configIndex)343 int32_t UsbHostManager::SetActiveConfig(uint8_t busNum, uint8_t devAddr, uint8_t configIndex)
344 {
345 #ifdef USB_MANAGER_PASS_THROUGH
346     if (usbHostInterface_ == nullptr) {
347         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::SetActiveConfig usbHostInterface_ is nullptr");
348         return UEC_SERVICE_INVALID_VALUE;
349     }
350     const HDI::Usb::V2_0::UsbDev dev = {busNum, devAddr};
351     return usbHostInterface_->SetConfig(dev, configIndex);
352 #else
353     const UsbDev dev = {busNum, devAddr};
354     if (usbd_ == nullptr) {
355         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
356         return UEC_SERVICE_INVALID_VALUE;
357     }
358     return usbd_->SetConfig(dev, configIndex);
359 #endif // USB_MANAGER_PASS_THROUGH
360 }
361 
ManageGlobalInterface(bool disable)362 int32_t UsbHostManager::ManageGlobalInterface(bool disable)
363 {
364     return ManageGlobalInterfaceImpl(disable);
365 }
366 
ManageDevice(int32_t vendorId,int32_t productId,bool disable)367 int32_t UsbHostManager::ManageDevice(int32_t vendorId, int32_t productId, bool disable)
368 {
369     return ManageDeviceImpl(vendorId, productId, disable);
370 }
371 
ManageInterfaceType(const std::vector<UsbDeviceType> & disableType,bool disable)372 int32_t UsbHostManager::ManageInterfaceType(const std::vector<UsbDeviceType> &disableType, bool disable)
373 {
374     return ExecuteManageInterfaceType(disableType, disable);
375 }
376 
UsbAttachKernelDriver(uint8_t busNum,uint8_t devAddr,uint8_t interfaceid)377 int32_t UsbHostManager::UsbAttachKernelDriver(uint8_t busNum, uint8_t devAddr, uint8_t interfaceid)
378 {
379 #ifdef USB_MANAGER_PASS_THROUGH
380     if (usbHostInterface_ == nullptr) {
381         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::UsbAttachKernelDriver usbHostInterface_ is nullptr");
382         return UEC_SERVICE_INVALID_VALUE;
383     }
384     const HDI::Usb::V2_0::UsbDev dev = {busNum, devAddr};
385     return usbHostInterface_->ManageInterface(dev, interfaceid, false);
386 #else
387     const UsbDev dev = {busNum, devAddr};
388     if (usbd_ == nullptr) {
389         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
390         return UEC_SERVICE_INVALID_VALUE;
391     }
392 
393     return usbd_->ManageInterface(dev, interfaceid, false);
394 #endif // USB_MANAGER_PASS_THROUGH
395 }
396 
UsbDetachKernelDriver(uint8_t busNum,uint8_t devAddr,uint8_t interfaceid)397 int32_t UsbHostManager::UsbDetachKernelDriver(uint8_t busNum, uint8_t devAddr, uint8_t interfaceid)
398 {
399 #ifdef USB_MANAGER_PASS_THROUGH
400     if (usbHostInterface_ == nullptr) {
401         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::UsbDetachKernelDriver usbHostInterface_ is nullptr");
402         return UEC_SERVICE_INVALID_VALUE;
403     }
404     const HDI::Usb::V2_0::UsbDev dev = {busNum, devAddr};
405     return usbHostInterface_->ManageInterface(dev, interfaceid, true);
406 #else
407     const UsbDev dev = {busNum, devAddr};
408     if (usbd_ == nullptr) {
409         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
410         return UEC_SERVICE_INVALID_VALUE;
411     }
412 
413     return usbd_->ManageInterface(dev, interfaceid, true);
414 #endif // USB_MANAGER_PASS_THROUGH
415 }
416 
ClearHalt(uint8_t busNum,uint8_t devAddr,uint8_t interfaceId,uint8_t endpointId)417 int32_t UsbHostManager::ClearHalt(uint8_t busNum, uint8_t devAddr, uint8_t interfaceId, uint8_t endpointId)
418 {
419 #ifdef USB_MANAGER_PASS_THROUGH
420     if (usbHostInterface_ == nullptr) {
421         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::ClearHalt usbHostInterface_ is nullptr");
422         return UEC_SERVICE_INVALID_VALUE;
423     }
424     const HDI::Usb::V2_0::UsbDev dev = {busNum, devAddr};
425     const HDI::Usb::V2_0::UsbPipe pipe = {interfaceId, endpointId};
426     return usbHostInterface_->ClearHalt(dev, pipe);
427 #else
428     const UsbDev dev = {busNum, devAddr};
429     const UsbPipe pipe = {interfaceId, endpointId};
430     if (usbd_ == nullptr) {
431         USB_HILOGE(MODULE_USB_SERVICE, "ClearHalt: usbd_ is nullptr");
432         return UEC_SERVICE_INVALID_VALUE;
433     }
434     return usbd_->ClearHalt(dev, pipe);
435 #endif // USB_MANAGER_PASS_THROUGH
436 }
437 
438 
GetDevices(std::vector<UsbDevice> & deviceList)439 int32_t UsbHostManager::GetDevices(std::vector<UsbDevice> &deviceList)
440 {
441     USB_HILOGI(MODULE_USB_SERVICE, "list size %{public}zu", devices_.size());
442     for (auto it = devices_.begin(); it != devices_.end(); ++it) {
443         if (!(usbRightManager_->IsSystemAppOrSa())) {
444             it->second->SetmSerial("");
445         }
446         deviceList.push_back(*it->second);
447     }
448     return UEC_OK;
449 }
450 
GetDeviceInfo(uint8_t busNum,uint8_t devAddr,UsbDevice & dev)451 int32_t UsbHostManager::GetDeviceInfo(uint8_t busNum, uint8_t devAddr, UsbDevice &dev)
452 {
453     const UsbDev uDev = {busNum, devAddr};
454     std::vector<uint8_t> descriptor;
455 
456     int32_t res = UEC_OK;
457     int32_t ret = OpenDevice(busNum, devAddr);
458     if (ret != UEC_OK) {
459         USB_HILOGE(MODULE_USB_SERVICE, "GetDeviceInfo OpenDevice failed ret=%{public}d", ret);
460         return ret;
461     }
462 
463     ret = GetDeviceInfoDescriptor(uDev, descriptor, dev);
464     if (ret != UEC_OK) {
465         USB_HILOGE(MODULE_USB_SERVICE, "GetDeviceInfoDescriptor ret=%{public}d", ret);
466         res = Close(busNum, devAddr);
467         if (res != UEC_OK) {
468             USB_HILOGE(MODULE_USB_SERVICE, "GetDeviceInfo CloseDevice failed res=%{public}d", res);
469             return res;
470         }
471         return ret;
472     }
473     res = GetConfigDescriptor(dev, descriptor);
474     if (res != UEC_OK) {
475         USB_HILOGE(MODULE_USB_SERVICE, "GetConfigDescriptor ret=%{public}d", ret);
476     }
477     ret = Close(busNum, devAddr);
478     if (ret != UEC_OK) {
479         USB_HILOGE(MODULE_USB_SERVICE, "GetDeviceInfo CloseDevice failed ret=%{public}d", ret);
480         return ret;
481     }
482     return res;
483 }
484 
GetDeviceInfoDescriptor(const HDI::Usb::V1_0::UsbDev & uDev,std::vector<uint8_t> & descriptor,UsbDevice & dev)485 int32_t UsbHostManager::GetDeviceInfoDescriptor(const HDI::Usb::V1_0::UsbDev &uDev, std::vector<uint8_t> &descriptor,
486     UsbDevice &dev)
487 {
488     int32_t ret = GetRawDescriptor(uDev.busNum, uDev.devAddr, descriptor);
489     if (ret != UEC_OK) {
490         USB_HILOGE(MODULE_USB_SERVICE, "GetRawDescriptor failed ret=%{public}d busNum:%{public}d devAddr:%{public}d",
491             ret, uDev.busNum, uDev.devAddr);
492         return ret;
493     }
494     uint8_t *buffer = descriptor.data();
495     uint32_t length = descriptor.size();
496     if ((!buffer) || (length == 0)) {
497         USB_HILOGE(MODULE_USB_SERVICE, "GetRawDescriptor failed len=%{public}d busNum:%{public}d devAddr:%{public}d",
498             length, uDev.busNum, uDev.devAddr);
499         return UEC_SERVICE_INVALID_VALUE;
500     }
501     dev.SetBusNum(uDev.busNum);
502     dev.SetDevAddr(uDev.devAddr);
503     dev.SetName(std::to_string(uDev.busNum) + "-" + std::to_string(uDev.devAddr));
504 
505     ret = UsbDescriptorParser::ParseDeviceDescriptor(buffer, length, dev);
506     if (ret != UEC_OK) {
507         USB_HILOGE(MODULE_USB_SERVICE, "ParseDeviceDescriptor failed ret=%{public}d", ret);
508         return ret;
509     }
510     return ret;
511 }
512 
GetConfigDescriptor(UsbDevice & dev,std::vector<uint8_t> & descriptor)513 int32_t UsbHostManager::GetConfigDescriptor(UsbDevice &dev, std::vector<uint8_t> &descriptor)
514 {
515     std::vector<USBConfig> configs;
516     int32_t ret = UsbDescriptorParser::ParseConfigDescriptors(descriptor, CURSOR_INIT, configs);
517     if (ret != UEC_OK) {
518         USB_HILOGE(MODULE_USB_SERVICE, "ParseConfigDescriptors failed ret=%{public}d", ret);
519         return ret;
520     }
521     dev.SetConfigs(configs);
522     ret = FillDevStrings(dev);
523     USB_HILOGI(MODULE_USB_SERVICE, "FillDevStrings ret=%{public}d", ret);
524     return ret;
525 }
526 
GetActiveConfig(uint8_t busNum,uint8_t devAddr,uint8_t & configIndex)527 int32_t UsbHostManager::GetActiveConfig(uint8_t busNum, uint8_t devAddr, uint8_t &configIndex)
528 {
529 #ifdef USB_MANAGER_PASS_THROUGH
530     if (usbHostInterface_ == nullptr) {
531         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbHostInterface_ is nullptr");
532         return UEC_SERVICE_INVALID_VALUE;
533     }
534     const HDI::Usb::V2_0::UsbDev dev = {busNum, devAddr};
535     return usbHostInterface_->GetConfig(dev, configIndex);
536 #else
537     const UsbDev dev = {busNum, devAddr};
538     if (usbd_ == nullptr) {
539         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
540         return UEC_SERVICE_INVALID_VALUE;
541     }
542 
543     return usbd_->GetConfig(dev, configIndex);
544 #endif // USB_MANAGER_PASS_THROUGH
545 }
546 
GetRawDescriptor(uint8_t busNum,uint8_t devAddr,std::vector<uint8_t> & bufferData)547 int32_t UsbHostManager::GetRawDescriptor(uint8_t busNum, uint8_t devAddr, std::vector<uint8_t> &bufferData)
548 {
549 #ifdef USB_MANAGER_PASS_THROUGH
550     if (usbHostInterface_ == nullptr) {
551         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::GetRawDescriptor usbHostInterface_ is nullptr");
552         return UEC_SERVICE_INVALID_VALUE;
553     }
554     const HDI::Usb::V2_0::UsbDev dev = {busNum, devAddr};
555     return usbHostInterface_->GetRawDescriptor(dev, bufferData);
556 #else
557     const UsbDev dev = {busNum, devAddr};
558     if (usbd_ == nullptr) {
559         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
560         return UEC_SERVICE_INVALID_VALUE;
561     }
562     return usbd_->GetRawDescriptor(dev, bufferData);
563 #endif // USB_MANAGER_PASS_THROUGH
564 }
565 
GetFileDescriptor(uint8_t busNum,uint8_t devAddr,int32_t & fd)566 int32_t UsbHostManager::GetFileDescriptor(uint8_t busNum, uint8_t devAddr, int32_t &fd)
567 {
568 #ifdef USB_MANAGER_PASS_THROUGH
569     if (usbHostInterface_ == nullptr) {
570         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::GetFileDescriptor usbHostInterface_ is nullptr");
571         return UEC_SERVICE_INVALID_VALUE;
572     }
573     const HDI::Usb::V2_0::UsbDev dev = {busNum, devAddr};
574     return usbHostInterface_->GetDeviceFileDescriptor(dev, fd);
575 #else
576     const UsbDev dev = {busNum, devAddr};
577     if (usbd_ == nullptr) {
578         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
579         return UEC_SERVICE_INVALID_VALUE;
580     }
581     return usbd_->GetDeviceFileDescriptor(dev, fd);
582 #endif // USB_MANAGER_PASS_THROUGH
583 }
584 
GetDeviceSpeed(uint8_t busNum,uint8_t devAddr,uint8_t & speed)585 int32_t UsbHostManager::GetDeviceSpeed(uint8_t busNum, uint8_t devAddr, uint8_t &speed)
586 {
587 #ifdef USB_MANAGER_PASS_THROUGH
588     if (usbHostInterface_ == nullptr) {
589         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::GetDeviceSpeed usbHostInterface_ is nullptr");
590         return UEC_SERVICE_INVALID_VALUE;
591     }
592     const HDI::Usb::V2_0::UsbDev dev = {busNum, devAddr};
593     return usbHostInterface_->GetDeviceSpeed(dev, speed);
594 #else
595     const UsbDev dev = {busNum, devAddr};
596     if (usbd_ == nullptr) {
597         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
598         return UEC_SERVICE_INVALID_VALUE;
599     }
600     return usbd_->GetDeviceSpeed(dev, speed);
601 #endif // USB_MANAGER_PASS_THROUGH
602 }
603 
GetInterfaceActiveStatus(uint8_t busNum,uint8_t devAddr,uint8_t interfaceid,bool & unactivated)604 int32_t UsbHostManager::GetInterfaceActiveStatus(uint8_t busNum, uint8_t devAddr, uint8_t interfaceid,
605     bool &unactivated)
606 {
607 #ifdef USB_MANAGER_PASS_THROUGH
608     const HDI::Usb::V2_0::UsbDev dev = {busNum, devAddr};
609     if (usbHostInterface_ == nullptr) {
610         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::GetInterfaceActiveStatus usbHostInterface_ is nullptr");
611         return UEC_SERVICE_INVALID_VALUE;
612     }
613     return usbHostInterface_->GetInterfaceActiveStatus(dev, interfaceid, unactivated);
614 #else
615     const UsbDev dev = {busNum, devAddr};
616     if (usbd_ == nullptr) {
617         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
618         return UEC_SERVICE_INVALID_VALUE;
619     }
620     return usbd_->GetInterfaceActiveStatus(dev, interfaceid, unactivated);
621 #endif // USB_MANAGER_PASS_THROUGH
622 }
623 
BulkTransferRead(const HDI::Usb::V1_0::UsbDev & dev,const HDI::Usb::V1_0::UsbPipe & pipe,std::vector<uint8_t> & bufferData,int32_t timeOut)624 int32_t UsbHostManager::BulkTransferRead(const HDI::Usb::V1_0::UsbDev &dev, const HDI::Usb::V1_0::UsbPipe &pipe,
625     std::vector<uint8_t> &bufferData, int32_t timeOut)
626 {
627 #ifdef USB_MANAGER_PASS_THROUGH
628     if (usbHostInterface_ == nullptr) {
629         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::BulkTransferRead usbHostInterface_ is nullptr");
630         return UEC_SERVICE_INVALID_VALUE;
631     }
632     const HDI::Usb::V2_0::UsbDev &usbDev_ = reinterpret_cast<const HDI::Usb::V2_0::UsbDev &>(dev);
633     const HDI::Usb::V2_0::UsbPipe &usbPipe_ = reinterpret_cast<const HDI::Usb::V2_0::UsbPipe &>(pipe);
634     return usbHostInterface_->BulkTransferRead(usbDev_, usbPipe_, timeOut, bufferData);
635 #else
636     if (usbd_ == nullptr) {
637         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
638         return UEC_SERVICE_INVALID_VALUE;
639     }
640 
641     return usbd_->BulkTransferRead(dev, pipe, timeOut, bufferData);
642 #endif // USB_MANAGER_PASS_THROUGH
643 }
644 
BulkTransferReadwithLength(const HDI::Usb::V1_0::UsbDev & dev,const HDI::Usb::V1_0::UsbPipe & pipe,int32_t length,std::vector<uint8_t> & bufferData,int32_t timeOut)645 int32_t UsbHostManager::BulkTransferReadwithLength(const HDI::Usb::V1_0::UsbDev &dev,
646     const HDI::Usb::V1_0::UsbPipe &pipe, int32_t length, std::vector<uint8_t> &bufferData, int32_t timeOut)
647 {
648 #ifdef USB_MANAGER_PASS_THROUGH
649     if (usbHostInterface_ == nullptr) {
650         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::BulkTransferReadwithLength usbHostInterface_ is nullptr");
651         return UEC_SERVICE_INVALID_VALUE;
652     }
653     const HDI::Usb::V2_0::UsbDev &usbDev_ = reinterpret_cast<const HDI::Usb::V2_0::UsbDev &>(dev);
654     const HDI::Usb::V2_0::UsbPipe &usbPipe_ = reinterpret_cast<const HDI::Usb::V2_0::UsbPipe &>(pipe);
655     return usbHostInterface_->BulkTransferReadwithLength(usbDev_, usbPipe_, timeOut, length, bufferData);
656 #else
657     if (usbd_ == nullptr) {
658         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
659         return UEC_SERVICE_INVALID_VALUE;
660     }
661     return usbd_->BulkTransferReadwithLength(dev, pipe, timeOut, length, bufferData);
662 #endif // USB_MANAGER_PASS_THROUGH
663 }
664 
BulkTransferWrite(const HDI::Usb::V1_0::UsbDev & dev,const HDI::Usb::V1_0::UsbPipe & pipe,const std::vector<uint8_t> & bufferData,int32_t timeOut)665 int32_t UsbHostManager::BulkTransferWrite(const HDI::Usb::V1_0::UsbDev &dev, const HDI::Usb::V1_0::UsbPipe &pipe,
666     const std::vector<uint8_t> &bufferData, int32_t timeOut)
667 {
668 #ifdef USB_MANAGER_PASS_THROUGH
669     if (usbHostInterface_ == nullptr) {
670         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::BulkTransferWrite usbHostInterface_ is nullptr");
671         return UEC_SERVICE_INVALID_VALUE;
672     }
673     const HDI::Usb::V2_0::UsbDev &usbDev_ = reinterpret_cast<const HDI::Usb::V2_0::UsbDev &>(dev);
674     const HDI::Usb::V2_0::UsbPipe &usbPipe_ = reinterpret_cast<const HDI::Usb::V2_0::UsbPipe &>(pipe);
675     return usbHostInterface_->BulkTransferWrite(usbDev_, usbPipe_, timeOut, bufferData);
676 #else
677     if (usbd_ == nullptr) {
678         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
679         return UEC_SERVICE_INVALID_VALUE;
680     }
681     return usbd_->BulkTransferWrite(dev, pipe, timeOut, bufferData);
682 #endif // USB_MANAGER_PASS_THROUGH
683 }
684 
ControlTransfer(const HDI::Usb::V1_0::UsbDev & dev,const HDI::Usb::V1_0::UsbCtrlTransfer & ctrl,std::vector<uint8_t> & bufferData)685 int32_t UsbHostManager::ControlTransfer(const HDI::Usb::V1_0::UsbDev &dev, const HDI::Usb::V1_0::UsbCtrlTransfer &ctrl,
686     std::vector<uint8_t> &bufferData)
687 {
688 #ifdef USB_MANAGER_PASS_THROUGH
689     if (usbHostInterface_ == nullptr) {
690         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::ControlTransfer usbHostInterface_ is nullptr");
691         return UEC_SERVICE_INVALID_VALUE;
692     }
693     const HDI::Usb::V2_0::UsbDev &usbDev_ = reinterpret_cast<const HDI::Usb::V2_0::UsbDev &>(dev);
694     const HDI::Usb::V2_0::UsbCtrlTransfer &usbCtrl_ = reinterpret_cast<const HDI::Usb::V2_0::UsbCtrlTransfer &>(ctrl);
695     int32_t ret = UEC_SERVICE_INNER_ERR;
696     std::lock_guard<std::mutex> guard(transferMutex_);
697     if (((uint32_t)ctrl.requestType & USB_ENDPOINT_DIR_MASK) == USB_ENDPOINT_DIR_OUT) {
698         ret = usbHostInterface_->ControlTransferWrite(usbDev_, usbCtrl_, bufferData);
699         if (ret != UEC_OK) {
700             USB_HILOGE(MODULE_USB_SERVICE, "ControlTransfer ControlTransferWrite error ret:%{public}d", ret);
701         }
702     } else {
703         bufferData.clear();
704         ret = usbHostInterface_->ControlTransferRead(usbDev_, usbCtrl_, bufferData);
705         if (ret != UEC_OK) {
706             USB_HILOGE(MODULE_USB_SERVICE, "ControlTransfer ControlTransferRead error ret:%{public}d", ret);
707         }
708     }
709     return ret;
710 #else
711     if (usbd_ == nullptr) {
712         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
713         return UEC_SERVICE_INVALID_VALUE;
714     }
715     int32_t ret = UEC_SERVICE_INNER_ERR;
716     std::lock_guard<std::mutex> guard(transferMutex_);
717     if (((uint32_t)ctrl.requestType & USB_ENDPOINT_DIR_MASK) == USB_ENDPOINT_DIR_OUT) {
718         ret = usbd_->ControlTransferWrite(dev, ctrl, bufferData);
719         if (ret != UEC_OK) {
720             USB_HILOGE(MODULE_USB_SERVICE, "ControlTransferWrite error ret:%{public}d", ret);
721         }
722     } else {
723         bufferData.clear();
724         ret = usbd_->ControlTransferRead(dev, ctrl, bufferData);
725         if (ret != UEC_OK) {
726             USB_HILOGE(MODULE_USB_SERVICE, "ControlTransferRead error ret:%{public}d", ret);
727         }
728     }
729     return ret;
730 #endif // USB_MANAGER_PASS_THROUGH
731 }
732 
UsbControlTransfer(const HDI::Usb::V1_0::UsbDev & dev,const HDI::Usb::V1_2::UsbCtrlTransferParams & ctrlParams,std::vector<uint8_t> & bufferData)733 int32_t UsbHostManager::UsbControlTransfer(const HDI::Usb::V1_0::UsbDev &dev,
734     const HDI::Usb::V1_2::UsbCtrlTransferParams &ctrlParams, std::vector<uint8_t> &bufferData)
735 {
736 #ifdef USB_MANAGER_PASS_THROUGH
737     if (usbHostInterface_ == nullptr) {
738         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::UsbControlTransfer usbHostInterface_ is nullptr");
739         return UEC_SERVICE_INVALID_VALUE;
740     }
741     const HDI::Usb::V2_0::UsbDev &usbDev_ = reinterpret_cast<const HDI::Usb::V2_0::UsbDev &>(dev);
742     const HDI::Usb::V2_0::UsbCtrlTransferParams &usbCtrlParams_ =
743         reinterpret_cast<const HDI::Usb::V2_0::UsbCtrlTransferParams &>(ctrlParams);
744     int32_t ret = UEC_SERVICE_INNER_ERR;
745     HDI::Usb::V2_0::UsbCtrlTransfer ctrl = {
746         ctrlParams.requestType, ctrlParams.requestCmd, ctrlParams.value, ctrlParams.index, ctrlParams.timeout};
747 
748     std::lock_guard<std::mutex> guard(transferMutex_);
749     if (((uint32_t)ctrlParams.requestType & USB_ENDPOINT_DIR_MASK) == USB_ENDPOINT_DIR_OUT) {
750         ret = usbHostInterface_->ControlTransferWrite(usbDev_, ctrl, bufferData);
751         if (ret != UEC_OK) {
752             USB_HILOGE(MODULE_USB_SERVICE, "ControlTransferWrite UsbControlTransfer error ret:%{public}d", ret);
753         }
754     } else {
755         bufferData.clear();
756         ret = usbHostInterface_->ControlTransferReadwithLength(usbDev_, usbCtrlParams_, bufferData);
757         if (ret != UEC_OK) {
758             USB_HILOGE(MODULE_USB_SERVICE, "ControlTransferWritewithLength error ret:%{public}d", ret);
759         }
760     }
761     return ret;
762 #else
763     if (usbd_ == nullptr) {
764         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
765         return UEC_SERVICE_INVALID_VALUE;
766     }
767     int32_t ret = UEC_SERVICE_INNER_ERR;
768     UsbCtrlTransfer ctrl = {
769         ctrlParams.requestType, ctrlParams.requestCmd, ctrlParams.value, ctrlParams.index, ctrlParams.timeout};
770 
771     std::lock_guard<std::mutex> guard(transferMutex_);
772     if (((uint32_t)ctrlParams.requestType & USB_ENDPOINT_DIR_MASK) == USB_ENDPOINT_DIR_OUT) {
773         ret = usbd_->ControlTransferWrite(dev, ctrl, bufferData);
774         if (ret != UEC_OK) {
775             USB_HILOGE(MODULE_USB_SERVICE, "ControlTransferWrite error ret:%{public}d", ret);
776         }
777     } else {
778         bufferData.clear();
779         ret = usbd_->ControlTransferReadwithLength(dev, ctrlParams, bufferData);
780         if (ret != UEC_OK) {
781             USB_HILOGE(MODULE_USB_SERVICE, "ControlTransferWritewithLength error ret:%{public}d", ret);
782         }
783     }
784     return ret;
785 #endif // USB_MANAGER_PASS_THROUGH
786 }
787 
RequestQueue(const HDI::Usb::V1_0::UsbDev & dev,const HDI::Usb::V1_0::UsbPipe & pipe,const std::vector<uint8_t> & clientData,const std::vector<uint8_t> & bufferData)788 int32_t UsbHostManager::RequestQueue(const HDI::Usb::V1_0::UsbDev &dev, const HDI::Usb::V1_0::UsbPipe &pipe,
789     const std::vector<uint8_t> &clientData, const std::vector<uint8_t> &bufferData)
790 {
791 #ifdef USB_MANAGER_PASS_THROUGH
792     if (usbHostInterface_ == nullptr) {
793         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::RequestQueue usbHostInterface_ is nullptr");
794         return UEC_SERVICE_INVALID_VALUE;
795     }
796     const HDI::Usb::V2_0::UsbDev &usbDev_ = reinterpret_cast<const HDI::Usb::V2_0::UsbDev &>(dev);
797     const HDI::Usb::V2_0::UsbPipe &usbPipe_ = reinterpret_cast<const HDI::Usb::V2_0::UsbPipe &>(pipe);
798     return usbHostInterface_->RequestQueue(usbDev_, usbPipe_, clientData, bufferData);
799 #else
800     if (usbd_ == nullptr) {
801         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
802         return UEC_SERVICE_INVALID_VALUE;
803     }
804     return usbd_->RequestQueue(dev, pipe, clientData, bufferData);
805 #endif // USB_MANAGER_PASS_THROUGH
806 }
807 
RequestWait(const HDI::Usb::V1_0::UsbDev & dev,int32_t timeOut,std::vector<uint8_t> & clientData,std::vector<uint8_t> & bufferData)808 int32_t UsbHostManager::RequestWait(const HDI::Usb::V1_0::UsbDev &dev, int32_t timeOut,
809     std::vector<uint8_t> &clientData, std::vector<uint8_t> &bufferData)
810 {
811 #ifdef USB_MANAGER_PASS_THROUGH
812     if (usbHostInterface_ == nullptr) {
813         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::RequestWait usbHostInterface_ is nullptr");
814         return UEC_SERVICE_INVALID_VALUE;
815     }
816     const HDI::Usb::V2_0::UsbDev &usbDev_ = reinterpret_cast<const HDI::Usb::V2_0::UsbDev &>(dev);
817     return usbHostInterface_->RequestWait(usbDev_, clientData, bufferData, timeOut);
818 #else
819     if (usbd_ == nullptr) {
820         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
821         return UEC_SERVICE_INVALID_VALUE;
822     }
823     return usbd_->RequestWait(dev, clientData, bufferData, timeOut);
824 #endif // USB_MANAGER_PASS_THROUGH
825 }
826 
RequestCancel(uint8_t busNum,uint8_t devAddr,uint8_t interfaceId,uint8_t endpointId)827 int32_t UsbHostManager::RequestCancel(uint8_t busNum, uint8_t devAddr, uint8_t interfaceId, uint8_t endpointId)
828 {
829 #ifdef USB_MANAGER_PASS_THROUGH
830     if (usbHostInterface_ == nullptr) {
831         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::RequestCancel usbHostInterface_ is nullptr");
832         return UEC_SERVICE_INVALID_VALUE;
833     }
834     const HDI::Usb::V2_0::UsbDev dev = {busNum, devAddr};
835     const HDI::Usb::V2_0::UsbPipe pipe = {interfaceId, endpointId};
836     return usbHostInterface_->RequestCancel(dev, pipe);
837 #else
838     const UsbDev dev = {busNum, devAddr};
839     const UsbPipe pipe = {interfaceId, endpointId};
840     if (usbd_ == nullptr) {
841         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
842         return UEC_SERVICE_INVALID_VALUE;
843     }
844 
845     return usbd_->RequestCancel(dev, pipe);
846 #endif // USB_MANAGER_PASS_THROUGH
847 }
848 
UsbCancelTransfer(const HDI::Usb::V1_0::UsbDev & devInfo,const int32_t & endpoint)849 int32_t UsbHostManager::UsbCancelTransfer(const HDI::Usb::V1_0::UsbDev &devInfo, const int32_t &endpoint)
850 {
851 #ifdef USB_MANAGER_PASS_THROUGH
852     if (usbHostInterface_ == nullptr) {
853         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::UsbCancelTransfer usbHostInterface_ is nullptr");
854         return UEC_SERVICE_INVALID_VALUE;
855     }
856     const HDI::Usb::V2_0::UsbDev &usbDev_ = reinterpret_cast<const HDI::Usb::V2_0::UsbDev &>(devInfo);
857     return usbHostInterface_->UsbCancelTransfer(usbDev_, endpoint);
858 #else
859     if (usbd_ == nullptr) {
860         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
861         return UEC_SERVICE_INVALID_VALUE;
862     }
863     int32_t ret = usbd_->UsbCancelTransfer(devInfo, endpoint);
864     if (ret != UEC_OK) {
865         USB_HILOGE(MODULE_USB_SERVICE, "UsbCancelTransfer error ret:%{public}d", ret);
866         return ret;
867     }
868     return ret;
869 #endif // USB_MANAGER_PASS_THROUGH
870 }
871 
UsbSubmitTransfer(const HDI::Usb::V1_0::UsbDev & devInfo,HDI::Usb::V1_2::USBTransferInfo & info,const sptr<IRemoteObject> & cb,sptr<Ashmem> & ashmem)872 int32_t UsbHostManager::UsbSubmitTransfer(const HDI::Usb::V1_0::UsbDev &devInfo, HDI::Usb::V1_2::USBTransferInfo &info,
873     const sptr<IRemoteObject> &cb, sptr<Ashmem> &ashmem)
874 {
875     int32_t ret = UEC_SERVICE_INVALID_VALUE;
876 #ifdef USB_MANAGER_PASS_THROUGH
877     if (usbHostInterface_ == nullptr) {
878         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::UsbSubmitTransfer usbHostInterface_ is nullptr");
879         return UEC_SERVICE_INVALID_VALUE;
880     }
881     sptr<UsbHostManager::UsbSubmitTransferDeathRecipient> submitRecipient =
882         new UsbSubmitTransferDeathRecipient(devInfo, info.endpoint, this, cb);
883     if (!cb->AddDeathRecipient(submitRecipient)) {
884         USB_HILOGE(MODULE_USB_SERVICE, "add DeathRecipient failed");
885         return UEC_SERVICE_INVALID_VALUE;
886     }
887     sptr<UsbTransferCallbackImpl> callbackImpl = new UsbTransferCallbackImpl(cb);
888     const HDI::Usb::V2_0::UsbDev &usbDev_ = reinterpret_cast<const HDI::Usb::V2_0::UsbDev &>(devInfo);
889     const HDI::Usb::V2_0::USBTransferInfo &usbInfo = reinterpret_cast<const HDI::Usb::V2_0::USBTransferInfo &>(info);
890     ret = usbHostInterface_->UsbSubmitTransfer(usbDev_, usbInfo, callbackImpl, ashmem);
891 #else
892     if (usbd_ == nullptr) {
893         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::UsbSubmitTransfer usbd_ is nullptr");
894         return UEC_SERVICE_INVALID_VALUE;
895     }
896     sptr<UsbHostManager::UsbSubmitTransferDeathRecipient> submitRecipient =
897         new UsbSubmitTransferDeathRecipient(devInfo, info.endpoint, this, cb);
898     if (!cb->AddDeathRecipient(submitRecipient)) {
899         USB_HILOGE(MODULE_USB_SERVICE, "add DeathRecipient failed");
900         return UEC_SERVICE_INVALID_VALUE;
901     }
902     sptr<UsbdTransferCallbackImpl> callbackImpl = new UsbdTransferCallbackImpl(cb);
903     ret = usbd_->UsbSubmitTransfer(devInfo, info, callbackImpl, ashmem);
904 #endif // USB_MANAGER_PASS_THROUGH
905     if (ret != UEC_OK) {
906         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager UsbSubmitTransfer error ret:%{public}d", ret);
907         cb->RemoveDeathRecipient(submitRecipient);
908         submitRecipient.clear();
909         return ret;
910     }
911     return ret;
912 }
913 
RegBulkCallback(const HDI::Usb::V1_0::UsbDev & devInfo,const HDI::Usb::V1_0::UsbPipe & pipe,const sptr<IRemoteObject> & cb)914 int32_t UsbHostManager::RegBulkCallback(const HDI::Usb::V1_0::UsbDev &devInfo, const HDI::Usb::V1_0::UsbPipe &pipe,
915     const sptr<IRemoteObject> &cb)
916 {
917     if (cb == nullptr) {
918         USB_HILOGE(MODULE_USB_SERVICE, "cb is nullptr");
919         return UEC_SERVICE_INVALID_VALUE;
920     }
921     std::lock_guard<std::mutex> guard(hdiCbMutex_);
922 #ifdef USB_MANAGER_PASS_THROUGH
923     if (usbHostHdiCb_ == nullptr) {
924         usbHostHdiCb_ = new UsbBulkCallbackImpl(cb);
925     }
926     if (usbHostInterface_ == nullptr) {
927         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::RegBulkCallback usbHostInterface_ is nullptr");
928         return UEC_SERVICE_INVALID_VALUE;
929     }
930     const HDI::Usb::V2_0::UsbDev &usbDev_ = reinterpret_cast<const HDI::Usb::V2_0::UsbDev &>(devInfo);
931     const HDI::Usb::V2_0::UsbPipe &usbPipe_ = reinterpret_cast<const HDI::Usb::V2_0::UsbPipe &>(pipe);
932     return usbHostInterface_->RegBulkCallback(usbDev_, usbPipe_, usbHostHdiCb_);
933 #else
934     if (hdiCb_ == nullptr) {
935         hdiCb_ = new UsbdBulkCallbackImpl(cb);
936     }
937     if (usbd_ == nullptr) {
938         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
939         return UEC_SERVICE_INVALID_VALUE;
940     }
941 
942     return usbd_->RegBulkCallback(devInfo, pipe, hdiCb_);
943 #endif // USB_MANAGER_PASS_THROUGH
944 }
945 
UnRegBulkCallback(const HDI::Usb::V1_0::UsbDev & devInfo,const HDI::Usb::V1_0::UsbPipe & pipe)946 int32_t UsbHostManager::UnRegBulkCallback(const HDI::Usb::V1_0::UsbDev &devInfo, const HDI::Usb::V1_0::UsbPipe &pipe)
947 {
948 #ifdef USB_MANAGER_PASS_THROUGH
949     if (usbHostInterface_ == nullptr) {
950         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::UnRegBulkCallback usbHostInterface_ is nullptr");
951         return UEC_SERVICE_INVALID_VALUE;
952     }
953     std::lock_guard<std::mutex> guard(hdiCbMutex_);
954     usbHostHdiCb_ = nullptr;
955     const HDI::Usb::V2_0::UsbDev &usbDev_ = reinterpret_cast<const HDI::Usb::V2_0::UsbDev &>(devInfo);
956     const HDI::Usb::V2_0::UsbPipe &usbPipe_ = reinterpret_cast<const HDI::Usb::V2_0::UsbPipe &>(pipe);
957     return usbHostInterface_->UnRegBulkCallback(usbDev_, usbPipe_);
958 #else
959     if (usbd_ == nullptr) {
960         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
961         return UEC_SERVICE_INVALID_VALUE;
962     }
963 
964     std::lock_guard<std::mutex> guard(hdiCbMutex_);
965     hdiCb_ = nullptr;
966     return usbd_->UnRegBulkCallback(devInfo, pipe);
967 #endif // USB_MANAGER_PASS_THROUGH
968 }
969 
BulkRead(const HDI::Usb::V1_0::UsbDev & devInfo,const HDI::Usb::V1_0::UsbPipe & pipe,sptr<Ashmem> & ashmem)970 int32_t UsbHostManager::BulkRead(const HDI::Usb::V1_0::UsbDev &devInfo, const HDI::Usb::V1_0::UsbPipe &pipe,
971     sptr<Ashmem> &ashmem)
972 {
973     if (ashmem == nullptr) {
974         USB_HILOGE(MODULE_USB_SERVICE, "BulkRead error ashmem");
975         return UEC_SERVICE_INVALID_VALUE;
976     }
977 #ifdef USB_MANAGER_PASS_THROUGH
978     if (usbHostInterface_ == nullptr) {
979         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::BulkRead usbHostInterface_ is nullptr");
980         return UEC_SERVICE_INVALID_VALUE;
981     }
982     const HDI::Usb::V2_0::UsbDev &usbDev_ = reinterpret_cast<const HDI::Usb::V2_0::UsbDev &>(devInfo);
983     const HDI::Usb::V2_0::UsbPipe &usbPipe_ = reinterpret_cast<const HDI::Usb::V2_0::UsbPipe &>(pipe);
984     return usbHostInterface_->BulkRead(usbDev_, usbPipe_, ashmem);
985 #else
986     if (usbd_ == nullptr) {
987         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
988         return UEC_SERVICE_INVALID_VALUE;
989     }
990 
991     return usbd_->BulkRead(devInfo, pipe, ashmem);
992 #endif // USB_MANAGER_PASS_THROUGH
993 }
994 
BulkWrite(const HDI::Usb::V1_0::UsbDev & devInfo,const HDI::Usb::V1_0::UsbPipe & pipe,sptr<Ashmem> & ashmem)995 int32_t UsbHostManager::BulkWrite(const HDI::Usb::V1_0::UsbDev &devInfo, const HDI::Usb::V1_0::UsbPipe &pipe,
996     sptr<Ashmem> &ashmem)
997 {
998     if (ashmem == nullptr) {
999         USB_HILOGE(MODULE_USB_SERVICE, "BulkWrite error ashmem");
1000         return UEC_SERVICE_INVALID_VALUE;
1001     }
1002 #ifdef USB_MANAGER_PASS_THROUGH
1003     if (usbHostInterface_ == nullptr) {
1004         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::BulkWrite usbHostInterface_ is nullptr");
1005         return UEC_SERVICE_INVALID_VALUE;
1006     }
1007     const HDI::Usb::V2_0::UsbDev &usbDev_ = reinterpret_cast<const HDI::Usb::V2_0::UsbDev &>(devInfo);
1008     const HDI::Usb::V2_0::UsbPipe &usbPipe_ = reinterpret_cast<const HDI::Usb::V2_0::UsbPipe &>(pipe);
1009     return usbHostInterface_->BulkWrite(usbDev_, usbPipe_, ashmem);
1010 #else
1011     if (usbd_ == nullptr) {
1012         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
1013         return UEC_SERVICE_INVALID_VALUE;
1014     }
1015 
1016     return usbd_->BulkWrite(devInfo, pipe, ashmem);
1017 #endif // USB_MANAGER_PASS_THROUGH
1018 }
1019 
BulkCancel(const HDI::Usb::V1_0::UsbDev & devInfo,const HDI::Usb::V1_0::UsbPipe & pipe)1020 int32_t UsbHostManager::BulkCancel(const HDI::Usb::V1_0::UsbDev &devInfo, const HDI::Usb::V1_0::UsbPipe &pipe)
1021 {
1022 #ifdef USB_MANAGER_PASS_THROUGH
1023     if (usbHostInterface_ == nullptr) {
1024         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::BulkCancel usbHostInterface_ is nullptr");
1025         return UEC_SERVICE_INVALID_VALUE;
1026     }
1027     const HDI::Usb::V2_0::UsbDev &usbDev_ = reinterpret_cast<const HDI::Usb::V2_0::UsbDev &>(devInfo);
1028     const HDI::Usb::V2_0::UsbPipe &usbPipe_ = reinterpret_cast<const HDI::Usb::V2_0::UsbPipe &>(pipe);
1029     return usbHostInterface_->BulkCancel(usbDev_, usbPipe_);
1030 #else
1031     if (usbd_ == nullptr) {
1032         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
1033         return UEC_SERVICE_INVALID_VALUE;
1034     }
1035 
1036     return usbd_->BulkCancel(devInfo, pipe);
1037 #endif // USB_MANAGER_PASS_THROUGH
1038 }
1039 
GetDevices(MAP_STR_DEVICE & devices)1040 void UsbHostManager::GetDevices(MAP_STR_DEVICE &devices)
1041 {
1042     devices = devices_;
1043 }
1044 
GetProductName(const std::string & deviceName,std::string & productName)1045 bool UsbHostManager::GetProductName(const std::string &deviceName, std::string &productName)
1046 {
1047     auto iter = devices_.find(deviceName);
1048     if (iter == devices_.end()) {
1049         return false;
1050     }
1051 
1052     UsbDevice *dev = iter->second;
1053     if (dev == nullptr) {
1054         return false;
1055     }
1056 
1057     productName = dev->GetProductName();
1058     return true;
1059 }
1060 
DelDevice(uint8_t busNum,uint8_t devNum)1061 bool UsbHostManager::DelDevice(uint8_t busNum, uint8_t devNum)
1062 {
1063     std::string name = std::to_string(busNum) + "-" + std::to_string(devNum);
1064     MAP_STR_DEVICE::iterator iter = devices_.find(name);
1065     if (iter == devices_.end()) {
1066         USB_HILOGF(MODULE_SERVICE, "name:%{public}s bus:%{public}hhu dev:%{public}hhu not exist", name.c_str(), busNum,
1067             devNum);
1068         return false;
1069     }
1070     USB_HILOGI(
1071         MODULE_SERVICE, "device:%{public}s bus:%{public}hhu dev:%{public}hhu erase ", name.c_str(), busNum, devNum);
1072     UsbDevice *devOld = iter->second;
1073     if (devOld == nullptr) {
1074         USB_HILOGE(MODULE_SERVICE, "invalid device");
1075         return false;
1076     }
1077 
1078     auto isSuccess = PublishCommonEvent(CommonEventSupport::COMMON_EVENT_USB_DEVICE_DETACHED, *devOld);
1079     if (!isSuccess) {
1080         USB_HILOGW(MODULE_SERVICE, "send device attached broadcast failed");
1081     }
1082 
1083     delete devOld;
1084     devices_.erase(iter);
1085     return true;
1086 }
1087 
AddDevice(UsbDevice * dev)1088 bool UsbHostManager::AddDevice(UsbDevice *dev)
1089 {
1090     if (dev == nullptr) {
1091         USB_HILOGF(MODULE_SERVICE, "device is NULL");
1092         return false;
1093     }
1094 
1095     auto isSuccess = PublishCommonEvent(CommonEventSupport::COMMON_EVENT_USB_DEVICE_ATTACHED, *dev);
1096     if (!isSuccess) {
1097         USB_HILOGW(MODULE_SERVICE, "send device attached broadcast failed");
1098     }
1099 
1100     uint8_t busNum = dev->GetBusNum();
1101     uint8_t devNum = dev->GetDevAddr();
1102     std::string name = std::to_string(busNum) + "-" + std::to_string(devNum);
1103     MAP_STR_DEVICE::iterator iter = devices_.find(name);
1104     if (iter != devices_.end()) {
1105         USB_HILOGF(MODULE_SERVICE, "device:%{public}s bus:%{public}hhu dev:%{public}hhu already exist", name.c_str(),
1106             busNum, devNum);
1107         UsbDevice *devOld = iter->second;
1108         if (devOld != nullptr && devOld != dev) {
1109             delete devOld;
1110         }
1111         devices_.erase(iter);
1112     }
1113     USB_HILOGI(
1114         MODULE_SERVICE, "device:%{public}s bus:%{public}hhu dev:%{public}hhu insert", name.c_str(), busNum, devNum);
1115     devices_.insert(std::pair<std::string, UsbDevice *>(name, dev));
1116 
1117     return true;
1118 }
1119 
PublishCommonEvent(const std::string & event,const UsbDevice & dev)1120 bool UsbHostManager::PublishCommonEvent(const std::string &event, const UsbDevice &dev)
1121 {
1122     Want want;
1123     want.SetAction(event);
1124     CommonEventData data(want);
1125     data.SetData(dev.getJsonString().c_str());
1126     CommonEventPublishInfo publishInfo;
1127     USB_HILOGI(MODULE_SERVICE, "send %{public}s broadcast device:%{public}s", event.c_str(),
1128         dev.getJsonString().c_str());
1129     ReportHostPlugSysEvent(event, dev);
1130     return CommonEventManager::PublishCommonEvent(data, publishInfo);
1131 }
1132 
Dump(int fd,const std::string & args)1133 bool UsbHostManager::Dump(int fd, const std::string &args)
1134 {
1135     if (args.compare("-a") != 0) {
1136         dprintf(fd, "args is not -a\n");
1137         return false;
1138     }
1139 
1140     dprintf(fd, "Usb Host all device list info:\n");
1141     for (const auto &item : devices_) {
1142         dprintf(fd, "usb host list info: %s\n", item.second->getJsonString().c_str());
1143     }
1144     return true;
1145 }
1146 
GetDeviceDescription(int32_t baseClass,std::string & description,uint8_t & usage)1147 int32_t UsbHostManager::GetDeviceDescription(int32_t baseClass, std::string &description, uint8_t &usage)
1148 {
1149     auto iter = deviceUsageMap.find(baseClass);
1150     if (iter != deviceUsageMap.end()) {
1151         description = iter->second.description;
1152         usage = iter->second.usage;
1153     } else {
1154         description = "NA";
1155         usage = 1;
1156     }
1157     return UEC_OK;
1158 }
1159 
1160 
ConcatenateToDescription(const UsbDeviceType & interfaceType,const std::string & str)1161 std::string UsbHostManager::ConcatenateToDescription(const UsbDeviceType &interfaceType, const std::string& str)
1162 {
1163     std::stringstream ss;
1164     ss << std::setw(CLASS_PRINT_LENGTH) << std::setfill('0') << std::hex << interfaceType.baseClass << "_";
1165     ss << std::setw(CLASS_PRINT_LENGTH) << std::setfill('0') << std::hex << interfaceType.subClass << "_";
1166     ss << std::setw(CLASS_PRINT_LENGTH) << std::setfill('0') << std::hex << interfaceType.protocol << ",";
1167     ss << str;
1168     return ss.str();
1169 }
1170 
GetInterfaceUsageDescription(const UsbDeviceType & interfaceType)1171 std::string UsbHostManager::GetInterfaceUsageDescription(const UsbDeviceType &interfaceType)
1172 {
1173     std::string infUsageDes = "NA";
1174     auto infUsageIter = interfaceUsageMap.find(interfaceType);
1175     if (infUsageIter != interfaceUsageMap.end()) {
1176         return infUsageIter->second;
1177     }
1178     return infUsageDes;
1179 }
1180 
GetInterfaceDescription(const UsbDevice & dev,std::string & description,int32_t & baseClass)1181 int32_t UsbHostManager::GetInterfaceDescription(const UsbDevice &dev, std::string &description, int32_t &baseClass)
1182 {
1183     std::set<UsbDeviceType> useInterfaceType;
1184     for (int32_t i = 0; i < dev.GetConfigCount(); i++) {
1185         USBConfig config;
1186         dev.GetConfig(i, config);
1187         for (uint32_t j = 0; j < config.GetInterfaceCount(); j++) {
1188             if (i != 0 || j != 0) {
1189                 description += ";";
1190             }
1191             UsbInterface interface;
1192             config.GetInterface(j, interface);
1193             baseClass = interface.GetClass();
1194             UsbDeviceType interfaceType = {interface.GetClass(),
1195                 interface.GetSubClass(), interface.GetProtocol(), 0};
1196                 useInterfaceType.insert(interfaceType);
1197                 std::string infUsageDes = GetInterfaceUsageDescription(interfaceType);
1198                 description += ConcatenateToDescription(interfaceType, infUsageDes);
1199         }
1200     }
1201     return UEC_OK;
1202 }
1203 
ReportHostPlugSysEvent(const std::string & event,const UsbDevice & dev)1204 void UsbHostManager::ReportHostPlugSysEvent(const std::string &event, const UsbDevice &dev)
1205 {
1206     std::string deviceUsageDes;
1207     uint8_t deviceUsage = 0;
1208     GetDeviceDescription(dev.GetClass(), deviceUsageDes, deviceUsage);
1209     std::string extUsageDes;
1210     int32_t intfBaseClass = 0;
1211     if (deviceUsage & DES_USAGE_IN_INTERFACE) {
1212         GetInterfaceDescription(dev, extUsageDes, intfBaseClass);
1213     }
1214 
1215     if (dev.GetClass() == USAGE_IN_INTERFACE_CLASS) {
1216         GetDeviceDescription(intfBaseClass, deviceUsageDes, deviceUsage);
1217     }
1218     std::string snNum;
1219     if (dev.GetmSerial().length() > LAST_FIVE) {
1220         snNum = dev.GetmSerial().substr(dev.GetmSerial().length() - LAST_FIVE);
1221     }
1222     USB_HILOGI(MODULE_SERVICE, "Host mode Indicates the insertion and removal information");
1223     HiSysEventWrite(HiSysEvent::Domain::USB, "PLUG_IN_OUT_HOST_MODE", HiSysEvent::EventType::BEHAVIOR,
1224         "DEVICE_NAME", dev.GetProductName(), "DEVICE_PROTOCOL", dev.GetProtocol(),
1225         "DEVICE_SUBCLASS", dev.GetSubclass(), "DEVICE_CLASS", dev.GetClass(),
1226         "DEVICE_CLASS_DESCRIPTION", deviceUsageDes, "INTERFACE_CLASS_DESCRIPTION", extUsageDes,
1227         "VENDOR_ID", dev.GetVendorId(), "PRODUCT_ID", dev.GetProductId(),
1228         "VERSION", dev.GetVersion(), "EVENT_NAME", event, "SN_NUM", snNum);
1229 }
1230 
BcdToString(const std::vector<uint8_t> & bcd)1231 static std::string BcdToString(const std::vector<uint8_t> &bcd)
1232 {
1233     std::string tstr;
1234     for (uint32_t i = 0; i < bcd.size(); ++i) {
1235         tstr += std::to_string((bcd[i] & BIT_HIGH_4) >> BIT_SHIFT_4);
1236         tstr += std::to_string((bcd[i] & BIT_LOW_4));
1237     }
1238     return tstr;
1239 }
1240 
FillDevStrings(UsbDevice & dev)1241 int32_t UsbHostManager::FillDevStrings(UsbDevice &dev)
1242 {
1243     uint8_t busNum;
1244     uint8_t devAddr;
1245     uint8_t offsetValue = 8;
1246 
1247     busNum = dev.GetBusNum();
1248     devAddr = dev.GetDevAddr();
1249     uint16_t bcdUsb = dev.GetbcdUSB();
1250     const std::vector<uint8_t> bcdData {(bcdUsb & 0xff), ((bcdUsb >> offsetValue) & 0xff)};
1251     dev.SetVersion(BcdToString(bcdData));
1252     dev.SetManufacturerName(GetDevStringValFromIdx(busNum, devAddr, dev.GetiManufacturer()));
1253     dev.SetProductName(GetDevStringValFromIdx(busNum, devAddr, dev.GetiProduct()));
1254     dev.SetmSerial(GetDevStringValFromIdx(busNum, devAddr, dev.GetiSerialNumber()));
1255     USB_HILOGI(MODULE_USB_SERVICE,
1256         "iSerial:%{public}d Manufactur:%{public}s product:%{public}s "
1257         "version:%{public}s",
1258         dev.GetiSerialNumber(), dev.GetManufacturerName().c_str(), dev.GetProductName().c_str(),
1259         dev.GetVersion().c_str());
1260 
1261     std::vector<USBConfig> configs;
1262     configs = dev.GetConfigs();
1263     for (auto it = configs.begin(); it != configs.end(); ++it) {
1264         it->SetName(GetDevStringValFromIdx(busNum, devAddr, it->GetiConfiguration()));
1265         USB_HILOGI(MODULE_USB_SERVICE, "Config:%{public}d %{public}s", it->GetiConfiguration(), it->GetName().c_str());
1266         std::vector<UsbInterface> interfaces = it->GetInterfaces();
1267         for (auto itIF = interfaces.begin(); itIF != interfaces.end(); ++itIF) {
1268             itIF->SetName(GetDevStringValFromIdx(busNum, devAddr, itIF->GetiInterface()));
1269             USB_HILOGI(MODULE_USB_SERVICE, "interface:%{public}hhu %{public}s", itIF->GetiInterface(),
1270                 itIF->GetName().c_str());
1271         }
1272         it->SetInterfaces(interfaces);
1273     }
1274     dev.SetConfigs(configs);
1275 
1276     return UEC_OK;
1277 }
1278 
GetDevStringValFromIdx(uint8_t busNum,uint8_t devAddr,uint8_t idx)1279 std::string UsbHostManager::GetDevStringValFromIdx(uint8_t busNum, uint8_t devAddr, uint8_t idx)
1280 {
1281     const UsbDev dev = {busNum, devAddr};
1282     std::vector<uint8_t> strV;
1283     std::string strDesc = " ";
1284 
1285     if (idx == 0) {
1286         return strDesc;
1287     }
1288 #ifdef USB_MANAGER_PASS_THROUGH
1289     if (usbHostInterface_ == nullptr) {
1290         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbHostInterface_ is nullptr");
1291         return nullptr;
1292     }
1293     const HDI::Usb::V2_0::UsbDev &usbDev_ = reinterpret_cast<const HDI::Usb::V2_0::UsbDev &>(dev);
1294     int32_t ret = usbHostInterface_->GetStringDescriptor(usbDev_, idx, strV);
1295 #else
1296     if (usbd_ == nullptr) {
1297         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
1298         return nullptr;
1299     }
1300     int32_t ret = usbd_->GetStringDescriptor(dev, idx, strV);
1301 #endif // USB_MANAGER_PASS_THROUGH
1302     if (ret != UEC_OK) {
1303         USB_HILOGE(MODULE_USB_SERVICE, "get string[%{public}hhu] failed ret:%{public}d", idx, ret);
1304         return strDesc;
1305     }
1306     size_t length = strV.size();
1307     if ((length < DESCRIPTOR_VALUE_START_OFFSET) || (strV[1] != DESCRIPTOR_TYPE_STRING)) {
1308         USB_HILOGI(MODULE_USB_SERVICE, "type or length error, len:%{public}zu", length);
1309         return strDesc;
1310     }
1311 
1312     uint16_t *tbuf = new (std::nothrow) uint16_t[length + 1]();
1313     if (tbuf == nullptr) {
1314         USB_HILOGI(MODULE_USB_SERVICE, "new failed");
1315         return strDesc;
1316     }
1317 
1318     for (uint32_t i = 0; i < length - DESCRIPTOR_VALUE_START_OFFSET; ++i) {
1319         tbuf[i] = strV[i + DESCRIPTOR_VALUE_START_OFFSET];
1320     }
1321     size_t bufLen = (length - DESCRIPTOR_VALUE_START_OFFSET) / HALF;
1322     size_t wstrLen = wcslen((wchar_t*)tbuf) <= bufLen ? wcslen((wchar_t*)tbuf) : bufLen;
1323     std::wstring wstr(reinterpret_cast<wchar_t *>(tbuf), wstrLen);
1324     strDesc = std::string(wstr.begin(), wstr.end());
1325     USB_HILOGI(MODULE_USB_SERVICE, "getString idx:%{public}d length:%{public}zu, str: %{public}s",
1326         idx, strDesc.length(), strDesc.c_str());
1327     delete[] tbuf;
1328     return strDesc;
1329 }
1330 
IsEdmEnabled()1331 bool UsbHostManager::IsEdmEnabled()
1332 {
1333     std::string edmParaValue = OHOS::system::GetParameter("persist.edm.edm_enable", "false");
1334     USB_HILOGI(MODULE_USB_SERVICE, "edmParaValue is %{public}s", edmParaValue.c_str());
1335     return edmParaValue == "true";
1336 }
1337 
ExecuteManageDevicePolicy(std::vector<UsbDeviceId> & whiteList)1338 int32_t UsbHostManager::ExecuteManageDevicePolicy(std::vector<UsbDeviceId> &whiteList)
1339 {
1340     int32_t ret = UEC_INTERFACE_NO_MEMORY;
1341     USB_HILOGI(MODULE_USB_SERVICE, "list size %{public}zu", devices_.size());
1342     for (auto it = devices_.begin(); it != devices_.end(); ++it) {
1343         bool inWhiteList = false;
1344         for (auto dev : whiteList) {
1345             if (it->second->GetProductId() == dev.productId && it->second->GetVendorId() == dev.vendorId) {
1346                 inWhiteList = true;
1347                 break;
1348             }
1349         }
1350         if (inWhiteList) {
1351             ret = ManageDeviceImpl(it->second->GetVendorId(), it->second->GetProductId(), false);
1352         } else {
1353             ret = ManageDeviceImpl(it->second->GetVendorId(), it->second->GetProductId(), true);
1354         }
1355         std::this_thread::sleep_for(std::chrono::milliseconds(MANAGE_INTERFACE_INTERVAL));
1356     }
1357     if (ret != UEC_OK) {
1358         USB_HILOGI(MODULE_USB_SERVICE, "ManageDevice failed");
1359         return UEC_SERVICE_EXECUTE_POLICY_FAILED;
1360     }
1361     return UEC_OK;
1362 }
1363 
ExecuteManageInterfaceType(const std::vector<UsbDeviceType> & disableType,bool disable)1364 int32_t UsbHostManager::ExecuteManageInterfaceType(const std::vector<UsbDeviceType> &disableType, bool disable)
1365 {
1366     for (auto it = devices_.begin(); it != devices_.end(); ++it) {
1367         UsbDev dev = {it->second->GetBusNum(), it->second->GetDevAddr()};
1368         int32_t ret = OpenDevice(dev.busNum, dev.devAddr);
1369         if (ret != UEC_OK) {
1370             USB_HILOGW(MODULE_USB_SERVICE, "ExecuteManageInterfaceType open fail ret = %{public}d", ret);
1371         }
1372     }
1373     for (const auto &dev : disableType) {
1374         if (!dev.isDeviceType) {
1375             ExecuteManageDeviceType(disableType, disable, g_typeMap, false);
1376         } else {
1377             ExecuteManageDeviceType(disableType, disable, d_typeMap, true);
1378         }
1379     }
1380     for (auto it = devices_.begin(); it != devices_.end(); ++it) {
1381         UsbDev dev = {it->second->GetBusNum(), it->second->GetDevAddr()};
1382         int32_t ret = Close(dev.busNum, dev.devAddr);
1383         if (ret != UEC_OK) {
1384             USB_HILOGW(MODULE_USB_SERVICE, "ExecuteManageInterfaceType close fail ret = %{public}d", ret);
1385         }
1386     }
1387     return UEC_OK;
1388 }
1389 
GetEdmPolicy(bool & IsGlobalDisabled,std::vector<UsbDeviceType> & disableType,std::vector<UsbDeviceId> & trustUsbDeviceIds)1390 int32_t UsbHostManager::GetEdmPolicy(bool &IsGlobalDisabled, std::vector<UsbDeviceType> &disableType,
1391     std::vector<UsbDeviceId> &trustUsbDeviceIds)
1392 {
1393     sptr<ISystemAbilityManager> sm = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
1394     if (sm == nullptr) {
1395         USB_HILOGE(MODULE_USB_SERVICE, "fail to get SystemAbilityManager");
1396         return UEC_SERVICE_GET_SYSTEM_ABILITY_MANAGER_FAILED;
1397     }
1398     sptr<IRemoteObject> remote = sm->CheckSystemAbility(EDM_SYSTEM_ABILITY_ID);
1399     if (remote == nullptr) {
1400         USB_HILOGE(MODULE_USB_SERVICE, "Get Edm SystemAbility failed.");
1401         return UEC_SERVICE_GET_EDM_SERVICE_FAILED;
1402     }
1403     int32_t ret = GetEdmGlobalPolicy(remote, IsGlobalDisabled);
1404     if (ret != UEC_OK) {
1405         USB_HILOGE(MODULE_USB_SERVICE, "GetEdmGlobalPolicy failed.");
1406         return ret;
1407     }
1408     ret = GetEdmStroageTypePolicy(remote, disableType);
1409     if (ret != UEC_OK) {
1410         USB_HILOGE(MODULE_USB_SERVICE, "GetEdmStroageTypePolicy failed.");
1411         return ret;
1412     }
1413     ret = GetEdmTypePolicy(remote, disableType);
1414     if (ret != UEC_OK) {
1415         USB_HILOGE(MODULE_USB_SERVICE, "GetEdmTypePolicy failed.");
1416         return ret;
1417     }
1418     ret = GetEdmWhiteListPolicy(remote, trustUsbDeviceIds);
1419     if (ret != UEC_OK) {
1420         USB_HILOGE(MODULE_USB_SERVICE, "GetEdmWhiteListPolicy failed.");
1421         return ret;
1422     }
1423     return UEC_OK;
1424 }
1425 
GetUsbPolicy(bool & IsGlobalDisabled,std::vector<UsbDeviceType> & disableType,std::vector<UsbDeviceId> & trustUsbDeviceIds)1426 int32_t UsbHostManager::GetUsbPolicy(bool &IsGlobalDisabled, std::vector<UsbDeviceType> &disableType,
1427     std::vector<UsbDeviceId> &trustUsbDeviceIds)
1428 {
1429     auto startTime = std::chrono::steady_clock::now();
1430     bool isPolicyObtained = false;
1431     while (!isPolicyObtained) {
1432         int32_t ret = GetEdmPolicy(IsGlobalDisabled, disableType, trustUsbDeviceIds);
1433         if (ret == UEC_OK) {
1434             USB_HILOGI(MODULE_USB_SERVICE, "GetUsbPolicy succeed");
1435             break;
1436         } else if (ret == EDM_SA_TIME_OUT_CODE) {
1437             auto currentTime = std::chrono::steady_clock::now();
1438             auto elapsedTime = std::chrono::duration_cast<std::chrono::milliseconds>(currentTime - startTime).count();
1439             if (elapsedTime >= EDM_SA_MAX_TIME_OUT) {
1440                 USB_HILOGE(MODULE_USB_SERVICE, "Time out, exit loop");
1441                 return UEC_SERVICE_EDM_SA_TIME_OUT_FAILED;
1442             }
1443             std::this_thread::sleep_for(std::chrono::milliseconds(MANAGE_INTERFACE_INTERVAL));
1444         } else {
1445             USB_HILOGE(MODULE_USB_SERVICE, "EDM sa failed");
1446             return UEC_SERVICE_PREPARE_EDM_SA_FAILED;
1447         }
1448     }
1449     return UEC_OK;
1450 }
1451 
GetEdmTypePolicy(sptr<IRemoteObject> remote,std::vector<UsbDeviceType> & disableType)1452 int32_t UsbHostManager::GetEdmTypePolicy(sptr<IRemoteObject> remote, std::vector<UsbDeviceType> &disableType)
1453 {
1454     if (remote == nullptr) {
1455         USB_HILOGE(MODULE_USB_SERVICE, "Remote is nullpter.");
1456         return UEC_SERVICE_INVALID_VALUE;
1457     }
1458     MessageParcel data;
1459     MessageParcel reply;
1460     MessageOption option;
1461     data.WriteInterfaceToken(DESCRIPTOR);
1462     data.WriteInt32(WITHOUT_USERID);
1463     data.WriteString("");
1464     data.WriteInt32(WITHOUT_ADMIN);
1465     uint32_t funcCode = (1 << EMD_MASK_CODE) | USB_DEVICE_ACCESS_POLICY;
1466     int32_t sendRet = remote->SendRequest(funcCode, data, reply, option);
1467     int32_t ret = ERR_INVALID_VALUE;
1468     bool isSuccess = reply.ReadInt32(ret) && (ret == ERR_OK);
1469     if (!isSuccess || (sendRet != UEC_OK)) {
1470         USB_HILOGE(MODULE_USB_SERVICE, "GetEdmTypePolicy failed. sendRet =  %{public}d, ret = %{public}d",
1471             sendRet, ret);
1472         return UEC_SERVICE_EDM_SEND_REQUEST_FAILED;
1473     }
1474 
1475     int32_t size = reply.ReadInt32();
1476     if (size > WHITELIST_POLICY_MAX_DEVICES) {
1477         USB_HILOGE(MODULE_USB_SERVICE, "EdmTypeList size=[%{public}d] is too large", size);
1478         return UEC_SERVICE_EDM_DEVICE_SIZE_EXCEED;
1479     }
1480     USB_HILOGI(MODULE_USB_SERVICE, "GetEdmTypePolicy return size:%{public}d", size);
1481     for (int32_t i = 0; i < size; i++) {
1482         UsbDeviceType usbDeviceType;
1483         usbDeviceType.baseClass = reply.ReadInt32();
1484         usbDeviceType.subClass = reply.ReadInt32();
1485         usbDeviceType.protocol = reply.ReadInt32();
1486         usbDeviceType.isDeviceType = reply.ReadBool();
1487         disableType.emplace_back(usbDeviceType);
1488     }
1489     return UEC_OK;
1490 }
1491 
GetEdmGlobalPolicy(sptr<IRemoteObject> remote,bool & IsGlobalDisabled)1492 int32_t UsbHostManager::GetEdmGlobalPolicy(sptr<IRemoteObject> remote, bool &IsGlobalDisabled)
1493 {
1494     if (remote == nullptr) {
1495         USB_HILOGE(MODULE_USB_SERVICE, "Remote is nullpter.");
1496         return UEC_SERVICE_INVALID_VALUE;
1497     }
1498     MessageParcel data;
1499     MessageParcel reply;
1500     MessageOption option;
1501     data.WriteInterfaceToken(DESCRIPTOR);
1502     data.WriteInt32(WITHOUT_USERID);
1503     data.WriteString("");
1504     data.WriteInt32(WITHOUT_ADMIN);
1505     uint32_t funcCode = (1 << EMD_MASK_CODE) | DISABLE_USB;
1506     int32_t sendRet = remote->SendRequest(funcCode, data, reply, option);
1507     int32_t ret = ERR_INVALID_VALUE;
1508     bool isSuccess = reply.ReadInt32(ret) && (ret == UEC_OK);
1509     if (!isSuccess || (sendRet != UEC_OK)) {
1510         USB_HILOGE(MODULE_USB_SERVICE, "GetGlobalPolicy failed. sendRet =  %{public}d, ret = %{public}d",
1511             sendRet, ret);
1512         return UEC_SERVICE_EDM_SEND_REQUEST_FAILED;
1513     }
1514 
1515     reply.ReadBool(IsGlobalDisabled);
1516     return UEC_OK;
1517 }
1518 
GetEdmStroageTypePolicy(sptr<IRemoteObject> remote,std::vector<UsbDeviceType> & disableType)1519 int32_t UsbHostManager::GetEdmStroageTypePolicy(sptr<IRemoteObject> remote, std::vector<UsbDeviceType> &disableType)
1520 {
1521     if (remote == nullptr) {
1522         USB_HILOGE(MODULE_USB_SERVICE, "Remote is nullpter.");
1523         return UEC_SERVICE_INVALID_VALUE;
1524     }
1525     int32_t stroageDisableType = 0;
1526     MessageParcel data;
1527     MessageParcel reply;
1528     MessageOption option;
1529     data.WriteInterfaceToken(DESCRIPTOR);
1530     data.WriteInt32(WITHOUT_USERID);
1531     data.WriteString("");
1532     data.WriteInt32(WITHOUT_ADMIN);
1533     uint32_t funcCode = (1 << EMD_MASK_CODE) | USB_STORAGE_DEVICE_ACCESS_POLICY;
1534     int32_t sendRet = remote->SendRequest(funcCode, data, reply, option);
1535     int32_t ret = ERR_INVALID_VALUE;
1536     bool isSuccess = reply.ReadInt32(ret) && (ret == ERR_OK);
1537     if (!isSuccess || (sendRet != UEC_OK)) {
1538         USB_HILOGE(MODULE_USB_SERVICE, "GetEdmStroageTypePolicy failed. sendRet =  %{public}d, ret = %{public}d",
1539             sendRet, ret);
1540         return UEC_SERVICE_EDM_SEND_REQUEST_FAILED;
1541     }
1542 
1543     reply.ReadInt32(stroageDisableType);
1544     if (stroageDisableType == GET_EDM_STORAGE_DISABLE_TYPE) {
1545         UsbDeviceType usbDeviceType;
1546         usbDeviceType.baseClass = STORAGE_BASE_CLASS;
1547         usbDeviceType.isDeviceType = 0;
1548         disableType.emplace_back(usbDeviceType);
1549     }
1550     return UEC_OK;
1551 }
1552 
GetEdmWhiteListPolicy(sptr<IRemoteObject> remote,std::vector<UsbDeviceId> & trustUsbDeviceIds)1553 int32_t UsbHostManager::GetEdmWhiteListPolicy(sptr<IRemoteObject> remote, std::vector<UsbDeviceId> &trustUsbDeviceIds)
1554 {
1555     if (remote == nullptr) {
1556         USB_HILOGE(MODULE_USB_SERVICE, "Remote is nullpter.");
1557         return UEC_SERVICE_INVALID_VALUE;
1558     }
1559     MessageParcel data;
1560     MessageParcel reply;
1561     MessageOption option;
1562     data.WriteInterfaceToken(DESCRIPTOR);
1563     data.WriteInt32(WITHOUT_USERID);
1564     data.WriteString("");
1565     data.WriteInt32(WITHOUT_ADMIN);
1566     uint32_t funcCode = (1 << EMD_MASK_CODE) | ALLOWED_USB_DEVICES;
1567     int32_t sendRet = remote->SendRequest(funcCode, data, reply, option);
1568     int32_t ret = ERR_INVALID_VALUE;
1569     bool IsSuccess = reply.ReadInt32(ret) && (ret == ERR_OK);
1570     if (!IsSuccess || (sendRet != UEC_OK)) {
1571         USB_HILOGE(MODULE_USB_SERVICE, "GetEdmWhiteListPolicy failed. sendRet =  %{public}d, ret = %{public}d",
1572             sendRet, ret);
1573         return UEC_SERVICE_EDM_SEND_REQUEST_FAILED;
1574     }
1575 
1576     int32_t size = reply.ReadInt32();
1577     if (size > WHITELIST_POLICY_MAX_DEVICES) {
1578         USB_HILOGE(MODULE_USB_SERVICE, "EdmWhiteList size=[%{public}d] is too large", size);
1579         return UEC_SERVICE_EDM_DEVICE_SIZE_EXCEED;
1580     }
1581     USB_HILOGI(MODULE_USB_SERVICE, "GetEdmWhiteListPolicy return size:%{public}d", size);
1582     for (int32_t i = 0; i < size; i++) {
1583         UsbDeviceId usbDeviceId;
1584         usbDeviceId.vendorId = reply.ReadInt32();
1585         usbDeviceId.productId = reply.ReadInt32();
1586         trustUsbDeviceIds.emplace_back(usbDeviceId);
1587     }
1588     return UEC_OK;
1589 }
1590 
ManageInterface(const HDI::Usb::V1_0::UsbDev & dev,uint8_t interfaceId,bool disable)1591 int32_t UsbHostManager::ManageInterface(const HDI::Usb::V1_0::UsbDev &dev, uint8_t interfaceId, bool disable)
1592 {
1593 #ifdef USB_MANAGER_PASS_THROUGH
1594     if (usbHostInterface_ == nullptr) {
1595         USB_HILOGE(MODULE_SERVICE, "UsbHostManager::ManageInterface usbHostInterface_ is nullptr");
1596         return UEC_SERVICE_INVALID_VALUE;
1597     }
1598     const HDI::Usb::V2_0::UsbDev &usbDev_ = reinterpret_cast<const HDI::Usb::V2_0::UsbDev &>(dev);
1599     return usbHostInterface_->ManageInterface(usbDev_, interfaceId, disable);
1600 #else
1601     if (usbd_ == nullptr) {
1602         USB_HILOGE(MODULE_USB_SERVICE, "usbd_ is nullptr");
1603         return UEC_SERVICE_INVALID_VALUE;
1604     }
1605     return usbd_->ManageInterface(dev, interfaceId, disable);
1606 #endif // USB_MANAGER_PASS_THROUGH
1607 }
1608 
ExecuteManageDeviceType(const std::vector<UsbDeviceType> & disableType,bool disable,const std::unordered_map<InterfaceType,std::vector<int32_t>> & map,bool isDev)1609 void UsbHostManager::ExecuteManageDeviceType(const std::vector<UsbDeviceType> &disableType, bool disable,
1610     const std::unordered_map<InterfaceType, std::vector<int32_t>> &map, bool isDev)
1611 {
1612     std::vector<InterfaceType> interfaceTypes;
1613     for (const auto &dev : disableType) {
1614         bool isMatch = false;
1615         for (auto& [interfaceTypeValues, typeValues] : map) {
1616             if ((typeValues[0] == dev.baseClass) &&
1617                 (typeValues[1] == -1 || typeValues[1] == dev.subClass) &&
1618                 (typeValues[HALF] == -1 || typeValues[HALF] == dev.protocol)) {
1619                     isMatch = true;
1620                     interfaceTypes.emplace_back(interfaceTypeValues);
1621                     break;
1622             }
1623         }
1624         if (!isMatch) {
1625             USB_HILOGE(MODULE_USB_SERVICE, "is not in the type list, %{public}d, %{public}d, %{public}d",
1626                 dev.baseClass, dev.subClass, dev.protocol);
1627         }
1628     }
1629 
1630     for (auto& [interfaceTypeValues, typeValues] : map) {
1631         bool canFind = false;
1632         for (auto disallowedValues : interfaceTypes) {
1633             if (interfaceTypeValues == disallowedValues) {
1634                 canFind = true;
1635                 break;
1636             }
1637         }
1638         if ((!isDev) && canFind) {
1639             ManageInterfaceTypeImpl(interfaceTypeValues, disable);
1640         }
1641         if ((!isDev) && (!canFind)) {
1642             ManageInterfaceTypeImpl(interfaceTypeValues, !disable);
1643         }
1644         if (isDev && canFind) {
1645             ManageDeviceTypeImpl(interfaceTypeValues, disable);
1646         }
1647         if (isDev && !canFind) {
1648             ManageDeviceTypeImpl(interfaceTypeValues, !disable);
1649         }
1650     }
1651 }
1652 
ManageGlobalInterfaceImpl(bool disable)1653 int32_t UsbHostManager::ManageGlobalInterfaceImpl(bool disable)
1654 {
1655     USB_HILOGI(MODULE_USB_SERVICE, "list size %{public}zu", devices_.size());
1656     for (auto it = devices_.begin(); it != devices_.end(); ++it) {
1657         UsbDev dev = {it->second->GetBusNum(), it->second->GetDevAddr()};
1658         uint8_t configIndex = 0;
1659         if (OpenDevice(dev.busNum, dev.devAddr) != UEC_OK) {
1660             USB_HILOGW(MODULE_USB_SERVICE, "ManageGlobalInterfaceImpl OpenDevice failed");
1661             continue;
1662         }
1663         if (GetActiveConfig(dev.busNum, dev.devAddr, configIndex) || (configIndex < 1)) {
1664             USB_HILOGW(MODULE_USB_SERVICE, "get device active config failed.");
1665             Close(dev.busNum, dev.devAddr);
1666             continue;
1667         }
1668         USBConfig configs;
1669         if (it->second->GetConfig(static_cast<uint8_t>(configIndex) - 1, configs)) {
1670             USB_HILOGW(MODULE_USB_SERVICE, "get device config info failed.");
1671             Close(dev.busNum, dev.devAddr);
1672             continue;
1673         }
1674 
1675         std::vector<UsbInterface> interfaces = configs.GetInterfaces();
1676         for (uint32_t i = 0; i < interfaces.size(); i++) {
1677             ManageInterface(dev, interfaces[i].GetId(), disable);
1678             std::this_thread::sleep_for(std::chrono::milliseconds(MANAGE_INTERFACE_INTERVAL));
1679         }
1680         if (Close(dev.busNum, dev.devAddr) != UEC_OK) {
1681             USB_HILOGW(MODULE_USB_SERVICE, "ManageGlobalInterfaceImpl CloseDevice fail");
1682         }
1683     }
1684     return UEC_OK;
1685 }
1686 
ManageDeviceImpl(int32_t vendorId,int32_t productId,bool disable)1687 int32_t UsbHostManager::ManageDeviceImpl(int32_t vendorId, int32_t productId, bool disable)
1688 {
1689     USB_HILOGI(MODULE_USB_SERVICE, "list size %{public}zu, vId: %{public}d, pId: %{public}d, b: %{public}d",
1690         devices_.size(), vendorId, productId, disable);
1691     for (auto it = devices_.begin(); it != devices_.end(); ++it) {
1692         if ((it->second->GetVendorId() == vendorId) && (it->second->GetProductId() == productId)) {
1693             UsbDev dev = {it->second->GetBusNum(), it->second->GetDevAddr()};
1694             uint8_t configIndex = 0;
1695             if (OpenDevice(dev.busNum, dev.devAddr) != UEC_OK) {
1696                 USB_HILOGW(MODULE_USB_SERVICE, "ManageDeviceImpl open fail");
1697                 continue;
1698             }
1699             if (GetActiveConfig(dev.busNum, dev.devAddr, configIndex) || (configIndex < 1)) {
1700                 USB_HILOGW(MODULE_USB_SERVICE, "get device active config failed.");
1701                 Close(dev.busNum, dev.devAddr);
1702                 continue;
1703             }
1704             USBConfig configs;
1705             if (it->second->GetConfig(static_cast<uint8_t>(configIndex) - 1, configs)) {
1706                 USB_HILOGW(MODULE_USB_SERVICE, "get device config info failed.");
1707                 Close(dev.busNum, dev.devAddr);
1708                 continue;
1709             }
1710             std::vector<UsbInterface> interfaces = configs.GetInterfaces();
1711             for (uint32_t i = 0; i < interfaces.size(); i++) {
1712                 ManageInterface(dev, interfaces[i].GetId(), disable);
1713                 std::this_thread::sleep_for(std::chrono::milliseconds(MANAGE_INTERFACE_INTERVAL));
1714             }
1715             if (Close(dev.busNum, dev.devAddr) != UEC_OK) {
1716                 USB_HILOGW(MODULE_USB_SERVICE, "ManageDeviceImpl Close fail");
1717             }
1718         }
1719     }
1720     return UEC_OK;
1721 }
1722 
ManageInterfaceTypeImpl(InterfaceType interfaceType,bool disable)1723 int32_t UsbHostManager::ManageInterfaceTypeImpl(InterfaceType interfaceType, bool disable)
1724 {
1725     auto iterInterface = g_typeMap.find(interfaceType);
1726     if (iterInterface == g_typeMap.end()) {
1727         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::not find interface type");
1728         return UEC_SERVICE_INVALID_VALUE;
1729     }
1730     for (auto it = devices_.begin(); it != devices_.end(); ++it) {
1731         UsbDev dev = {it->second->GetBusNum(), it->second->GetDevAddr()};
1732         uint8_t configIndex = 0;
1733         if (GetActiveConfig(dev.busNum, dev.devAddr, configIndex) || (configIndex < 1)) {
1734             USB_HILOGW(MODULE_USB_SERVICE, "get device active config failed.");
1735             continue;
1736         }
1737         USBConfig configs;
1738         if (it->second->GetConfig(static_cast<uint8_t>(configIndex) - 1, configs)) {
1739             USB_HILOGW(MODULE_USB_SERVICE, "get device config info failed.");
1740             continue;
1741         }
1742         std::vector<UsbInterface> interfaces = configs.GetInterfaces();
1743 
1744         for (uint32_t i = 0; i < interfaces.size(); i++) {
1745             // 0 indicate base class, 1 indicate subclass, 2 indicate protocal. -1 indicate any value.
1746             if ((interfaces[i].GetClass() == iterInterface->second[BASECLASS_INDEX]) && (interfaces[i].GetSubClass() ==
1747                 iterInterface->second[SUBCLASS_INDEX] || iterInterface->second[SUBCLASS_INDEX] ==
1748                 RANDOM_VALUE_INDICATE) && (interfaces[i].GetProtocol() == iterInterface->second[PROTOCAL_INDEX] ||
1749                 iterInterface->second[PROTOCAL_INDEX] == RANDOM_VALUE_INDICATE)) {
1750                     ManageInterface(dev, interfaces[i].GetId(), disable);
1751                     USB_HILOGI(MODULE_USB_SERVICE, "size %{public}zu, interfaceType: %{public}d, disable: %{public}d",
1752                         devices_.size(), static_cast<int32_t>(interfaceType), disable);
1753                     std::this_thread::sleep_for(std::chrono::milliseconds(MANAGE_INTERFACE_INTERVAL));
1754             }
1755         }
1756     }
1757     return UEC_OK;
1758 }
1759 
ManageDeviceTypeImpl(InterfaceType interfaceType,bool disable)1760 int32_t UsbHostManager::ManageDeviceTypeImpl(InterfaceType interfaceType, bool disable)
1761 {
1762     auto iterInterface = g_typeMap.find(interfaceType);
1763     if (iterInterface == g_typeMap.end()) {
1764         USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::not find interface type");
1765         return UEC_SERVICE_INVALID_VALUE;
1766     }
1767     for (auto it = devices_.begin(); it != devices_.end(); ++it) {
1768         if ((it->second->GetClass() == iterInterface->second[BASECLASS_INDEX]) && (it->second->GetSubclass() ==
1769             iterInterface->second[SUBCLASS_INDEX] || iterInterface->second[SUBCLASS_INDEX] ==
1770             RANDOM_VALUE_INDICATE) && (it->second->GetProtocol() == iterInterface->second[PROTOCAL_INDEX] ||
1771             iterInterface->second[PROTOCAL_INDEX] == RANDOM_VALUE_INDICATE)) {
1772                 ManageDeviceImpl(it->second->GetVendorId(), it->second->GetProductId(), disable);
1773                 USB_HILOGI(MODULE_USB_SERVICE, "list size %{public}zu, interfaceType: %{public}d, disable: %{public}d",
1774                     devices_.size(), static_cast<int32_t>(interfaceType), disable);
1775                 std::this_thread::sleep_for(std::chrono::milliseconds(MANAGE_INTERFACE_INTERVAL));
1776         }
1777     }
1778     return UEC_OK;
1779 }
1780 } // namespace USB
1781 } // namespace OHOS