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