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