• 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_convertxml.h"
17 #include "tools/ets_error.h"
18 #include "tools/log.h"
19 #include "js_convertxml.h"
20 
21 extern const char _binary_js_convertxml_js_start[];
22 extern const char _binary_js_convertxml_js_end[];
23 extern const char _binary_convertxml_abc_start[];
24 extern const char _binary_convertxml_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 
ConvertXmlConstructor(napi_env env,napi_callback_info info)30     static napi_value ConvertXmlConstructor(napi_env env, napi_callback_info info)
31     {
32         napi_value thisVar = nullptr;
33         void *data = nullptr;
34         napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, &data);
35         auto objectInfo = new (std::nothrow) ConvertXml(env);
36         if (objectInfo == nullptr) {
37             HILOG_ERROR("ConvertXmlConstructor:: memory allocation failed, objectInfo is nullptr");
38             return nullptr;
39         }
40         napi_status status = napi_wrap(env, thisVar, objectInfo,
41             [](napi_env environment, void *data, void *hint) {
42                 auto obj = reinterpret_cast<ConvertXml*>(data);
43                 if (obj != nullptr) {
44                     delete obj;
45                     obj = nullptr;
46                 }
47             }, nullptr, nullptr);
48         if (status != napi_ok) {
49             HILOG_ERROR("ConvertXmlConstructor:: napi_wrap failed");
50             delete objectInfo;
51             objectInfo = nullptr;
52         }
53         return thisVar;
54     }
55 
Convert(napi_env env,napi_callback_info info)56     static napi_value Convert(napi_env env, napi_callback_info info)
57     {
58         napi_value thisVar = nullptr;
59         size_t requireMaxArgc = 2; // 2:MaxArgc
60         size_t requireMinArgc = 1;
61         size_t argc = 2; // 2:The number of parameters is 2
62         napi_value args[2] = { nullptr };
63         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr));
64         NAPI_ASSERT(env, argc <= requireMaxArgc, "Wrong number of arguments(Over)");
65         NAPI_ASSERT(env, argc >= requireMinArgc, "Wrong number of arguments(Less)");
66         std::string strXml;
67         napi_valuetype valuetype;
68         ConvertXml *object = nullptr;
69         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object)));
70 
71         NAPI_CALL(env, napi_typeof(env, args[0], &valuetype));
72         NAPI_ASSERT(env, valuetype == napi_string, "Wrong argument type: string expected.");
73         object->DealNapiStrValue(env, args[0], strXml);
74         if (argc > 1) {
75             object->DealOptions(env, args[1], true);
76         }
77         napi_value result = object->Convert(env, strXml, true);
78         return result;
79     }
80 
FastConvert(napi_env env,napi_callback_info info)81     static napi_value FastConvert(napi_env env, napi_callback_info info)
82     {
83         napi_value thisVar = nullptr;
84         size_t argc = 2; // 2:The number of parameters
85         napi_value args[2] = { nullptr }; // 2:The number of parameters
86         napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr);
87         std::string strXml;
88         ConvertXml *convertxml = nullptr;
89         napi_unwrap(env, thisVar, reinterpret_cast<void**>(&convertxml));
90         if (convertxml == nullptr) {
91             ErrorHelper::ThrowError(env, ERROR_CODE, "Parameter error. Parameter verification failed.");
92             return nullptr;
93         }
94         convertxml->DealNapiStrValue(env, args[0], strXml);
95         if (argc > 1) {
96             convertxml->DealOptions(env, args[1], false);
97         }
98         return convertxml->Convert(env, strXml, false);
99     }
100 
ConvertXmlInit(napi_env env,napi_value exports)101     napi_value ConvertXmlInit(napi_env env, napi_value exports)
102     {
103         const char *convertXmlClassName = "ConvertXml";
104         napi_value convertXmlClass = nullptr;
105         napi_property_descriptor convertXmlDesc[] = {
106             DECLARE_NAPI_FUNCTION("convert", Convert),
107             DECLARE_NAPI_FUNCTION("fastConvertToJSObject", FastConvert)
108         };
109         NAPI_CALL(env, napi_define_class(env, convertXmlClassName, strlen(convertXmlClassName), ConvertXmlConstructor,
110                                          nullptr, sizeof(convertXmlDesc) / sizeof(convertXmlDesc[0]), convertXmlDesc,
111                                          &convertXmlClass));
112         napi_property_descriptor desc[] = {
113             DECLARE_NAPI_PROPERTY("ConvertXml", convertXmlClass)
114         };
115         NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
116         return exports;
117     }
118 
119     extern "C"
NAPI_convertxml_GetJSCode(const char ** buf,int * bufLen)120     __attribute__((visibility("default"))) void NAPI_convertxml_GetJSCode(const char **buf, int *bufLen)
121     {
122         if (buf != nullptr) {
123             *buf = _binary_js_convertxml_js_start;
124         }
125         if (bufLen != nullptr) {
126             *bufLen = _binary_js_convertxml_js_end - _binary_js_convertxml_js_start;
127         }
128     }
129     extern "C"
NAPI_convertxml_GetABCCode(const char ** buf,int * buflen)130     __attribute__((visibility("default"))) void NAPI_convertxml_GetABCCode(const char** buf, int* buflen)
131     {
132         if (buf != nullptr) {
133             *buf = _binary_convertxml_abc_start;
134         }
135         if (buflen != nullptr) {
136             *buflen = _binary_convertxml_abc_end - _binary_convertxml_abc_start;
137         }
138     }
139 
140     static napi_module_with_js convertXmlModule = {
141         .nm_version = 1,
142         .nm_flags = 0,
143         .nm_filename = nullptr,
144         .nm_register_func = ConvertXmlInit,
145         .nm_modname = "convertxml",
146         .nm_priv = reinterpret_cast<void*>(0),
147         .nm_get_abc_code = NAPI_convertxml_GetABCCode,
148         .nm_get_js_code = NAPI_convertxml_GetJSCode,
149     };
150 
ConvertXMLRegisterModule(void)151     extern "C" __attribute__((constructor)) void ConvertXMLRegisterModule(void)
152     {
153         napi_module_with_js_register(&convertXmlModule);
154     }
155 } // namespace OHOS::Xml
156