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_parameters_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_PARA_FORMAT = "format";
23 static constexpr const char *PARAM_SCAN_PARA_LAST_FRAME = "lastFrame";
24 static constexpr const char *PARAM_SCAN_PARA_BYTES = "bytesPerLine";
25 static constexpr const char *PARAM_SCAN_PARA_PIXELS = "pixelsPerLine";
26 static constexpr const char *PARAM_SCAN_PARA_LINES = "lines";
27 static constexpr const char *PARAM_SCAN_PARA_DEPTH = "depth";
28 
MakeJsObject(napi_env env,const ScanParameters & para)29 napi_value ScanParametersHelper::MakeJsObject(napi_env env, const ScanParameters &para)
30 {
31     napi_value jsObj = nullptr;
32     SCAN_CALL(env, napi_create_object(env, &jsObj));
33     NapiScanUtils::SetUint32Property(env, jsObj, PARAM_SCAN_PARA_FORMAT, para.GetFormat());
34     NapiScanUtils::SetBooleanProperty(env, jsObj, PARAM_SCAN_PARA_LAST_FRAME, para.GetLastFrame());
35     NapiScanUtils::SetInt32Property(env, jsObj, PARAM_SCAN_PARA_BYTES, para.GetBytesPerLine());
36     NapiScanUtils::SetInt32Property(env, jsObj, PARAM_SCAN_PARA_PIXELS, para.GetPixelsPerLine());
37     NapiScanUtils::SetInt32Property(env, jsObj, PARAM_SCAN_PARA_LINES, para.GetLines());
38     NapiScanUtils::SetInt32Property(env, jsObj, PARAM_SCAN_PARA_DEPTH, para.GetDepth());
39     return jsObj;
40 }
41 
BuildFromJs(napi_env env,napi_value jsValue)42 std::shared_ptr<ScanParameters> ScanParametersHelper::BuildFromJs(napi_env env, napi_value jsValue)
43 {
44     auto nativeObj = std::make_shared<ScanParameters>();
45 
46     if (!ValidateProperty(env, jsValue)) {
47         SCAN_HILOGE("Invalid property of scan parameters");
48         return nullptr;
49     }
50 
51     ScanFrame format = (ScanFrame)NapiScanUtils::GetUint32Property(env, jsValue, PARAM_SCAN_PARA_FORMAT);
52     nativeObj->SetFormat(format);
53     bool lastFrame = NapiScanUtils::GetBooleanProperty(env, jsValue, PARAM_SCAN_PARA_LAST_FRAME);
54     nativeObj->SetLastFrame(lastFrame);
55     int32_t bytesPerLine = NapiScanUtils::GetInt32Property(env, jsValue, PARAM_SCAN_PARA_BYTES);
56     nativeObj->SetBytesPerLine(bytesPerLine);
57     int32_t pixelsPerLine = NapiScanUtils::GetInt32Property(env, jsValue, PARAM_SCAN_PARA_PIXELS);
58     nativeObj->SetPixelsPerLine(pixelsPerLine);
59     int32_t lines = NapiScanUtils::GetInt32Property(env, jsValue, PARAM_SCAN_PARA_LINES);
60     nativeObj->SetLines(lines);
61     int32_t depth = NapiScanUtils::GetInt32Property(env, jsValue, PARAM_SCAN_PARA_DEPTH);
62     nativeObj->SetDepth(depth);
63 
64     SCAN_HILOGE("Build Scan Parameters succeed");
65     return nativeObj;
66 }
67 
ValidateProperty(napi_env env,napi_value object)68 bool ScanParametersHelper::ValidateProperty(napi_env env, napi_value object)
69 {
70     std::map<std::string, ScanParamStatus> propertyList = {
71         {PARAM_SCAN_PARA_FORMAT, SCAN_PARAM_OPT},
72         {PARAM_SCAN_PARA_LAST_FRAME, SCAN_PARAM_OPT},
73         {PARAM_SCAN_PARA_BYTES, SCAN_PARAM_OPT},
74         {PARAM_SCAN_PARA_PIXELS, SCAN_PARAM_OPT},
75         {PARAM_SCAN_PARA_LINES, SCAN_PARAM_OPT},
76         {PARAM_SCAN_PARA_DEPTH, SCAN_PARAM_OPT},
77     };
78 
79     auto names = NapiScanUtils::GetPropertyNames(env, object);
80     for (auto name : names) {
81         if (propertyList.find(name) == propertyList.end()) {
82             SCAN_HILOGE("Invalid property: %{public}s", name.c_str());
83             return false;
84         }
85         propertyList[name] = SCAN_PARAM_SET;
86     }
87     bool hasFormat = propertyList[PARAM_SCAN_PARA_FORMAT] == SCAN_PARAM_SET;
88     bool hasFrame = propertyList[PARAM_SCAN_PARA_LAST_FRAME] == SCAN_PARAM_SET;
89     bool hasBytes = propertyList[PARAM_SCAN_PARA_BYTES] == SCAN_PARAM_SET;
90     bool hasPixels = propertyList[PARAM_SCAN_PARA_PIXELS] == SCAN_PARAM_SET;
91     bool hasLines = propertyList[PARAM_SCAN_PARA_LINES] == SCAN_PARAM_SET;
92     bool hasDepth = propertyList[PARAM_SCAN_PARA_DEPTH] == SCAN_PARAM_SET;
93 
94     if (!hasFormat || !hasFrame || !hasBytes || !hasPixels || !hasLines || !hasDepth) {
95         return false;
96     }
97     return true;
98 }
99 } // namespace OHOS::Scan
100