• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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}