• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 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 #include "fs_manager/cmp_partition.h"
16 #include "log/log.h"
17 
18 using namespace std;
19 
20 namespace Updater {
21 static PartitonList g_updaterPlist;
ComparePartition(const PartitonList & plist,struct Partition & newp)22 static PartitionChangeType ComparePartition(const PartitonList &plist, struct Partition &newp)
23 {
24     PartitionChange cg = PARTITION_NEW;
25     struct Partition *oldp = nullptr;
26     for (auto& p : plist) {
27         if (!strcmp(p->partName.c_str(), newp.partName.c_str())) {
28             LOG(INFO) << "compare_partition old " << p->partName;
29             cg = PARTITION_OLD;
30             oldp = p;
31             break;
32         }
33     }
34     PartitionChangeType ct = NOT_CHANGE;
35     switch (cg) {
36         case PARTITION_NEW:
37             ct = NEW_PARTITION;
38             newp.changeType = NEW_PARTITION;
39             break;
40         case PARTITION_OLD:
41             if (oldp->start != newp.start) {
42                 LOG(INFO) << "newp.start " << newp.start;
43                 ct = START_CHANGE;
44                 oldp->changeType = START_CHANGE;
45                 newp.changeType = START_CHANGE;
46             } else if (oldp->length != newp.length) {
47                 LOG(INFO) << "newp.length " << newp.length;
48                 ct =  LENGTH_CHANGE;
49                 oldp->changeType = LENGTH_CHANGE;
50                 newp.changeType = LENGTH_CHANGE;
51             } else {
52                 ct =  NOT_CHANGE;
53                 oldp->changeType = NOT_CHANGE;
54             }
55             break;
56         default:
57             break;
58     }
59     return ct;
60 }
61 
TraversePartitionList(const PartitonList & nlist,const PartitonList & olist,PartitonList & ulist)62 static int TraversePartitionList(const PartitonList &nlist, const PartitonList &olist, PartitonList &ulist)
63 {
64     if (nlist.empty() || olist.empty()) {
65         return 0;
66     }
67 
68     ulist.clear();
69     PartitionChangeType changeType = NOT_CHANGE;
70     for (auto& p : nlist) {
71         changeType = ComparePartition(olist, *p);
72         if (changeType != NOT_CHANGE) {
73             LOG(INFO) << "change p->partName " << p->partName;
74             ulist.push_back(p);
75         }
76     }
77     return 1;
78 }
79 
RegisterUpdaterPartitionList(const PartitonList & nlist,const PartitonList & olist)80 int RegisterUpdaterPartitionList(const PartitonList &nlist, const PartitonList &olist)
81 {
82     if (nlist.empty() || olist.empty()) {
83         return 0;
84     }
85 
86     g_updaterPlist.clear();
87     int ret = TraversePartitionList(nlist, olist, g_updaterPlist);
88 
89     return ret;
90 }
91 
GetRegisterUpdaterPartitionList(PartitonList & ulist)92 int GetRegisterUpdaterPartitionList(PartitonList &ulist)
93 {
94     if (g_updaterPlist.empty()) {
95         return 1;
96     }
97 
98     ulist.clear();
99     ulist.assign(g_updaterPlist.begin(), g_updaterPlist.end());
100     if (ulist.empty()) {
101         return 0;
102     }
103     return 1;
104 }
105 } // namespace Updater
106