• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 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 #include <cstdio>
18 #include <iostream>
19 #include <ipc_skeleton.h>
20 #include <sstream>
21 #include <string>
22 #include <unistd.h>
23 #include "bundle_mgr_interface.h"
24 #include "bundle_mgr_proxy.h"
25 #include "file_ex.h"
26 #include "if_system_ability_manager.h"
27 #include "iservice_registry.h"
28 #include "iusb_srv.h"
29 #include "securec.h"
30 #include "system_ability_definition.h"
31 #include "usb_common.h"
32 #include "usb_descriptor_parser.h"
33 #include "usb_errors.h"
34 #include "usb_port_manager.h"
35 #include "usb_right_manager.h"
36 
37 namespace OHOS {
38 namespace USB {
39 namespace {
40 const std::string USB_SERVICE_NAME = "UsbService";
41 constexpr int32_t COMMEVENT_REGISTER_RETRY_TIMES = 10;
42 constexpr int32_t COMMEVENT_REGISTER_WAIT_DELAY_US = 20000;
43 const uint32_t CURSOR_INIT = 18;
44 const int32_t DESCRIPTOR_TYPE_STRING = 3;
45 const int32_t DESCRIPTOR_VALUE_START_OFFSET = 2;
46 const int32_t HALF = 2;
47 const int32_t BIT_SHIFT_4 = 4;
48 const int32_t BIT_HIGH_4 = 0xF0;
49 const int32_t BIT_LOW_4 = 0x0F;
50 const int32_t SERVICE_STARTUP_MAX_TIME = 30;
51 } // namespace
52 
53 auto pms = DelayedSpSingleton<UsbService>::GetInstance();
54 const bool G_REGISTER_RESULT =
55     SystemAbility::MakeAndRegisterAbility(DelayedSpSingleton<UsbService>::GetInstance().GetRefPtr());
56 
UsbService()57 UsbService::UsbService() : SystemAbility(USB_SYSTEM_ABILITY_ID, true)
58 {
59     usbHostManger_ = std::make_shared<UsbHostManager>(nullptr);
60     usbRightManager_ = std::make_shared<UsbRightManager>();
61     usbPortManager_ = std::make_shared<UsbPortManager>();
62 }
~UsbService()63 UsbService::~UsbService() {}
64 
OnStart()65 void UsbService::OnStart()
66 {
67     USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d usb_service OnStart enter", __func__, __LINE__);
68     if (ready_) {
69         USB_HILOGE(MODULE_USB_SERVICE, "OnStart is ready, nothing to do");
70         return;
71     }
72 
73     if (!(Init())) {
74         USB_HILOGE(MODULE_USB_SERVICE, "OnStart call init fail");
75         return;
76     }
77 
78     // wait for the usbd service to start and bind usb service and usbd service
79     int32_t retryTimes = 0;
80     while (retryTimes < SERVICE_STARTUP_MAX_TIME) {
81         if (InitUsbd() != 0) {
82             break;
83         }
84         sleep(1);
85         retryTimes++;
86 
87         if (retryTimes == SERVICE_STARTUP_MAX_TIME) {
88             USB_HILOGE(MODULE_USB_SERVICE, "OnStart call initUsbd fail");
89             return;
90         }
91     }
92 
93     usbPortManager_->Init();
94     ready_ = true;
95     USB_HILOGE(MODULE_USB_SERVICE, "OnStart and add system ability success");
96 }
97 
Init()98 bool UsbService::Init()
99 {
100     USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d usb_service Init enter", __func__, __LINE__);
101     if (!eventRunner_) {
102         eventRunner_ = AppExecFwk::EventRunner::Create(USB_SERVICE_NAME);
103         if (eventRunner_ == nullptr) {
104             USB_HILOGE(MODULE_USB_SERVICE, "Init failed due to create EventRunner");
105             return false;
106         }
107     }
108     if (!handler_) {
109         handler_ = std::make_shared<UsbServerEventHandler>(eventRunner_, pms);
110         if (handler_ == nullptr) {
111             USB_HILOGE(MODULE_USB_SERVICE, "Init failed due to create handler error");
112             return false;
113         }
114         if (!Publish(pms)) {
115             USB_HILOGE(MODULE_USB_SERVICE, "OnStart register to system ability manager failed.");
116             return false;
117         }
118     }
119     while (commEventRetryTimes_ <= COMMEVENT_REGISTER_RETRY_TIMES) {
120         if (!IsCommonEventServiceAbilityExist()) {
121             ++commEventRetryTimes_;
122             usleep(COMMEVENT_REGISTER_WAIT_DELAY_US);
123         } else {
124             commEventRetryTimes_ = 0;
125             break;
126         }
127     }
128     USB_HILOGE(MODULE_USB_SERVICE, "Init success");
129     return true;
130 }
131 
InitUsbd()132 bool UsbService::InitUsbd()
133 {
134     usbdSubscriber_ = new UsbServiceSubscriber();
135     ErrCode ret = UsbdClient::GetInstance().BindUsbdSubscriber(usbdSubscriber_);
136     USB_HILOGE(MODULE_USB_SERVICE, " entry InitUsbd ret: %{public}d", ret);
137     return SUCCEEDED(ret);
138 }
139 
OnStop()140 void UsbService::OnStop()
141 {
142     USB_HILOGE(MODULE_USB_SERVICE, " entry stop service %{public}d", ready_);
143     if (!ready_) {
144         return;
145     }
146     eventRunner_.reset();
147     handler_.reset();
148     ready_ = false;
149     UsbdClient::GetInstance().UnbindUsbdSubscriber(usbdSubscriber_);
150 }
151 
IsCommonEventServiceAbilityExist()152 bool UsbService::IsCommonEventServiceAbilityExist()
153 {
154     sptr<ISystemAbilityManager> sm = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
155     if (!sm) {
156         USB_HILOGE(MODULE_USB_SERVICE,
157                    "IsCommonEventServiceAbilityExist Get ISystemAbilityManager "
158                    "failed, no SystemAbilityManager");
159         return false;
160     }
161     sptr<IRemoteObject> remote = sm->CheckSystemAbility(COMMON_EVENT_SERVICE_ABILITY_ID);
162     if (!remote) {
163         USB_HILOGE(MODULE_USB_SERVICE, "No CesServiceAbility");
164         return false;
165     }
166     return true;
167 }
OpenDevice(uint8_t busNum,uint8_t devAddr)168 int32_t UsbService::OpenDevice(uint8_t busNum, uint8_t devAddr)
169 {
170     std::string name = std::to_string(busNum) + "-" + std::to_string(devAddr);
171     int32_t ret = UsbService::HasRight(name);
172     if (UEC_OK == ret) {
173         const UsbDev dev = {busNum, devAddr};
174         ret = UsbdClient::GetInstance().OpenDevice(dev);
175         if (UEC_OK != ret) {
176             USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d OpenDevice failed ret:%{public}d", __func__, __LINE__,
177                        ret);
178         }
179     } else {
180         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d No permission ret:%{public}d", __func__, __LINE__, ret);
181         ret = UEC_SERVICE_PERMISSION_DENIED;
182     }
183     return ret;
184 }
HasRight(std::string deviceName)185 int32_t UsbService::HasRight(std::string deviceName)
186 {
187     USB_HILOGI(MODULE_USB_SERVICE, "calling usbRightManager HasRight");
188     std::string bundleName;
189     if (GetBundleName(bundleName)) {
190         USB_HILOGI(MODULE_USB_SERVICE, "HasRight bundleName = %{public}s", bundleName.c_str());
191         return usbRightManager_->HasRight(deviceName, bundleName);
192     }
193     USB_HILOGE(MODULE_USB_SERVICE, "HasRight GetBundleName false");
194     return UEC_SERVICE_INNER_ERR;
195 }
196 
RequestRight(std::string deviceName)197 int32_t UsbService::RequestRight(std::string deviceName)
198 {
199     USB_HILOGI(MODULE_USB_SERVICE, "calling usbRightManager RequestRight");
200     std::string bundleName;
201     if (GetBundleName(bundleName)) {
202         USB_HILOGI(MODULE_USB_SERVICE, "RequestRight bundleName = %{public}s", bundleName.c_str());
203         return usbRightManager_->RequestRight(deviceName, bundleName);
204     }
205     USB_HILOGI(MODULE_USB_SERVICE, "RequestRight GetBundleName false");
206     return UEC_SERVICE_INNER_ERR;
207 }
208 
RemoveRight(std::string deviceName)209 int32_t UsbService::RemoveRight(std::string deviceName)
210 {
211     if (usbRightManager_->RemoveDeviceRight(deviceName)) {
212         return UEC_OK;
213     }
214     return UEC_SERVICE_INNER_ERR;
215 }
216 
GetDevices(std::vector<UsbDevice> & deviceList)217 int32_t UsbService::GetDevices(std::vector<UsbDevice> &deviceList)
218 {
219     std::map<std::string, UsbDevice *> devices;
220     usbHostManger_->GetDevices(devices);
221     USB_HILOGI(MODULE_USB_SERVICE, "%{public}s list size %{public}d", __func__, devices.size());
222     for (auto it = devices.begin(); it != devices.end(); ++it) {
223         deviceList.push_back(*it->second);
224     }
225     return UEC_OK;
226 }
227 
GetCurrentFunctions(int32_t & funcs)228 int32_t UsbService::GetCurrentFunctions(int32_t &funcs)
229 {
230     return UsbdClient::GetInstance().GetCurrentFunctions(funcs);
231 }
232 
SetCurrentFunctions(int32_t funcs)233 int32_t UsbService::SetCurrentFunctions(int32_t funcs)
234 {
235     USB_HILOGI(MODULE_USB_SERVICE, "func = %{public}d", funcs);
236     return UsbdClient::GetInstance().SetCurrentFunctions(funcs);
237 }
238 
UsbFunctionsFromString(std::string funcs)239 int32_t UsbService::UsbFunctionsFromString(std::string funcs)
240 {
241     USB_HILOGI(MODULE_USB_SERVICE, "calling UsbFunctionsFromString");
242     return UsbFunctionManager::FromStringFunctions(funcs);
243 }
244 
UsbFunctionsToString(int32_t funcs)245 std::string UsbService::UsbFunctionsToString(int32_t funcs)
246 {
247     USB_HILOGI(MODULE_USB_SERVICE, "calling UsbFunctionsToString");
248     return UsbFunctionManager::ToStringFunctions(funcs);
249 }
250 
GetPorts(std::vector<UsbPort> & ports)251 int32_t UsbService::GetPorts(std::vector<UsbPort> &ports)
252 {
253     USB_HILOGI(MODULE_USB_SERVICE, "calling usbPortManager getPorts");
254     return usbPortManager_->GetPorts(ports);
255 }
256 
GetSupportedModes(int32_t portId,int32_t & supportedModes)257 int32_t UsbService::GetSupportedModes(int32_t portId, int32_t &supportedModes)
258 {
259     USB_HILOGI(MODULE_USB_SERVICE, "calling usbPortManager getSupportedModes");
260     return usbPortManager_->GetSupportedModes(portId, supportedModes);
261 }
262 
SetPortRole(int32_t portId,int32_t powerRole,int32_t dataRole)263 int32_t UsbService::SetPortRole(int32_t portId, int32_t powerRole, int32_t dataRole)
264 {
265     USB_HILOGI(MODULE_USB_SERVICE, "calling usbd getPorts");
266     return UsbdClient::GetInstance().SetPortRole(portId, powerRole, dataRole);
267 }
268 
ClaimInterface(uint8_t busNum,uint8_t devAddr,uint8_t interface,uint8_t force)269 int32_t UsbService::ClaimInterface(uint8_t busNum, uint8_t devAddr, uint8_t interface, uint8_t force)
270 {
271     const UsbDev dev = {busNum, devAddr};
272     return UsbdClient::GetInstance().ClaimInterface(dev, interface, force);
273 }
ReleaseInterface(uint8_t busNum,uint8_t devAddr,uint8_t interface)274 int32_t UsbService::ReleaseInterface(uint8_t busNum, uint8_t devAddr, uint8_t interface)
275 {
276     const UsbDev dev = {busNum, devAddr};
277     return UsbdClient::GetInstance().ReleaseInterface(dev, interface);
278 }
BulkTransferRead(const UsbDev & devInfo,const UsbPipe & pipe,std::vector<uint8_t> & bufferData,int32_t timeOut)279 int32_t UsbService::BulkTransferRead(const UsbDev &devInfo, const UsbPipe &pipe, std::vector<uint8_t> &bufferData,
280     int32_t timeOut)
281 {
282     int32_t ret = UsbdClient::GetInstance().BulkTransferRead(devInfo, pipe, timeOut, bufferData);
283     if (UEC_OK != ret) {
284         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d BulkTransferRead error ret:%{public}d", __func__,
285                    __LINE__, ret);
286     }
287     return ret;
288 }
BulkTransferWrite(const UsbDev & dev,const UsbPipe & pipe,const std::vector<uint8_t> & bufferData,int32_t timeOut)289 int32_t UsbService::BulkTransferWrite(const UsbDev &dev, const UsbPipe &pipe, const std::vector<uint8_t> &bufferData,
290     int32_t timeOut)
291 {
292     int32_t ret = UsbdClient::GetInstance().BulkTransferWrite(dev, pipe, timeOut, bufferData);
293     if (UEC_OK != ret) {
294         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d BulkTransferWrite error ret:%{public}d", __func__,
295                    __LINE__, ret);
296     }
297     return ret;
298 }
ControlTransfer(const UsbDev & dev,const UsbCtrlTransfer & ctrl,std::vector<uint8_t> & bufferData)299 int32_t UsbService::ControlTransfer(const UsbDev &dev, const UsbCtrlTransfer &ctrl, std::vector<uint8_t> &bufferData)
300 {
301     int32_t ret = UsbdClient::GetInstance().ControlTransfer(dev, ctrl, bufferData);
302     if (UEC_OK != ret) {
303         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d error ret:%{public}d", __func__, __LINE__, ret);
304     }
305     return ret;
306 }
SetActiveConfig(uint8_t busNum,uint8_t devAddr,uint8_t configIndex)307 int32_t UsbService::SetActiveConfig(uint8_t busNum, uint8_t devAddr, uint8_t configIndex)
308 {
309     const UsbDev dev = {busNum, devAddr};
310     return UsbdClient::GetInstance().SetConfig(dev, configIndex);
311 }
GetActiveConfig(uint8_t busNum,uint8_t devAddr,uint8_t & configIndex)312 int32_t UsbService::GetActiveConfig(uint8_t busNum, uint8_t devAddr, uint8_t &configIndex)
313 {
314     const UsbDev dev = {busNum, devAddr};
315     return UsbdClient::GetInstance().GetConfig(dev, configIndex);
316 }
SetInterface(uint8_t busNum,uint8_t devAddr,uint8_t interfaceid,uint8_t altIndex)317 int32_t UsbService::SetInterface(uint8_t busNum, uint8_t devAddr, uint8_t interfaceid, uint8_t altIndex)
318 {
319     const UsbDev dev = {busNum, devAddr};
320     return UsbdClient::GetInstance().SetInterface(dev, interfaceid, altIndex);
321 }
GetRawDescriptor(uint8_t busNum,uint8_t devAddr,std::vector<uint8_t> & bufferData)322 int32_t UsbService::GetRawDescriptor(uint8_t busNum, uint8_t devAddr, std::vector<uint8_t> &bufferData)
323 {
324     const UsbDev dev = {busNum, devAddr};
325     int32_t ret = UsbdClient::GetInstance().GetRawDescriptor(dev, bufferData);
326     if (UEC_OK != ret) {
327         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d error ret:%{public}d", __func__, __LINE__, ret);
328     }
329     return ret;
330 }
GetFileDescriptor(uint8_t busNum,uint8_t devAddr,int32_t & fd)331 int32_t UsbService::GetFileDescriptor(uint8_t busNum, uint8_t devAddr, int32_t &fd)
332 {
333     const UsbDev dev = {busNum, devAddr};
334     int32_t ret = UsbdClient::GetInstance().GetFileDescriptor(dev, fd);
335     if (UEC_OK != ret) {
336         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d error ret:%{public}d", __func__, __LINE__, ret);
337     }
338     return ret;
339 }
340 
RequestQueue(const UsbDev & dev,const UsbPipe & pipe,const std::vector<uint8_t> & clientData,const std::vector<uint8_t> & bufferData)341 int32_t UsbService::RequestQueue(const UsbDev &dev, const UsbPipe &pipe, const std::vector<uint8_t> &clientData,
342     const std::vector<uint8_t> &bufferData)
343 {
344     int32_t ret = UsbdClient::GetInstance().RequestQueue(dev, pipe, clientData, bufferData);
345     if (UEC_OK != ret) {
346         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d error ret:%{public}d", __func__, __LINE__, ret);
347     }
348     return ret;
349 }
RequestWait(const UsbDev & dev,int32_t timeOut,std::vector<uint8_t> & clientData,std::vector<uint8_t> & bufferData)350 int32_t UsbService::RequestWait(const UsbDev &dev, int32_t timeOut, std::vector<uint8_t> &clientData,
351     std::vector<uint8_t> &bufferData)
352 {
353     int32_t ret = UsbdClient::GetInstance().RequestWait(dev, clientData, bufferData, timeOut);
354     if (UEC_OK != ret) {
355         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d error ret:%{public}d", __func__, __LINE__, ret);
356     }
357     return ret;
358 }
359 
RequestCancel(uint8_t busNum,uint8_t devAddr,uint8_t interfaceId,uint8_t endpointId)360 int32_t UsbService::RequestCancel(uint8_t busNum, uint8_t devAddr, uint8_t interfaceId, uint8_t endpointId)
361 {
362     const UsbDev dev = {busNum, devAddr};
363     const UsbPipe pipe = {interfaceId, endpointId};
364     return UsbdClient::GetInstance().RequestCancel(dev, pipe);
365 }
366 
Close(uint8_t busNum,uint8_t devAddr)367 int32_t UsbService::Close(uint8_t busNum, uint8_t devAddr)
368 {
369     const UsbDev dev = {busNum, devAddr};
370     return UsbdClient::GetInstance().CloseDevice(dev);
371 }
372 
GetDevStringValFromIdx(uint8_t busNum,uint8_t devAddr,uint8_t idx)373 static std::string GetDevStringValFromIdx(uint8_t busNum, uint8_t devAddr, uint8_t idx)
374 {
375     const UsbDev dev = {busNum, devAddr};
376     std::vector<uint8_t> strV;
377     std::string string = " ";
378 
379     if (idx == 0) {
380         return string;
381     }
382 
383     int32_t ret = UsbdClient::GetInstance().GetStringDescriptor(dev, idx, strV);
384     if (ret != UEC_OK) {
385         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d get string[%{public}d] failed ret:%{public}d", __func__,
386                    __LINE__, idx, ret);
387         return string;
388     }
389     uint32_t length = strV.size();
390     if ((length < DESCRIPTOR_VALUE_START_OFFSET) || (strV[1] != DESCRIPTOR_TYPE_STRING)) {
391         USB_HILOGI(MODULE_USB_SERVICE, "%{public}s:%{public}d type or length error, len:%{public}d", __func__, __LINE__,
392                    length);
393         return string;
394     }
395     uint16_t *tbuf = new uint16_t[length + 1]();
396     for (uint32_t i = 0; i < length - DESCRIPTOR_VALUE_START_OFFSET; ++i) {
397         tbuf[i] = strV[i + DESCRIPTOR_VALUE_START_OFFSET];
398     }
399     std::wstring wstr((wchar_t *)(tbuf), (length - DESCRIPTOR_VALUE_START_OFFSET) / HALF);
400     string = std::string(wstr.begin(), wstr.end());
401     USB_HILOGI(MODULE_USB_SERVICE, "%{public}s:%{public}d getString idx:%{public}d String:%{public}s length:%{public}d",
402                __func__, __LINE__, idx, string.c_str(), length);
403     delete[] tbuf;
404     return string;
405 }
406 
BcdToString(const std::vector<uint8_t> & bcd)407 static std::string BcdToString(const std::vector<uint8_t> &bcd)
408 {
409     std::string tstr;
410     for (uint32_t i = 0; i < bcd.size(); ++i) {
411         tstr += std::to_string((bcd[i] & BIT_HIGH_4) >> BIT_SHIFT_4);
412         tstr += std::to_string((bcd[i] & BIT_LOW_4));
413     }
414     return tstr;
415 }
416 
FillDevStrings(UsbDevice & dev)417 static int32_t FillDevStrings(UsbDevice &dev)
418 {
419     uint8_t busNum;
420     uint8_t devAddr;
421     uint8_t offsetValue = 8;
422 
423     busNum = dev.GetBusNum();
424     devAddr = dev.GetDevAddr();
425     uint16_t bcdDevice = dev.GetbcdDevice();
426     const std::vector<uint8_t> bcdData {(bcdDevice & 0xff), ((bcdDevice >> offsetValue) & 0xff)};
427     dev.SetVersion(BcdToString(bcdData));
428     dev.SetManufacturerName(GetDevStringValFromIdx(busNum, devAddr, dev.GetiManufacturer()));
429     dev.SetProductName(GetDevStringValFromIdx(busNum, devAddr, dev.GetiProduct()));
430     dev.SetmSerial(GetDevStringValFromIdx(busNum, devAddr, dev.GetiSerialNumber()));
431     USB_HILOGI(MODULE_USB_SERVICE,
432                "%{public}s:%{public}d iSerial:%{public}d mSerial:%{public}s Manufactur:%{public}s product:%{public}s "
433                "version:%{public}s",
434                __func__, __LINE__, dev.GetiSerialNumber(), dev.GetmSerial().c_str(), dev.GetManufacturerName().c_str(),
435                dev.GetProductName().c_str(), dev.GetVersion().c_str());
436 
437     std::vector<USBConfig> configs;
438     configs = dev.GetConfigs();
439     for (auto it = configs.begin(); it != configs.end(); ++it) {
440         it->SetName(GetDevStringValFromIdx(busNum, devAddr, it->GetiConfiguration()));
441         USB_HILOGI(MODULE_USB_SERVICE, "%{public}s:%{public}d Config:%{public}d %{public}s", __func__, __LINE__,
442                    it->GetiConfiguration(), it->GetName().c_str());
443         std::vector<UsbInterface> interfaces = it->GetInterfaces();
444         for (auto itIF = interfaces.begin(); itIF != interfaces.end(); ++itIF) {
445             itIF->SetName(GetDevStringValFromIdx(busNum, devAddr, itIF->GetiInterface()));
446             USB_HILOGI(MODULE_USB_SERVICE, "%{public}s:%{public}d interface:%{public}d %{public}s", __func__, __LINE__,
447                        itIF->GetiInterface(), itIF->GetName().c_str());
448         }
449         it->SetInterfaces(interfaces);
450     }
451     dev.SetConfigs(configs);
452 
453     return UEC_OK;
454 }
455 
GetDeviceInfoDescriptor(const UsbDev & uDev,std::vector<uint8_t> & decriptor,UsbDevice & dev)456 int32_t UsbService::GetDeviceInfoDescriptor(const UsbDev &uDev, std::vector<uint8_t> &decriptor, UsbDevice &dev)
457 {
458     int32_t ret = UsbdClient::GetInstance().GetRawDescriptor(uDev, decriptor);
459     if (ret != UEC_OK) {
460         UsbdClient::GetInstance().CloseDevice(uDev);
461         USB_HILOGE(MODULE_USB_SERVICE,
462                    "%{public}s:%{public}d GetRawDescriptor failed ret=%{public}d busNum:%{public}d "
463                    "devAddr:%{public}d",
464                    __func__, __LINE__, ret, uDev.busNum, uDev.devAddr);
465         return ret;
466     }
467     uint8_t *buffer = decriptor.data();
468     uint32_t length = decriptor.size();
469     if ((!buffer) || (length == 0)) {
470         USB_HILOGE(MODULE_USB_SERVICE,
471                    "%{public}s:%{public}d GetRawDescriptor failed len=%{public}d busNum:%{public}d "
472                    "devAddr:%{public}d",
473                    __func__, __LINE__, length, uDev.busNum, uDev.devAddr);
474         return UEC_SERVICE_INVALID_VALUE;
475     }
476     dev.SetBusNum(uDev.busNum);
477     dev.SetDevAddr(uDev.devAddr);
478     dev.SetName(std::to_string(uDev.busNum) + "-" + std::to_string(uDev.devAddr));
479 
480     ret = UsbDescriptorParser::ParseDeviceDescriptor(buffer, length, dev);
481     if (ret != UEC_OK) {
482         UsbdClient::GetInstance().CloseDevice(uDev);
483         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s ParseDeviceDescriptor failed ret=%{public}d", __func__, ret);
484         return ret;
485     }
486     return ret;
487 }
488 
GetConfigDescriptor(UsbDevice & dev,std::vector<uint8_t> & decriptor)489 int32_t UsbService::GetConfigDescriptor(UsbDevice &dev, std::vector<uint8_t> &decriptor)
490 {
491     std::vector<USBConfig> configs;
492     uint8_t *buffer = decriptor.data();
493     uint32_t length = decriptor.size();
494     uint32_t cursor = CURSOR_INIT;
495     int32_t ret = UEC_OK;
496     for (uint8_t i = 0; i < dev.GetDescConfigCount(); ++i) {
497         if (length <= cursor) {
498             USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d GetConfigDescriptor[%{public}d] length=%{public}d",
499                        __func__, __LINE__, i, length);
500             break;
501         }
502         USB_HILOGI(MODULE_USB_SERVICE, "%{public}s GetConfigDescriptor length=%{public}d", __func__, length);
503         uint32_t configCursor = 0;
504         USBConfig config;
505         ret = UsbDescriptorParser::ParseConfigDescriptor(buffer + cursor, length - cursor, configCursor, config);
506         cursor += configCursor;
507         configs.push_back(config);
508     }
509     dev.SetConfigs(configs);
510     USB_HILOGI(MODULE_USB_SERVICE, "%{public}s:%{public}d SetConfigs ret=%{public}d", __func__, __LINE__, ret);
511     ret = FillDevStrings(dev);
512     USB_HILOGI(MODULE_USB_SERVICE, "%{public}s:%{public}d FillDevStrings ret=%{public}d", __func__, __LINE__, ret);
513     return ret;
514 }
515 
GetDeviceInfo(uint8_t busNum,uint8_t devAddr,UsbDevice & dev)516 int32_t UsbService::GetDeviceInfo(uint8_t busNum, uint8_t devAddr, UsbDevice &dev)
517 {
518     USB_HILOGI(MODULE_USB_SERVICE, "%{public}s:%{public}d busNum:%{public}d devAddr:%{public}d", __func__, __LINE__,
519                busNum, devAddr);
520     const UsbDev uDev = {busNum, devAddr};
521     std::vector<uint8_t> decriptor;
522 
523     int32_t ret = UsbdClient::GetInstance().OpenDevice(uDev);
524     if (ret != UEC_OK) {
525         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s OpenDevice failed ret=%{public}d", __func__, ret);
526         return ret;
527     }
528 
529     ret = GetDeviceInfoDescriptor(uDev, decriptor, dev);
530     if (ret != UEC_OK) {
531         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d GetDeviceInfoDescriptor ret=%{public}d", __func__,
532                    __LINE__, ret);
533     }
534     ret = GetConfigDescriptor(dev, decriptor);
535     if (ret != UEC_OK) {
536         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d GetConfigDescriptor ret=%{public}d", __func__, __LINE__,
537                    ret);
538         return ret;
539     }
540 
541     UsbdClient::GetInstance().CloseDevice(uDev);
542     USB_HILOGI(MODULE_USB_SERVICE, "%{public}s CloseDevice=%{public}s", __func__, dev.ToString().c_str());
543 
544     return UEC_OK;
545 }
546 
AddDevice(uint8_t busNum,uint8_t devAddr)547 bool UsbService::AddDevice(uint8_t busNum, uint8_t devAddr)
548 {
549     UsbDevice *devInfo = new UsbDevice();
550     memset_s(devInfo, sizeof(UsbDevice), 0, sizeof(UsbDevice));
551     int32_t ret = GetDeviceInfo(busNum, devAddr, *devInfo);
552     USB_HILOGI(MODULE_USB_SERVICE, "%{public}s:%{public}d GetDeviceInfo ret=%{public}d", __func__, __LINE__, ret);
553     if (ret == UEC_OK) {
554         usbHostManger_->AddDevice(devInfo);
555         return true;
556     }
557     delete devInfo;
558     return false;
559 }
DelDevice(uint8_t busNum,uint8_t devAddr)560 bool UsbService::DelDevice(uint8_t busNum, uint8_t devAddr)
561 {
562     USB_HILOGI(MODULE_USBD, "%{public}s:%{public}d entry", __func__, __LINE__);
563     int32_t ret = Close(busNum, devAddr);
564     if (ret != UEC_OK) {
565         USB_HILOGE(MODULE_USBD, "%{public}s:%{public}d Close device failed width ret = %{public}d", __func__, __LINE__,
566                    ret);
567     }
568     return usbHostManger_->DelDevice(busNum, devAddr);
569 }
570 
UpdateUsbPort(int32_t portId,int32_t powerRole,int32_t dataRole,int32_t mode)571 void UsbService::UpdateUsbPort(int32_t portId, int32_t powerRole, int32_t dataRole, int32_t mode)
572 {
573     usbPortManager_->UpdatePort(portId, powerRole, dataRole, mode);
574 }
575 
GetBundleName(std::string & bundleName)576 bool UsbService::GetBundleName(std::string &bundleName)
577 {
578 #ifdef USB_RIGHT_TEST
579     bundleName = "com.usb.right";
580     return true;
581 #endif
582     pid_t uid = GetCallingUid();
583     sptr<ISystemAbilityManager> systemAbilityManager =
584         SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
585     if (systemAbilityManager == nullptr) {
586         return false;
587     }
588     sptr<IRemoteObject> remoteObject = systemAbilityManager->GetSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
589     if (remoteObject == nullptr) {
590         return false;
591     }
592 
593     sptr<AppExecFwk::IBundleMgr> bundleMgr(new AppExecFwk::BundleMgrProxy(remoteObject));
594     if (bundleMgr == nullptr) {
595         return false;
596     }
597     bundleMgr->GetBundleNameForUid(uid, bundleName);
598     return true;
599 }
600 
RegBulkCallback(const UsbDev & devInfo,const UsbPipe & pipe,const sptr<IRemoteObject> & cb)601 int32_t UsbService::RegBulkCallback(const UsbDev &devInfo, const UsbPipe &pipe, const sptr<IRemoteObject> &cb)
602 {
603     int32_t ret = UsbdClient::GetInstance().RegBulkCallback(devInfo, pipe, cb);
604     if (UEC_OK != ret) {
605         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d RegBulkCallback error ret:%{public}d", __func__, __LINE__,
606                    ret);
607     }
608     return ret;
609 }
610 
UnRegBulkCallback(const UsbDev & devInfo,const UsbPipe & pipe)611 int32_t UsbService::UnRegBulkCallback(const UsbDev &devInfo, const UsbPipe &pipe)
612 {
613     int32_t ret = UsbdClient::GetInstance().UnRegBulkCallback(devInfo, pipe);
614     if (UEC_OK != ret) {
615         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d UnRegBulkCallback error ret:%{public}d", __func__,
616                    __LINE__, ret);
617     }
618     return ret;
619 }
620 
BulkRead(const UsbDev & devInfo,const UsbPipe & pipe,sptr<Ashmem> & ashmem)621 int32_t UsbService::BulkRead(const UsbDev &devInfo, const UsbPipe &pipe, sptr<Ashmem> &ashmem)
622 {
623     if (ashmem == nullptr) {
624         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d BulkRead error ashmem", __func__, __LINE__);
625         return UEC_SERVICE_INVALID_VALUE;
626     }
627     int32_t ret = UsbdClient::GetInstance().BulkRead(devInfo, pipe, ashmem);
628     if (UEC_OK != ret) {
629         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d BulkRead error ret:%{public}d", __func__, __LINE__, ret);
630     }
631     return ret;
632 }
633 
BulkWrite(const UsbDev & devInfo,const UsbPipe & pipe,sptr<Ashmem> & ashmem)634 int32_t UsbService::BulkWrite(const UsbDev &devInfo, const UsbPipe &pipe, sptr<Ashmem> &ashmem)
635 {
636     if (ashmem == nullptr) {
637         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d BulkWrite error ashmem", __func__, __LINE__);
638         return UEC_SERVICE_INVALID_VALUE;
639     }
640     int32_t ret = UsbdClient::GetInstance().BulkWrite(devInfo, pipe, ashmem);
641     if (UEC_OK != ret) {
642         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d BulkWrite error ret:%{public}d", __func__, __LINE__, ret);
643     }
644     return ret;
645 }
646 
BulkCancel(const UsbDev & devInfo,const UsbPipe & pipe)647 int32_t UsbService::BulkCancel(const UsbDev &devInfo, const UsbPipe &pipe)
648 {
649     int32_t ret = UsbdClient::GetInstance().BulkCancel(devInfo, pipe);
650     if (UEC_OK != ret) {
651         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d BulkCancel error ret:%{public}d", __func__, __LINE__,
652                    ret);
653     }
654     return ret;
655 }
656 } // namespace USB
657 } // namespace OHOS
658