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