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 std;
27 using namespace OHOS;
28 using namespace OHOS::USB;
29 using namespace httplib;
30
31 static const std::string SPOOLER_BUNDLE_NAME = "com.ohos.spooler";
32
PrintIppOverUsbManager()33 PrintIppOverUsbManager::PrintIppOverUsbManager()
34 {}
35
~PrintIppOverUsbManager()36 PrintIppOverUsbManager::~PrintIppOverUsbManager()
37 {}
38
Init()39 void PrintIppOverUsbManager::Init()
40 {
41 if (isInit) {
42 return;
43 }
44 isInit = true;
45 PRINT_HILOGD("listen usb device attach detach");
46 EventFwk::MatchingSkills matchingSkills;
47 matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_USB_DEVICE_ATTACHED);
48 matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_USB_DEVICE_DETACHED);
49 EventFwk::CommonEventSubscribeInfo subscribeInfo(matchingSkills);
50 subscribeInfo.SetThreadMode(EventFwk::CommonEventSubscribeInfo::COMMON);
51
52 usbDevStatusListener = std::make_shared<PrintEventSubscriber>(subscribeInfo);
53 if (!EventFwk::CommonEventManager::SubscribeCommonEvent(usbDevStatusListener)) {
54 PRINT_HILOGE("subscribe common event failed");
55 }
56 DelayedSingleton<PrintUsbManager>::GetInstance()->Init();
57 }
58
ConnectPrinter(const std::string printerId,int32_t & port)59 bool PrintIppOverUsbManager::ConnectPrinter(const std::string printerId, int32_t &port)
60 {
61 PRINT_HILOGD("ConnectPrinter printerId = %{public}s", printerId.c_str());
62 // printerId: com.ohos.spooler:USB-XXXXX
63 auto posColon = printerId.find_first_of(SPLIT_VALUE_COLON);
64 if (posColon == std::string::npos) {
65 PRINT_HILOGE("can not find : , return!");
66 return false;
67 }
68 std::string extensionId = printerId.substr(0, posColon);
69 PRINT_HILOGD("ConnectPrinter extensionId = %{public}s", extensionId.c_str());
70 if (extensionId != SPOOLER_BUNDLE_NAME) {
71 PRINT_HILOGE("not system spooler, return!");
72 return false;
73 }
74 std::string tmp = printerId.substr(posColon + INDEX_1);
75 PRINT_HILOGD("ConnectPrinter tmp = %{public}s", tmp.c_str());
76 if (tmp.length() > INDEX_4 && (tmp.substr(0, INDEX_4) == PRINTER_ID_PREFIX)) {
77 std::string printerName = tmp.substr(INDEX_4);
78 PRINT_HILOGI("ConnectPrinter printerName = %{public}s", printerName.c_str());
79 if (DelayedSingleton<PrintUsbManager>::GetInstance()->isExistIppOverUsbPrinter(printerName)) {
80 if (DelayedSingleton<PrintUsbManager>::GetInstance()->ConnectUsbPinter(printerName)) {
81 auto ret = DelayedSingleton<PrintHttpServerManager>::GetInstance()->CreateServer(printerName, port);
82 PRINT_HILOGI("printerName = %{public}s CreateServer ret: %{public}d ", printerName.c_str(), ret);
83 return ret;
84 }
85 PRINT_HILOGE("usb connect printerName = %{public}s fail", printerName.c_str());
86 }
87 PRINT_HILOGE("printerName = %{public}s not Exist", printerName.c_str());
88 }
89 return false;
90 }
91
DisConnectPrinter(const std::string printerId)92 void PrintIppOverUsbManager::DisConnectPrinter(const std::string printerId)
93 {
94 PRINT_HILOGD("DisConnectPrinter printerId = %{public}s", printerId.c_str());
95 auto posColon = printerId.find_first_of(SPLIT_VALUE_COLON);
96 if (posColon == std::string::npos) {
97 PRINT_HILOGE("can not find : , return!");
98 return;
99 }
100 std::string extensionId = printerId.substr(0, posColon);
101 PRINT_HILOGD("DisConnectPrinter extensionId = %{public}s", extensionId.c_str());
102 if (extensionId != SPOOLER_BUNDLE_NAME) {
103 PRINT_HILOGE("not system spooler, return!");
104 return;
105 }
106 std::string tmp = printerId.substr(posColon + INDEX_1);
107 PRINT_HILOGD("DisConnectPrinter tmp = %{public}s", tmp.c_str());
108 if (tmp.length() > INDEX_4 && (tmp.substr(0, INDEX_4) == PRINTER_ID_PREFIX)) {
109 std::string printerName = tmp.substr(INDEX_4);
110 PRINT_HILOGD("DisConnectPrinter printerName = %{public}s", printerName.c_str());
111 if (DelayedSingleton<PrintUsbManager>::GetInstance()->isExistIppOverUsbPrinter(printerName)) {
112 DelayedSingleton<PrintHttpServerManager>::GetInstance()->StopServer(printerName);
113 DelayedSingleton<PrintUsbManager>::GetInstance()->DisConnectUsbPinter(printerName);
114 }
115 }
116 }
117 }
118 #endif // IPPOVERUSB_ENABLE