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