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 19 extern const char _binary_js_xml_js_start[]; 20 extern const char _binary_js_xml_js_end[]; 21 extern const char _binary_xml_abc_start[]; 22 extern const char _binary_xml_abc_end[]; 23 24 namespace OHOS::xml { XmlSerializerConstructor(napi_env env,napi_callback_info info)25 static napi_value XmlSerializerConstructor(napi_env env, napi_callback_info info) 26 { 27 napi_value thisVar = nullptr; 28 void *data = nullptr; 29 size_t argc = 0; 30 napi_value args[2] = { 0 }; // 2:The number of parameters is 2 31 XmlSerializer *object = nullptr; 32 size_t iLength = 0; 33 size_t offPos = 0; 34 napi_value arraybuffer = nullptr; 35 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, &data)); 36 NAPI_ASSERT(env, argc == 1 || argc == 2, "Wrong number of arguments"); // 2: number of args 37 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, &data)); 38 if (args[0] == nullptr) { 39 NAPI_CALL(env, napi_throw_error(env, "", "parameter is empty")); 40 return nullptr; 41 } else { 42 bool bFlag = false; 43 napi_is_arraybuffer(env, args[0], &bFlag); 44 if (bFlag) { 45 napi_get_arraybuffer_info(env, args[0], &data, &iLength); 46 } 47 napi_is_dataview(env, args[0], &bFlag); 48 if (bFlag) { 49 napi_get_dataview_info(env, args[0], &iLength, &data, &arraybuffer, &offPos); 50 } 51 } 52 if (argc == 1) { 53 object = new XmlSerializer(reinterpret_cast<char*>(data), iLength); 54 } else if (argc == 2) { // 2:When the input parameter is set to 2 55 std::string encoding = ""; 56 napi_valuetype valuetype; 57 NAPI_CALL(env, napi_typeof(env, args[1], &valuetype)); 58 NAPI_ASSERT(env, valuetype == napi_string, "Wrong argument typr. String expected."); 59 napi_status status = napi_ok; 60 status = XmlSerializer::DealNapiStrValue(env, args[1], encoding); 61 if (status == napi_ok) { 62 object = new XmlSerializer(reinterpret_cast<char*>(data), iLength, encoding); 63 } 64 } 65 napi_wrap( 66 env, thisVar, object, 67 [](napi_env environment, void *data, void *hint) { 68 auto obj = reinterpret_cast<XmlSerializer*>(data); 69 if (obj != nullptr) { 70 delete obj; 71 } 72 }, 73 nullptr, nullptr); 74 return thisVar; 75 } 76 XmlPullParserConstructor(napi_env env,napi_callback_info info)77 static napi_value XmlPullParserConstructor(napi_env env, napi_callback_info info) 78 { 79 napi_value thisVar = nullptr; 80 void *data = nullptr; 81 size_t argc = 0; 82 napi_value args[2] = { 0 }; // 2:two args 83 XmlPullParser *object = nullptr; 84 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, &data)); 85 NAPI_ASSERT(env, argc == 1 || argc == 2, "Wrong number of arguments"); // 2:two args 86 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, &data)); 87 napi_valuetype valuetype = napi_null; 88 NAPI_CALL(env, napi_typeof(env, args[0], &valuetype)); 89 NAPI_ASSERT(env, valuetype == napi_object, "Wrong argument typr. Object(DataView or ArrayBuffer) expected."); 90 bool bFlag = false; 91 size_t len = 0; 92 size_t offPos = 0; 93 napi_value arraybuffer = nullptr; 94 NAPI_ASSERT(env, args[0] != nullptr, "Wrong argument value. (not nullptr expected)."); 95 napi_is_arraybuffer(env, args[0], &bFlag); 96 if (bFlag) { 97 napi_get_arraybuffer_info(env, args[0], &data, &len); 98 } 99 napi_is_dataview(env, args[0], &bFlag); 100 if (bFlag) { 101 napi_get_dataview_info(env, args[0], &len, &data, &arraybuffer, &offPos); 102 } 103 if (data) { 104 std::string strEnd(reinterpret_cast<char*>(data), len); 105 strEnd = strEnd.substr(0, std::strlen(strEnd.c_str())); 106 std::string cleanStr; 107 for (char c : strEnd) { 108 if (c != '\r' && c != '\n') { 109 cleanStr += c; 110 } 111 } 112 if (argc == 1) { 113 object = new XmlPullParser(cleanStr, "utf-8"); 114 } else if (argc == 2) { // 2:When the input parameter is set to 2 115 NAPI_CALL(env, napi_typeof(env, args[1], &valuetype)); 116 NAPI_ASSERT(env, valuetype == napi_string, "Wrong argument typr. String expected."); 117 std::string strEncoding = ""; 118 XmlSerializer::DealNapiStrValue(env, args[1], strEncoding); 119 object = new XmlPullParser(cleanStr, strEncoding); 120 } 121 } 122 napi_wrap( 123 env, thisVar, object, 124 [](napi_env env, void *data, void *hint) { 125 auto obj = reinterpret_cast<XmlPullParser*>(data); 126 if (obj != nullptr) { 127 delete obj; 128 } 129 }, 130 nullptr, nullptr); 131 return thisVar; 132 } 133 SetAttributes(napi_env env,napi_callback_info info)134 static napi_value SetAttributes(napi_env env, napi_callback_info info) 135 { 136 napi_value thisVar = nullptr; 137 size_t argc = 0; 138 napi_value args[2] = { 0 }; // 2:two args 139 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr)); 140 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr)); 141 NAPI_ASSERT(env, argc == 2, "Wrong number of arguments"); // 2: number of args 142 napi_valuetype valuetype = napi_null; 143 NAPI_ASSERT(env, args[0] != nullptr, "Parameter is empty."); 144 NAPI_ASSERT(env, args[1] != nullptr, "Parameter is empty."); 145 NAPI_CALL(env, napi_typeof(env, args[0], &valuetype)); 146 NAPI_ASSERT(env, valuetype == napi_string, "Wrong argument typr. Object expected."); 147 NAPI_CALL(env, napi_typeof(env, args[1], &valuetype)); 148 NAPI_ASSERT(env, valuetype == napi_string, "Wrong argument typr. Object expected."); 149 XmlSerializer *object = nullptr; 150 NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object))); 151 std::string name; 152 std::string value; 153 XmlSerializer::DealNapiStrValue(env, args[0], name); 154 XmlSerializer::DealNapiStrValue(env, args[1], value); 155 object->SetAttributes(name, value); 156 napi_value result = nullptr; 157 NAPI_CALL(env, napi_get_undefined(env, &result)); 158 return result; 159 } 160 AddEmptyElement(napi_env env,napi_callback_info info)161 static napi_value AddEmptyElement(napi_env env, napi_callback_info info) 162 { 163 napi_value thisVar = nullptr; 164 size_t argc = 1; 165 napi_value args[1] = { 0 }; 166 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr)); 167 NAPI_ASSERT(env, argc == 1, "Wrong number of arguments(Over)"); 168 if (args[0] == nullptr) { 169 NAPI_CALL(env, napi_throw_error(env, "", "parameter is empty")); 170 return nullptr; 171 } else { 172 napi_valuetype valuetype; 173 NAPI_CALL(env, napi_typeof(env, args[0], &valuetype)); 174 NAPI_ASSERT(env, valuetype == napi_string, "Wrong argument typr. String expected."); 175 XmlSerializer *object = nullptr; 176 NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object))); 177 std::string name; 178 object->DealNapiStrValue(env, args[0], name); 179 object->AddEmptyElement(name); 180 } 181 napi_value result = nullptr; 182 NAPI_CALL(env, napi_get_undefined(env, &result)); 183 return result; 184 } 185 SetDeclaration(napi_env env,napi_callback_info info)186 static napi_value SetDeclaration(napi_env env, napi_callback_info info) 187 { 188 napi_value thisVar = nullptr; 189 NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr)); 190 XmlSerializer *object = nullptr; 191 NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object))); 192 object->SetDeclaration(); 193 napi_value result = nullptr; 194 NAPI_CALL(env, napi_get_undefined(env, &result)); 195 return result; 196 } 197 StartElement(napi_env env,napi_callback_info info)198 static napi_value StartElement(napi_env env, napi_callback_info info) 199 { 200 size_t argc = 1; 201 napi_value args[1] = { 0 }; 202 napi_value thisVar = nullptr; 203 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr)); 204 NAPI_ASSERT(env, argc == 1, "Wrong number of arguments"); 205 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr)); 206 NAPI_ASSERT(env, args[0] != nullptr, "Parameter is empty."); 207 XmlSerializer *object = nullptr; 208 NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object))); 209 std::string name; 210 object->DealNapiStrValue(env, args[0], name); 211 object->StartElement(name); 212 napi_value result = nullptr; 213 NAPI_CALL(env, napi_get_undefined(env, &result)); 214 return result; 215 } 216 EndElement(napi_env env,napi_callback_info info)217 static napi_value EndElement(napi_env env, napi_callback_info info) 218 { 219 napi_value thisVar = nullptr; 220 NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr)); 221 XmlSerializer *object = nullptr; 222 NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object))); 223 object->EndElement(); 224 napi_value result = nullptr; 225 NAPI_CALL(env, napi_get_undefined(env, &result)); 226 return result; 227 } 228 SetNamespace(napi_env env,napi_callback_info info)229 static napi_value SetNamespace(napi_env env, napi_callback_info info) 230 { 231 napi_value thisVar = nullptr; 232 size_t argc = 0; 233 napi_value args[2] = { 0 }; // 2:two args 234 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr)); 235 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr)); 236 NAPI_ASSERT(env, argc == 2, "Wrong number of arguments"); // 2:two args 237 napi_valuetype valuetype = napi_null; 238 NAPI_ASSERT(env, args[0] != nullptr, "Parameter is empty."); 239 NAPI_ASSERT(env, args[1] != nullptr, "Parameter is empty."); 240 NAPI_CALL(env, napi_typeof(env, args[0], &valuetype)); 241 NAPI_ASSERT(env, valuetype == napi_string, "Wrong argument typr. Object expected."); 242 NAPI_CALL(env, napi_typeof(env, args[1], &valuetype)); 243 NAPI_ASSERT(env, valuetype == napi_string, "Wrong argument typr. Object expected."); 244 XmlSerializer *object = nullptr; 245 NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object))); 246 std::string prefix; 247 std::string nsTemp; 248 XmlSerializer::DealNapiStrValue(env, args[0], prefix); 249 XmlSerializer::DealNapiStrValue(env, args[1], nsTemp); 250 object->SetNamespace(prefix, nsTemp); 251 napi_value result = nullptr; 252 NAPI_CALL(env, napi_get_undefined(env, &result)); 253 return result; 254 } 255 SetComment(napi_env env,napi_callback_info info)256 static napi_value SetComment(napi_env env, napi_callback_info info) 257 { 258 napi_value thisVar = nullptr; 259 size_t argc = 0; 260 napi_value args[1] = { 0 }; 261 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr)); 262 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr)); 263 NAPI_ASSERT(env, argc == 1, "Wrong number of arguments"); 264 napi_valuetype valuetype = napi_null; 265 NAPI_ASSERT(env, args[0] != nullptr, "Parameter is empty)."); 266 NAPI_CALL(env, napi_typeof(env, args[0], &valuetype)); 267 NAPI_ASSERT(env, valuetype == napi_string, "Wrong argument typr. String expected"); 268 XmlSerializer *object = nullptr; 269 NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object))); 270 std::string comment; 271 object->DealNapiStrValue(env, args[0], comment); 272 object->SetComment(comment); 273 napi_value result = nullptr; 274 NAPI_CALL(env, napi_get_undefined(env, &result)); 275 return result; 276 } 277 SetCData(napi_env env,napi_callback_info info)278 static napi_value SetCData(napi_env env, napi_callback_info info) 279 { 280 napi_value thisVar = nullptr; 281 size_t argc = 0; 282 napi_value args[1] = { 0 }; 283 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr)); 284 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr)); 285 NAPI_ASSERT(env, argc == 1, "Wrong number of arguments"); 286 napi_valuetype valuetype = napi_null; 287 NAPI_ASSERT(env, args[0] != nullptr, "Parameter is empty)."); 288 NAPI_CALL(env, napi_typeof(env, args[0], &valuetype)); 289 NAPI_ASSERT(env, valuetype == napi_string, "Wrong argument typr. String expected"); 290 XmlSerializer *object = nullptr; 291 NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object))); 292 std::string data; 293 XmlSerializer::DealNapiStrValue(env, args[0], data); 294 object->SetCData(data); 295 napi_value result = nullptr; 296 NAPI_CALL(env, napi_get_undefined(env, &result)); 297 return result; 298 } 299 SetText(napi_env env,napi_callback_info info)300 static napi_value SetText(napi_env env, napi_callback_info info) 301 { 302 napi_value thisVar = nullptr; 303 size_t argc = 0; 304 napi_value args[1] = { 0 }; 305 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr)); 306 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr)); 307 NAPI_ASSERT(env, argc == 1, "Wrong number of arguments"); 308 napi_valuetype valuetype = napi_null; 309 NAPI_ASSERT(env, args[0] != nullptr, "Parameter is empty)."); 310 NAPI_CALL(env, napi_typeof(env, args[0], &valuetype)); 311 NAPI_ASSERT(env, valuetype == napi_string, "Wrong argument typr. String expected."); 312 XmlSerializer *object = nullptr; 313 NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object))); 314 std::string text; 315 XmlSerializer::DealNapiStrValue(env, args[0], text); 316 object->SetText(text); 317 napi_value result = nullptr; 318 NAPI_CALL(env, napi_get_undefined(env, &result)); 319 return result; 320 } 321 SetDocType(napi_env env,napi_callback_info info)322 static napi_value SetDocType(napi_env env, napi_callback_info info) 323 { 324 napi_value thisVar = nullptr; 325 size_t argc = 0; 326 napi_value args[1] = { 0 }; 327 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr)); 328 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr)); 329 NAPI_ASSERT(env, argc == 1, "Wrong number of arguments"); 330 napi_valuetype valuetype = napi_null; 331 NAPI_ASSERT(env, args[0] != nullptr, "Parameter is empty)."); 332 NAPI_CALL(env, napi_typeof(env, args[0], &valuetype)); 333 NAPI_ASSERT(env, valuetype == napi_string, "Wrong argument typr. String expected."); 334 XmlSerializer *object = nullptr; 335 NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object))); 336 std::string text; 337 XmlSerializer::DealNapiStrValue(env, args[0], text); 338 object->SetDocType(text); 339 napi_value result = nullptr; 340 NAPI_CALL(env, napi_get_undefined(env, &result)); 341 return result; 342 } XmlSerializerError(napi_env env,napi_callback_info info)343 static napi_value XmlSerializerError(napi_env env, napi_callback_info info) 344 { 345 napi_value thisVar = nullptr; 346 napi_value result = nullptr; 347 NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr)); 348 XmlSerializer *object = nullptr; 349 NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object))); 350 std::string temp = object->XmlSerializerError(); 351 size_t templen = temp.size(); 352 NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), templen, &result)); 353 return result; 354 } 355 XmlSerializerInit(napi_env env,napi_value exports)356 napi_value XmlSerializerInit(napi_env env, napi_value exports) 357 { 358 const char *xmlSerializerClass = "XmlSerializer"; 359 napi_value xmlClass = nullptr; 360 napi_property_descriptor xmlDesc[] = { 361 DECLARE_NAPI_FUNCTION("setAttributes", SetAttributes), 362 DECLARE_NAPI_FUNCTION("addEmptyElement", AddEmptyElement), 363 DECLARE_NAPI_FUNCTION("setDeclaration", SetDeclaration), 364 DECLARE_NAPI_FUNCTION("startElement", StartElement), 365 DECLARE_NAPI_FUNCTION("endElement", EndElement), 366 DECLARE_NAPI_FUNCTION("setNamespace", SetNamespace), 367 DECLARE_NAPI_FUNCTION("setComment", SetComment), 368 DECLARE_NAPI_FUNCTION("setCDATA", SetCData), 369 DECLARE_NAPI_FUNCTION("setText", SetText), 370 DECLARE_NAPI_FUNCTION("setDocType", SetDocType), 371 DECLARE_NAPI_FUNCTION("XmlSerializerError", XmlSerializerError) 372 }; 373 NAPI_CALL(env, napi_define_class(env, xmlSerializerClass, strlen(xmlSerializerClass), XmlSerializerConstructor, 374 nullptr, sizeof(xmlDesc) / sizeof(xmlDesc[0]), xmlDesc, &xmlClass)); 375 napi_property_descriptor desc[] = { 376 DECLARE_NAPI_PROPERTY("XmlSerializer", xmlClass) 377 }; 378 napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); 379 return exports; 380 } 381 Parse(napi_env env,napi_callback_info info)382 static napi_value Parse(napi_env env, napi_callback_info info) 383 { 384 napi_value thisVar = nullptr; 385 size_t argc = 0; 386 napi_value args[1] = { 0 }; 387 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr)); 388 NAPI_ASSERT(env, argc == 1, "Wrong number of arguments, one expected."); 389 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr)); 390 NAPI_ASSERT(env, args[0] != nullptr, "Parameter is empty."); 391 napi_valuetype valuetype; 392 NAPI_CALL(env, napi_typeof(env, args[0], &valuetype)); 393 NAPI_ASSERT(env, valuetype == napi_object, "Wrong argument typr. Object expected."); 394 XmlPullParser *object = nullptr; 395 NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object))); 396 object->DealOptionInfo(env, args[0]); 397 object->Parse(env, thisVar); 398 napi_value result = nullptr; 399 NAPI_CALL(env, napi_get_undefined(env, &result)); 400 return result; 401 } 402 XmlPullParserError(napi_env env,napi_callback_info info)403 static napi_value XmlPullParserError(napi_env env, napi_callback_info info) 404 { 405 napi_value thisVar = nullptr; 406 napi_value result = nullptr; 407 NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr)); 408 XmlPullParser *object = nullptr; 409 NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object))); 410 std::string temp = object->XmlPullParserError(); 411 size_t templen = temp.size(); 412 NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), templen, &result)); 413 return result; 414 } 415 XmlPullParserInit(napi_env env,napi_value exports)416 napi_value XmlPullParserInit(napi_env env, napi_value exports) 417 { 418 const char *xmlPullParserClass = "XmlPullParser"; 419 napi_value xmlClass = nullptr; 420 napi_property_descriptor xmlDesc[] = { 421 DECLARE_NAPI_FUNCTION("parse", Parse), 422 DECLARE_NAPI_FUNCTION("XmlPullParserError", XmlPullParserError) 423 }; 424 NAPI_CALL(env, napi_define_class(env, xmlPullParserClass, strlen(xmlPullParserClass), 425 XmlPullParserConstructor, nullptr, sizeof(xmlDesc) / sizeof(xmlDesc[0]), 426 xmlDesc, &xmlClass)); 427 napi_property_descriptor desc[] = { 428 DECLARE_NAPI_PROPERTY("XmlPullParser", xmlClass) 429 }; 430 napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); 431 return exports; 432 }; 433 Init(napi_env env,napi_value exports)434 static napi_value Init(napi_env env, napi_value exports) 435 { 436 XmlSerializerInit(env, exports); 437 XmlPullParserInit(env, exports); 438 return exports; 439 } 440 441 extern "C" NAPI_xml_GetJSCode(const char ** buf,int * bufLen)442 __attribute__((visibility("default"))) void NAPI_xml_GetJSCode(const char **buf, int *bufLen) 443 { 444 if (buf != nullptr) { 445 *buf = _binary_js_xml_js_start; 446 } 447 448 if (bufLen != nullptr) { 449 *bufLen = _binary_js_xml_js_end - _binary_js_xml_js_start; 450 } 451 } 452 extern "C" NAPI_xml_GetABCCode(const char ** buf,int * buflen)453 __attribute__((visibility("default"))) void NAPI_xml_GetABCCode(const char** buf, int* buflen) 454 { 455 if (buf != nullptr) { 456 *buf = _binary_xml_abc_start; 457 } 458 if (buflen != nullptr) { 459 *buflen = _binary_xml_abc_end - _binary_xml_abc_start; 460 } 461 } 462 463 464 static napi_module_with_js xmlModule = { 465 .nm_version = 1, 466 .nm_flags = 0, 467 .nm_filename = nullptr, 468 .nm_register_func = Init, 469 .nm_modname = "xml", 470 .nm_priv = reinterpret_cast<void*>(0), 471 .nm_get_abc_code = NAPI_xml_GetABCCode, 472 .nm_get_js_code = NAPI_xml_GetJSCode, 473 }; XmlRegisterModule()474 extern "C" __attribute__((constructor)) void XmlRegisterModule() 475 { 476 napi_module_with_js_register(&xmlModule); 477 } 478 } // namespace OHOS::Xml 479