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> ¤tData)
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> ¤tData)
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> ¤tData)
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 } //