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 "print_service_stub.h"
17 #include "ipc_skeleton.h"
18 #include "iprint_service.h"
19 #include "message_parcel.h"
20 #include "print_constant.h"
21 #include "print_extension_info.h"
22 #include "print_job.h"
23 #include "print_log.h"
24 
25 namespace OHOS::Print {
26 using namespace OHOS::HiviewDFX;
27 
PrintServiceStub()28 PrintServiceStub::PrintServiceStub()
29 {
30     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_START_PRINT] = &PrintServiceStub::OnStartPrint;
31     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_STOP_PRINT] = &PrintServiceStub::OnStopPrint;
32     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_CONNECTPRINTER] = &PrintServiceStub::OnConnectPrinter;
33     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_DISCONNECTPRINTER] = &PrintServiceStub::OnDisconnectPrinter;
34     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_STARTDISCOVERPRINTER] = &PrintServiceStub::OnStartDiscoverPrinter;
35     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_STOPDISCOVERPRINTER] = &PrintServiceStub::OnStopDiscoverPrint;
36     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_QUERYALLEXTENSION] = &PrintServiceStub::OnQueryAllExtension;
37     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_STARTPRINTJOB] = &PrintServiceStub::OnStartPrintJob;
38     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_CANCELPRINTJOB] = &PrintServiceStub::OnCancelPrintJob;
39     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_ADDPRINTERS] = &PrintServiceStub::OnAddPrinters;
40     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_REMOVEPRINTERS] = &PrintServiceStub::OnRemovePrinters;
41     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_UPDATEPRINTERS] = &PrintServiceStub::OnUpdatePrinters;
42     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_UPDATEPRINTERSTATE] = &PrintServiceStub::OnUpdatePrinterState;
43     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_UPDATEPRINTJOBSTATE] =
44         &PrintServiceStub::OnUpdatePrintJobStateOnlyForSystemApp;
45     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_UPDATEEXTENSIONINFO] = &PrintServiceStub::OnUpdateExtensionInfo;
46     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_REQUESTPREVIEW] = &PrintServiceStub::OnRequestPreview;
47     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_QUERYPRINTERCAPABILITY] =
48         &PrintServiceStub::OnQueryPrinterCapability;
49     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_ON] = &PrintServiceStub::OnEventOn;
50     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_OFF] = &PrintServiceStub::OnEventOff;
51     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_REG_EXT_CB] = &PrintServiceStub::OnRegisterExtCallback;
52     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_UNREG_EXT_CB] = &PrintServiceStub::OnUnregisterAllExtCallback;
53     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_LOAD_EXT] = &PrintServiceStub::OnLoadExtSuccess;
54     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_QUERYALLPRINTJOB] = &PrintServiceStub::OnQueryAllPrintJob;
55     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_QUERYPRINTJOBBYID] = &PrintServiceStub::OnQueryPrintJobById;
56     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_ADDPRINTERTOCUPS] = &PrintServiceStub::OnAddPrinterToCups;
57     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_QUERYPRINTERCAPABILITYBYURI] =
58         &PrintServiceStub::OnQueryPrinterCapabilityByUri;
59     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_STARTPRINTJOB_BY_ADAPTER] = &PrintServiceStub::OnPrintByAdapter;
60     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_START_GET_FILE] = &PrintServiceStub::OnStartGetPrintFile;
61     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_NOTIFY_PRINT_SERVICE] = &PrintServiceStub::OnNotifyPrintService;
62     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_START_SERVICE] = &PrintServiceStub::OnStartService;
63     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_REG_PRINTER_CB] = &PrintServiceStub::OnRegisterPrinterCallback;
64     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_UNREG_PRINTER_CB] = &PrintServiceStub::OnUnregisterPrinterCallback;
65     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_QUERYPRINTERINFOBYPRINTERID] =
66         &PrintServiceStub::OnQueryPrinterInfoByPrinterId;
67     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_QUERYADDEDPRINTER] = &PrintServiceStub::OnQueryAddedPrinter;
68     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_QUERYPRINTERPROPERTIES] =
69         &PrintServiceStub::OnQueryPrinterProperties;
70     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_STARTNATIVEPRINTJOB] = &PrintServiceStub::OnStartNativePrintJob;
71     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_NOTIFY_PRINT_SERVICE_EVENT] =
72         &PrintServiceStub::OnNotifyPrintServiceEvent;
73     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_GET_PRINTER_PREFERENCE] =
74         &PrintServiceStub::OnGetPrinterPreference;
75     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_SET_PRINTER_PREFERENCE] =
76         &PrintServiceStub::OnSetPrinterPreference;
77     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_SET_DEFAULT_PRINTERID] = &PrintServiceStub::OnSetDefaultPrinter;
78     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_DELETE_PRINTER_FROM_CUPS] =
79         &PrintServiceStub::OnDeletePrinterFromCups;
80     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_DISCOVER_USB_PRINTERS] = &PrintServiceStub::OnDiscoverUsbPrinters;
81     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_ADDPRINTERTODISCOVERY] = &PrintServiceStub::OnAddPrinterToDiscovery;
82     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_UPDATEPRINTERINDISCOVERY] =
83         &PrintServiceStub::OnUpdatePrinterInDiscovery;
84     cmdMap_[OHOS::Print::IPrintInterfaceCode::CMD_REMOVEPRINTERFROMDISCOVERY] =
85         &PrintServiceStub::OnRemovePrinterFromDiscovery;
86 }
87 
OnRemoteRequest( uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)88 int32_t PrintServiceStub::OnRemoteRequest(
89     uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)
90 {
91     PRINT_HILOGD("OnRemoteRequest started, code = %{public}d", code);
92     auto descriptorToken = data.ReadInterfaceToken();
93     if (descriptorToken != GetDescriptor()) {
94         PRINT_HILOGE("Remote descriptor not the same as local descriptor.");
95         return E_PRINT_RPC_FAILURE;
96     }
97 
98     auto itFunc = cmdMap_.find(code);
99     if (itFunc != cmdMap_.end()) {
100         auto requestFunc = itFunc->second;
101         if (requestFunc != nullptr) {
102             bool result = (this->*requestFunc)(data, reply);
103             return result ? E_PRINT_NONE : E_PRINT_GENERIC_FAILURE;
104         }
105     }
106     PRINT_HILOGW("default case, need check.");
107     return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
108 }
109 
OnStartService(MessageParcel &data, MessageParcel &reply)110 bool PrintServiceStub::OnStartService(MessageParcel &data, MessageParcel &reply)
111 {
112     PRINT_HILOGD("nativePrint PrintServiceStub::OnStartService in");
113     int32_t ret = E_PRINT_INVALID_PARAMETER;
114     if (data.ReadString() == "nativePrint") {
115         ret = StartService();
116         reply.WriteInt32(ret);
117         PRINT_HILOGI("nativePrint PrintServiceStub::OnStartService out:%{public}d", ret);
118     }
119     return ret == E_PRINT_NONE;
120 }
121 
OnStartPrint(MessageParcel &data, MessageParcel &reply)122 bool PrintServiceStub::OnStartPrint(MessageParcel &data, MessageParcel &reply)
123 {
124     PRINT_HILOGI("PrintServiceStub::OnStartPrint in");
125     std::vector<std::string> fileList;
126     std::vector<uint32_t> fdList;
127 
128     if (data.ReadBool()) {
129         data.ReadStringVector(&fileList);
130         PRINT_HILOGD("Current file is %{public}zd", fileList.size());
131         if (fileList.size() > PRINT_MAX_PRINT_COUNT) {
132             PRINT_HILOGE("fileList'size is out of range.");
133             reply.WriteInt32(E_PRINT_INVALID_PARAMETER);
134             return false;
135         }
136     }
137 
138     if (data.ReadBool()) {
139         int32_t len = data.ReadInt32();
140         if (len > PRINT_MAX_PRINT_COUNT) {
141             PRINT_HILOGE("len is out of range.");
142             reply.WriteInt32(E_PRINT_INVALID_PARAMETER);
143             return false;
144         }
145         for (int32_t index = 0; index < len; index++) {
146             uint32_t fd = static_cast<uint32_t>(data.ReadFileDescriptor());
147             PRINT_HILOGD("fdList[%{public}d] = %{public}d", index, fd);
148             fdList.emplace_back(fd);
149         }
150     }
151     std::string taskId = data.ReadString();
152     int32_t ret = StartPrint(fileList, fdList, taskId);
153     reply.WriteInt32(ret);
154     PRINT_HILOGD("PrintServiceStub::OnStartPrint out");
155     return ret == E_PRINT_NONE;
156 }
157 
OnStopPrint(MessageParcel &data, MessageParcel &reply)158 bool PrintServiceStub::OnStopPrint(MessageParcel &data, MessageParcel &reply)
159 {
160     PRINT_HILOGI("PrintServiceStub::OnStopPrint in");
161     std::string taskId = data.ReadString();
162     int32_t ret = StopPrint(taskId);
163     reply.WriteInt32(ret);
164     PRINT_HILOGD("PrintServiceStub::OnStopPrint out");
165     return ret == E_PRINT_NONE;
166 }
167 
OnConnectPrinter(MessageParcel &data, MessageParcel &reply)168 bool PrintServiceStub::OnConnectPrinter(MessageParcel &data, MessageParcel &reply)
169 {
170     PRINT_HILOGI("PrintServiceStub::OnConnectPrinter in");
171     int32_t ret = ConnectPrinter(data.ReadString());
172     reply.WriteInt32(ret);
173     PRINT_HILOGD("PrintServiceStub::OnConnectPrinter out");
174     return ret == E_PRINT_NONE;
175 }
176 
OnDisconnectPrinter(MessageParcel &data, MessageParcel &reply)177 bool PrintServiceStub::OnDisconnectPrinter(MessageParcel &data, MessageParcel &reply)
178 {
179     PRINT_HILOGI("PrintServiceStub::OnDisconnectPrinter in");
180     int32_t ret = DisconnectPrinter(data.ReadString());
181     reply.WriteInt32(ret);
182     PRINT_HILOGD("PrintServiceStub::OnDisconnectPrinter out");
183     return ret == E_PRINT_NONE;
184 }
185 
OnStartDiscoverPrinter(MessageParcel &data, MessageParcel &reply)186 bool PrintServiceStub::OnStartDiscoverPrinter(MessageParcel &data, MessageParcel &reply)
187 {
188     PRINT_HILOGI("PrintServiceStub::OnStartDiscoverPrinter in");
189     std::vector<std::string> extensionList;
190     data.ReadStringVector(&extensionList);
191     int32_t ret = StartDiscoverPrinter(extensionList);
192     reply.WriteInt32(ret);
193     PRINT_HILOGD("PrintServiceStub::OnStartDiscoverPrinter out");
194     return ret == E_PRINT_NONE;
195 }
196 
OnStopDiscoverPrint(MessageParcel &data, MessageParcel &reply)197 bool PrintServiceStub::OnStopDiscoverPrint(MessageParcel &data, MessageParcel &reply)
198 {
199     PRINT_HILOGI("PrintServiceStub::OnStopDiscoverPrint in");
200     int32_t ret = StopDiscoverPrinter();
201     reply.WriteInt32(ret);
202     PRINT_HILOGD("PrintServiceStub::OnStopDiscoverPrint out");
203     return ret == E_PRINT_NONE;
204 }
205 
OnQueryAllExtension(MessageParcel &data, MessageParcel &reply)206 bool PrintServiceStub::OnQueryAllExtension(MessageParcel &data, MessageParcel &reply)
207 {
208     PRINT_HILOGI("PrintServiceStub::OnQueryAllExtension in");
209     std::vector<PrintExtensionInfo> printerInfo;
210     int32_t ret = QueryAllExtension(printerInfo);
211     reply.WriteInt32(ret);
212     if (ret == E_PRINT_NONE) {
213         uint32_t size = static_cast<uint32_t>(printerInfo.size());
214         reply.WriteUint32(size);
215         for (uint32_t index = 0; index < size; index++) {
216             printerInfo[index].Marshalling(reply);
217         }
218     }
219     PRINT_HILOGD("PrintServiceStub::OnQueryAllExtension out");
220     return ret == E_PRINT_NONE;
221 }
222 
OnStartPrintJob(MessageParcel &data, MessageParcel &reply)223 bool PrintServiceStub::OnStartPrintJob(MessageParcel &data, MessageParcel &reply)
224 {
225     PRINT_HILOGI("PrintServiceStub::OnStartPrintJob in");
226     int32_t ret = E_PRINT_RPC_FAILURE;
227     auto jobInfoPtr = PrintJob::Unmarshalling(data);
228     if (jobInfoPtr != nullptr) {
229         jobInfoPtr->Dump();
230         ret = StartPrintJob(*jobInfoPtr);
231     }
232     reply.WriteInt32(ret);
233     PRINT_HILOGD("PrintServiceStub::OnStartPrintJob out");
234     return ret == E_PRINT_NONE;
235 }
236 
OnCancelPrintJob(MessageParcel &data, MessageParcel &reply)237 bool PrintServiceStub::OnCancelPrintJob(MessageParcel &data, MessageParcel &reply)
238 {
239     PRINT_HILOGI("PrintServiceStub::OnCancelPrintJob in");
240     int32_t ret = CancelPrintJob(data.ReadString());
241     reply.WriteInt32(ret);
242     PRINT_HILOGD("PrintServiceStub::OnStartPrintJob out");
243     return ret == E_PRINT_NONE;
244 }
245 
OnAddPrinters(MessageParcel &data, MessageParcel &reply)246 bool PrintServiceStub::OnAddPrinters(MessageParcel &data, MessageParcel &reply)
247 {
248     PRINT_HILOGI("PrintServiceStub::OnAddPrinters in");
249     std::vector<PrinterInfo> printerInfos;
250     uint32_t len = 0;
251     if (!data.ReadUint32(len)) {
252         PRINT_HILOGE("read data len failed.");
253         return false;
254     }
255     PRINT_HILOGD("OnStartDiscoverPrinter len = %{public}d", len);
256 
257     if (len > PRINT_MAX_PRINT_COUNT) {
258         PRINT_HILOGE("len is out of range.");
259         reply.WriteInt32(E_PRINT_INVALID_PARAMETER);
260         return false;
261     }
262     for (uint32_t i = 0; i < len; i++) {
263         auto infoPtr = PrinterInfo::Unmarshalling(data);
264         if (infoPtr == nullptr) {
265             PRINT_HILOGW("invalid printer object");
266             continue;
267         }
268         infoPtr->Dump();
269         printerInfos.emplace_back(*infoPtr);
270     }
271     int32_t ret = E_PRINT_RPC_FAILURE;
272     if (printerInfos.size() > 0) {
273         ret = AddPrinters(printerInfos);
274     }
275     reply.WriteInt32(ret);
276     PRINT_HILOGD("PrintServiceStub::OnAddPrinters out");
277     return ret == E_PRINT_NONE;
278 }
279 
OnQueryPrinterInfoByPrinterId(MessageParcel &data, MessageParcel &reply)280 bool PrintServiceStub::OnQueryPrinterInfoByPrinterId(MessageParcel &data, MessageParcel &reply)
281 {
282     PRINT_HILOGI("PrintServiceStub::OnQueryPrinterInfoByPrinterId in");
283     std::string printerId = data.ReadString();
284     PrinterInfo info;
285     int32_t ret = QueryPrinterInfoByPrinterId(printerId, info);
286     reply.WriteInt32(ret);
287     PRINT_HILOGI("PrintServiceStub::OnQueryPrinterInfoByPrinterId out %{public}s", info.GetPrinterName().c_str());
288     info.Marshalling(reply);
289     PRINT_HILOGI("PrintServiceStub::OnQueryPrinterInfoByPrinterId out");
290     return ret == E_PRINT_NONE;
291 }
292 
OnGetPrinterPreference(MessageParcel &data, MessageParcel &reply)293 bool PrintServiceStub::OnGetPrinterPreference(MessageParcel &data, MessageParcel &reply)
294 {
295     PRINT_HILOGI("PrintServiceStub::OnGetPrinterPreference in");
296     std::string printerId = data.ReadString();
297     std::string printPreference;
298     int32_t ret = GetPrinterPreference(printerId, printPreference);
299     reply.WriteInt32(ret);
300     reply.WriteString(printPreference);
301     return ret == E_PRINT_NONE;
302 }
303 
OnSetPrinterPreference(MessageParcel &data, MessageParcel &reply)304 bool PrintServiceStub::OnSetPrinterPreference(MessageParcel &data, MessageParcel &reply)
305 {
306     PRINT_HILOGI("PrintServiceStub::OnSetPrinterPreference in");
307     std::string printerId = data.ReadString();
308     std::string printPreference = data.ReadString();
309     int32_t ret = SetPrinterPreference(printerId, printPreference);
310     reply.WriteInt32(ret);
311     return ret == E_PRINT_NONE;
312 }
313 
OnQueryAddedPrinter(MessageParcel &data, MessageParcel &reply)314 bool PrintServiceStub::OnQueryAddedPrinter(MessageParcel &data, MessageParcel &reply)
315 {
316     PRINT_HILOGI("PrintServiceStub::OnQueryAddedPrinter in");
317     std::vector<std::string> printerNameList;
318 
319     int32_t ret = QueryAddedPrinter(printerNameList);
320     reply.WriteInt32(ret);
321     reply.WriteStringVector(printerNameList);
322 
323     PRINT_HILOGI("PrintServiceStub::OnQueryAddedPrinter out");
324     return ret == E_PRINT_NONE;
325 }
326 
OnQueryPrinterProperties(MessageParcel &data, MessageParcel &reply)327 bool PrintServiceStub::OnQueryPrinterProperties(MessageParcel &data, MessageParcel &reply)
328 {
329     PRINT_HILOGI("PrintServiceStub::OnQueryAddedPrinter in");
330     std::string printerId = data.ReadString();
331     std::vector<std::string> keyList;
332     data.ReadStringVector(&keyList);
333     std::vector<std::string> valueList;
334     int32_t ret = QueryPrinterProperties(printerId, keyList, valueList);
335     reply.WriteInt32(ret);
336     reply.WriteStringVector(valueList);
337     PRINT_HILOGI("PrintServiceStub::OnQueryAddedPrinter out");
338     return ret == E_PRINT_NONE;
339 }
340 
OnStartNativePrintJob(MessageParcel &data, MessageParcel &reply)341 bool PrintServiceStub::OnStartNativePrintJob(MessageParcel &data, MessageParcel &reply)
342 {
343     PRINT_HILOGI("PrintServiceStub::OnStartNativePrintJob in");
344     int32_t ret = E_PRINT_RPC_FAILURE;
345     auto printJobPtr = PrintJob::Unmarshalling(data);
346     if (printJobPtr != nullptr) {
347         printJobPtr->Dump();
348         ret = StartNativePrintJob(*printJobPtr);
349     }
350     reply.WriteInt32(ret);
351     PRINT_HILOGD("PrintServiceStub::OnStartPrintJob out");
352     return ret == E_PRINT_NONE;
353 }
354 
OnRemovePrinters(MessageParcel &data, MessageParcel &reply)355 bool PrintServiceStub::OnRemovePrinters(MessageParcel &data, MessageParcel &reply)
356 {
357     PRINT_HILOGI("PrintServiceStub::OnRemovePrinters in");
358     std::vector<std::string> printerIds;
359     data.ReadStringVector(&printerIds);
360     PRINT_HILOGD("OnStartDiscoverPrinter len = %{public}zd", printerIds.size());
361 
362     if (printerIds.size() > PRINT_MAX_PRINT_COUNT) {
363         PRINT_HILOGE("printerIds'size is out of range.");
364         reply.WriteInt32(E_PRINT_INVALID_PARAMETER);
365         return false;
366     }
367     int32_t ret = RemovePrinters(printerIds);
368     reply.WriteInt32(ret);
369 
370     PRINT_HILOGD("PrintServiceStub::OnRemovePrinters out");
371     return ret == E_PRINT_NONE;
372 }
373 
OnUpdatePrinters(MessageParcel &data, MessageParcel &reply)374 bool PrintServiceStub::OnUpdatePrinters(MessageParcel &data, MessageParcel &reply)
375 {
376     PRINT_HILOGI("PrintServiceStub::OnUpdatePrinters in");
377     std::vector<PrinterInfo> printerInfos;
378     uint32_t len = 0;
379     if (!data.ReadUint32(len)) {
380         PRINT_HILOGE("read data len failed.");
381         return false;
382     }
383     PRINT_HILOGD("OnUpdatePrinters len = %{public}d", len);
384 
385     if (len > PRINT_MAX_PRINT_COUNT) {
386         PRINT_HILOGE("len is out of range.");
387         reply.WriteInt32(E_PRINT_INVALID_PARAMETER);
388         return false;
389     }
390     for (uint32_t i = 0; i < len; i++) {
391         auto infoPtr = PrinterInfo::Unmarshalling(data);
392         if (infoPtr == nullptr) {
393             PRINT_HILOGW("invalid printer object");
394             continue;
395         }
396         infoPtr->Dump();
397         printerInfos.emplace_back(*infoPtr);
398     }
399     int32_t ret = E_PRINT_RPC_FAILURE;
400     if (printerInfos.size() > 0) {
401         ret = UpdatePrinters(printerInfos);
402     }
403     reply.WriteInt32(ret);
404     PRINT_HILOGD("PrintServiceStub::OnUpdatePrinters out");
405     return ret == E_PRINT_NONE;
406 }
407 
OnUpdatePrinterState(MessageParcel &data, MessageParcel &reply)408 bool PrintServiceStub::OnUpdatePrinterState(MessageParcel &data, MessageParcel &reply)
409 {
410     PRINT_HILOGI("PrintServiceStub::OnUpdatePrinterState in");
411     std::string printerId = data.ReadString();
412     uint32_t state = data.ReadUint32();
413     int32_t ret = UpdatePrinterState(printerId, state);
414     reply.WriteInt32(ret);
415     PRINT_HILOGD("PrintServiceStub::OnUpdatePrinterState out");
416     return ret == E_PRINT_NONE;
417 }
418 
OnUpdatePrintJobStateOnlyForSystemApp(MessageParcel &data, MessageParcel &reply)419 bool PrintServiceStub::OnUpdatePrintJobStateOnlyForSystemApp(MessageParcel &data, MessageParcel &reply)
420 {
421     PRINT_HILOGI("PrintServiceStub::OnUpdatePrintJobStateOnlyForSystemApp in");
422     std::string jobId = data.ReadString();
423     uint32_t state = data.ReadUint32();
424     uint32_t subState = data.ReadUint32();
425     PRINT_HILOGD("OnUpdatePrintJobStateOnlyForSystemApp jobId = %{public}s", jobId.c_str());
426     PRINT_HILOGD("OnUpdatePrintJobStateOnlyForSystemApp state = %{public}d", state);
427     PRINT_HILOGD("OnUpdatePrintJobStateOnlyForSystemApp subState = %{public}d", subState);
428 
429     int32_t ret = UpdatePrintJobStateOnlyForSystemApp(jobId, state, subState);
430     reply.WriteInt32(ret);
431     PRINT_HILOGD("PrintServiceStub::OnUpdatePrintJobStateOnlyForSystemApp out");
432     return ret == E_PRINT_NONE;
433 }
434 
OnUpdateExtensionInfo(MessageParcel &data, MessageParcel &reply)435 bool PrintServiceStub::OnUpdateExtensionInfo(MessageParcel &data, MessageParcel &reply)
436 {
437     PRINT_HILOGI("PrintServiceStub::OnUpdateExtensionInfo in");
438     std::string extInfo = data.ReadString();
439     PRINT_HILOGD("OnUpdateExtensionInfo extInfo = %{public}s", extInfo.c_str());
440 
441     int32_t ret = UpdateExtensionInfo(extInfo);
442     reply.WriteInt32(ret);
443     PRINT_HILOGD("PrintServiceStub::OnUpdateExtensionInfo out");
444     return ret == E_PRINT_NONE;
445 }
446 
OnRequestPreview(MessageParcel &data, MessageParcel &reply)447 bool PrintServiceStub::OnRequestPreview(MessageParcel &data, MessageParcel &reply)
448 {
449     PRINT_HILOGI("PrintServiceStub::OnRequestPreview in");
450     int32_t ret = E_PRINT_RPC_FAILURE;
451     std::string previewResult = "";
452     auto jobInfoPtr = PrintJob::Unmarshalling(data);
453     if (jobInfoPtr != nullptr) {
454         jobInfoPtr->Dump();
455         ret = RequestPreview(*jobInfoPtr, previewResult);
456     }
457     reply.WriteInt32(ret);
458     reply.WriteString(previewResult);
459     PRINT_HILOGD("PrintServiceStub::OnRequestPreview out");
460     return ret == E_PRINT_NONE;
461 }
462 
OnQueryPrinterCapability(MessageParcel &data, MessageParcel &reply)463 bool PrintServiceStub::OnQueryPrinterCapability(MessageParcel &data, MessageParcel &reply)
464 {
465     PRINT_HILOGI("PrintServiceStub::OnQueryPrinterCapability in");
466     std::string printerId = data.ReadString();
467     PRINT_HILOGD("printerId : %{private}s", printerId.c_str());
468     int32_t ret = QueryPrinterCapability(printerId);
469     reply.WriteInt32(ret);
470     PRINT_HILOGD("PrintServiceStub::OnQueryPrinterCapability out");
471     return ret == E_PRINT_NONE;
472 }
473 
OnQueryAllPrintJob(MessageParcel &data, MessageParcel &reply)474 bool PrintServiceStub::OnQueryAllPrintJob(MessageParcel &data, MessageParcel &reply)
475 {
476     PRINT_HILOGI("PrintServiceStub::OnQueryAllPrintJob in");
477     std::vector<PrintJob> printJob;
478     printJob.clear();
479     int32_t ret = QueryAllPrintJob(printJob);
480     reply.WriteInt32(ret);
481     if (ret == E_PRINT_NONE) {
482         uint32_t size = static_cast<uint32_t>(printJob.size());
483         reply.WriteUint32(size);
484         for (uint32_t index = 0; index < size; index++) {
485             printJob[index].Marshalling(reply);
486         }
487     }
488     PRINT_HILOGD("PrintServiceStub::OnQueryAllPrintJob out");
489     return ret == E_PRINT_NONE;
490 }
491 
OnQueryPrintJobById(MessageParcel &data, MessageParcel &reply)492 bool PrintServiceStub::OnQueryPrintJobById(MessageParcel &data, MessageParcel &reply)
493 {
494     PRINT_HILOGI("PrintServiceStub::OnQueryPrintJobById in");
495     PrintJob printJob;
496     std::string printJobId = data.ReadString();
497     int32_t ret = QueryPrintJobById(printJobId, printJob);
498     reply.WriteInt32(ret);
499     printJob.Marshalling(reply);
500     PRINT_HILOGD("PrintServiceStub::OnQueryPrintJobById out");
501     return ret == E_PRINT_NONE;
502 }
503 
OnAddPrinterToCups(MessageParcel &data, MessageParcel &reply)504 bool PrintServiceStub::OnAddPrinterToCups(MessageParcel &data, MessageParcel &reply)
505 {
506     PRINT_HILOGI("PrintServiceStub::OnAddPrinterToCups in");
507     std::string printerUri = data.ReadString();
508     std::string printerName = data.ReadString();
509     std::string printerMake = data.ReadString();
510     int32_t ret = AddPrinterToCups(printerUri, printerName, printerMake);
511     reply.WriteInt32(ret);
512     PRINT_HILOGD("PrintServiceStub::OnAddPrinterToCups out");
513     return ret == E_PRINT_NONE;
514 }
515 
OnQueryPrinterCapabilityByUri(MessageParcel &data, MessageParcel &reply)516 bool PrintServiceStub::OnQueryPrinterCapabilityByUri(MessageParcel &data, MessageParcel &reply)
517 {
518     PRINT_HILOGI("PrintServiceStub::OnQueryPrinterCapabilityByUri in");
519     PrinterCapability printerCaps;
520     std::string printerUri = data.ReadString();
521     std::string printerId = data.ReadString();
522     int32_t ret = QueryPrinterCapabilityByUri(printerUri, printerId, printerCaps);
523     reply.WriteInt32(ret);
524     printerCaps.Marshalling(reply);
525     PRINT_HILOGD("PrintServiceStub::OnQueryPrinterCapabilityByUri out");
526     return ret == E_PRINT_NONE;
527 }
528 
OnNotifyPrintServiceEvent(MessageParcel &data, MessageParcel &reply)529 bool PrintServiceStub::OnNotifyPrintServiceEvent(MessageParcel &data, MessageParcel &reply)
530 {
531     PRINT_HILOGI("PrintServiceStub::OnNotifyPrintServiceEvent in");
532     std::string jobId = data.ReadString();
533     uint32_t event = data.ReadUint32();
534     PRINT_HILOGD("OnNotifyPrintServiceEvent jobId = %{public}s, event = %{public}d", jobId.c_str(), event);
535     int32_t ret = NotifyPrintServiceEvent(jobId, event);
536     reply.WriteInt32(ret);
537     PRINT_HILOGD("PrintServiceStub::OnNotifyPrintServiceEvent out");
538     return ret == E_PRINT_NONE;
539 }
540 
OnSetDefaultPrinter(MessageParcel &data, MessageParcel &reply)541 bool PrintServiceStub::OnSetDefaultPrinter(MessageParcel &data, MessageParcel &reply)
542 {
543     PRINT_HILOGI("PrintServiceStub::OnSetDefaultPrinter in");
544     std::string printerId = data.ReadString();
545     uint32_t type = data.ReadUint32();
546     int32_t ret = SetDefaultPrinter(printerId, type);
547     reply.WriteInt32(ret);
548     PRINT_HILOGD("PrintServiceStub::OnSetDefaultPrinter out");
549     return ret == E_PRINT_NONE;
550 }
551 
OnDeletePrinterFromCups(MessageParcel &data, MessageParcel &reply)552 bool PrintServiceStub::OnDeletePrinterFromCups(MessageParcel &data, MessageParcel &reply)
553 {
554     PRINT_HILOGI("PrintServiceStub::OnDeletePrinterFromCups in");
555     std::string printerUri = data.ReadString();
556     std::string printerName = data.ReadString();
557     std::string printerMake = data.ReadString();
558     int32_t ret = DeletePrinterFromCups(printerUri, printerName, printerMake);
559     reply.WriteInt32(ret);
560     PRINT_HILOGD("PrintServiceStub::OnDeletePrinterFromCups out");
561     return ret == E_PRINT_NONE;
562 }
563 
OnDiscoverUsbPrinters(MessageParcel &data, MessageParcel &reply)564 bool PrintServiceStub::OnDiscoverUsbPrinters(MessageParcel &data, MessageParcel &reply)
565 {
566     PRINT_HILOGI("PrintServiceStub::OnDiscoverUsbPrinters in");
567     std::vector<PrinterInfo> printers;
568     int32_t ret = DiscoverUsbPrinters(printers);
569     reply.WriteInt32(ret);
570     if (ret == E_PRINT_NONE) {
571         uint32_t size = static_cast<uint32_t>(printers.size());
572         reply.WriteUint32(size);
573         for (uint32_t index = 0; index < size; index++) {
574             printers[index].Marshalling(reply);
575         }
576     }
577     PRINT_HILOGD("PrintServiceStub::OnDiscoverUsbPrinters out");
578     return ret == E_PRINT_NONE;
579 }
580 
OnEventOn(MessageParcel &data, MessageParcel &reply)581 bool PrintServiceStub::OnEventOn(MessageParcel &data, MessageParcel &reply)
582 {
583     std::string taskId = data.ReadString();
584     std::string type = data.ReadString();
585     PRINT_HILOGI("PrintServiceStub::OnEventOn type=%{public}s ", type.c_str());
586     if (type.empty()) {
587         PRINT_HILOGE("PrintServiceStub::OnEventOn type is null.");
588         reply.WriteInt32(E_PRINT_RPC_FAILURE);
589         return false;
590     }
591     sptr<IRemoteObject> remote = data.ReadRemoteObject();
592     if (remote == nullptr) {
593         PRINT_HILOGE("PrintServiceStub::OnEventOn remote is nullptr");
594         reply.WriteInt32(E_PRINT_RPC_FAILURE);
595         return false;
596     }
597     sptr<IPrintCallback> listener = iface_cast<IPrintCallback>(remote);
598     if (listener.GetRefPtr() == nullptr) {
599         PRINT_HILOGE("PrintServiceStub::OnEventOn listener is null");
600         reply.WriteInt32(E_PRINT_RPC_FAILURE);
601         return false;
602     }
603     int32_t ret = On(taskId, type, listener);
604     reply.WriteInt32(ret);
605     PRINT_HILOGD("PrintServiceStub::OnEventOn out");
606     return ret == E_PRINT_NONE;
607 }
608 
OnEventOff(MessageParcel &data, MessageParcel &reply)609 bool PrintServiceStub::OnEventOff(MessageParcel &data, MessageParcel &reply)
610 {
611     PRINT_HILOGD("PrintServiceStub::OnEventOff in");
612     std::string taskId = data.ReadString();
613     std::string type = data.ReadString();
614     PRINT_HILOGI("PrintServiceStub::OnEventOff type=%{public}s ", type.c_str());
615     int32_t ret = Off(taskId, type);
616     reply.WriteInt32(ret);
617     PRINT_HILOGD("PrintServiceStub::OnEventOff out");
618     return ret == E_PRINT_NONE;
619 }
620 
OnRegisterPrinterCallback(MessageParcel &data, MessageParcel &reply)621 bool PrintServiceStub::OnRegisterPrinterCallback(MessageParcel &data, MessageParcel &reply)
622 {
623     std::string type = data.ReadString();
624     if (type.empty()) {
625         PRINT_HILOGE("PrintServiceStub::OnEventOn type is null.");
626         reply.WriteInt32(E_PRINT_RPC_FAILURE);
627         return false;
628     }
629     PRINT_HILOGI("PrintServiceStub::OnRegisterPrinterCallback type=%{public}s ", type.c_str());
630     sptr<IRemoteObject> remote = data.ReadRemoteObject();
631     if (remote == nullptr) {
632         PRINT_HILOGE("PrintServiceStub::OnEventOn remote is nullptr");
633         reply.WriteInt32(E_PRINT_RPC_FAILURE);
634         return false;
635     }
636     sptr<IPrintCallback> listener = iface_cast<IPrintCallback>(remote);
637     if (listener.GetRefPtr() == nullptr) {
638         PRINT_HILOGE("PrintServiceStub::OnEventOn listener is null");
639         reply.WriteInt32(E_PRINT_RPC_FAILURE);
640         return false;
641     }
642     int32_t ret = RegisterPrinterCallback(type, listener);
643     reply.WriteInt32(ret);
644     PRINT_HILOGD("PrintServiceStub::OnRegisterPrinterCallback out");
645     return ret == E_PRINT_NONE;
646 }
647 
OnUnregisterPrinterCallback(MessageParcel &data, MessageParcel &reply)648 bool PrintServiceStub::OnUnregisterPrinterCallback(MessageParcel &data, MessageParcel &reply)
649 {
650     std::string type = data.ReadString();
651     if (type.empty()) {
652         reply.WriteInt32(E_PRINT_RPC_FAILURE);
653         return false;
654     }
655     PRINT_HILOGI("PrintServiceStub::OnUnregisterPrinterCallback type=%{public}s ", type.c_str());
656     int32_t ret = UnregisterPrinterCallback(type);
657     reply.WriteInt32(ret);
658     PRINT_HILOGD("PrintServiceStub::OnUnregisterPrinterCallback out");
659     return ret == E_PRINT_NONE;
660 }
661 
OnRegisterExtCallback(MessageParcel &data, MessageParcel &reply)662 bool PrintServiceStub::OnRegisterExtCallback(MessageParcel &data, MessageParcel &reply)
663 {
664     PRINT_HILOGI("PrintServiceStub::OnRegisterExtCallback in");
665     std::string extensionCID = data.ReadString();
666     sptr<IRemoteObject> remote = data.ReadRemoteObject();
667     if (remote == nullptr) {
668         PRINT_HILOGD("PrintServiceStub::OnRegisterExtCallback remote is nullptr");
669         reply.WriteInt32(E_PRINT_RPC_FAILURE);
670         return false;
671     }
672     sptr<IPrintExtensionCallback> listener = iface_cast<IPrintExtensionCallback>(remote);
673     if (listener.GetRefPtr() == nullptr) {
674         PRINT_HILOGD("PrintServiceStub::OnRegisterExtCallback listener is null");
675         reply.WriteInt32(E_PRINT_RPC_FAILURE);
676         return false;
677     }
678 
679     int32_t ret = RegisterExtCallback(extensionCID, listener);
680     reply.WriteInt32(ret);
681     PRINT_HILOGD("PrintServiceStub::OnRegisterExtCallback out");
682     return ret == E_PRINT_NONE;
683 }
684 
OnUnregisterAllExtCallback(MessageParcel &data, MessageParcel &reply)685 bool PrintServiceStub::OnUnregisterAllExtCallback(MessageParcel &data, MessageParcel &reply)
686 {
687     PRINT_HILOGI("PrintServiceStub::OnUnregisterAllExtCallback in");
688     std::string extensionId = data.ReadString();
689     int32_t ret = UnregisterAllExtCallback(extensionId);
690     reply.WriteInt32(ret);
691     PRINT_HILOGD("PrintServiceStub::OnUnregisterAllExtCallback out");
692     return ret == E_PRINT_NONE;
693 }
694 
OnLoadExtSuccess(MessageParcel &data, MessageParcel &reply)695 bool PrintServiceStub::OnLoadExtSuccess(MessageParcel &data, MessageParcel &reply)
696 {
697     PRINT_HILOGI("PrintServiceStub::OnLoadExtSuccess in");
698     std::string extensionId = data.ReadString();
699     int32_t ret = LoadExtSuccess(extensionId);
700     reply.WriteInt32(ret);
701     PRINT_HILOGD("PrintServiceStub::OnLoadExtSuccess out");
702     return ret == E_PRINT_NONE;
703 }
704 
OnPrintByAdapter(MessageParcel &data, MessageParcel &reply)705 bool PrintServiceStub::OnPrintByAdapter(MessageParcel &data, MessageParcel &reply)
706 {
707     PRINT_HILOGI("PrintServiceStub::OnPrintByAdapter in");
708     int32_t ret = E_PRINT_RPC_FAILURE;
709     std::string jobName = data.ReadString();
710     auto attrs = PrintAttributes::Unmarshalling(data);
711     std::string taskId = data.ReadString();
712     if (attrs != nullptr) {
713         attrs->Dump();
714         ret = PrintByAdapter(jobName, *attrs, taskId);
715     }
716     reply.WriteInt32(ret);
717     PRINT_HILOGI("PrintServiceStub::OnPrintByAdapter out");
718     return ret == E_PRINT_NONE;
719 }
720 
OnStartGetPrintFile(MessageParcel &data, MessageParcel &reply)721 bool PrintServiceStub::OnStartGetPrintFile(MessageParcel &data, MessageParcel &reply)
722 {
723     PRINT_HILOGI("PrintServiceStub::OnStartGetPrintFile in");
724     int32_t ret = E_PRINT_RPC_FAILURE;
725     std::string jobId = data.ReadString();
726     auto attrs = PrintAttributes::Unmarshalling(data);
727     uint32_t fd = static_cast<uint32_t>(data.ReadFileDescriptor());
728     if (attrs != nullptr) {
729         ret = StartGetPrintFile(jobId, *attrs, fd);
730     }
731     reply.WriteInt32(ret);
732     PRINT_HILOGI("PrintServiceStub::OnStartGetPrintFile out");
733     return ret == E_PRINT_NONE;
734 }
735 
OnNotifyPrintService(MessageParcel &data, MessageParcel &reply)736 bool PrintServiceStub::OnNotifyPrintService(MessageParcel &data, MessageParcel &reply)
737 {
738     PRINT_HILOGI("PrintServiceStub::OnNotifyPrintService in");
739     std::string jobId = data.ReadString();
740     std::string type = data.ReadString();
741     PRINT_HILOGD(
742         "PrintServiceStub::OnNotifyPrintService jobId=%{public}s type=%{public}s ", jobId.c_str(), type.c_str());
743     int32_t ret = NotifyPrintService(jobId, type);
744     reply.WriteInt32(ret);
745     PRINT_HILOGD("PrintServiceStub::OnNotifyPrintService out");
746     return ret == E_PRINT_NONE;
747 }
748 
749 
OnAddPrinterToDiscovery(MessageParcel &data, MessageParcel &reply)750 bool PrintServiceStub::OnAddPrinterToDiscovery(MessageParcel &data, MessageParcel &reply)
751 {
752     PRINT_HILOGI("PrintServiceStub::OnAddPrinterToDiscovery in");
753     auto infoPtr = PrinterInfo::Unmarshalling(data);
754     if (infoPtr == nullptr) {
755         PRINT_HILOGW("invalid printer object");
756         reply.WriteInt32(E_PRINT_RPC_FAILURE);
757         PRINT_HILOGD("PrintServiceStub::OnAddPrinterToDiscovery out with failure");
758         return false;
759     }
760     infoPtr->Dump();
761     int32_t ret = AddPrinterToDiscovery(*infoPtr);
762     reply.WriteInt32(ret);
763     PRINT_HILOGD("PrintServiceStub::OnAddPrinterToDiscovery out with ret = %{public}d", ret);
764     return ret == E_PRINT_NONE;
765 }
766 
OnUpdatePrinterInDiscovery(MessageParcel &data, MessageParcel &reply)767 bool PrintServiceStub::OnUpdatePrinterInDiscovery(MessageParcel &data, MessageParcel &reply)
768 {
769     PRINT_HILOGI("PrintServiceStub::OnUpdatePrinterInDiscovery in");
770 
771     auto infoPtr = PrinterInfo::Unmarshalling(data);
772     if (infoPtr == nullptr) {
773         PRINT_HILOGE("Failed to unmarshall printer info");
774         reply.WriteInt32(E_PRINT_RPC_FAILURE);
775         return false;
776     }
777 
778     infoPtr->Dump();
779     int32_t ret = UpdatePrinterInDiscovery(*infoPtr);
780     reply.WriteInt32(ret);
781 
782     PRINT_HILOGD("PrintServiceStub::OnUpdatePrinterInDiscovery out");
783     return ret == E_PRINT_NONE;
784 }
785 
OnRemovePrinterFromDiscovery(MessageParcel &data, MessageParcel &reply)786 bool PrintServiceStub::OnRemovePrinterFromDiscovery(MessageParcel &data, MessageParcel &reply)
787 {
788     PRINT_HILOGI("PrintServiceStub::OnRemovePrinterFromDiscovery in");
789 
790     std::string printerId = data.ReadString();
791 
792     int32_t ret = RemovePrinterFromDiscovery(printerId);
793     reply.WriteInt32(ret);
794 
795     PRINT_HILOGD("PrintServiceStub::OnRemovePrinterFromDiscovery out");
796     return ret == E_PRINT_NONE;
797 }
798 
799 } // namespace OHOS::Print
800