• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) Huawei Technologies Co., Ltd. 2024. All rights reserved.
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 "usb_accessory_manager.h"
16 
17 #include <iostream>
18 #include <functional>
19 #include <chrono>
20 #include <sstream>
21 #include <iomanip>
22 #include <hdf_base.h>
23 
24 #include "common_event_data.h"
25 #include "common_event_manager.h"
26 #include "common_event_support.h"
27 #include "hisysevent.h"
28 #include "usb_errors.h"
29 #include "usb_srv_support.h"
30 #include "usbd_type.h"
31 #include "cJSON.h"
32 using namespace OHOS::AAFwk;
33 using namespace OHOS::EventFwk;
34 using namespace OHOS::HiviewDFX;
35 using namespace OHOS::HDI::Usb::V1_0;
36 using namespace OHOS::HDI::Usb::V1_2;
37 
38 namespace OHOS {
39 namespace USB {
40 constexpr int32_t ACCESSORY_INFO_SIZE = 5;
41 constexpr uint32_t ACCESSORY_EXTRA_INDEX = 5;
42 constexpr uint32_t FUN_ACCESSORY = 1 << 11;
43 constexpr int32_t NUM_OF_SERAIL_BIT = 16;
44 constexpr uint32_t DELAY_ACC_INTERVAL = 10 * 1000;
45 constexpr uint32_t ANTI_SHAKE_INTERVAL = 1 * 1000;
46 constexpr int32_t ACCESSORY_IS_BUSY = -16;
47 const int INDEX_FIRST = 0;
48 const int INDEX_SECOND = 1;
49 const int INDEX_THIRD = 2;
50 const int INDEX_FORTH = 3;
51 const int INDEX_FIFTH = 4;
52 const uint32_t OFFSET2 = 2;
53 const uint32_t OFFSET4 = 4;
54 const uint32_t OFFSET6 = 6;
55 const std::string BASE_64_CHARS =
56              "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
57              "abcdefghijklmnopqrstuvwxyz"
58              "0123456789+/";
59 const char *ACCESSORY_DRIVER_PATH = "/dev/usb_accessory";
60 
61 // LCOV_EXCL_START
UsbAccessoryManager()62 UsbAccessoryManager::UsbAccessoryManager()
63 {
64     USB_HILOGI(MODULE_USB_SERVICE, "UsbAccessoryManager::Init start");
65 #ifndef USB_MANAGER_V2_0
66     usbdImpl_ = OHOS::HDI::Usb::V1_2::IUsbInterface::Get();
67     if (usbdImpl_ == nullptr) {
68         USB_HILOGE(MODULE_USB_SERVICE, "UsbDeviceManager::Get inteface failed");
69     }
70 #endif // USB_MANAGER_V2_0
71 }
72 
73 #ifdef USB_MANAGER_V2_0
InitUsbAccessoryInterface()74 bool UsbAccessoryManager::InitUsbAccessoryInterface()
75 {
76     USB_HILOGI(MODULE_USB_SERVICE, "UsbAccessoryManager::InitUsbAccessoryInterface start");
77     usbDeviceInterface_ = HDI::Usb::V2_0::IUsbDeviceInterface::Get();
78     if (usbDeviceInterface_ == nullptr) {
79         USB_HILOGE(MODULE_USB_SERVICE, "UsbAccessoryManager:: Get inteface failed");
80         return false;
81     }
82     return true;
83 }
84 #endif // USB_MANAGER_V2_0
85 
GetAccessoryInfo(std::vector<std::string> & accessorys)86 void UsbAccessoryManager::GetAccessoryInfo(std::vector<std::string> &accessorys)
87 {
88 #ifdef USB_MANAGER_V2_0
89     if (usbDeviceInterface_ == nullptr) {
90         USB_HILOGE(MODULE_USB_INNERKIT, "UsbAccessoryManager usbDeviceInterface_ is nullptr.");
91         return;
92     }
93     usbDeviceInterface_->GetAccessoryInfo(accessorys);
94 #else
95     if (usbdImpl_ == nullptr) {
96         USB_HILOGE(MODULE_USB_INNERKIT, "UsbAccessoryManager usbdImpl_ is nullptr.");
97         return;
98     }
99     usbdImpl_->GetAccessoryInfo(accessorys);
100 #endif // USB_MANAGER_V2_0
101 }
102 
SetCurrentFunctions(int32_t funcs)103 int32_t UsbAccessoryManager::SetCurrentFunctions(int32_t funcs)
104 {
105 #ifdef USB_MANAGER_V2_0
106     if (usbDeviceInterface_ == nullptr) {
107         USB_HILOGE(MODULE_USB_INNERKIT, "UsbAccessoryManager usbDeviceInterface_ is nullptr.");
108         return UEC_SERVICE_INVALID_VALUE;
109     }
110     return usbDeviceInterface_->SetCurrentFunctions(funcs);
111 #else
112     if (usbdImpl_ == nullptr) {
113         USB_HILOGE(MODULE_USB_INNERKIT, "UsbAccessoryManager usbdImpl_ is nullptr.");
114         return UEC_SERVICE_INVALID_VALUE;
115     }
116     return usbdImpl_->SetCurrentFunctions(funcs);
117 #endif // USB_MANAGER_V2_0
118 }
119 
GetCurrentFunctions(int32_t & funcs)120 int32_t UsbAccessoryManager::GetCurrentFunctions(int32_t &funcs)
121 {
122 #ifdef USB_MANAGER_V2_0
123     if (usbDeviceInterface_ == nullptr) {
124         USB_HILOGE(MODULE_USB_INNERKIT, "UsbAccessoryManager usbDeviceInterface_ is nullptr.");
125         return UEC_SERVICE_INVALID_VALUE;
126     }
127     return usbDeviceInterface_->GetCurrentFunctions(funcs);
128 #else
129     if (usbdImpl_ == nullptr) {
130         USB_HILOGE(MODULE_USB_INNERKIT, "UsbAccessoryManager usbdImpl_ is nullptr.");
131         return UEC_SERVICE_INVALID_VALUE;
132     }
133     return usbdImpl_->GetCurrentFunctions(funcs);
134 #endif // USB_MANAGER_V2_0
135 }
136 
SetUsbd(const sptr<OHOS::HDI::Usb::V1_2::IUsbInterface> usbd)137 int32_t UsbAccessoryManager::SetUsbd(const sptr<OHOS::HDI::Usb::V1_2::IUsbInterface> usbd)
138 {
139     if (usbd == nullptr) {
140         USB_HILOGE(MODULE_USB_SERVICE, "UsbAccessoryManager usbd is nullptr");
141         return UEC_SERVICE_INVALID_VALUE;
142     }
143     usbdImpl_ = usbd;
144     return UEC_OK;
145 }
146 
GetAccessoryList(const std::string & bundleName,std::vector<USBAccessory> & accessoryList)147 void UsbAccessoryManager::GetAccessoryList(const std::string &bundleName,
148     std::vector<USBAccessory> &accessoryList)
149 {
150     if (accStatus_ == ACC_START) {
151         USBAccessory access = this->accessory;
152         access.SetSerialNumber(bundleName + this->accessory.GetSerialNumber());
153         accessoryList.push_back(access);
154     }
155     return;
156 }
157 
OpenAccessory(int32_t & fd)158 int32_t UsbAccessoryManager::OpenAccessory(int32_t &fd)
159 {
160     int32_t ret = UEC_INTERFACE_INVALID_VALUE;
161 #ifdef USB_MANAGER_V2_0
162     if (usbDeviceInterface_ == nullptr) {
163         USB_HILOGE(MODULE_USB_INNERKIT, "UsbAccessoryManager usbDeviceInterface_ is nullptr.");
164         return UEC_SERVICE_INVALID_VALUE;
165     }
166     ret = usbDeviceInterface_->OpenAccessory(fd);
167 #else
168     if (usbdImpl_ == nullptr) {
169         USB_HILOGE(MODULE_USB_INNERKIT, "UsbAccessoryManager usbdImpl_ is nullptr.");
170         return UEC_SERVICE_INVALID_VALUE;
171     }
172     ret = usbdImpl_->OpenAccessory(fd);
173 #endif // USB_MANAGER_V2_0
174     if (ret == UEC_OK) {
175         accFd_ = fd;
176         return ret;
177     } else if (ret == ACCESSORY_IS_BUSY) {
178         return UEC_SERVICE_ACCESSORY_REOPEN;
179     }
180     return UEC_SERVICE_ACCESSORY_OPEN_NATIVE_NODE_FAILED;
181 }
182 
CloseAccessory(int32_t fd)183 int32_t UsbAccessoryManager::CloseAccessory(int32_t fd)
184 {
185     int32_t ret = UEC_INTERFACE_INVALID_VALUE;
186 #ifdef USB_MANAGER_V2_0
187     if (usbDeviceInterface_ == nullptr) {
188         USB_HILOGE(MODULE_USB_INNERKIT, "UsbAccessoryManager usbDeviceInterface_ is nullptr.");
189         return UEC_SERVICE_INVALID_VALUE;
190     }
191     int32_t newFd = open(ACCESSORY_DRIVER_PATH, O_RDWR);
192     ret = usbDeviceInterface_->CloseAccessory(newFd);
193     close(newFd);
194 #else
195     if (usbdImpl_ == nullptr) {
196         USB_HILOGE(MODULE_USB_INNERKIT, "UsbAccessoryManager usbdImpl_ is nullptr.");
197         return UEC_SERVICE_INVALID_VALUE;
198     }
199     ret = usbdImpl_->CloseAccessory(accFd_);
200 #endif // USB_MANAGER_V2_0
201     if (ret != UEC_OK) {
202         USB_HILOGE(MODULE_USB_INNERKIT, "%{public}s, close ret: %{public}d, fd: %{public}d.", __func__, ret, fd);
203         return ret;
204     }
205     accFd_ = 0;
206     return ret;
207 }
208 
ProcessAccessoryStart(int32_t curFunc,int32_t curAccStatus)209 int32_t UsbAccessoryManager::ProcessAccessoryStart(int32_t curFunc, int32_t curAccStatus)
210 {
211     uint32_t curFuncUint = static_cast<uint32_t>(curFunc);
212     if ((curFuncUint & FUN_ACCESSORY) != 0 && accStatus_ != ACC_START) {
213         this->accStatus_ = ACC_START;
214         std::vector<std::string> accessorys;
215         GetAccessoryInfo(accessorys);
216         this->accessory.SetAccessory(accessorys);
217         std::string hashSerial = SerialValueHash(this->accessory.GetSerialNumber());
218         this->accessory.SetSerialNumber(hashSerial);
219         Want want;
220         want.SetAction(CommonEventSupport::COMMON_EVENT_USB_ACCESSORY_ATTACHED);
221         CommonEventData data(want);
222         data.SetData(this->accessory.GetJsonString().c_str());
223         CommonEventPublishInfo publishInfo;
224         USB_HILOGI(MODULE_SERVICE, "send accessory attached broadcast device:%{public}s",
225             this->accessory.GetJsonString().c_str());
226         return CommonEventManager::PublishCommonEvent(data, publishInfo);
227     } else if ((curFuncUint & FUN_ACCESSORY) == 0 && curAccStatus == ACC_CONFIGURING) {
228         int32_t ret = SetCurrentFunctions(FUN_ACCESSORY);
229         if (ret != UEC_OK) {
230             USB_HILOGE(MODULE_SERVICE, "curFunc %{public}d curAccStatus:%{public}u, set func ret: %{public}d",
231                 curFuncUint, curAccStatus, ret);
232             return ret;
233         }
234         lastDeviceFunc_ = static_cast<int32_t>(curFuncUint);
235         auto task = [&]() {
236             this->accStatus_ = ACC_STOP;
237             int32_t ret = SetCurrentFunctions(this->lastDeviceFunc_);
238             if (ret != UEC_OK) {
239                 USB_HILOGW(MODULE_SERVICE, "set old func: %{public}d ret: %{public}d", this->lastDeviceFunc_, ret);
240             }
241             return;
242         };
243         accDelayTimerId_ = UsbTimerWrapper::GetInstance()->Register(task, DELAY_ACC_INTERVAL, true);
244         this->accStatus_ = ACC_CONFIGURING;
245     } else {
246         USB_HILOGD(MODULE_SERVICE, "curFunc %{public}u curAccStatus:%{public}d not necessary",
247             curFuncUint, curAccStatus);
248     }
249     return UEC_OK;
250 }
251 
ProcessAccessoryStop(int32_t curFunc,int32_t curAccStatus)252 int32_t UsbAccessoryManager::ProcessAccessoryStop(int32_t curFunc, int32_t curAccStatus)
253 {
254     uint32_t curFuncUint = static_cast<uint32_t>(curFunc);
255     if ((curFuncUint & FUN_ACCESSORY) != 0 && accStatus_ == ACC_START) {
256         accStatus_ = ACC_STOP;
257         int32_t ret = SetCurrentFunctions(lastDeviceFunc_);
258         if (ret != UEC_OK) {
259             USB_HILOGW(MODULE_SERVICE, "setFunc %{public}d curAccStatus:%{public}d, set func ret: %{public}d",
260                 lastDeviceFunc_, curAccStatus, ret);
261         }
262         curDeviceFunc_ = lastDeviceFunc_;
263         Want want;
264         want.SetAction(CommonEventSupport::COMMON_EVENT_USB_ACCESSORY_DETACHED);
265         CommonEventData data(want);
266         data.SetData(this->accessory.GetJsonString().c_str());
267         CommonEventPublishInfo publishInfo;
268         USB_HILOGI(MODULE_SERVICE, "send accessory detached broadcast device:%{public}s",
269             this->accessory.GetJsonString().c_str());
270         return CommonEventManager::PublishCommonEvent(data, publishInfo);
271     } else {
272         USB_HILOGD(MODULE_SERVICE, "curFunc %{public}u curAccStatus:%{public}d not necessary",
273             curFuncUint, curAccStatus);
274     }
275     return UEC_OK;
276 }
277 
ProcessAccessorySend()278 int32_t UsbAccessoryManager::ProcessAccessorySend()
279 {
280     this->accStatus_ = ACC_SEND;
281     std::vector<std::string> accessorys;
282     GetAccessoryInfo(accessorys);
283     this->accessory.SetAccessory(accessorys);
284     std::string extraInfo;
285     if (accessorys.size() > ACCESSORY_INFO_SIZE &&
286         ACCESSORY_EXTRA_INDEX < accessorys.size() && !accessorys[ACCESSORY_EXTRA_INDEX].empty()) {
287         if (base64Map_.empty()) {
288             InitBase64Map();
289         }
290         std::string extraEcode = accessorys[ACCESSORY_EXTRA_INDEX];
291         USB_HILOGE(MODULE_USB_SERVICE, "extraEcode, length: %{public}zu, extraData: %{public}s",
292             extraEcode.length(), extraEcode.c_str());
293         std::vector<uint8_t> extraData = Base64Decode(extraEcode);
294         cJSON *root = cJSON_CreateArray();
295         for (uint8_t value : extraData) {
296             cJSON_AddItemToArray(root, cJSON_CreateNumber(value));
297         }
298         char *pExtraJson = cJSON_PrintUnformatted(root);
299         cJSON_Delete(root);
300         if (!pExtraJson) {
301             USB_HILOGE(MODULE_USB_SERVICE, "print json error.");
302             return UEC_SERVICE_INVALID_VALUE;
303         }
304         extraInfo = pExtraJson;
305         cJSON_free(pExtraJson);
306         pExtraJson = nullptr;
307     }
308 
309     USBAccessory extraAcces;
310     extraAcces.SetDescription(extraInfo);
311     Want want;
312     want.SetAction(CommonEventSupport::COMMON_EVENT_USB_ACCESSORY_ATTACHED);
313     CommonEventData data(want);
314     data.SetData(extraAcces.GetJsonString().c_str());
315     CommonEventPublishInfo publishInfo;
316     USB_HILOGI(MODULE_SERVICE, "send accessory attached broadcast device:%{public}s",
317         extraAcces.GetJsonString().c_str());
318     CommonEventManager::PublishCommonEvent(data, publishInfo);
319     return UEC_OK;
320 }
321 
HandleEvent(int32_t status,bool delayProcess)322 void UsbAccessoryManager::HandleEvent(int32_t status, bool delayProcess)
323 {
324 #ifdef USB_MANAGER_V2_0
325     if (usbDeviceInterface_ == nullptr) {
326         USB_HILOGE(MODULE_USB_SERVICE, "UsbAccessoryManager::usbDeviceInterface_ is nullptr");
327         return;
328     }
329 #else
330     if (usbdImpl_ == nullptr) {
331         USB_HILOGE(MODULE_USB_SERVICE, "UsbAccessoryManager::usbdImpl_ is nullptr");
332         return;
333     }
334 #endif // USB_MANAGER_V2_0
335     std::lock_guard<std::mutex> guard(mutexHandleEvent_);
336     eventStatus_ = status;
337     if (delayProcess) {
338         UsbTimerWrapper::GetInstance()->Unregister(antiShakeDelayTimerId_);
339     }
340     if ((status == ACT_UPDEVICE || status == ACT_DOWNDEVICE) && delayProcess) {
341         auto task = [&]() {
342             this->HandleEvent(this->eventStatus_, false);
343             return;
344         };
345         antiShakeDelayTimerId_ = UsbTimerWrapper::GetInstance()->Register(task, ANTI_SHAKE_INTERVAL, true);
346         return;
347     }
348     int32_t curAccStatus = ACC_NONE;
349     switch (status) {
350         case ACT_UPDEVICE: {
351             if (accStatus_ == ACC_CONFIGURING) {
352                 curAccStatus = ACC_START;
353             }
354             break;
355         }
356         case ACT_ACCESSORYUP: {
357             curAccStatus = ACC_CONFIGURING;
358             break;
359         }
360         case ACT_DOWNDEVICE:
361         case ACT_ACCESSORYDOWN: {
362             curAccStatus = ACC_STOP;
363             break;
364         }
365         case ACT_ACCESSORYSEND: {
366             curAccStatus = ACC_SEND;
367             break;
368         }
369         default:
370             USB_HILOGE(MODULE_USB_SERVICE, "invalid status %{public}d", status);
371     }
372     ProcessHandle(curAccStatus);
373 }
374 
ProcessHandle(int32_t curAccStatus)375 void UsbAccessoryManager::ProcessHandle(int32_t curAccStatus)
376 {
377     int32_t ret = UEC_INTERFACE_INVALID_VALUE;
378     if ((curAccStatus == ACC_CONFIGURING || curAccStatus == ACC_START)) {
379         UsbTimerWrapper::GetInstance()->Unregister(accDelayTimerId_);
380         int32_t curFunc = 0;
381         ret = GetCurrentFunctions(curFunc);
382         if (ret != UEC_OK) {
383             USB_HILOGE(MODULE_USB_SERVICE, "GetCurrentFunctions ret: %{public}d", ret);
384             return;
385         }
386         this->curDeviceFunc_ = curFunc;
387         ret = ProcessAccessoryStart(curFunc, curAccStatus);
388         if (ret != UEC_OK) {
389             USB_HILOGE(MODULE_USB_SERVICE, "ProcessAccessoryStart ret: %{public}d", ret);
390             return;
391         }
392     } else if (curAccStatus == ACC_STOP && accStatus_ != ACC_CONFIGURING) {
393         ret = ProcessAccessoryStop(curDeviceFunc_, curAccStatus);
394         if (ret != UEC_OK) {
395             USB_HILOGE(MODULE_USB_SERVICE, "ProcessAccessoryStop ret: %{public}d", ret);
396             return;
397         }
398     } else if (curAccStatus == ACC_SEND) {
399         ProcessAccessorySend();
400     }
401     return;
402 }
403 
SerialValueHash(const std::string & serialValue)404 std::string UsbAccessoryManager::SerialValueHash(const std::string&serialValue)
405 {
406     uint64_t timestamp = 0;
407     auto now = std::chrono::system_clock::now();
408     auto duration = now.time_since_epoch();
409     auto millis = std::chrono::duration_cast<std::chrono::milliseconds>(duration).count();
410     timestamp = static_cast<uint64_t>(millis);
411 
412     std::hash<std::string> string_hash;
413     std::hash<uint64_t> int_hash;
414 
415     uint32_t hashValue = (string_hash(serialValue) ^ (int_hash(timestamp) << 1));
416 
417     std::stringstream ss;
418     ss << std::hex << std::setw(NUM_OF_SERAIL_BIT) << std::setfill('0') << hashValue;
419     return ss.str();
420 }
421 
InitBase64Map()422 void UsbAccessoryManager::InitBase64Map()
423 {
424     for (size_t i = 0; i < BASE_64_CHARS.size(); ++i) {
425         base64Map_[BASE_64_CHARS[i]] = static_cast<int>(i);
426     }
427 }
428 
IsBase64(unsigned char c)429 bool IsBase64(unsigned char c)
430 {
431     return (isalnum(c) || (c == '+') || (c == '/'));
432 }
433 
Base64Decode(const std::string & basicString)434 std::vector<uint8_t> UsbAccessoryManager::Base64Decode(const std::string& basicString)
435 {
436     std::string decoded_data;
437     uint32_t i = 0;
438     int index = 0;
439     int len = static_cast<int>(basicString.size());
440     unsigned char charArray3[INDEX_FORTH];
441     unsigned char charArray4[INDEX_FIFTH];
442 
443     while (len-- && (basicString[index] != '=') && IsBase64(basicString[index])) {
444         charArray4[i++] = basicString[index];
445         index++;
446         if (i == sizeof(charArray4)) {
447             for (i = 0; i < sizeof(charArray4); i++) {
448                 charArray4[i] = BASE_64_CHARS.find(charArray4[i]);
449             }
450             charArray3[INDEX_FIRST] = (charArray4[INDEX_FIRST] << OFFSET2) +
451                 ((charArray4[INDEX_SECOND] & 0x30) >> OFFSET4);
452             charArray3[INDEX_SECOND] = ((charArray4[INDEX_SECOND] & 0xf) << OFFSET4) +
453                 ((charArray4[INDEX_THIRD] & 0x3c) >> OFFSET2);
454             charArray3[INDEX_THIRD] = ((charArray4[INDEX_THIRD] & 0x3) << OFFSET6) + charArray4[INDEX_FORTH];
455             for (i = 0; i < sizeof(charArray3); i++) {
456                 decoded_data += charArray3[i];
457             }
458             i = 0;
459         }
460     }
461 
462     if (i) {
463         uint32_t j = 0;
464         for (j = i; j < sizeof(charArray4); j++) {
465             charArray4[j] = 0;
466         }
467         for (j = 0; j < sizeof(charArray4); j++) {
468             charArray4[j] = BASE_64_CHARS.find(charArray4[j]);
469         }
470         charArray3[INDEX_FIRST] = (charArray4[INDEX_FIRST] << OFFSET2) +
471             ((charArray4[INDEX_SECOND] & 0x30) >> OFFSET4);
472         charArray3[INDEX_SECOND] = ((charArray4[INDEX_SECOND] & 0xf) << OFFSET4) +
473             ((charArray4[INDEX_THIRD] & 0x3c) >> OFFSET2);
474         charArray3[INDEX_THIRD] = ((charArray4[INDEX_THIRD] & 0x3) << OFFSET6) + charArray4[INDEX_FORTH];
475         for (j = 0; j < i - 1; j++) {
476             decoded_data += charArray3[j];
477         }
478     }
479 
480     std::vector<uint8_t> ret;
481     for (char c : decoded_data) {
482         ret.push_back(static_cast<uint8_t>(c));
483     }
484 
485     return ret;
486 }
487 
compare(const std::string & s1,const std::string & s2)488 bool UsbAccessoryManager::compare(const std::string &s1, const std::string &s2)
489 {
490     if (s1.empty())
491         return (s2.empty());
492     return s1 == s2;
493 }
494 
GetAccessorySerialNumber(const USBAccessory & access,const std::string & bundleName,std::string & serialValue)495 int32_t UsbAccessoryManager::GetAccessorySerialNumber(const USBAccessory &access,
496     const std::string &bundleName, std::string &serialValue)
497 {
498     USB_HILOGD(MODULE_USB_SERVICE, "%{public}s, bundleName: %{public}s, serial: %{public}s",
499         __func__, bundleName.c_str(), this->accessory.GetSerialNumber().c_str());
500     if (accStatus_ != ACC_START) {
501         USB_HILOGE(MODULE_USB_SERVICE, "invalid status %{public}d", accStatus_);
502         return UEC_SERVICE_ACCESSORY_NOT_MATCH;
503     } else if (compare(this->accessory.GetManufacturer(), access.GetManufacturer()) &&
504         (compare(this->accessory.GetProduct(), access.GetProduct())) &&
505         compare(this->accessory.GetDescription(), access.GetDescription()) &&
506         compare(this->accessory.GetManufacturer(), access.GetManufacturer()) &&
507         compare(this->accessory.GetVersion(), access.GetVersion()) &&
508         (compare(this->accessory.GetSerialNumber(), access.GetSerialNumber()) ||
509         compare(bundleName + this->accessory.GetSerialNumber(), access.GetSerialNumber()))) {
510         serialValue = access.GetManufacturer() + access.GetProduct() + access.GetVersion() + access.GetSerialNumber();
511         return UEC_OK;
512     }
513     return UEC_SERVICE_ACCESSORY_NOT_MATCH;
514 }
515 // LCOV_EXCL_STOP
516 
517 } // USB
518 } // OHOS
519