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