1 /*
2 * Copyright (c) 2022 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 "iservice_registry.h"
17 #include "system_ability_definition.h"
18 #include "napi/native_common.h"
19 #include "ui_content.h"
20 #include "ipc_skeleton.h"
21 #include "want.h"
22 #include "bundle_mgr_client.h"
23
24 #include "print_manager_client.h"
25 #include "print_constant.h"
26 #include "print_extension_callback_stub.h"
27 #include "print_log.h"
28 #include "print_sync_load_callback.h"
29 #include "print_utils.h"
30 #include "print_callback.h"
31 #include "print_innerkit_modal_ui_callback.h"
32
33 namespace OHOS::Print {
34
35 static const std::string SPOOLER_BUNDLE_NAME = "com.ohos.spooler";
36 static const std::string SPOOLER_PREVIEW_ABILITY_NAME = "PrintServiceExtAbility";
37 static const std::string LAUNCH_PARAMETER_JOB_ID = "jobId";
38 static const std::string LAUNCH_PARAMETER_FILE_LIST = "fileList";
39 static const std::string TOKEN_KEY = "ohos.ability.params.token";
40 static const std::string UI_EXTENSION_TYPE_NAME = "ability.want.params.uiExtensionType";
41 static const std::string PRINT_UI_EXTENSION_TYPE = "sysDialog/print";
42 static const std::string CALLER_PKG_NAME = "caller.pkgName";
43
PrintManagerClient()44 PrintManagerClient::PrintManagerClient() : printServiceProxy_(nullptr), deathRecipient_(nullptr) {}
45
~PrintManagerClient()46 PrintManagerClient::~PrintManagerClient() {}
47
GetInstance()48 PrintManagerClient* PrintManagerClient::GetInstance()
49 {
50 static PrintManagerClient instance;
51 return &instance;
52 }
53
GetPrintServiceProxy()54 bool PrintManagerClient::GetPrintServiceProxy()
55 {
56 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
57 if (printServiceProxy_ != nullptr) {
58 PRINT_HILOGD("printServiceProxy_ is not null");
59 return true;
60 }
61 bool result = false;
62 auto systemAbilityManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
63 if (systemAbilityManager != nullptr) {
64 auto systemAbility = systemAbilityManager->GetSystemAbility(PRINT_SERVICE_ID, "");
65 if (systemAbility != nullptr) {
66 deathRecipient_ = new (std::nothrow) PrintSaDeathRecipient();
67 if (deathRecipient_ != nullptr) {
68 systemAbility->AddDeathRecipient(deathRecipient_);
69 printServiceProxy_ = iface_cast<IPrintService>(systemAbility);
70 PRINT_HILOGD("Getting PrintManagerClientProxy succeeded.");
71 result = true;
72 }
73 }
74 }
75 PRINT_HILOGD("Getting PrintManagerClientProxy ret[%{public}d].", result);
76 return result;
77 }
78
OnRemoteSaDied(const wptr<IRemoteObject> & remote)79 void PrintManagerClient::OnRemoteSaDied(const wptr<IRemoteObject> &remote)
80 {
81 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
82 PRINT_HILOGD("OnRemoteSaDied start");
83 if (remote == nullptr) {
84 PRINT_HILOGE("remote is nullptr");
85 return;
86 }
87 if (printServiceProxy_ == nullptr) {
88 PRINT_HILOGE("printServiceProxy_ is null");
89 return;
90 }
91 auto serviceRemote = printServiceProxy_->AsObject();
92 if ((serviceRemote != nullptr) && (serviceRemote == remote.promote())) {
93 PRINT_HILOGD("need reset");
94 serviceRemote->RemoveDeathRecipient(deathRecipient_);
95 printServiceProxy_ = nullptr;
96 deathRecipient_ = nullptr;
97 std::unique_lock<std::mutex> lock(conditionMutex_);
98 ready_ = false;
99 }
100 }
101
StartPrint(const std::vector<std::string> & fileList,const std::vector<uint32_t> & fdList,std::string & taskId)102 int32_t PrintManagerClient::StartPrint(const std::vector<std::string> &fileList,
103 const std::vector<uint32_t> &fdList, std::string &taskId)
104 {
105 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
106 PRINT_HILOGD("PrintManagerClient StartPrint start.");
107 int32_t ret = E_PRINT_RPC_FAILURE;
108 if (LoadServer() && GetPrintServiceProxy()) {
109 ret = printServiceProxy_->StartPrint(fileList, fdList, taskId);
110 PRINT_HILOGD("PrintManagerClient StartPrint out ret = [%{public}d].", ret);
111 }
112 return ret;
113 }
114
StopPrint(const std::string & taskId)115 int32_t PrintManagerClient::StopPrint(const std::string &taskId)
116 {
117 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
118 PRINT_HILOGD("PrintManagerClient StopPrint start.");
119 int32_t ret = E_PRINT_RPC_FAILURE;
120 if (LoadServer() && GetPrintServiceProxy()) {
121 ret = printServiceProxy_->StopPrint(taskId);
122 PRINT_HILOGD("PrintManagerClient StopPrint out ret = [%{public}d].", ret);
123 }
124 return ret;
125 }
126
ConnectPrinter(const std::string & printerId)127 int32_t PrintManagerClient::ConnectPrinter(const std::string &printerId)
128 {
129 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
130 PRINT_HILOGD("PrintManagerClient ConnectPrinter start.");
131 int32_t ret = E_PRINT_RPC_FAILURE;
132 if (LoadServer() && GetPrintServiceProxy()) {
133 ret = printServiceProxy_->ConnectPrinter(printerId);
134 PRINT_HILOGD("PrintManagerClient ConnectPrinter out ret = [%{public}d].", ret);
135 }
136 return ret;
137 }
138
DisconnectPrinter(const std::string & printerId)139 int32_t PrintManagerClient::DisconnectPrinter(const std::string &printerId)
140 {
141 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
142 PRINT_HILOGD("PrintManagerClient DisconnectPrinter start.");
143 int32_t ret = E_PRINT_RPC_FAILURE;
144 if (LoadServer() && GetPrintServiceProxy()) {
145 ret = printServiceProxy_->DisconnectPrinter(printerId);
146 PRINT_HILOGD("PrintManagerClient DisconnectPrinter out ret = [%{public}d].", ret);
147 }
148 return ret;
149 }
150
QueryAllExtension(std::vector<PrintExtensionInfo> & extensionInfos)151 int32_t PrintManagerClient::QueryAllExtension(std::vector<PrintExtensionInfo> &extensionInfos)
152 {
153 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
154 PRINT_HILOGD("PrintManagerClient QueryAllExtension start.");
155 int32_t ret = E_PRINT_RPC_FAILURE;
156 if (LoadServer() && GetPrintServiceProxy()) {
157 ret = printServiceProxy_->QueryAllExtension(extensionInfos);
158 PRINT_HILOGD("PrintManagerClient QueryAllExtension out ret = [%{public}d].", ret);
159 }
160 return ret;
161 }
162
StartDiscoverPrinter(const std::vector<std::string> & extensionList)163 int32_t PrintManagerClient::StartDiscoverPrinter(const std::vector<std::string> &extensionList)
164 {
165 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
166 PRINT_HILOGD("PrintManagerClient StartDiscoverPrinter start.");
167 int32_t ret = E_PRINT_RPC_FAILURE;
168 if (LoadServer() && GetPrintServiceProxy()) {
169 ret = printServiceProxy_->StartDiscoverPrinter(extensionList);
170 PRINT_HILOGD("PrintManagerClient StartDiscoverPrinter out ret = [%{public}d].", ret);
171 }
172 return ret;
173 }
174
StopDiscoverPrinter()175 int32_t PrintManagerClient::StopDiscoverPrinter()
176 {
177 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
178 PRINT_HILOGD("PrintManagerClient StopDiscoverPrinter start.");
179 int32_t ret = E_PRINT_RPC_FAILURE;
180 if (LoadServer() && GetPrintServiceProxy()) {
181 ret = printServiceProxy_->StopDiscoverPrinter();
182 PRINT_HILOGD("PrintManagerClient StopDiscoverPrinter out ret = [%{public}d].", ret);
183 }
184 return ret;
185 }
186
StartPrintJob(PrintJob & jobinfo)187 int32_t PrintManagerClient::StartPrintJob(PrintJob &jobinfo)
188 {
189 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
190 PRINT_HILOGD("PrintManagerClient StartPrintJob start.");
191 int32_t ret = E_PRINT_RPC_FAILURE;
192 if (LoadServer() && GetPrintServiceProxy()) {
193 ret = printServiceProxy_->StartPrintJob(jobinfo);
194 PRINT_HILOGD("PrintManagerClient StartPrintJob out ret = [%{public}d].", ret);
195 }
196 return ret;
197 }
198
CancelPrintJob(const std::string & jobId)199 int32_t PrintManagerClient::CancelPrintJob(const std::string &jobId)
200 {
201 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
202 PRINT_HILOGD("PrintManagerClient CancelPrintJob start.");
203 int32_t ret = E_PRINT_RPC_FAILURE;
204 if (LoadServer() && GetPrintServiceProxy()) {
205 ret = printServiceProxy_->CancelPrintJob(jobId);
206 PRINT_HILOGD("PrintManagerClient CancelPrintJob out ret = [%{public}d].", ret);
207 }
208 return ret;
209 }
210
RestartPrintJob(const std::string & jobId)211 int32_t PrintManagerClient::RestartPrintJob(const std::string &jobId)
212 {
213 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
214 PRINT_HILOGD("PrintManagerClient RestartPrintJob start.");
215 int32_t ret = E_PRINT_RPC_FAILURE;
216 if (LoadServer() && GetPrintServiceProxy()) {
217 ret = printServiceProxy_->RestartPrintJob(jobId);
218 PRINT_HILOGD("PrintManagerClient RestartPrintJob out ret = [%{public}d].", ret);
219 }
220 return ret;
221 }
222
AddPrinters(const std::vector<PrinterInfo> & printerInfos)223 int32_t PrintManagerClient::AddPrinters(const std::vector<PrinterInfo> &printerInfos)
224 {
225 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
226 PRINT_HILOGD("PrintManagerClient AddPrinters start.");
227 int32_t ret = E_PRINT_RPC_FAILURE;
228 if (LoadServer() && GetPrintServiceProxy()) {
229 ret = printServiceProxy_->AddPrinters(printerInfos);
230 PRINT_HILOGD("PrintManagerClient AddPrinters out ret = [%{public}d].", ret);
231 }
232 if (ret != E_PRINT_NONE) {
233 PRINT_HILOGE("Failed to query printerList");
234 }
235 return ret;
236 }
237
RemovePrinters(const std::vector<std::string> & printerIds)238 int32_t PrintManagerClient::RemovePrinters(const std::vector<std::string> &printerIds)
239 {
240 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
241 PRINT_HILOGD("PrintManagerClient RemovePrinters start.");
242 int32_t ret = E_PRINT_RPC_FAILURE;
243 if (LoadServer() && GetPrintServiceProxy()) {
244 ret = printServiceProxy_->RemovePrinters(printerIds);
245 PRINT_HILOGD("PrintManagerClient RemovePrinters out ret = [%{public}d].", ret);
246 }
247 return ret;
248 }
249
UpdatePrinters(const std::vector<PrinterInfo> & printerInfos)250 int32_t PrintManagerClient::UpdatePrinters(const std::vector<PrinterInfo> &printerInfos)
251 {
252 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
253 PRINT_HILOGD("PrintManagerClient UpdatePrinters start.");
254 int32_t ret = E_PRINT_RPC_FAILURE;
255 if (LoadServer() && GetPrintServiceProxy()) {
256 ret = printServiceProxy_->UpdatePrinters(printerInfos);
257 PRINT_HILOGD("PrintManagerClient UpdatePrinters out ret = [%{public}d].", ret);
258 }
259 return ret;
260 }
261
UpdatePrinterState(const std::string & printerId,uint32_t state)262 int32_t PrintManagerClient::UpdatePrinterState(const std::string &printerId, uint32_t state)
263 {
264 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
265 PRINT_HILOGD("PrintManagerClient UpdatePrinterState start.");
266 int32_t ret = E_PRINT_RPC_FAILURE;
267 if (LoadServer() && GetPrintServiceProxy()) {
268 ret = printServiceProxy_->UpdatePrinterState(printerId, state);
269 PRINT_HILOGD("PrintManagerClient UpdatePrinterState out ret = [%{public}d].", ret);
270 }
271 return ret;
272 }
273
UpdatePrintJobStateForNormalApp(const std::string & jobId,uint32_t state,uint32_t subState)274 int32_t PrintManagerClient::UpdatePrintJobStateForNormalApp(
275 const std::string &jobId, uint32_t state, uint32_t subState)
276 {
277 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
278 PRINT_HILOGI("PrintManagerClient UpdatePrintJobStateForNormalApp start.");
279 int32_t ret = E_PRINT_RPC_FAILURE;
280 if (LoadServer() && GetPrintServiceProxy()) {
281 ret = printServiceProxy_->UpdatePrintJobStateForNormalApp(jobId, state, subState);
282 PRINT_HILOGI("PrintManagerClient UpdatePrintJobStateForNormalApp out ret = [%{public}d].", ret);
283 }
284 return ret;
285 }
286
UpdatePrintJobStateOnlyForSystemApp(const std::string & jobId,uint32_t state,uint32_t subState)287 int32_t PrintManagerClient::UpdatePrintJobStateOnlyForSystemApp(
288 const std::string &jobId, uint32_t state, uint32_t subState)
289 {
290 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
291 PRINT_HILOGD("PrintManagerClient UpdatePrintJobStateOnlyForSystemApp start.");
292 int32_t ret = E_PRINT_RPC_FAILURE;
293 if (LoadServer() && GetPrintServiceProxy()) {
294 ret = printServiceProxy_->UpdatePrintJobStateOnlyForSystemApp(jobId, state, subState);
295 PRINT_HILOGD("PrintManagerClient UpdatePrintJobStateOnlyForSystemApp out ret = [%{public}d].", ret);
296 }
297 return ret;
298 }
299
UpdateExtensionInfo(const std::string & extInfo)300 int32_t PrintManagerClient::UpdateExtensionInfo(const std::string &extInfo)
301 {
302 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
303 PRINT_HILOGD("PrintManagerClient UpdateExtensionInfo start.");
304 int32_t ret = E_PRINT_RPC_FAILURE;
305 if (LoadServer() && GetPrintServiceProxy()) {
306 ret = printServiceProxy_->UpdateExtensionInfo(extInfo);
307 PRINT_HILOGD("PrintManagerClient UpdateExtensionInfo out ret = [%{public}d].", ret);
308 }
309 return ret;
310 }
311
RequestPreview(const PrintJob & jobinfo,std::string & previewResult)312 int32_t PrintManagerClient::RequestPreview(const PrintJob &jobinfo, std::string &previewResult)
313 {
314 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
315 PRINT_HILOGD("PrintManagerClient RequestPreview start.");
316 int32_t ret = E_PRINT_RPC_FAILURE;
317 if (LoadServer() && GetPrintServiceProxy()) {
318 ret = printServiceProxy_->RequestPreview(jobinfo, previewResult);
319 PRINT_HILOGD("PrintManagerClient RequestPreview out ret = [%{public}d].", ret);
320 }
321 return ret;
322 }
323
QueryPrinterCapability(const std::string & printerId)324 int32_t PrintManagerClient::QueryPrinterCapability(const std::string &printerId)
325 {
326 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
327 PRINT_HILOGD("PrintManagerClient QueryPrinterCapability start.");
328 int32_t ret = E_PRINT_RPC_FAILURE;
329 if (LoadServer() && GetPrintServiceProxy()) {
330 ret = printServiceProxy_->QueryPrinterCapability(printerId);
331 PRINT_HILOGD("PrintManagerClient QueryPrinterCapability out ret = [%{public}d].", ret);
332 }
333 return ret;
334 }
335
QueryPrinterInfoByPrinterId(const std::string & printerId,PrinterInfo & info)336 int32_t PrintManagerClient::QueryPrinterInfoByPrinterId(const std::string &printerId, PrinterInfo &info)
337 {
338 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
339 PRINT_HILOGD("PrintManagerClient QueryPrinterInfoByPrinterId start.");
340 int32_t ret = E_PRINT_RPC_FAILURE;
341 if (LoadServer() && GetPrintServiceProxy()) {
342 ret = printServiceProxy_->QueryPrinterInfoByPrinterId(printerId, info);
343 PRINT_HILOGD("PrintManagerClient QueryPrinterInfoByPrinterId out ret = [%{public}d].", ret);
344 }
345 return ret;
346 }
347
QueryAddedPrinter(std::vector<std::string> & printerNameList)348 int32_t PrintManagerClient::QueryAddedPrinter(std::vector<std::string> &printerNameList)
349 {
350 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
351 PRINT_HILOGD("PrintManagerClient QueryAddedPrinter start.");
352 int32_t ret = E_PRINT_RPC_FAILURE;
353 if (LoadServer() && GetPrintServiceProxy()) {
354 ret = printServiceProxy_->QueryAddedPrinter(printerNameList);
355 PRINT_HILOGD("PrintManagerClient QueryAddedPrinter out ret = [%{public}d].", ret);
356 }
357 return ret;
358 }
359
QueryPrinterProperties(const std::string & printerId,const std::vector<std::string> & keyList,std::vector<std::string> & valueList)360 int32_t PrintManagerClient::QueryPrinterProperties(const std::string &printerId,
361 const std::vector<std::string> &keyList, std::vector<std::string> &valueList)
362 {
363 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
364 PRINT_HILOGD("PrintManagerClient QueryPrinterProperties start.");
365 int32_t ret = E_PRINT_RPC_FAILURE;
366 if (LoadServer() && GetPrintServiceProxy()) {
367 ret = printServiceProxy_->QueryPrinterProperties(printerId, keyList, valueList);
368 PRINT_HILOGD("PrintManagerClient QueryPrinterProperties out ret = [%{public}d].", ret);
369 }
370 return ret;
371 }
372
StartNativePrintJob(PrintJob & printJob)373 int32_t PrintManagerClient::StartNativePrintJob(PrintJob &printJob)
374 {
375 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
376 PRINT_HILOGD("PrintManagerClient StartNativePrintJob start.");
377 int32_t ret = E_PRINT_RPC_FAILURE;
378 if (LoadServer() && GetPrintServiceProxy()) {
379 ret = printServiceProxy_->StartNativePrintJob(printJob);
380 PRINT_HILOGD("PrintManagerClient QueryPrinterProperties out ret = [%{public}d].", ret);
381 }
382 return ret;
383 }
384
SetPrinterPreference(const std::string & printerId,const PrinterPreferences & printerPreference)385 int32_t PrintManagerClient::SetPrinterPreference(
386 const std::string &printerId, const PrinterPreferences &printerPreference)
387 {
388 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
389 PRINT_HILOGI("PrintManagerClient SetPrinterPreference start.");
390 int32_t ret = E_PRINT_RPC_FAILURE;
391 if (LoadServer() && GetPrintServiceProxy()) {
392 ret = printServiceProxy_->SetPrinterPreference(printerId, printerPreference);
393 PRINT_HILOGI("PrintManagerClient SetPrinterPreference out ret = [%{public}d].", ret);
394 }
395 return ret;
396 }
397
AddPrinterToDiscovery(const PrinterInfo & printerInfo)398 int32_t PrintManagerClient::AddPrinterToDiscovery(const PrinterInfo &printerInfo)
399 {
400 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
401 PRINT_HILOGD("PrintManagerClient AddPrinterToDiscovery start.");
402 int32_t ret = E_PRINT_RPC_FAILURE;
403 if (LoadServer() && GetPrintServiceProxy()) {
404 ret = printServiceProxy_->AddPrinterToDiscovery(printerInfo);
405 PRINT_HILOGD("PrintManagerClient AddPrinterToDiscovery out ret = [%{public}d].", ret);
406 }
407 return ret;
408 }
409
UpdatePrinterInDiscovery(const PrinterInfo & printerInfo)410 int32_t PrintManagerClient::UpdatePrinterInDiscovery(const PrinterInfo &printerInfo)
411 {
412 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
413 printerInfo.Dump();
414
415 int32_t ret = E_PRINT_RPC_FAILURE;
416 if (LoadServer() && GetPrintServiceProxy()) {
417 ret = printServiceProxy_->UpdatePrinterInDiscovery(printerInfo);
418 PRINT_HILOGD("PrintManagerClient UpdatePrinterInDiscovery out ret = [%{public}d].", ret);
419 }
420 return ret;
421 }
422
RemovePrinterFromDiscovery(const std::string & printerId)423 int32_t PrintManagerClient::RemovePrinterFromDiscovery(const std::string &printerId)
424 {
425 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
426 PRINT_HILOGD("PrintManagerClient RemovePrinterFromDiscovery start.");
427 int32_t ret = E_PRINT_RPC_FAILURE;
428 if (LoadServer() && GetPrintServiceProxy()) {
429 ret = printServiceProxy_->RemovePrinterFromDiscovery(printerId);
430 PRINT_HILOGD("PrintManagerClient RemovePrinterFromDiscovery out ret = [%{public}d].", ret);
431 }
432 return ret;
433 }
434
UpdatePrinterInSystem(const PrinterInfo & printerInfo)435 int32_t PrintManagerClient::UpdatePrinterInSystem(const PrinterInfo &printerInfo)
436 {
437 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
438 printerInfo.Dump();
439
440 int32_t ret = E_PRINT_RPC_FAILURE;
441 if (LoadServer() && GetPrintServiceProxy()) {
442 ret = printServiceProxy_->UpdatePrinterInSystem(printerInfo);
443 PRINT_HILOGD("PrintManagerClient UpdatePrinterInSystem out ret = [%{public}d].", ret);
444 }
445 return ret;
446 }
447
QueryAllPrintJob(std::vector<PrintJob> & printJobs)448 int32_t PrintManagerClient::QueryAllPrintJob(std::vector<PrintJob> &printJobs)
449 {
450 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
451 PRINT_HILOGD("PrintManagerClient QueryAllPrintJob start.");
452 int32_t ret = E_PRINT_RPC_FAILURE;
453 if (LoadServer() && GetPrintServiceProxy()) {
454 ret = printServiceProxy_->QueryAllPrintJob(printJobs);
455 PRINT_HILOGD("PrintManagerClient QueryAllPrintJob out ret = [%{public}d].", ret);
456 }
457 return ret;
458 }
459
460
QueryAllActivePrintJob(std::vector<PrintJob> & printJobs)461 int32_t PrintManagerClient::QueryAllActivePrintJob(std::vector<PrintJob> &printJobs)
462 {
463 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
464 PRINT_HILOGD("PrintManagerClient QueryAllActivePrintJob start.");
465 int32_t ret = E_PRINT_RPC_FAILURE;
466 if (LoadServer() && GetPrintServiceProxy()) {
467 ret = printServiceProxy_->QueryAllActivePrintJob(printJobs);
468 PRINT_HILOGD("PrintManagerClient QueryAllActivePrintJob out ret = [%{public}d].", ret);
469 }
470 return ret;
471 }
472
QueryPrintJobById(std::string & printJobId,PrintJob & printjob)473 int32_t PrintManagerClient::QueryPrintJobById(std::string &printJobId, PrintJob &printjob)
474 {
475 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
476 PRINT_HILOGD("PrintManagerClient QueryPrintJobById start.");
477 int32_t ret = E_PRINT_RPC_FAILURE;
478 if (LoadServer() && GetPrintServiceProxy()) {
479 ret = printServiceProxy_->QueryPrintJobById(printJobId, printjob);
480 PRINT_HILOGD("PrintManagerClient QueryPrintJobById out ret = [%{public}d].", ret);
481 }
482 return ret;
483 }
484
AddPrinterToCups(const std::string & printerUri,const std::string & printerName,const std::string & printerMake)485 int32_t PrintManagerClient::AddPrinterToCups(const std::string &printerUri, const std::string &printerName,
486 const std::string &printerMake)
487 {
488 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
489 PRINT_HILOGD("PrintManagerClient AddPrinterToCups start.");
490 int32_t ret = E_PRINT_RPC_FAILURE;
491 if (LoadServer() && GetPrintServiceProxy()) {
492 ret = printServiceProxy_->AddPrinterToCups(printerUri, printerName, printerMake);
493 PRINT_HILOGD("PrintManagerClient AddPrinterToCups out ret = [%{public}d].", ret);
494 }
495 return ret;
496 }
497
QueryPrinterCapabilityByUri(const std::string & printerUri,const std::string & printerId,PrinterCapability & printerCaps)498 int32_t PrintManagerClient::QueryPrinterCapabilityByUri(const std::string &printerUri, const std::string &printerId,
499 PrinterCapability &printerCaps)
500 {
501 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
502 PRINT_HILOGD("PrintManagerClient QueryPrinterCapabilityByUri start.");
503 int32_t ret = E_PRINT_RPC_FAILURE;
504 if (LoadServer() && GetPrintServiceProxy()) {
505 ret = printServiceProxy_->QueryPrinterCapabilityByUri(printerUri, printerId, printerCaps);
506 PRINT_HILOGD("PrintManagerClient QueryPrinterCapabilityByUri out ret = [%{public}d].", ret);
507 }
508 return ret;
509 }
510
NotifyPrintServiceEvent(std::string & jobId,uint32_t event)511 int32_t PrintManagerClient::NotifyPrintServiceEvent(std::string &jobId, uint32_t event)
512 {
513 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
514 PRINT_HILOGD("PrintManagerClient NotifyPrintServiceEvent start.");
515 int32_t ret = E_PRINT_RPC_FAILURE;
516 if (LoadServer() && GetPrintServiceProxy()) {
517 ret = printServiceProxy_->NotifyPrintServiceEvent(jobId, event);
518 PRINT_HILOGD("PrintManagerClient NotifyPrintServiceEvent out ret = [%{public}d].", ret);
519 }
520 return ret;
521 }
522
SetDefaultPrinter(const std::string & printerId,uint32_t type)523 int32_t PrintManagerClient::SetDefaultPrinter(const std::string &printerId, uint32_t type)
524 {
525 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
526 PRINT_HILOGD("PrintManagerClient SetDefaultPrinter start.");
527 int32_t ret = E_PRINT_RPC_FAILURE;
528 if (LoadServer() && GetPrintServiceProxy()) {
529 ret = printServiceProxy_->SetDefaultPrinter(printerId, type);
530 PRINT_HILOGD("PrintManagerClient SetDefaultPrinter out ret = [%{public}d].", ret);
531 }
532 return ret;
533 }
534
DeletePrinterFromCups(const std::string & printerName)535 int32_t PrintManagerClient::DeletePrinterFromCups(const std::string &printerName)
536 {
537 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
538 PRINT_HILOGD("PrintManagerClient DeletePrinterFromCups start.");
539 int32_t ret = E_PRINT_RPC_FAILURE;
540 if (LoadServer() && GetPrintServiceProxy()) {
541 ret = printServiceProxy_->DeletePrinterFromCups(printerName);
542 PRINT_HILOGD("PrintManagerClient DeletePrinterFromCups out ret = [%{public}d].", ret);
543 }
544 return ret;
545 }
546
DiscoverUsbPrinters(std::vector<PrinterInfo> & printers)547 int32_t PrintManagerClient::DiscoverUsbPrinters(std::vector<PrinterInfo> &printers)
548 {
549 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
550 PRINT_HILOGD("PrintManagerClient DiscoverUsbPrinters start.");
551 int32_t ret = E_PRINT_RPC_FAILURE;
552 if (LoadServer() && GetPrintServiceProxy()) {
553 ret = printServiceProxy_->DiscoverUsbPrinters(printers);
554 PRINT_HILOGD("PrintManagerClient DiscoverUsbPrinters out ret = [%{public}d].", ret);
555 }
556 return ret;
557 }
558
On(const std::string & taskId,const std::string & type,const sptr<IPrintCallback> & listener)559 int32_t PrintManagerClient::On(const std::string &taskId, const std::string &type, const sptr<IPrintCallback> &listener)
560 {
561 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
562 PRINT_HILOGD("PrintManagerClient On start.");
563 int32_t ret = E_PRINT_RPC_FAILURE;
564 if (LoadServer() && GetPrintServiceProxy()) {
565 ret = printServiceProxy_->On(taskId, type, listener);
566 PRINT_HILOGD("PrintManagerClient On out ret = [%{public}d].", ret);
567 }
568 return ret;
569 }
570
Off(const std::string & taskId,const std::string & type)571 int32_t PrintManagerClient::Off(const std::string &taskId, const std::string &type)
572 {
573 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
574 PRINT_HILOGD("PrintManagerClient Off start.");
575 int32_t ret = E_PRINT_RPC_FAILURE;
576 if (LoadServer() && GetPrintServiceProxy()) {
577 ret = printServiceProxy_->Off(taskId, type);
578 PRINT_HILOGD("PrintManagerClient Off out ret = [%{public}d].", ret);
579 }
580 return ret;
581 }
582
Print(const std::string & printJobName,const sptr<IPrintCallback> & listener,const std::shared_ptr<PrintAttributes> & printAttributes)583 int32_t PrintManagerClient::Print(const std::string &printJobName, const sptr<IPrintCallback> &listener,
584 const std::shared_ptr<PrintAttributes> &printAttributes)
585 {
586 std::string taskId = "";
587 return Print(printJobName, listener, *printAttributes, taskId, nullptr);
588 }
589
Print(const std::string & printJobName,const sptr<IPrintCallback> & listener,const std::shared_ptr<PrintAttributes> & printAttributes,void * contextToken)590 int32_t PrintManagerClient::Print(const std::string &printJobName, const sptr<IPrintCallback> &listener,
591 const std::shared_ptr<PrintAttributes> &printAttributes, void* contextToken)
592 {
593 std::string taskId = "";
594 return Print(printJobName, listener, *printAttributes, taskId, contextToken);
595 }
596
Print(const std::string & printJobName,const sptr<IPrintCallback> & listener,const PrintAttributes & printAttributes)597 int32_t PrintManagerClient::Print(const std::string &printJobName, const sptr<IPrintCallback> &listener,
598 const PrintAttributes &printAttributes)
599 {
600 std::string taskId = "";
601 return Print(printJobName, listener, printAttributes, taskId, nullptr);
602 }
603
Print(const std::string & printJobName,const sptr<IPrintCallback> & listener,const PrintAttributes & printAttributes,void * contextToken)604 int32_t PrintManagerClient::Print(const std::string &printJobName, const sptr<IPrintCallback> &listener,
605 const PrintAttributes &printAttributes, void* contextToken)
606 {
607 std::string taskId = "";
608 return Print(printJobName, listener, printAttributes, taskId, contextToken);
609 }
610
Print(const std::string & printJobName,const sptr<IPrintCallback> & listener,const PrintAttributes & printAttributes,std::string & taskId)611 int32_t PrintManagerClient::Print(const std::string &printJobName, const sptr<IPrintCallback> &listener,
612 const PrintAttributes &printAttributes, std::string &taskId)
613 {
614 return Print(printJobName, listener, printAttributes, taskId, nullptr);
615 }
616
Print(const std::string & printJobName,const sptr<IPrintCallback> & listener,const PrintAttributes & printAttributes,std::string & taskId,void * uiContent)617 int32_t PrintManagerClient::Print(const std::string &printJobName, const sptr<IPrintCallback> &listener,
618 const PrintAttributes &printAttributes, std::string &taskId, void* uiContent)
619 {
620 if (uiContent == nullptr) {
621 PRINT_HILOGE("uiContent is nullptr.");
622 return E_PRINT_INVALID_PARAMETER;
623 }
624 PRINT_HILOGI("PrintManagerClient Print start.");
625 if (taskId.empty()) {
626 taskId = PrintUtils::GetPrintJobId();
627 std::shared_ptr<AdapterParam> adapterParam = std::make_shared<AdapterParam>();
628 if (adapterParam == nullptr) {
629 PRINT_HILOGE("create adapterParam failed.");
630 return E_PRINT_SERVER_FAILURE;
631 }
632 adapterParam->documentName = printJobName;
633 adapterParam->isCheckFdList = false;
634 adapterParam->printAttributes = printAttributes;
635 AAFwk::Want want;
636 SetWantParam(want, taskId);
637 PrintUtils::BuildAdapterParam(adapterParam, want);
638
639 OHOS::Ace::ModalUIExtensionConfig config;
640 config.isProhibitBack = true;
641 auto printUiContent = static_cast<OHOS::Ace::UIContent *>(uiContent);
642 auto callback = std::make_shared<PrintInnerkitModalUICallback>(printUiContent);
643 OHOS::Ace::ModalUIExtensionCallbacks extensionCallbacks = {
644 [callback](int32_t releaseCode) { callback->OnRelease(releaseCode); },
645 [callback](int32_t resultCode, const OHOS::AAFwk::Want& result) {
646 callback->OnResultForModal(resultCode, result);
647 },
648 [callback](const OHOS::AAFwk::WantParams& request) { callback->OnReceive(request); },
649 [callback](int32_t code, const std::string& name, const std::string& message) {
650 callback->OnError(code, name, message);
651 }
652 };
653 int32_t sessionId = printUiContent->CreateModalUIExtension(want, extensionCallbacks, config);
654 PRINT_HILOGI("StartUIExtensionAbility sessionId %{public}d", sessionId);
655 if (callback != nullptr) {
656 callback->SetSessionId(sessionId);
657 }
658 }
659
660 auto func = [printJobName, listener, printAttributes, &taskId](sptr<IPrintService> serviceProxy) {
661 serviceProxy->On("", PRINT_CALLBACK_ADAPTER, listener);
662 return serviceProxy->PrintByAdapter(printJobName, printAttributes, taskId);
663 };
664 return CALL_COMMON_CLIENT(func);
665 }
666
SetWantParam(AAFwk::Want & want,std::string & taskId)667 void PrintManagerClient::SetWantParam(AAFwk::Want &want, std::string &taskId)
668 {
669 std::vector<std::string> fileList;
670 want.SetElementName(SPOOLER_BUNDLE_NAME, SPOOLER_PREVIEW_ABILITY_NAME);
671 want.SetParam(LAUNCH_PARAMETER_JOB_ID, taskId);
672 want.SetParam(LAUNCH_PARAMETER_FILE_LIST, fileList);
673 int32_t callerTokenId = static_cast<int32_t>(IPCSkeleton::GetCallingTokenID());
674 int32_t callerUid = IPCSkeleton::GetCallingUid();
675 int32_t callerPid = IPCSkeleton::GetCallingPid();
676 std::string callerPkg = PrintUtils::GetBundleNameForUid(callerUid);
677 want.SetParam(AAFwk::Want::PARAM_RESV_CALLER_TOKEN, callerTokenId);
678 want.SetParam(AAFwk::Want::PARAM_RESV_CALLER_UID, callerUid);
679 want.SetParam(AAFwk::Want::PARAM_RESV_CALLER_PID, callerPid);
680 want.SetParam(CALLER_PKG_NAME, callerPkg);
681 want.SetParam(UI_EXTENSION_TYPE_NAME, PRINT_UI_EXTENSION_TYPE);
682 want.SetParam(TOKEN_KEY, true);
683 }
684
StartGetPrintFile(const std::string & jobId,const PrintAttributes & printAttributes,const uint32_t fd)685 int32_t PrintManagerClient::StartGetPrintFile(const std::string &jobId, const PrintAttributes &printAttributes,
686 const uint32_t fd)
687 {
688 auto func = [jobId, printAttributes, fd](sptr<IPrintService> serviceProxy) {
689 return serviceProxy->StartGetPrintFile(jobId, printAttributes, fd);
690 };
691 return CALL_COMMON_CLIENT(func);
692 }
693
NotifyPrintService(const std::string & jobId,const std::string & type)694 int32_t PrintManagerClient::NotifyPrintService(const std::string &jobId, const std::string &type)
695 {
696 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
697 PRINT_HILOGD("PrintManagerClient NotifyPrintService start.");
698 int32_t ret = E_PRINT_RPC_FAILURE;
699 if (LoadServer() && GetPrintServiceProxy()) {
700 ret = printServiceProxy_->NotifyPrintService(jobId, type);
701 PRINT_HILOGD("PrintManagerClient NotifyPrintService out ret = [%{public}d].", ret);
702 }
703 return ret;
704 }
705
runBase(const char * callerFunName,std::function<int32_t (sptr<IPrintService>)> func)706 int32_t PrintManagerClient::runBase(const char* callerFunName, std::function<int32_t(sptr<IPrintService>)> func)
707 {
708 PRINT_HILOGI("PrintManagerClient %{public}s start.", callerFunName);
709 int32_t ret = E_PRINT_RPC_FAILURE;
710 if (!LoadServer()) {
711 PRINT_HILOGE("LoadServer error");
712 return ret;
713 }
714
715 if (!GetPrintServiceProxy()) {
716 PRINT_HILOGE("GetPrintServiceProxy error");
717 return ret;
718 }
719
720 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
721 ret = func(printServiceProxy_);
722 PRINT_HILOGI("PrintManagerClient %{public}s end ret = [%{public}d].", callerFunName, ret);
723 return ret;
724 }
725
RegisterExtCallback(const std::string & extensionId,uint32_t callbackId,PrintExtCallback cb)726 int32_t PrintManagerClient::RegisterExtCallback(const std::string &extensionId,
727 uint32_t callbackId, PrintExtCallback cb)
728 {
729 PRINT_HILOGD("PrintManagerClient RegisterExtCallback start.");
730 if (callbackId >= PRINT_EXTCB_MAX) {
731 PRINT_HILOGE("Invalid callback id [%{public}d].", callbackId);
732 return E_PRINT_INVALID_PARAMETER;
733 }
734 sptr<PrintExtensionCallbackStub> callbackStub = nullptr;
735 std::string extensionCID = PrintUtils::EncodeExtensionCid(extensionId, callbackId);
736 auto it = extCallbackMap_.find(extensionCID);
737 if (it == extCallbackMap_.end()) {
738 callbackStub = new (std::nothrow) PrintExtensionCallbackStub;
739 if (callbackStub != nullptr) {
740 callbackStub->SetExtCallback(cb);
741 extCallbackMap_.insert(std::make_pair(extensionCID, callbackStub));
742 }
743 } else {
744 callbackStub = it->second;
745 callbackStub->SetExtCallback(cb);
746 }
747 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
748 int32_t ret = E_PRINT_RPC_FAILURE;
749 if (LoadServer() && GetPrintServiceProxy()) {
750 ret = printServiceProxy_->RegisterExtCallback(extensionCID, callbackStub);
751 PRINT_HILOGD("PrintManagerClient RegisterExtCallback out ret = [%{public}d].", ret);
752 }
753 return ret;
754 }
755
RegisterExtCallback(const std::string & extensionId,uint32_t callbackId,PrintJobCallback cb)756 int32_t PrintManagerClient::RegisterExtCallback(const std::string &extensionId,
757 uint32_t callbackId, PrintJobCallback cb)
758 {
759 PRINT_HILOGD("PrintManagerClient RegisterExtCallback start.");
760 if (callbackId >= PRINT_EXTCB_MAX) {
761 PRINT_HILOGE("Invalid callback id [%{public}d].", callbackId);
762 return E_PRINT_INVALID_PARAMETER;
763 }
764
765 sptr<PrintExtensionCallbackStub> callbackStub = nullptr;
766 std::string extensionCID = PrintUtils::EncodeExtensionCid(extensionId, callbackId);
767 auto it = extCallbackMap_.find(extensionCID);
768 if (it == extCallbackMap_.end()) {
769 callbackStub = new (std::nothrow) PrintExtensionCallbackStub;
770 if (callbackStub != nullptr) {
771 callbackStub->SetPrintJobCallback(cb);
772 extCallbackMap_.insert(std::make_pair(extensionCID, callbackStub));
773 }
774 } else {
775 callbackStub = it->second;
776 callbackStub->SetPrintJobCallback(cb);
777 }
778 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
779 int32_t ret = E_PRINT_RPC_FAILURE;
780 if (LoadServer() && GetPrintServiceProxy()) {
781 ret = printServiceProxy_->RegisterExtCallback(extensionCID, callbackStub);
782 PRINT_HILOGD("PrintManagerClient RegisterExtCallback out ret = [%{public}d].", ret);
783 }
784 return ret;
785 }
786
RegisterExtCallback(const std::string & extensionId,uint32_t callbackId,PrinterCapabilityCallback cb)787 int32_t PrintManagerClient::RegisterExtCallback(const std::string &extensionId,
788 uint32_t callbackId, PrinterCapabilityCallback cb)
789 {
790 PRINT_HILOGD("PrintManagerClient RegisterExtCallback start.");
791 if (callbackId >= PRINT_EXTCB_MAX) {
792 PRINT_HILOGE("Invalid callback id [%{public}d].", callbackId);
793 return E_PRINT_INVALID_PARAMETER;
794 }
795
796 sptr<PrintExtensionCallbackStub> callbackStub = nullptr;
797 std::string extensionCID = PrintUtils::EncodeExtensionCid(extensionId, callbackId);
798 auto it = extCallbackMap_.find(extensionCID);
799 if (it == extCallbackMap_.end()) {
800 callbackStub = new (std::nothrow) PrintExtensionCallbackStub;
801 if (callbackStub != nullptr) {
802 callbackStub->SetCapabilityCallback(cb);
803 extCallbackMap_.insert(std::make_pair(extensionCID, callbackStub));
804 }
805 } else {
806 callbackStub = it->second;
807 callbackStub->SetCapabilityCallback(cb);
808 }
809 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
810 int32_t ret = E_PRINT_RPC_FAILURE;
811 if (LoadServer() && GetPrintServiceProxy()) {
812 ret = printServiceProxy_->RegisterExtCallback(extensionCID, callbackStub);
813 PRINT_HILOGD("PrintManagerClient RegisterExtCallback out ret = [%{public}d].", ret);
814 }
815 return ret;
816 }
817
RegisterExtCallback(const std::string & extensionId,uint32_t callbackId,PrinterCallback cb)818 int32_t PrintManagerClient::RegisterExtCallback(const std::string &extensionId,
819 uint32_t callbackId, PrinterCallback cb)
820 {
821 PRINT_HILOGD("PrintManagerClient RegisterExtCallback start.");
822 if (callbackId >= PRINT_EXTCB_MAX) {
823 PRINT_HILOGE("Invalid callback id [%{public}d].", callbackId);
824 return E_PRINT_INVALID_PARAMETER;
825 }
826
827 sptr<PrintExtensionCallbackStub> callbackStub = nullptr;
828 std::string extensionCID = PrintUtils::EncodeExtensionCid(extensionId, callbackId);
829 auto it = extCallbackMap_.find(extensionCID);
830 if (it == extCallbackMap_.end()) {
831 callbackStub = new (std::nothrow) PrintExtensionCallbackStub;
832 if (callbackStub != nullptr) {
833 callbackStub->SetPrinterCallback(cb);
834 extCallbackMap_.insert(std::make_pair(extensionCID, callbackStub));
835 }
836 } else {
837 callbackStub = it->second;
838 callbackStub->SetPrinterCallback(cb);
839 }
840 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
841 int32_t ret = E_PRINT_RPC_FAILURE;
842 if (LoadServer() && GetPrintServiceProxy()) {
843 ret = printServiceProxy_->RegisterExtCallback(extensionCID, callbackStub);
844 PRINT_HILOGD("PrintManagerClient RegisterExtCallback out ret = [%{public}d].", ret);
845 }
846 return ret;
847 }
848
UnregisterAllExtCallback(const std::string & extensionId)849 int32_t PrintManagerClient::UnregisterAllExtCallback(const std::string &extensionId)
850 {
851 int32_t ret = E_PRINT_RPC_FAILURE;
852 {
853 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
854 PRINT_HILOGD("PrintManagerClient UnregisterAllExtCallback start.");
855 if (LoadServer() && GetPrintServiceProxy()) {
856 ret = printServiceProxy_->UnregisterAllExtCallback(extensionId);
857 PRINT_HILOGD("PrintManagerClient UnregisterAllExtCallback out ret = [%{public}d].", ret);
858 }
859 }
860 extCallbackMap_.clear();
861 return ret;
862 }
863
SetNativePrinterChangeCallback(const std::string & type,NativePrinterChangeCallback cb)864 int32_t PrintManagerClient::SetNativePrinterChangeCallback(const std::string &type, NativePrinterChangeCallback cb)
865 {
866 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
867 int32_t ret = E_PRINT_RPC_FAILURE;
868 PRINT_HILOGI("PrintManagerClient SetNativePrinterChangeCallback start");
869 if (LoadServer() && GetPrintServiceProxy()) {
870 if (cb != nullptr) {
871 sptr<PrintCallback> callback = new (std::nothrow) PrintCallback;
872 if (callback != nullptr) {
873 callback->SetNativePrinterChangeCallback(cb);
874 ret = printServiceProxy_->RegisterPrinterCallback(type, callback);
875 } else {
876 ret = E_PRINT_GENERIC_FAILURE;
877 }
878 } else {
879 ret = printServiceProxy_->UnregisterPrinterCallback(type);
880 }
881 }
882 PRINT_HILOGD("PrintManagerClient SetNativePrinterChangeCallback out ret = [%{public}d].", ret);
883 return ret;
884 }
885
LoadExtSuccess(const std::string & extensionId)886 int32_t PrintManagerClient::LoadExtSuccess(const std::string &extensionId)
887 {
888 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
889 PRINT_HILOGD("PrintManagerClient LoadExtSuccess start.");
890 int32_t ret = E_PRINT_RPC_FAILURE;
891 if (LoadServer() && GetPrintServiceProxy()) {
892 ret = printServiceProxy_->LoadExtSuccess(extensionId);
893 PRINT_HILOGD("PrintManagerClient LoadExtSuccess out ret = [%{public}d].", ret);
894 }
895 return ret;
896 }
897
LoadServer()898 bool PrintManagerClient::LoadServer()
899 {
900 {
901 std::unique_lock<std::mutex> lock(conditionMutex_);
902 if (ready_) {
903 return true;
904 }
905 }
906
907 std::lock_guard<std::mutex> lock(loadMutex_);
908 auto sm = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
909 if (sm == nullptr) {
910 PRINT_HILOGE("GetSystemAbilityManager return null");
911 return false;
912 }
913
914 sptr<PrintSyncLoadCallback> loadCallback_ = new (std::nothrow) PrintSyncLoadCallback();
915 if (loadCallback_ == nullptr) {
916 PRINT_HILOGE("new PrintSyncLoadCallback fail");
917 return false;
918 }
919
920 int32_t result = sm->LoadSystemAbility(PRINT_SERVICE_ID, loadCallback_);
921 if (result != ERR_OK) {
922 PRINT_HILOGE("LoadSystemAbility %{public}d failed, result: %{public}d", PRINT_SERVICE_ID, result);
923 return false;
924 }
925
926 {
927 std::unique_lock<std::mutex> conditionLock(conditionMutex_);
928 auto waitStatus = syncCon_.wait_for(
929 conditionLock, std::chrono::milliseconds(LOAD_SA_TIMEOUT_MS), [this]() { return ready_; });
930 if (!waitStatus) {
931 PRINT_HILOGE("print server load sa timeout");
932 return false;
933 }
934 }
935 return true;
936 }
937
LoadServerSuccess()938 void PrintManagerClient::LoadServerSuccess()
939 {
940 std::unique_lock<std::mutex> lock(conditionMutex_);
941 ready_ = true;
942 syncCon_.notify_one();
943 PRINT_HILOGD("load print server success");
944 }
945
LoadServerFail()946 void PrintManagerClient::LoadServerFail()
947 {
948 std::unique_lock<std::mutex> lock(conditionMutex_);
949 ready_ = false;
950 PRINT_HILOGE("load print server fail");
951 }
SetProxy(const sptr<IRemoteObject> & obj)952 void PrintManagerClient::SetProxy(const sptr<IRemoteObject> &obj)
953 {
954 if (printServiceProxy_ != nullptr) {
955 auto serviceRemote = printServiceProxy_->AsObject();
956 if (serviceRemote != nullptr) {
957 serviceRemote->RemoveDeathRecipient(deathRecipient_);
958 printServiceProxy_ = nullptr;
959 deathRecipient_ = nullptr;
960 }
961 }
962 deathRecipient_ = new (std::nothrow) PrintSaDeathRecipient();
963 if (deathRecipient_ != nullptr) {
964 obj->AddDeathRecipient(deathRecipient_);
965 PRINT_HILOGD("Getting PrintManagerClientProxy succeeded.");
966 }
967 printServiceProxy_ = iface_cast<IPrintService>(obj);
968 }
ResetProxy()969 void PrintManagerClient::ResetProxy()
970 {
971 printServiceProxy_ = nullptr;
972 }
973
Init()974 int32_t PrintManagerClient::Init()
975 {
976 std::lock_guard<std::recursive_mutex> lock(proxyLock_);
977 PRINT_HILOGI("nativePrint Init start.");
978 int32_t ret = E_PRINT_RPC_FAILURE;
979 if (LoadServer() && GetPrintServiceProxy()) {
980 ret = printServiceProxy_->StartService();
981 }
982 PRINT_HILOGD("PrintManagerClient Init out ret = [%{public}d].", ret);
983 return ret;
984 }
985
Release()986 int32_t PrintManagerClient::Release()
987 {
988 SetNativePrinterChangeCallback(PRINTER_DISCOVER_EVENT_TYPE, nullptr);
989 SetNativePrinterChangeCallback(PRINTER_CHANGE_EVENT_TYPE, nullptr);
990 return E_PRINT_NONE;
991 }
992 } // namespace OHOS::Print
993