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