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