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