1c7afe287Sopenharmony_ci/* 2c7afe287Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 3c7afe287Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4c7afe287Sopenharmony_ci * you may not use this file except in compliance with the License. 5c7afe287Sopenharmony_ci * You may obtain a copy of the License at 6c7afe287Sopenharmony_ci * 7c7afe287Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8c7afe287Sopenharmony_ci * 9c7afe287Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10c7afe287Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11c7afe287Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12c7afe287Sopenharmony_ci * See the License for the specific language governing permissions and 13c7afe287Sopenharmony_ci * limitations under the License. 14c7afe287Sopenharmony_ci */ 15c7afe287Sopenharmony_ci#include "oaid_service.h" 16c7afe287Sopenharmony_ci#include <mutex> 17c7afe287Sopenharmony_ci#include <openssl/rand.h> 18c7afe287Sopenharmony_ci#include <singleton.h> 19c7afe287Sopenharmony_ci#include <string> 20c7afe287Sopenharmony_ci#include <unistd.h> 21c7afe287Sopenharmony_ci#include "oaid_common.h" 22c7afe287Sopenharmony_ci#include "oaid_file_operator.h" 23c7afe287Sopenharmony_ci#include "system_ability.h" 24c7afe287Sopenharmony_ci#include "system_ability_definition.h" 25c7afe287Sopenharmony_ci#include "oaid_service_stub.h" 26c7afe287Sopenharmony_ci#include "oaid_service_define.h" 27c7afe287Sopenharmony_ci#include "oaid_observer_manager.h" 28c7afe287Sopenharmony_ci 29c7afe287Sopenharmony_ciusing namespace std::chrono; 30c7afe287Sopenharmony_ci 31c7afe287Sopenharmony_cinamespace OHOS { 32c7afe287Sopenharmony_cinamespace Cloud { 33c7afe287Sopenharmony_ciconst std::string OAID_VIRTUAL_STR = "-****-****-****-************"; 34c7afe287Sopenharmony_cinamespace { 35c7afe287Sopenharmony_cichar HexToChar(uint8_t hex) 36c7afe287Sopenharmony_ci{ 37c7afe287Sopenharmony_ci static const uint8_t MAX_SINGLE_DIGIT = 9; // 9 is the largest single digit 38c7afe287Sopenharmony_ci return (hex > MAX_SINGLE_DIGIT) ? (hex + 0x57) : (hex + 0x30); 39c7afe287Sopenharmony_ci} 40c7afe287Sopenharmony_ci 41c7afe287Sopenharmony_ci/** 42c7afe287Sopenharmony_ci * Get v4 uuid. 43c7afe287Sopenharmony_ci * 44c7afe287Sopenharmony_ci * @return std::string, uuid. 45c7afe287Sopenharmony_ci */ 46c7afe287Sopenharmony_cistd::string GetUUID() 47c7afe287Sopenharmony_ci{ 48c7afe287Sopenharmony_ci static const int8_t UUID_LENGTH = 16; // The UUID is 128 bits, that is 16 bytes. 49c7afe287Sopenharmony_ci static const int8_t VERSION_INDEX = 6; // Obtain the seventh byte of the randomly generated UUID, that is uuid[6]. 50c7afe287Sopenharmony_ci static const int8_t CHAR_LOW_WIDTH = 4; // Lower 4 bits of the char type 51c7afe287Sopenharmony_ci static const int8_t N_INDEX = 8; // Reset the ninth byte of the UUID, that is UUID[8]. 52c7afe287Sopenharmony_ci unsigned char uuid[UUID_LENGTH] = {0}; 53c7afe287Sopenharmony_ci int re = RAND_bytes(uuid, sizeof(uuid)); 54c7afe287Sopenharmony_ci if (re == 0) { 55c7afe287Sopenharmony_ci return ""; 56c7afe287Sopenharmony_ci } 57c7afe287Sopenharmony_ci 58c7afe287Sopenharmony_ci /** 59c7afe287Sopenharmony_ci * xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx 60c7afe287Sopenharmony_ci * M is uuid version: 4 61c7afe287Sopenharmony_ci * N is 8,9,a,b 62c7afe287Sopenharmony_ci */ 63c7afe287Sopenharmony_ci uuid[VERSION_INDEX] = (uuid[VERSION_INDEX] & 0x0F) | 0x40; 64c7afe287Sopenharmony_ci int minN = 0x8; 65c7afe287Sopenharmony_ci int maxN = 0xb; 66c7afe287Sopenharmony_ci unsigned char randNumber[1] = {minN}; 67c7afe287Sopenharmony_ci RAND_bytes(randNumber, sizeof(randNumber)); 68c7afe287Sopenharmony_ci unsigned char num = static_cast<unsigned char>(randNumber[0] % (maxN - minN + 1) + minN); 69c7afe287Sopenharmony_ci uuid[N_INDEX] = (uuid[N_INDEX] & 0x0F) | (num << CHAR_LOW_WIDTH); 70c7afe287Sopenharmony_ci 71c7afe287Sopenharmony_ci static const size_t LINE_INDEX_MAX = 10; // until i=10 72c7afe287Sopenharmony_ci static const size_t LINE_INDEX_MIN = 4; // Add a hyphen (-) every two bytes starting from i=4. 73c7afe287Sopenharmony_ci static const size_t EVEN_FACTOR = 2; // the even factor is assigned to 2, and all even numbers are divisible by 2. 74c7afe287Sopenharmony_ci std::string formatUuid = ""; 75c7afe287Sopenharmony_ci for (size_t i = 0; i < sizeof(uuid); i++) { 76c7afe287Sopenharmony_ci unsigned char value = uuid[i]; 77c7afe287Sopenharmony_ci if (i >= LINE_INDEX_MIN && i <= LINE_INDEX_MAX && i % EVEN_FACTOR == 0) { 78c7afe287Sopenharmony_ci formatUuid += "-"; 79c7afe287Sopenharmony_ci } 80c7afe287Sopenharmony_ci formatUuid += HexToChar(value >> CHAR_LOW_WIDTH); 81c7afe287Sopenharmony_ci unsigned char highValue = value & 0xF0; 82c7afe287Sopenharmony_ci if (highValue == 0) { 83c7afe287Sopenharmony_ci formatUuid += HexToChar(value); 84c7afe287Sopenharmony_ci } else { 85c7afe287Sopenharmony_ci formatUuid += HexToChar(value % (value & highValue)); 86c7afe287Sopenharmony_ci } 87c7afe287Sopenharmony_ci } 88c7afe287Sopenharmony_ci return formatUuid; 89c7afe287Sopenharmony_ci} 90c7afe287Sopenharmony_ci} // namespace 91c7afe287Sopenharmony_ci 92c7afe287Sopenharmony_ciREGISTER_SYSTEM_ABILITY_BY_ID(OAIDService, OAID_SYSTME_ID, true); 93c7afe287Sopenharmony_cistd::mutex OAIDService::mutex_; 94c7afe287Sopenharmony_cisptr<OAIDService> OAIDService::instance_; 95c7afe287Sopenharmony_ci 96c7afe287Sopenharmony_ciOAIDService::OAIDService(int32_t systemAbilityId, bool runOnCreate) 97c7afe287Sopenharmony_ci : SystemAbility(systemAbilityId, runOnCreate), state_(ServiceRunningState::STATE_NOT_START) 98c7afe287Sopenharmony_ci{ 99c7afe287Sopenharmony_ci OAID_HILOGI(OAID_MODULE_SERVICE, "Start."); 100c7afe287Sopenharmony_ci} 101c7afe287Sopenharmony_ci 102c7afe287Sopenharmony_ciOAIDService::OAIDService() : state_(ServiceRunningState::STATE_NOT_START) 103c7afe287Sopenharmony_ci{} 104c7afe287Sopenharmony_ci 105c7afe287Sopenharmony_ciOAIDService::~OAIDService(){}; 106c7afe287Sopenharmony_ci 107c7afe287Sopenharmony_cisptr<OAIDService> OAIDService::GetInstance() 108c7afe287Sopenharmony_ci{ 109c7afe287Sopenharmony_ci if (instance_ == nullptr) { 110c7afe287Sopenharmony_ci std::lock_guard<std::mutex> autoLock(mutex_); 111c7afe287Sopenharmony_ci if (instance_ == nullptr) { 112c7afe287Sopenharmony_ci OAID_HILOGI(OAID_MODULE_SERVICE, "Instance success."); 113c7afe287Sopenharmony_ci instance_ = new OAIDService; 114c7afe287Sopenharmony_ci } 115c7afe287Sopenharmony_ci } 116c7afe287Sopenharmony_ci return instance_; 117c7afe287Sopenharmony_ci} 118c7afe287Sopenharmony_ci 119c7afe287Sopenharmony_civoid OAIDService::OnStart() 120c7afe287Sopenharmony_ci{ 121c7afe287Sopenharmony_ci if (state_ == ServiceRunningState::STATE_RUNNING) { 122c7afe287Sopenharmony_ci OAID_HILOGE(OAID_MODULE_SERVICE, " OAIDService is already running."); 123c7afe287Sopenharmony_ci return; 124c7afe287Sopenharmony_ci } 125c7afe287Sopenharmony_ci 126c7afe287Sopenharmony_ci if (Init() != ERR_OK) { 127c7afe287Sopenharmony_ci OAID_HILOGE(OAID_MODULE_SERVICE, "Init failed, Try again 10s later."); 128c7afe287Sopenharmony_ci return; 129c7afe287Sopenharmony_ci } 130c7afe287Sopenharmony_ci AddSystemAbilityListener(OAID_SYSTME_ID); 131c7afe287Sopenharmony_ci 132c7afe287Sopenharmony_ci OAID_HILOGI(OAID_MODULE_SERVICE, "Start OAID service success."); 133c7afe287Sopenharmony_ci return; 134c7afe287Sopenharmony_ci} 135c7afe287Sopenharmony_ci 136c7afe287Sopenharmony_ciint32_t OAIDService::Init() 137c7afe287Sopenharmony_ci{ 138c7afe287Sopenharmony_ci bool ret = Publish(this); 139c7afe287Sopenharmony_ci if (!ret) { 140c7afe287Sopenharmony_ci OAID_HILOGE(OAID_MODULE_SERVICE, "OAID service init failed."); 141c7afe287Sopenharmony_ci return ERR_SYSYTEM_ERROR; 142c7afe287Sopenharmony_ci } 143c7afe287Sopenharmony_ci 144c7afe287Sopenharmony_ci OAID_HILOGI(OAID_MODULE_SERVICE, "OAID service init Success."); 145c7afe287Sopenharmony_ci state_ = ServiceRunningState::STATE_RUNNING; 146c7afe287Sopenharmony_ci return ERR_OK; 147c7afe287Sopenharmony_ci} 148c7afe287Sopenharmony_ci 149c7afe287Sopenharmony_civoid OAIDService::OnStop() 150c7afe287Sopenharmony_ci{ 151c7afe287Sopenharmony_ci if (state_ != ServiceRunningState::STATE_RUNNING) { 152c7afe287Sopenharmony_ci return; 153c7afe287Sopenharmony_ci } 154c7afe287Sopenharmony_ci 155c7afe287Sopenharmony_ci state_ = ServiceRunningState::STATE_NOT_START; 156c7afe287Sopenharmony_ci OAID_HILOGI(OAID_MODULE_SERVICE, "Stop success."); 157c7afe287Sopenharmony_ci} 158c7afe287Sopenharmony_ci 159c7afe287Sopenharmony_cibool OAIDService::InitOaidKvStore() 160c7afe287Sopenharmony_ci{ 161c7afe287Sopenharmony_ci DistributedKv::DistributedKvDataManager manager; 162c7afe287Sopenharmony_ci DistributedKv::Options options; 163c7afe287Sopenharmony_ci 164c7afe287Sopenharmony_ci DistributedKv::AppId appId; 165c7afe287Sopenharmony_ci appId.appId = OAID_DATA_BASE_APP_ID; 166c7afe287Sopenharmony_ci 167c7afe287Sopenharmony_ci options.createIfMissing = true; 168c7afe287Sopenharmony_ci options.encrypt = true; 169c7afe287Sopenharmony_ci options.autoSync = false; 170c7afe287Sopenharmony_ci options.kvStoreType = DistributedKv::KvStoreType::SINGLE_VERSION; 171c7afe287Sopenharmony_ci options.area = DistributedKv::EL1; 172c7afe287Sopenharmony_ci options.baseDir = OAID_DATA_BASE_DIR + appId.appId; 173c7afe287Sopenharmony_ci options.securityLevel = DistributedKv::SecurityLevel::S1; 174c7afe287Sopenharmony_ci 175c7afe287Sopenharmony_ci DistributedKv::StoreId storeId; 176c7afe287Sopenharmony_ci storeId.storeId = OAID_DATA_BASE_STORE_ID; 177c7afe287Sopenharmony_ci DistributedKv::Status status = DistributedKv::Status::SUCCESS; 178c7afe287Sopenharmony_ci 179c7afe287Sopenharmony_ci if (oaidKvStore_ == nullptr) { 180c7afe287Sopenharmony_ci uint32_t retries = 0; 181c7afe287Sopenharmony_ci do { 182c7afe287Sopenharmony_ci OAID_HILOGI(OAID_MODULE_SERVICE, "InitOaidKvStore: retries=%{public}u!", retries); 183c7afe287Sopenharmony_ci status = manager.GetSingleKvStore(options, appId, storeId, oaidKvStore_); 184c7afe287Sopenharmony_ci if (status == DistributedKv::Status::STORE_NOT_FOUND) { 185c7afe287Sopenharmony_ci OAID_HILOGE(OAID_MODULE_SERVICE, "InitOaidKvStore: STORE_NOT_FOUND!"); 186c7afe287Sopenharmony_ci } 187c7afe287Sopenharmony_ci 188c7afe287Sopenharmony_ci if ((status == DistributedKv::Status::SUCCESS) || (status == DistributedKv::Status::STORE_NOT_FOUND)) { 189c7afe287Sopenharmony_ci break; 190c7afe287Sopenharmony_ci } else { 191c7afe287Sopenharmony_ci OAID_HILOGE(OAID_MODULE_SERVICE, "Kvstore Connect failed! Retrying."); 192c7afe287Sopenharmony_ci retries++; 193c7afe287Sopenharmony_ci usleep(KVSTORE_CONNECT_RETRY_DELAY_TIME); 194c7afe287Sopenharmony_ci } 195c7afe287Sopenharmony_ci } while (retries <= KVSTORE_CONNECT_RETRY_COUNT); 196c7afe287Sopenharmony_ci } 197c7afe287Sopenharmony_ci 198c7afe287Sopenharmony_ci if (oaidKvStore_ == nullptr) { 199c7afe287Sopenharmony_ci if (status == DistributedKv::Status::STORE_NOT_FOUND) { 200c7afe287Sopenharmony_ci OAID_HILOGI(OAID_MODULE_SERVICE, "First Boot: Create OaidKvStore"); 201c7afe287Sopenharmony_ci options.createIfMissing = true; 202c7afe287Sopenharmony_ci // [create and] open and initialize kvstore instance. 203c7afe287Sopenharmony_ci status = manager.GetSingleKvStore(options, appId, storeId, oaidKvStore_); 204c7afe287Sopenharmony_ci if (status == DistributedKv::Status::SUCCESS) { 205c7afe287Sopenharmony_ci OAID_HILOGE(OAID_MODULE_SERVICE, "Create OaidKvStore success!"); 206c7afe287Sopenharmony_ci } else { 207c7afe287Sopenharmony_ci OAID_HILOGE(OAID_MODULE_SERVICE, "Create OaidKvStore Failed!"); 208c7afe287Sopenharmony_ci } 209c7afe287Sopenharmony_ci } 210c7afe287Sopenharmony_ci } 211c7afe287Sopenharmony_ci 212c7afe287Sopenharmony_ci if (oaidKvStore_ == nullptr) { 213c7afe287Sopenharmony_ci OAID_HILOGE(OAID_MODULE_SERVICE, "InitOaidKvStore: Failed!"); 214c7afe287Sopenharmony_ci return false; 215c7afe287Sopenharmony_ci } 216c7afe287Sopenharmony_ci 217c7afe287Sopenharmony_ci return true; 218c7afe287Sopenharmony_ci} 219c7afe287Sopenharmony_ci 220c7afe287Sopenharmony_civoid OAIDService::OnAddSystemAbility(int32_t systemAbilityId, const std::string &deviceId) 221c7afe287Sopenharmony_ci{ 222c7afe287Sopenharmony_ci OAID_HILOGI(OAID_MODULE_SERVICE, "OnAddSystemAbility OAIDService"); 223c7afe287Sopenharmony_ci bool result = false; 224c7afe287Sopenharmony_ci switch (systemAbilityId) { 225c7afe287Sopenharmony_ci case OAID_SYSTME_ID: 226c7afe287Sopenharmony_ci OAID_HILOGI(OAID_MODULE_SERVICE, "OnAddSystemAbility kv data service start"); 227c7afe287Sopenharmony_ci result = InitOaidKvStore(); 228c7afe287Sopenharmony_ci OAID_HILOGI(OAID_MODULE_SERVICE, "OnAddSystemAbility InitOaidKvStore is %{public}d", result); 229c7afe287Sopenharmony_ci break; 230c7afe287Sopenharmony_ci default: 231c7afe287Sopenharmony_ci OAID_HILOGI(OAID_MODULE_SERVICE, "OnAddSystemAbility unhandled sysabilityId:%{public}d", systemAbilityId); 232c7afe287Sopenharmony_ci break; 233c7afe287Sopenharmony_ci } 234c7afe287Sopenharmony_ci} 235c7afe287Sopenharmony_ci 236c7afe287Sopenharmony_cibool OAIDService::CheckKvStore() 237c7afe287Sopenharmony_ci{ 238c7afe287Sopenharmony_ci if (oaidKvStore_ != nullptr) { 239c7afe287Sopenharmony_ci return true; 240c7afe287Sopenharmony_ci } 241c7afe287Sopenharmony_ci 242c7afe287Sopenharmony_ci bool result = InitOaidKvStore(); 243c7afe287Sopenharmony_ci OAID_HILOGI(OAID_MODULE_SERVICE, "InitOaidKvStore: %{public}s", result == true ? "success" : "failed"); 244c7afe287Sopenharmony_ci return result; 245c7afe287Sopenharmony_ci} 246c7afe287Sopenharmony_ci 247c7afe287Sopenharmony_cibool OAIDService::ReadValueFromKvStore(const std::string &kvStoreKey, std::string &kvStoreValue) 248c7afe287Sopenharmony_ci{ 249c7afe287Sopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 250c7afe287Sopenharmony_ci 251c7afe287Sopenharmony_ci if (!CheckKvStore()) { 252c7afe287Sopenharmony_ci OAID_HILOGE(OAID_MODULE_SERVICE, "ReadValueFromKvStore:oaidKvStore_ is nullptr"); 253c7afe287Sopenharmony_ci return false; 254c7afe287Sopenharmony_ci } 255c7afe287Sopenharmony_ci 256c7afe287Sopenharmony_ci DistributedKv::Key key(kvStoreKey); 257c7afe287Sopenharmony_ci DistributedKv::Value value; 258c7afe287Sopenharmony_ci DistributedKv::Status status = oaidKvStore_->Get(key, value); 259c7afe287Sopenharmony_ci if (status == DistributedKv::Status::SUCCESS) { 260c7afe287Sopenharmony_ci OAID_HILOGI(OAID_MODULE_SERVICE, "%{public}d get value from kvStore", status); 261c7afe287Sopenharmony_ci } else { 262c7afe287Sopenharmony_ci OAID_HILOGE(OAID_MODULE_SERVICE, "%{public}d get value from kvStore failed", status); 263c7afe287Sopenharmony_ci return false; 264c7afe287Sopenharmony_ci } 265c7afe287Sopenharmony_ci kvStoreValue = value.ToString(); 266c7afe287Sopenharmony_ci 267c7afe287Sopenharmony_ci return true; 268c7afe287Sopenharmony_ci} 269c7afe287Sopenharmony_ci 270c7afe287Sopenharmony_cibool OAIDService::WriteValueToKvStore(const std::string &kvStoreKey, const std::string &kvStoreValue) 271c7afe287Sopenharmony_ci{ 272c7afe287Sopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 273c7afe287Sopenharmony_ci 274c7afe287Sopenharmony_ci if (!CheckKvStore()) { 275c7afe287Sopenharmony_ci OAID_HILOGE(OAID_MODULE_SERVICE, "WriteValueToKvStore:oaidKvStore_ is nullptr"); 276c7afe287Sopenharmony_ci return false; 277c7afe287Sopenharmony_ci } 278c7afe287Sopenharmony_ci 279c7afe287Sopenharmony_ci DistributedKv::Key key(kvStoreKey); 280c7afe287Sopenharmony_ci DistributedKv::Value value(kvStoreValue); 281c7afe287Sopenharmony_ci DistributedKv::Status status = oaidKvStore_->Put(key, value); 282c7afe287Sopenharmony_ci if (status == DistributedKv::Status::SUCCESS) { 283c7afe287Sopenharmony_ci OAID_HILOGI(OAID_MODULE_SERVICE, "%{public}d updated to kvStore", status); 284c7afe287Sopenharmony_ci } else { 285c7afe287Sopenharmony_ci OAID_HILOGE(OAID_MODULE_SERVICE, "%{public}d update to kvStore failed", status); 286c7afe287Sopenharmony_ci return false; 287c7afe287Sopenharmony_ci } 288c7afe287Sopenharmony_ci 289c7afe287Sopenharmony_ci return true; 290c7afe287Sopenharmony_ci} 291c7afe287Sopenharmony_ci 292c7afe287Sopenharmony_cistd::string OAIDService::GainOAID() 293c7afe287Sopenharmony_ci{ 294c7afe287Sopenharmony_ci OAID_HILOGI(OAID_MODULE_SERVICE, "Gain OAID Begin."); 295c7afe287Sopenharmony_ci std::string oaidKvStoreStr = OAID_ALLZERO_STR; 296c7afe287Sopenharmony_ci updateMutex_.lock(); 297c7afe287Sopenharmony_ci if (OAIDFileOperator::IsFileExsit(OAID_UPDATE)) { 298c7afe287Sopenharmony_ci OAIDFileOperator::OpenAndReadFile(OAID_UPDATE, oaidKvStoreStr); 299c7afe287Sopenharmony_ci OAIDFileOperator::ClearFile(OAID_UPDATE); 300c7afe287Sopenharmony_ci std::string oaid; 301c7afe287Sopenharmony_ci cJSON *root = cJSON_Parse(oaidKvStoreStr.c_str()); 302c7afe287Sopenharmony_ci if (root != nullptr && !cJSON_IsInvalid(root)) { 303c7afe287Sopenharmony_ci cJSON *oaidObj = cJSON_GetObjectItem(root, "oaid"); 304c7afe287Sopenharmony_ci if (cJSON_IsString(oaidObj)) { 305c7afe287Sopenharmony_ci oaid = oaidObj->valuestring; 306c7afe287Sopenharmony_ci } 307c7afe287Sopenharmony_ci } 308c7afe287Sopenharmony_ci cJSON_Delete(root); 309c7afe287Sopenharmony_ci oaid_ = oaid; 310c7afe287Sopenharmony_ci bool update = WriteValueToKvStore(OAID_KVSTORE_KEY, oaid_); 311c7afe287Sopenharmony_ci OAID_HILOGI(OAID_MODULE_SERVICE, "update oaid %{public}s", update ? "success" : "failed"); 312c7afe287Sopenharmony_ci updateMutex_.unlock(); 313c7afe287Sopenharmony_ci return oaid_; 314c7afe287Sopenharmony_ci } 315c7afe287Sopenharmony_ci updateMutex_.unlock(); 316c7afe287Sopenharmony_ci bool result = ReadValueFromKvStore(OAID_KVSTORE_KEY, oaidKvStoreStr); 317c7afe287Sopenharmony_ci OAID_HILOGI(OAID_MODULE_SERVICE, "ReadValueFromKvStore %{public}s", result ? "success" : "failed"); 318c7afe287Sopenharmony_ci 319c7afe287Sopenharmony_ci if (oaidKvStoreStr != OAID_ALLZERO_STR && !oaidKvStoreStr.empty()) { 320c7afe287Sopenharmony_ci if (oaid_.empty()) { 321c7afe287Sopenharmony_ci oaid_ = oaidKvStoreStr; 322c7afe287Sopenharmony_ci OAID_HILOGI(OAID_MODULE_SERVICE, "The Oaid in the memory is empty, it get oaid from kvdb successfully"); 323c7afe287Sopenharmony_ci } 324c7afe287Sopenharmony_ci return oaid_; 325c7afe287Sopenharmony_ci } else { 326c7afe287Sopenharmony_ci if (oaid_.empty()) { 327c7afe287Sopenharmony_ci oaid_ = GetUUID(); 328c7afe287Sopenharmony_ci OAID_HILOGI(OAID_MODULE_SERVICE, "The oaid has been regenerated."); 329c7afe287Sopenharmony_ci } 330c7afe287Sopenharmony_ci } 331c7afe287Sopenharmony_ci result = WriteValueToKvStore(OAID_KVSTORE_KEY, oaid_); 332c7afe287Sopenharmony_ci OAID_HILOGI(OAID_MODULE_SERVICE, "WriteValueToKvStore %{public}s", result == true ? "success" : "failed"); 333c7afe287Sopenharmony_ci OAID_HILOGI(OAID_MODULE_SERVICE, "Gain OAID Finish."); 334c7afe287Sopenharmony_ci return oaid_; 335c7afe287Sopenharmony_ci} 336c7afe287Sopenharmony_ci 337c7afe287Sopenharmony_cistd::string OAIDService::GetOAID() 338c7afe287Sopenharmony_ci{ 339c7afe287Sopenharmony_ci OAID_HILOGI(OAID_MODULE_SERVICE, "Begin."); 340c7afe287Sopenharmony_ci 341c7afe287Sopenharmony_ci std::string oaid = GainOAID(); 342c7afe287Sopenharmony_ci std::string target = oaid.substr(0, 9).append(OAID_VIRTUAL_STR); 343c7afe287Sopenharmony_ci OAID_HILOGI(OAID_MODULE_SERVICE, "getOaid success oaid is: %{public}s", target.c_str()); 344c7afe287Sopenharmony_ci OAID_HILOGI(OAID_MODULE_SERVICE, "End."); 345c7afe287Sopenharmony_ci return oaid; 346c7afe287Sopenharmony_ci} 347c7afe287Sopenharmony_ci 348c7afe287Sopenharmony_ciint32_t OAIDService::ResetOAID() 349c7afe287Sopenharmony_ci{ 350c7afe287Sopenharmony_ci OAID_HILOGI(OAID_MODULE_SERVICE, "ResetOAID."); 351c7afe287Sopenharmony_ci std::string resetOaid = GetUUID(); 352c7afe287Sopenharmony_ci oaid_ = resetOaid; 353c7afe287Sopenharmony_ci bool result = WriteValueToKvStore(OAID_KVSTORE_KEY, resetOaid); 354c7afe287Sopenharmony_ci OAID_HILOGI(OAID_MODULE_SERVICE, "ResetOAID WriteValueToKvStore %{public}s", result == true ? "success" : "failed"); 355c7afe287Sopenharmony_ci std::string target = resetOaid.substr(0, 9).append(OAID_VIRTUAL_STR); 356c7afe287Sopenharmony_ci OAID_HILOGI(OAID_MODULE_SERVICE, "resetOaid success oaid is: %{public}s", target.c_str()); 357c7afe287Sopenharmony_ci // 调用单例对象的oberser->OnUpdateOaid 358c7afe287Sopenharmony_ci DelayedSingleton<OaidObserverManager>::GetInstance()->OnUpdateOaid(resetOaid); 359c7afe287Sopenharmony_ci return ERR_OK; 360c7afe287Sopenharmony_ci} 361c7afe287Sopenharmony_ci} // namespace Cloud 362c7afe287Sopenharmony_ci} // namespace OHOS 363