* Copyright (c) 2021 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "fs_manager/cmp_partition.h"
#include "log/log.h"
using namespace std;
namespace Updater {
static PartitonList g_updaterPlist;
static PartitionChangeType ComparePartition(const PartitonList &plist, struct Partition &newp)
{
PartitionChange cg = PARTITION_NEW;
struct Partition *oldp = nullptr;
for (auto& p : plist) {
if (!strcmp(p->partName.c_str(), newp.partName.c_str())) {
LOG(INFO) << "compare_partition old " << p->partName;
cg = PARTITION_OLD;
oldp = p;
break;
}
}
PartitionChangeType ct = NOT_CHANGE;
switch (cg) {
case PARTITION_NEW:
ct = NEW_PARTITION;
newp.changeType = NEW_PARTITION;
break;
case PARTITION_OLD:
if (oldp->start != newp.start) {
LOG(INFO) << "newp.start " << newp.start;
ct = START_CHANGE;
oldp->changeType = START_CHANGE;
newp.changeType = START_CHANGE;
} else if (oldp->length != newp.length) {
LOG(INFO) << "newp.length " << newp.length;
ct = LENGTH_CHANGE;
oldp->changeType = LENGTH_CHANGE;
newp.changeType = LENGTH_CHANGE;
} else {
ct = NOT_CHANGE;
oldp->changeType = NOT_CHANGE;
}
break;
default:
break;
}
return ct;
}
static int TraversePartitionList(const PartitonList &nlist, const PartitonList &olist, PartitonList &ulist)
{
if (nlist.empty() || olist.empty()) {
return 0;
}
ulist.clear();
PartitionChangeType changeType = NOT_CHANGE;
for (auto& p : nlist) {
changeType = ComparePartition(olist, *p);
if (changeType != NOT_CHANGE) {
LOG(INFO) << "change p->partName " << p->partName;
ulist.push_back(p);
}
}
return 1;
}
int RegisterUpdaterPartitionList(const PartitonList &nlist, const PartitonList &olist)
{
if (nlist.empty() || olist.empty()) {
return 0;
}
g_updaterPlist.clear();
int ret = TraversePartitionList(nlist, olist, g_updaterPlist);
return ret;
}
int GetRegisterUpdaterPartitionList(PartitonList &ulist)
{
if (g_updaterPlist.empty()) {
return 1;
}
ulist.clear();
ulist.assign(g_updaterPlist.begin(), g_updaterPlist.end());
if (ulist.empty()) {
return 0;
}
return 1;
}
}