• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#include "cjsonnapi.h"
2/* [NAPI_GEN]:对应cJSON.h中:cJSON_Parse的napi方法,
3 * 输入:value: const char *;
4 * 输出:cJSON *
5 */
6napi_value KH727_cJSON_Parse(napi_env env, napi_callback_info info)
7{
8    OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "KH727_cJSON_Parse", "KH727_cJSON_Parse begins");
9    napi_status status;
10    /* [NAPI_GEN]: Node.js在其N-API中用来提供错误的扩展信息的结构体,结构体包含以下字段
11     * error_message: 一个指向错误详细字符串的指针,提供了关于错误的文本描述
12     * engin_reserved: 一个保留给Js引擎使用的指针
13     * error_code: 错误码,指示了错误的种类,比如napi_pending_exception表示有一个JavaScript异常未被清理。
14     * engine_error_code:一个引擎特定的错误码,为引擎实现保留,具体含义依赖于使用的JavaScript引擎。
15     * error_message_len:错误消息字符串的长度。
16     */
17    const napi_extended_error_info *extended_error_info;
18    /* [NAPI_GEN]: tag: 日志打印标签*/
19    const char *tag = "[KH727_cJSON_Parse]";
20    /* [NAPI_GEN]: get function param in*/
21    /* [NAPI_GEN]: argc:js传入的参数个数 */
22    size_t argc = PARAMS1;
23    /* [NAPI_GEN]: args: 一个数组,保存js传入的参数 */
24    napi_value args[PARAMS1] = {nullptr};
25    /* [NAPI_GEN]: napi_get_cb_info用于获取JS调用该函数时所传递的参数、接收参数的个数以及'this'的值
26     * env: 当前环境的句柄,代表当前的Node.js环境
27     * info: 回调信息句柄,代表当前回调的上下文
28     * argc: 指向size_t的指针,最初应包含可接受的最大参数数量,函数返回时,它将包含实际传递的参数数量
29     * args: 一个足够大的数组,用于接收传递给回调函数的所有js参数。数组的大小应至少与argc传入的值一样大。
30     * this_arg: 如果不是NULL,则返回js回调中this的值
31     * data: 如果不是NULL,则返回与回调函数关联的任何可选数据。通常用于传递在创建函数时指定的静态数据
32     */
33    status = napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
34    if(status != napi_ok) {
35        /* [NAPI_GEN]: 错误处理*/
36        getErrMessage(status, env,extended_error_info, "napi_get_cb_info", tag);
37        return nullptr;
38    }
39    /* [NAPI_GEN]: 从args数组中获取入参 */
40    OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "KH727_cJSON_Parse", "KH727_cJSON_Parse get param info begins");
41    napi_valuetype valuetypevalue;
42    /* [NAPI_GEN]: 获取入参类型,第PARAMS0个入参
43     * env: N-API环境的句柄,表示当前的上下文
44     * value: 要检查类型的js值
45     * result: 是一个指针,指向napi_valuetype枚举的值,函数会将结果存储在这里
46     */
47    status = napi_typeof(env, args[PARAMS0], &valuetypevalue);
48    if (status != napi_ok) {
49        getErrMessage(status, env, extended_error_info, "napi_typeof", tag);
50        return nullptr;
51    }
52    size_t strSizePARAMS0 = 0;
53    /* [NAPI_GEN]: napi_get_value_string_utf8用于将Js字符串转换为UTF-8编码的C字符串
54     * env: N-API环境的句柄,表示当前的上下文
55     * value: 要转换的JavaScript字符串
56     * buf: 用于存储结果的字符数组的指针
57     * bufsize: 缓冲区大小,以字节为单位
58     * result: 转换后的字符串的字节长度(不包括空终止符)。若干buf是NULL,则返回所需的缓冲区大小(包括空终止符)
59     */
60    /* [NAPI_GEN]: buf参数是NULL时,用于获取所需缓冲区大小*/
61    status = napi_get_value_string_utf8(env, args[PARAMS0], NULL, 0, &strSizePARAMS0);
62    if (status != napi_ok) {
63        getErrMessage(status, env, extended_error_info, "get value string", tag);
64        return nullptr;
65    }
66    char *valueIn = new char[strSizePARAMS0 + 1];
67    /* [NAPI_GEN]: 用于获取字符串*/
68    status = napi_get_value_string_utf8(env, args[PARAMS0], valueIn, strSizePARAMS0 + 1, &strSizePARAMS0);
69    if (status != napi_ok) {
70        getErrMessage(status, env, extended_error_info, "get value string", tag);
71        delete[] valueIn;
72        return nullptr;
73    }
74    // delete[] valueIn;  // remember to delete memory
75
76    OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "KH727_cJSON_Parse", "KH727_cJSON_Parse get param info ends");
77
78    OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "KH727_cJSON_Parse", "KH727_cJSON_Parse get return info begins");
79    // Todo: add business logic. 在这前后代码为框架所生成
80
81    /* [NAPI_GEN]: function return value*/
82    napi_value cJSON_ParseOut;
83    /* [NAPI_GEN]: 返回值是对象时,需要使用napi_create_object创建一个js的对象与js代码交互
84     * env: 当前环境的句柄
85     * result: 一个napi_value的指针,该指针将被设置为新创建的js对象
86     */
87    status = napi_create_object(env, &cJSON_ParseOut);
88    if (status != napi_ok) {
89        getErrMessage(status, env, extended_error_info, "napi_create_object", tag);
90        return nullptr;
91    }
92    napi_value nextOut;
93    /* [NAPI_GEN]: 返回值是对象时,需要使用napi_create_object创建一个js的对象与js代码交互
94     * env: 当前环境的句柄
95     * result: 一个napi_value的指针,该指针将被设置为新创建的js对象
96     */
97    status = napi_create_object(env, &nextOut);
98    if (status != napi_ok) {
99        getErrMessage(status, env, extended_error_info, "napi_create_object", tag);
100        return nullptr;
101    }
102    /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
103     * env: 当前环境的句柄
104     * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
105     * utf8name: 属性的名称,是一个以UTF-8编码的字符串
106     * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
107     */
108    status = napi_set_named_property(env, cJSON_ParseOut, "next", nextOut);
109    if (status != napi_ok) {
110        /* [NAPI_GEN]: 错误处理*/
111        getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
112        return nullptr;
113    }
114    napi_value prevOut;
115    /* [NAPI_GEN]: 返回值是对象时,需要使用napi_create_object创建一个js的对象与js代码交互
116     * env: 当前环境的句柄
117     * result: 一个napi_value的指针,该指针将被设置为新创建的js对象
118     */
119    status = napi_create_object(env, &prevOut);
120    if (status != napi_ok) {
121        getErrMessage(status, env, extended_error_info, "napi_create_object", tag);
122        return nullptr;
123    }
124    /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
125     * env: 当前环境的句柄
126     * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
127     * utf8name: 属性的名称,是一个以UTF-8编码的字符串
128     * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
129     */
130    status = napi_set_named_property(env, cJSON_ParseOut, "prev", prevOut);
131    if (status != napi_ok) {
132        /* [NAPI_GEN]: 错误处理*/
133        getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
134        return nullptr;
135    }
136    napi_value childOut;
137    /* [NAPI_GEN]: 返回值是对象时,需要使用napi_create_object创建一个js的对象与js代码交互
138     * env: 当前环境的句柄
139     * result: 一个napi_value的指针,该指针将被设置为新创建的js对象
140     */
141    status = napi_create_object(env, &childOut);
142    if (status != napi_ok) {
143        getErrMessage(status, env, extended_error_info, "napi_create_object", tag);
144        return nullptr;
145    }
146    /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
147     * env: 当前环境的句柄
148     * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
149     * utf8name: 属性的名称,是一个以UTF-8编码的字符串
150     * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
151     */
152    status = napi_set_named_property(env, cJSON_ParseOut, "child", childOut);
153    if (status != napi_ok) {
154        /* [NAPI_GEN]: 错误处理*/
155        getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
156        return nullptr;
157    }
158    napi_value typeOut;
159    /* [NAPI_GEN]: 返回值是int32_t类型时,napi_create_int32 创建一个包含32位整数(int32_t)的js数值(Number)对象
160     * env: 当前环境的句柄
161     * value: 要准换成js数值的int32_t的值,这里以传入1为例,用例新增业务代码时可根据自身需求修改
162     * result: 指向napi_value的指针,这个指针会被设置为新创建的js数值对象
163     */
164    status = napi_create_int32(env, 1, &typeOut);
165    if (status != napi_ok) {
166        getErrMessage(status, env, extended_error_info, "napi_create_int32", tag);
167        return nullptr;
168    }
169    /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
170     * env: 当前环境的句柄
171     * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
172     * utf8name: 属性的名称,是一个以UTF-8编码的字符串
173     * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
174     */
175    status = napi_set_named_property(env, cJSON_ParseOut, "type", typeOut);
176    if (status != napi_ok) {
177        /* [NAPI_GEN]: 错误处理*/
178        getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
179        return nullptr;
180    }
181    napi_value valuestringOut;
182    /* [NAPI_GEN]: 返回值是字符串时,napi_create_string_utf8用于在原生代码中创建一个新的js字符串。这个函数会根据提供的UTF-8编码的字符串创建一个等价的js字符串
183     * env: 当前环境的句柄
184     * str: 指向以null结尾的UTF-8编码的C字符串的指针,这里以valuestring举例,用户可根据需求修改
185     * length: 字符串的长度,可以是具体的字节数,或者使用特殊的值NAPI_AUTO_LENGTH来让函数自己计算长度(假定字符串以null结尾)
186     * result: 指向napi_value的指针,函数执行成功后这个指针将指向新创建的js字符串
187     */
188    status = napi_create_string_utf8(env, "valuestring", NAPI_AUTO_LENGTH, &valuestringOut);
189    if (status != napi_ok) {
190        /*错误处理*/
191        getErrMessage(status, env, extended_error_info, "napi_create_string_utf8", tag);
192        return nullptr;
193    }
194    /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
195     * env: 当前环境的句柄
196     * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
197     * utf8name: 属性的名称,是一个以UTF-8编码的字符串
198     * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
199     */
200    status = napi_set_named_property(env, cJSON_ParseOut, "valuestring", valuestringOut);
201    if (status != napi_ok) {
202        /* [NAPI_GEN]: 错误处理*/
203        getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
204        return nullptr;
205    }
206    napi_value valueintOut;
207    /* [NAPI_GEN]: 返回值是int32_t类型时,napi_create_int32 创建一个包含32位整数(int32_t)的js数值(Number)对象
208     * env: 当前环境的句柄
209     * value: 要准换成js数值的int32_t的值,这里以传入1为例,用例新增业务代码时可根据自身需求修改
210     * result: 指向napi_value的指针,这个指针会被设置为新创建的js数值对象
211     */
212    status = napi_create_int32(env, 1, &valueintOut);
213    if (status != napi_ok) {
214        getErrMessage(status, env, extended_error_info, "napi_create_int32", tag);
215        return nullptr;
216    }
217    /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
218     * env: 当前环境的句柄
219     * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
220     * utf8name: 属性的名称,是一个以UTF-8编码的字符串
221     * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
222     */
223    status = napi_set_named_property(env, cJSON_ParseOut, "valueint", valueintOut);
224    if (status != napi_ok) {
225        /* [NAPI_GEN]: 错误处理*/
226        getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
227        return nullptr;
228    }
229    napi_value valuedoubleOut;
230    /* [NAPI_GEN]: 返回值是double类型时,napi_create_double 创建一个包含双精度浮点数的js数值(Number)对象
231     * env: 当前环境的句柄
232     * value: 要传递给js的双精度浮点数值,这里以传入1.0为例,用例新增业务代码时可根据自身需求修改
233     * result: 指向napi_value的指针,这个指针会被设置为新创建的js数值对象
234     */
235    status = napi_create_double(env, 1.0, &valuedoubleOut);
236    if (status != napi_ok) {
237        getErrMessage(status, env, extended_error_info, "napi_create_double", tag);
238        return nullptr;
239    }
240    /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
241     * env: 当前环境的句柄
242     * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
243     * utf8name: 属性的名称,是一个以UTF-8编码的字符串
244     * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
245     */
246    status = napi_set_named_property(env, cJSON_ParseOut, "valuedouble", valuedoubleOut);
247    if (status != napi_ok) {
248        /* [NAPI_GEN]: 错误处理*/
249        getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
250        return nullptr;
251    }
252    napi_value stringOut;
253    /* [NAPI_GEN]: 返回值是字符串时,napi_create_string_utf8用于在原生代码中创建一个新的js字符串。这个函数会根据提供的UTF-8编码的字符串创建一个等价的js字符串
254     * env: 当前环境的句柄
255     * str: 指向以null结尾的UTF-8编码的C字符串的指针,这里以string举例,用户可根据需求修改
256     * length: 字符串的长度,可以是具体的字节数,或者使用特殊的值NAPI_AUTO_LENGTH来让函数自己计算长度(假定字符串以null结尾)
257     * result: 指向napi_value的指针,函数执行成功后这个指针将指向新创建的js字符串
258     */
259    status = napi_create_string_utf8(env, "string", NAPI_AUTO_LENGTH, &stringOut);
260    if (status != napi_ok) {
261        /*错误处理*/
262        getErrMessage(status, env, extended_error_info, "napi_create_string_utf8", tag);
263        return nullptr;
264    }
265    /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
266     * env: 当前环境的句柄
267     * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
268     * utf8name: 属性的名称,是一个以UTF-8编码的字符串
269     * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
270     */
271    status = napi_set_named_property(env, cJSON_ParseOut, "string", stringOut);
272    if (status != napi_ok) {
273        /* [NAPI_GEN]: 错误处理*/
274        getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
275        return nullptr;
276    }
277
278    OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "KH727_cJSON_Parse", "KH727_cJSON_Parse get return info ends");
279    OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "KH727_cJSON_Parse", "KH727_cJSON_Parse ends");
280    return cJSON_ParseOut;
281
282}
283