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