• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 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 <chrono>
17 #include "vendor_manager.h"
18 #include "vendor_helper.h"
19 #include "vendor_bsuni_driver.h"
20 #include "vendor_ipp_everywhere.h"
21 #include "vendor_ppd_driver.h"
22 #include "vendor_wlan_group.h"
23 #include "print_log.h"
24 #include "print_utils.h"
25 #include "print_service_ability.h"
26 
27 using namespace OHOS::Print;
28 namespace {
29 const std::string VENDOR_MANAGER_PREFIX = "fwk.";
30 const std::string GLOBAL_ID_DELIMITER = ":";
31 const int MONITOR_CHECK_INTERVAL_MS = 1000;
32 const size_t IP_LENGTH_MIN = 7;
33 }
34 
VendorManager()35 VendorManager::VendorManager()
36 {
37     wlanGroupDriver = std::make_shared<VendorWlanGroup>(this);
38 }
39 
~VendorManager()40 VendorManager::~VendorManager()
41 {
42     UnInit();
43 }
44 
GetGlobalVendorName(const std::string & vendorName)45 std::string VendorManager::GetGlobalVendorName(const std::string &vendorName)
46 {
47     return VENDOR_MANAGER_PREFIX + vendorName;
48 }
GetGlobalPrinterId(const std::string & globalVendorName,const std::string & printerId)49 std::string VendorManager::GetGlobalPrinterId(const std::string &globalVendorName, const std::string &printerId)
50 {
51     return globalVendorName + GLOBAL_ID_DELIMITER + printerId;
52 }
ExtractVendorName(const std::string & globalVendorName)53 std::string VendorManager::ExtractVendorName(const std::string &globalVendorName)
54 {
55     auto pos = globalVendorName.find(VENDOR_MANAGER_PREFIX);
56     if (pos != 0 || globalVendorName.length() <= VENDOR_MANAGER_PREFIX.length()) {
57         return "";
58     }
59     return globalVendorName.substr(VENDOR_MANAGER_PREFIX.length());
60 }
61 
ExtractGlobalVendorName(const std::string & globalPrinterId)62 std::string VendorManager::ExtractGlobalVendorName(const std::string &globalPrinterId)
63 {
64     auto pos = globalPrinterId.find(GLOBAL_ID_DELIMITER);
65     if (pos == std::string::npos) {
66         return "";
67     }
68     return globalPrinterId.substr(0, pos);
69 }
70 
ExtractPrinterId(const std::string & globalPrinterId)71 std::string VendorManager::ExtractPrinterId(const std::string &globalPrinterId)
72 {
73     auto pos = globalPrinterId.find(GLOBAL_ID_DELIMITER);
74     if (pos == std::string::npos || globalPrinterId.length() <= pos + 1) {
75         return globalPrinterId;
76     }
77     return globalPrinterId.substr(pos + 1);
78 }
79 
Init(sptr<PrintServiceAbility> sa,bool loadDefault)80 bool VendorManager::Init(sptr<PrintServiceAbility> sa, bool loadDefault)
81 {
82     PRINT_HILOGI("Init enter");
83     printServiceAbility = sa;
84     if (!loadDefault) {
85         return true;
86     }
87     bool expectLoaded = false;
88     if (!defaultLoaded.compare_exchange_strong(expectLoaded, true)) {
89         PRINT_HILOGI("load already");
90         return true;
91     }
92     PRINT_HILOGI("load default vendor...");
93     if (wlanGroupDriver != nullptr) {
94         wlanGroupDriver->Init(this);
95         wlanGroupDriver->OnCreate();
96     }
97     auto vendorBsUni = std::make_shared<VendorBsuniDriver>();
98     if (!LoadVendorDriver(vendorBsUni)) {
99         PRINT_HILOGW("BsUni driver load fail");
100     }
101     auto vendorIppEverywhere = std::make_shared<VendorIppEveryWhere>();
102     if (!LoadVendorDriver(vendorIppEverywhere)) {
103         PRINT_HILOGW("IppEverywhere driver load fail");
104     }
105     auto vendorPpdDriver = std::make_shared<VendorPpdDriver>();
106     if (!LoadVendorDriver(vendorPpdDriver)) {
107         PRINT_HILOGW("ppd driver load fail");
108     }
109     PRINT_HILOGI("Init quit");
110     return true;
111 }
112 
UnInit()113 void VendorManager::UnInit()
114 {
115     PRINT_HILOGI("UnInit enter");
116     StopStatusMonitor();
117     std::lock_guard<std::mutex> lock(vendorMapMutex);
118     for (auto const &pair : vendorMap) {
119         PRINT_HILOGD("UnInit %{public}s", pair.first.c_str());
120         if (pair.second == nullptr) {
121             PRINT_HILOGW("vendor extension is null");
122             continue;
123         }
124         pair.second->OnDestroy();
125         pair.second->UnInit();
126     }
127     vendorMap.clear();
128     if (wlanGroupDriver != nullptr) {
129         wlanGroupDriver->OnDestroy();
130         wlanGroupDriver->UnInit();
131     }
132     printServiceAbility = nullptr;
133     defaultLoaded = false;
134     PRINT_HILOGI("UnInit quit");
135 }
136 
LoadVendorDriver(std::shared_ptr<VendorDriverBase> vendorDriver)137 bool VendorManager::LoadVendorDriver(std::shared_ptr<VendorDriverBase> vendorDriver)
138 {
139     if (vendorDriver == nullptr) {
140         PRINT_HILOGW("vendorDriver is null");
141         return false;
142     }
143     if (!vendorDriver->Init(this)) {
144         PRINT_HILOGW("vendorDriver init fail");
145         return false;
146     }
147     std::lock_guard<std::mutex> lock(vendorMapMutex);
148     vendorMap.insert(std::make_pair(vendorDriver->GetVendorName(), vendorDriver));
149     vendorDriver->OnCreate();
150     return true;
151 }
UnloadVendorDriver(const std::string & vendorName)152 bool VendorManager::UnloadVendorDriver(const std::string &vendorName)
153 {
154     std::lock_guard<std::mutex> lock(vendorMapMutex);
155     auto iter = vendorMap.find(vendorName);
156     if (iter == vendorMap.end()) {
157         return false;
158     }
159     auto vendorDriver = iter->second;
160     vendorMap.erase(iter);
161     if (vendorDriver != nullptr) {
162         vendorDriver->OnDestroy();
163         vendorDriver->UnInit();
164     }
165     return true;
166 }
167 
ConnectPrinter(const std::string & globalPrinterId)168 bool VendorManager::ConnectPrinter(const std::string &globalPrinterId)
169 {
170     PRINT_HILOGI("ConnectPrinter enter");
171     std::string printerId = ExtractPrinterId(globalPrinterId);
172     if (printerId.empty()) {
173         PRINT_HILOGW("empty printer id");
174         return false;
175     }
176     auto vendorDriver = FindDriverByPrinterId(globalPrinterId);
177     if (vendorDriver == nullptr) {
178         PRINT_HILOGW("vendorDriver is null");
179         return false;
180     }
181     PRINT_HILOGD("OnQueryCapability: %{public}s", printerId.c_str());
182     return vendorDriver->OnQueryCapability(printerId, 0);
183 }
184 
ConnectPrinterByIp(const std::string & printerIp,const std::string & protocol)185 bool VendorManager::ConnectPrinterByIp(const std::string &printerIp, const std::string &protocol)
186 {
187     PRINT_HILOGI("ConnectPrinterByIp enter");
188     if (printerIp.size() < IP_LENGTH_MIN) {
189         PRINT_HILOGW("ip length incorrect");
190         return false;
191     }
192     if (wlanGroupDriver == nullptr) {
193         PRINT_HILOGE("no driver to connect printer by ip");
194         return false;
195     }
196     return wlanGroupDriver->OnQueryCapabilityByIp(printerIp, protocol);
197 }
198 
QueryPrinterInfo(const std::string & globalPrinterId,int timeout)199 bool VendorManager::QueryPrinterInfo(const std::string &globalPrinterId, int timeout)
200 {
201     PRINT_HILOGI("QueryPrinterInfo enter");
202     std::string printerId = ExtractPrinterId(globalPrinterId);
203     if (printerId.empty()) {
204         PRINT_HILOGW("empty printer id");
205         return false;
206     }
207     auto vendorDriver = FindDriverByPrinterId(globalPrinterId);
208     if (vendorDriver == nullptr) {
209         PRINT_HILOGW("vendorDriver is null");
210         return false;
211     }
212     PRINT_HILOGD("OnQueryCapability: %{public}s", printerId.c_str());
213     vendorDriver->OnQueryCapability(printerId, timeout);
214     PRINT_HILOGI("QueryPrinterInfo quit");
215     return true;
216 }
217 
StartDiscovery()218 void VendorManager::StartDiscovery()
219 {
220     PRINT_HILOGI("StartDiscovery enter");
221     std::lock_guard<std::mutex> lock(vendorMapMutex);
222     for (auto const &pair : vendorMap) {
223         PRINT_HILOGD("StartDiscovery %{public}s", pair.first.c_str());
224         if (pair.second == nullptr) {
225             PRINT_HILOGW("vendor extension is null");
226             continue;
227         }
228         pair.second->OnStartDiscovery();
229     }
230     PRINT_HILOGI("StartDiscovery quit");
231 }
StopDiscovery()232 void VendorManager::StopDiscovery()
233 {
234     PRINT_HILOGI("StopDiscovery enter");
235     std::lock_guard<std::mutex> lock(vendorMapMutex);
236     for (auto const &pair : vendorMap) {
237         if (pair.second == nullptr) {
238             PRINT_HILOGW("vendor extension is null");
239             continue;
240         }
241         pair.second->OnStopDiscovery();
242     }
243     PRINT_HILOGI("StopDiscovery quit");
244 }
245 
AddPrinterToDiscovery(const std::string & vendorName,const PrinterInfo & printerInfo)246 int32_t VendorManager::AddPrinterToDiscovery(const std::string &vendorName, const PrinterInfo &printerInfo)
247 {
248     PRINT_HILOGI("AddPrinterToDiscovery enter");
249     if (vendorName == VENDOR_BSUNI_DRIVER && wlanGroupDriver != nullptr) {
250         return wlanGroupDriver->OnPrinterDiscovered(vendorName, printerInfo);
251     }
252     if (printServiceAbility == nullptr) {
253         PRINT_HILOGW("printServiceAbility is null");
254         return EXTENSION_ERROR_CALLBACK_FAIL;
255     }
256     if (!printServiceAbility->AddVendorPrinterToDiscovery(GetGlobalVendorName(vendorName), printerInfo)) {
257         PRINT_HILOGW("AddPrinterToDiscovery fail");
258         return EXTENSION_ERROR_CALLBACK_FAIL;
259     }
260     PRINT_HILOGI("AddPrinterToDiscovery quit");
261     return EXTENSION_ERROR_NONE;
262 }
263 
UpdatePrinterToDiscovery(const std::string & vendorName,const PrinterInfo & printerInfo)264 int32_t VendorManager::UpdatePrinterToDiscovery(const std::string &vendorName, const PrinterInfo &printerInfo)
265 {
266     PRINT_HILOGI("UpdatePrinterToDiscovery enter");
267     if (vendorName == VENDOR_BSUNI_DRIVER && wlanGroupDriver != nullptr) {
268         return wlanGroupDriver->OnUpdatePrinterToDiscovery(vendorName, printerInfo);
269     }
270     if (printServiceAbility == nullptr) {
271         PRINT_HILOGW("printServiceAbility is null");
272         return EXTENSION_ERROR_CALLBACK_FAIL;
273     }
274     auto targetVendorName = IsWlanGroupDriver(printerInfo.GetPrinterId()) ? VENDOR_WLAN_GROUP : vendorName;
275     std::string globalVendorName = GetGlobalVendorName(targetVendorName);
276     std::string printerId = printerInfo.GetPrinterId();
277     if (GetConnectingMethod(printerId) == IP_AUTO && IsConnectingPrinter(printerId, "") &&
278         printServiceAbility->AddIpPrinterToSystemData(globalVendorName, printerInfo)) {
279         PRINT_HILOGI("AddIpPrinterToSystemData succeed");
280         return EXTENSION_ERROR_NONE;
281     }
282     if (!printServiceAbility->UpdateVendorPrinterToDiscovery(globalVendorName, printerInfo)) {
283         PRINT_HILOGW("UpdatePrinterToDiscovery fail");
284         return EXTENSION_ERROR_CALLBACK_FAIL;
285     }
286     PRINT_HILOGI("UpdatePrinterToDiscovery quit");
287     return EXTENSION_ERROR_NONE;
288 }
289 
RemovePrinterFromDiscovery(const std::string & vendorName,const std::string & printerId)290 int32_t VendorManager::RemovePrinterFromDiscovery(const std::string &vendorName, const std::string &printerId)
291 {
292     PRINT_HILOGI("RemovePrinterFromDiscovery enter");
293     if (vendorName == VENDOR_BSUNI_DRIVER && wlanGroupDriver != nullptr) {
294         return wlanGroupDriver->OnPrinterRemoved(vendorName, printerId);
295     }
296     if (printServiceAbility == nullptr) {
297         PRINT_HILOGW("printServiceAbility is null");
298         return EXTENSION_ERROR_CALLBACK_FAIL;
299     }
300     if (!printServiceAbility->RemoveVendorPrinterFromDiscovery(GetGlobalVendorName(vendorName), printerId)) {
301         PRINT_HILOGW("RemovePrinterFromDiscovery fail");
302         return EXTENSION_ERROR_CALLBACK_FAIL;
303     }
304     PRINT_HILOGI("RemovePrinterFromDiscovery quit");
305     return EXTENSION_ERROR_NONE;
306 }
307 
AddPrinterToCupsWithPpd(const std::string & vendorName,const std::string & printerId,const std::string & ppdName,const std::string & ppdData)308 int32_t VendorManager::AddPrinterToCupsWithPpd(const std::string &vendorName, const std::string &printerId,
309                                                const std::string &ppdName, const std::string &ppdData)
310 {
311     PRINT_HILOGI("AddPrinterToCupsWithPpd enter");
312     if (printServiceAbility == nullptr) {
313         PRINT_HILOGW("printServiceAbility is null");
314         return EXTENSION_ERROR_CALLBACK_FAIL;
315     }
316     auto targetVendorName = IsWlanGroupDriver(ExtractPrinterId(printerId)) ? VENDOR_WLAN_GROUP : vendorName;
317     std::string globalVendorName = GetGlobalVendorName(targetVendorName);
318     std::string globalPrinterId = GetGlobalPrinterId(globalVendorName, printerId);
319     if (GetConnectingMethod(globalPrinterId) == IP_AUTO &&
320         printServiceAbility->AddIpPrinterToCupsWithPpd(globalVendorName, printerId, ppdName, ppdData)) {
321         PRINT_HILOGI("AddIpPrinterToCupsWithPpd succeed");
322         return EXTENSION_ERROR_NONE;
323     }
324     if (!printServiceAbility->AddVendorPrinterToCupsWithPpd(globalVendorName, printerId, ppdName, ppdData)) {
325         PRINT_HILOGW("AddPrinterToCupsWithPpd fail");
326         return EXTENSION_ERROR_CALLBACK_FAIL;
327     }
328     PRINT_HILOGI("AddPrinterToCupsWithPpd quit");
329     return EXTENSION_ERROR_NONE;
330 }
331 
RemovePrinterFromCups(const std::string & vendorName,const std::string & printerId)332 int32_t VendorManager::RemovePrinterFromCups(const std::string &vendorName, const std::string &printerId)
333 {
334     PRINT_HILOGI("RemovePrinterFromCups enter");
335     if (printServiceAbility == nullptr) {
336         PRINT_HILOGW("printServiceAbility is null");
337         return EXTENSION_ERROR_CALLBACK_FAIL;
338     }
339     auto targetVendorName = IsWlanGroupDriver(printerId) ? VENDOR_WLAN_GROUP : vendorName;
340     std::string globalVendorName = GetGlobalVendorName(targetVendorName);
341     if (!printServiceAbility->RemoveVendorPrinterFromCups(globalVendorName, printerId)) {
342         PRINT_HILOGW("RemovePrinterFromCups fail");
343         return EXTENSION_ERROR_CALLBACK_FAIL;
344     }
345     PRINT_HILOGI("RemovePrinterFromCups quit");
346     return EXTENSION_ERROR_NONE;
347 }
348 
OnPrinterCapabilityQueried(const std::string & vendorName,const PrinterInfo & printerInfo)349 bool VendorManager::OnPrinterCapabilityQueried(const std::string &vendorName, const PrinterInfo &printerInfo)
350 {
351     PRINT_HILOGI("OnPrinterCapabilityQueried enter");
352     if (vendorName == VENDOR_BSUNI_DRIVER && wlanGroupDriver != nullptr) {
353         return wlanGroupDriver->OnPrinterCapabilityQueried(vendorName, printerInfo);
354     }
355     return false;
356 }
357 
OnPrinterPpdQueried(const std::string & vendorName,const std::string & printerId,const std::string & ppdName,const std::string & ppdData)358 bool VendorManager::OnPrinterPpdQueried(const std::string &vendorName, const std::string &printerId,
359                                         const std::string &ppdName, const std::string &ppdData)
360 {
361     PRINT_HILOGI("OnPrinterPpdQueried enter");
362     if (vendorName == VENDOR_BSUNI_DRIVER && wlanGroupDriver != nullptr) {
363         return wlanGroupDriver->OnPrinterPpdQueried(vendorName, printerId, ppdName, ppdData);
364     }
365     if (printServiceAbility == nullptr) {
366         PRINT_HILOGW("printServiceAbility is null");
367         return false;
368     }
369     std::string globalVendorName = GetGlobalVendorName(vendorName);
370     std::string globalPrinterId = GetGlobalPrinterId(globalVendorName, printerId);
371     PRINT_HILOGD("global printer id %{public}s", globalPrinterId.c_str());
372     if (!IsConnectingPrinter(globalPrinterId, "")) {
373         PRINT_HILOGW("not connecting");
374         return false;
375     }
376     if (AddPrinterToCupsWithPpd(globalVendorName, printerId, ppdName, ppdData) != EXTENSION_ERROR_NONE) {
377         PRINT_HILOGW("AddPrinterToCupsWithPpd fail");
378         return false;
379     }
380     PRINT_HILOGI("OnPrinterPpdQueried quit");
381     return true;
382 }
383 
OnPrinterStatusChanged(const std::string & vendorName,const std::string & printerId,const PrinterVendorStatus & status)384 bool VendorManager::OnPrinterStatusChanged(const std::string &vendorName, const std::string &printerId,
385                                            const PrinterVendorStatus &status)
386 {
387     if (vendorName == VENDOR_BSUNI_DRIVER && wlanGroupDriver != nullptr) {
388         return wlanGroupDriver->OnPrinterStatusChanged(vendorName, printerId, status);
389     }
390     std::string globalVendorName = GetGlobalVendorName(vendorName);
391     if (printServiceAbility != nullptr) {
392         return printServiceAbility->OnVendorStatusUpdate(globalVendorName, printerId, status);
393     }
394     return true;
395 }
396 
FindDriverByPrinterId(const std::string & globalPrinterId)397 std::shared_ptr<VendorDriverBase> VendorManager::FindDriverByPrinterId(const std::string &globalPrinterId)
398 {
399     std::string globalVendorName = ExtractGlobalVendorName(globalPrinterId);
400     std::string vendorName = ExtractVendorName(globalVendorName);
401     if (vendorName.empty()) {
402         PRINT_HILOGW("Invalid printer id");
403         return nullptr;
404     }
405     return FindDriverByVendorName(vendorName);
406 }
407 
FindDriverByVendorName(const std::string & vendorName)408 std::shared_ptr<VendorDriverBase> VendorManager::FindDriverByVendorName(const std::string &vendorName)
409 {
410     std::lock_guard<std::mutex> lock(vendorMapMutex);
411     if (vendorName == VENDOR_WLAN_GROUP) {
412         return wlanGroupDriver;
413     }
414     auto iter = vendorMap.find(vendorName);
415     if (iter == vendorMap.end()) {
416         PRINT_HILOGW("cannot find vendor extension: %{public}s", vendorName.c_str());
417         return nullptr;
418     }
419     return iter->second;
420 }
421 
StartStatusMonitor()422 void VendorManager::StartStatusMonitor()
423 {
424     PRINT_HILOGI("StartStatusMonitor Enter");
425     {
426         std::unique_lock<std::mutex> lock(statusMonitorMutex);
427         if (statusMonitorOn) {
428             PRINT_HILOGW("already on");
429             return;
430         }
431         statusMonitorOn = true;
432     }
433     PRINT_HILOGI("StartStatusMonitor Now");
434     statusMonitorThread = std::thread(&VendorManager::StatusMonitorProcess, this);
435     PRINT_HILOGI("StartStatusMonitor Quit");
436 }
437 
StopStatusMonitor()438 void VendorManager::StopStatusMonitor()
439 {
440     PRINT_HILOGI("StopStatusMonitor Enter");
441     {
442         std::unique_lock<std::mutex> lock(statusMonitorMutex);
443         statusMonitorOn = false;
444     }
445     statusMonitorCondition.notify_one();
446     if (statusMonitorThread.joinable()) {
447         statusMonitorThread.join();
448     }
449     PRINT_HILOGI("StopStatusMonitor Quit");
450 }
451 
StatusMonitorProcess()452 void VendorManager::StatusMonitorProcess()
453 {
454     PRINT_HILOGI("StatusMonitorProcess Enter");
455     while (WaitNext()) {
456         UpdateAllPrinterStatus();
457     }
458     PRINT_HILOGI("StatusMonitorProcess Quit");
459 }
460 
UpdateAllPrinterStatus()461 void VendorManager::UpdateAllPrinterStatus()
462 {
463     std::lock_guard<std::mutex> lock(vendorMapMutex);
464     for (auto const &pair : vendorMap) {
465         if (pair.second == nullptr) {
466             PRINT_HILOGW("vendor extension is null");
467             continue;
468         }
469         pair.second->UpdateAllPrinterStatus();
470     }
471 }
472 
WaitNext()473 bool VendorManager::WaitNext()
474 {
475     std::unique_lock<std::mutex> lock(statusMonitorMutex);
476     if (!statusMonitorOn) {
477         return false;
478     }
479     statusMonitorCondition.wait_for(lock, std::chrono::milliseconds(MONITOR_CHECK_INTERVAL_MS));
480     if (!statusMonitorOn) {
481         return false;
482     }
483     return true;
484 }
485 
IsPrivatePpdDriver(const std::string & vendorName)486 bool VendorManager::IsPrivatePpdDriver(const std::string &vendorName)
487 {
488     return vendorName == VENDOR_PPD_DRIVER;
489 }
490 
MonitorPrinterStatus(const std::string & globalPrinterId,bool on)491 bool VendorManager::MonitorPrinterStatus(const std::string &globalPrinterId, bool on)
492 {
493     std::string globalVendorName = ExtractGlobalVendorName(globalPrinterId);
494     std::string printerId = ExtractPrinterId(globalPrinterId);
495     if (globalVendorName.empty() || printerId.empty()) {
496         PRINT_HILOGW("invalid printer id: %{private}s", globalPrinterId.c_str());
497         return false;
498     }
499     std::string vendorName = ExtractVendorName(globalVendorName);
500     if (vendorName.empty()) {
501         PRINT_HILOGW("vendor name empty");
502         return false;
503     }
504     auto vendorDriver = FindDriverByVendorName(vendorName);
505     if (vendorDriver == nullptr) {
506         PRINT_HILOGW("vendor driver is null");
507         return false;
508     }
509     return vendorDriver->MonitorPrinterStatus(printerId, on);
510 }
511 
IsConnectingPrinter(const std::string & globalPrinterIdOrIp,const std::string & uri)512 bool VendorManager::IsConnectingPrinter(const std::string &globalPrinterIdOrIp, const std::string &uri)
513 {
514     if (globalPrinterIdOrIp.find(VENDOR_BSUNI_DRIVER) != std::string::npos && wlanGroupDriver != nullptr) {
515         return wlanGroupDriver->IsConnectingPrinter(globalPrinterIdOrIp, uri);
516     }
517     PRINT_HILOGI("IsConnectingPrinter globalPrinterIdOrIp: %{private}s, connectingPrinter: %{private}s",
518         globalPrinterIdOrIp.c_str(), connectingPrinter.c_str());
519     std::lock_guard<std::mutex> lock(simpleObjectMutex);
520     if (isConnecting && !connectingPrinter.empty()) {
521         if (connectingMethod == ID_AUTO) {
522             return globalPrinterIdOrIp == connectingPrinter;
523         } else {
524             return (globalPrinterIdOrIp.find(connectingPrinter) != std::string::npos) ||
525                 (connectingPrinter.find(globalPrinterIdOrIp) != std::string::npos) ||
526                 uri.find(connectingPrinter) != std::string::npos;
527         }
528     }
529     return false;
530 }
531 
SetConnectingPrinter(ConnectMethod method,const std::string & globalPrinterIdOrIp)532 void VendorManager::SetConnectingPrinter(ConnectMethod method, const std::string &globalPrinterIdOrIp)
533 {
534     if (globalPrinterIdOrIp.find(VENDOR_BSUNI_DRIVER) != std::string::npos && wlanGroupDriver != nullptr) {
535         wlanGroupDriver->SetConnectingPrinter(method, globalPrinterIdOrIp);
536         return;
537     }
538     std::lock_guard<std::mutex> lock(simpleObjectMutex);
539     connectingMethod = method;
540     connectingPrinter = globalPrinterIdOrIp;
541     isConnecting = true;
542 }
543 
ClearConnectingPrinter()544 void VendorManager::ClearConnectingPrinter()
545 {
546     PRINT_HILOGD("ClearConnectingPrinter");
547     std::lock_guard<std::mutex> lock(simpleObjectMutex);
548     isConnecting = false;
549 }
550 
QueryPrinterCapabilityByUri(const std::string & uri,PrinterCapability & printerCap)551 bool VendorManager::QueryPrinterCapabilityByUri(const std::string &uri, PrinterCapability &printerCap)
552 {
553     if (printServiceAbility == nullptr) {
554         PRINT_HILOGW("printServiceAbility is null");
555         return false;
556     }
557     return printServiceAbility->QueryPrinterCapabilityByUri(uri, printerCap);
558 }
559 
QueryPrinterStatusByUri(const std::string & uri,PrinterStatus & status)560 bool VendorManager::QueryPrinterStatusByUri(const std::string &uri, PrinterStatus &status)
561 {
562     if (printServiceAbility == nullptr) {
563         PRINT_HILOGW("printServiceAbility is null");
564         return false;
565     }
566     return printServiceAbility->QueryPrinterStatusByUri(uri, status);
567 }
568 
QueryDiscoveredPrinterInfoById(const std::string & vendorName,const std::string & printerId)569 std::shared_ptr<PrinterInfo> VendorManager::QueryDiscoveredPrinterInfoById(const std::string &vendorName,
570     const std::string &printerId)
571 {
572     auto targetVendorName = IsWlanGroupDriver(printerId) ? VENDOR_WLAN_GROUP : vendorName;
573     auto globalPrinterId = PrintUtils::GetGlobalId(VendorManager::GetGlobalVendorName(targetVendorName), printerId);
574     return printServiceAbility->QueryDiscoveredPrinterInfoById(globalPrinterId);
575 }
576 
QueryPrinterInfoByPrinterId(const std::string & vendorName,const std::string & printerId,PrinterInfo & info)577 int32_t VendorManager::QueryPrinterInfoByPrinterId(const std::string &vendorName, const std::string &printerId,
578     PrinterInfo &info)
579 {
580     if (printServiceAbility == nullptr) {
581         PRINT_HILOGW("QueryPrinterInfoByPrinterId printServiceAbility is null");
582         return E_PRINT_GENERIC_FAILURE;
583     }
584     auto targetVendorName = IsWlanGroupDriver(printerId) ? VENDOR_WLAN_GROUP : vendorName;
585     auto globalPrinterId = PrintUtils::GetGlobalId(VendorManager::GetGlobalVendorName(targetVendorName), printerId);
586     return printServiceAbility->QueryPrinterInfoByPrinterId(globalPrinterId, info);
587 }
588 
QueryAddedPrintersByIp(const std::string & printerIp)589 std::vector<std::string> VendorManager::QueryAddedPrintersByIp(const std::string &printerIp)
590 {
591     if (printServiceAbility == nullptr) {
592         PRINT_HILOGW("printServiceAbility is null");
593         return std::vector<std::string>();
594     }
595     return printServiceAbility->QueryAddedPrintersByIp(printerIp);
596 }
597 
QueryPPDInformation(const std::string & makeModel,std::string & ppdName)598 bool VendorManager::QueryPPDInformation(const std::string &makeModel, std::string &ppdName)
599 {
600     if (printServiceAbility == nullptr) {
601         PRINT_HILOGW("QueryPPDInformation printServiceAbility is null");
602         return false;
603     }
604     return printServiceAbility->QueryPPDInformation(makeModel, ppdName);
605 }
606 
IsWlanGroupDriver(const std::string & bothPrinterId)607 bool VendorManager::IsWlanGroupDriver(const std::string &bothPrinterId)
608 {
609     if (wlanGroupDriver == nullptr) {
610         return false;
611     }
612     return wlanGroupDriver->IsGroupDriver(bothPrinterId);
613 }
614 
GetConnectingMethod(const std::string & globalPrinterIdOrIp)615 ConnectMethod VendorManager::GetConnectingMethod(const std::string &globalPrinterIdOrIp)
616 {
617     if (globalPrinterIdOrIp.find(VENDOR_BSUNI_DRIVER) != std::string::npos && wlanGroupDriver != nullptr) {
618         return wlanGroupDriver->GetConnectingMethod(globalPrinterIdOrIp);
619     }
620     if (!IsConnectingPrinter(globalPrinterIdOrIp, "")) {
621         PRINT_HILOGW("not connecting");
622         return ID_AUTO;
623     }
624     return connectingMethod;
625 }
626 
DiscoverBackendPrinters(const std::string & vendorName,std::vector<PrinterInfo> & printers)627 int32_t VendorManager::DiscoverBackendPrinters(const std::string &vendorName, std::vector<PrinterInfo> &printers)
628 {
629     if (printServiceAbility == nullptr) {
630         PRINT_HILOGW("QueryPrinterInfoByPrinterId printServiceAbility is null");
631         return EXTENSION_ERROR_CALLBACK_FAIL;
632     }
633     return printServiceAbility->DiscoverBackendPrinters(printers);
634 }
635