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