• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 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 #define LOG_TAG "UpgradeManager"
16 
17 #include "upgrade_manager.h"
18 
19 #include "device_manager_adapter.h"
20 #include "log_print.h"
21 #include "metadata/meta_data_manager.h"
22 #include "utils/anonymous.h"
23 
24 namespace OHOS::DistributedData {
25 using namespace OHOS::DistributedKv;
26 using DmAdapter = DistributedData::DeviceManagerAdapter;
GetInstance()27 UpgradeManager &UpgradeManager::GetInstance()
28 {
29     static UpgradeManager instance;
30     return instance;
31 }
32 
Init(std::shared_ptr<ExecutorPool> executors)33 void UpgradeManager::Init(std::shared_ptr<ExecutorPool> executors)
34 {
35     MetaDataManager::GetInstance().Subscribe(
36         CapMetaRow::KEY_PREFIX, [this](const std::string &key, const std::string &value, int32_t flag) -> auto {
37             CapMetaData capMeta;
38             if (value.empty()) {
39                 MetaDataManager::GetInstance().LoadMeta(key, capMeta);
40             } else {
41                 CapMetaData::Unmarshall(value, capMeta);
42             }
43             auto deviceId = CapMetaRow::GetDeviceId(key);
44             if (deviceId.empty()) {
45                 ZLOGE("deviceId is empty, key:%{public}s, flag:%{public}d", Anonymous::Change(key).c_str(), flag);
46                 return false;
47             }
48             if (deviceId == DmAdapter::GetInstance().GetLocalDevice().uuid) {
49                 return true;
50             }
51             capMeta.deviceId = capMeta.deviceId.empty() ? deviceId : capMeta.deviceId;
52             ZLOGI("CapMetaData has change, deviceId:%{public}s, version:%{public}d, flag:%{public}d",
53                 Anonymous::Change(capMeta.deviceId).c_str(), capMeta.version, flag);
54             if (flag == MetaDataManager::INSERT || flag == MetaDataManager::UPDATE) {
55                 capabilities_.InsertOrAssign(capMeta.deviceId, capMeta);
56             } else if (flag == MetaDataManager::DELETE) {
57                 capabilities_.Erase(capMeta.deviceId);
58             }
59             return true;
60         });
61     if (executors != nullptr) {
62         executors_ = std::move(executors);
63         executors_->Execute(GetTask());
64     }
65 }
66 
GetTask()67 ExecutorPool::Task UpgradeManager::GetTask()
68 {
69     return [this] {
70         if (InitLocalCapability() || executors_ == nullptr) {
71             return;
72         }
73         executors_->Schedule(std::chrono::milliseconds(RETRY_INTERVAL), GetTask());
74     };
75 }
76 
GetCapability(const std::string & deviceId,bool & status)77 CapMetaData UpgradeManager::GetCapability(const std::string &deviceId, bool &status)
78 {
79     status = true;
80     auto index = capabilities_.Find(deviceId);
81     if (index.first) {
82         return index.second;
83     }
84     ZLOGI("load capability from meta");
85     CapMetaData capMetaData;
86     auto dbKey = CapMetaRow::GetKeyFor(deviceId);
87     ZLOGD("cap key:%{public}s", Anonymous::Change(std::string(dbKey.begin(), dbKey.end())).c_str());
88     status = MetaDataManager::GetInstance().LoadMeta(std::string(dbKey.begin(), dbKey.end()), capMetaData);
89     if (status) {
90         capabilities_.Insert(deviceId, capMetaData);
91     }
92     ZLOGI("device:%{public}s, version:%{public}d, insert:%{public}d", Anonymous::Change(deviceId).c_str(),
93         capMetaData.version, status);
94     return capMetaData;
95 }
96 
InitLocalCapability()97 bool UpgradeManager::InitLocalCapability()
98 {
99     auto localDeviceId = DmAdapter::GetInstance().GetLocalDevice().uuid;
100     CapMetaData capMetaData;
101     capMetaData.version = CapMetaData::CURRENT_VERSION;
102     capMetaData.deviceId = localDeviceId;
103     auto dbKey = CapMetaRow::GetKeyFor(localDeviceId);
104     bool status = MetaDataManager::GetInstance().SaveMeta({ dbKey.begin(), dbKey.end() }, capMetaData);
105     if (status) {
106         capabilities_.Insert(localDeviceId, capMetaData);
107     }
108     ZLOGI("put capability meta data ret %{public}d", status);
109     return status;
110 }
111 } // namespace OHOS::DistributedData
112