1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifdef IPPOVERUSB_ENABLE
17 #include "print_ipp_over_usb_manager.h"
18 #include "print_log.h"
19 #include "print_usb_manager.h"
20 #include "print_http_server_manager.h"
21 #include "common_event_data.h"
22 #include "common_event_manager.h"
23 #include "common_event_support.h"
24 
25 namespace OHOS::Print {
26 using namespace OHOS;
27 using namespace OHOS::USB;
28 using namespace httplib;
29 
30 static const std::string SPOOLER_BUNDLE_NAME = "com.ohos.spooler";
31 
PrintIppOverUsbManager()32 PrintIppOverUsbManager::PrintIppOverUsbManager()
33 {}
34 
~PrintIppOverUsbManager()35 PrintIppOverUsbManager::~PrintIppOverUsbManager()
36 {}
37 
Init()38 void PrintIppOverUsbManager::Init()
39 {
40     if (isInit) {
41         return;
42     }
43     isInit = true;
44     PRINT_HILOGD("listen usb device attach detach");
45     EventFwk::MatchingSkills matchingSkills;
46     matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_USB_DEVICE_ATTACHED);
47     matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_USB_DEVICE_DETACHED);
48     EventFwk::CommonEventSubscribeInfo subscribeInfo(matchingSkills);
49     subscribeInfo.SetThreadMode(EventFwk::CommonEventSubscribeInfo::COMMON);
50 
51     usbDevStatusListener = std::make_shared<PrintEventSubscriber>(subscribeInfo);
52     if (!EventFwk::CommonEventManager::SubscribeCommonEvent(usbDevStatusListener)) {
53         PRINT_HILOGE("subscribe common event failed");
54     }
55     DelayedSingleton<PrintUsbManager>::GetInstance()->Init();
56 }
57 
ConnectPrinter(const std::string printerId,int32_t & port)58 bool PrintIppOverUsbManager::ConnectPrinter(const std::string printerId, int32_t &port)
59 {
60     PRINT_HILOGD("ConnectPrinter printerId = %{public}s", printerId.c_str());
61     // printerId: com.ohos.spooler:USB-XXXXX
62     auto posColon = printerId.find_first_of(SPLIT_VALUE_COLON);
63     if (posColon == std::string::npos) {
64         PRINT_HILOGE("can not find posColon, return!");
65         return false;
66     }
67     std::string extensionId = printerId.substr(0, posColon);
68     PRINT_HILOGD("ConnectPrinter extensionId = %{public}s", extensionId.c_str());
69     if (extensionId != SPOOLER_BUNDLE_NAME) {
70         PRINT_HILOGE("not system spooler, return!");
71         return false;
72     }
73     std::string tmp = printerId.substr(posColon + INDEX_1);
74     PRINT_HILOGD("ConnectPrinter tmp = %{public}s", tmp.c_str());
75     if (tmp.length() > INDEX_4 && (tmp.substr(0, INDEX_4) == PRINTER_ID_PREFIX)) {
76         std::string printerName = tmp.substr(INDEX_4);
77         PRINT_HILOGI("ConnectPrinter printerName = %{public}s", printerName.c_str());
78         if (DelayedSingleton<PrintUsbManager>::GetInstance()->isExistIppOverUsbPrinter(printerName)) {
79             if (DelayedSingleton<PrintUsbManager>::GetInstance()->ConnectUsbPinter(printerName)) {
80                 auto ret = DelayedSingleton<PrintHttpServerManager>::GetInstance()->CreateServer(printerName, port);
81                 PRINT_HILOGI("printerName = %{public}s CreateServer ret: %{public}d ", printerName.c_str(), ret);
82                 return ret;
83             }
84             PRINT_HILOGE("usb connect printerName = %{public}s fail", printerName.c_str());
85         }
86         PRINT_HILOGE("printerName = %{public}s not Exist", printerName.c_str());
87     }
88     return false;
89 }
90 
DisConnectPrinter(const std::string printerId)91 void PrintIppOverUsbManager::DisConnectPrinter(const std::string printerId)
92 {
93     PRINT_HILOGD("DisConnectPrinter printerId = %{public}s", printerId.c_str());
94     auto posColon = printerId.find_first_of(SPLIT_VALUE_COLON);
95     if (posColon == std::string::npos) {
96         PRINT_HILOGE("can not find posColon, return!");
97         return;
98     }
99     std::string extensionId = printerId.substr(0, posColon);
100     PRINT_HILOGD("DisConnectPrinter extensionId = %{public}s", extensionId.c_str());
101     if (extensionId != SPOOLER_BUNDLE_NAME) {
102         PRINT_HILOGE("not system spooler, return!");
103         return;
104     }
105     std::string tmp = printerId.substr(posColon + INDEX_1);
106     PRINT_HILOGD("DisConnectPrinter tmp = %{public}s", tmp.c_str());
107     if (tmp.length() > INDEX_4 && (tmp.substr(0, INDEX_4) == PRINTER_ID_PREFIX)) {
108         std::string printerName = tmp.substr(INDEX_4);
109         PRINT_HILOGD("DisConnectPrinter printerName = %{public}s", printerName.c_str());
110         if (DelayedSingleton<PrintUsbManager>::GetInstance()->isExistIppOverUsbPrinter(printerName)) {
111             DelayedSingleton<PrintHttpServerManager>::GetInstance()->StopServer(printerName);
112             DelayedSingleton<PrintUsbManager>::GetInstance()->DisConnectUsbPinter(printerName);
113         }
114     }
115 }
116 }
117 #endif // IPPOVERUSB_ENABLE