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