1/* 2* Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development 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*/ 15const { replaceAll, getPrefix, getConstNum } = require("../tools/tool"); 16const { paramGenerate } = require("./param_generate"); 17const { returnGenerate } = require("./return_generate"); 18 19/** 20 * 结果通过同步回调(CallBack)返回 21 */ 22let funcSyncTemplete = ` 23struct [funcName]_value_struct {[valueIn][valueOut] 24}; 25 26[static_define]napi_value [funcName]_middle(napi_env env, napi_callback_info info) 27{ 28 XNapiTool *pxt = std::make_unique<XNapiTool>(env, info).release(); 29 if (pxt->IsFailed()) { 30 napi_value err = pxt->GetError(); 31 delete pxt; 32 return err; 33 } 34 [unwarp_instance] 35 struct [funcName]_value_struct *vio = new [funcName]_value_struct(); 36 [valueCheckout][optionalCallbackInit] 37 [callFunc] 38 napi_value result = nullptr; 39 if (pxt->GetArgc() > [callback_param_offset]) { 40 [valuePackage] 41 { 42 napi_value args[1] = {result}; 43 pxt->SyncCallBack(pxt->GetArgv([callback_param_offset]), XNapiTool::ONE, args); 44 } 45 } 46 result = pxt->UndefinedValue(); 47 [optionalParamDestory] 48 delete vio; 49 if (pxt->IsFailed()) { 50 result = pxt->GetError(); 51 } 52 delete pxt; // release 53 return result; 54}` 55 56let cppTemplate = ` 57bool %s%s(%s) 58{ 59 return true; 60} 61` 62 63function removeEndlineEnter(value) { 64 for (var i = value.length; i > 0; i--) { 65 let len = value.length 66 if (value.substring(len - 1, len) == "\n" || value.substring(len - 1, len) == ' ') { 67 value = value.substring(0, len - 1) 68 } else { 69 value = ' ' + value + "\n" 70 break 71 } 72 } 73 return value 74} 75 76function getOptionalCallbackInit(param) { 77 if (!param.callback.optional) { 78 return "" 79 } 80 let cType = param.valueOut.substr(0, param.valueOut.indexOf("*")) 81 return "if (pxt->GetArgc() > %s) {\n vio->out = new %s;\n }" 82 .format(getConstNum(param.callback.offset), cType) 83} 84 85function generateFunctionSync(func, data, className) { 86 let middleFunc = replaceAll(funcSyncTemplete, "[funcName]", func.name) 87 if (className == null) { 88 middleFunc = middleFunc.replaceAll("[static_define]", "") 89 middleFunc = middleFunc.replaceAll("[unwarp_instance]", "") 90 } 91 else { 92 middleFunc = middleFunc.replaceAll("[static_define]", "static ") 93 middleFunc = middleFunc.replaceAll("[unwarp_instance]", 94 `void *instPtr = pxt->UnWarpInstance(); 95 %s *pInstance = static_cast<%s *>(instPtr);`.format(className, className)) 96 } 97 // 定义输入,定义输出,解析,填充到函数内,输出参数打包,impl参数定义,可选参数内存释放 98 let param = { valueIn: "", valueOut: "", valueCheckout: "", valueFill: "", 99 valuePackage: "", valueDefine: "", optionalParamDestory: "" } 100 101 for (let i in func.value) { 102 paramGenerate(i, func.value[i], param, data) 103 } 104 returnGenerate(param.callback, param) 105 106 middleFunc = replaceAll(middleFunc, "[valueIn]", param.valueIn) // # 输入参数定义 107 if (param.valueOut == "") { 108 middleFunc = replaceAll(middleFunc, "[valueOut]", param.valueOut) // # 输出参数定义 109 } else { 110 middleFunc = replaceAll(middleFunc, "[valueOut]", "\n " + param.valueOut) // # 输出参数定义 111 } 112 if (param.valueCheckout == "") { 113 middleFunc = replaceAll(middleFunc, "[valueCheckout]", param.valueCheckout) // # 输入参数解析 114 } else { 115 param.valueCheckout = removeEndlineEnter(param.valueCheckout) 116 middleFunc = replaceAll(middleFunc, "[valueCheckout]", param.valueCheckout) // # 输入参数解析 117 } 118 let callFunc = "%s%s(%s);".format(className == null ? "" : "pInstance->", func.name, param.valueFill) 119 middleFunc = replaceAll(middleFunc, "[callFunc]", callFunc) // 执行 120 let optionalCallback = getOptionalCallbackInit(param) 121 middleFunc = replaceAll(middleFunc, "[optionalCallbackInit]", optionalCallback) // 可选callback参数初始化 122 middleFunc = replaceAll(middleFunc, "[valuePackage]", param.valuePackage) // 输出参数打包 123 middleFunc = replaceAll(middleFunc, "[optionalParamDestory]", param.optionalParamDestory) // 可选参数内存释放 124 middleFunc = middleFunc.replaceAll("[callback_param_offset]", param.callback.offset); // 呼叫回调 125 126 let prefixArr = getPrefix(data, func) 127 let implH = "" 128 let implCpp = "" 129 if (!func.isParentMember) { 130 // 只有类/接口自己的成员方法需要在.h.cpp中生成,父类/父接口不需要 131 implH = "\n%s%s%sbool %s(%s)%s;".format( 132 prefixArr[0], prefixArr[1], prefixArr[2], func.name, param.valueDefine, prefixArr[3]) 133 implCpp = cppTemplate.format(className == null ? "" : className + "::", func.name, param.valueDefine) 134 } 135 return [middleFunc, implH, implCpp] 136} 137 138module.exports = { 139 generateFunctionSync 140}