14d6c458bSopenharmony_ci /* 24d6c458bSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 34d6c458bSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 44d6c458bSopenharmony_ci * you may not use this file except in compliance with the License. 54d6c458bSopenharmony_ci * You may obtain a copy of the License at 64d6c458bSopenharmony_ci * 74d6c458bSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 84d6c458bSopenharmony_ci * 94d6c458bSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 104d6c458bSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 114d6c458bSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 124d6c458bSopenharmony_ci * See the License for the specific language governing permissions and 134d6c458bSopenharmony_ci * limitations under the License. 144d6c458bSopenharmony_ci */ 154d6c458bSopenharmony_ci 164d6c458bSopenharmony_ci#ifndef CONVERTXML_JS_CONVERTXML_H 174d6c458bSopenharmony_ci#define CONVERTXML_JS_CONVERTXML_H 184d6c458bSopenharmony_ci 194d6c458bSopenharmony_ci#include <string> 204d6c458bSopenharmony_ci#include <vector> 214d6c458bSopenharmony_ci#include "libxml/parser.h" 224d6c458bSopenharmony_ci#include "libxml/tree.h" 234d6c458bSopenharmony_ci#include "napi/native_api.h" 244d6c458bSopenharmony_ci#include "napi/native_node_api.h" 254d6c458bSopenharmony_ci#include "native_engine/native_engine.h" 264d6c458bSopenharmony_ci 274d6c458bSopenharmony_cinamespace OHOS::Xml { 284d6c458bSopenharmony_ci enum class SpaceType { 294d6c458bSopenharmony_ci T_INT32, 304d6c458bSopenharmony_ci T_STRING, 314d6c458bSopenharmony_ci T_INIT = -1 324d6c458bSopenharmony_ci }; 334d6c458bSopenharmony_ci 344d6c458bSopenharmony_ci struct Options { 354d6c458bSopenharmony_ci std::string declaration = "_declaration"; 364d6c458bSopenharmony_ci std::string instruction = "_instruction"; 374d6c458bSopenharmony_ci std::string attributes = "_attributes"; 384d6c458bSopenharmony_ci std::string text = "_text"; 394d6c458bSopenharmony_ci std::string cdata = "_cdata"; 404d6c458bSopenharmony_ci std::string doctype = "_doctype"; 414d6c458bSopenharmony_ci std::string comment = "_comment"; 424d6c458bSopenharmony_ci std::string parent = "_parent"; 434d6c458bSopenharmony_ci std::string type = "_type"; 444d6c458bSopenharmony_ci std::string name = "_name"; 454d6c458bSopenharmony_ci std::string elements = "_elements"; 464d6c458bSopenharmony_ci bool compact = false; 474d6c458bSopenharmony_ci bool trim = false; 484d6c458bSopenharmony_ci bool nativetype = false; 494d6c458bSopenharmony_ci bool nativetypeattributes = false; 504d6c458bSopenharmony_ci bool addparent = false; 514d6c458bSopenharmony_ci bool alwaysArray = false; 524d6c458bSopenharmony_ci bool alwaysChildren = false; 534d6c458bSopenharmony_ci bool instructionHasAttributes = false; 544d6c458bSopenharmony_ci bool ignoreDeclaration = false; 554d6c458bSopenharmony_ci bool ignoreInstruction = false; 564d6c458bSopenharmony_ci bool ignoreAttributes = false; 574d6c458bSopenharmony_ci bool ignoreComment = false; 584d6c458bSopenharmony_ci bool ignoreCdata = false; 594d6c458bSopenharmony_ci bool ignoreDoctype = false; 604d6c458bSopenharmony_ci bool ignoreText = false; 614d6c458bSopenharmony_ci bool spaces = false; 624d6c458bSopenharmony_ci }; 634d6c458bSopenharmony_ci 644d6c458bSopenharmony_ci struct XmlInfo { 654d6c458bSopenharmony_ci bool bXml = false; 664d6c458bSopenharmony_ci bool bVersion = false; 674d6c458bSopenharmony_ci std::string strVersion = ""; 684d6c458bSopenharmony_ci bool bEncoding = false; 694d6c458bSopenharmony_ci std::string strEncoding = ""; 704d6c458bSopenharmony_ci }; 714d6c458bSopenharmony_ci 724d6c458bSopenharmony_ci class ConvertXml { 734d6c458bSopenharmony_ci struct APIVersion { 744d6c458bSopenharmony_ci const int32_t API13 = 13; 754d6c458bSopenharmony_ci }; 764d6c458bSopenharmony_ci public: 774d6c458bSopenharmony_ci /** 784d6c458bSopenharmony_ci * To convert XML text to JavaScript object. 794d6c458bSopenharmony_ci */ 804d6c458bSopenharmony_ci explicit ConvertXml(napi_env env) :env_(env) 814d6c458bSopenharmony_ci { 824d6c458bSopenharmony_ci NativeEngine* engine = reinterpret_cast<NativeEngine*>(env); 834d6c458bSopenharmony_ci if (engine != nullptr) { 844d6c458bSopenharmony_ci apiVersion_ = engine->GetApiVersion() % API_VERSION_MOD; 854d6c458bSopenharmony_ci } 864d6c458bSopenharmony_ci spaceType_ = SpaceType::T_INIT; 874d6c458bSopenharmony_ci strSpace_ = ""; 884d6c458bSopenharmony_ci iSpace_ = 0; 894d6c458bSopenharmony_ci apiFlag_ = apiVersion_ >= APIVerIsolation_.API13; 904d6c458bSopenharmony_ci }; 914d6c458bSopenharmony_ci 924d6c458bSopenharmony_ci /** 934d6c458bSopenharmony_ci * The destructor of the ConvertXml. 944d6c458bSopenharmony_ci */ 954d6c458bSopenharmony_ci virtual ~ConvertXml() {} 964d6c458bSopenharmony_ci 974d6c458bSopenharmony_ci /** 984d6c458bSopenharmony_ci * To convert XML text to JavaScript object. 994d6c458bSopenharmony_ci * 1004d6c458bSopenharmony_ci * @param env NAPI environment parameters. 1014d6c458bSopenharmony_ci * @param strXml A string of XML text. 1024d6c458bSopenharmony_ci */ 1034d6c458bSopenharmony_ci napi_value Convert(napi_env env, std::string strXml); 1044d6c458bSopenharmony_ci 1054d6c458bSopenharmony_ci /** 1064d6c458bSopenharmony_ci * Converts the string of js to string of C++. 1074d6c458bSopenharmony_ci * 1084d6c458bSopenharmony_ci * @param env NAPI environment parameters. 1094d6c458bSopenharmony_ci * @param napi_StrValue JS layer incoming stringing. 1104d6c458bSopenharmony_ci * @param result The C++ layer accepts stringing. 1114d6c458bSopenharmony_ci */ 1124d6c458bSopenharmony_ci napi_status DealNapiStrValue(napi_env env, const napi_value napi_StrValue, std::string &result) const; 1134d6c458bSopenharmony_ci 1144d6c458bSopenharmony_ci /** 1154d6c458bSopenharmony_ci * Handles user input of optional information 1164d6c458bSopenharmony_ci * 1174d6c458bSopenharmony_ci * @param env NAPI environment parameters. 1184d6c458bSopenharmony_ci * @param napiObj Get the option parameter from js to the napi layer 1194d6c458bSopenharmony_ci */ 1204d6c458bSopenharmony_ci void DealOptions(napi_env env, const napi_value napiObj); 1214d6c458bSopenharmony_ci 1224d6c458bSopenharmony_ci friend class CxmlTest; 1234d6c458bSopenharmony_ci 1244d6c458bSopenharmony_ci private: 1254d6c458bSopenharmony_ci void SetAttributes(napi_env env, xmlNodePtr curNode, const napi_value &elementsObject) const; 1264d6c458bSopenharmony_ci void SetXmlElementType(napi_env env, xmlNodePtr curNode, const napi_value &elementsObject, bool &bFlag) const; 1274d6c458bSopenharmony_ci void SetNodeInfo(napi_env env, xmlNodePtr curNode, const napi_value &elementsObject, 1284d6c458bSopenharmony_ci const std::string parentName = "") const; 1294d6c458bSopenharmony_ci void SetEndInfo(napi_env env, xmlNodePtr curNode, const napi_value &elementsObject, bool &bFlag) const; 1304d6c458bSopenharmony_ci void GetXMLInfo(napi_env env, xmlNodePtr curNode, const napi_value &object, int flag = 0, 1314d6c458bSopenharmony_ci const std::string parentName = ""); 1324d6c458bSopenharmony_ci std::string GetNodeType(const xmlElementType enumType) const; 1334d6c458bSopenharmony_ci void SetKeyValue(napi_env env, const napi_value &object, const std::string strKey, 1344d6c458bSopenharmony_ci const std::string strValue) const; 1354d6c458bSopenharmony_ci std::string Trim(std::string strXmltrim) const; 1364d6c458bSopenharmony_ci void GetPrevNodeList(napi_env env, xmlNodePtr curNode); 1374d6c458bSopenharmony_ci void DealSpaces(napi_env env, const napi_value napiObj); 1384d6c458bSopenharmony_ci void DealIgnore(napi_env env, const napi_value napiObj); 1394d6c458bSopenharmony_ci void SetPrevInfo(napi_env env, const napi_value &recvElement, int flag, int32_t &index1) const; 1404d6c458bSopenharmony_ci void SetDefaultKey(size_t i, const std::string strRecv); 1414d6c458bSopenharmony_ci void SetSpacesInfo(napi_env env, const napi_value &object) const; 1424d6c458bSopenharmony_ci void DealSingleLine(napi_env env, std::string &strXml, const napi_value &object); 1434d6c458bSopenharmony_ci void DealComplex(napi_env env, std::string &strXml, const napi_value &object) const; 1444d6c458bSopenharmony_ci void Replace(std::string &str, const std::string src, const std::string dst) const; 1454d6c458bSopenharmony_ci void DealCDataInfo(bool bCData, xmlNodePtr &curNode) const; 1464d6c458bSopenharmony_ci 1474d6c458bSopenharmony_ci SpaceType spaceType_ {SpaceType::T_INIT}; 1484d6c458bSopenharmony_ci int32_t iSpace_ {}; 1494d6c458bSopenharmony_ci std::string strSpace_ {}; 1504d6c458bSopenharmony_ci Options options_; 1514d6c458bSopenharmony_ci std::vector<napi_value> prevObj_ {}; 1524d6c458bSopenharmony_ci XmlInfo xmlInfo_; 1534d6c458bSopenharmony_ci int32_t apiVersion_ {0}; 1544d6c458bSopenharmony_ci int32_t API_VERSION_MOD {100}; 1554d6c458bSopenharmony_ci APIVersion APIVerIsolation_; 1564d6c458bSopenharmony_ci bool apiFlag_ {false}; 1574d6c458bSopenharmony_ci napi_env env_ {nullptr}; 1584d6c458bSopenharmony_ci }; 1594d6c458bSopenharmony_ci} // namespace OHOS::Xml 1604d6c458bSopenharmony_ci#endif // CONVERTXML_JS_CONVERTXML_H 161