• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#include "cjsonnapi.h"
2/* [NAPI_GEN]:对应cJSON.h中:cJSON_CreateObject的napi方法,
3 * 输入:void
4 * 输出:cJSON *
5 */
6napi_value KH578_cJSON_CreateObject(napi_env env, napi_callback_info info)
7{
8    OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "KH578_cJSON_CreateObject", "KH578_cJSON_CreateObject 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 = "[KH578_cJSON_CreateObject]";
20    /* [NAPI_GEN]: get function param in*/
21
22    OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "KH578_cJSON_CreateObject", "KH578_cJSON_CreateObject get return info begins");
23    // Todo: add business logic. 在这前后代码为框架所生成
24
25    /* [NAPI_GEN]: function return value*/
26    napi_value cJSON_CreateObjectOut;
27    /* [NAPI_GEN]: 返回值是对象时,需要使用napi_create_object创建一个js的对象与js代码交互
28     * env: 当前环境的句柄
29     * result: 一个napi_value的指针,该指针将被设置为新创建的js对象
30     */
31    status = napi_create_object(env, &cJSON_CreateObjectOut);
32    if (status != napi_ok) {
33        getErrMessage(status, env, extended_error_info, "napi_create_object", tag);
34        return nullptr;
35    }
36    napi_value nextOut;
37    /* [NAPI_GEN]: 返回值是对象时,需要使用napi_create_object创建一个js的对象与js代码交互
38     * env: 当前环境的句柄
39     * result: 一个napi_value的指针,该指针将被设置为新创建的js对象
40     */
41    status = napi_create_object(env, &nextOut);
42    if (status != napi_ok) {
43        getErrMessage(status, env, extended_error_info, "napi_create_object", tag);
44        return nullptr;
45    }
46    /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
47     * env: 当前环境的句柄
48     * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
49     * utf8name: 属性的名称,是一个以UTF-8编码的字符串
50     * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
51     */
52    status = napi_set_named_property(env, cJSON_CreateObjectOut, "next", nextOut);
53    if (status != napi_ok) {
54        /* [NAPI_GEN]: 错误处理*/
55        getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
56        return nullptr;
57    }
58    napi_value prevOut;
59    /* [NAPI_GEN]: 返回值是对象时,需要使用napi_create_object创建一个js的对象与js代码交互
60     * env: 当前环境的句柄
61     * result: 一个napi_value的指针,该指针将被设置为新创建的js对象
62     */
63    status = napi_create_object(env, &prevOut);
64    if (status != napi_ok) {
65        getErrMessage(status, env, extended_error_info, "napi_create_object", tag);
66        return nullptr;
67    }
68    /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
69     * env: 当前环境的句柄
70     * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
71     * utf8name: 属性的名称,是一个以UTF-8编码的字符串
72     * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
73     */
74    status = napi_set_named_property(env, cJSON_CreateObjectOut, "prev", prevOut);
75    if (status != napi_ok) {
76        /* [NAPI_GEN]: 错误处理*/
77        getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
78        return nullptr;
79    }
80    napi_value childOut;
81    /* [NAPI_GEN]: 返回值是对象时,需要使用napi_create_object创建一个js的对象与js代码交互
82     * env: 当前环境的句柄
83     * result: 一个napi_value的指针,该指针将被设置为新创建的js对象
84     */
85    status = napi_create_object(env, &childOut);
86    if (status != napi_ok) {
87        getErrMessage(status, env, extended_error_info, "napi_create_object", tag);
88        return nullptr;
89    }
90    /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
91     * env: 当前环境的句柄
92     * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
93     * utf8name: 属性的名称,是一个以UTF-8编码的字符串
94     * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
95     */
96    status = napi_set_named_property(env, cJSON_CreateObjectOut, "child", childOut);
97    if (status != napi_ok) {
98        /* [NAPI_GEN]: 错误处理*/
99        getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
100        return nullptr;
101    }
102    napi_value typeOut;
103    /* [NAPI_GEN]: 返回值是int32_t类型时,napi_create_int32 创建一个包含32位整数(int32_t)的js数值(Number)对象
104     * env: 当前环境的句柄
105     * value: 要准换成js数值的int32_t的值,这里以传入1为例,用例新增业务代码时可根据自身需求修改
106     * result: 指向napi_value的指针,这个指针会被设置为新创建的js数值对象
107     */
108    status = napi_create_int32(env, 1, &typeOut);
109    if (status != napi_ok) {
110        getErrMessage(status, env, extended_error_info, "napi_create_int32", tag);
111        return nullptr;
112    }
113    /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
114     * env: 当前环境的句柄
115     * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
116     * utf8name: 属性的名称,是一个以UTF-8编码的字符串
117     * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
118     */
119    status = napi_set_named_property(env, cJSON_CreateObjectOut, "type", typeOut);
120    if (status != napi_ok) {
121        /* [NAPI_GEN]: 错误处理*/
122        getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
123        return nullptr;
124    }
125    napi_value valuestringOut;
126    /* [NAPI_GEN]: 返回值是字符串时,napi_create_string_utf8用于在原生代码中创建一个新的js字符串。这个函数会根据提供的UTF-8编码的字符串创建一个等价的js字符串
127     * env: 当前环境的句柄
128     * str: 指向以null结尾的UTF-8编码的C字符串的指针,这里以valuestring举例,用户可根据需求修改
129     * length: 字符串的长度,可以是具体的字节数,或者使用特殊的值NAPI_AUTO_LENGTH来让函数自己计算长度(假定字符串以null结尾)
130     * result: 指向napi_value的指针,函数执行成功后这个指针将指向新创建的js字符串
131     */
132    status = napi_create_string_utf8(env, "valuestring", NAPI_AUTO_LENGTH, &valuestringOut);
133    if (status != napi_ok) {
134        /*错误处理*/
135        getErrMessage(status, env, extended_error_info, "napi_create_string_utf8", tag);
136        return nullptr;
137    }
138    /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
139     * env: 当前环境的句柄
140     * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
141     * utf8name: 属性的名称,是一个以UTF-8编码的字符串
142     * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
143     */
144    status = napi_set_named_property(env, cJSON_CreateObjectOut, "valuestring", valuestringOut);
145    if (status != napi_ok) {
146        /* [NAPI_GEN]: 错误处理*/
147        getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
148        return nullptr;
149    }
150    napi_value valueintOut;
151    /* [NAPI_GEN]: 返回值是int32_t类型时,napi_create_int32 创建一个包含32位整数(int32_t)的js数值(Number)对象
152     * env: 当前环境的句柄
153     * value: 要准换成js数值的int32_t的值,这里以传入1为例,用例新增业务代码时可根据自身需求修改
154     * result: 指向napi_value的指针,这个指针会被设置为新创建的js数值对象
155     */
156    status = napi_create_int32(env, 1, &valueintOut);
157    if (status != napi_ok) {
158        getErrMessage(status, env, extended_error_info, "napi_create_int32", tag);
159        return nullptr;
160    }
161    /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
162     * env: 当前环境的句柄
163     * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
164     * utf8name: 属性的名称,是一个以UTF-8编码的字符串
165     * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
166     */
167    status = napi_set_named_property(env, cJSON_CreateObjectOut, "valueint", valueintOut);
168    if (status != napi_ok) {
169        /* [NAPI_GEN]: 错误处理*/
170        getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
171        return nullptr;
172    }
173    napi_value valuedoubleOut;
174    /* [NAPI_GEN]: 返回值是double类型时,napi_create_double 创建一个包含双精度浮点数的js数值(Number)对象
175     * env: 当前环境的句柄
176     * value: 要传递给js的双精度浮点数值,这里以传入1.0为例,用例新增业务代码时可根据自身需求修改
177     * result: 指向napi_value的指针,这个指针会被设置为新创建的js数值对象
178     */
179    status = napi_create_double(env, 1.0, &valuedoubleOut);
180    if (status != napi_ok) {
181        getErrMessage(status, env, extended_error_info, "napi_create_double", tag);
182        return nullptr;
183    }
184    /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
185     * env: 当前环境的句柄
186     * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
187     * utf8name: 属性的名称,是一个以UTF-8编码的字符串
188     * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
189     */
190    status = napi_set_named_property(env, cJSON_CreateObjectOut, "valuedouble", valuedoubleOut);
191    if (status != napi_ok) {
192        /* [NAPI_GEN]: 错误处理*/
193        getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
194        return nullptr;
195    }
196    napi_value stringOut;
197    /* [NAPI_GEN]: 返回值是字符串时,napi_create_string_utf8用于在原生代码中创建一个新的js字符串。这个函数会根据提供的UTF-8编码的字符串创建一个等价的js字符串
198     * env: 当前环境的句柄
199     * str: 指向以null结尾的UTF-8编码的C字符串的指针,这里以string举例,用户可根据需求修改
200     * length: 字符串的长度,可以是具体的字节数,或者使用特殊的值NAPI_AUTO_LENGTH来让函数自己计算长度(假定字符串以null结尾)
201     * result: 指向napi_value的指针,函数执行成功后这个指针将指向新创建的js字符串
202     */
203    status = napi_create_string_utf8(env, "string", NAPI_AUTO_LENGTH, &stringOut);
204    if (status != napi_ok) {
205        /*错误处理*/
206        getErrMessage(status, env, extended_error_info, "napi_create_string_utf8", tag);
207        return nullptr;
208    }
209    /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
210     * env: 当前环境的句柄
211     * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
212     * utf8name: 属性的名称,是一个以UTF-8编码的字符串
213     * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
214     */
215    status = napi_set_named_property(env, cJSON_CreateObjectOut, "string", stringOut);
216    if (status != napi_ok) {
217        /* [NAPI_GEN]: 错误处理*/
218        getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
219        return nullptr;
220    }
221
222    OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "KH578_cJSON_CreateObject", "KH578_cJSON_CreateObject get return info ends");
223    OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "KH578_cJSON_CreateObject", "KH578_cJSON_CreateObject ends");
224    return cJSON_CreateObjectOut;
225
226}
227