• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2025 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 
16 #include "manage_auto_start_apps_serializer.h"
17 
18 #include <map>
19 #include "cJSON.h"
20 #include "cjson_check.h"
21 
22 namespace OHOS {
23 namespace EDM {
24 
25 const char* const BUNDLE_NAME = "bundleName";
26 const char* const ABILITY_NAME = "abilityName";
27 const char* const DISALLOW_MODIFY = "disallowModify";
28 
SetUnionPolicyData(std::vector<ManageAutoStartAppInfo> & data,std::vector<ManageAutoStartAppInfo> & currentData)29 std::vector<ManageAutoStartAppInfo> ManageAutoStartAppsSerializer::SetUnionPolicyData(
30     std::vector<ManageAutoStartAppInfo> &data, std::vector<ManageAutoStartAppInfo> &currentData)
31 {
32     std::vector<ManageAutoStartAppInfo> mergeData;
33     std::map<std::string, ManageAutoStartAppInfo> mergeMap;
34     for (ManageAutoStartAppInfo &item : data) {
35         mergeMap[item.GetUniqueKey()] = item;
36     }
37     for (const ManageAutoStartAppInfo &item : currentData) {
38         mergeMap[item.GetUniqueKey()] = item;
39     }
40     for (const auto& pair : mergeMap) {
41         mergeData.push_back(pair.second);
42     }
43     return mergeData;
44 }
45 
SetDifferencePolicyData(std::vector<ManageAutoStartAppInfo> & data,std::vector<ManageAutoStartAppInfo> & currentData)46 std::vector<ManageAutoStartAppInfo> ManageAutoStartAppsSerializer::SetDifferencePolicyData(
47     std::vector<ManageAutoStartAppInfo> &data, std::vector<ManageAutoStartAppInfo> &currentData)
48 {
49     std::vector<ManageAutoStartAppInfo> mergeData;
50     std::sort(data.begin(), data.end());
51     std::sort(currentData.begin(), currentData.end());
52     std::set_difference(currentData.begin(), currentData.end(), data.begin(), data.end(), back_inserter(mergeData));
53     return mergeData;
54 }
55 
SetNeedRemoveMergePolicyData(std::vector<ManageAutoStartAppInfo> & mergeData,std::vector<ManageAutoStartAppInfo> & data)56 std::vector<ManageAutoStartAppInfo> ManageAutoStartAppsSerializer::SetNeedRemoveMergePolicyData(
57     std::vector<ManageAutoStartAppInfo> &mergeData, std::vector<ManageAutoStartAppInfo> &data)
58 {
59     std::vector<ManageAutoStartAppInfo> removeData;
60     for (const ManageAutoStartAppInfo &item : data) {
61         if (std::find_if(mergeData.begin(), mergeData.end(), [&item](const ManageAutoStartAppInfo &mergeItem) {
62             return mergeItem.GetUniqueKey() == item.GetUniqueKey();
63         }) == mergeData.end()) {
64             removeData.push_back(item);
65         }
66     }
67     return removeData;
68 }
69 
SetIntersectionPolicyData(std::vector<std::string> & data,std::vector<ManageAutoStartAppInfo> & currentData)70 std::vector<ManageAutoStartAppInfo> ManageAutoStartAppsSerializer::SetIntersectionPolicyData(
71     std::vector<std::string> &data, std::vector<ManageAutoStartAppInfo> &currentData)
72 {
73     std::vector<ManageAutoStartAppInfo> mergeData;
74     for (const std::string &dataItem : data) {
75         for (const ManageAutoStartAppInfo &item : currentData) {
76             if (item.GetUniqueKey() == dataItem) {
77                 mergeData.push_back(item);
78                 break;
79             }
80         }
81     }
82     return mergeData;
83 }
84 
Deserialize(const std::string & policy,std::vector<ManageAutoStartAppInfo> & dataObj)85 bool ManageAutoStartAppsSerializer::Deserialize(const std::string &policy, std::vector<ManageAutoStartAppInfo> &dataObj)
86 {
87     if (policy.empty()) {
88         return true;
89     }
90     cJSON* root = cJSON_Parse(policy.c_str());
91     if (root == nullptr) {
92         return false;
93     }
94     cJSON* mapItem;
95     cJSON_ArrayForEach(mapItem, root) {
96         cJSON* bundleName = cJSON_GetObjectItem(mapItem, BUNDLE_NAME);
97         cJSON* abilityName = cJSON_GetObjectItem(mapItem, ABILITY_NAME);
98         cJSON* disallowModify = cJSON_GetObjectItem(mapItem, DISALLOW_MODIFY);
99         ManageAutoStartAppInfo appInfo;
100         if (bundleName == nullptr && disallowModify == nullptr && abilityName == nullptr && cJSON_IsString(mapItem)) {
101             std::string autoStartString = cJSON_GetStringValue(mapItem);
102             size_t index = autoStartString.find("/");
103             if (index != autoStartString.npos) {
104                 appInfo.SetBundleName(autoStartString.substr(0, index));
105                 appInfo.SetAbilityName(autoStartString.substr(index + 1));
106                 appInfo.SetDisallowModify(true);
107                 dataObj.emplace_back(appInfo);
108             } else {
109                 EDMLOGE("ManageAutoStartAppsSerializer parse auto start app want failed");
110                 cJSON_Delete(root);
111                 return false;
112             }
113         } else if (!cJSON_IsString(bundleName) || !cJSON_IsBool(disallowModify) || !cJSON_IsString(abilityName)) {
114             EDMLOGI("ManageAutoStartAppsSerializer::cJSON_GetObjectItem get error type.");
115             cJSON_Delete(root);
116             return false;
117         } else {
118             appInfo.SetBundleName(cJSON_GetStringValue(bundleName));
119             appInfo.SetAbilityName(cJSON_GetStringValue(abilityName));
120             appInfo.SetDisallowModify(cJSON_IsTrue(disallowModify));
121             dataObj.emplace_back(appInfo);
122         }
123     }
124     cJSON_Delete(root);
125     return true;
126 }
127 
Serialize(const std::vector<ManageAutoStartAppInfo> & dataObj,std::string & policy)128 bool ManageAutoStartAppsSerializer::Serialize(const std::vector<ManageAutoStartAppInfo> &dataObj,
129     std::string &policy)
130 {
131     if (dataObj.empty()) {
132         return true;
133     }
134     cJSON* root = nullptr;
135     CJSON_CREATE_OBJECT_AND_CHECK(root, false);
136     for (auto& mapIt : dataObj) {
137         cJSON* policyObject = nullptr;
138         CJSON_CREATE_OBJECT_AND_CHECK_AND_CLEAR(policyObject, false, root);
139         cJSON_AddStringToObject(policyObject, BUNDLE_NAME, mapIt.GetBundleName().c_str());
140         cJSON_AddStringToObject(policyObject, ABILITY_NAME, mapIt.GetAbilityName().c_str());
141         cJSON_AddBoolToObject(policyObject, DISALLOW_MODIFY, mapIt.GetDisallowModify());
142         if (!cJSON_AddItemToArray(root, policyObject)) {
143             cJSON_Delete(root);
144             cJSON_Delete(policyObject);
145             return false;
146         }
147     }
148     char *cJsonStr = cJSON_Print(root);
149     if (cJsonStr != nullptr) {
150         policy = std::string(cJsonStr);
151         EDMLOGI("ManageAutoStartAppsSerializer::Serialize : %{public}s.", policy.c_str());
152         cJSON_free(cJsonStr);
153     }
154     cJSON_Delete(root);
155     return true;
156 }
157 
GetPolicy(MessageParcel & data,std::vector<ManageAutoStartAppInfo> & result)158 bool ManageAutoStartAppsSerializer::GetPolicy(MessageParcel &data,
159     std::vector<ManageAutoStartAppInfo> &result)
160 {
161     uint32_t size = data.ReadUint32();
162     if (size > EdmConstants::AUTO_START_APPS_MAX_SIZE) {
163         EDMLOGE("ManageAutoStartAppsSerializer:GetPolicy size=[%{public}u] is too large", size);
164         return false;
165     }
166     for (uint32_t i = 0; i < size; i++) {
167         ManageAutoStartAppInfo info;
168         if (!ManageAutoStartAppInfo::Unmarshalling(data, info)) {
169             EDMLOGE("ManageAutoStartAppsSerializer GetDataByParcel::read parcel fail");
170             return false;
171         }
172         result.emplace_back(info);
173     }
174     return true;
175 }
176 
WritePolicy(MessageParcel & reply,std::vector<ManageAutoStartAppInfo> & result)177 bool ManageAutoStartAppsSerializer::WritePolicy(MessageParcel &reply,
178     std::vector<ManageAutoStartAppInfo> &result)
179 {
180     return true;
181 }
182 
MergePolicy(std::vector<std::vector<ManageAutoStartAppInfo>> & data,std::vector<ManageAutoStartAppInfo> & result)183 bool ManageAutoStartAppsSerializer::MergePolicy(std::vector<std::vector<ManageAutoStartAppInfo>> &data,
184     std::vector<ManageAutoStartAppInfo> &result)
185 {
186     std::set<ManageAutoStartAppInfo> stData;
187     std::map<std::string, ManageAutoStartAppInfo> mapData;
188     for (const auto &dataItem : data) {
189         for (const ManageAutoStartAppInfo &item : dataItem) {
190             if (mapData.find(item.GetUniqueKey()) == mapData.end()) {
191                 mapData[item.GetUniqueKey()] = item;
192                 stData.insert(item);
193             }
194         }
195     }
196     result.assign(stData.begin(), stData.end());
197     return true;
198 }
199 
UpdateByMergePolicy(std::vector<ManageAutoStartAppInfo> & data,std::vector<ManageAutoStartAppInfo> & mergeData)200 bool ManageAutoStartAppsSerializer::UpdateByMergePolicy(std::vector<ManageAutoStartAppInfo> &data,
201     std::vector<ManageAutoStartAppInfo> &mergeData)
202 {
203     for (ManageAutoStartAppInfo &dataItem : data) {
204         for (const ManageAutoStartAppInfo &mergeItem : mergeData) {
205             if (dataItem.GetUniqueKey() == mergeItem.GetUniqueKey()) {
206                 dataItem.SetDisallowModify(mergeItem.GetDisallowModify());
207                 break;
208             }
209         }
210     }
211     return true;
212 }
213 } // namespace EDM
214 } //