• 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, 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}