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