18c339a94Sopenharmony_ci/*
28c339a94Sopenharmony_ci* Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd.
38c339a94Sopenharmony_ci* Licensed under the Apache License, Version 2.0 (the "License");
48c339a94Sopenharmony_ci* you may not use this file except in compliance with the License.
58c339a94Sopenharmony_ci* You may obtain a copy of the License at
68c339a94Sopenharmony_ci*
78c339a94Sopenharmony_ci* http://www.apache.org/licenses/LICENSE-2.0
88c339a94Sopenharmony_ci*
98c339a94Sopenharmony_ci* Unless required by applicable law or agreed to in writing, software
108c339a94Sopenharmony_ci* distributed under the License is distributed on an "AS IS" BASIS,
118c339a94Sopenharmony_ci* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
128c339a94Sopenharmony_ci* See the License for the specific language governing permissions and
138c339a94Sopenharmony_ci* limitations under the License.
148c339a94Sopenharmony_ci*/
158c339a94Sopenharmony_ciconst { generateFunctionDirect } = require('./function_direct');
168c339a94Sopenharmony_ciconst { generateFunctionSync } = require('./function_sync');
178c339a94Sopenharmony_ciconst { generateFunctionAsync } = require('./function_async');
188c339a94Sopenharmony_ciconst { generateFunctionOnOff } = require('./function_onoff');
198c339a94Sopenharmony_ciconst { generateThreadsafeFunc } = require('./function_threadsafe');
208c339a94Sopenharmony_ciconst { FuncType, InterfaceList, getArrayType, getArrayTypeTwo, getMapType, EnumList, jsType2CType,
218c339a94Sopenharmony_ci    isOnOffRegisterFunc, isCreateThreadsafeFunc } = require('../tools/common');
228c339a94Sopenharmony_ciconst { jsToC, getCType, paramGenerate } = require('./param_generate');
238c339a94Sopenharmony_ciconst { cToJs } = require('./return_generate');
248c339a94Sopenharmony_ciconst re = require('../tools/re');
258c339a94Sopenharmony_ciconst { NapiLog } = require('../tools/NapiLog');
268c339a94Sopenharmony_ciconst { addUniqFunc2List, addUniqObj2List, setOverrideFunc } = require('../tools/tool');
278c339a94Sopenharmony_ci
288c339a94Sopenharmony_cilet middleHTmplete = `
298c339a94Sopenharmony_ciclass [className]_middle {
308c339a94Sopenharmony_cipublic:
318c339a94Sopenharmony_ci    struct constructor_value_struct {[contructorValueIn]
328c339a94Sopenharmony_ci    };
338c339a94Sopenharmony_ci    static napi_value constructor(napi_env env, napi_callback_info info);
348c339a94Sopenharmony_ci    static void release(DataPtr p);
358c339a94Sopenharmony_ci    [static_funcs]
368c339a94Sopenharmony_ci};
378c339a94Sopenharmony_ci`;
388c339a94Sopenharmony_ci
398c339a94Sopenharmony_cilet middleBodyTmplete = `
408c339a94Sopenharmony_ci    napi_value [className]_middle::constructor(napi_env env, napi_callback_info info)
418c339a94Sopenharmony_ci    {
428c339a94Sopenharmony_ci        XNapiTool *pxt = new XNapiTool(env, info);
438c339a94Sopenharmony_ci        napi_status status;
448c339a94Sopenharmony_ci        size_t argc;
458c339a94Sopenharmony_ci        status = napi_get_cb_info(env, info, &argc, nullptr, nullptr, nullptr);
468c339a94Sopenharmony_ci        if (argc > 0) {
478c339a94Sopenharmony_ci            napi_value args[argc];
488c339a94Sopenharmony_ci            status = napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
498c339a94Sopenharmony_ci            if (status != napi_ok) {
508c339a94Sopenharmony_ci                return nullptr;
518c339a94Sopenharmony_ci            }
528c339a94Sopenharmony_ci            struct constructor_value_struct *vio = new constructor_value_struct();
538c339a94Sopenharmony_ci            [getConstructorParam]
548c339a94Sopenharmony_ci            [className] *p = new [className]([constructorParam]);
558c339a94Sopenharmony_ci            napi_value thisvar = pxt->WrapInstance(reinterpret_cast<DataPtr>(p), [className]_middle::release);
568c339a94Sopenharmony_ci            delete vio;
578c339a94Sopenharmony_ci            return thisvar;
588c339a94Sopenharmony_ci        } else {
598c339a94Sopenharmony_ci            [className] *p = new [className]();
608c339a94Sopenharmony_ci            napi_value thisvar = pxt->WrapInstance(reinterpret_cast<DataPtr>(p), [className]_middle::release);
618c339a94Sopenharmony_ci            return thisvar;
628c339a94Sopenharmony_ci        }
638c339a94Sopenharmony_ci    }
648c339a94Sopenharmony_ci    void [className]_middle::release(DataPtr p)
658c339a94Sopenharmony_ci    {
668c339a94Sopenharmony_ci        void *dataPtr = p;
678c339a94Sopenharmony_ci        [className] *p2 = static_cast<[className] *>(dataPtr);
688c339a94Sopenharmony_ci        delete p2;
698c339a94Sopenharmony_ci    }
708c339a94Sopenharmony_ci    [static_funcs]
718c339a94Sopenharmony_ci`;
728c339a94Sopenharmony_ci
738c339a94Sopenharmony_cifunction getHDefineOfVariable(name, type, variable, optional) {
748c339a94Sopenharmony_ci    if (type.indexOf('|') >= 0) {
758c339a94Sopenharmony_ci        unionTypeString(name, type, variable, optional);
768c339a94Sopenharmony_ci    } else if (type === 'string') {
778c339a94Sopenharmony_ci        variableTypeString(optional, variable, name);
788c339a94Sopenharmony_ci    } else if (InterfaceList.getValue(type)) {
798c339a94Sopenharmony_ci        variableTypeInterface(optional, variable, type, name);
808c339a94Sopenharmony_ci    } else if (EnumList.getValue(type)) {
818c339a94Sopenharmony_ci      // 如果是枚举string类型,需要将其转换为std::string类型
828c339a94Sopenharmony_ci      variableTypeEnum(type, variable, name);
838c339a94Sopenharmony_ci    } else if (type.indexOf('Array<') === 0) {
848c339a94Sopenharmony_ci        typeArrFunctionOne(type, variable, name, optional);
858c339a94Sopenharmony_ci    } else if (type === 'boolean') {
868c339a94Sopenharmony_ci        variableTypeBoolean(optional, variable, name);
878c339a94Sopenharmony_ci    } else if (type.substring(type.length - 2) === '[]') {
888c339a94Sopenharmony_ci        typeArrFunctionTwo(type, variable, name, optional);
898c339a94Sopenharmony_ci    } else if (type.substring(0, 4) === 'Map<' || type.indexOf('{[key:') === 0) {
908c339a94Sopenharmony_ci        variable.hDefine += mapTypeString(type, name, optional); // 支持可选参数?
918c339a94Sopenharmony_ci    } else if (type === 'any') {
928c339a94Sopenharmony_ci        variable.hDefine += anyTypeString(type, name);
938c339a94Sopenharmony_ci    } else if (type.substring(0, 12) === 'NUMBER_TYPE_') {
948c339a94Sopenharmony_ci        variableTypeNumber(optional, variable, type, name);
958c339a94Sopenharmony_ci    } else if (type === 'Object' || type === 'object') {
968c339a94Sopenharmony_ci        variable.hDefine += '\n    std::map<std::string, std::any> %s;'.format(name);
978c339a94Sopenharmony_ci    }
988c339a94Sopenharmony_ci    else {
998c339a94Sopenharmony_ci        NapiLog.logError(`
1008c339a94Sopenharmony_ci        ---- generateVariable fail %s,%s ----
1018c339a94Sopenharmony_ci        `.format(name, type));
1028c339a94Sopenharmony_ci    }
1038c339a94Sopenharmony_ci}
1048c339a94Sopenharmony_ci
1058c339a94Sopenharmony_cifunction variableTypeNumber(optional, variable, type, name) {
1068c339a94Sopenharmony_ci  if (optional) {
1078c339a94Sopenharmony_ci    variable.hDefine += '\n    std::optional<%s> %s;'.format(type, name);
1088c339a94Sopenharmony_ci  } else {
1098c339a94Sopenharmony_ci    variable.hDefine += '\n    %s %s;'.format(type, name);
1108c339a94Sopenharmony_ci  }
1118c339a94Sopenharmony_ci}
1128c339a94Sopenharmony_ci
1138c339a94Sopenharmony_cifunction variableTypeBoolean(optional, variable, name) {
1148c339a94Sopenharmony_ci  if (optional) {
1158c339a94Sopenharmony_ci    variable.hDefine += '\n    std::optional<bool> %s;'.format(name);
1168c339a94Sopenharmony_ci  } else {
1178c339a94Sopenharmony_ci    variable.hDefine += '\n    bool %s;'.format(name);
1188c339a94Sopenharmony_ci  }
1198c339a94Sopenharmony_ci}
1208c339a94Sopenharmony_ci
1218c339a94Sopenharmony_cifunction variableTypeEnum(type, variable, name) {
1228c339a94Sopenharmony_ci  let enumBasicType = EnumList.getValue(type)[0].type;
1238c339a94Sopenharmony_ci  if (enumBasicType === 'string') {
1248c339a94Sopenharmony_ci    variable.hDefine += '\n    %s %s;'.format('std::string', name);
1258c339a94Sopenharmony_ci  } else {
1268c339a94Sopenharmony_ci    variable.hDefine += '\n    %s %s;'.format(type, name);
1278c339a94Sopenharmony_ci  }
1288c339a94Sopenharmony_ci}
1298c339a94Sopenharmony_ci
1308c339a94Sopenharmony_cifunction variableTypeInterface(optional, variable, type, name) {
1318c339a94Sopenharmony_ci  if (optional) {
1328c339a94Sopenharmony_ci    variable.hDefine += '\n    std::optional<%s> %s;'.format(type, name);
1338c339a94Sopenharmony_ci  } else {
1348c339a94Sopenharmony_ci    variable.hDefine += '\n    %s %s;'.format(type, name);
1358c339a94Sopenharmony_ci  }
1368c339a94Sopenharmony_ci}
1378c339a94Sopenharmony_ci
1388c339a94Sopenharmony_cifunction variableTypeString(optional, variable, name) {
1398c339a94Sopenharmony_ci  if (optional) {
1408c339a94Sopenharmony_ci    variable.hDefine += '\n    std::optional<std::string> %s;'.format(name);
1418c339a94Sopenharmony_ci  } else {
1428c339a94Sopenharmony_ci    variable.hDefine += '\n    std::string %s;'.format(name);
1438c339a94Sopenharmony_ci  }
1448c339a94Sopenharmony_ci}
1458c339a94Sopenharmony_ci
1468c339a94Sopenharmony_cifunction typeArrFunctionTwo(type, variable, name, optional) {
1478c339a94Sopenharmony_ci    let arrayType = getArrayTypeTwo(type);
1488c339a94Sopenharmony_ci    if (arrayType === 'any') {
1498c339a94Sopenharmony_ci        variable.hDefine += '\n    std::string %s_type;\n    std::any %s;'.format(name, name);
1508c339a94Sopenharmony_ci    } else {
1518c339a94Sopenharmony_ci        let cType = jsType2CType(arrayType);
1528c339a94Sopenharmony_ci        if (optional) {
1538c339a94Sopenharmony_ci            variable.hDefine += '\n    std::optional<std::vector<%s>> %s;'.format(cType, name);
1548c339a94Sopenharmony_ci        } else {
1558c339a94Sopenharmony_ci            variable.hDefine += '\n    std::vector<%s> %s;'.format(cType, name);
1568c339a94Sopenharmony_ci        }
1578c339a94Sopenharmony_ci    }
1588c339a94Sopenharmony_ci}
1598c339a94Sopenharmony_ci
1608c339a94Sopenharmony_cifunction typeArrFunctionOne(type, variable, name, optional) {
1618c339a94Sopenharmony_ci    let arrayType = getArrayType(type);
1628c339a94Sopenharmony_ci    if (arrayType === 'any') {
1638c339a94Sopenharmony_ci        variable.hDefine += '\n    std::string %s_type; \n    std::any %s;'.format(name, name);
1648c339a94Sopenharmony_ci    } else {
1658c339a94Sopenharmony_ci        let cType = jsType2CType(arrayType);
1668c339a94Sopenharmony_ci        if (optional) {
1678c339a94Sopenharmony_ci            variable.hDefine += '\n    std::optional<std::vector<%s>> %s;'.format(cType, name);
1688c339a94Sopenharmony_ci        } else {
1698c339a94Sopenharmony_ci            variable.hDefine += '\n    std::vector<%s> %s;'.format(cType, name);
1708c339a94Sopenharmony_ci        }
1718c339a94Sopenharmony_ci    }
1728c339a94Sopenharmony_ci}
1738c339a94Sopenharmony_ci
1748c339a94Sopenharmony_cifunction generateVariable(value, variable, className) {
1758c339a94Sopenharmony_ci    let name = value.name;
1768c339a94Sopenharmony_ci    let type = value.type;
1778c339a94Sopenharmony_ci    let optional = value.optional;
1788c339a94Sopenharmony_ci    if (!value.isParentMember) {
1798c339a94Sopenharmony_ci        // 只有类/接口自己的成员属性需要在.h中定义, 父类/父接口不需要
1808c339a94Sopenharmony_ci        getHDefineOfVariable(name, type, variable, optional);
1818c339a94Sopenharmony_ci    }
1828c339a94Sopenharmony_ci    if (optional && type.indexOf('|') < 0) {
1838c339a94Sopenharmony_ci        optionalParamGetSet(type, variable, name, className);
1848c339a94Sopenharmony_ci    } else {
1858c339a94Sopenharmony_ci          variable.middleH += `
1868c339a94Sopenharmony_ci          static napi_value getvalue_%s(napi_env env, napi_callback_info info);
1878c339a94Sopenharmony_ci          static napi_value setvalue_%s(napi_env env, napi_callback_info info);\n`.format(name, name);
1888c339a94Sopenharmony_ci        variable.middleValue += `
1898c339a94Sopenharmony_ci          napi_value %s::getvalue_%s(napi_env env, napi_callback_info info)
1908c339a94Sopenharmony_ci        {
1918c339a94Sopenharmony_ci            XNapiTool *pxt = std::make_unique<XNapiTool>(env, info).release();
1928c339a94Sopenharmony_ci            void *instPtr = pxt->UnWarpInstance();
1938c339a94Sopenharmony_ci            %s *p = static_cast<%s *>(instPtr);
1948c339a94Sopenharmony_ci            napi_value result = nullptr;
1958c339a94Sopenharmony_ci              `.format(className + '_middle', name, className, className) +
1968c339a94Sopenharmony_ci              cToJs('p->' + name, type, 'result', 1, optional) + `
1978c339a94Sopenharmony_ci            delete pxt;
1988c339a94Sopenharmony_ci            return result;
1998c339a94Sopenharmony_ci        }
2008c339a94Sopenharmony_ci          napi_value %s::setvalue_%s(napi_env env, napi_callback_info info)
2018c339a94Sopenharmony_ci        {
2028c339a94Sopenharmony_ci            std::shared_ptr<XNapiTool> pxt = std::make_shared<XNapiTool>(env, info);
2038c339a94Sopenharmony_ci            void *instPtr = pxt->UnWarpInstance();
2048c339a94Sopenharmony_ci            %s *p = static_cast<%s *>(instPtr);
2058c339a94Sopenharmony_ci              `.format(className + '_middle', name, className, className) +
2068c339a94Sopenharmony_ci              jsToC('p->' + name, 'pxt->GetArgv(XNapiTool::ZERO)',
2078c339a94Sopenharmony_ci            type, 0, optional) + `
2088c339a94Sopenharmony_ci            return nullptr;
2098c339a94Sopenharmony_ci        }`;
2108c339a94Sopenharmony_ci    }
2118c339a94Sopenharmony_ci}
2128c339a94Sopenharmony_ci
2138c339a94Sopenharmony_cifunction optionalParamGetSet(type, variable, name, className) {
2148c339a94Sopenharmony_ci    let optType = getCType(type);
2158c339a94Sopenharmony_ci    variable.middleH += `
2168c339a94Sopenharmony_ci        static napi_value getvalue_%s(napi_env env, napi_callback_info info);
2178c339a94Sopenharmony_ci        static napi_value setvalue_%s(napi_env env, napi_callback_info info);\n`.format(name, name);
2188c339a94Sopenharmony_ci    variable.middleValue += `
2198c339a94Sopenharmony_ci        napi_value %s::getvalue_%s(napi_env env, napi_callback_info info)
2208c339a94Sopenharmony_ci        {
2218c339a94Sopenharmony_ci            XNapiTool *pxt = std::make_unique<XNapiTool>(env, info).release();
2228c339a94Sopenharmony_ci            void *instPtr = pxt->UnWarpInstance();
2238c339a94Sopenharmony_ci            %s *p = static_cast<%s *>(instPtr);
2248c339a94Sopenharmony_ci            napi_value result = nullptr;
2258c339a94Sopenharmony_ci            if(p->%s.has_value()) {
2268c339a94Sopenharmony_ci                `.format(className + '_middle', name, className, className, name) +
2278c339a94Sopenharmony_ci                cToJs('p->%s.value()'.format(name), type, 'result') + `
2288c339a94Sopenharmony_ci            }
2298c339a94Sopenharmony_ci            delete pxt;
2308c339a94Sopenharmony_ci            return result;
2318c339a94Sopenharmony_ci        }
2328c339a94Sopenharmony_ci        napi_value %s::setvalue_%s(napi_env env, napi_callback_info info)
2338c339a94Sopenharmony_ci        {
2348c339a94Sopenharmony_ci            std::shared_ptr<XNapiTool> pxt = std::make_shared<XNapiTool>(env, info);
2358c339a94Sopenharmony_ci            void *instPtr = pxt->UnWarpInstance();
2368c339a94Sopenharmony_ci            %s *p = static_cast<%s *>(instPtr);
2378c339a94Sopenharmony_ci            if (pxt->GetProperty(pxt->GetArgv(XNapiTool::ZERO), "%s")) {
2388c339a94Sopenharmony_ci                %s %s_tmp;
2398c339a94Sopenharmony_ci                `.format(className + '_middle', name, className, className, name, optType, name) +
2408c339a94Sopenharmony_ci                jsToC('%s_tmp'.format(name), 'pxt->GetArgv(XNapiTool::ZERO)', type) + `
2418c339a94Sopenharmony_ci                p->%s.emplace(%s_tmp);`.format(name, name) + `
2428c339a94Sopenharmony_ci            }
2438c339a94Sopenharmony_ci            return nullptr;
2448c339a94Sopenharmony_ci        }`;
2458c339a94Sopenharmony_ci}
2468c339a94Sopenharmony_ci
2478c339a94Sopenharmony_cifunction unionTypeString(name, type, variable, optional) {
2488c339a94Sopenharmony_ci    if (optional) {
2498c339a94Sopenharmony_ci        variable.hDefine += `\n    std::optional<std::string> %s_type;
2508c339a94Sopenharmony_ci        std::optional<std::any> %s;`.format(name, name);
2518c339a94Sopenharmony_ci    } else {
2528c339a94Sopenharmony_ci        variable.hDefine += `\n    std::string %s_type;
2538c339a94Sopenharmony_ci        std::any %s;`.format(name, name);
2548c339a94Sopenharmony_ci    }
2558c339a94Sopenharmony_ci}
2568c339a94Sopenharmony_ci
2578c339a94Sopenharmony_cifunction mapTypeString(type, name, optional) {
2588c339a94Sopenharmony_ci    let mapType = getMapType(type);
2598c339a94Sopenharmony_ci    let mapTypeString;
2608c339a94Sopenharmony_ci    if (mapType[1] !== undefined && mapType[1] !== null && mapType[2] === undefined) {
2618c339a94Sopenharmony_ci        if (mapType[1] === 'string') {
2628c339a94Sopenharmony_ci            mapTypeString = 'std::string, std::string';
2638c339a94Sopenharmony_ci        } else if (mapType[1] === 'boolean') {
2648c339a94Sopenharmony_ci            mapTypeString = 'std::string, bool';
2658c339a94Sopenharmony_ci        } else if (mapType[1].substring(0, 12) === 'NUMBER_TYPE_') {
2668c339a94Sopenharmony_ci            mapTypeString = 'std::string, %s'.format(mapType[1]);
2678c339a94Sopenharmony_ci        } else if (mapType[1].substring(0, 12) === 'any') {
2688c339a94Sopenharmony_ci            mapTypeString = `std::string, std::any`.format(mapType[1]);
2698c339a94Sopenharmony_ci            return `\n    std::map<%s> %s;
2708c339a94Sopenharmony_ci            std::string %s_type;`.format(mapTypeString, name, name);
2718c339a94Sopenharmony_ci        } else if (InterfaceList.getValue(mapType[1])) {
2728c339a94Sopenharmony_ci            mapTypeString = 'std::string, %s'.format(mapType[1]);
2738c339a94Sopenharmony_ci        }
2748c339a94Sopenharmony_ci    }
2758c339a94Sopenharmony_ci    if (mapType[2] !== undefined) {
2768c339a94Sopenharmony_ci        if (mapType[2] === 'string') {
2778c339a94Sopenharmony_ci            mapTypeString = 'std::string, std::map<std::string, std::string>';
2788c339a94Sopenharmony_ci        } else if (mapType[2] === 'boolean') {
2798c339a94Sopenharmony_ci            mapTypeString = 'std::string, std::map<std::string, bool>';
2808c339a94Sopenharmony_ci        } else if (mapType[2].substring(0, 12) === 'NUMBER_TYPE_') {
2818c339a94Sopenharmony_ci            mapTypeString = 'std::string, std::map<std::string, %s>'.format(mapType[2]);
2828c339a94Sopenharmony_ci        }
2838c339a94Sopenharmony_ci    }
2848c339a94Sopenharmony_ci    if (mapType[3] !== undefined) {
2858c339a94Sopenharmony_ci        if (mapType[3] === 'string') {
2868c339a94Sopenharmony_ci            mapTypeString = 'std::string, std::vector<std::string>';
2878c339a94Sopenharmony_ci        } else if (mapType[3] === 'boolean') {
2888c339a94Sopenharmony_ci            mapTypeString = 'std::string, std::vector<bool>';
2898c339a94Sopenharmony_ci        } else if (mapType[3].substring(0, 12) === 'NUMBER_TYPE_') {
2908c339a94Sopenharmony_ci            mapTypeString = 'std::string, std::vector<%s>'.format(mapType[3]);
2918c339a94Sopenharmony_ci        }
2928c339a94Sopenharmony_ci    }
2938c339a94Sopenharmony_ci    if (optional) {
2948c339a94Sopenharmony_ci        return '\n    std::optional<std::map<%s>> %s;'.format(mapTypeString, name);
2958c339a94Sopenharmony_ci    } else {
2968c339a94Sopenharmony_ci        return '\n    std::map<%s> %s;'.format(mapTypeString, name);
2978c339a94Sopenharmony_ci    }
2988c339a94Sopenharmony_ci}
2998c339a94Sopenharmony_ci
3008c339a94Sopenharmony_cifunction anyTypeString(type, name) {
3018c339a94Sopenharmony_ci    let anyType = `\n    std::string %s_type;
3028c339a94Sopenharmony_ci    std::any %s;`;
3038c339a94Sopenharmony_ci    return anyType.format(name, name);
3048c339a94Sopenharmony_ci}
3058c339a94Sopenharmony_ci
3068c339a94Sopenharmony_cifunction generateInterface(name, data, inNamespace) {
3078c339a94Sopenharmony_ci    let param = { valueIn: '', valueOut: '', valueCheckout: '', valueFill: '',
3088c339a94Sopenharmony_ci    valuePackage: '', valueDefine: '', optionalParamDestory: '' };
3098c339a94Sopenharmony_ci    let getConParam = getConstructorFunc(data, param);
3108c339a94Sopenharmony_ci    let resultConnect = connectResult(data, inNamespace, name);
3118c339a94Sopenharmony_ci    let middleFunc = resultConnect[0];
3128c339a94Sopenharmony_ci    let implH = resultConnect[1];
3138c339a94Sopenharmony_ci    let implCpp = resultConnect[2];
3148c339a94Sopenharmony_ci    let middleInit = resultConnect[3];
3158c339a94Sopenharmony_ci    let middleH = resultConnect[4];
3168c339a94Sopenharmony_ci    let selfNs = '';
3178c339a94Sopenharmony_ci    if (inNamespace.length > 0) {
3188c339a94Sopenharmony_ci        let nsl = inNamespace.split('::');
3198c339a94Sopenharmony_ci        nsl.pop();
3208c339a94Sopenharmony_ci        if (nsl.length >= 2) {
3218c339a94Sopenharmony_ci            selfNs = ', ' + nsl[nsl.length - 1];
3228c339a94Sopenharmony_ci        }
3238c339a94Sopenharmony_ci    }
3248c339a94Sopenharmony_ci    let toolNamespace = getToolNamespace(inNamespace);
3258c339a94Sopenharmony_ci    middleInit += `\n    pxt->DefineClass("%s", %s%s%s_middle::constructor,
3268c339a94Sopenharmony_ci        valueList, funcList%s);\n}\n`
3278c339a94Sopenharmony_ci        .format(name, inNamespace, toolNamespace, name, selfNs);
3288c339a94Sopenharmony_ci    let extendsStr = (data.parentNameList && data.parentNameList.length > 0) ?
3298c339a94Sopenharmony_ci        ' : public %s'.format(data.parentNameList.join(', public ')) : '';
3308c339a94Sopenharmony_ci    let result = {
3318c339a94Sopenharmony_ci        implH: `
3328c339a94Sopenharmony_ciclass %s%s {
3338c339a94Sopenharmony_cipublic:%s\n
3348c339a94Sopenharmony_ci};\n`.format(name, extendsStr, implH),
3358c339a94Sopenharmony_ci        implCpp: implCpp,
3368c339a94Sopenharmony_ci        middleBody: middleBodyTmplete.replaceAll('[className]', name).replaceAll('[static_funcs]', middleFunc)
3378c339a94Sopenharmony_ci        .replaceAll('[getConstructorParam]', getConParam)
3388c339a94Sopenharmony_ci        .replaceAll('[constructorParam]', param.valueFill),
3398c339a94Sopenharmony_ci        middleInit: middleInit,
3408c339a94Sopenharmony_ci        declarationH: `
3418c339a94Sopenharmony_ciclass %s;\r`.format(name),
3428c339a94Sopenharmony_ci        middleH: middleHTmplete.replaceAll('[className]', name).replaceAll('[static_funcs]', middleH)
3438c339a94Sopenharmony_ci        .replaceAll('[contructorValueIn]', param.valueIn)
3448c339a94Sopenharmony_ci    };
3458c339a94Sopenharmony_ci    return result;
3468c339a94Sopenharmony_ci}
3478c339a94Sopenharmony_ci
3488c339a94Sopenharmony_cifunction getConstructorFunc(data, param) {
3498c339a94Sopenharmony_ci    let funcValues = null;
3508c339a94Sopenharmony_ci    if (data.function !== null && data.function !== undefined) {
3518c339a94Sopenharmony_ci        for (let i = 0; i < data.function.length; i++) {
3528c339a94Sopenharmony_ci            if (data.function[i].name === 'constructor') {
3538c339a94Sopenharmony_ci                funcValues = data.function[i].value;
3548c339a94Sopenharmony_ci            }
3558c339a94Sopenharmony_ci        }
3568c339a94Sopenharmony_ci    }
3578c339a94Sopenharmony_ci    for (let j in funcValues) {
3588c339a94Sopenharmony_ci        paramGenerate(j, funcValues[j], param, data);
3598c339a94Sopenharmony_ci    }
3608c339a94Sopenharmony_ci    let tmpBody = param.valueCheckout.split(';\n');
3618c339a94Sopenharmony_ci    let getConParam = '';
3628c339a94Sopenharmony_ci    for (let i in tmpBody) {
3638c339a94Sopenharmony_ci        let flag = tmpBody[i].replaceAll('\n', '').replaceAll(' ', '');
3648c339a94Sopenharmony_ci        if (flag !== '') {
3658c339a94Sopenharmony_ci            let indexBegin = tmpBody[i].indexOf('pxt->GetArgv(');
3668c339a94Sopenharmony_ci            if (indexBegin > 0 && tmpBody[i].indexOf('\n') < 0) {
3678c339a94Sopenharmony_ci              tmpBody[i] = tmpBody[i].replaceAll('pxt->GetArgv(', 'args[');
3688c339a94Sopenharmony_ci              let index = tmpBody[i].indexOf(')');
3698c339a94Sopenharmony_ci              tmpBody[i] = tmpBody[i].substring(0, index) + ']' + tmpBody[i].substring(index + 1, tmpBody[i].length);
3708c339a94Sopenharmony_ci            } else if (indexBegin > 0 && tmpBody[i].indexOf('\n') >= 0) {
3718c339a94Sopenharmony_ci              tmpBody[i] = tmpBody[i].replaceAll('pxt->GetArgv(', 'args[');
3728c339a94Sopenharmony_ci              let index = tmpBody[i].indexOf('),');
3738c339a94Sopenharmony_ci              tmpBody[i] = tmpBody[i].substring(0, index) + ']' + tmpBody[i].substring(index + 1, tmpBody[i].length);
3748c339a94Sopenharmony_ci            }
3758c339a94Sopenharmony_ci           getConParam += tmpBody[i] + ';\n';
3768c339a94Sopenharmony_ci        }
3778c339a94Sopenharmony_ci    }
3788c339a94Sopenharmony_ci    let index = getConParam.lastIndexOf(';\n');
3798c339a94Sopenharmony_ci    if (getConParam.substring(index - 1, index) === ' ') {
3808c339a94Sopenharmony_ci      getConParam = getConParam.substring(0, index - 1);
3818c339a94Sopenharmony_ci    }
3828c339a94Sopenharmony_ci    return getConParam;
3838c339a94Sopenharmony_ci}
3848c339a94Sopenharmony_ci
3858c339a94Sopenharmony_ci// 递归获取接口及接口父类的所有成员属性和方法
3868c339a94Sopenharmony_cifunction getAllPropties(interfaceBody, properties, isParentClass) {
3878c339a94Sopenharmony_ci    for (let i in interfaceBody.value) {
3888c339a94Sopenharmony_ci        interfaceBody.value[i].isParentMember = isParentClass;
3898c339a94Sopenharmony_ci        addUniqObj2List(interfaceBody.value[i], properties.values);
3908c339a94Sopenharmony_ci    }
3918c339a94Sopenharmony_ci    for (let i in interfaceBody.function) {
3928c339a94Sopenharmony_ci        interfaceBody.function[i].isParentMember = isParentClass;
3938c339a94Sopenharmony_ci        if (!addUniqFunc2List(interfaceBody.function[i], properties.functions)) {
3948c339a94Sopenharmony_ci            if (isParentClass) {
3958c339a94Sopenharmony_ci                // 没添加到列表,说明子类方法properties.functions重写了父类方法interfaceBody.function[i]
3968c339a94Sopenharmony_ci                // 找到该子类方法并将其设置为override (生成的重写函数如果没有override关键字会触发门禁告警)
3978c339a94Sopenharmony_ci                setOverrideFunc(interfaceBody.function[i], properties.functions);
3988c339a94Sopenharmony_ci            }
3998c339a94Sopenharmony_ci        }
4008c339a94Sopenharmony_ci    }
4018c339a94Sopenharmony_ci    if (!isParentClass && interfaceBody.parentNameList && interfaceBody.parentNameList.length > 0) {
4028c339a94Sopenharmony_ci        getAllPropties(interfaceBody.parentBody, properties, true);
4038c339a94Sopenharmony_ci    }
4048c339a94Sopenharmony_ci}
4058c339a94Sopenharmony_ci
4068c339a94Sopenharmony_cifunction addVirtualKeywords(data, implH, name) {
4078c339a94Sopenharmony_ci    if (data.childList && data.childList.length > 0) {
4088c339a94Sopenharmony_ci        // 如果该类是其它类的父类,增加虚析构函数使其具备泛型特征 (基类必须有虚函数才能正确使用dynamic_cast和typeinfo等方法)
4098c339a94Sopenharmony_ci        // 如果该类自己也有父类,虚析构函数需要加上override关键字(否则C++门禁会有告警)
4108c339a94Sopenharmony_ci        let ovrrideStr = (data.parentList && data.parentList.length > 0) ? ' override' : '';
4118c339a94Sopenharmony_ci        // 如果虚析构函数已经有override关键字,就不需要再加virtual关键字了(否则C++门禁会有告警)
4128c339a94Sopenharmony_ci        let virtualStr = (data.parentList && data.parentList.length > 0) ? '' : 'virtual ';
4138c339a94Sopenharmony_ci        implH += '\n    %s~%s()%s {};'.format(virtualStr, name, ovrrideStr);
4148c339a94Sopenharmony_ci    }
4158c339a94Sopenharmony_ci    return implH;
4168c339a94Sopenharmony_ci}
4178c339a94Sopenharmony_ci
4188c339a94Sopenharmony_cifunction connectResult(data, inNamespace, name) {
4198c339a94Sopenharmony_ci    let implH = '';
4208c339a94Sopenharmony_ci    let implCpp = '';
4218c339a94Sopenharmony_ci    let middleFunc = '';
4228c339a94Sopenharmony_ci    let middleInit = '';
4238c339a94Sopenharmony_ci    let middleH = '';
4248c339a94Sopenharmony_ci    let variable = {
4258c339a94Sopenharmony_ci        hDefine: '',
4268c339a94Sopenharmony_ci        middleValue: '',
4278c339a94Sopenharmony_ci        middleH: ''
4288c339a94Sopenharmony_ci    };
4298c339a94Sopenharmony_ci    middleInit = getMiddleInitFunc(middleInit, data, variable, name, inNamespace);
4308c339a94Sopenharmony_ci    implH += variable.hDefine;
4318c339a94Sopenharmony_ci    middleFunc += variable.middleValue;
4328c339a94Sopenharmony_ci    middleInit += `\n    std::map<const char *, napi_callback> funcList;`;
4338c339a94Sopenharmony_ci    middleH += variable.middleH;
4348c339a94Sopenharmony_ci    for (let i in data.allProperties.functions) {
4358c339a94Sopenharmony_ci        let func = data.allProperties.functions[i];
4368c339a94Sopenharmony_ci        let tmp;
4378c339a94Sopenharmony_ci        if (isOnOffRegisterFunc(func.name)) {
4388c339a94Sopenharmony_ci            tmp = generateFunctionOnOff(func, data, name);
4398c339a94Sopenharmony_ci        } else if (isCreateThreadsafeFunc(func.name)) {
4408c339a94Sopenharmony_ci            tmp = generateThreadsafeFunc(func, data, name);
4418c339a94Sopenharmony_ci        }
4428c339a94Sopenharmony_ci        if (!tmp) {
4438c339a94Sopenharmony_ci            switch (func.type) {
4448c339a94Sopenharmony_ci                case FuncType.DIRECT:
4458c339a94Sopenharmony_ci                    tmp = generateFunctionDirect(func, data, name, implH);
4468c339a94Sopenharmony_ci                    break;
4478c339a94Sopenharmony_ci                case FuncType.SYNC:
4488c339a94Sopenharmony_ci                    tmp = generateFunctionSync(func, data, name);
4498c339a94Sopenharmony_ci                    break;
4508c339a94Sopenharmony_ci                case FuncType.ASYNC:
4518c339a94Sopenharmony_ci                case FuncType.PROMISE:
4528c339a94Sopenharmony_ci                    tmp = generateFunctionAsync(func, data, name, implH);
4538c339a94Sopenharmony_ci                    break;
4548c339a94Sopenharmony_ci                default:
4558c339a94Sopenharmony_ci                    break;
4568c339a94Sopenharmony_ci            }
4578c339a94Sopenharmony_ci        }
4588c339a94Sopenharmony_ci        middleFunc += tmp[0];
4598c339a94Sopenharmony_ci        implH += tmp[1];
4608c339a94Sopenharmony_ci        implCpp += tmp[2];
4618c339a94Sopenharmony_ci        middleH += tmp[3];
4628c339a94Sopenharmony_ci        middleInit = generateMiddleInitFunc(func, inNamespace, middleInit, name);
4638c339a94Sopenharmony_ci    }
4648c339a94Sopenharmony_ci    implH = addVirtualKeywords(data, implH, name);
4658c339a94Sopenharmony_ci    return [middleFunc, implH, implCpp, middleInit, middleH];
4668c339a94Sopenharmony_ci}
4678c339a94Sopenharmony_ci
4688c339a94Sopenharmony_cifunction generateMiddleInitFunc(func, inNamespace, middleInit, name) {
4698c339a94Sopenharmony_ci    if (func.name !== 'constructor') {
4708c339a94Sopenharmony_ci        let toolNamespace = getToolNamespace(inNamespace);
4718c339a94Sopenharmony_ci        middleInit += `\n    funcList["%s"] = %s%s%s_middle::%s_middle;`.format(func.name,
4728c339a94Sopenharmony_ci            inNamespace, toolNamespace, name, func.name);
4738c339a94Sopenharmony_ci    }
4748c339a94Sopenharmony_ci    return middleInit;
4758c339a94Sopenharmony_ci}
4768c339a94Sopenharmony_ci
4778c339a94Sopenharmony_cifunction getMiddleInitFunc(middleInit, data, variable, name, inNamespace) {
4788c339a94Sopenharmony_ci    middleInit = `{\n    std::map<const char *, std::map<const char *, napi_callback>> valueList;`;
4798c339a94Sopenharmony_ci    data.allProperties = { values: [], functions: [] };
4808c339a94Sopenharmony_ci    getAllPropties(data, data.allProperties, false);
4818c339a94Sopenharmony_ci    let toolNamespace = getToolNamespace(inNamespace);
4828c339a94Sopenharmony_ci    for (let i in data.allProperties.values) {
4838c339a94Sopenharmony_ci        let v = data.allProperties.values[i];
4848c339a94Sopenharmony_ci        generateVariable(v, variable, name);
4858c339a94Sopenharmony_ci        middleInit += `
4868c339a94Sopenharmony_ci        valueList["%s"]["getvalue"] = %s%s%s_middle::getvalue_%s;
4878c339a94Sopenharmony_ci        valueList["%s"]["setvalue"] = %s%s%s_middle::setvalue_%s;`
4888c339a94Sopenharmony_ci        .format(v.name, inNamespace, toolNamespace, name, v.name, v.name, inNamespace, toolNamespace, name, v.name);
4898c339a94Sopenharmony_ci    }
4908c339a94Sopenharmony_ci    return middleInit;
4918c339a94Sopenharmony_ci}
4928c339a94Sopenharmony_ci
4938c339a94Sopenharmony_cifunction getToolNamespace(inNamespace) {
4948c339a94Sopenharmony_ci    let index = inNamespace.lastIndexOf('::');
4958c339a94Sopenharmony_ci    let toolNamespace;
4968c339a94Sopenharmony_ci    if (index > 0) {
4978c339a94Sopenharmony_ci      let bodyTmp = inNamespace.substring(0, index);
4988c339a94Sopenharmony_ci      let index2 = bodyTmp.lastIndexOf('::');
4998c339a94Sopenharmony_ci      if (index2 > 0 && index2 < index) {
5008c339a94Sopenharmony_ci          toolNamespace = inNamespace.substring(index2 + 2, index) + '_interface::';
5018c339a94Sopenharmony_ci      } else {
5028c339a94Sopenharmony_ci          toolNamespace = bodyTmp + '_interface::';
5038c339a94Sopenharmony_ci      }
5048c339a94Sopenharmony_ci    } else {
5058c339a94Sopenharmony_ci        toolNamespace = inNamespace + '_interface::';
5068c339a94Sopenharmony_ci    }
5078c339a94Sopenharmony_ci    return toolNamespace;
5088c339a94Sopenharmony_ci}
5098c339a94Sopenharmony_ci
5108c339a94Sopenharmony_cimodule.exports = {
5118c339a94Sopenharmony_ci    generateInterface,
5128c339a94Sopenharmony_ci    connectResult,
5138c339a94Sopenharmony_ci    generateVariable,
5148c339a94Sopenharmony_ci    mapTypeString,
5158c339a94Sopenharmony_ci    anyTypeString,
5168c339a94Sopenharmony_ci    getHDefineOfVariable
5178c339a94Sopenharmony_ci};
518