1 /*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "scan_option_value_helper.h"
17 #include "napi_scan_utils.h"
18 #include "scan_constant.h"
19 #include "scan_log.h"
20
21 namespace OHOS::Scan {
22 static constexpr const char *PARAM_SCAN_OPTION_VALUE_TYPE = "valueType";
23 static constexpr const char *PARAM_SCAN_OPTION_VALUE_SIZE = "valueSize";
24 static constexpr const char *PARAM_SCAN_OPTION_NUM_VALUE = "numValue";
25 static constexpr const char *PARAM_SCAN_OPTION_NUM_LIST_VALUE = "numListValue";
26 static constexpr const char *PARAM_SCAN_OPTION_STR_VALUE = "strValue";
27 static constexpr const char *PARAM_SCAN_OPTION_BOOL_VALUE = "boolValue";
28
MakeJsObject(napi_env env,const ScanOptionValue & optionValue)29 napi_value ScanOptionValueHelper::MakeJsObject(napi_env env, const ScanOptionValue &optionValue)
30 {
31 napi_value jsObj = nullptr;
32 SCAN_CALL(env, napi_create_object(env, &jsObj));
33
34 ScanOptionValueType valueType = optionValue.GetScanOptionValueType();
35 NapiScanUtils::SetUint32Property(env, jsObj, PARAM_SCAN_OPTION_VALUE_TYPE, valueType);
36
37 int32_t valueSize = optionValue.GetValueSize();
38 NapiScanUtils::SetInt32Property(env, jsObj, PARAM_SCAN_OPTION_VALUE_SIZE, valueSize);
39
40 if (valueType == SCAN_VALUE_NUM) {
41 NapiScanUtils::SetInt32Property(env, jsObj, PARAM_SCAN_OPTION_NUM_VALUE, optionValue.GetNumValue());
42 } else if (valueType == SCAN_VALUE_NUM_LIST) {
43 std::vector<int32_t> numListValue;
44 optionValue.GetNumListValue(numListValue);
45 napi_value arrNumListValue = nullptr;
46 SCAN_CALL(env, napi_create_array(env, &arrNumListValue));
47 uint32_t arrNumListValueLength = numListValue.size();
48 for (uint32_t i = 0; i < arrNumListValueLength; i++) {
49 napi_value value;
50 SCAN_CALL(env, napi_create_int32(env, numListValue[i], &value));
51 SCAN_CALL(env, napi_set_element(env, arrNumListValue, i, value));
52 }
53 SCAN_CALL(env, napi_set_named_property(env, jsObj, PARAM_SCAN_OPTION_NUM_LIST_VALUE, arrNumListValue));
54 } else if (valueType == SCAN_VALUE_STR) {
55 NapiScanUtils::SetStringPropertyUtf8(env, jsObj, PARAM_SCAN_OPTION_STR_VALUE, optionValue.GetStrValue());
56 } else if (valueType == SCAN_VALUE_BOOL) {
57 NapiScanUtils::SetBooleanProperty(env, jsObj, PARAM_SCAN_OPTION_BOOL_VALUE, optionValue.GetBoolValue());
58 }
59 return jsObj;
60 }
61
BuildFromJs(napi_env env,napi_value jsValue)62 std::shared_ptr<ScanOptionValue> ScanOptionValueHelper::BuildFromJs(napi_env env, napi_value jsValue)
63 {
64 auto nativeObj = std::make_shared<ScanOptionValue>();
65 if (!ValidateProperty(env, jsValue)) {
66 SCAN_HILOGE("Invalid property of scan option value object");
67 return nullptr;
68 }
69 ScanOptionValueType valueType = (ScanOptionValueType
70 ) NapiScanUtils::GetUint32Property(env, jsValue, PARAM_SCAN_OPTION_VALUE_TYPE);
71 nativeObj->SetScanOptionValueType(valueType);
72 int32_t valueSize = NapiScanUtils::GetInt32Property(env, jsValue, PARAM_SCAN_OPTION_VALUE_SIZE);
73 nativeObj->SetValueSize(valueSize);
74 if (valueType == SCAN_VALUE_NUM) {
75 int32_t numValue = NapiScanUtils::GetInt32Property(env, jsValue, PARAM_SCAN_OPTION_NUM_VALUE);
76 nativeObj->SetNumValue(numValue);
77 } else if (valueType == SCAN_VALUE_NUM_LIST) {
78 napi_value jsNumListValue = NapiScanUtils::GetNamedProperty(env, jsValue, PARAM_SCAN_OPTION_NUM_LIST_VALUE);
79 if (jsNumListValue != nullptr) {
80 std::vector<int32_t> numListValue;
81 bool isArray = false;
82 SCAN_CALL(env, napi_is_array(env, jsNumListValue, &isArray));
83 if (!isArray) {
84 SCAN_HILOGE("Invalid list of scan option number value");
85 return nullptr;
86 }
87 uint32_t arrayLength = 0;
88 SCAN_CALL(env, napi_get_array_length(env, jsNumListValue, &arrayLength));
89 for (uint32_t index = 0; index < arrayLength; index++) {
90 napi_value jsNumInList;
91 int32_t numInList;
92 SCAN_CALL(env, napi_get_element(env, jsNumListValue, index, &jsNumInList));
93 SCAN_CALL(env, napi_get_value_int32(env, jsNumInList, &numInList));
94 numListValue.emplace_back(numInList);
95 }
96 nativeObj->SetNumListValue(numListValue);
97 }
98 } else if (valueType == SCAN_VALUE_STR) {
99 std::string strValue = NapiScanUtils::GetStringPropertyUtf8(env, jsValue, PARAM_SCAN_OPTION_STR_VALUE);
100 nativeObj->SetStrValue(strValue);
101 } else if (valueType == SCAN_VALUE_BOOL) {
102 bool boolValue = NapiScanUtils::GetBooleanProperty(env, jsValue, PARAM_SCAN_OPTION_BOOL_VALUE);
103 nativeObj->SetBoolValue(boolValue);
104 }
105 SCAN_HILOGE("Build scan option value succeed");
106 return nativeObj;
107 }
108
ValidateProperty(napi_env env,napi_value object)109 bool ScanOptionValueHelper::ValidateProperty(napi_env env, napi_value object)
110 {
111 std::map<std::string, ScanParamStatus> propertyList = {
112 {PARAM_SCAN_OPTION_VALUE_TYPE, SCAN_PARAM_OPT},
113 {PARAM_SCAN_OPTION_VALUE_SIZE, SCAN_PARAM_OPT},
114 {PARAM_SCAN_OPTION_NUM_VALUE, SCAN_PARAM_OPT},
115 {PARAM_SCAN_OPTION_NUM_LIST_VALUE, SCAN_PARAM_OPT},
116 {PARAM_SCAN_OPTION_STR_VALUE, SCAN_PARAM_OPT},
117 {PARAM_SCAN_OPTION_BOOL_VALUE, SCAN_PARAM_OPT},
118 };
119 auto names = NapiScanUtils::GetPropertyNames(env, object);
120 for (auto name : names) {
121 if (propertyList.find(name) == propertyList.end()) {
122 SCAN_HILOGE("Invalid property: %{public}s", name.c_str());
123 return false;
124 }
125 propertyList[name] = SCAN_PARAM_SET;
126 }
127 bool hasValueType = propertyList[PARAM_SCAN_OPTION_VALUE_TYPE] == SCAN_PARAM_SET;
128 bool hasValueSize = propertyList[PARAM_SCAN_OPTION_VALUE_SIZE] == SCAN_PARAM_SET;
129 if (!hasValueType || !hasValueSize) {
130 return false;
131 }
132 return true;
133 }
134 } // namespace OHOS::Scan
135