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