1 /*
2 * Copyright (c) 2024 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 "cJsonNapiH/cjsonnapi.h"
17
getAdditemtoobjTypeOut(napi_env env,napi_value cJSON_AddItemToObjectOut,cJSON * jsonObj)18 napi_value getAdditemtoobjTypeOut(napi_env env, napi_value cJSON_AddItemToObjectOut, cJSON *jsonObj)
19 {
20 napi_status status;
21 const napi_extended_error_info *extended_error_info;
22 const char *tag = "[KH180_cJSON_AddItemToObject]";
23 napi_value typeOut;
24 /* [NAPI_GEN]: 返回值是int32_t类型时,napi_create_int32 创建一个包含32位整数(int32_t)的js数值(Number)对象
25 * env: 当前环境的句柄
26 * value: 要准换成js数值的int32_t的值,这里以传入1为例,用例新增业务代码时可根据自身需求修改
27 * result: 指向napi_value的指针,这个指针会被设置为新创建的js数值对象
28 */
29 status = napi_create_int32(env, jsonObj == NULL ? 0 : jsonObj->type, &typeOut);
30 if (status != napi_ok) {
31 getErrMessage(status, env, extended_error_info, "napi_create_int32", tag);
32 return nullptr;
33 }
34 /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
35 * env: 当前环境的句柄
36 * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
37 * utf8name: 属性的名称,是一个以UTF-8编码的字符串
38 * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
39 */
40 status = napi_set_named_property(env, cJSON_AddItemToObjectOut, "type", typeOut);
41 if (status != napi_ok) {
42 /* [NAPI_GEN]: 错误处理*/
43 getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
44 return nullptr;
45 }
46 return cJSON_AddItemToObjectOut;
47 }
48
getAdditemtoobjValuesintOut(napi_env env,napi_value cJSON_AddItemToObjectOut,cJSON * jsonObj)49 napi_value getAdditemtoobjValuesintOut(napi_env env, napi_value cJSON_AddItemToObjectOut, cJSON *jsonObj)
50 {
51 napi_status status;
52 const napi_extended_error_info *extended_error_info;
53 const char *tag = "[KH180_cJSON_AddItemToObject]";
54 napi_value valueintOut;
55 /* [NAPI_GEN]: 返回值是int32_t类型时,napi_create_int32 创建一个包含32位整数(int32_t)的js数值(Number)对象
56 * env: 当前环境的句柄
57 * value: 要准换成js数值的int32_t的值,这里以传入1为例,用例新增业务代码时可根据自身需求修改
58 * result: 指向napi_value的指针,这个指针会被设置为新创建的js数值对象
59 */
60 status = napi_create_int32(env, jsonObj == NULL ? 0 : jsonObj->valueint, &valueintOut);
61 if (status != napi_ok) {
62 getErrMessage(status, env, extended_error_info, "napi_create_int32", tag);
63 return nullptr;
64 }
65 /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
66 * env: 当前环境的句柄
67 * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
68 * utf8name: 属性的名称,是一个以UTF-8编码的字符串
69 * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
70 */
71 status = napi_set_named_property(env, cJSON_AddItemToObjectOut, "valueint", valueintOut);
72 if (status != napi_ok) {
73 /* [NAPI_GEN]: 错误处理*/
74 getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
75 return nullptr;
76 }
77 return cJSON_AddItemToObjectOut;
78 }
79
getAdditemtoobjValuesdoubleOut(napi_env env,napi_value cJSON_AddItemToObjectOut,cJSON * jsonObj)80 napi_value getAdditemtoobjValuesdoubleOut(napi_env env, napi_value cJSON_AddItemToObjectOut, cJSON *jsonObj)
81 {
82 napi_status status;
83 const napi_extended_error_info *extended_error_info;
84 const char *tag = "[KH180_cJSON_AddItemToObject]";
85 napi_value valuedoubleOut;
86 /* [NAPI_GEN]: 返回值是double类型时,napi_create_double 创建一个包含双精度浮点数的js数值(Number)对象
87 * env: 当前环境的句柄
88 * value: 要传递给js的双精度浮点数值,这里以传入1.0为例,用例新增业务代码时可根据自身需求修改
89 * result: 指向napi_value的指针,这个指针会被设置为新创建的js数值对象
90 */
91 status = napi_create_double(env, jsonObj == NULL ? 0 : jsonObj->valuedouble, &valuedoubleOut);
92 if (status != napi_ok) {
93 getErrMessage(status, env, extended_error_info, "napi_create_double", tag);
94 return nullptr;
95 }
96 /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
97 * env: 当前环境的句柄
98 * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
99 * utf8name: 属性的名称,是一个以UTF-8编码的字符串
100 * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
101 */
102 status = napi_set_named_property(env, cJSON_AddItemToObjectOut, "valuedouble", valuedoubleOut);
103 if (status != napi_ok) {
104 /* [NAPI_GEN]: 错误处理*/
105 getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
106 return nullptr;
107 }
108 return cJSON_AddItemToObjectOut;
109 }
110
getAdditemtoobjValuestringOut(napi_env env,napi_value cJSON_AddItemToObjectOut,cJSON * jsonOut)111 napi_value getAdditemtoobjValuestringOut(napi_env env, napi_value cJSON_AddItemToObjectOut, cJSON *jsonOut)
112 {
113 napi_status status;
114 const napi_extended_error_info *extended_error_info;
115 const char *tag = "[KH180_cJSON_AddItemToObject]";
116 napi_value valuestringOut;
117 /* [NAPI_GEN]:
118 * 返回值是字符串时,napi_create_string_utf8用于在原生代码中创建一个新的js字符串。这个函数会根据提供的UTF-8编码的字符串创建一个等价的js字符串
119 * env: 当前环境的句柄
120 * str: 指向以null结尾的UTF-8编码的C字符串的指针,这里以valuestring举例,用户可根据需求修改
121 * length:
122 * 字符串的长度,可以是具体的字节数,或者使用特殊的值NAPI_AUTO_LENGTH来让函数自己计算长度(假定字符串以null结尾)
123 * result: 指向napi_value的指针,函数执行成功后这个指针将指向新创建的js字符串
124 */
125 status = napi_create_string_utf8(env, jsonOut->valuestring == nullptr ? "" : jsonOut->valuestring, NAPI_AUTO_LENGTH,
126 &valuestringOut);
127 if (status != napi_ok) {
128 /*错误处理*/
129 getErrMessage(status, env, extended_error_info, "napi_create_string_utf8", tag);
130 return nullptr;
131 }
132 /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
133 * env: 当前环境的句柄
134 * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
135 * utf8name: 属性的名称,是一个以UTF-8编码的字符串
136 * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
137 */
138 status = napi_set_named_property(env, cJSON_AddItemToObjectOut, "valuestring", valuestringOut);
139 if (status != napi_ok) {
140 /* [NAPI_GEN]: 错误处理*/
141 getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
142 return nullptr;
143 }
144 return cJSON_AddItemToObjectOut;
145 }
146
getAdditemtoobjStringOut(napi_env env,napi_value cJSON_AddItemToObjectOut,cJSON * jsonOut)147 napi_value getAdditemtoobjStringOut(napi_env env, napi_value cJSON_AddItemToObjectOut, cJSON *jsonOut)
148 {
149 napi_status status;
150 const napi_extended_error_info *extended_error_info;
151 const char *tag = "[KH180_cJSON_AddItemToObject]";
152 napi_value stringOut;
153 /* [NAPI_GEN]:
154 * 返回值是字符串时,napi_create_string_utf8用于在原生代码中创建一个新的js字符串。这个函数会根据提供的UTF-8编码的字符串创建一个
155 * 等价的js字符串
156 * env: 当前环境的句柄
157 * str: 指向以null结尾的UTF-8编码的C字符串的指针,这里以string举例,用户可根据需求修改
158 * length:
159 * 字符串的长度,可以是具体的字节数,或者使用特殊的值NAPI_AUTO_LENGTH来让函数自己计算长度(假定字符串以null结尾)
160 * result: 指向napi_value的指针,函数执行成功后这个指针将指向新创建的js字符串
161 */
162 status =
163 napi_create_string_utf8(env, jsonOut->string == nullptr ? "" : jsonOut->string, NAPI_AUTO_LENGTH, &stringOut);
164 if (jsonOut->string != NULL) {
165 OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "KH180_cJSON_AddItemToObject", "jsonOut->string: %s",
166 jsonOut->string);
167 }
168 if (status != napi_ok) {
169 /*错误处理*/
170 getErrMessage(status, env, extended_error_info, "napi_create_string_utf8", tag);
171 return nullptr;
172 }
173 /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
174 * env: 当前环境的句柄
175 * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
176 * utf8name: 属性的名称,是一个以UTF-8编码的字符串
177 * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
178 */
179 status = napi_set_named_property(env, cJSON_AddItemToObjectOut, "string", stringOut);
180 if (status != napi_ok) {
181 /* [NAPI_GEN]: 错误处理*/
182 getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
183 return nullptr;
184 }
185 return cJSON_AddItemToObjectOut;
186 }
187
getAdditemtoobjNextOut(napi_env env,napi_value cJSON_AddItemToObjectOut,cJSON * jsonObj)188 napi_value getAdditemtoobjNextOut(napi_env env, napi_value cJSON_AddItemToObjectOut, cJSON *jsonObj)
189 {
190 napi_status status;
191 const napi_extended_error_info *extended_error_info;
192 const char *tag = "[KH180_cJSON_AddItemToObject]";
193 napi_value nextOut;
194 /* [NAPI_GEN]: 返回值是对象时,需要使用napi_create_object创建一个js的对象与js代码交互
195 * env: 当前环境的句柄
196 * result: 一个napi_value的指针,该指针将被设置为新创建的js对象
197 */
198 status = napi_create_object(env, &nextOut);
199 if (status != napi_ok) {
200 getErrMessage(status, env, extended_error_info, "napi_create_object", tag);
201 return nullptr;
202 }
203 // 给jsonObj->next赋值
204 if (jsonObj == NULL) {
205 return NULL;
206 }
207 if (jsonObj->next != NULL) {
208 nextOut = getAdditemtoobjTypeOut(env, nextOut, jsonObj->next);
209 nextOut = getAdditemtoobjValuesdoubleOut(env, nextOut, jsonObj->next);
210 nextOut = getAdditemtoobjValuesintOut(env, nextOut, jsonObj->next);
211 nextOut = getAdditemtoobjValuestringOut(env, nextOut, jsonObj->next);
212 nextOut = getAdditemtoobjStringOut(env, nextOut, jsonObj->next);
213 if (jsonObj->next->next != NULL) {
214 cJSON *nextNext = jsonObj->next->next;
215 if (nextNext != NULL) {
216 nextOut = getAdditemtoobjNextOut(env, nextOut, jsonObj->next);
217 }
218 }
219 }
220 /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
221 * env: 当前环境的句柄
222 * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
223 * utf8name: 属性的名称,是一个以UTF-8编码的字符串
224 * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
225 */
226 status = napi_set_named_property(env, cJSON_AddItemToObjectOut, "next", nextOut);
227 if (status != napi_ok) {
228 /* [NAPI_GEN]: 错误处理*/
229 getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
230 return nullptr;
231 }
232 return cJSON_AddItemToObjectOut;
233 }
234
getJsonarritemChildOut(napi_env env,napi_value childOut,cJSON * jsonObj)235 napi_value getJsonarritemChildOut(napi_env env, napi_value childOut, cJSON *jsonObj)
236 {
237 if (jsonObj->child != NULL) {
238 childOut = getAdditemtoobjTypeOut(env, childOut, jsonObj->child);
239 childOut = getAdditemtoobjValuesdoubleOut(env, childOut, jsonObj->child);
240 childOut = getAdditemtoobjValuesintOut(env, childOut, jsonObj->child);
241 childOut = getAdditemtoobjValuestringOut(env, childOut, jsonObj->child);
242 childOut = getAdditemtoobjStringOut(env, childOut, jsonObj->child);
243 if (jsonObj->child->next != NULL) {
244 cJSON *childNext = jsonObj->child->next;
245 if (childNext != NULL) {
246 childOut = getAdditemtoobjNextOut(env, childOut, jsonObj->child);
247 }
248 } else if (jsonObj->child->child != NULL) {
249 cJSON *childChild = jsonObj->child->child;
250 if (childChild != NULL) {
251 childOut = getAdditemtoobjChildOut(env, childOut, jsonObj->child);
252 }
253 }
254 }
255 return childOut;
256 }
257
258 /* 将C++ cJSON对象返回js层
259 * 输入:待返回的js对象,c++ cJSON对象
260 * 输出:返回js的对象
261 */
getAdditemtoobjChildOut(napi_env env,napi_value cJSON_AddItemToObjectOut,cJSON * jsonObj)262 napi_value getAdditemtoobjChildOut(napi_env env, napi_value cJSON_AddItemToObjectOut, cJSON *jsonObj)
263 {
264 napi_status status;
265 const napi_extended_error_info *extended_error_info;
266 const char *tag = "[KH180_cJSON_AddItemToObject]";
267 napi_value childOut;
268 /* [NAPI_GEN]: 返回值是对象时,需要使用napi_create_object创建一个js的对象与js代码交互
269 * env: 当前环境的句柄
270 * result: 一个napi_value的指针,该指针将被设置为新创建的js对象
271 */
272 status = napi_create_object(env, &childOut);
273 if (status != napi_ok) {
274 getErrMessage(status, env, extended_error_info, "napi_create_object", tag);
275 return nullptr;
276 }
277 // 给jsonObj->child赋值
278 if (jsonObj != NULL) {
279 childOut = getJsonarritemChildOut(env, childOut, jsonObj);
280 }
281 /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
282 * env: 当前环境的句柄
283 * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
284 * utf8name: 属性的名称,是一个以UTF-8编码的字符串
285 * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
286 */
287 status = napi_set_named_property(env, cJSON_AddItemToObjectOut, "child", childOut);
288 if (status != napi_ok) {
289 /* [NAPI_GEN]: 错误处理*/
290 getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
291 return nullptr;
292 }
293 return cJSON_AddItemToObjectOut;
294 }
295
getAdditemtoobjPrevOut(napi_env env,napi_value cJSON_AddItemToObjectOut,cJSON * jsonObj)296 napi_value getAdditemtoobjPrevOut(napi_env env, napi_value cJSON_AddItemToObjectOut, cJSON *jsonObj)
297 {
298 napi_status status;
299 const napi_extended_error_info *extended_error_info;
300 const char *tag = "[KH180_cJSON_AddItemToObject]";
301 napi_value prevOut;
302 /* [NAPI_GEN]: 返回值是对象时,需要使用napi_create_object创建一个js的对象与js代码交互
303 * env: 当前环境的句柄
304 * result: 一个napi_value的指针,该指针将被设置为新创建的js对象
305 */
306 status = napi_create_object(env, &prevOut);
307 if (status != napi_ok) {
308 getErrMessage(status, env, extended_error_info, "napi_create_object", tag);
309 return nullptr;
310 }
311 /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
312 * env: 当前环境的句柄
313 * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
314 * utf8name: 属性的名称,是一个以UTF-8编码的字符串
315 * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
316 */
317 status = napi_set_named_property(env, cJSON_AddItemToObjectOut, "prev", prevOut);
318 if (status != napi_ok) {
319 /* [NAPI_GEN]: 错误处理*/
320 getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
321 return nullptr;
322 }
323 return cJSON_AddItemToObjectOut;
324 }
325
getAdditemtoobjInfoParam1(napi_env env,napi_value propName)326 char *getAdditemtoobjInfoParam1(napi_env env, napi_value propName)
327 {
328 napi_status status;
329 const napi_extended_error_info *extended_error_info;
330 const char *tag = "[KH180_cJSON_AddItemToObject]";
331 napi_valuetype valuetypestring;
332 /* [NAPI_GEN]: 获取入参类型,第1个入参
333 * env: N-API环境的句柄,表示当前的上下文
334 * value: 要检查类型的js值
335 * result: 是一个指针,指向napi_valuetype枚举的值,函数会将结果存储在这里
336 */
337 status = napi_typeof(env, propName, &valuetypestring);
338 if (status != napi_ok) {
339 getErrMessage(status, env, extended_error_info, "napi_typeof", tag);
340 return nullptr;
341 }
342 size_t strSize1 = 0;
343 /* [NAPI_GEN]: napi_get_value_string_utf8用于将Js字符串转换为UTF-8编码的C字符串
344 * env: N-API环境的句柄,表示当前的上下文
345 * value: 要转换的JavaScript字符串
346 * buf: 用于存储结果的字符数组的指针
347 * bufsize: 缓冲区大小,以字节为单位
348 * result: 转换后的字符串的字节长度(不包括空终止符)。若干buf是NULL,则返回所需的缓冲区大小(包括空终止符)
349 */
350 /* [NAPI_GEN]: buf参数是NULL时,用于获取所需缓冲区大小*/
351 status = napi_get_value_string_utf8(env, propName, NULL, 0, &strSize1);
352 if (status != napi_ok) {
353 getErrMessage(status, env, extended_error_info, "get value string", tag);
354 return nullptr;
355 }
356 char *stringIn = new char[strSize1 + 1];
357 /* [NAPI_GEN]: 用于获取字符串*/
358 status = napi_get_value_string_utf8(env, propName, stringIn, strSize1 + 1, &strSize1);
359 if (status != napi_ok) {
360 getErrMessage(status, env, extended_error_info, "get value string", tag);
361 delete[] stringIn;
362 return nullptr;
363 }
364 return stringIn;
365 }
366
getAdditemtoobjInfoParam2(napi_env env,napi_value objItem)367 char *getAdditemtoobjInfoParam2(napi_env env, napi_value objItem)
368 {
369 napi_status status;
370 const napi_extended_error_info *extended_error_info;
371 const char *tag = "[KH180_cJSON_AddItemToObject]";
372 // 从objItem里面获取valuestring
373 napi_value paramValueIn;
374 status = napi_get_named_property(env, objItem, "valuestring", ¶mValueIn); // 读取属性值
375 if (status != napi_ok) {
376 getErrMessage(status, env, extended_error_info, "get named property", tag);
377 return NULL;
378 }
379 size_t strSize = 0;
380 /* [NAPI_GEN]: napi_get_value_string_utf8用于将Js字符串转换为UTF-8编码的C字符串
381 * env: N-API环境的句柄,表示当前的上下文
382 * value: 要转换的JavaScript字符串
383 * buf: 用于存储结果的字符数组的指针
384 * bufsize: 缓冲区大小,以字节为单位
385 * result: 转换后的字符串的字节长度(不包括空终止符)。若干buf是NULL,则返回所需的缓冲区大小(包括空终止符)
386 */
387 /* [NAPI_GEN]: buf参数是NULL时,用于获取所需缓冲区大小*/
388 status = napi_get_value_string_utf8(env, paramValueIn, NULL, 0, &strSize);
389 if (status != napi_ok) {
390 getErrMessage(status, env, extended_error_info, "get value string", tag);
391 return nullptr;
392 }
393 char *valueString = new char[strSize + 1];
394 /* [NAPI_GEN]: 用于获取字符串*/
395 status = napi_get_value_string_utf8(env, paramValueIn, valueString, strSize + 1, &strSize);
396 if (status != napi_ok) {
397 getErrMessage(status, env, extended_error_info, "get value string", tag);
398 delete[] valueString;
399 return nullptr;
400 }
401 return valueString;
402 }
403
getCjsonAddItemToObjRes(napi_env env,napi_value cjsonObj,napi_value propName,napi_value objItem)404 cJSON *getCjsonAddItemToObjRes(napi_env env, napi_value cjsonObj, napi_value propName, napi_value objItem)
405 {
406 const char *tag = "[KH180_cJSON_AddItemToObject]";
407 char *stringIn = getAdditemtoobjInfoParam1(env, propName);
408 char *valueString = getAdditemtoobjInfoParam2(env, objItem);
409 cJSON *root = cJSON_CreateObject();
410 // 初始化obj
411 root = initCJSON_Object(env, cjsonObj, root, tag);
412
413 cJSON *jsonArray = cJSON_CreateArray();
414 jsonArray = initCJSON_Array(env, objItem, jsonArray, tag, false);
415 char *rootString1 = cJSON_Print(jsonArray);
416 if (rootString1 != NULL) {
417 // 需要去掉字符串中的\n 这样方便查找打印出的字符串
418 std::string printRootStr = rootString1;
419 RemoveNewlines(printRootStr);
420 OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "KH180_cJSON_AddItemToObject", "rootString1: %s",
421 printRootStr.c_str());
422 }
423 cJSON_bool jsonArrayRes = cJSON_IsArray(jsonArray);
424 cJSON *jsonObject = cJSON_CreateObject();
425 jsonObject = initCJSON_Object(env, objItem, jsonObject, tag);
426 bool jsonObjectNull = false;
427 char *rootString4 = cJSON_Print(jsonObject);
428 if (rootString4 != NULL) {
429 // 需要去掉字符串中的\n 这样方便查找打印出的字符串
430 std::string printRootStr = rootString4;
431 RemoveNewlines(printRootStr);
432 if (printRootStr == "{}") {
433 jsonObjectNull = true;
434 }
435 OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "KH180_cJSON_AddItemToObject", "rootString4: %s",
436 printRootStr.c_str());
437 }
438 if (!jsonObjectNull) {
439 cJSON_AddItemToObject(root, stringIn, jsonObject);
440 } else if (jsonArrayRes) {
441 cJSON_AddItemToObject(root, stringIn, jsonArray);
442 } else {
443 cJSON_AddItemToObject(root, stringIn, cJSON_CreateString(valueString));
444 }
445
446 delete[] valueString;
447 delete[] stringIn;
448 return root;
449 }
450
451 /* [NAPI_GEN]:对应cJSON.h中: CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObject(cJSON *object, const char *string,
452 * cJSON *item); 的napi方法,
453 * 输入:一个cJSON对象,需要添加的item名字(字符串),需要加入cJSON对象的item(cJSON 对象)
454 * 输出:添加item后的cJSON对象
455 */
KH180_cJSON_AddItemToObject(napi_env env,napi_callback_info info)456 napi_value KH180_cJSON_AddItemToObject(napi_env env, napi_callback_info info)
457 {
458 napi_status status;
459 /* [NAPI_GEN]: Node.js在其N-API中用来提供错误的扩展信息的结构体,结构体包含以下字段
460 * error_message: 一个指向错误详细字符串的指针,提供了关于错误的文本描述
461 * engin_reserved: 一个保留给Js引擎使用的指针
462 * error_code: 错误码,指示了错误的种类,比如napi_pending_exception表示有一个JavaScript异常未被清理。
463 * engine_error_code:一个引擎特定的错误码,为引擎实现保留,具体含义依赖于使用的JavaScript引擎。
464 * error_message_len:错误消息字符串的长度。
465 */
466 const napi_extended_error_info *extended_error_info;
467 /* [NAPI_GEN]: tag: 日志打印标签*/
468 const char *tag = "[KH180_cJSON_AddItemToObject]";
469 /* [NAPI_GEN]: get function param in*/
470 /* [NAPI_GEN]: argc:js传入的参数个数 */
471 size_t argc = PARAMS3;
472 /* [NAPI_GEN]: args: 一个数组,保存js传入的参数 */
473 napi_value args[PARAMS3] = {nullptr};
474 /* [NAPI_GEN]: napi_get_cb_info用于获取JS调用该函数时所传递的参数、接收参数的个数以及'this'的值
475 * env: 当前环境的句柄,代表当前的Node.js环境
476 * info: 回调信息句柄,代表当前回调的上下文
477 * argc: 指向size_t的指针,最初应包含可接受的最大参数数量,函数返回时,它将包含实际传递的参数数量
478 * args: 一个足够大的数组,用于接收传递给回调函数的所有js参数。数组的大小应至少与argc传入的值一样大。
479 * this_arg: 如果不是NULL,则返回js回调中this的值
480 * data: 如果不是NULL,则返回与回调函数关联的任何可选数据。通常用于传递在创建函数时指定的静态数据
481 */
482 status = napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
483 if (status != napi_ok) {
484 getErrMessage(status, env, extended_error_info, "napi_get_cb_info", tag);
485 return nullptr;
486 }
487
488 // Todo: add business logic. 在这前后代码为框架所生成
489 cJSON *root = NULL;
490 root = getCjsonAddItemToObjRes(env, args[PARAMS0], args[PARAMS1], args[PARAMS2]);
491
492 /* [NAPI_GEN]: function return value*/
493 napi_value cJSON_AddItemToObjectOut;
494 // 注意: 这里应该返回cJSON,以便js层拿到结果 将属性一个个塞入object
495 status = napi_create_object(env, &cJSON_AddItemToObjectOut);
496 if (status != napi_ok) {
497 getErrMessage(status, env, extended_error_info, "napi_create_object", tag);
498 return nullptr;
499 }
500
501 cJSON_AddItemToObjectOut = getAdditemtoobjChildOut(env, cJSON_AddItemToObjectOut, root);
502 cJSON_AddItemToObjectOut = getAdditemtoobjNextOut(env, cJSON_AddItemToObjectOut, root);
503 cJSON_AddItemToObjectOut = getAdditemtoobjPrevOut(env, cJSON_AddItemToObjectOut, root);
504 cJSON_AddItemToObjectOut = getAdditemtoobjTypeOut(env, cJSON_AddItemToObjectOut, root);
505 cJSON_AddItemToObjectOut = getAdditemtoobjValuesdoubleOut(env, cJSON_AddItemToObjectOut, root);
506 cJSON_AddItemToObjectOut = getAdditemtoobjValuesintOut(env, cJSON_AddItemToObjectOut, root);
507 cJSON_AddItemToObjectOut = getAdditemtoobjValuestringOut(env, cJSON_AddItemToObjectOut, root);
508 cJSON_AddItemToObjectOut = getAdditemtoobjStringOut(env, cJSON_AddItemToObjectOut, root);
509
510 return cJSON_AddItemToObjectOut;
511 }
512