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 } = 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] 24 25 [valueOut] 26}; 27 28[static_define]napi_value [funcName]_middle(napi_env env, napi_callback_info info) 29{ 30 XNapiTool *pxt = std::make_unique<XNapiTool>(env, info).release(); 31 if (pxt->IsFailed()) { 32 napi_value err = pxt->GetError(); 33 delete pxt; 34 return err; 35 } 36 [unwarp_instance] 37 38 struct [funcName]_value_struct *vio = new [funcName]_value_struct(); 39 40 [valueCheckout] 41 42 [optionalCallbackInit] 43 [callFunc] 44 45 napi_value result = nullptr; 46 if (pxt->GetArgc() > [callback_param_offset]) { 47 [valuePackage] 48 49 { 50 napi_value args[1] = {result}; 51 pxt->SyncCallBack(pxt->GetArgv([callback_param_offset]), 1, args); 52 } 53 } 54 result = pxt->UndefinedValue(); 55 56 [optionalParamDestory] 57 delete vio; 58 if (pxt->IsFailed()) { 59 result = pxt->GetError(); 60 } 61 delete pxt; // release 62 return result; 63}` 64 65let cppTemplate = ` 66bool %s%s(%s) 67{ 68 return true; 69} 70` 71 72function getOptionalCallbackInit(param) { 73 if (!param.callback.optional) { 74 return "" 75 } 76 let cType = param.valueOut.substr(0, param.valueOut.indexOf("*")) 77 return "if (pxt->GetArgc() > %s) {\n vio->out = new %s;\n }".format(param.callback.offset, cType) 78} 79 80function generateFunctionSync(func, data, className) { 81 let middleFunc = replaceAll(funcSyncTemplete, "[funcName]", func.name) 82 if (className == null) { 83 middleFunc = middleFunc.replaceAll("[static_define]", "") 84 middleFunc = middleFunc.replaceAll("[unwarp_instance]", "") 85 } 86 else { 87 middleFunc = middleFunc.replaceAll("[static_define]", "static ") 88 middleFunc = middleFunc.replaceAll("[unwarp_instance]", 89 "%s *pInstance = (%s *)pxt->UnWarpInstance();".format(className, className)) 90 } 91 let param = { 92 valueIn: "",//定义输入 93 valueOut: "",//定义输出 94 valueCheckout: "",//解析 95 valueFill: "",//填充到函数内 96 valuePackage: "",//输出参数打包 97 valueDefine: "",//impl参数定义 98 optionalParamDestory: ""//可选参数内存释放 99 } 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 middleFunc = replaceAll(middleFunc, "[valueOut]", param.valueOut)// # 输出参数定义 108 middleFunc = replaceAll(middleFunc, "[valueCheckout]", param.valueCheckout)// # 输入参数解析 109 let callFunc = "%s%s(%s);".format(className == null ? "" : "pInstance->", func.name, param.valueFill) 110 middleFunc = replaceAll(middleFunc, "[callFunc]", callFunc)//执行 111 let optionalCallback = getOptionalCallbackInit(param) 112 middleFunc = replaceAll(middleFunc, "[optionalCallbackInit]", optionalCallback)//可选callback参数初始化 113 middleFunc = replaceAll(middleFunc, "[valuePackage]", param.valuePackage)//输出参数打包 114 middleFunc = replaceAll(middleFunc, "[optionalParamDestory]", param.optionalParamDestory)//可选参数内存释放 115 middleFunc = middleFunc.replaceAll("[callback_param_offset]", param.callback.offset);//呼叫回调 116 117 let prefixArr = getPrefix(data, func.isStatic) 118 let implH = "" 119 let implCpp = "" 120 if (!func.isParentMember) { 121 // 只有类/接口自己的成员方法需要在.h.cpp中生成,父类/父接口不需要 122 implH = "\n%s%s%sbool %s(%s);".format( 123 prefixArr[0], prefixArr[1], prefixArr[2], func.name, param.valueDefine) 124 implCpp = cppTemplate.format(className == null ? "" : className + "::", func.name, param.valueDefine) 125 } 126 return [middleFunc, implH, implCpp] 127} 128 129module.exports = { 130 generateFunctionSync 131}