1 /*
2  * Copyright (c) 2023 Shenzhen Kaihong Digital Industry Development 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 "napi/native_api.h"
17 #include <bits/alltypes.h>
18 #include "nodeapi.h"
19 #include "basesample.h"
20 #include "nadatatypes.h"
21 #include "cjsonsample.h"
22 #include "javascriptapi.h"
23 #include "ncpp/ffmpegcase/manager/plugin_manager.h"
24 #include <iostream>
25 #include <fstream>
26 #include "cJsonNapiH/cjsonnapi.h"
27 
Add(napi_env env, napi_callback_info info)28 static napi_value Add(napi_env env, napi_callback_info info)
29 {
30     size_t requireArgc = 2;
31     size_t argc = 2;
32     napi_value args[2] = {nullptr};
33 
34     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
35 
36     napi_valuetype valuetype0;
37     napi_typeof(env, args[0], &valuetype0);
38 
39     napi_valuetype valuetype1;
40     napi_typeof(env, args[1], &valuetype1);
41 
42     double value0;
43     napi_get_value_double(env, args[0], &value0);
44 
45     double value1;
46     napi_get_value_double(env, args[1], &value1);
47 
48     napi_value sum;
49     napi_create_double(env, value0 + value1, &sum);
50 
51     return sum;
52 }
53 
getTestCase(napi_env env, napi_callback_info info)54 static napi_value getTestCase(napi_env env, napi_callback_info info)
55 {
56     size_t requireArgc = 1;
57     size_t argc = 1;
58     napi_value args[1] = {nullptr};
59     napi_status status;
60     int32_t result = 0;
61 
62     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
63 
64     napi_valuetype valuetype0;
65     napi_typeof(env, args[0], &valuetype0);
66 
67     uint32_t value0;
68     napi_get_value_uint32(env, args[0], &value0);
69 
70     OH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, "getTestCase", "input param %{public}d", value0);
71 
72     // 返回结果
73     napi_value resultValue;
74     switch (value0) {
75         case TCT_BASE:
76             {
77                 resultValue = createTctBaseInstance(env);
78             }
79             break;
80         case TCT_NADATATYPE:
81             {
82                 resultValue = createTctNADataTypeInstance(env);
83             }
84             break;
85         case TCT_NAENVLCAPI:
86         case TCT_JSABSTARCTOPS:
87         case TCT_JSPREOPERTY:
88         case TCT_JSVALUES:
89             break;
90         case TCT_CJSON:
91             {
92                 resultValue = createTctCJsonInstance(env);
93             }
94             break;
95         case TCT_FFMPEG:
96         case TCT_OPENCV:
97             break;
98         default:
99             break;
100     }
101 
102     return resultValue;
103 }
104 
105 EXTERN_C_START
Init(napi_env env, napi_value exports)106 static napi_value Init(napi_env env, napi_value exports)
107 {
108     // 对应nodeapi/envlifecycleapis/napisetinstancedata
109     setInstancedata(env, exports);
110 
111 	// 对应 javascriptapi/jsvalues/jsValuesInit.cpp
112     jsValuesInit(env, exports);
113 
114     // 对应 javascriptapi/jsproperty/jsPropertyInit.cpp
115     jsPropertyInit(env, exports);
116 
117     // 对应 javascriptapi/jsfunctions/jsFunctionsInit.cpp
118     jsFunctionsInit(env, exports);
119 
120     // 对应 javascriptapi/jsobjectwrap/jsObjectWrapInit.cpp
121     jsObjectWrapInit(env, exports);
122 
123     napi_property_descriptor descArr[] = {
124         {"add", nullptr, Add, nullptr, nullptr, nullptr, napi_default, nullptr},
125         {"getTestCase", nullptr, getTestCase, nullptr, nullptr, nullptr, napi_default, nullptr},
126         {"testNapiStatus", nullptr, testNapiStatus, nullptr, nullptr, nullptr, napi_default, nullptr},
127         {"testExterrinfo", nullptr, testNapiExterrinfo, nullptr, nullptr, nullptr, napi_default, nullptr},
128         {"testNapiEnv", nullptr, testNapiEnv, nullptr, nullptr, nullptr, napi_default, nullptr},
129         {"testNapiValue", nullptr, testNapiValue, nullptr, nullptr, nullptr, napi_default, nullptr},
130         {"testNapiThreadsafefunc", nullptr, setThreadsafefunc, nullptr, nullptr, nullptr, napi_default, nullptr},
131         {"testNapiThreadsafefuncrel", nullptr, setThreadsafefuncrel, nullptr, nullptr, nullptr, napi_default, nullptr},
132         {"testNapiThreadsafefuncall", nullptr, setThreadsafefuncall, nullptr, nullptr, nullptr, napi_default, nullptr},
133         {"cjson_version", nullptr, cJSONVersion, nullptr, nullptr, nullptr, napi_default, nullptr},
134         {"getContext", nullptr, NativeXComponentSample::PluginManager::GetContext,
135             nullptr, nullptr, nullptr, napi_default, nullptr},
136     };
137     napi_define_properties(env, exports, sizeof(descArr) / sizeof(descArr[0]), descArr);
138 
139     NativeXComponentSample::PluginManager::GetInstance()->Export(env, exports);
140     size_t len = sizeof(descArr) / sizeof(napi_property_descriptor);
141 
142     // Allocate memory & copy
143     napi_property_descriptor *desc = (napi_property_descriptor *)malloc(sizeof(descArr));
144     if (desc == nullptr) {
145         OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, "jsAbstractOpsInit", "Failed to allocated memory");
146         napi_throw_error(env, NULL, "Failed to allocate memory");
147     }
148     for (size_t i = 0; i < len; ++i) {
149         desc[i] = descArr[i];
150     }
151 
152     // Initialization of functions in `javascriptapi/jsabstractops`
153     jsAbstractOpsInit(&desc, &len);
154 
155     napi_define_properties(env, exports, len, desc);
156     return exports;
157 }
158 EXTERN_C_END
159 
160 static napi_module demoModule = {
161     .nm_version = 1,
162     .nm_flags = 0,
163     .nm_filename = nullptr,
164     .nm_register_func = Init,
165     .nm_modname = "entry",
166     .nm_priv = ((void *)0),
167     .reserved = {0},
168 };
169 
RegisterEntryModule(void)170 extern "C" __attribute__((constructor)) void RegisterEntryModule(void) { napi_module_register(&demoModule); }
171