• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "native_module_xml.h"
17 #include "js_xml.h"
18 #include "js_xml_dynamic.h"
19 #include "tools/ets_error.h"
20 
21 extern const char _binary_js_xml_js_start[];
22 extern const char _binary_js_xml_js_end[];
23 extern const char _binary_xml_abc_start[];
24 extern const char _binary_xml_abc_end[];
25 
26 namespace OHOS::xml {
27 using namespace OHOS::Tools;
28 static const int32_t ERROR_CODE = 401; // 401 : the parameter type is incorrect
29 const int32_t ARGC_ONE = 1; // 1 : number of args
30 const int32_t ARGC_TWO = 2; // 2 : number of args
31 
XmlSerializerConstructor(napi_env env,napi_callback_info info)32     static napi_value XmlSerializerConstructor(napi_env env, napi_callback_info info)
33     {
34         napi_value thisVar = nullptr;
35         void *data = nullptr;
36         size_t argc = 2;
37         napi_value args[2] = { nullptr }; // 2:The number of parameters is 2
38         XmlSerializer *object = nullptr;
39         size_t iLength = 0;
40         size_t offPos = 0;
41         napi_value arraybuffer = nullptr;
42         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, &data));
43         NAPI_ASSERT(env, argc == 1 || argc == 2, "Wrong number of arguments"); // 2: number of args
44 
45         bool bFlag = false;
46         napi_is_arraybuffer(env, args[0], &bFlag);
47         if (bFlag) {
48             napi_get_arraybuffer_info(env, args[0], &data, &iLength);
49         } else {
50             napi_is_dataview(env, args[0], &bFlag);
51             if (bFlag) {
52                 napi_get_dataview_info(env, args[0], &iLength, &data, &arraybuffer, &offPos);
53             } else {
54                 napi_throw_error(env, "401", "Parameter error. The type of Parameter must be ArrayBuffer or DataView.");
55                 return nullptr;
56             }
57         }
58 
59         if (argc == 1) {
60             object = new (std::nothrow) XmlSerializer(reinterpret_cast<char*>(data), iLength);
61             if (object == nullptr) {
62                 HILOG_ERROR("XmlSerializerConstructor:: memory allocation failed, object is nullptr");
63                 return nullptr;
64             }
65         } else if (argc == 2) { // 2:When the input parameter is set to 2
66             std::string encoding = "";
67             napi_valuetype valuetype;
68             NAPI_CALL(env, napi_typeof(env, args[1], &valuetype));
69             NAPI_ASSERT(env, valuetype == napi_string, "Wrong argument type: string expected.");
70             napi_status status = napi_ok;
71             status = XmlSerializer::DealNapiStrValue(env, args[1], encoding);
72             if (status == napi_ok) {
73                 object = new (std::nothrow) XmlSerializer(reinterpret_cast<char*>(data), iLength, encoding);
74                 if (object == nullptr) {
75                     HILOG_ERROR("XmlSerializerConstructor:: memory allocation failed, object is nullptr");
76                     return nullptr;
77                 }
78             }
79         }
80         napi_status status = napi_wrap(env, thisVar, object,
81             [](napi_env environment, void *data, void *hint) {
82                 auto obj = reinterpret_cast<XmlSerializer*>(data);
83                 if (obj != nullptr) {
84                     delete obj;
85                     obj = nullptr;
86                 }
87             }, nullptr, nullptr);
88         if (status != napi_ok && object != nullptr) {
89             HILOG_ERROR("XmlPullParserConstructor:: napi_wrap failed");
90             delete object;
91             object = nullptr;
92         }
93         return thisVar;
94     }
95 
XmlPullParserConstructor(napi_env env,napi_callback_info info)96     static napi_value XmlPullParserConstructor(napi_env env, napi_callback_info info)
97     {
98         napi_value thisVar = nullptr;
99         void *data = nullptr;
100         size_t argc = 2;
101         napi_value args[2] = { nullptr }; // 2:two args
102         XmlPullParser *object = nullptr;
103         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, &data));
104         NAPI_ASSERT(env, argc == 1 || argc == 2, "Wrong number of arguments"); // 2:two args
105         napi_valuetype valuetype = napi_null;
106         NAPI_CALL(env, napi_typeof(env, args[0], &valuetype));
107         NAPI_ASSERT(env, valuetype == napi_object, "Wrong argument type: DataView or ArrayBuffer expected.");
108         bool bFlag = false;
109         size_t len = 0;
110         size_t offPos = 0;
111         napi_value arraybuffer = nullptr;
112         napi_is_arraybuffer(env, args[0], &bFlag);
113         if (bFlag) {
114             napi_get_arraybuffer_info(env, args[0], &data, &len);
115         } else {
116             napi_is_dataview(env, args[0], &bFlag);
117             if (bFlag) {
118                 napi_get_dataview_info(env, args[0], &len, &data, &arraybuffer, &offPos);
119             } else {
120                 napi_throw_error(env, "401", "Parameter error. The type of Parameter must be ArrayBuffer or DataView.");
121                 return nullptr;
122             }
123         }
124         if (data) {
125             std::string strEnd(reinterpret_cast<char*>(data), len);
126             if (argc == 1) {
127                 object = new (std::nothrow) XmlPullParser(env, strEnd, "utf-8");
128                 if (object == nullptr) {
129                     HILOG_ERROR("XmlPullParserConstructor:: memory allocation failed, object is nullptr");
130                     return nullptr;
131                 }
132             } else if (argc == 2) { // 2:When the input parameter is set to 2
133                 NAPI_CALL(env, napi_typeof(env, args[1], &valuetype));
134                 NAPI_ASSERT(env, valuetype == napi_string, "Wrong argument type: string expected.");
135                 std::string strEncoding = "";
136                 XmlSerializer::DealNapiStrValue(env, args[1], strEncoding);
137                 object = new (std::nothrow) XmlPullParser(env, strEnd, strEncoding);
138                 if (object == nullptr) {
139                     HILOG_ERROR("XmlPullParserConstructor:: memory allocation failed, object is nullptr");
140                     return nullptr;
141                 }
142             }
143         }
144         napi_status status = napi_wrap(env, thisVar, object,
145             [](napi_env env, void *data, void *hint) {
146                 auto obj = reinterpret_cast<XmlPullParser*>(data);
147                 if (obj != nullptr) {
148                     delete obj;
149                     obj = nullptr;
150                 }
151             }, nullptr, nullptr);
152         if (status != napi_ok && object != nullptr) {
153             HILOG_ERROR("XmlPullParserConstructor:: napi_wrap failed");
154             delete object;
155             object = nullptr;
156         }
157         return thisVar;
158     }
159 
SetAttributes(napi_env env,napi_callback_info info)160     static napi_value SetAttributes(napi_env env, napi_callback_info info)
161     {
162         napi_value thisVar = nullptr;
163         size_t argc = 2;
164         napi_value args[2] = { nullptr }; // 2:two args
165         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr));
166         NAPI_ASSERT(env, argc == 2, "Wrong number of arguments"); // 2: number of args
167         napi_valuetype valuetype = napi_null;
168         NAPI_CALL(env, napi_typeof(env, args[0], &valuetype));
169         NAPI_ASSERT(env, valuetype == napi_string, "Wrong argument type. string expected.");
170         NAPI_CALL(env, napi_typeof(env, args[1], &valuetype));
171         NAPI_ASSERT(env, valuetype == napi_string, "Wrong argument type. string expected.");
172         XmlSerializer *object = nullptr;
173         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object)));
174         std::string name;
175         std::string value;
176         XmlSerializer::DealNapiStrValue(env, args[0], name);
177         XmlSerializer::DealNapiStrValue(env, args[1], value);
178         object->SetAttributes(name, value);
179         napi_value result = nullptr;
180         NAPI_CALL(env, napi_get_undefined(env, &result));
181         return result;
182     }
183 
AddEmptyElement(napi_env env,napi_callback_info info)184     static napi_value AddEmptyElement(napi_env env, napi_callback_info info)
185     {
186         napi_value thisVar = nullptr;
187         size_t argc = 1;
188         napi_value args[1] = { 0 };
189         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr));
190         NAPI_ASSERT(env, argc == 1, "Wrong number of arguments.");
191 
192         napi_valuetype valuetype;
193         NAPI_CALL(env, napi_typeof(env, args[0], &valuetype));
194         NAPI_ASSERT(env, valuetype == napi_string, "Wrong argument type: string expected.");
195         XmlSerializer *object = nullptr;
196         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object)));
197         std::string name;
198         object->DealNapiStrValue(env, args[0], name);
199         object->AddEmptyElement(name);
200 
201         napi_value result = nullptr;
202         NAPI_CALL(env, napi_get_undefined(env, &result));
203         return result;
204     }
205 
SetDeclaration(napi_env env,napi_callback_info info)206     static napi_value SetDeclaration(napi_env env, napi_callback_info info)
207     {
208         napi_value thisVar = nullptr;
209         NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
210         XmlSerializer *object = nullptr;
211         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object)));
212         object->SetDeclaration();
213         napi_value result = nullptr;
214         NAPI_CALL(env, napi_get_undefined(env, &result));
215         return result;
216     }
217 
StartElement(napi_env env,napi_callback_info info)218     static napi_value StartElement(napi_env env, napi_callback_info info)
219     {
220         size_t argc = 1;
221         napi_value args[1] = { nullptr };
222         napi_value thisVar = nullptr;
223         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr));
224         NAPI_ASSERT(env, argc == 1, "Wrong number of arguments");
225         XmlSerializer *object = nullptr;
226         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object)));
227         std::string name;
228         object->DealNapiStrValue(env, args[0], name);
229         object->StartElement(name);
230         napi_value result = nullptr;
231         NAPI_CALL(env, napi_get_undefined(env, &result));
232         return result;
233     }
234 
EndElement(napi_env env,napi_callback_info info)235     static napi_value EndElement(napi_env env, napi_callback_info info)
236     {
237         napi_value thisVar = nullptr;
238         NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
239         XmlSerializer *object = nullptr;
240         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object)));
241         object->EndElement();
242         napi_value result = nullptr;
243         NAPI_CALL(env, napi_get_undefined(env, &result));
244         return result;
245     }
246 
SetNamespace(napi_env env,napi_callback_info info)247     static napi_value SetNamespace(napi_env env, napi_callback_info info)
248     {
249         napi_value thisVar = nullptr;
250         size_t argc = 2;
251         napi_value args[2] = { nullptr }; // 2:two args
252         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr));
253         NAPI_ASSERT(env, argc == 2, "Wrong number of arguments"); // 2:two args
254         napi_valuetype valuetype = napi_null;
255         NAPI_CALL(env, napi_typeof(env, args[0], &valuetype));
256         NAPI_ASSERT(env, valuetype == napi_string, "Wrong argument type: string expected.");
257         NAPI_CALL(env, napi_typeof(env, args[1], &valuetype));
258         NAPI_ASSERT(env, valuetype == napi_string, "Wrong argument type: string expected.");
259         XmlSerializer *object = nullptr;
260         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object)));
261         std::string prefix;
262         std::string nsTemp;
263         XmlSerializer::DealNapiStrValue(env, args[0], prefix);
264         XmlSerializer::DealNapiStrValue(env, args[1], nsTemp);
265         object->SetNamespace(prefix, nsTemp);
266         napi_value result = nullptr;
267         NAPI_CALL(env, napi_get_undefined(env, &result));
268         return result;
269     }
270 
SetComment(napi_env env,napi_callback_info info)271     static napi_value SetComment(napi_env env, napi_callback_info info)
272     {
273         napi_value thisVar = nullptr;
274         size_t argc = 1;
275         napi_value args[1] = { nullptr };
276         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr));
277         NAPI_ASSERT(env, argc == 1, "Wrong number of arguments.");
278         napi_valuetype valuetype = napi_null;
279         NAPI_CALL(env, napi_typeof(env, args[0], &valuetype));
280         NAPI_ASSERT(env, valuetype == napi_string, "Wrong argument type: string expected.");
281         XmlSerializer *object = nullptr;
282         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object)));
283         std::string comment;
284         object->DealNapiStrValue(env, args[0], comment);
285         object->SetComment(comment);
286         napi_value result = nullptr;
287         NAPI_CALL(env, napi_get_undefined(env, &result));
288         return result;
289     }
290 
SetCData(napi_env env,napi_callback_info info)291     static napi_value SetCData(napi_env env, napi_callback_info info)
292     {
293         napi_value thisVar = nullptr;
294         size_t argc = 1;
295         napi_value args[1] = { nullptr };
296         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr));
297         NAPI_ASSERT(env, argc == 1, "Wrong number of arguments");
298         napi_valuetype valuetype = napi_null;
299         NAPI_CALL(env, napi_typeof(env, args[0], &valuetype));
300         NAPI_ASSERT(env, valuetype == napi_string, "Wrong argument type: string expected.");
301         XmlSerializer *object = nullptr;
302         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object)));
303         std::string data;
304         XmlSerializer::DealNapiStrValue(env, args[0], data);
305         object->SetCData(data);
306         napi_value result = nullptr;
307         NAPI_CALL(env, napi_get_undefined(env, &result));
308         return result;
309     }
310 
SetText(napi_env env,napi_callback_info info)311     static napi_value SetText(napi_env env, napi_callback_info info)
312     {
313         napi_value thisVar = nullptr;
314         size_t argc = 1;
315         napi_value args[1] = { nullptr };
316         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr));
317         NAPI_ASSERT(env, argc == 1, "Wrong number of arguments");
318         napi_valuetype valuetype = napi_null;
319         NAPI_CALL(env, napi_typeof(env, args[0], &valuetype));
320         NAPI_ASSERT(env, valuetype == napi_string, "Wrong argument type: string expected.");
321         XmlSerializer *object = nullptr;
322         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object)));
323         std::string text;
324         XmlSerializer::DealNapiStrValue(env, args[0], text);
325         object->SetText(text);
326         napi_value result = nullptr;
327         NAPI_CALL(env, napi_get_undefined(env, &result));
328         return result;
329     }
330 
SetDocType(napi_env env,napi_callback_info info)331     static napi_value SetDocType(napi_env env, napi_callback_info info)
332     {
333         napi_value thisVar = nullptr;
334         size_t argc = 1;
335         napi_value args[1] = { nullptr };
336         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr));
337         NAPI_ASSERT(env, argc == 1, "Wrong number of arguments");
338         napi_valuetype valuetype = napi_null;
339         NAPI_CALL(env, napi_typeof(env, args[0], &valuetype));
340         NAPI_ASSERT(env, valuetype == napi_string, "Wrong argument type: string expected.");
341         XmlSerializer *object = nullptr;
342         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object)));
343         std::string text;
344         XmlSerializer::DealNapiStrValue(env, args[0], text);
345         object->SetDocType(text);
346         napi_value result = nullptr;
347         NAPI_CALL(env, napi_get_undefined(env, &result));
348         return result;
349     }
XmlSerializerError(napi_env env,napi_callback_info info)350     static napi_value XmlSerializerError(napi_env env, napi_callback_info info)
351     {
352         napi_value thisVar = nullptr;
353         napi_value result = nullptr;
354         NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
355         XmlSerializer *object = nullptr;
356         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object)));
357         std::string temp = object->XmlSerializerError();
358         size_t templen = temp.size();
359         NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), templen, &result));
360         return result;
361     }
362 
XmlSerializerInit(napi_env env,napi_value exports)363     napi_value XmlSerializerInit(napi_env env, napi_value exports)
364     {
365         const char *xmlSerializerClass = "XmlSerializer";
366         napi_value xmlClass = nullptr;
367         napi_property_descriptor xmlDesc[] = {
368             DECLARE_NAPI_FUNCTION("setAttributes", SetAttributes),
369             DECLARE_NAPI_FUNCTION("addEmptyElement", AddEmptyElement),
370             DECLARE_NAPI_FUNCTION("setDeclaration", SetDeclaration),
371             DECLARE_NAPI_FUNCTION("startElement", StartElement),
372             DECLARE_NAPI_FUNCTION("endElement", EndElement),
373             DECLARE_NAPI_FUNCTION("setNamespace", SetNamespace),
374             DECLARE_NAPI_FUNCTION("setComment", SetComment),
375             DECLARE_NAPI_FUNCTION("setCDATA", SetCData),
376             DECLARE_NAPI_FUNCTION("setText", SetText),
377             DECLARE_NAPI_FUNCTION("setDocType", SetDocType),
378             DECLARE_NAPI_FUNCTION("XmlSerializerError", XmlSerializerError)
379         };
380         NAPI_CALL(env, napi_define_class(env, xmlSerializerClass, strlen(xmlSerializerClass), XmlSerializerConstructor,
381                                          nullptr, sizeof(xmlDesc) / sizeof(xmlDesc[0]), xmlDesc, &xmlClass));
382         napi_property_descriptor desc[] = {
383             DECLARE_NAPI_PROPERTY("XmlSerializer", xmlClass)
384         };
385         napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
386         return exports;
387     }
388 
XmlDynamicSerializerConstructor(napi_env env,napi_callback_info info)389     static napi_value XmlDynamicSerializerConstructor(napi_env env, napi_callback_info info)
390     {
391         napi_value thisVar = nullptr;
392         void *data = nullptr;
393         XmlDynamicSerializer *object = nullptr;
394         size_t argc = ARGC_ONE;
395         napi_value args[1] = { nullptr }; // 1:The number of parameters is 1
396         napi_status status = napi_get_cb_info(env, info, &argc, args, &thisVar, &data);
397         if (status != napi_ok) {
398             HILOG_ERROR("XmlDynamicSerializer:: napi_get_cb_info failed!");
399             return nullptr;
400         }
401         std::string encoding;
402         status = XmlDynamicSerializer::DealNapiStrValue(env, args[0], encoding);
403         if (status == napi_ok) {
404             object = new (std::nothrow) XmlDynamicSerializer(env, encoding);
405             if (object == nullptr) {
406                 HILOG_ERROR("XmlDynamicSerializerConstructor:: memory allocation failed, object is nullptr");
407                 return nullptr;
408             }
409         }
410         status = napi_wrap(env, thisVar, object,
411             [](napi_env environment, void *data, void *hint) {
412                 auto obj = reinterpret_cast<XmlDynamicSerializer*>(data);
413                 if (obj != nullptr) {
414                     delete obj;
415                     obj = nullptr;
416                 }
417             }, nullptr, nullptr);
418         if (status != napi_ok && object != nullptr) {
419             HILOG_ERROR("XmlDynamicSerializerConstructor::napi_wrap failed");
420             delete object;
421             object = nullptr;
422         }
423         return thisVar;
424     }
425 
SetAttributesDynamic(napi_env env,napi_callback_info info)426     static napi_value SetAttributesDynamic(napi_env env, napi_callback_info info)
427     {
428         napi_value thisVar = nullptr;
429         size_t argc = ARGC_TWO;
430         napi_value args[2] = { nullptr }; // 2:The number of parameters is 2
431         napi_status status = napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr);
432         if (status != napi_ok) {
433             HILOG_ERROR("XmlDynamicSerializer:: napi_get_cb_info failed!");
434             return nullptr;
435         }
436         XmlDynamicSerializer *object = nullptr;
437         status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object));
438         if (status != napi_ok || object == nullptr) {
439             HILOG_ERROR("XmlDynamicSerializer:: napi_unwrap failed!");
440             return nullptr;
441         }
442         std::string name;
443         std::string value;
444         status = XmlSerializer::DealNapiStrValue(env, args[0], name);
445         if (status != napi_ok) {
446             HILOG_ERROR("XmlDynamicSerializer:: get string from native failed!");
447             return nullptr;
448         }
449         status = XmlSerializer::DealNapiStrValue(env, args[1], value);
450         if (status != napi_ok) {
451             HILOG_ERROR("XmlDynamicSerializer:: get string from native failed!");
452             return nullptr;
453         }
454         object->SetAttributes(name, value);
455         return nullptr;
456     }
457 
AddEmptyElementDynamic(napi_env env,napi_callback_info info)458     static napi_value AddEmptyElementDynamic(napi_env env, napi_callback_info info)
459     {
460         napi_value thisVar = nullptr;
461         size_t argc = ARGC_ONE;
462         napi_value args[1] = { 0 }; // 1:The number of parameters is 1
463         napi_status status = napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr);
464         if (status != napi_ok) {
465             HILOG_ERROR("XmlDynamicSerializer:: napi_get_cb_info failed!");
466             return nullptr;
467         }
468         XmlDynamicSerializer *object = nullptr;
469         status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object));
470         if (status != napi_ok || object == nullptr) {
471             HILOG_ERROR("XmlDynamicSerializer:: napi_unwrap failed!");
472             return nullptr;
473         }
474         std::string name;
475         status = object->DealNapiStrValue(env, args[0], name);
476         if (status != napi_ok) {
477             HILOG_ERROR("XmlDynamicSerializer:: get string from native failed!");
478             return nullptr;
479         }
480         object->AddEmptyElement(name);
481         return nullptr;
482     }
483 
SetDeclarationDynamic(napi_env env,napi_callback_info info)484     static napi_value SetDeclarationDynamic(napi_env env, napi_callback_info info)
485     {
486         napi_value thisVar = nullptr;
487         napi_status status = napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
488         if (status != napi_ok) {
489             HILOG_ERROR("XmlDynamicSerializer:: napi_get_cb_info failed!");
490             return nullptr;
491         }
492         XmlDynamicSerializer *object = nullptr;
493         status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object));
494         if (status != napi_ok || object == nullptr) {
495             HILOG_ERROR("XmlDynamicSerializer:: napi_unwrap failed!");
496             return nullptr;
497         }
498         object->SetDeclaration();
499         return nullptr;
500     }
501 
StartElementDynamic(napi_env env,napi_callback_info info)502     static napi_value StartElementDynamic(napi_env env, napi_callback_info info)
503     {
504         size_t argc = ARGC_ONE;
505         napi_value args[1] = { nullptr }; // 1:The number of parameters is 1
506         napi_value thisVar = nullptr;
507         napi_status status = napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr);
508         if (status != napi_ok) {
509             HILOG_ERROR("XmlDynamicSerializer:: napi_get_cb_info failed!");
510             return nullptr;
511         }
512         XmlDynamicSerializer *object = nullptr;
513         status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object));
514         if (status != napi_ok || object == nullptr) {
515             HILOG_ERROR("XmlDynamicSerializer:: napi_unwrap failed!");
516             return nullptr;
517         }
518         std::string name;
519         status = object->DealNapiStrValue(env, args[0], name);
520         if (status != napi_ok) {
521             HILOG_ERROR("XmlDynamicSerializer:: get string from native failed!");
522             return nullptr;
523         }
524         object->StartElement(name);
525         return nullptr;
526     }
527 
EndElementDynamic(napi_env env,napi_callback_info info)528     static napi_value EndElementDynamic(napi_env env, napi_callback_info info)
529     {
530         napi_value thisVar = nullptr;
531         napi_status status = napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
532         if (status != napi_ok) {
533             HILOG_ERROR("XmlDynamicSerializer:: napi_get_cb_info failed!");
534             return nullptr;
535         }
536         XmlDynamicSerializer *object = nullptr;
537         status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object));
538         if (status != napi_ok || object == nullptr) {
539             HILOG_ERROR("XmlDynamicSerializer:: napi_unwrap failed!");
540             return nullptr;
541         }
542         object->EndElement();
543         return nullptr;
544     }
545 
SetNamespaceDynamic(napi_env env,napi_callback_info info)546     static napi_value SetNamespaceDynamic(napi_env env, napi_callback_info info)
547     {
548         napi_value thisVar = nullptr;
549         size_t argc = ARGC_TWO;
550         napi_value args[2] = { nullptr }; // 2:The number of parameters is 2
551         napi_status status = napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr);
552         if (status != napi_ok) {
553             HILOG_ERROR("XmlDynamicSerializer:: napi_get_cb_info failed!");
554             return nullptr;
555         }
556         XmlDynamicSerializer *object = nullptr;
557         status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object));
558         if (status != napi_ok || object == nullptr) {
559             HILOG_ERROR("XmlDynamicSerializer:: napi_unwrap failed!");
560             return nullptr;
561         }
562         std::string prefix;
563         std::string nsTemp;
564         status = XmlDynamicSerializer::DealNapiStrValue(env, args[0], prefix);
565         if (status != napi_ok) {
566             HILOG_ERROR("XmlDynamicSerializer:: get string from native failed!");
567             return nullptr;
568         }
569         status = XmlDynamicSerializer::DealNapiStrValue(env, args[1], nsTemp);
570         if (status != napi_ok) {
571             HILOG_ERROR("XmlDynamicSerializer:: get string from native failed!");
572             return nullptr;
573         }
574         object->SetNamespace(prefix, nsTemp);
575         return nullptr;
576     }
577 
SetCommentDynamic(napi_env env,napi_callback_info info)578     static napi_value SetCommentDynamic(napi_env env, napi_callback_info info)
579     {
580         napi_value thisVar = nullptr;
581         size_t argc = ARGC_ONE;
582         napi_value args[1] = { nullptr }; // 1:The number of parameters is 1
583         napi_status status = napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr);
584         if (status != napi_ok) {
585             HILOG_ERROR("XmlDynamicSerializer:: napi_get_cb_info failed!");
586             return nullptr;
587         }
588         XmlDynamicSerializer *object = nullptr;
589         status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object));
590         if (status != napi_ok || object == nullptr) {
591             HILOG_ERROR("XmlDynamicSerializer:: napi_unwrap failed!");
592             return nullptr;
593         }
594         std::string comment;
595         status = object->DealNapiStrValue(env, args[0], comment);
596         if (status != napi_ok) {
597             HILOG_ERROR("XmlDynamicSerializer:: get string from native failed!");
598             return nullptr;
599         }
600         object->SetComment(comment);
601         return nullptr;
602     }
603 
SetCDataDynamic(napi_env env,napi_callback_info info)604     static napi_value SetCDataDynamic(napi_env env, napi_callback_info info)
605     {
606         napi_value thisVar = nullptr;
607         size_t argc = ARGC_ONE;
608         napi_value args[1] = { nullptr }; // 1:The number of parameters is 1
609         napi_status status = napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr);
610         if (status != napi_ok) {
611             HILOG_ERROR("XmlDynamicSerializer:: napi_get_cb_info failed!");
612             return nullptr;
613         }
614         XmlDynamicSerializer *object = nullptr;
615         status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object));
616         if (status != napi_ok || object == nullptr) {
617             HILOG_ERROR("XmlDynamicSerializer:: napi_unwrap failed!");
618             return nullptr;
619         }
620         std::string data;
621         status = XmlDynamicSerializer::DealNapiStrValue(env, args[0], data);
622         if (status != napi_ok) {
623             HILOG_ERROR("XmlDynamicSerializer:: get string from native failed!");
624             return nullptr;
625         }
626         object->SetCData(data);
627         return nullptr;
628     }
629 
SetTextDynamic(napi_env env,napi_callback_info info)630     static napi_value SetTextDynamic(napi_env env, napi_callback_info info)
631     {
632         napi_value thisVar = nullptr;
633         size_t argc = ARGC_ONE;
634         napi_value args[1] = { nullptr }; // 1:The number of parameters is 1
635         napi_status status = napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr);
636         if (status != napi_ok) {
637             HILOG_ERROR("XmlDynamicSerializer:: napi_get_cb_info failed!");
638             return nullptr;
639         }
640         XmlDynamicSerializer *object = nullptr;
641         status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object));
642         if (status != napi_ok || object == nullptr) {
643             HILOG_ERROR("XmlDynamicSerializer:: napi_unwrap failed!");
644             return nullptr;
645         }
646         std::string text;
647         status = XmlDynamicSerializer::DealNapiStrValue(env, args[0], text);
648         if (status != napi_ok) {
649             HILOG_ERROR("XmlDynamicSerializer:: get string from native failed!");
650             return nullptr;
651         }
652         object->SetText(text);
653         return nullptr;
654     }
655 
SetDocTypeDynamic(napi_env env,napi_callback_info info)656     static napi_value SetDocTypeDynamic(napi_env env, napi_callback_info info)
657     {
658         napi_value thisVar = nullptr;
659         size_t argc = ARGC_ONE;
660         napi_value args[1] = { nullptr }; // 1:The number of parameters is 1
661         napi_status status = napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr);
662         if (status != napi_ok) {
663             HILOG_ERROR("XmlDynamicSerializer:: napi_get_cb_info failed!");
664             return nullptr;
665         }
666         XmlDynamicSerializer *object = nullptr;
667         status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object));
668         if (status != napi_ok || object == nullptr) {
669             HILOG_ERROR("XmlDynamicSerializer:: napi_unwrap failed!");
670             return nullptr;
671         }
672         std::string text;
673         status = XmlDynamicSerializer::DealNapiStrValue(env, args[0], text);
674         if (status != napi_ok) {
675             HILOG_ERROR("XmlDynamicSerializer:: get string from native failed!");
676             return nullptr;
677         }
678         object->SetDocType(text);
679         return nullptr;
680     }
681 
GetOutput(napi_env env,napi_callback_info info)682     static napi_value GetOutput(napi_env env, napi_callback_info info)
683     {
684         napi_value thisVar = nullptr;
685         napi_status status = napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
686         if (status != napi_ok) {
687             HILOG_ERROR("XmlDynamicSerializer:: napi_get_cb_info failed!");
688             return nullptr;
689         }
690         XmlDynamicSerializer *object = nullptr;
691         status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object));
692         if (status != napi_ok || object == nullptr) {
693             HILOG_ERROR("XmlDynamicSerializer:: napi_unwrap failed!");
694             return nullptr;
695         }
696         napi_value arrBuffer = nullptr;
697         void* arrBufferPtr = nullptr;
698         size_t arrBufferSize = object->GetXmlBufferLength();
699         status = napi_create_arraybuffer(env, arrBufferSize, &arrBufferPtr, &arrBuffer);
700         if (status != napi_ok) {
701             HILOG_ERROR("XmlDynamicSerializer:: create arraybuffer failed!");
702             return nullptr;
703         }
704         if (arrBufferSize == 0) {
705             return arrBuffer;
706         }
707         bool result = object->GetXmlBuffer(arrBufferPtr, arrBufferSize);
708         if (!result) {
709             return nullptr;
710         }
711         return arrBuffer;
712     }
713 
XmlDynamicSerializerInit(napi_env env,napi_value exports)714     napi_value XmlDynamicSerializerInit(napi_env env, napi_value exports)
715     {
716         const char *xmlSerializerClass = "XmlDynamicSerializer";
717         napi_value xmlClass = nullptr;
718         napi_property_descriptor xmlDesc[] = {
719             DECLARE_NAPI_FUNCTION("setAttributes", SetAttributesDynamic),
720             DECLARE_NAPI_FUNCTION("addEmptyElement", AddEmptyElementDynamic),
721             DECLARE_NAPI_FUNCTION("setDeclaration", SetDeclarationDynamic),
722             DECLARE_NAPI_FUNCTION("startElement", StartElementDynamic),
723             DECLARE_NAPI_FUNCTION("endElement", EndElementDynamic),
724             DECLARE_NAPI_FUNCTION("setNamespace", SetNamespaceDynamic),
725             DECLARE_NAPI_FUNCTION("setComment", SetCommentDynamic),
726             DECLARE_NAPI_FUNCTION("setCDATA", SetCDataDynamic),
727             DECLARE_NAPI_FUNCTION("setText", SetTextDynamic),
728             DECLARE_NAPI_FUNCTION("setDocType", SetDocTypeDynamic),
729             DECLARE_NAPI_FUNCTION("getOutput", GetOutput)
730         };
731         napi_status status = napi_define_class(env, xmlSerializerClass, strlen(xmlSerializerClass),
732                                                XmlDynamicSerializerConstructor, nullptr,
733                                                sizeof(xmlDesc) / sizeof(xmlDesc[0]), xmlDesc, &xmlClass);
734         if (status != napi_ok) {
735             HILOG_ERROR("XmlDynamicSerializer:: XmlDynamicSerializer init failed!");
736             return nullptr;
737         }
738         napi_property_descriptor desc[] = {
739             DECLARE_NAPI_PROPERTY("XmlDynamicSerializer", xmlClass)
740         };
741         napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
742         return exports;
743     }
744 
Parse(napi_env env,napi_callback_info info)745     static napi_value Parse(napi_env env, napi_callback_info info)
746     {
747         napi_value thisVar = nullptr;
748         size_t argc = 1;
749         napi_value args[1] = { nullptr };
750         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr));
751         NAPI_ASSERT(env, argc == 1, "Wrong number of arguments, one expected.");
752         napi_valuetype valuetype;
753         NAPI_CALL(env, napi_typeof(env, args[0], &valuetype));
754         NAPI_ASSERT(env, valuetype == napi_object, "Wrong argument type: object expected.");
755         XmlPullParser *object = nullptr;
756         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object)));
757         object->DealOptionInfo(env, args[0]);
758         object->Parse(env, thisVar, true);
759         napi_value result = nullptr;
760         NAPI_CALL(env, napi_get_undefined(env, &result));
761         return result;
762     }
763 
ParseXml(napi_env env,napi_callback_info info)764     static napi_value ParseXml(napi_env env, napi_callback_info info)
765     {
766         napi_value thisVar = nullptr;
767         size_t argc = 1;
768         napi_value args[1] = { nullptr };
769         napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr);
770         XmlPullParser *xmlPullParser = nullptr;
771         napi_unwrap(env, thisVar, reinterpret_cast<void**>(&xmlPullParser));
772         napi_value result = nullptr;
773         if (xmlPullParser == nullptr) {
774             ErrorHelper::ThrowError(env, ERROR_CODE, "Parameter error. Parameter verification failed.");
775             napi_get_boolean(env, false, &result);
776             return result;
777         }
778         xmlPullParser->DealOptionInfo(env, args[0]);
779         xmlPullParser->Parse(env, thisVar, false);
780         std::string errStr = xmlPullParser->XmlPullParserError();
781         napi_get_boolean(env, !errStr.empty(), &result);
782         return result;
783     }
784 
XmlPullParserError(napi_env env,napi_callback_info info)785     static napi_value XmlPullParserError(napi_env env, napi_callback_info info)
786     {
787         napi_value thisVar = nullptr;
788         napi_value result = nullptr;
789         NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
790         XmlPullParser *object = nullptr;
791         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object)));
792         std::string temp = object->XmlPullParserError();
793         size_t templen = temp.size();
794         NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), templen, &result));
795         return result;
796     }
797 
XmlPullParserInit(napi_env env,napi_value exports)798     napi_value XmlPullParserInit(napi_env env, napi_value exports)
799     {
800         const char *xmlPullParserClass = "XmlPullParser";
801         napi_value xmlClass = nullptr;
802         napi_property_descriptor xmlDesc[] = {
803             DECLARE_NAPI_FUNCTION("parse", Parse),
804             DECLARE_NAPI_FUNCTION("parseXml", ParseXml),
805             DECLARE_NAPI_FUNCTION("XmlPullParserError", XmlPullParserError)
806         };
807         NAPI_CALL(env, napi_define_class(env, xmlPullParserClass, strlen(xmlPullParserClass),
808             XmlPullParserConstructor, nullptr, sizeof(xmlDesc) / sizeof(xmlDesc[0]),
809             xmlDesc, &xmlClass));
810         napi_property_descriptor desc[] = {
811             DECLARE_NAPI_PROPERTY("XmlPullParser", xmlClass)
812         };
813         napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
814         return exports;
815     };
816 
Init(napi_env env,napi_value exports)817     static napi_value Init(napi_env env, napi_value exports)
818     {
819         XmlSerializerInit(env, exports);
820         XmlPullParserInit(env, exports);
821         XmlDynamicSerializerInit(env, exports);
822         return exports;
823     }
824 
825     extern "C"
NAPI_xml_GetJSCode(const char ** buf,int * bufLen)826     __attribute__((visibility("default"))) void NAPI_xml_GetJSCode(const char **buf, int *bufLen)
827     {
828         if (buf != nullptr) {
829             *buf = _binary_js_xml_js_start;
830         }
831 
832         if (bufLen != nullptr) {
833             *bufLen = _binary_js_xml_js_end - _binary_js_xml_js_start;
834         }
835     }
836     extern "C"
NAPI_xml_GetABCCode(const char ** buf,int * buflen)837     __attribute__((visibility("default"))) void NAPI_xml_GetABCCode(const char** buf, int* buflen)
838     {
839         if (buf != nullptr) {
840             *buf = _binary_xml_abc_start;
841         }
842         if (buflen != nullptr) {
843             *buflen = _binary_xml_abc_end - _binary_xml_abc_start;
844         }
845     }
846 
847 
848     static napi_module_with_js xmlModule = {
849         .nm_version = 1,
850         .nm_flags = 0,
851         .nm_filename = nullptr,
852         .nm_register_func = Init,
853         .nm_modname = "xml",
854         .nm_priv = reinterpret_cast<void*>(0),
855         .nm_get_abc_code = NAPI_xml_GetABCCode,
856         .nm_get_js_code = NAPI_xml_GetJSCode,
857     };
XmlRegisterModule()858     extern "C" __attribute__((constructor)) void XmlRegisterModule()
859     {
860         napi_module_with_js_register(&xmlModule);
861     }
862 } // namespace OHOS::Xml
863