• 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 #include <string>
16 #include "securec.h"
17 #include "napi_scan_utils.h"
18 #include "scan_log.h"
19 #include "scan_callback.h"
20 #include "scan_manager_client.h"
21 #include "napi_inner_scan.h"
22 
23 
24 namespace OHOS::Scan {
25 const std::string GET_FRAME_RES_EVENT_TYPE = "getFrameResult";
26 const std::string SCAN_DEVICE_FOUND_TCP = "scanDeviceFoundTCP";
27 const std::string SCAN_DEVICE_FOUND = "scanDeviceFound";
28 const std::string SCAN_DEVICE_SYNC = "scanDeviceSync";
29 const std::string SCAN_DEVICE_ADD = "scanDeviceAdd";
30 const std::string SCAN_DEVICE_DEL = "scanDeviceDel";
31 const std::string SCAN_INIT_EVENT = "scanInitEvent";
32 
InitScan(napi_env env,napi_callback_info info)33 napi_value NapiInnerScan::InitScan(napi_env env, napi_callback_info info)
34 {
35     SCAN_HILOGE("Enter InitScan---->");
36     auto context = std::make_shared<NapiScanContext>();
37     auto input = [context](napi_env env, size_t argc, napi_value *argv, napi_value self) -> napi_status {
38         SCAN_ASSERT_BASE(env, argc == NapiScanUtils::ARGC_ZERO, " should 0 parameter!", napi_invalid_arg);
39         return napi_ok;
40     };
41     auto output = [context](napi_env env, napi_value *result) -> napi_status {
42         napi_status status = napi_create_int32(env, context->scanVersion, result);
43         SCAN_HILOGD("output ---- [%{public}s], status[%{public}d]", context->result ? "true" : "false", status);
44         return status;
45     };
46     auto exec = [context](ScanAsyncCall::Context *ctx) {
47         int32_t ret = ScanManagerClient::GetInstance()->InitScan(context->scanVersion);
48         context->result = ret == E_SCAN_NONE;
49         if (ret != E_SCAN_NONE) {
50             SCAN_HILOGE("Failed to init the scan fwk");
51             context->SetErrorIndex(ret);
52         }
53     };
54     context->SetAction(std::move(input), std::move(output));
55     ScanAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<ScanAsyncCall::Context>(context));
56     return asyncCall.Call(env, exec);
57 }
58 
ExitScan(napi_env env,napi_callback_info info)59 napi_value NapiInnerScan::ExitScan(napi_env env, napi_callback_info info)
60 {
61     SCAN_HILOGD("Enter ExitScan---->");
62     auto context = std::make_shared<NapiScanContext>();
63     auto input = [context](napi_env env, size_t argc, napi_value *argv, napi_value self) -> napi_status {
64         SCAN_ASSERT_BASE(env, argc == NapiScanUtils::ARGC_ZERO, " should 0 parameter!", napi_invalid_arg);
65         return napi_ok;
66     };
67     auto output = [context](napi_env env, napi_value *result) -> napi_status {
68         napi_status status = napi_get_boolean(env, context->result, result);
69         SCAN_HILOGD("output ---- [%{public}s], status[%{public}d]", context->result ? "true" : "false", status);
70         return status;
71     };
72     auto exec = [context](ScanAsyncCall::Context *ctx) {
73         int32_t ret = ScanManagerClient::GetInstance()->ExitScan();
74         context->result = ret == E_SCAN_NONE;
75         if (ret != E_SCAN_NONE) {
76             SCAN_HILOGE("Failed to exit");
77             context->SetErrorIndex(ret);
78         }
79     };
80     context->SetAction(std::move(input), std::move(output));
81     ScanAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<ScanAsyncCall::Context>(context));
82     return asyncCall.Call(env, exec);
83 }
84 
GetScannerList(napi_env env,napi_callback_info info)85 napi_value NapiInnerScan::GetScannerList(napi_env env, napi_callback_info info)
86 {
87     SCAN_HILOGD("Enter GetScannerList---->");
88     auto context = std::make_shared<NapiScanContext>();
89     auto input = [context](napi_env env, size_t argc, napi_value *argv, napi_value self) -> napi_status {
90         SCAN_ASSERT_BASE(env, argc == NapiScanUtils::ARGC_ZERO, " should 0 parameter!", napi_invalid_arg);
91         return napi_ok;
92     };
93     auto output = [context](napi_env env, napi_value *result) -> napi_status {
94         napi_status status = napi_get_boolean(env, context->result, result);
95         SCAN_HILOGD("output ---- [%{public}s], status[%{public}d]", context->result ? "true" : "false", status);
96         return status;
97     };
98     auto exec = [context](ScanAsyncCall::Context *ctx) {
99         auto ScanManagerClientPtr = ScanManagerClient::GetInstance();
100         if (ScanManagerClientPtr == nullptr) {
101             SCAN_HILOGE("ScanManagerClientPtr is a nullptr");
102             context->result = false;
103             context->SetErrorIndex(E_SCAN_GENERIC_FAILURE);
104             return;
105         }
106         int32_t ret = ScanManagerClientPtr->GetScannerList();
107         context->result = ret == E_SCAN_NONE;
108         if (ret != E_SCAN_NONE) {
109             SCAN_HILOGE("Failed to exit");
110             context->SetErrorIndex(ret);
111         }
112     };
113     context->SetAction(std::move(input), std::move(output));
114     ScanAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<ScanAsyncCall::Context>(context));
115     return asyncCall.Call(env, exec);
116 }
117 
StopDiscover(napi_env env,napi_callback_info info)118 napi_value NapiInnerScan::StopDiscover(napi_env env, napi_callback_info info)
119 {
120     SCAN_HILOGE("Enter StopDiscover---->");
121     auto context = std::make_shared<NapiScanContext>();
122     auto input = [context](napi_env env, size_t argc, napi_value *argv, napi_value self) -> napi_status {
123         SCAN_ASSERT_BASE(env, argc == NapiScanUtils::ARGC_ZERO, " should 0 parameter!", napi_invalid_arg);
124         return napi_ok;
125     };
126     auto output = [context](napi_env env, napi_value *result) -> napi_status {
127         napi_status status = napi_create_int32(env, context->scanVersion, result);
128         SCAN_HILOGD("output ---- [%{public}s], status[%{public}d]", context->result ? "true" : "false", status);
129         return status;
130     };
131     auto exec = [context](ScanAsyncCall::Context *ctx) {
132         int32_t ret = ScanManagerClient::GetInstance()->StopDiscover();
133         context->result = ret == E_SCAN_NONE;
134         if (ret != E_SCAN_NONE) {
135             SCAN_HILOGE("Failed to StopDiscover");
136             context->SetErrorIndex(ret);
137         }
138     };
139     context->SetAction(std::move(input), std::move(output));
140     ScanAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<ScanAsyncCall::Context>(context));
141     return asyncCall.Call(env, exec);
142 }
143 
OpenScanner(napi_env env,napi_callback_info info)144 napi_value NapiInnerScan::OpenScanner(napi_env env, napi_callback_info info)
145 {
146     SCAN_HILOGD("start to OpenScanner");
147     auto context = std::make_shared<NapiScanContext>();
148     auto input = [context](napi_env env, size_t argc, napi_value *argv, napi_value self) -> napi_status {
149         SCAN_ASSERT_BASE(env, argc == NapiScanUtils::ARGC_ONE, " should 1 parameter!", napi_invalid_arg);
150         napi_valuetype valuetype = napi_undefined;
151         SCAN_CALL_BASE(env, napi_typeof(env, argv[NapiScanUtils::INDEX_ZERO], &valuetype), napi_invalid_arg);
152         SCAN_ASSERT_BASE(env, valuetype == napi_string, "scannerId is not a string", napi_string_expected);
153         std::string scannerId = NapiScanUtils::GetStringFromValueUtf8(env, argv[NapiScanUtils::INDEX_ZERO]);
154         SCAN_HILOGD("scannerId : %{public}s", scannerId.c_str());
155         context->scannerId = scannerId;
156         return napi_ok;
157     };
158     auto output = [context](napi_env env, napi_value *result) -> napi_status {
159         napi_status status = napi_get_boolean(env, context->result, result);
160         SCAN_HILOGD("output ---- [%{public}s], status[%{public}d]", context->result ? "true" : "false", status);
161         return status;
162     };
163     auto exec = [context](ScanAsyncCall::Context *ctx) {
164         int32_t ret = ScanManagerClient::GetInstance()->OpenScanner(context->scannerId);
165         context->result = ret == E_SCAN_NONE;
166         if (ret != E_SCAN_NONE) {
167             SCAN_HILOGE("Failed to open the scanner");
168             context->SetErrorIndex(ret);
169         }
170     };
171     context->SetAction(std::move(input), std::move(output));
172     ScanAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<ScanAsyncCall::Context>(context));
173     return asyncCall.Call(env, exec);
174 }
175 
CloseScanner(napi_env env,napi_callback_info info)176 napi_value NapiInnerScan::CloseScanner(napi_env env, napi_callback_info info)
177 {
178     SCAN_HILOGD("start to CloseScanner");
179     auto context = std::make_shared<NapiScanContext>();
180     auto input = [context](napi_env env, size_t argc, napi_value *argv, napi_value self) -> napi_status {
181         SCAN_ASSERT_BASE(env, argc == NapiScanUtils::ARGC_ONE, " should 1 parameter!", napi_invalid_arg);
182         napi_valuetype valuetype = napi_undefined;
183         SCAN_CALL_BASE(env, napi_typeof(env, argv[NapiScanUtils::INDEX_ZERO], &valuetype), napi_invalid_arg);
184         SCAN_ASSERT_BASE(env, valuetype == napi_string, "scannerId is not a string", napi_string_expected);
185         std::string scannerId = NapiScanUtils::GetStringFromValueUtf8(env, argv[NapiScanUtils::INDEX_ZERO]);
186         SCAN_HILOGD("scannerId : %{public}s", scannerId.c_str());
187         context->scannerId = scannerId;
188         return napi_ok;
189     };
190     auto output = [context](napi_env env, napi_value *result) -> napi_status {
191         napi_status status = napi_get_boolean(env, context->result, result);
192         SCAN_HILOGD("output ---- [%{public}s], status[%{public}d]", context->result ? "true" : "false", status);
193         return status;
194     };
195     auto exec = [context](ScanAsyncCall::Context *ctx) {
196         int32_t ret = ScanManagerClient::GetInstance()->CloseScanner(context->scannerId);
197         context->result = ret == E_SCAN_NONE;
198         if (ret != E_SCAN_NONE) {
199             SCAN_HILOGE("Failed to close the scanner");
200             context->SetErrorIndex(ret);
201         }
202     };
203     context->SetAction(std::move(input), std::move(output));
204     ScanAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<ScanAsyncCall::Context>(context));
205     return asyncCall.Call(env, exec);
206 }
207 
GetScanOptionDesc(napi_env env,napi_callback_info info)208 napi_value NapiInnerScan::GetScanOptionDesc(napi_env env, napi_callback_info info)
209 {
210     SCAN_HILOGD("start to GetScanOptionDesc");
211     auto context = std::make_shared<NapiScanContext>();
212     auto input = [context](napi_env env, size_t argc, napi_value *argv, napi_value self) -> napi_status {
213         SCAN_ASSERT_BASE(env, argc == NapiScanUtils::ARGC_TWO, " should 2 parameter!", napi_invalid_arg);
214         napi_valuetype valuetype = napi_undefined;
215         SCAN_CALL_BASE(env, napi_typeof(env, argv[NapiScanUtils::INDEX_ZERO], &valuetype), napi_invalid_arg);
216         SCAN_ASSERT_BASE(env, valuetype == napi_string, "scannerId is not a string", napi_string_expected);
217         std::string scannerId = NapiScanUtils::GetStringFromValueUtf8(env, argv[NapiScanUtils::INDEX_ZERO]);
218 
219         valuetype = napi_undefined;
220         SCAN_CALL_BASE(env, napi_typeof(env, argv[NapiScanUtils::INDEX_ONE], &valuetype), napi_invalid_arg);
221         SCAN_ASSERT_BASE(env, valuetype == napi_number, "optionIndex is not a number", napi_number_expected);
222         int32_t optionIndex = NapiScanUtils::GetInt32FromValue(env, argv[NapiScanUtils::INDEX_ONE]);
223         context->scannerId = scannerId;
224         context->optionIndex = optionIndex;
225         return napi_ok;
226     };
227     auto output = [context](napi_env env, napi_value *result) -> napi_status {
228         *result = ScanOptionDescriptorHelper::MakeJsObject(env, context->desc);
229         return napi_ok;
230     };
231     auto exec = [context](ScanAsyncCall::Context *ctx) {
232         int32_t ret = ScanManagerClient::GetInstance()->GetScanOptionDesc(context->scannerId, context->optionIndex,\
233             context->desc);
234         context->result = ret == E_SCAN_NONE;
235         if (ret != E_SCAN_NONE) {
236             SCAN_HILOGE("Failed to get the scan option description");
237             context->SetErrorIndex(ret);
238         }
239     };
240     context->SetAction(std::move(input), std::move(output));
241     ScanAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<ScanAsyncCall::Context>(context));
242     return asyncCall.Call(env, exec);
243 }
244 
SetScanOption(napi_env env,napi_callback_info info)245 napi_value NapiInnerScan::SetScanOption(napi_env env, napi_callback_info info)
246 {
247     SCAN_HILOGD("Enter SetScanOption---->");
248     auto context = std::make_shared<NapiScanContext>();
249     auto input = [context](napi_env env, size_t argc, napi_value *argv, napi_value self) -> napi_status {
250         SCAN_ASSERT_BASE(env, argc == NapiScanUtils::ARGC_THREE, " should 3 parameter!", napi_invalid_arg);
251 
252         napi_valuetype valuetype = napi_undefined;
253         SCAN_CALL_BASE(env, napi_typeof(env, argv[NapiScanUtils::INDEX_ZERO], &valuetype), napi_invalid_arg);
254         SCAN_ASSERT_BASE(env, valuetype == napi_string, "scannerId is not a string", napi_string_expected);
255         std::string scannerId = NapiScanUtils::GetStringFromValueUtf8(env, argv[NapiScanUtils::INDEX_ZERO]);
256         context->scannerId = scannerId;
257 
258         valuetype = napi_undefined;
259         SCAN_CALL_BASE(env, napi_typeof(env, argv[NapiScanUtils::INDEX_ONE], &valuetype), napi_invalid_arg);
260         SCAN_ASSERT_BASE(env, valuetype == napi_number, "optionIndex is not a number", napi_number_expected);
261         int32_t optionIndex = NapiScanUtils::GetInt32FromValue(env, argv[NapiScanUtils::INDEX_ONE]);
262         context->optionIndex = optionIndex;
263 
264         auto optionValue = ScanOptionValueHelper::BuildFromJs(env, argv[NapiScanUtils::INDEX_TWO]);
265         if (optionValue == nullptr) {
266             SCAN_HILOGE("Parse scan option value error!");
267             context->SetErrorIndex(E_SCAN_INVALID_PARAMETER);
268             return napi_invalid_arg;
269         }
270         context->optionValue = *optionValue;
271         return napi_ok;
272     };
273     auto output = [context](napi_env env, napi_value *result) -> napi_status {
274         napi_status status = napi_create_int32(env, context->info, result);
275         SCAN_HILOGD("output ---- [%{public}s], status[%{public}d]", context->result ? "true" : "false", status);
276         return status;
277     };
278     auto exec = [context](ScanAsyncCall::Context *ctx) {
279         int32_t ret = ScanManagerClient::GetInstance()->OpScanOptionValue(context->scannerId, context->optionIndex,
280         SCAN_ACTION_SET_VALUE, context->optionValue, context->info);
281         context->result = ret == E_SCAN_NONE;
282         if (ret != E_SCAN_NONE) {
283             SCAN_HILOGE("Failed to set the scan option");
284             context->SetErrorIndex(ret);
285         }
286     };
287     context->SetAction(std::move(input), std::move(output));
288     ScanAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<ScanAsyncCall::Context>(context));
289     return asyncCall.Call(env, exec);
290 }
291 
SetScanAutoOption(napi_env env,napi_callback_info info)292 napi_value NapiInnerScan::SetScanAutoOption(napi_env env, napi_callback_info info)
293 {
294     SCAN_HILOGD("Enter SetScanAutoOption---->");
295     auto context = std::make_shared<NapiScanContext>();
296     auto input = [context](napi_env env, size_t argc, napi_value *argv, napi_value self) -> napi_status {
297         SCAN_ASSERT_BASE(env, argc == NapiScanUtils::ARGC_TWO, " should 2 parameter!", napi_invalid_arg);
298 
299         napi_valuetype valuetype = napi_undefined;
300         SCAN_CALL_BASE(env, napi_typeof(env, argv[NapiScanUtils::INDEX_ZERO], &valuetype), napi_invalid_arg);
301         SCAN_ASSERT_BASE(env, valuetype == napi_string, "scannerId is not a string", napi_string_expected);
302         std::string scannerId = NapiScanUtils::GetStringFromValueUtf8(env, argv[NapiScanUtils::INDEX_ZERO]);
303         context->scannerId = scannerId;
304 
305         valuetype = napi_undefined;
306         SCAN_CALL_BASE(env, napi_typeof(env, argv[NapiScanUtils::INDEX_ONE], &valuetype), napi_invalid_arg);
307         SCAN_ASSERT_BASE(env, valuetype == napi_number, "optionIndex is not a number", napi_number_expected);
308         int32_t optionIndex = NapiScanUtils::GetInt32FromValue(env, argv[NapiScanUtils::INDEX_ONE]);
309         context->optionIndex = optionIndex;
310 
311         return napi_ok;
312     };
313     auto output = [context](napi_env env, napi_value *result) -> napi_status {
314         napi_status status = napi_create_int32(env, context->result, result);
315         SCAN_HILOGD("output ---- [%{public}s], status[%{public}d]", context->result ? "true" : "false", status);
316         return status;
317     };
318     auto exec = [context](ScanAsyncCall::Context *ctx) {
319         int32_t ret = ScanManagerClient::GetInstance()->OpScanOptionValue(context->scannerId,
320         context->optionIndex, SCAN_ACTION_SET_AUTO, context->optionValue, context->info);
321         context->result = ret == E_SCAN_NONE;
322         if (ret != E_SCAN_NONE) {
323             SCAN_HILOGE("Failed to set the auto scan option");
324             context->SetErrorIndex(ret);
325         }
326     };
327     context->SetAction(std::move(input), std::move(output));
328     ScanAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<ScanAsyncCall::Context>(context));
329     return asyncCall.Call(env, exec);
330 }
331 
GetScanOption(napi_env env,napi_callback_info info)332 napi_value NapiInnerScan::GetScanOption(napi_env env, napi_callback_info info)
333 {
334     SCAN_HILOGD("Enter GetScanOption---->");
335     auto context = std::make_shared<NapiScanContext>();
336     auto input = [context](napi_env env, size_t argc, napi_value *argv, napi_value self) -> napi_status {
337         SCAN_ASSERT_BASE(env, argc == NapiScanUtils::ARGC_FOUR, " should 4 parameter!", napi_invalid_arg);
338 
339         napi_valuetype valuetype = napi_undefined;
340         SCAN_CALL_BASE(env, napi_typeof(env, argv[NapiScanUtils::INDEX_ZERO], &valuetype), napi_invalid_arg);
341         SCAN_ASSERT_BASE(env, valuetype == napi_string, "scannerId is not a string", napi_string_expected);
342         std::string scannerId = NapiScanUtils::GetStringFromValueUtf8(env, argv[NapiScanUtils::INDEX_ZERO]);
343         context->scannerId = scannerId;
344 
345         valuetype = napi_undefined;
346         SCAN_CALL_BASE(env, napi_typeof(env, argv[NapiScanUtils::INDEX_ONE], &valuetype), napi_invalid_arg);
347         SCAN_ASSERT_BASE(env, valuetype == napi_number, "optionIndex is not a number", napi_number_expected);
348         int32_t optionIndex = NapiScanUtils::GetInt32FromValue(env, argv[NapiScanUtils::INDEX_ONE]);
349         context->optionIndex = optionIndex;
350 
351         valuetype = napi_undefined;
352         SCAN_CALL_BASE(env, napi_typeof(env, argv[NapiScanUtils::INDEX_TWO], &valuetype), napi_invalid_arg);
353         SCAN_ASSERT_BASE(env, valuetype == napi_number, "valueType is not a number", napi_number_expected);
354         uint32_t valueType = NapiScanUtils::GetUint32FromValue(env, argv[NapiScanUtils::INDEX_TWO]);
355         context->optionValue.SetScanOptionValueType((ScanOptionValueType)valueType);
356 
357         SCAN_CALL_BASE(env, napi_typeof(env, argv[NapiScanUtils::INDEX_THREE], &valuetype), napi_invalid_arg);
358         SCAN_ASSERT_BASE(env, valuetype == napi_number, "valueSize is not a number", napi_number_expected);
359         int32_t valueSize = NapiScanUtils::GetInt32FromValue(env, argv[NapiScanUtils::INDEX_THREE]);
360         context->optionValue.SetValueSize(valueSize);
361 
362         context->optionValue.Dump();
363         SCAN_HILOGE("success to get the scan option");
364         return napi_ok;
365     };
366     auto output = [context](napi_env env, napi_value *result) -> napi_status {
367         *result = ScanOptionValueHelper::MakeJsObject(env, context->optionValue);
368         return napi_ok;
369     };
370     auto exec = [context](ScanAsyncCall::Context *ctx) {
371         int32_t ret = ScanManagerClient::GetInstance()->OpScanOptionValue(context->scannerId,
372         context->optionIndex, SCAN_ACTION_GET_VALUE, context->optionValue, context->info);
373         context->result = ret == E_SCAN_NONE;
374         if (ret != E_SCAN_NONE) {
375             SCAN_HILOGE("Failed to get the scan option");
376             context->SetErrorIndex(ret);
377         }
378     };
379     context->SetAction(std::move(input), std::move(output));
380     ScanAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<ScanAsyncCall::Context>(context));
381     return asyncCall.Call(env, exec);
382 }
383 
GetScanParameters(napi_env env,napi_callback_info info)384 napi_value NapiInnerScan::GetScanParameters(napi_env env, napi_callback_info info)
385 {
386     SCAN_HILOGD("start to GetScanParameters");
387     auto context = std::make_shared<NapiScanContext>();
388     auto input = [context](napi_env env, size_t argc, napi_value *argv, napi_value self) -> napi_status {
389         SCAN_ASSERT_BASE(env, argc == NapiScanUtils::ARGC_ONE, " should 1 parameter!", napi_invalid_arg);
390         napi_valuetype valuetype = napi_undefined;
391         SCAN_CALL_BASE(env, napi_typeof(env, argv[NapiScanUtils::INDEX_ZERO], &valuetype), napi_invalid_arg);
392         SCAN_ASSERT_BASE(env, valuetype == napi_string, "scannerId is not a string", napi_string_expected);
393         std::string scannerId = NapiScanUtils::GetStringFromValueUtf8(env, argv[NapiScanUtils::INDEX_ZERO]);
394         context->scannerId = scannerId;
395         return napi_ok;
396     };
397     auto output = [context](napi_env env, napi_value *result) -> napi_status {
398         *result = ScanParametersHelper::MakeJsObject(env, context->para);
399         return napi_ok;
400     };
401     auto exec = [context](ScanAsyncCall::Context *ctx) {
402         int32_t ret = ScanManagerClient::GetInstance()->GetScanParameters(context->scannerId, context->para);
403         context->result = ret == E_SCAN_NONE;
404         if (ret != E_SCAN_NONE) {
405             SCAN_HILOGE("Failed to get the scan parameters description");
406             context->SetErrorIndex(ret);
407         }
408     };
409     context->SetAction(std::move(input), std::move(output));
410     ScanAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<ScanAsyncCall::Context>(context));
411     return asyncCall.Call(env, exec);
412 }
413 
StartScan(napi_env env,napi_callback_info info)414 napi_value NapiInnerScan::StartScan(napi_env env, napi_callback_info info)
415 {
416     SCAN_HILOGD("start to StartScan");
417     auto context = std::make_shared<NapiScanContext>();
418     auto input = [context](napi_env env, size_t argc, napi_value *argv, napi_value self) -> napi_status {
419         SCAN_ASSERT_BASE(env, argc == NapiScanUtils::ARGC_TWO, " should 2 parameter!", napi_invalid_arg);
420         napi_valuetype valueType = napi_undefined;
421         SCAN_CALL_BASE(env, napi_typeof(env, argv[NapiScanUtils::INDEX_ZERO], &valueType), napi_invalid_arg);
422         SCAN_ASSERT_BASE(env, valueType == napi_string, "scannerId is not a string", napi_string_expected);
423         std::string scannerId = NapiScanUtils::GetStringFromValueUtf8(env, argv[NapiScanUtils::INDEX_ZERO]);
424         SCAN_HILOGD("scannerId : %{public}s", scannerId.c_str());
425         context->scannerId = scannerId;
426         valueType = napi_undefined;
427         SCAN_CALL_BASE(env, napi_typeof(env, argv[NapiScanUtils::INDEX_ONE], &valueType), napi_invalid_arg);
428         SCAN_ASSERT_BASE(env, valueType == napi_boolean, "batchMode is not a boolean", napi_boolean_expected);
429         bool batchMode = NapiScanUtils::GetBooleanFromValue(env, argv[NapiScanUtils::INDEX_ONE]);
430         context->batchMode = batchMode;
431         return napi_ok;
432     };
433     auto output = [context](napi_env env, napi_value *result) -> napi_status {
434         napi_status status = napi_get_boolean(env, context->result, result);
435         SCAN_HILOGD("output ---- [%{public}s], status[%{public}d]", context->result ? "true" : "false", status);
436         return status;
437     };
438     auto exec = [context](ScanAsyncCall::Context *ctx) {
439         int32_t ret = ScanManagerClient::GetInstance()->StartScan(context->scannerId, context->batchMode);
440         context->result = ret == E_SCAN_NONE;
441         if (ret != E_SCAN_NONE) {
442             SCAN_HILOGE("Failed to start the scan job");
443             context->SetErrorIndex(ret);
444         }
445     };
446     context->SetAction(std::move(input), std::move(output));
447     ScanAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<ScanAsyncCall::Context>(context));
448     return asyncCall.Call(env, exec);
449 }
450 
GetSingleFrameFD(napi_env env,napi_callback_info info)451 napi_value NapiInnerScan::GetSingleFrameFD(napi_env env, napi_callback_info info)
452 {
453     SCAN_HILOGD("start to GetSingleFrameFD");
454     auto context = std::make_shared<NapiScanContext>();
455     auto input = [context](napi_env env, size_t argc, napi_value *argv, napi_value self) -> napi_status {
456         SCAN_ASSERT_BASE(env, argc == NapiScanUtils::ARGC_TWO, " should 2 parameter!", napi_invalid_arg);
457         napi_valuetype valuetype = napi_undefined;
458         SCAN_CALL_BASE(env, napi_typeof(env, argv[NapiScanUtils::INDEX_ZERO], &valuetype), napi_invalid_arg);
459         SCAN_ASSERT_BASE(env, valuetype == napi_string, "scannerId is not a string", napi_string_expected);
460         std::string scannerId = NapiScanUtils::GetStringFromValueUtf8(env, argv[NapiScanUtils::INDEX_ZERO]);
461         valuetype = napi_undefined;
462         SCAN_CALL_BASE(env, napi_typeof(env, argv[NapiScanUtils::INDEX_ONE], &valuetype), napi_invalid_arg);
463         SCAN_ASSERT_BASE(env, valuetype == napi_number, "fd is not a number", napi_number_expected);
464         uint32_t fd = NapiScanUtils::GetUint32FromValue(env, argv[NapiScanUtils::INDEX_ONE]);
465         SCAN_HILOGE("scannerId : %{public}s, fd: %{public}u", scannerId.c_str(), fd);
466         context->scannerId = scannerId;
467         context->image_fd = fd;
468         return napi_ok;
469     };
470     auto output = [context](napi_env env, napi_value *result) -> napi_status {
471         napi_status status = napi_create_int32(env, context->frameSize, result);
472         SCAN_HILOGD("output ---- [%{public}s], status[%{public}d]", context->result ? "true" : "false", status);
473         return status;
474     };
475     auto exec = [context](ScanAsyncCall::Context *ctx) {
476         int32_t ret = ScanManagerClient::GetInstance()->GetSingleFrameFD(
477             context->scannerId, context->frameSize, context->image_fd);
478         context->result = ret == E_SCAN_NONE;
479         if (ret != E_SCAN_NONE) {
480             SCAN_HILOGE("Failed to get a single frame");
481             context->SetErrorIndex(ret);
482         }
483     };
484     context->SetAction(std::move(input), std::move(output));
485     ScanAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<ScanAsyncCall::Context>(context));
486     return asyncCall.Call(env, exec);
487 }
488 
CancelScan(napi_env env,napi_callback_info info)489 napi_value NapiInnerScan::CancelScan(napi_env env, napi_callback_info info)
490 {
491     SCAN_HILOGD("start to CancelScan");
492     auto context = std::make_shared<NapiScanContext>();
493     auto input = [context](napi_env env, size_t argc, napi_value *argv, napi_value self) -> napi_status {
494         SCAN_ASSERT_BASE(env, argc == NapiScanUtils::ARGC_ONE, " should 1 parameter!", napi_invalid_arg);
495         napi_valuetype valuetype = napi_undefined;
496         SCAN_CALL_BASE(env, napi_typeof(env, argv[NapiScanUtils::INDEX_ZERO], &valuetype), napi_invalid_arg);
497         SCAN_ASSERT_BASE(env, valuetype == napi_string, "scannerId is not a string", napi_string_expected);
498         std::string scannerId = NapiScanUtils::GetStringFromValueUtf8(env, argv[NapiScanUtils::INDEX_ZERO]);
499         SCAN_HILOGD("scannerId : %{public}s", scannerId.c_str());
500         context->scannerId = scannerId;
501         return napi_ok;
502     };
503     auto output = [context](napi_env env, napi_value *result) -> napi_status {
504         napi_status status = napi_get_boolean(env, context->result, result);
505         SCAN_HILOGD("output ---- [%{public}s], status[%{public}d]", context->result ? "true" : "false", status);
506         return status;
507     };
508     auto exec = [context](ScanAsyncCall::Context *ctx) {
509         int32_t ret = ScanManagerClient::GetInstance()->CancelScan(context->scannerId);
510         context->result = ret == E_SCAN_NONE;
511         if (ret != E_SCAN_NONE) {
512             SCAN_HILOGE("Failed to cancel the scan job");
513             context->SetErrorIndex(ret);
514         }
515     };
516     context->SetAction(std::move(input), std::move(output));
517     ScanAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<ScanAsyncCall::Context>(context));
518     return asyncCall.Call(env, exec);
519 }
520 
SetScanIOMode(napi_env env,napi_callback_info info)521 napi_value NapiInnerScan::SetScanIOMode(napi_env env, napi_callback_info info)
522 {
523     SCAN_HILOGD("start to SetScanIOMode");
524     auto context = std::make_shared<NapiScanContext>();
525     auto input = [context](napi_env env, size_t argc, napi_value *argv, napi_value self) -> napi_status {
526         SCAN_ASSERT_BASE(env, argc == NapiScanUtils::ARGC_TWO, " should 2 parameter!", napi_invalid_arg);
527         napi_valuetype valuetype = napi_undefined;
528         SCAN_CALL_BASE(env, napi_typeof(env, argv[NapiScanUtils::INDEX_ZERO], &valuetype), napi_invalid_arg);
529         SCAN_ASSERT_BASE(env, valuetype == napi_string, "scannerId is not a string", napi_string_expected);
530 
531         valuetype = napi_undefined;
532         SCAN_CALL_BASE(env, napi_typeof(env, argv[NapiScanUtils::INDEX_ONE], &valuetype), napi_invalid_arg);
533         SCAN_ASSERT_BASE(env, valuetype == napi_boolean, "isNonBlocking is not a boolean", napi_boolean_expected);
534         std::string scannerId = NapiScanUtils::GetStringFromValueUtf8(env, argv[NapiScanUtils::INDEX_ZERO]);
535         bool isNonBlocking = NapiScanUtils::GetBooleanFromValue(env, argv[NapiScanUtils::INDEX_ONE]);
536         SCAN_HILOGD("scannerId : %{public}s, isNonBlocking : %{public}d", scannerId.c_str(), isNonBlocking);
537         context->scannerId = scannerId;
538         context->isNonBlocking = isNonBlocking;
539         return napi_ok;
540     };
541     auto output = [context](napi_env env, napi_value *result) -> napi_status {
542         napi_status status = napi_get_boolean(env, context->result, result);
543         SCAN_HILOGD("output ---- [%{public}s], status[%{public}d]", context->result ? "true" : "false", status);
544         return status;
545     };
546     auto exec = [context](ScanAsyncCall::Context *ctx) {
547         int32_t ret = ScanManagerClient::GetInstance()->SetScanIOMode(context->scannerId, context->isNonBlocking);
548         context->result = ret == E_SCAN_NONE;
549         if (ret != E_SCAN_NONE) {
550             SCAN_HILOGE("Failed to set the scan IO mode");
551             context->SetErrorIndex(ret);
552         }
553     };
554     context->SetAction(std::move(input), std::move(output));
555     ScanAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<ScanAsyncCall::Context>(context));
556     return asyncCall.Call(env, exec);
557 }
558 
GetScanSelectFd(napi_env env,napi_callback_info info)559 napi_value NapiInnerScan::GetScanSelectFd(napi_env env, napi_callback_info info)
560 {
561     SCAN_HILOGD("start to GetScanSelectFd");
562     auto context = std::make_shared<NapiScanContext>();
563     auto input = [context](napi_env env, size_t argc, napi_value *argv, napi_value self) -> napi_status {
564         SCAN_ASSERT_BASE(env, argc == NapiScanUtils::ARGC_ONE, " should 1 parameter!", napi_invalid_arg);
565         napi_valuetype valuetype = napi_undefined;
566         SCAN_CALL_BASE(env, napi_typeof(env, argv[NapiScanUtils::INDEX_ZERO], &valuetype), napi_invalid_arg);
567         SCAN_ASSERT_BASE(env, valuetype == napi_string, "scannerId is not a string", napi_string_expected);
568         std::string scannerId = NapiScanUtils::GetStringFromValueUtf8(env, argv[NapiScanUtils::INDEX_ZERO]);
569         SCAN_HILOGD("scannerId : %{public}s", scannerId.c_str());
570         context->scannerId = scannerId;
571         return napi_ok;
572     };
573     auto output = [context](napi_env env, napi_value *result) -> napi_status {
574         napi_status status = napi_create_int32(env, context->fd, result);
575         SCAN_HILOGD("output ---- [%{public}s], status[%{public}d]", context->result ? "true" : "false", status);
576         return status;
577     };
578     auto exec = [context](ScanAsyncCall::Context *ctx) {
579         int32_t ret = ScanManagerClient::GetInstance()->GetScanSelectFd(context->scannerId, context->fd);
580         context->result = ret == E_SCAN_NONE;
581         if (ret != E_SCAN_NONE) {
582             SCAN_HILOGE("Failed to get the scan select fd");
583             context->SetErrorIndex(ret);
584         }
585     };
586     context->SetAction(std::move(input), std::move(output));
587     ScanAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<ScanAsyncCall::Context>(context));
588     return asyncCall.Call(env, exec);
589 }
590 
On(napi_env env,napi_callback_info info)591 napi_value NapiInnerScan::On(napi_env env, napi_callback_info info)
592 {
593     SCAN_HILOGD("Enter on---->");
594     size_t argc = NapiScanUtils::MAX_ARGC;
595     napi_value argv[NapiScanUtils::MAX_ARGC] = { nullptr };
596     napi_value thisVal = nullptr;
597     void *data = nullptr;
598     SCAN_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVal, &data));
599     SCAN_ASSERT(env, argc == NapiScanUtils::ARGC_TWO, "need 2 parameter!");
600 
601     napi_valuetype valuetype = napi_undefined;
602     SCAN_CALL(env, napi_typeof(env, argv[0], &valuetype));
603     SCAN_ASSERT(env, valuetype == napi_string, "type is not a string");
604     std::string type = NapiScanUtils::GetStringFromValueUtf8(env, argv[0]);
605     SCAN_HILOGD("type : %{public}s", type.c_str());
606 
607     if (!NapiInnerScan::IsSupportType(type)) {
608         SCAN_HILOGE("Event On type : %{public}s not support", type.c_str());
609         return nullptr;
610     }
611 
612     valuetype = napi_undefined;
613     napi_typeof(env, argv[1], &valuetype);
614     SCAN_ASSERT(env, valuetype == napi_function, "callback is not a function");
615 
616     napi_ref callbackRef = NapiScanUtils::CreateReference(env, argv[1]);
617     sptr<IScanCallback> callback = new (std::nothrow) ScanCallback(env, callbackRef);
618     if (callback == nullptr) {
619         SCAN_HILOGE("create scan callback object fail");
620         return nullptr;
621     }
622     int32_t ret = ScanManagerClient::GetInstance()->On("", type, callback);
623     if (ret != E_SCAN_NONE) {
624         SCAN_HILOGE("Failed to register event");
625         return nullptr;
626     }
627     return nullptr;
628 }
629 
Off(napi_env env,napi_callback_info info)630 napi_value NapiInnerScan::Off(napi_env env, napi_callback_info info)
631 {
632     SCAN_HILOGD("Enter OFF---->");
633     return nullptr;
634 }
635 
GetScannerState(napi_env env,napi_callback_info info)636 napi_value NapiInnerScan::GetScannerState(napi_env env, napi_callback_info info)
637 {
638     SCAN_HILOGD("Enter GetScannerState---->");
639     auto context = std::make_shared<NapiScanContext>();
640     auto input = [context](napi_env env, size_t argc, napi_value *argv, napi_value self) -> napi_status {
641         SCAN_ASSERT_BASE(env, argc == NapiScanUtils::ARGC_ZERO, " should 0 parameter!", napi_invalid_arg);
642         return napi_ok;
643     };
644     auto output = [context](napi_env env, napi_value *result) -> napi_status {
645         napi_status status = napi_create_int32(env, context->scannerState, result);
646         SCAN_HILOGD("output ---- [%{public}s], status[%{public}d]", context->result ? "true" : "false", status);
647         return status;
648     };
649     auto exec = [context](ScanAsyncCall::Context *ctx) {
650         int32_t ret = ScanManagerClient::GetInstance()->GetScannerState(context->scannerState);
651         context->result = ret == E_SCAN_NONE;
652         if (ret != E_SCAN_NONE) {
653             SCAN_HILOGE("Failed to init the scan fwk");
654             context->SetErrorIndex(ret);
655         }
656     };
657     context->SetAction(std::move(input), std::move(output));
658     ScanAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<ScanAsyncCall::Context>(context));
659     return asyncCall.Call(env, exec);
660 }
661 
GetScanProgress(napi_env env,napi_callback_info info)662 napi_value NapiInnerScan::GetScanProgress(napi_env env, napi_callback_info info)
663 {
664     SCAN_HILOGI("start to GetScanProgress");
665     auto context = std::make_shared<NapiScanContext>();
666     auto input = [context](napi_env env, size_t argc, napi_value *argv, napi_value self) -> napi_status {
667         SCAN_ASSERT_BASE(env, argc == NapiScanUtils::ARGC_ONE, " should 1 parameter!", napi_invalid_arg);
668         napi_valuetype valuetype = napi_undefined;
669         SCAN_CALL_BASE(env, napi_typeof(env, argv[NapiScanUtils::INDEX_ZERO], &valuetype), napi_invalid_arg);
670         SCAN_ASSERT_BASE(env, valuetype == napi_string, "scannerId is not a string", napi_string_expected);
671         std::string scannerId = NapiScanUtils::GetStringFromValueUtf8(env, argv[NapiScanUtils::INDEX_ZERO]);
672         context->scannerId = scannerId;
673         return napi_ok;
674     };
675     auto output = [context](napi_env env, napi_value *result) -> napi_status {
676         *result = ScanProgressHelper::MakeJsObject(env, context->prog);
677         return napi_ok;
678     };
679     auto exec = [context](ScanAsyncCall::Context *ctx) {
680         int32_t ret = ScanManagerClient::GetInstance()->GetScanProgress(context->scannerId, context->prog);
681         context->result = ret == E_SCAN_NONE;
682         if (ret != E_SCAN_NONE) {
683             SCAN_HILOGE("Failed to get the scan progress");
684             context->SetErrorIndex(ret);
685         }
686     };
687     context->SetAction(std::move(input), std::move(output));
688     ScanAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<ScanAsyncCall::Context>(context));
689     return asyncCall.Call(env, exec);
690 }
691 
AddScanner(napi_env env,napi_callback_info info)692 napi_value NapiInnerScan::AddScanner(napi_env env, napi_callback_info info)
693 {
694     SCAN_HILOGD("start to AddScanner");
695     auto context = std::make_shared<NapiScanContext>();
696     auto input = [context](napi_env env, size_t argc, napi_value *argv, napi_value self) -> napi_status {
697         SCAN_ASSERT_BASE(env, argc == NapiScanUtils::ARGC_TWO, " should 2 parameter!", napi_invalid_arg);
698         napi_valuetype valuetype = napi_undefined;
699 
700         SCAN_CALL_BASE(env, napi_typeof(env, argv[NapiScanUtils::INDEX_ZERO], &valuetype), napi_invalid_arg);
701         SCAN_ASSERT_BASE(env, valuetype == napi_string, "scanner serialNumber is not a string", napi_string_expected);
702         std::string serialNumber = NapiScanUtils::GetStringFromValueUtf8(env, argv[NapiScanUtils::INDEX_ZERO]);
703         SCAN_HILOGD("serialNumber : %{public}s", serialNumber.c_str());
704         context->serialNumber = serialNumber;
705 
706         SCAN_CALL_BASE(env, napi_typeof(env, argv[NapiScanUtils::INDEX_ONE], &valuetype), napi_invalid_arg);
707         SCAN_ASSERT_BASE(env, valuetype == napi_string, "discoverMode is not a string", napi_string_expected);
708         std::string discoverMode = NapiScanUtils::GetStringFromValueUtf8(env, argv[NapiScanUtils::INDEX_ONE]);
709         SCAN_HILOGD("discoverMode : %{public}s", discoverMode.c_str());
710         context->discoverMode = discoverMode;
711         return napi_ok;
712     };
713     auto output = [context](napi_env env, napi_value *result) -> napi_status {
714         napi_status status = napi_get_boolean(env, context->result, result);
715         SCAN_HILOGD("output ---- [%{public}s], status[%{public}d]", context->result ? "true" : "false", status);
716         return status;
717     };
718     auto exec = [context](ScanAsyncCall::Context *ctx) {
719         int32_t ret = ScanManagerClient::GetInstance()->AddScanner(context->serialNumber, context->discoverMode);
720         context->result = ret == E_SCAN_NONE;
721         if (ret != E_SCAN_NONE) {
722             SCAN_HILOGE("Failed to add the scanner");
723             context->SetErrorIndex(ret);
724         }
725     };
726     context->SetAction(std::move(input), std::move(output));
727     ScanAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<ScanAsyncCall::Context>(context));
728     return asyncCall.Call(env, exec);
729 }
730 
DeleteScanner(napi_env env,napi_callback_info info)731 napi_value NapiInnerScan::DeleteScanner(napi_env env, napi_callback_info info)
732 {
733     SCAN_HILOGD("start to DeleteScanner");
734     auto context = std::make_shared<NapiScanContext>();
735     auto input = [context](napi_env env, size_t argc, napi_value *argv, napi_value self) -> napi_status {
736         SCAN_ASSERT_BASE(env, argc == NapiScanUtils::ARGC_TWO, " should 2 parameter!", napi_invalid_arg);
737         napi_valuetype valuetype = napi_undefined;
738 
739         SCAN_CALL_BASE(env, napi_typeof(env, argv[NapiScanUtils::INDEX_ZERO], &valuetype), napi_invalid_arg);
740         SCAN_ASSERT_BASE(env, valuetype == napi_string, "scanner serialNumber is not a string", napi_string_expected);
741         std::string serialNumber = NapiScanUtils::GetStringFromValueUtf8(env, argv[NapiScanUtils::INDEX_ZERO]);
742         SCAN_HILOGD("serialNumber : %{public}s", serialNumber.c_str());
743         context->serialNumber = serialNumber;
744 
745         SCAN_CALL_BASE(env, napi_typeof(env, argv[NapiScanUtils::INDEX_ONE], &valuetype), napi_invalid_arg);
746         SCAN_ASSERT_BASE(env, valuetype == napi_string, "discoverMode is not a string", napi_string_expected);
747         std::string discoverMode = NapiScanUtils::GetStringFromValueUtf8(env, argv[NapiScanUtils::INDEX_ONE]);
748         SCAN_HILOGD("discoverMode : %{public}s", discoverMode.c_str());
749         context->discoverMode = discoverMode;
750         return napi_ok;
751     };
752     auto output = [context](napi_env env, napi_value *result) -> napi_status {
753         napi_status status = napi_get_boolean(env, context->result, result);
754         SCAN_HILOGD("output ---- [%{public}s], status[%{public}d]", context->result ? "true" : "false", status);
755         return status;
756     };
757     auto exec = [context](ScanAsyncCall::Context *ctx) {
758         int32_t ret = ScanManagerClient::GetInstance()->DeleteScanner(context->serialNumber, context->discoverMode);
759         context->result = ret == E_SCAN_NONE;
760         if (ret != E_SCAN_NONE) {
761             SCAN_HILOGE("Failed to delete the scanner");
762             context->SetErrorIndex(ret);
763         }
764     };
765     context->SetAction(std::move(input), std::move(output));
766     ScanAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<ScanAsyncCall::Context>(context));
767     return asyncCall.Call(env, exec);
768 }
769 
GetAddedScanner(napi_env env,napi_callback_info info)770 napi_value NapiInnerScan::GetAddedScanner(napi_env env, napi_callback_info info)
771 {
772     SCAN_HILOGE("Enter GetAddedScanner---->");
773     auto context = std::make_shared<NapiScanContext>();
774     auto input = [context](napi_env env, size_t argc, napi_value *argv, napi_value self) -> napi_status {
775         SCAN_ASSERT_BASE(env, argc == NapiScanUtils::ARGC_ZERO, " should 0 parameter!", napi_invalid_arg);
776         return napi_ok;
777     };
778     auto output = [context](napi_env env, napi_value *result) -> napi_status {
779         napi_status status = napi_create_array(env, result);
780         uint32_t index = 0;
781         for (auto scanDeviceInfo : context->allAddedScanner) {
782             status = napi_set_element(env, *result, index++, ScannerInfoHelper::MakeJsObject(env, scanDeviceInfo));
783         }
784         return napi_ok;
785     };
786     auto exec = [context](ScanAsyncCall::Context *ctx) {
787         int32_t ret = ScanManagerClient::GetInstance()->GetAddedScanner(context->allAddedScanner);
788         context->result = ret == E_SCAN_NONE;
789         if (ret != E_SCAN_NONE) {
790             SCAN_HILOGE("Failed to get added scanner");
791             context->SetErrorIndex(ret);
792         }
793     };
794     context->SetAction(std::move(input), std::move(output));
795     ScanAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<ScanAsyncCall::Context>(context));
796     return asyncCall.Call(env, exec);
797 }
798 
UpdateScannerName(napi_env env,napi_callback_info info)799 napi_value NapiInnerScan::UpdateScannerName(napi_env env, napi_callback_info info)
800 {
801     SCAN_HILOGD("start to UpdateScannerName");
802     auto context = std::make_shared<NapiScanContext>();
803     auto input = [context](napi_env env, size_t argc, napi_value *argv, napi_value self) -> napi_status {
804         SCAN_ASSERT_BASE(env, argc == NapiScanUtils::ARGC_THREE, " should 3 parameter!", napi_invalid_arg);
805         napi_valuetype valuetype = napi_undefined;
806 
807         SCAN_CALL_BASE(env, napi_typeof(env, argv[NapiScanUtils::INDEX_ZERO], &valuetype), napi_invalid_arg);
808         SCAN_ASSERT_BASE(env, valuetype == napi_string, "scanner serialNumber is not a string", napi_string_expected);
809         std::string serialNumber = NapiScanUtils::GetStringFromValueUtf8(env, argv[NapiScanUtils::INDEX_ZERO]);
810         SCAN_HILOGD("serialNumber : %{public}s", serialNumber.c_str());
811         context->serialNumber = serialNumber;
812 
813         SCAN_CALL_BASE(env, napi_typeof(env, argv[NapiScanUtils::INDEX_ONE], &valuetype), napi_invalid_arg);
814         SCAN_ASSERT_BASE(env, valuetype == napi_string, "discoverMode is not a string", napi_string_expected);
815         std::string discoverMode = NapiScanUtils::GetStringFromValueUtf8(env, argv[NapiScanUtils::INDEX_ONE]);
816         SCAN_HILOGD("discoverMode : %{public}s", discoverMode.c_str());
817         context->discoverMode = discoverMode;
818 
819         SCAN_CALL_BASE(env, napi_typeof(env, argv[NapiScanUtils::INDEX_TWO], &valuetype), napi_invalid_arg);
820         SCAN_ASSERT_BASE(env, valuetype == napi_string, "deviceName is not a string", napi_string_expected);
821         std::string deviceName = NapiScanUtils::GetStringFromValueUtf8(env, argv[NapiScanUtils::INDEX_TWO]);
822         SCAN_HILOGD("deviceName : %{public}s", deviceName.c_str());
823         context->deviceName = deviceName;
824         return napi_ok;
825     };
826     auto output = [context](napi_env env, napi_value *result) -> napi_status {
827         napi_status status = napi_get_boolean(env, context->result, result);
828         SCAN_HILOGD("output ---- [%{public}s], status[%{public}d]", context->result ? "true" : "false", status);
829         return status;
830     };
831     auto exec = [context](ScanAsyncCall::Context *ctx) {
832         int32_t ret = ScanManagerClient::GetInstance()->UpdateScannerName(context->serialNumber,
833             context->discoverMode, context->deviceName);
834         context->result = ret == E_SCAN_NONE;
835         if (ret != E_SCAN_NONE) {
836             SCAN_HILOGE("Failed to update scanner name");
837             context->SetErrorIndex(ret);
838         }
839     };
840     context->SetAction(std::move(input), std::move(output));
841     ScanAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<ScanAsyncCall::Context>(context));
842     return asyncCall.Call(env, exec);
843 }
844 
AddPrinter(napi_env env,napi_callback_info info)845 napi_value NapiInnerScan::AddPrinter(napi_env env, napi_callback_info info)
846 {
847     auto context = std::make_shared<NapiScanContext>();
848     auto input = [context](napi_env env, size_t argc, napi_value *argv, napi_value self) -> napi_status {
849         SCAN_ASSERT_BASE(env, argc == NapiScanUtils::ARGC_TWO, " should 2 parameter!", napi_invalid_arg);
850         napi_valuetype valuetype = napi_undefined;
851 
852         SCAN_CALL_BASE(env, napi_typeof(env, argv[NapiScanUtils::INDEX_ZERO], &valuetype), napi_invalid_arg);
853         SCAN_ASSERT_BASE(env, valuetype == napi_string, "scanner serialNumber is not a string", napi_string_expected);
854         std::string serialNumber = NapiScanUtils::GetStringFromValueUtf8(env, argv[NapiScanUtils::INDEX_ZERO]);
855         SCAN_HILOGD("serialNumber : %{public}s", serialNumber.c_str());
856         context->serialNumber = serialNumber;
857 
858         SCAN_CALL_BASE(env, napi_typeof(env, argv[NapiScanUtils::INDEX_ONE], &valuetype), napi_invalid_arg);
859         SCAN_ASSERT_BASE(env, valuetype == napi_string, "discoverMode is not a string", napi_string_expected);
860         std::string discoverMode = NapiScanUtils::GetStringFromValueUtf8(env, argv[NapiScanUtils::INDEX_ONE]);
861         SCAN_HILOGD("discoverMode : %{public}s", discoverMode.c_str());
862         context->discoverMode = discoverMode;
863 
864         return napi_ok;
865     };
866     auto output = [context](napi_env env, napi_value *result) -> napi_status {
867         napi_status status = napi_get_boolean(env, context->result, result);
868         SCAN_HILOGD("output ---- [%{public}s], status[%{public}d]", context->result ? "true" : "false", status);
869         return status;
870     };
871     auto exec = [context](ScanAsyncCall::Context *ctx) {
872         int32_t ret = ScanManagerClient::GetInstance()->AddPrinter(context->serialNumber, context->discoverMode);
873         context->result = ret == E_SCAN_NONE;
874         if (ret != E_SCAN_NONE) {
875             SCAN_HILOGE("Failed to add Printer");
876             context->SetErrorIndex(ret);
877         }
878     };
879     context->SetAction(std::move(input), std::move(output));
880     ScanAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<ScanAsyncCall::Context>(context));
881     return asyncCall.Call(env, exec);
882 }
883 
IsSupportType(const std::string & type)884 bool NapiInnerScan::IsSupportType(const std::string& type)
885 {
886     if (type == GET_FRAME_RES_EVENT_TYPE || type == SCAN_DEVICE_FOUND_TCP|| type == SCAN_DEVICE_FOUND
887     || type == SCAN_DEVICE_SYNC || type == SCAN_DEVICE_ADD || type == SCAN_DEVICE_DEL || type == SCAN_INIT_EVENT) {
888         return true;
889     }
890     return false;
891 }
892 } // namespace OHOS::Scan
893