• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "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