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 "scan_service_stub.h"
17 #include "ipc_skeleton.h"
18 #include "iscan_service.h"
19 #include "message_parcel.h"
20 #include "scan_constant.h"
21 #include "scan_log.h"
22 #include "scanner_info.h"
23 #include "scan_service_ability.h"
24
25 namespace OHOS::Scan {
26 using namespace OHOS::HiviewDFX;
27
ScanServiceStub()28 ScanServiceStub::ScanServiceStub()
29 {
30 cmdMap_[CMD_INIT_SCAN] = &ScanServiceStub::OnInitScan;
31 cmdMap_[CMD_EXIT_SCAN] = &ScanServiceStub::OnExitScan;
32 cmdMap_[CMD_GET_SCANNER_LIST] = &ScanServiceStub::OnGetScannerList;
33 cmdMap_[CMD_STOP_DISCOVER] = &ScanServiceStub::OnStopDiscover;
34 cmdMap_[CMD_OPEN_SCANNER] = &ScanServiceStub::OnOpenScanner;
35 cmdMap_[CMD_CLOSE_SCANNER] = &ScanServiceStub::OnCloseScanner;
36 cmdMap_[CMD_GET_SCAN_OPTION_DESC] = &ScanServiceStub::OnGetScanOptionDesc;
37 cmdMap_[CMD_OP_SCAN_OPTION_VALUE] = &ScanServiceStub::OnOpScanOptionValue;
38 cmdMap_[CMD_GET_SCAN_PARAMETERS] = &ScanServiceStub::OnGetScanParameters;
39 cmdMap_[CMD_START_SCAN] = &ScanServiceStub::OnStartScan;
40 cmdMap_[CMD_GET_SINGLE_FRAME_FD] = &ScanServiceStub::OnGetSingleFrameFD;
41 cmdMap_[CMD_CANCEL_SCAN] = &ScanServiceStub::OnCancelScan;
42 cmdMap_[CMD_SET_SCAN_IO_MODE] = &ScanServiceStub::OnSetScanIOMode;
43 cmdMap_[CMD_GET_SCAN_SELECT_FD] = &ScanServiceStub::OnGetScanSelectFd;
44 cmdMap_[CMD_GET_SCANNER_STATE] = &ScanServiceStub::OnGetScannerState;
45 cmdMap_[CMD_GET_SCAN_PROGRESS] = &ScanServiceStub::OnGetScanProgress;
46 cmdMap_[CMD_CONNECT_SCANNER] = &ScanServiceStub::OnConnectScanner;
47 cmdMap_[CMD_DISCONNECT_SCANNER] = &ScanServiceStub::OnDisConnectScanner;
48 cmdMap_[CMD_GET_CONNECTED_SCANNER] = &ScanServiceStub::OnGetConnectedScanner;
49 cmdMap_[CMD_UPDATE_SCANNER_NAME] = &ScanServiceStub::OnUpdateScannerName;
50 cmdMap_[CMD_ADD_PRINTER] = &ScanServiceStub::OnAddPrinter;
51 cmdMap_[CMD_ON] = &ScanServiceStub::OnEventOn;
52 cmdMap_[CMD_OFF] = &ScanServiceStub::OnEventOff;
53 }
54
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)55 int32_t ScanServiceStub::OnRemoteRequest(
56 uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)
57 {
58 SCAN_HILOGD("OnRemoteRequest started, code = %{public}d", code);
59 auto descriptorToken = data.ReadInterfaceToken();
60 if (descriptorToken != GetDescriptor()) {
61 SCAN_HILOGE("Remote descriptor not the same as local descriptor.");
62 return E_SCAN_RPC_FAILURE;
63 }
64
65 auto itFunc = cmdMap_.find(code);
66 if (itFunc != cmdMap_.end()) {
67 auto requestFunc = itFunc->second;
68 if (requestFunc != nullptr) {
69 return (this->*requestFunc)(data, reply);
70 }
71 }
72 SCAN_HILOGW("default case, need check.");
73 return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
74 }
75
OnInitScan(MessageParcel & data,MessageParcel & reply)76 bool ScanServiceStub::OnInitScan(MessageParcel &data, MessageParcel &reply)
77 {
78 SCAN_HILOGI("ScanServiceStub::OnInitScan start");
79 int32_t ret = E_SCAN_RPC_FAILURE;
80 int32_t scanVersion = 0;
81 {
82 std::lock_guard<std::mutex> autoLock(lock_);
83 ScanServiceAbility::appCount_++;
84 SCAN_HILOGI("ScanServiceAbility::appCount_= %{public}d", ScanServiceAbility::appCount_);
85 }
86 if (isSaneInit_) {
87 SCAN_HILOGW("is isSaneInit_ed");
88 return E_SCAN_NONE;
89 }
90 ret = InitScan(scanVersion);
91 isSaneInit_ = true;
92 reply.WriteInt32(ret);
93 reply.WriteInt32(scanVersion);
94 SCAN_HILOGI("ScanServiceStub::OnInitScan end");
95 return ret == E_SCAN_NONE;
96 }
97
OnExitScan(MessageParcel & data,MessageParcel & reply)98 bool ScanServiceStub::OnExitScan(MessageParcel &data, MessageParcel &reply)
99 {
100 SCAN_HILOGI("ScanServiceStub::OnExitScan start");
101 auto scanServiceAbilityPtr = ScanServiceAbility::GetInstance();
102 if (scanServiceAbilityPtr == nullptr) {
103 SCAN_HILOGE("scanServiceAbilityPtr is a nullptr");
104 reply.WriteInt32(E_SCAN_GENERIC_FAILURE);
105 return false;
106 }
107 {
108 std::lock_guard<std::mutex> autoLock(lock_);
109 ScanServiceAbility::appCount_ = ScanServiceAbility::appCount_-1 >= 0 ? ScanServiceAbility::appCount_-1 : 0;
110 SCAN_HILOGI("appCount = %{public}d", ScanServiceAbility::appCount_);
111 if (ScanServiceAbility::appCount_ == 0) {
112 SCAN_HILOGI("connected app number = 0, start unloadSA");
113 scanServiceAbilityPtr->UnloadSystemAbility();
114 }
115 }
116 reply.WriteInt32(E_SCAN_NONE);
117 SCAN_HILOGI("ScanServiceStub::OnExitScan end");
118 return true;
119 }
120
OnGetScannerList(MessageParcel & data,MessageParcel & reply)121 bool ScanServiceStub::OnGetScannerList(MessageParcel &data, MessageParcel &reply)
122 {
123 SCAN_HILOGI("ScanServiceStub::OnGetScannerList start");
124 int32_t ret = GetScannerList();
125 reply.WriteInt32(ret);
126 SCAN_HILOGI("ScanServiceStub::OnGetScannerList end");
127 return ret == E_SCAN_NONE;
128 }
129
OnStopDiscover(MessageParcel & data,MessageParcel & reply)130 bool ScanServiceStub::OnStopDiscover(MessageParcel &data, MessageParcel &reply)
131 {
132 SCAN_HILOGD("ScanServiceStub::OnStopDiscover start");
133 int32_t ret = StopDiscover();
134 reply.WriteInt32(ret);
135 SCAN_HILOGD("ScanServiceStub::OnStopDiscover end");
136 return ret == E_SCAN_NONE;
137 }
138
OnOpenScanner(MessageParcel & data,MessageParcel & reply)139 bool ScanServiceStub::OnOpenScanner(MessageParcel &data, MessageParcel &reply)
140 {
141 SCAN_HILOGI("ScanServiceStub::OnOpenScanner start");
142 std::string scannerId = data.ReadString();
143 int32_t ret = OpenScanner(scannerId);
144 reply.WriteInt32(ret);
145 SCAN_HILOGI("ScanServiceStub::OnOpenScanner end");
146 return ret == E_SCAN_NONE;
147 }
148
OnCloseScanner(MessageParcel & data,MessageParcel & reply)149 bool ScanServiceStub::OnCloseScanner(MessageParcel &data, MessageParcel &reply)
150 {
151 SCAN_HILOGI("ScanServiceStub::OnCloseScanner start");
152 std::string scannerId = data.ReadString();
153 int32_t ret = CloseScanner(scannerId);
154 reply.WriteInt32(ret);
155 SCAN_HILOGI("ScanServiceStub::OnCloseScanner end");
156 return ret == E_SCAN_NONE;
157 }
158
OnGetScanOptionDesc(MessageParcel & data,MessageParcel & reply)159 bool ScanServiceStub::OnGetScanOptionDesc(MessageParcel &data, MessageParcel &reply)
160 {
161 SCAN_HILOGI("ScanServiceStub::OnGetScanOptionDesc start");
162 std::string scannerId = data.ReadString();
163 int32_t optionIndex = data.ReadInt32();
164 ScanOptionDescriptor desc;
165 int32_t ret = GetScanOptionDesc(scannerId, optionIndex, desc);
166 reply.WriteInt32(ret);
167 if (ret == E_SCAN_NONE) {
168 desc.Marshalling(reply);
169 }
170 SCAN_HILOGI("ScanServiceStub::OnGetScanOptionDesc end");
171 return ret == E_SCAN_NONE;
172 }
173
OnOpScanOptionValue(MessageParcel & data,MessageParcel & reply)174 bool ScanServiceStub::OnOpScanOptionValue(MessageParcel &data, MessageParcel &reply)
175 {
176 SCAN_HILOGD("ScanServiceStub::OnOpScanOptionValue start");
177 std::string scannerId = data.ReadString();
178 int32_t optionIndex = data.ReadInt32();
179 ScanOptionOpType op = (ScanOptionOpType) data.ReadUint32();
180 ScanOptionValue value;
181 auto scanOptionValue = ScanOptionValue::Unmarshalling(data);
182 value = *scanOptionValue;
183 int32_t info;
184 int32_t ret = OpScanOptionValue(scannerId, optionIndex, op, value, info);
185 reply.WriteInt32(ret);
186 if (ret == E_SCAN_NONE) {
187 value.Marshalling(reply);
188 if (op == SCAN_ACTION_GET_VALUE) {
189 reply.WriteInt32(info);
190 }
191 }
192 SCAN_HILOGD("ScanServiceStub::OnOpScanOptionValue end");
193 return ret == E_SCAN_NONE;
194 }
195
OnGetScanParameters(MessageParcel & data,MessageParcel & reply)196 bool ScanServiceStub::OnGetScanParameters(MessageParcel &data, MessageParcel &reply)
197 {
198 SCAN_HILOGD("ScanServiceStub::OnGetScanParameters start");
199 std::string scannerId = data.ReadString();
200 ScanParameters para;
201 int32_t ret = GetScanParameters(scannerId, para);
202 reply.WriteInt32(ret);
203 if (ret == E_SCAN_NONE) {
204 para.Marshalling(reply);
205 }
206 SCAN_HILOGD("ScanServiceStub::OnGetScanParameters end");
207 return ret == E_SCAN_NONE;
208 }
209
OnStartScan(MessageParcel & data,MessageParcel & reply)210 bool ScanServiceStub::OnStartScan(MessageParcel &data, MessageParcel &reply)
211 {
212 SCAN_HILOGI("ScanServiceStub::OnStartScan start");
213 std::string scannerId = data.ReadString();
214 bool batchMode = data.ReadBool();
215 int32_t ret = ScanServiceAbility::GetInstance()->OnStartScan(scannerId, batchMode);
216 reply.WriteInt32(ret);
217 SCAN_HILOGI("ScanServiceStub::OnStartScan end");
218 return ret == E_SCAN_NONE;
219 }
220
OnGetSingleFrameFD(MessageParcel & data,MessageParcel & reply)221 bool ScanServiceStub::OnGetSingleFrameFD(MessageParcel &data, MessageParcel &reply)
222 {
223 SCAN_HILOGD("ScanServiceStub::OnGetSingleFrameFD start");
224 std::string scannerId = data.ReadString();
225 int32_t fd = data.ReadFileDescriptor();
226 uint32_t frameSize = 0;
227 int32_t ret = GetSingleFrameFD(scannerId, frameSize, fd);
228 reply.WriteInt32(ret);
229 if (ret == E_SCAN_NONE) {
230 reply.WriteInt32(frameSize);
231 }
232 SCAN_HILOGD("ScanServiceStub::OnGetSingleFrameFD end");
233 return ret == E_SCAN_NONE;
234 }
235
OnCancelScan(MessageParcel & data,MessageParcel & reply)236 bool ScanServiceStub::OnCancelScan(MessageParcel &data, MessageParcel &reply)
237 {
238 SCAN_HILOGI("ScanServiceStub::OnCancelScan start");
239 std::string scannerId = data.ReadString();
240 int32_t ret = CancelScan(scannerId);
241 reply.WriteInt32(ret);
242 SCAN_HILOGI("ScanServiceStub::OnCancelScan end");
243 return ret == E_SCAN_NONE;
244 }
245
OnSetScanIOMode(MessageParcel & data,MessageParcel & reply)246 bool ScanServiceStub::OnSetScanIOMode(MessageParcel &data, MessageParcel &reply)
247 {
248 SCAN_HILOGD("ScanServiceStub::OnSetScanIOMode start");
249 std::string scannerId = data.ReadString();
250 bool isNonBlocking = data.ReadBool();
251 int32_t ret = SetScanIOMode(scannerId, isNonBlocking);
252 reply.WriteInt32(ret);
253 SCAN_HILOGD("ScanServiceStub::OnSetScanIOMode end");
254 return ret == E_SCAN_NONE;
255 }
256
OnGetScanSelectFd(MessageParcel & data,MessageParcel & reply)257 bool ScanServiceStub::OnGetScanSelectFd(MessageParcel &data, MessageParcel &reply)
258 {
259 SCAN_HILOGD("ScanServiceStub::OnGetScanSelectFd start");
260 std::string scannerId = data.ReadString();
261 int32_t fd = 0;
262 int32_t ret = GetScanSelectFd(scannerId, fd);
263 reply.WriteInt32(ret);
264 reply.WriteInt32(fd);
265 SCAN_HILOGD("ScanServiceStub::OnGetScanSelectFd end");
266 return ret == E_SCAN_NONE;
267 }
268
OnEventOn(MessageParcel & data,MessageParcel & reply)269 bool ScanServiceStub::OnEventOn(MessageParcel &data, MessageParcel &reply)
270 {
271 std::string taskId = data.ReadString();
272 std::string type = data.ReadString();
273 SCAN_HILOGD("ScanServiceStub::OnEventOn type=%{public}s ", type.c_str());
274 if (type.empty()) {
275 SCAN_HILOGE("ScanServiceStub::OnEventOn type is null.");
276 reply.WriteInt32(E_SCAN_RPC_FAILURE);
277 return false;
278 }
279 sptr<IRemoteObject> remote = data.ReadRemoteObject();
280 if (remote == nullptr) {
281 SCAN_HILOGE("ScanServiceStub::OnEventOn remote is nullptr");
282 reply.WriteInt32(E_SCAN_RPC_FAILURE);
283 return false;
284 }
285 sptr<IScanCallback> listener = iface_cast<IScanCallback>(remote);
286 if (listener.GetRefPtr() == nullptr) {
287 SCAN_HILOGE("ScanServiceStub::OnEventOn listener is null");
288 reply.WriteInt32(E_SCAN_RPC_FAILURE);
289 return false;
290 }
291 int32_t ret = On(taskId, type, listener);
292 reply.WriteInt32(ret);
293 SCAN_HILOGD("ScanServiceStub::OnEventOn out");
294 return ret == E_SCAN_NONE;
295 }
296
OnEventOff(MessageParcel & data,MessageParcel & reply)297 bool ScanServiceStub::OnEventOff(MessageParcel &data, MessageParcel &reply)
298 {
299 SCAN_HILOGD("ScanServiceStub::OnEventOff in");
300 std::string taskId = data.ReadString();
301 std::string type = data.ReadString();
302 SCAN_HILOGD("ScanServiceStub::OnEventOff type=%{public}s ", type.c_str());
303 int32_t ret = Off(taskId, type);
304 reply.WriteInt32(ret);
305 SCAN_HILOGD("ScanServiceStub::OnEventOff out");
306 return ret == E_SCAN_NONE;
307 }
308
OnGetScannerState(MessageParcel & data,MessageParcel & reply)309 bool ScanServiceStub::OnGetScannerState(MessageParcel &data, MessageParcel &reply)
310 {
311 SCAN_HILOGD("ScanServiceStub::OnGetScannerState start");
312 int32_t ret = E_SCAN_RPC_FAILURE;
313 int32_t scannerState = 0;
314 ret = GetScannerState(scannerState);
315 reply.WriteInt32(ret);
316 reply.WriteInt32(scannerState);
317 SCAN_HILOGD("ScanServiceStub::OnGetScannerState end");
318 return ret == E_SCAN_NONE;
319 }
320
OnGetScanProgress(MessageParcel & data,MessageParcel & reply)321 bool ScanServiceStub::OnGetScanProgress(MessageParcel &data, MessageParcel &reply)
322 {
323 SCAN_HILOGD("ScanServiceStub::OnGetScanProgress start");
324 std::string scannerId = data.ReadString();
325 ScanProgress prog;
326 int32_t ret = GetScanProgress(scannerId, prog);
327 reply.WriteInt32(ret);
328 if (ret == E_SCAN_NONE) {
329 prog.Marshalling(reply);
330 }
331 SCAN_HILOGD("ScanServiceStub::OnGetScanProgress end");
332 return ret == E_SCAN_NONE;
333 }
334
OnConnectScanner(MessageParcel & data,MessageParcel & reply)335 bool ScanServiceStub::OnConnectScanner(MessageParcel &data, MessageParcel &reply)
336 {
337 SCAN_HILOGD("ScanServiceStub::OnConnectScanner start");
338 std::string serialNumber = data.ReadString();
339 std::string discoverMode = data.ReadString();
340 int32_t ret = AddScanner(serialNumber, discoverMode);
341 reply.WriteInt32(ret);
342 SCAN_HILOGD("ScanServiceStub::OnConnectScanner end");
343 return ret == E_SCAN_NONE;
344 }
345
OnDisConnectScanner(MessageParcel & data,MessageParcel & reply)346 bool ScanServiceStub::OnDisConnectScanner(MessageParcel &data, MessageParcel &reply)
347 {
348 SCAN_HILOGD("ScanServiceStub::OnDisConnectScanner start");
349 std::string serialNumber = data.ReadString();
350 std::string discoverMode = data.ReadString();
351 int32_t ret = DeleteScanner(serialNumber, discoverMode);
352 reply.WriteInt32(ret);
353 SCAN_HILOGD("ScanServiceStub::OnDisConnectScanner end");
354 return ret == E_SCAN_NONE;
355 }
356
OnGetConnectedScanner(MessageParcel & data,MessageParcel & reply)357 bool ScanServiceStub::OnGetConnectedScanner(MessageParcel &data, MessageParcel &reply)
358 {
359 SCAN_HILOGD("ScanServiceStub::OnGetConnectedScanner start");
360 std::vector<ScanDeviceInfo> allAddedScanner;
361 allAddedScanner.clear();
362 int32_t ret = GetAddedScanner(allAddedScanner);
363 reply.WriteInt32(ret);
364 if (ret == E_SCAN_NONE) {
365 uint32_t size = static_cast<uint32_t>(allAddedScanner.size());
366 reply.WriteUint32(size);
367 for (uint32_t index = 0; index < size; index++) {
368 allAddedScanner[index].Marshalling(reply);
369 }
370 }
371 SCAN_HILOGD("ScanServiceStub::OnGetConnectedScanner end");
372 return ret == E_SCAN_NONE;
373 }
374
OnUpdateScannerName(MessageParcel & data,MessageParcel & reply)375 bool ScanServiceStub::OnUpdateScannerName(MessageParcel &data, MessageParcel &reply)
376 {
377 SCAN_HILOGD("ScanServiceStub::OnUpdateScannerName start");
378 std::string serialNumber = data.ReadString();
379 std::string discoverMode = data.ReadString();
380 std::string deviceName = data.ReadString();
381 int32_t ret = UpdateScannerName(serialNumber, discoverMode, deviceName);
382 reply.WriteInt32(ret);
383 SCAN_HILOGD("ScanServiceStub::OnUpdateScannerName end");
384 return ret == E_SCAN_NONE;
385 }
386
OnAddPrinter(MessageParcel & data,MessageParcel & reply)387 bool ScanServiceStub::OnAddPrinter(MessageParcel &data, MessageParcel &reply)
388 {
389 SCAN_HILOGD("ScanServiceStub::OnAddPrinter start");
390 std::string serialNumber = data.ReadString();
391 std::string discoverMode = data.ReadString();
392 int32_t ret = AddPrinter(serialNumber, discoverMode);
393 reply.WriteInt32(ret);
394 SCAN_HILOGD("ScanServiceStub::OnAddPrinter end");
395 return ret == E_SCAN_NONE;
396 }
397
398 } // namespace OHOS::Scan
399