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