1 /*
2 * Copyright (c) 2021-2024 Huawei Device 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 #include <cstdio>
17 #include <string>
18
19 #include "napi/native_api.h"
20 #include "napi/native_node_api.h"
21 #include "parameter.h"
22 #include "sysversion.h"
23 #include "bundlemgr/bundle_mgr_proxy.h"
24 #include "iservice_registry.h"
25 #include "if_system_ability_manager.h"
26 #include "system_ability_definition.h"
27 #include "beget_ext.h"
28 #include "init_error.h"
29 #include "securec.h"
30
31 #ifndef DEVICEINFO_JS_DOMAIN
32 #define DEVICEINFO_JS_DOMAIN (BASE_DOMAIN + 8)
33 #endif
34
35 #ifndef DINFO_TAG
36 #define DINFO_TAG "DEVICEINFO_JS"
37 #endif
38
39 #define DEVINFO_LOGV(fmt, ...) STARTUP_LOGV(DEVICEINFO_JS_DOMAIN, DINFO_TAG, fmt, ##__VA_ARGS__)
40 #define DEVINFO_LOGI(fmt, ...) STARTUP_LOGI(DEVICEINFO_JS_DOMAIN, DINFO_TAG, fmt, ##__VA_ARGS__)
41 #define DEVINFO_LOGW(fmt, ...) STARTUP_LOGW(DEVICEINFO_JS_DOMAIN, DINFO_TAG, fmt, ##__VA_ARGS__)
42 #define DEVINFO_LOGE(fmt, ...) STARTUP_LOGE(DEVICEINFO_JS_DOMAIN, DINFO_TAG, fmt, ##__VA_ARGS__)
43
44 const int UDID_LEN = 65;
45 const int ODID_LEN = 37;
46
47 typedef enum {
48 DEV_INFO_OK,
49 DEV_INFO_ENULLPTR,
50 DEV_INFO_EGETODID,
51 DEV_INFO_ESTRCOPY
52 } DevInfoError;
53
GetDeviceType(napi_env env,napi_callback_info info)54 static napi_value GetDeviceType(napi_env env, napi_callback_info info)
55 {
56 napi_value deviceType = nullptr;
57 const char *value = GetDeviceType();
58 if (value == nullptr) {
59 value = "";
60 }
61
62 NAPI_CALL(env, napi_create_string_utf8(env, value, strlen(value), &deviceType));
63 return deviceType;
64 }
65
GetManufacture(napi_env env,napi_callback_info info)66 static napi_value GetManufacture(napi_env env, napi_callback_info info)
67 {
68 napi_value napiValue = nullptr;
69 const char *manfactureName = GetManufacture();
70 if (manfactureName == nullptr) {
71 manfactureName = "";
72 }
73
74 NAPI_CALL(env, napi_create_string_utf8(env, manfactureName, strlen(manfactureName), &napiValue));
75 return napiValue;
76 }
77
GetBrand(napi_env env,napi_callback_info info)78 static napi_value GetBrand(napi_env env, napi_callback_info info)
79 {
80 napi_value napiValue = nullptr;
81 const char *productBrand = GetBrand();
82 if (productBrand == nullptr) {
83 productBrand = "";
84 }
85
86 NAPI_CALL(env, napi_create_string_utf8(env, productBrand, strlen(productBrand), &napiValue));
87 return napiValue;
88 }
89
GetMarketName(napi_env env,napi_callback_info info)90 static napi_value GetMarketName(napi_env env, napi_callback_info info)
91 {
92 napi_value napiValue = nullptr;
93 const char *marketName = GetMarketName();
94 if (marketName == nullptr) {
95 marketName = "";
96 }
97
98 NAPI_CALL(env, napi_create_string_utf8(env, marketName, strlen(marketName), &napiValue));
99 return napiValue;
100 }
101
GetProductSeries(napi_env env,napi_callback_info info)102 static napi_value GetProductSeries(napi_env env, napi_callback_info info)
103 {
104 napi_value napiValue = nullptr;
105 const char *productSeries = GetProductSeries();
106 if (productSeries == nullptr) {
107 productSeries = "";
108 }
109
110 NAPI_CALL(env, napi_create_string_utf8(env, productSeries, strlen(productSeries), &napiValue));
111 return napiValue;
112 }
113
GetProductModel(napi_env env,napi_callback_info info)114 static napi_value GetProductModel(napi_env env, napi_callback_info info)
115 {
116 napi_value napiValue = nullptr;
117 const char *productModel = GetProductModel();
118 if (productModel == nullptr) {
119 productModel = "";
120 }
121
122 NAPI_CALL(env, napi_create_string_utf8(env, productModel, strlen(productModel), &napiValue));
123 return napiValue;
124 }
125
GetProductModelAlias(napi_env env,napi_callback_info info)126 static napi_value GetProductModelAlias(napi_env env, napi_callback_info info)
127 {
128 napi_value napiValue = nullptr;
129 const char *productModel = GetProductModelAlias();
130 if (productModel == nullptr) {
131 productModel = "";
132 }
133
134 NAPI_CALL(env, napi_create_string_utf8(env, productModel, strlen(productModel), &napiValue));
135 return napiValue;
136 }
137
GetSoftwareModel(napi_env env,napi_callback_info info)138 static napi_value GetSoftwareModel(napi_env env, napi_callback_info info)
139 {
140 napi_value napiValue = nullptr;
141 const char *softwareModel = GetSoftwareModel();
142 if (softwareModel == nullptr) {
143 softwareModel = "";
144 }
145
146 NAPI_CALL(env, napi_create_string_utf8(env, softwareModel, strlen(softwareModel), &napiValue));
147 return napiValue;
148 }
149
GetHardwareModel(napi_env env,napi_callback_info info)150 static napi_value GetHardwareModel(napi_env env, napi_callback_info info)
151 {
152 napi_value napiValue = nullptr;
153 const char *hardwareModel = GetHardwareModel();
154 if (hardwareModel == nullptr) {
155 hardwareModel = "";
156 }
157
158 NAPI_CALL(env, napi_create_string_utf8(env, hardwareModel, strlen(hardwareModel), &napiValue));
159 return napiValue;
160 }
161
GetHardwareProfile(napi_env env,napi_callback_info info)162 static napi_value GetHardwareProfile(napi_env env, napi_callback_info info)
163 {
164 napi_value napiValue = nullptr;
165 const char *hardwareProfile = GetHardwareProfile();
166 if (hardwareProfile == nullptr) {
167 hardwareProfile = "";
168 }
169
170 NAPI_CALL(env, napi_create_string_utf8(env, hardwareProfile, strlen(hardwareProfile), &napiValue));
171 return napiValue;
172 }
173
GetSerial(napi_env env,napi_callback_info info)174 static napi_value GetSerial(napi_env env, napi_callback_info info)
175 {
176 napi_value napiValue = nullptr;
177 const char *serialNumber = AclGetSerial();
178 if (serialNumber == nullptr) {
179 serialNumber = "";
180 }
181
182 NAPI_CALL(env, napi_create_string_utf8(env, serialNumber, strlen(serialNumber), &napiValue));
183 return napiValue;
184 }
185
GetBootloaderVersion(napi_env env,napi_callback_info info)186 static napi_value GetBootloaderVersion(napi_env env, napi_callback_info info)
187 {
188 napi_value napiValue = nullptr;
189 const char *bootloaderVersion = GetBootloaderVersion();
190 if (bootloaderVersion == nullptr) {
191 bootloaderVersion = "";
192 }
193
194 NAPI_CALL(env, napi_create_string_utf8(env, bootloaderVersion, strlen(bootloaderVersion), &napiValue));
195 return napiValue;
196 }
197
GetAbiList(napi_env env,napi_callback_info info)198 static napi_value GetAbiList(napi_env env, napi_callback_info info)
199 {
200 napi_value napiValue = nullptr;
201 const char *abiList = GetAbiList();
202 if (abiList == nullptr) {
203 abiList = "";
204 }
205
206 NAPI_CALL(env, napi_create_string_utf8(env, abiList, strlen(abiList), &napiValue));
207 return napiValue;
208 }
209
GetSecurityPatchTag(napi_env env,napi_callback_info info)210 static napi_value GetSecurityPatchTag(napi_env env, napi_callback_info info)
211 {
212 napi_value napiValue = nullptr;
213 const char *securityPatchTag = GetSecurityPatchTag();
214 if (securityPatchTag == nullptr) {
215 securityPatchTag = "";
216 }
217
218 NAPI_CALL(env, napi_create_string_utf8(env, securityPatchTag, strlen(securityPatchTag), &napiValue));
219 return napiValue;
220 }
221
GetDisplayVersion(napi_env env,napi_callback_info info)222 static napi_value GetDisplayVersion(napi_env env, napi_callback_info info)
223 {
224 napi_value napiValue = nullptr;
225 const char *productVersion = GetDisplayVersion();
226 if (productVersion == nullptr) {
227 productVersion = "";
228 }
229
230 NAPI_CALL(env, napi_create_string_utf8(env, productVersion, strlen(productVersion), &napiValue));
231 return napiValue;
232 }
233
GetIncrementalVersion(napi_env env,napi_callback_info info)234 static napi_value GetIncrementalVersion(napi_env env, napi_callback_info info)
235 {
236 napi_value napiValue = nullptr;
237 const char *incrementalVersion = GetIncrementalVersion();
238 if (incrementalVersion == nullptr) {
239 incrementalVersion = "";
240 }
241
242 NAPI_CALL(env, napi_create_string_utf8(env, incrementalVersion, strlen(incrementalVersion), &napiValue));
243 return napiValue;
244 }
245
GetOsReleaseType(napi_env env,napi_callback_info info)246 static napi_value GetOsReleaseType(napi_env env, napi_callback_info info)
247 {
248 napi_value napiValue = nullptr;
249 const char *osReleaseType = GetOsReleaseType();
250 if (osReleaseType == nullptr) {
251 osReleaseType = "";
252 }
253
254 NAPI_CALL(env, napi_create_string_utf8(env, osReleaseType, strlen(osReleaseType), &napiValue));
255 return napiValue;
256 }
257
GetOSFullName(napi_env env,napi_callback_info info)258 static napi_value GetOSFullName(napi_env env, napi_callback_info info)
259 {
260 napi_value napiValue = nullptr;
261 const char *osVersion = GetOSFullName();
262 if (osVersion == nullptr) {
263 osVersion = "";
264 }
265
266 NAPI_CALL(env, napi_create_string_utf8(env, osVersion, strlen(osVersion), &napiValue));
267 return napiValue;
268 }
269
GetMajorVersion(napi_env env,napi_callback_info info)270 static napi_value GetMajorVersion(napi_env env, napi_callback_info info)
271 {
272 napi_value napiValue = nullptr;
273 int majorVersion = GetMajorVersion();
274
275 NAPI_CALL(env, napi_create_int32(env, majorVersion, &napiValue));
276 return napiValue;
277 }
278
GetSeniorVersion(napi_env env,napi_callback_info info)279 static napi_value GetSeniorVersion(napi_env env, napi_callback_info info)
280 {
281 napi_value napiValue = nullptr;
282 int seniorVersion = GetSeniorVersion();
283
284 NAPI_CALL(env, napi_create_int32(env, seniorVersion, &napiValue));
285 return napiValue;
286 }
287
GetFeatureVersion(napi_env env,napi_callback_info info)288 static napi_value GetFeatureVersion(napi_env env, napi_callback_info info)
289 {
290 napi_value napiValue = nullptr;
291 int featureVersion = GetFeatureVersion();
292
293 NAPI_CALL(env, napi_create_int32(env, featureVersion, &napiValue));
294 return napiValue;
295 }
296
GetBuildVersion(napi_env env,napi_callback_info info)297 static napi_value GetBuildVersion(napi_env env, napi_callback_info info)
298 {
299 napi_value napiValue = nullptr;
300 int buildVersion = GetBuildVersion();
301
302 NAPI_CALL(env, napi_create_int32(env, buildVersion, &napiValue));
303 return napiValue;
304 }
305
GetSdkApiVersion(napi_env env,napi_callback_info info)306 static napi_value GetSdkApiVersion(napi_env env, napi_callback_info info)
307 {
308 napi_value napiValue = nullptr;
309 int sdkApiVersion = GetSdkApiVersion();
310
311 NAPI_CALL(env, napi_create_int32(env, sdkApiVersion, &napiValue));
312 return napiValue;
313 }
314
GetFirstApiVersion(napi_env env,napi_callback_info info)315 static napi_value GetFirstApiVersion(napi_env env, napi_callback_info info)
316 {
317 napi_value napiValue = nullptr;
318 int firstApiVersion = GetFirstApiVersion();
319
320 NAPI_CALL(env, napi_create_int32(env, firstApiVersion, &napiValue));
321 return napiValue;
322 }
323
GetVersionId(napi_env env,napi_callback_info info)324 static napi_value GetVersionId(napi_env env, napi_callback_info info)
325 {
326 napi_value napiValue = nullptr;
327 const char *versionId = GetVersionId();
328 if (versionId == nullptr) {
329 versionId = "";
330 }
331
332 NAPI_CALL(env, napi_create_string_utf8(env, versionId, strlen(versionId), &napiValue));
333 return napiValue;
334 }
335
GetBuildType(napi_env env,napi_callback_info info)336 static napi_value GetBuildType(napi_env env, napi_callback_info info)
337 {
338 napi_value napiValue = nullptr;
339 const char *buildType = GetBuildType();
340 if (buildType == nullptr) {
341 buildType = "";
342 }
343
344 NAPI_CALL(env, napi_create_string_utf8(env, buildType, strlen(buildType), &napiValue));
345 return napiValue;
346 }
347
GetBuildUser(napi_env env,napi_callback_info info)348 static napi_value GetBuildUser(napi_env env, napi_callback_info info)
349 {
350 napi_value napiValue = nullptr;
351 const char *buildUser = GetBuildUser();
352 if (buildUser == nullptr) {
353 buildUser = "";
354 }
355
356 NAPI_CALL(env, napi_create_string_utf8(env, buildUser, strlen(buildUser), &napiValue));
357 return napiValue;
358 }
359
GetBuildHost(napi_env env,napi_callback_info info)360 static napi_value GetBuildHost(napi_env env, napi_callback_info info)
361 {
362 napi_value napiValue = nullptr;
363 const char *buildHost = GetBuildHost();
364 if (buildHost == nullptr) {
365 buildHost = "";
366 }
367
368 NAPI_CALL(env, napi_create_string_utf8(env, buildHost, strlen(buildHost), &napiValue));
369 return napiValue;
370 }
371
GetBuildTime(napi_env env,napi_callback_info info)372 static napi_value GetBuildTime(napi_env env, napi_callback_info info)
373 {
374 napi_value napiValue = nullptr;
375 const char *buildTime = GetBuildTime();
376 if (buildTime == nullptr) {
377 buildTime = "";
378 }
379
380 NAPI_CALL(env, napi_create_string_utf8(env, buildTime, strlen(buildTime), &napiValue));
381 return napiValue;
382 }
383
GetBuildRootHash(napi_env env,napi_callback_info info)384 static napi_value GetBuildRootHash(napi_env env, napi_callback_info info)
385 {
386 napi_value napiValue = nullptr;
387 const char *buildRootHash = GetBuildRootHash();
388 if (buildRootHash == nullptr) {
389 buildRootHash = "";
390 }
391
392 NAPI_CALL(env, napi_create_string_utf8(env, buildRootHash, strlen(buildRootHash), &napiValue));
393 return napiValue;
394 }
395
GetDevUdid(napi_env env,napi_callback_info info)396 static napi_value GetDevUdid(napi_env env, napi_callback_info info)
397 {
398 napi_value napiValue = nullptr;
399 char localDeviceId[UDID_LEN] = {0};
400 AclGetDevUdid(localDeviceId, UDID_LEN);
401
402 NAPI_CALL(env, napi_create_string_utf8(env, localDeviceId, strlen(localDeviceId), &napiValue));
403 return napiValue;
404 }
405
NAPI_GetDistributionOSName(napi_env env,napi_callback_info info)406 static napi_value NAPI_GetDistributionOSName(napi_env env, napi_callback_info info)
407 {
408 napi_value napiValue = nullptr;
409 const char *val = GetDistributionOSName();
410
411 NAPI_CALL(env, napi_create_string_utf8(env, val, strlen(val), &napiValue));
412 return napiValue;
413 }
414
NAPI_GetDistributionOSVersion(napi_env env,napi_callback_info info)415 static napi_value NAPI_GetDistributionOSVersion(napi_env env, napi_callback_info info)
416 {
417 napi_value napiValue = nullptr;
418 const char *val = GetDistributionOSVersion();
419
420 NAPI_CALL(env, napi_create_string_utf8(env, val, strlen(val), &napiValue));
421 return napiValue;
422 }
423
NAPI_GetDistributionOSApiVersion(napi_env env,napi_callback_info info)424 static napi_value NAPI_GetDistributionOSApiVersion(napi_env env, napi_callback_info info)
425 {
426 napi_value napiValue = nullptr;
427 int sdkApiVersion = GetDistributionOSApiVersion();
428
429 NAPI_CALL(env, napi_create_int32(env, sdkApiVersion, &napiValue));
430 return napiValue;
431 }
432
NAPI_GetDistributionOSApiName(napi_env env,napi_callback_info info)433 static napi_value NAPI_GetDistributionOSApiName(napi_env env, napi_callback_info info)
434 {
435 napi_value napiValue = nullptr;
436 const char *val = GetDistributionOSApiName();
437
438 NAPI_CALL(env, napi_create_string_utf8(env, val, strlen(val), &napiValue));
439 return napiValue;
440 }
441
NAPI_GetDistributionOSReleaseType(napi_env env,napi_callback_info info)442 static napi_value NAPI_GetDistributionOSReleaseType(napi_env env, napi_callback_info info)
443 {
444 napi_value napiValue = nullptr;
445 const char *val = GetDistributionOSReleaseType();
446
447 NAPI_CALL(env, napi_create_string_utf8(env, val, strlen(val), &napiValue));
448 return napiValue;
449 }
450
AclGetDevOdid(char * odid,int size)451 static DevInfoError AclGetDevOdid(char *odid, int size)
452 {
453 if (odid[0] != '\0') {
454 return DEV_INFO_OK;
455 }
456 auto systemAbilityManager = OHOS::SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
457 if (!systemAbilityManager) {
458 return DEV_INFO_ENULLPTR;
459 }
460
461 auto remoteObject = systemAbilityManager->GetSystemAbility(OHOS::BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
462 if (!remoteObject) {
463 return DEV_INFO_ENULLPTR;
464 }
465
466 auto bundleMgrProxy = OHOS::iface_cast<OHOS::AppExecFwk::BundleMgrProxy>(remoteObject);
467 if (!bundleMgrProxy) {
468 return DEV_INFO_ENULLPTR;
469 }
470
471 std::string odidStr;
472 if (bundleMgrProxy->GetOdid(odidStr) != 0) {
473 return DEV_INFO_EGETODID;
474 }
475
476 if (strcpy_s(odid, size, odidStr.c_str()) != EOK) {
477 return DEV_INFO_ESTRCOPY;
478 }
479 return DEV_INFO_OK;
480 }
481
GetDevOdid(napi_env env,napi_callback_info info)482 static napi_value GetDevOdid(napi_env env, napi_callback_info info)
483 {
484 napi_value napiValue = nullptr;
485 static char odid[ODID_LEN] = {0};
486 DevInfoError ret = AclGetDevOdid(odid, ODID_LEN);
487 if (ret != DEV_INFO_OK) {
488 DEVINFO_LOGE("GetDevOdid ret:%d", ret);
489 }
490
491 NAPI_CALL(env, napi_create_string_utf8(env, odid, strlen(odid), &napiValue));
492 return napiValue;
493 }
494
495 EXTERN_C_START
496 /*
497 * Module init
498 */
Init(napi_env env,napi_value exports)499 static napi_value Init(napi_env env, napi_value exports)
500 {
501 /*
502 * Attribute definition
503 */
504 napi_property_descriptor desc[] = {
505 {"deviceType", nullptr, nullptr, GetDeviceType, nullptr, nullptr, napi_default, nullptr},
506 {"manufacture", nullptr, nullptr, GetManufacture, nullptr, nullptr, napi_default, nullptr},
507 {"brand", nullptr, nullptr, GetBrand, nullptr, nullptr, napi_default, nullptr},
508 {"marketName", nullptr, nullptr, GetMarketName, nullptr, nullptr, napi_default, nullptr},
509 {"productSeries", nullptr, nullptr, GetProductSeries, nullptr, nullptr, napi_default, nullptr},
510 {"productModel", nullptr, nullptr, GetProductModel, nullptr, nullptr, napi_default, nullptr},
511 {"softwareModel", nullptr, nullptr, GetSoftwareModel, nullptr, nullptr, napi_default, nullptr},
512 {"hardwareModel", nullptr, nullptr, GetHardwareModel, nullptr, nullptr, napi_default, nullptr},
513 {"hardwareProfile", nullptr, nullptr, GetHardwareProfile, nullptr, nullptr, napi_default, nullptr},
514 {"serial", nullptr, nullptr, GetSerial, nullptr, nullptr, napi_default, nullptr},
515 {"bootloaderVersion", nullptr, nullptr, GetBootloaderVersion, nullptr, nullptr, napi_default, nullptr},
516 {"abiList", nullptr, nullptr, GetAbiList, nullptr, nullptr, napi_default, nullptr},
517 {"securityPatchTag", nullptr, nullptr, GetSecurityPatchTag, nullptr, nullptr, napi_default, nullptr},
518 {"displayVersion", nullptr, nullptr, GetDisplayVersion, nullptr, nullptr, napi_default, nullptr},
519 {"incrementalVersion", nullptr, nullptr, GetIncrementalVersion, nullptr, nullptr, napi_default, nullptr},
520 {"osReleaseType", nullptr, nullptr, GetOsReleaseType, nullptr, nullptr, napi_default, nullptr},
521 {"osFullName", nullptr, nullptr, GetOSFullName, nullptr, nullptr, napi_default, nullptr},
522 {"majorVersion", nullptr, nullptr, GetMajorVersion, nullptr, nullptr, napi_default, nullptr},
523 {"seniorVersion", nullptr, nullptr, GetSeniorVersion, nullptr, nullptr, napi_default, nullptr},
524 {"featureVersion", nullptr, nullptr, GetFeatureVersion, nullptr, nullptr, napi_default, nullptr},
525 {"buildVersion", nullptr, nullptr, GetBuildVersion, nullptr, nullptr, napi_default, nullptr},
526 {"sdkApiVersion", nullptr, nullptr, GetSdkApiVersion, nullptr, nullptr, napi_default, nullptr},
527 {"firstApiVersion", nullptr, nullptr, GetFirstApiVersion, nullptr, nullptr, napi_default, nullptr},
528 {"versionId", nullptr, nullptr, GetVersionId, nullptr, nullptr, napi_default, nullptr},
529 {"buildType", nullptr, nullptr, GetBuildType, nullptr, nullptr, napi_default, nullptr},
530 {"buildUser", nullptr, nullptr, GetBuildUser, nullptr, nullptr, napi_default, nullptr},
531 {"buildHost", nullptr, nullptr, GetBuildHost, nullptr, nullptr, napi_default, nullptr},
532 {"buildTime", nullptr, nullptr, GetBuildTime, nullptr, nullptr, napi_default, nullptr},
533 {"buildRootHash", nullptr, nullptr, GetBuildRootHash, nullptr, nullptr, napi_default, nullptr},
534 {"udid", nullptr, nullptr, GetDevUdid, nullptr, nullptr, napi_default, nullptr},
535 {"distributionOSName", nullptr, nullptr, NAPI_GetDistributionOSName, nullptr, nullptr, napi_default, nullptr},
536 {"distributionOSVersion", nullptr, nullptr, NAPI_GetDistributionOSVersion, nullptr, nullptr, napi_default, nullptr},
537 {"distributionOSApiVersion", nullptr, nullptr, NAPI_GetDistributionOSApiVersion, nullptr, nullptr, napi_default, nullptr},
538 {"distributionOSApiName", nullptr, nullptr, NAPI_GetDistributionOSApiName, nullptr, nullptr, napi_default, nullptr},
539 {"distributionOSReleaseType", nullptr, nullptr, NAPI_GetDistributionOSReleaseType, nullptr, nullptr, napi_default, nullptr},
540 {"ODID", nullptr, nullptr, GetDevOdid, nullptr, nullptr, napi_default, nullptr},
541 {"productModelAlias", nullptr, nullptr, GetProductModelAlias, nullptr, nullptr, napi_default, nullptr},
542 };
543 NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(napi_property_descriptor), desc));
544
545 return exports;
546 }
547 EXTERN_C_END
548
549 /*
550 * Module definition
551 */
552 static napi_module _module = {
553 .nm_version = 1,
554 .nm_flags = 0,
555 .nm_filename = NULL,
556 .nm_register_func = Init,
557 .nm_modname = "deviceInfo",
558 .nm_priv = ((void *)0),
559 .reserved = { 0 }
560 };
561 /*
562 * Module registration function
563 */
RegisterModule(void)564 extern "C" __attribute__((constructor)) void RegisterModule(void)
565 {
566 napi_module_register(&_module);
567 }
568