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