• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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