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