18c339a94Sopenharmony_ci/*
28c339a94Sopenharmony_ci* Copyright (c) 2024 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_ci
168c339a94Sopenharmony_ciconst { NapiLog } = require('../tools/NapiLog');
178c339a94Sopenharmony_ciconst util = require('util');
188c339a94Sopenharmony_ciconst path = require('path');
198c339a94Sopenharmony_ciconst fs = require('fs');
208c339a94Sopenharmony_ciconst { writeFile, readFile } = require('../tools/tool');
218c339a94Sopenharmony_ciconst re = require('../tools/re');
228c339a94Sopenharmony_ciconst LENGTH = 10;
238c339a94Sopenharmony_ciconst TWO_DECIMAL = 2;
248c339a94Sopenharmony_ci
258c339a94Sopenharmony_cifunction analyzeRetIsObject(retType, objectInfo) {
268c339a94Sopenharmony_ci    // 去除 * 和 空格
278c339a94Sopenharmony_ci    retType = retType.replace('*', '').replace('struct', '').trim();
288c339a94Sopenharmony_ci    let objKeys = Object.keys(objectInfo);
298c339a94Sopenharmony_ci    for (let i = 0; i < objKeys.length; i++) {
308c339a94Sopenharmony_ci        if (retType === objKeys[i]) {
318c339a94Sopenharmony_ci            return true;
328c339a94Sopenharmony_ci        }
338c339a94Sopenharmony_ci    }
348c339a94Sopenharmony_ci    return false;
358c339a94Sopenharmony_ci}
368c339a94Sopenharmony_ci
378c339a94Sopenharmony_ci
388c339a94Sopenharmony_cifunction analyzeRetIsTypeDef(type, info) {
398c339a94Sopenharmony_ci  let typedefKeys = Object.keys(info);
408c339a94Sopenharmony_ci  for (let i = 0; i < typedefKeys.length; i++) {
418c339a94Sopenharmony_ci    if (type === typedefKeys[i]) {
428c339a94Sopenharmony_ci      return info[type];
438c339a94Sopenharmony_ci    }
448c339a94Sopenharmony_ci  }
458c339a94Sopenharmony_ci  return null;
468c339a94Sopenharmony_ci}
478c339a94Sopenharmony_ci
488c339a94Sopenharmony_ci//tsFuncName
498c339a94Sopenharmony_cifunction generateDirectFunction(params, index, tsFuncName, directFuncPath, hFileName) {
508c339a94Sopenharmony_ci    let funcInfo = {
518c339a94Sopenharmony_ci        'name': '',
528c339a94Sopenharmony_ci        'params': [],
538c339a94Sopenharmony_ci        'retType': '',
548c339a94Sopenharmony_ci    };
558c339a94Sopenharmony_ci
568c339a94Sopenharmony_ci    let funcNameReplace = tsFuncName;
578c339a94Sopenharmony_ci
588c339a94Sopenharmony_ci    // 方法的注册
598c339a94Sopenharmony_ci    let initReplace = genInitFunction(directFuncPath, funcNameReplace);
608c339a94Sopenharmony_ci
618c339a94Sopenharmony_ci    // 分析方法  分析第index个方法
628c339a94Sopenharmony_ci    analyzeFunction(funcInfo, params, index);
638c339a94Sopenharmony_ci
648c339a94Sopenharmony_ci    // 生成
658c339a94Sopenharmony_ci    let paramGenResult = genParamInfo(directFuncPath, funcInfo, params);
668c339a94Sopenharmony_ci
678c339a94Sopenharmony_ci    // 返回值处理  对于对象要使用循环处理
688c339a94Sopenharmony_ci    let retGenResult = '';
698c339a94Sopenharmony_ci    let retObjInfo = {
708c339a94Sopenharmony_ci        'objName': '',
718c339a94Sopenharmony_ci        'flag': false
728c339a94Sopenharmony_ci    };
738c339a94Sopenharmony_ci
748c339a94Sopenharmony_ci    let funcRetOutPath = directFuncPath.cppTempleteDetails.funcBody.funcReturnOut;
758c339a94Sopenharmony_ci    retGenResult = returnTypeC2Js(funcRetOutPath, funcInfo, params, retGenResult, retObjInfo);
768c339a94Sopenharmony_ci
778c339a94Sopenharmony_ci    let { bodyReplace, funcInfoParams } = getReplaceInfo(directFuncPath, funcInfo, funcNameReplace, hFileName);
788c339a94Sopenharmony_ci
798c339a94Sopenharmony_ci    let funcGetParamTempletePath = path.join(__dirname,
808c339a94Sopenharmony_ci      directFuncPath.cppTempleteDetails.funcBody.funcParamIn.funcGetParamTemplete);
818c339a94Sopenharmony_ci    let funcGetParamTemplete = readFile(funcGetParamTempletePath);
828c339a94Sopenharmony_ci    let genParamReplace = getGenParamReplace(funcGetParamTemplete, funcInfo, funcNameReplace, paramGenResult);
838c339a94Sopenharmony_ci    bodyReplace = getBodyReplace2(funcInfo, bodyReplace, genParamReplace);
848c339a94Sopenharmony_ci    if (funcInfo.retType.replace('*', '').trim() !== 'void') {
858c339a94Sopenharmony_ci        let returnType = funcInfo.retType === 'std::string' ? 'const char *' : funcInfo.retType;
868c339a94Sopenharmony_ci        returnType = returnType === 'size_t' ? 'int64_t' : returnType;
878c339a94Sopenharmony_ci        let funcReturnTempletePath = path.join(__dirname, funcRetOutPath.funcReturnTemplete);
888c339a94Sopenharmony_ci        let funcReturnTemplete = readFile(funcReturnTempletePath);
898c339a94Sopenharmony_ci        let funcReturnReplace = replaceAll(funcReturnTemplete, '[return_name]', retObjInfo.objName);
908c339a94Sopenharmony_ci        funcReturnReplace = replaceAll(funcReturnReplace, '[funcName]', funcNameReplace);
918c339a94Sopenharmony_ci        funcReturnReplace = replaceAll(funcReturnReplace, '[return_replace]', retGenResult);
928c339a94Sopenharmony_ci        bodyReplace = replaceAll(bodyReplace, '[func_return_replace]', funcReturnReplace);
938c339a94Sopenharmony_ci    } else {
948c339a94Sopenharmony_ci        bodyReplace = replaceAll(bodyReplace, '[func_return_replace]', '    return NULL;\n');
958c339a94Sopenharmony_ci    }
968c339a94Sopenharmony_ci    bodyReplace = replaceAll(bodyReplace, '[return_replace]', retGenResult);
978c339a94Sopenharmony_ci
988c339a94Sopenharmony_ci    let funcHDeclare = genFuncHDeclare(directFuncPath, funcNameReplace, hFileName, funcInfo, funcInfoParams);
998c339a94Sopenharmony_ci
1008c339a94Sopenharmony_ci    return [funcHDeclare, initReplace, bodyReplace];
1018c339a94Sopenharmony_ci}
1028c339a94Sopenharmony_ci
1038c339a94Sopenharmony_cifunction getReplaceInfo(directFuncPath, funcInfo, funcNameReplace, hFileName) {
1048c339a94Sopenharmony_ci  let funcBodyTempletePath = path.join(__dirname, directFuncPath.cppTempleteDetails.funcBody.funcBodyTemplete);
1058c339a94Sopenharmony_ci  let bodyTemplete = readFile(funcBodyTempletePath);
1068c339a94Sopenharmony_ci  let funcInfoParams = genFuncInfoParams(funcInfo);
1078c339a94Sopenharmony_ci  let bodyReplace = replaceAll(bodyTemplete, '[funcName]', funcNameReplace);
1088c339a94Sopenharmony_ci  bodyReplace = getBodyReplace(bodyReplace, funcNameReplace, hFileName, funcInfo, funcInfoParams);
1098c339a94Sopenharmony_ci  return { bodyReplace, funcInfoParams };
1108c339a94Sopenharmony_ci}
1118c339a94Sopenharmony_ci
1128c339a94Sopenharmony_cifunction getBodyReplace(bodyReplace, funcNameReplace, hFileName, funcInfo, funcInfoParams) {
1138c339a94Sopenharmony_ci  bodyReplace = replaceAll(bodyReplace, '[get_error_msg_tag]', funcNameReplace);
1148c339a94Sopenharmony_ci  bodyReplace = replaceAll(bodyReplace, '[file_introduce_replace]', hFileName);
1158c339a94Sopenharmony_ci  bodyReplace = replaceAll(bodyReplace, '[func_introduce_replace]', funcInfo.name);
1168c339a94Sopenharmony_ci  bodyReplace = replaceAll(bodyReplace, '[input_introduce_replace]', funcInfoParams === '' ? 'void' : funcInfoParams);
1178c339a94Sopenharmony_ci  bodyReplace = replaceAll(bodyReplace, '[output_introduce_replace]', funcInfo.retType);
1188c339a94Sopenharmony_ci  return bodyReplace;
1198c339a94Sopenharmony_ci}
1208c339a94Sopenharmony_ci
1218c339a94Sopenharmony_cifunction getBodyReplace2(funcInfo, bodyReplace, genParamReplace) {
1228c339a94Sopenharmony_ci  if (funcInfo.params.length !== 0) {
1238c339a94Sopenharmony_ci    bodyReplace = replaceAll(bodyReplace, '[func_getParam_replace]', genParamReplace);
1248c339a94Sopenharmony_ci  } else {
1258c339a94Sopenharmony_ci    bodyReplace = replaceAll(bodyReplace, '[func_getParam_replace]', '');
1268c339a94Sopenharmony_ci  }
1278c339a94Sopenharmony_ci  return bodyReplace;
1288c339a94Sopenharmony_ci}
1298c339a94Sopenharmony_ci
1308c339a94Sopenharmony_cifunction getGenParamReplace(funcGetParamTemplete, funcInfo, funcNameReplace, paramGenResult) {
1318c339a94Sopenharmony_ci  let genParamReplace = replaceAll(funcGetParamTemplete, '[param_length]', 'PARAMS' + funcInfo.params.length);
1328c339a94Sopenharmony_ci  genParamReplace = replaceAll(genParamReplace, '[funcName]', funcNameReplace);
1338c339a94Sopenharmony_ci  genParamReplace = replaceAll(genParamReplace, '[getParam_replace]', paramGenResult);
1348c339a94Sopenharmony_ci  return genParamReplace;
1358c339a94Sopenharmony_ci}
1368c339a94Sopenharmony_ci
1378c339a94Sopenharmony_cifunction genFuncInfoParams(funcInfo) {
1388c339a94Sopenharmony_ci  let funcInfoParams = '';
1398c339a94Sopenharmony_ci  let funcInfoParamTemp = '[paramName]: [paramType]; ';
1408c339a94Sopenharmony_ci  for (let i = 0; i < funcInfo.params.length; i++) {
1418c339a94Sopenharmony_ci    let funcInfoParamReplace = replaceAll(funcInfoParamTemp, '[paramName]', funcInfo.params[i].name);
1428c339a94Sopenharmony_ci    funcInfoParamReplace = replaceAll(funcInfoParamReplace, '[paramType]', funcInfo.params[i].type);
1438c339a94Sopenharmony_ci    funcInfoParams += funcInfoParamReplace;
1448c339a94Sopenharmony_ci  }
1458c339a94Sopenharmony_ci  return funcInfoParams;
1468c339a94Sopenharmony_ci}
1478c339a94Sopenharmony_ci
1488c339a94Sopenharmony_cifunction genFuncHDeclare(directFuncPath, funcNameReplace, hFileName, funcInfo, funcInfoParams) {
1498c339a94Sopenharmony_ci  let funcHDeclarePath = path.join(__dirname, directFuncPath.cppTempleteDetails.funcHDeclare.funcHDeclare);
1508c339a94Sopenharmony_ci  let funcHDeclare = readFile(funcHDeclarePath);
1518c339a94Sopenharmony_ci  funcHDeclare = replaceAll(funcHDeclare, '[funcName]', funcNameReplace);
1528c339a94Sopenharmony_ci
1538c339a94Sopenharmony_ci  funcHDeclare = replaceAll(funcHDeclare, '[file_introduce_replace]', hFileName);
1548c339a94Sopenharmony_ci  funcHDeclare = replaceAll(funcHDeclare, '[func_introduce_replace]', funcInfo.name);
1558c339a94Sopenharmony_ci  funcHDeclare = replaceAll(funcHDeclare, '[input_introduce_replace]', funcInfoParams === '' ? 'void' : funcInfoParams);
1568c339a94Sopenharmony_ci  funcHDeclare = replaceAll(funcHDeclare, '[output_introduce_replace]', funcInfo.retType);
1578c339a94Sopenharmony_ci  return funcHDeclare;
1588c339a94Sopenharmony_ci}
1598c339a94Sopenharmony_ci
1608c339a94Sopenharmony_cifunction genParamInfo(directFuncPath, funcInfo, params) {
1618c339a94Sopenharmony_ci  let relativeParamGenPath = directFuncPath.cppTempleteDetails.funcBody.funcParamIn.paramGenTemplete;
1628c339a94Sopenharmony_ci  let paramGenTempletePath = path.join(__dirname, relativeParamGenPath);
1638c339a94Sopenharmony_ci  let paramGenTemplete = readFile(paramGenTempletePath);
1648c339a94Sopenharmony_ci  let funcParamTypePath = directFuncPath.cppTempleteDetails.funcBody.funcParamIn.funcParamType;
1658c339a94Sopenharmony_ci  let paramGenResult = '';
1668c339a94Sopenharmony_ci  // napi 获取参数
1678c339a94Sopenharmony_ci  for (let i = 0; i < funcInfo.params.length; i++) {
1688c339a94Sopenharmony_ci    paramGenResult = getParamJs2C(funcInfo, i, paramGenTemplete, funcParamTypePath, paramGenResult, params);
1698c339a94Sopenharmony_ci  }
1708c339a94Sopenharmony_ci  return paramGenResult;
1718c339a94Sopenharmony_ci}
1728c339a94Sopenharmony_ci
1738c339a94Sopenharmony_cifunction analyzeFunction(funcInfo, params, index) {
1748c339a94Sopenharmony_ci  funcInfo.name = params.functions[index].name;
1758c339a94Sopenharmony_ci  funcInfo.retType = params.functions[index].rtnType;
1768c339a94Sopenharmony_ci  let parseParams = params.functions[index].parameters;
1778c339a94Sopenharmony_ci  for (let i = 0; i < parseParams.length; ++i) {
1788c339a94Sopenharmony_ci    let param = createParam(parseParams[i]);
1798c339a94Sopenharmony_ci    funcInfo.params.push(param);
1808c339a94Sopenharmony_ci  }
1818c339a94Sopenharmony_ci}
1828c339a94Sopenharmony_ci
1838c339a94Sopenharmony_cifunction genInitFunction(directFuncPath, funcNameReplace) {
1848c339a94Sopenharmony_ci  let funcInitPath = path.join(__dirname, directFuncPath.initTempleteDetails.funcInitTemplete);
1858c339a94Sopenharmony_ci  let funcInitTemplete = readFile(funcInitPath);
1868c339a94Sopenharmony_ci  let initReplace = replaceAll(funcInitTemplete, '[func_name_replace]', funcNameReplace);
1878c339a94Sopenharmony_ci  return initReplace;
1888c339a94Sopenharmony_ci}
1898c339a94Sopenharmony_ci
1908c339a94Sopenharmony_cifunction getParamJs2C(funcInfo, i, paramGenTemplete, funcParamTypePath, paramGenResult, params) {
1918c339a94Sopenharmony_ci  let paramType = funcInfo.params[i].type === 'size_t' ? 'int64_t' : funcInfo.params[i].type;
1928c339a94Sopenharmony_ci  // 去除const 和 *
1938c339a94Sopenharmony_ci  paramType = paramType.replace('const', '').replace('*', '').trim();
1948c339a94Sopenharmony_ci  let paramName = funcInfo.params[i].name;
1958c339a94Sopenharmony_ci  let paramGen = replaceAll(paramGenTemplete, '[param_index_replace]', 'PARAMS' + i);
1968c339a94Sopenharmony_ci  paramGen = replaceAll(paramGen, '[param_name_replace]', paramName);
1978c339a94Sopenharmony_ci  if (paramType === 'double') {
1988c339a94Sopenharmony_ci    let getParamPath = path.join(__dirname, funcParamTypePath.double);
1998c339a94Sopenharmony_ci    paramGen = getParamGenCon(getParamPath, i, paramName, paramGen);
2008c339a94Sopenharmony_ci    paramGenResult += paramGen;
2018c339a94Sopenharmony_ci  } else if (paramType === 'uint32_t') {
2028c339a94Sopenharmony_ci    let getParamPath = path.join(__dirname, funcParamTypePath.uint32_t);
2038c339a94Sopenharmony_ci    paramGen = getParamGenCon(getParamPath, i, paramName, paramGen);
2048c339a94Sopenharmony_ci    paramGenResult += paramGen;
2058c339a94Sopenharmony_ci  } else if (paramType === 'int32_t' || paramType === 'int') {
2068c339a94Sopenharmony_ci    let getParamPath = path.join(__dirname, funcParamTypePath.int32_t);
2078c339a94Sopenharmony_ci    paramGen = getParamGenCon(getParamPath, i, paramName, paramGen);
2088c339a94Sopenharmony_ci    paramGenResult += paramGen;
2098c339a94Sopenharmony_ci  } else if (paramType === 'int64_t' || paramType === 'size_t') {
2108c339a94Sopenharmony_ci    let getParamPath = path.join(__dirname, funcParamTypePath.int64_t);
2118c339a94Sopenharmony_ci    paramGen = getParamGenCon(getParamPath, i, paramName, paramGen);
2128c339a94Sopenharmony_ci    paramGenResult += paramGen;
2138c339a94Sopenharmony_ci  } else if (paramType === 'bool') {
2148c339a94Sopenharmony_ci    let getParamPath = path.join(__dirname, funcParamTypePath.bool);
2158c339a94Sopenharmony_ci    paramGen = getParamGenCon(getParamPath, i, paramName, paramGen);
2168c339a94Sopenharmony_ci    paramGenResult += paramGen;
2178c339a94Sopenharmony_ci  } else if (paramType === 'std::string' || paramType.indexOf('char') >= 0) {
2188c339a94Sopenharmony_ci    let getParamPath = path.join(__dirname, funcParamTypePath.string);
2198c339a94Sopenharmony_ci    paramGen = getParamGenCon(getParamPath, i, paramName, paramGen);
2208c339a94Sopenharmony_ci    paramGenResult += paramGen;
2218c339a94Sopenharmony_ci  } else if (analyzeRetIsTypeDef(paramType, params.typedefs)) { // typedefs
2228c339a94Sopenharmony_ci    funcInfo.params[i].type = analyzeRetIsTypeDef(paramType, params.typedefs);
2238c339a94Sopenharmony_ci    paramGenResult = getParamJs2C(funcInfo, i, paramGenTemplete, funcParamTypePath, paramGenResult, params);
2248c339a94Sopenharmony_ci  }
2258c339a94Sopenharmony_ci  // 其他情况,处理成对象 napi_get_cb_info之后不做任何处理
2268c339a94Sopenharmony_ci  return paramGenResult;
2278c339a94Sopenharmony_ci}
2288c339a94Sopenharmony_ci
2298c339a94Sopenharmony_cifunction getParamGenCon(getParamPath, i, paramName, paramGen) {
2308c339a94Sopenharmony_ci  let getParam = readFile(getParamPath);
2318c339a94Sopenharmony_ci  getParam = replaceAll(getParam, '[param_index_replace]', 'PARAMS' + i);
2328c339a94Sopenharmony_ci  getParam = replaceAll(getParam, '[param_name_replace]', paramName);
2338c339a94Sopenharmony_ci  paramGen = replaceAll(paramGen, '[getParam_replace]', getParam);
2348c339a94Sopenharmony_ci  return paramGen;
2358c339a94Sopenharmony_ci}
2368c339a94Sopenharmony_ci
2378c339a94Sopenharmony_cifunction returnTypeC2Js(funcRetOutPath, funcInfo, params, retGenResult, retObjInfo) {
2388c339a94Sopenharmony_ci    let setRetPropertyPath = path.join(__dirname, funcRetOutPath.funcReturnType.returnObj.funcReturnObjectToSet);
2398c339a94Sopenharmony_ci    let setRetProperty = readFile(setRetPropertyPath);
2408c339a94Sopenharmony_ci    let returnName = funcInfo.name;
2418c339a94Sopenharmony_ci    if (!retObjInfo.flag) {
2428c339a94Sopenharmony_ci        retObjInfo.objName = returnName;
2438c339a94Sopenharmony_ci    }
2448c339a94Sopenharmony_ci    if (funcInfo.retType === 'uint32_t') {
2458c339a94Sopenharmony_ci        let funcReturnTypePath = path.join(__dirname, funcRetOutPath.funcReturnType.uint32_t);
2468c339a94Sopenharmony_ci        retGenResult = getRetTypeContent(funcReturnTypePath, returnName, retGenResult, retObjInfo, setRetProperty);
2478c339a94Sopenharmony_ci    } else if (funcInfo.retType === 'double') {
2488c339a94Sopenharmony_ci        let funcReturnTypePath = path.join(__dirname, funcRetOutPath.funcReturnType.double);
2498c339a94Sopenharmony_ci        retGenResult = getRetTypeContent(funcReturnTypePath, returnName, retGenResult, retObjInfo, setRetProperty);
2508c339a94Sopenharmony_ci    } else if (funcInfo.retType === 'int32_t' || funcInfo.retType === 'int') {
2518c339a94Sopenharmony_ci        let funcReturnTypePath = path.join(__dirname, funcRetOutPath.funcReturnType.int32_t);
2528c339a94Sopenharmony_ci        retGenResult = getRetTypeContent(funcReturnTypePath, returnName, retGenResult, retObjInfo, setRetProperty);
2538c339a94Sopenharmony_ci    } else if (funcInfo.retType === 'int64_t' || funcInfo.retType === 'size_t') {
2548c339a94Sopenharmony_ci        let funcReturnTypePath = path.join(__dirname, funcRetOutPath.funcReturnType.int64_t);
2558c339a94Sopenharmony_ci        retGenResult = getRetTypeContent(funcReturnTypePath, returnName, retGenResult, retObjInfo, setRetProperty);
2568c339a94Sopenharmony_ci    } else if (funcInfo.retType === 'bool') {
2578c339a94Sopenharmony_ci        let funcReturnTypePath = path.join(__dirname, funcRetOutPath.funcReturnType.bool);
2588c339a94Sopenharmony_ci        retGenResult = getRetTypeContent(funcReturnTypePath, returnName, retGenResult, retObjInfo, setRetProperty);
2598c339a94Sopenharmony_ci    } else if (funcInfo.retType === 'std::string' || funcInfo.retType.substring(0, 10) === 'const char' ||
2608c339a94Sopenharmony_ci          funcInfo.retType === 'char *') {
2618c339a94Sopenharmony_ci        let funcReturnTypePath = path.join(__dirname, funcRetOutPath.funcReturnType.string);
2628c339a94Sopenharmony_ci        retGenResult = getRetTypeContent(funcReturnTypePath, returnName, retGenResult, retObjInfo, setRetProperty);
2638c339a94Sopenharmony_ci    } else if (analyzeRetIsObject(funcInfo.retType, params.classes)) { // 返回值是对象
2648c339a94Sopenharmony_ci        if (!retObjInfo.flag) {
2658c339a94Sopenharmony_ci            retGenResult = getObjRetContent(funcRetOutPath, retGenResult, returnName);
2668c339a94Sopenharmony_ci            retObjInfo.flag = true;
2678c339a94Sopenharmony_ci            let objectProperty = getObjectProperty(funcInfo, params);
2688c339a94Sopenharmony_ci            // 遍历属性
2698c339a94Sopenharmony_ci            for (let i = 0; i < objectProperty.length; i++) {
2708c339a94Sopenharmony_ci                let testRes = returnTypeC2Js(funcRetOutPath, objectProperty[i], params, retGenResult, retObjInfo);
2718c339a94Sopenharmony_ci                retGenResult = testRes;
2728c339a94Sopenharmony_ci            }
2738c339a94Sopenharmony_ci        } else {
2748c339a94Sopenharmony_ci            retGenResult = getObjRetGenResult(retObjInfo, retGenResult, funcRetOutPath, returnName, setRetPropertyPath);
2758c339a94Sopenharmony_ci        }
2768c339a94Sopenharmony_ci    } else if (analyzeRetIsTypeDef(funcInfo.retType, params.typedefs)) { // typedefs
2778c339a94Sopenharmony_ci      funcInfo.retType = analyzeRetIsTypeDef(funcInfo.retType, params.typedefs);
2788c339a94Sopenharmony_ci      retGenResult = returnTypeC2Js(funcRetOutPath, funcInfo, params, retGenResult, retObjInfo);
2798c339a94Sopenharmony_ci    }
2808c339a94Sopenharmony_ci    return retGenResult;
2818c339a94Sopenharmony_ci}
2828c339a94Sopenharmony_ci
2838c339a94Sopenharmony_cifunction getObjectProperty(funcInfo, params) {
2848c339a94Sopenharmony_ci  let retType = funcInfo.retType.replace('*', '').trim();
2858c339a94Sopenharmony_ci  let objectName = '';
2868c339a94Sopenharmony_ci  let objectProperty = [];
2878c339a94Sopenharmony_ci
2888c339a94Sopenharmony_ci  let myObject = params.classes[retType];
2898c339a94Sopenharmony_ci  objectName = myObject.bare_name;
2908c339a94Sopenharmony_ci  let myObjectProperty = myObject.properties.public;
2918c339a94Sopenharmony_ci  for (let j = 0; j < myObjectProperty.length; j++) {
2928c339a94Sopenharmony_ci    let propertyObj = {
2938c339a94Sopenharmony_ci      'name': '',
2948c339a94Sopenharmony_ci      'retType': ''
2958c339a94Sopenharmony_ci    };
2968c339a94Sopenharmony_ci    propertyObj.name = myObjectProperty[j].name;
2978c339a94Sopenharmony_ci    propertyObj.retType = myObjectProperty[j].type;
2988c339a94Sopenharmony_ci
2998c339a94Sopenharmony_ci    objectProperty.push(propertyObj);
3008c339a94Sopenharmony_ci  }
3018c339a94Sopenharmony_ci  return objectProperty;
3028c339a94Sopenharmony_ci}
3038c339a94Sopenharmony_ci
3048c339a94Sopenharmony_cifunction getObjRetGenResult(retObjInfo, retGenResult, funcRetOutPath, returnName, setRetPropertyPath) {
3058c339a94Sopenharmony_ci  if (retObjInfo.objName !== '') {
3068c339a94Sopenharmony_ci    retGenResult = getObjRetContent(funcRetOutPath, retGenResult, returnName);
3078c339a94Sopenharmony_ci    let setRetPropertyObj = readFile(setRetPropertyPath);
3088c339a94Sopenharmony_ci    setRetPropertyObj = replaceAll(setRetPropertyObj, '[set_objname_replace]', retObjInfo.objName);
3098c339a94Sopenharmony_ci    setRetPropertyObj = replaceAll(setRetPropertyObj, '[set_propname_replace]', returnName);
3108c339a94Sopenharmony_ci    setRetPropertyObj = replaceAll(setRetPropertyObj, '[set_propvalue_replace]', returnName);
3118c339a94Sopenharmony_ci    retGenResult += setRetPropertyObj;
3128c339a94Sopenharmony_ci  }
3138c339a94Sopenharmony_ci  return retGenResult;
3148c339a94Sopenharmony_ci}
3158c339a94Sopenharmony_ci
3168c339a94Sopenharmony_cifunction getObjRetContent(funcRetOutPath, retGenResult, returnName) {
3178c339a94Sopenharmony_ci  let funcReturnTypePath = path.join(__dirname, funcRetOutPath.funcReturnType.returnObj.object);
3188c339a94Sopenharmony_ci  let funcReturnType = readFile(funcReturnTypePath);
3198c339a94Sopenharmony_ci  retGenResult += replaceAll(funcReturnType, '[return_name_replace]', returnName);
3208c339a94Sopenharmony_ci  return retGenResult;
3218c339a94Sopenharmony_ci}
3228c339a94Sopenharmony_ci
3238c339a94Sopenharmony_cifunction getRetTypeContent(funcReturnTypePath, returnName, retGenResult, retObjInfo, setRetProperty) {
3248c339a94Sopenharmony_ci  let funcReturnType = readFile(funcReturnTypePath);
3258c339a94Sopenharmony_ci  funcReturnType = replaceAll(funcReturnType, '[return_name_replace]', returnName);
3268c339a94Sopenharmony_ci  retGenResult += funcReturnType;
3278c339a94Sopenharmony_ci  if (retObjInfo.flag) {
3288c339a94Sopenharmony_ci    setRetProperty = replaceAll(setRetProperty, '[set_objname_replace]', retObjInfo.objName);
3298c339a94Sopenharmony_ci    setRetProperty = replaceAll(setRetProperty, '[set_propname_replace]', returnName);
3308c339a94Sopenharmony_ci    setRetProperty = replaceAll(setRetProperty, '[set_propvalue_replace]', returnName);
3318c339a94Sopenharmony_ci    retGenResult += setRetProperty;
3328c339a94Sopenharmony_ci  }
3338c339a94Sopenharmony_ci  return retGenResult;
3348c339a94Sopenharmony_ci}
3358c339a94Sopenharmony_ci
3368c339a94Sopenharmony_cifunction replaceAll(s, sfrom, sto) {
3378c339a94Sopenharmony_ci    while (s.indexOf(sfrom) >= 0) {
3388c339a94Sopenharmony_ci        s = s.replace(sfrom, sto);
3398c339a94Sopenharmony_ci    }
3408c339a94Sopenharmony_ci    return s;
3418c339a94Sopenharmony_ci}
3428c339a94Sopenharmony_ci
3438c339a94Sopenharmony_cifunction createParam(parseParamInfo) {
3448c339a94Sopenharmony_ci    let param = {
3458c339a94Sopenharmony_ci        'name': '',
3468c339a94Sopenharmony_ci        'type': ''
3478c339a94Sopenharmony_ci    };
3488c339a94Sopenharmony_ci    param.name = parseParamInfo.name;
3498c339a94Sopenharmony_ci    param.type = parseParamInfo.type;
3508c339a94Sopenharmony_ci    return param;
3518c339a94Sopenharmony_ci}
3528c339a94Sopenharmony_ci
3538c339a94Sopenharmony_cimodule.exports = {
3548c339a94Sopenharmony_ci    generateDirectFunction
3558c339a94Sopenharmony_ci};