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_extension_callback_stub.h"
17 
18 #include "print_constant.h"
19 #include "print_log.h"
20 #include "print_resolution.h"
21 
22 namespace OHOS::Print {
PrintExtensionCallbackStub()23 PrintExtensionCallbackStub::PrintExtensionCallbackStub() : extCb_(nullptr), jobCb_(nullptr),
24     cb_(nullptr), capability_(nullptr)
25 {
26     cmdMap_[PRINT_EXTCB] = &PrintExtensionCallbackStub::HandleExtCallback;
27     cmdMap_[PRINT_EXTCB_PRINTER] = &PrintExtensionCallbackStub::HandlePrinterCallback;
28     cmdMap_[PRINT_EXTCB_PRINTJOB] = &PrintExtensionCallbackStub::HandlePrintJobCallback;
29     cmdMap_[PRINT_EXTCB_PRINTCAPABILITY] = &PrintExtensionCallbackStub::HandleCapabilityCallback;
30 }
31 
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)32 int32_t PrintExtensionCallbackStub::OnRemoteRequest(
33     uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)
34 {
35     PRINT_HILOGD("OnRemoteRequest started, code = %{public}d", code);
36     auto descriptorToken = data.ReadInterfaceToken();
37     if (descriptorToken != GetDescriptor()) {
38         PRINT_HILOGE("Remote descriptor not the same as local descriptor.");
39         return E_PRINT_RPC_FAILURE;
40     }
41 
42     auto itFunc = cmdMap_.find(code);
43     if (itFunc != cmdMap_.end()) {
44         auto requestFunc = itFunc->second;
45         if (requestFunc != nullptr) {
46             bool result = (this->*requestFunc)(data, reply);
47             return result ? E_PRINT_NONE : E_PRINT_SERVER_FAILURE;
48         }
49     }
50     PRINT_HILOGW("default case, need check.");
51     return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
52 }
53 
OnCallback()54 bool PrintExtensionCallbackStub::OnCallback()
55 {
56     if (extCb_ != nullptr) {
57         return extCb_();
58     }
59     return false;
60 }
61 
OnCallback(const std::string & printerId)62 bool PrintExtensionCallbackStub::OnCallback(const std::string &printerId)
63 {
64     if (cb_ != nullptr) {
65         return cb_(printerId);
66     }
67     return false;
68 }
69 
OnCallback(const PrintJob & job)70 bool PrintExtensionCallbackStub::OnCallback(const PrintJob &job)
71 {
72     if (jobCb_ != nullptr) {
73         return jobCb_(job);
74     }
75     return false;
76 }
77 
OnCallback(const std::string & printerId,PrinterCapability & cap)78 bool PrintExtensionCallbackStub::OnCallback(const std::string &printerId, PrinterCapability &cap)
79 {
80     if (capability_ != nullptr) {
81         if (capability_(printerId, cap)) {
82             return true;
83         }
84     }
85     return false;
86 }
87 
SetExtCallback(PrintExtCallback cb)88 void PrintExtensionCallbackStub::SetExtCallback(PrintExtCallback cb)
89 {
90     extCb_ = cb;
91 }
92 
SetPrintJobCallback(PrintJobCallback cb)93 void PrintExtensionCallbackStub::SetPrintJobCallback(PrintJobCallback cb)
94 {
95     jobCb_ = cb;
96 }
97 
SetPrinterCallback(PrinterCallback cb)98 void PrintExtensionCallbackStub::SetPrinterCallback(PrinterCallback cb)
99 {
100     cb_ = cb;
101 }
102 
SetCapabilityCallback(PrinterCapabilityCallback cb)103 void PrintExtensionCallbackStub::SetCapabilityCallback(PrinterCapabilityCallback cb)
104 {
105     capability_ = cb;
106 }
107 
HandleExtCallback(MessageParcel & data,MessageParcel & reply)108 bool PrintExtensionCallbackStub::HandleExtCallback(MessageParcel &data, MessageParcel &reply)
109 {
110     bool result = OnCallback();
111     PRINT_HILOGI("Handle Print Extension Callback ret[%{public}d]", result);
112     reply.WriteBool(result);
113     return result;
114 }
115 
HandlePrinterCallback(MessageParcel & data,MessageParcel & reply)116 bool PrintExtensionCallbackStub::HandlePrinterCallback(MessageParcel &data, MessageParcel &reply)
117 {
118     std::string printerId = data.ReadString();
119     bool result = OnCallback(printerId);
120     PRINT_HILOGI("Handle Printer Extension Callback ret[%{public}d]", result);
121     reply.WriteBool(result);
122     return result;
123 }
124 
HandlePrintJobCallback(MessageParcel & data,MessageParcel & reply)125 bool PrintExtensionCallbackStub::HandlePrintJobCallback(MessageParcel &data, MessageParcel &reply)
126 {
127     auto printJobPtr = PrintJob::Unmarshalling(data);
128     bool result = false;
129     if (printJobPtr != nullptr) {
130         result = OnCallback(*printJobPtr);
131         PRINT_HILOGI("Handle Print Job Extension Callback ret[%{public}d]", result);
132         reply.WriteBool(result);
133     }
134     return result;
135 }
136 
HandleCapabilityCallback(MessageParcel & data,MessageParcel & reply)137 bool PrintExtensionCallbackStub::HandleCapabilityCallback(MessageParcel &data, MessageParcel &reply)
138 {
139     std::string printerId = data.ReadString();
140     PrinterCapability cap;
141     bool result = OnCallback(printerId, cap);
142     PRINT_HILOGI("Handle Printer Capability Extension Callback ret[%{public}d]", result);
143     reply.WriteBool(result);
144     cap.Marshalling(reply);
145     return result;
146 }
147 } // namespace OHOS::Print
148