• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2* Copyright (c) 2024 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*/
15
16// h2sa
17export let proxyFuncTemplate = `[retType] [serviceName]Proxy::[funcName]([params])
18{
19    int retCode;
20    MessageParcel data, reply;
21    MessageOption option;
22    data.WriteInterfaceToken(GetDescriptor());
23    [writeData]
24    retCode = Remote()->SendRequest([funcEnum], data, reply, option);
25    retCode = reply.ReadInt32();
26    if (retCode != ERR_OK) {
27      // Todo 错误处理
28    }
29
30    [readReply]
31}\n\n`;
32
33export let stubInnerFuncTemplate = `ErrCode [serviceName]Stub::[funcName]Inner(MessageParcel &data, MessageParcel &reply)
34{
35    int retCode = ERR_OK;
36    [readData]
37    [writeReply]
38    return retCode;
39}
40`;
41
42export let serviceFuncImplTemplate = `[retType] [serviceName]Service::[funcName]([params])
43{
44    [retType] ret = [initRetvalue];
45    // TODO: Invoke the business implementation
46    return ret;
47}
48`;
49
50
51// h2hdf
52export let hdiServiceFuncTemplate = `int32_t [marcoName]InterfaceService::[functionName]([params])
53{
54    // [hdf-gen] TODO: Invoke the business implementation
55    return HDF_SUCCESS;
56}
57`;
58
59// h2dtscpp
60
61// dts template
62export let dtsFuncTemplate = `/* [NAPI_GEN]:对应[file_introduce_replace]中:[func_introduce_replace]方法的dts接口
63* 输入: [input_introduce_replace]
64* 输出: [func_return_replace]
65*/
66export const [func_name_replace]:([func_param_replace]) => [func_return_replace];
67`
68
69// napi方法的初始化
70export let napiFuncInitTemplate = `// [NAPI_GEN]:方法注册后,js方法与native方法映射
71{ "[func_name_replace]" , nullptr, [func_name_replace], nullptr, nullptr, nullptr, napi_default, nullptr },
72`;
73
74// napi方法定义
75export let napiFuncHTemplate = `/* [NAPI_GEN]:对应[file_introduce_replace]中:[func_name_replace]的napi方法,
76* 输入:[input_introduce_replace]
77* 输出:[func_return_replace]
78*/
79napi_value [func_name_replace](napi_env env, napi_callback_info info);
80`;
81
82// napi方法体实现
83export let napiFuncCppTemplate = `/* [NAPI_GEN]:对应[file_introduce_replace]中:[func_name_replace]的napi方法,
84* 输入:[input_introduce_replace]
85* 输出:[output_introduce_replace]
86*/
87napi_value [func_name_replace](napi_env env, napi_callback_info info)
88{
89  OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "[func_name_replace]", "[func_name_replace] begins");
90  napi_status status;
91  /* [NAPI_GEN]: Node.js在其N-API中用来提供错误的扩展信息的结构体,结构体包含以下字段
92   * error_message: 一个指向错误详细字符串的指针,提供了关于错误的文本描述
93   * engin_reserved: 一个保留给Js引擎使用的指针
94   * error_code: 错误码,指示了错误的种类,比如napi_pending_exception表示有一个JavaScript异常未被清理。
95   * engine_error_code:一个引擎特定的错误码,为引擎实现保留,具体含义依赖于使用的JavaScript引擎。
96   * error_message_len:错误消息字符串的长度。
97   */
98  const napi_extended_error_info *extended_error_info;
99  /* [NAPI_GEN]: tag: 日志打印标签*/
100  const char *tag = "[[get_error_msg_tag]]";
101  /* [NAPI_GEN]: get function param in*/
102  [func_getParam_replace]
103  OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "[func_name_replace]", "[func_name_replace] get return info begins");
104  [func_return_replace]
105}
106
107`;
108
109// napi方法返回值处理
110export let napiFuncRetTemplate = `// Todo: add business logic. 在这前后代码为框架所生成
111
112/* [NAPI_GEN]: function return value*/
113[return_replace]
114OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "[func_name_replace]", "[func_name_replace] get return info ends");
115OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "[func_name_replace]", "[func_name_replace] ends");
116return [return_name]Out;
117`;
118
119// napi方法返回值各种类型模板
120export let uint32tRet =  `napi_value [return_name_replace]Out;
121/* [NAPI_GEN]: 返回值是uint32_t类型时,napi_create_uint32创建一个包含32位无符号整数(uint32_t)的js数值对象
122 * env: 当前环境的句柄
123 * value: 要转换成js数值的uint32_t值,这里以传入1为例,用例新增业务代码时可根据自身需求修改
124 * result: 指向napi_value的指针,函数执行成功后这个指针将指向新创建的js数值对象
125 */
126status = napi_create_uint32(env, 1, &[return_name_replace]Out);
127if (status != napi_ok) {
128    /*错误处理*/
129    getErrMessage(status, env, extended_error_info, "napi_create_uint32", tag);
130    return nullptr;
131}
132`;
133
134export let stringRet =  `napi_value [return_name_replace]Out;
135/* [NAPI_GEN]: 返回值是字符串时,napi_create_string_utf8用于在原生代码中创建一个新的js字符串。这个函数会根据提供的UTF-8编码的字符串创建一个等价的js字符串
136 * env: 当前环境的句柄
137 * str: 指向以null结尾的UTF-8编码的C字符串的指针,这里以"[return_name_replace]"举例,用户可根据需求修改
138 * length: 字符串的长度,可以是具体的字节数,或者使用特殊的值NAPI_AUTO_LENGTH来让函数自己计算长度(假定字符串以null结尾)
139 * result: 指向napi_value的指针,函数执行成功后这个指针将指向新创建的js字符串
140 */
141status = napi_create_string_utf8(env, "[return_name_replace]", NAPI_AUTO_LENGTH, &[return_name_replace]Out);
142if (status != napi_ok) {
143    /*错误处理*/
144    getErrMessage(status, env, extended_error_info, "napi_create_string_utf8", tag);
145    return nullptr;
146}
147`;
148
149export let stringRetUtf16 =  `napi_value [return_name_replace]Out;
150/* [NAPI_GEN]: 返回值是字符串时,napi_create_string_utf16用于在原生代码中创建一个新的js字符串。这个函数会根据提供的UTF-16编码的字符串创建一个等价的js字符串
151 * env: 当前环境的句柄
152 * str: 指向以null结尾的UTF-8编码的C字符串的指针,这里以"[return_name_replace]"举例,用户可根据需求修改
153 * length: 字符串的长度,可以是具体的字节数,或者使用特殊的值NAPI_AUTO_LENGTH来让函数自己计算长度(假定字符串以null结尾)
154 * result: 指向napi_value的指针,函数执行成功后这个指针将指向新创建的js字符串
155 */
156status = napi_create_string_utf16(env, u"[return_name_replace]", NAPI_AUTO_LENGTH, &[return_name_replace]Out);
157if (status != napi_ok) {
158    /*错误处理*/
159    getErrMessage(status, env, extended_error_info, "napi_create_string_utf16", tag);
160    return nullptr;
161}
162`;
163
164export let int64tRet =  ` napi_value [return_name_replace]Out;
165/* [NAPI_GEN]: 返回值是int64类型时,napi_create_int64创建一个包含64位整数(int64_t)的js数值对象
166 * env: 当前环境的句柄
167 * value: 要转换成js数值的int64_t值,这里以传入1为例,用例新增业务代码时可根据自身需求修改
168 * result: 指向napi_value的指针,函数执行成功后这个指针将指向新创建的js数值对象
169 */
170status = napi_create_int64(env, 1, &[return_name_replace]Out);
171if (status != napi_ok) {
172    getErrMessage(status, env, extended_error_info, "napi_create_int64", tag);
173    return nullptr;
174}
175`;
176
177export let int32tRet =  `napi_value [return_name_replace]Out;
178/* [NAPI_GEN]: 返回值是int32_t类型时,napi_create_int32 创建一个包含32位整数(int32_t)的js数值(Number)对象
179 * env: 当前环境的句柄
180 * value: 要准换成js数值的int32_t的值,这里以传入1为例,用例新增业务代码时可根据自身需求修改
181 * result: 指向napi_value的指针,这个指针会被设置为新创建的js数值对象
182 */
183status = napi_create_int32(env, 1, &[return_name_replace]Out);
184if (status != napi_ok) {
185    getErrMessage(status, env, extended_error_info, "napi_create_int32", tag);
186    return nullptr;
187}
188`;
189
190export let doubleRet =  `napi_value [return_name_replace]Out;
191/* [NAPI_GEN]: 返回值是double类型时,napi_create_double 创建一个包含双精度浮点数的js数值(Number)对象
192 * env: 当前环境的句柄
193 * value: 要传递给js的双精度浮点数值,这里以传入1.0为例,用例新增业务代码时可根据自身需求修改
194 * result: 指向napi_value的指针,这个指针会被设置为新创建的js数值对象
195 */
196status = napi_create_double(env, 1.0, &[return_name_replace]Out);
197if (status != napi_ok) {
198    getErrMessage(status, env, extended_error_info, "napi_create_double", tag);
199    return nullptr;
200}
201`;
202
203export let boolRet =  `napi_value [return_name_replace]Out;
204/* [NAPI_GEN]: 返回值是bool类型时,napi_get_boolean创建一个表示布尔值的js Boolean对象
205 * env: 当前环境的句柄
206 * value: 希望表示的布尔值(C中的true或者false),这里以传入true为例,用例新增业务代码时可根据自身需求修改
207 * result: 函数返回一个napi_value,它是对应于js Boolean对象的C语言表示
208 */
209status = napi_get_boolean(env, true, &[return_name_replace]Out);
210if (status != napi_ok) {
211    getErrMessage(status, env, extended_error_info, "napi_get_boolean", tag);
212    return nullptr;
213}
214`;
215
216export let objectRet =  `napi_value [return_name_replace]Out;
217/* [NAPI_GEN]: 返回值是对象时,需要使用napi_create_object创建一个js的对象与js代码交互
218 * env: 当前环境的句柄
219 * result: 一个napi_value的指针,该指针将被设置为新创建的js对象
220 */
221status = napi_create_object(env, &[return_name_replace]Out);
222if (status != napi_ok) {
223    getErrMessage(status, env, extended_error_info, "napi_create_object", tag);
224    return nullptr;
225}
226`;
227
228export let objectTosetRet =  `/* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
229* env: 当前环境的句柄
230* object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
231* utf8name: 属性的名称,是一个以UTF-8编码的字符串
232* value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
233*/
234status = napi_set_named_property(env, [set_objname_replace]Out, "[set_propname_replace]", [set_propvalue_replace]Out);
235if (status != napi_ok) {
236   /* [NAPI_GEN]: 错误处理*/
237   getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
238   return nullptr;
239}
240`;
241
242export let promiseRet =  `napi_value [return_name_replace]Out;
243napi_deferred [return_name_replace]DeferedOut;
244/* [NAPI_GEN]: 创建一个空的promise对象
245 * env: N-API环境的句柄,表示当前的上下文
246 * promise: 用于接收创建的promise对象的指针
247 * deferred: 用于接收deferred对象的指针
248*/
249status = napi_create_promise(env, &[return_name_replace]Out, &[return_name_replace]DeferedOut);
250if (status != napi_ok) {
251   /* [NAPI_GEN]: 错误处理*/
252   getErrMessage(status, env, extended_error_info, "napi_create_promise", tag);
253   return nullptr;
254}
255// Todo: create async work here.
256`;
257
258
259// napi func的paramGen template
260export let paramGenTemplate = `napi_valuetype valuetype[param_name_replace];
261/* [NAPI_GEN]: 获取入参类型,第[param_index_replace]个入参
262 * env: N-API环境的句柄,表示当前的上下文
263 * value: 要检查类型的js值
264 * result: 是一个指针,指向napi_valuetype枚举的值,函数会将结果存储在这里
265 */
266status = napi_typeof(env, args[[param_index_replace]], &valuetype[param_name_replace]);
267if (status != napi_ok) {
268    getErrMessage(status, env, extended_error_info, "napi_typeof", tag);
269    return nullptr;
270}
271[getParam_replace]
272`;
273
274export let funcGetParamTemplate = `    /* [NAPI_GEN]: argc:js传入的参数个数 */
275size_t argc = [param_length];
276/* [NAPI_GEN]: args: 一个数组,保存js传入的参数 */
277napi_value args[[param_length]] = {nullptr};
278/* [NAPI_GEN]: napi_get_cb_info用于获取JS调用该函数时所传递的参数、接收参数的个数以及'this'的值
279 * env: 当前环境的句柄,代表当前的Node.js环境
280 * info: 回调信息句柄,代表当前回调的上下文
281 * argc: 指向size_t的指针,最初应包含可接受的最大参数数量,函数返回时,它将包含实际传递的参数数量
282 * args: 一个足够大的数组,用于接收传递给回调函数的所有js参数。数组的大小应至少与argc传入的值一样大。
283 * this_arg: 如果不是NULL,则返回js回调中this的值
284 * data: 如果不是NULL,则返回与回调函数关联的任何可选数据。通常用于传递在创建函数时指定的静态数据
285 */
286status = napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
287if(status != napi_ok) {
288    /* [NAPI_GEN]: 错误处理*/
289    getErrMessage(status, env,extended_error_info, "napi_get_cb_info", tag);
290    return nullptr;
291}
292/* [NAPI_GEN]: 从args数组中获取入参 */
293OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "[func_name_replace]", "[func_name_replace] get param info begins");
294[getAllParam_replace]
295OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "[func_name_replace]", "[func_name_replace] get param info ends");
296`;
297
298export let uint32tIn =  `uint32_t [param_name_replace]In = 0;
299/* [NAPI_GEN]: napi_get_value_uint32将一个napi_value类型的js布尔值转换成一个C语言的uint32_t类型的数值,第[param_index_replace]个入参
300 * env: N-API环境的句柄,表示当前的上下文
301 * value:要转换的JavaScript值
302 * result:指向 uint32_t 类型的指针,在这里函数将存储转换后的无符号整数
303 */
304status = napi_get_value_uint32(env, args[[param_index_replace]], &[param_name_replace]In);
305if (status != napi_ok) {
306    getErrMessage(status, env, extended_error_info, "napi_get_value_uint32", tag);
307    return nullptr;
308}
309`;
310
311export let stringIn =  `size_t strSize[param_index_replace] = 0;
312/* [NAPI_GEN]: napi_get_value_string_utf8用于将Js字符串转换为UTF-8编码的C字符串
313 * env: N-API环境的句柄,表示当前的上下文
314 * value: 要转换的JavaScript字符串
315 * buf: 用于存储结果的字符数组的指针
316 * bufsize: 缓冲区大小,以字节为单位
317 * result: 转换后的字符串的字节长度(不包括空终止符)。若干buf是NULL,则返回所需的缓冲区大小(包括空终止符)
318 */
319/* [NAPI_GEN]: buf参数是NULL时,用于获取所需缓冲区大小*/
320status = napi_get_value_string_utf8(env, args[[param_index_replace]], NULL, 0, &strSize[param_index_replace]);
321if (status != napi_ok) {
322    getErrMessage(status, env, extended_error_info, "get value string", tag);
323    return nullptr;
324}
325char *[param_name_replace]In = new char[strSize[param_index_replace] + 1];
326/* [NAPI_GEN]: 用于获取字符串*/
327status = napi_get_value_string_utf8(env, args[[param_index_replace]], [param_name_replace]In, strSize[param_index_replace] + 1, &strSize[param_index_replace]);
328if (status != napi_ok) {
329    getErrMessage(status, env, extended_error_info, "get value string", tag);
330    delete[] [param_name_replace]In;
331    return nullptr;
332}
333// delete[] [param_name_replace]In;  // remember to delete memory
334`;
335
336export let stringInUtf16 =  `size_t strSize[param_index_replace] = 0;
337/* [NAPI_GEN]: napi_get_value_string_utf16用于将Js字符串转换为UTF-16编码的C字符串
338 * env: N-API环境的句柄,表示当前的上下文
339 * value: 要转换的JavaScript字符串
340 * buf: 用于存储结果的字符数组的指针
341 * bufsize: 缓冲区大小,以字节为单位
342 * result: 转换后的字符串的字节长度(不包括空终止符)。若干buf是NULL,则返回所需的缓冲区大小(包括空终止符)
343 */
344/* [NAPI_GEN]: buf参数是NULL时,用于获取所需缓冲区大小*/
345status = napi_get_value_string_utf16(env, args[[param_index_replace]], NULL, 0, &strSize[param_index_replace]);
346if (status != napi_ok) {
347    getErrMessage(status, env, extended_error_info, "get value string", tag);
348    return nullptr;
349}
350char16_t *[param_name_replace]In = new char16_t[strSize[param_index_replace] + 1];
351/* [NAPI_GEN]: 用于获取字符串*/
352status = napi_get_value_string_utf16(env, args[[param_index_replace]], [param_name_replace]In, strSize[param_index_replace] + 1, &strSize[param_index_replace]);
353if (status != napi_ok) {
354    getErrMessage(status, env, extended_error_info, "get value string", tag);
355    delete[] [param_name_replace]In;
356    return nullptr;
357}
358// delete[] [param_name_replace]In;  // remember to delete memory
359`;
360
361export let int64tIn =  `int64_t [param_name_replace]In = 0;
362/* [NAPI_GEN]: napi_get_value_int64将一个 napi_value 类型的 js 布尔值转换成一个 C 语言的 int64_t 类型的数值
363 * env: N-API环境的句柄,表示当前的上下文
364 * value:要转换的JavaScript值
365 * result:指向 int64_t 类型的指针,在这里函数将存储转换后的整数值
366 */
367status = napi_get_value_int64(env, args[[param_index_replace]], &[param_name_replace]In);
368if (status != napi_ok) {
369    getErrMessage(status, env, extended_error_info, "napi_get_value_int64", tag);
370    return nullptr;
371}
372`;
373
374export let int32tIn =  `int32_t [param_name_replace]In = 0;
375/* [NAPI_GEN]: napi_get_value_int32将一个 napi_value 类型的 js 数值转换成一个 C 语言的 int32_t 类型的数值
376 * env: N-API环境的句柄,表示当前的上下文
377 * value:要转换的JavaScript值
378 * result:指向 int32_t 类型的指针,在这里函数将存储转换后的整数值
379 */
380status = napi_get_value_int32(env, args[[param_index_replace]], &[param_name_replace]In);
381if (status != napi_ok) {
382    /* [NAPI_GEN]: 错误处理*/
383    getErrMessage(status, env, extended_error_info, "napi_get_value_int32", tag);
384    return nullptr;
385}
386`;
387
388export let doubleIn =  `double [param_name_replace]In = 0;
389/* [NAPI_GEN]: napi_get_value_double将一个 napi_value 类型的 js 数值转换成一个 C 语言的 double 类型的数值
390 * env: N-API环境的句柄,表示当前的上下文
391 * value:要转换的JavaScript值
392 * result:指向 double 类型的指针,在这里函数将存储转换后的双精度浮点数
393 */
394status = napi_get_value_double(env, args[[param_index_replace]], &[param_name_replace]In);
395if (status != napi_ok) {
396    getErrMessage(status, env, extended_error_info, "napi_get_value_double", tag);
397    return nullptr;
398}
399`;
400
401export let boolIn =  `bool [param_name_replace]In = 0;
402/* [NAPI_GEN]: napi_get_value_bool将一个 napi_value 类型的 js 布尔值转换成一个 C 语言的 bool 类型的数值
403 * env: N-API环境的句柄,表示当前的上下文
404 * value:要转换的JavaScript值
405 * result:指向 bool 类型的指针,在这里函数将存储转换后的布尔值
406 */
407status = napi_get_value_bool(env, args[[param_index_replace]], &[param_name_replace]In);
408if (status != napi_ok) {
409    getErrMessage(status, env, extended_error_info, "napi_get_value_bool", tag);
410    return nullptr;
411}
412`;
413
414export let callbackIn =  `
415napi_value argv;
416// Todo: 创建要传递给回调函数的参数
417napi_value result;
418/**
419* env: napi_env 类型的环境变量
420* this_arg: 指向 JavaScript 对象的指针,表示回调函数中的 this 值。如果不需要递 this 值,则可以设置为 nullptr。
421* func: 指向 JavaScript 回调函数的指针。
422* argc: 传递给回调函数的参数数量。示例中传递了一个参数。
423* argv: 一个 napi_value 类型的数组,用于存储要传递给回调函数的参数。示例中传递了一个参数。
424
425* result: 指向返回值的指针。如果回调函数没有返回值,则可以设置为 nullptr。
426*/
427napi_call_function(env, nullptr, args[[param_index_replace]], 1, &argv, result);
428`;
429
430// napi testAbility需要生成的方法模板
431export let testAbilityFuncTemplate =  `  /* [NAPI_GEN]:对应[file_introduce_replace]中:[func_name_replace]方法的dts接口测试用例
432  * 方法输入: [input_introduce_replace]
433  * 方法输出: [func_return_replace]
434  */
435  it('[test_case_name]', 0, () => {
436    // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function.
437    hilog.info(0x0000, 'testTag', '%{public}s', 'it [test_case_name] begin');
438
439    [func_direct_testCase]
440
441    // Defines a variety of assertion methods, which are used to declare expected boolean conditions.
442    // e.g. expect(result).assertEqual(2+3)
443  })
444`;
445