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
16 #include "form_info.h"
17
18 #include <fcntl.h>
19 #include <unistd.h>
20 #include <errno.h>
21 #include <string.h>
22 #include "json_serializer.h"
23 #include "nlohmann/json.hpp"
24 #include "string_ex.h"
25 #include "parcel_macro.h"
26 #include "app_log_wrapper.h"
27 #include "nlohmann/json.hpp"
28 #include "bundle_constants.h"
29
30 namespace OHOS {
31 namespace AppExecFwk {
32 namespace {
33 const std::string JSON_KEY_COLOR_MODE = "colorMode";
34 const std::string JSON_KEY_PACKAGE = "package";
35 const std::string JSON_KEY_SUPPORT_DIMENSIONS = "supportDimensions";
36 const std::string JSON_KEY_DEFAULT_DIMENSION = "defaultDimension";
37 const std::string JSON_KEY_UPDATE_ENABLED = "updateEnabled";
38 const std::string JSON_KEY_SCHEDULED_UPDATE_TIME = "scheduledUpateTime";
39 const std::string JSON_KEY_UPDATE_DURATION = "updateDuration";
40 const std::string JSON_KEY_DEEP_LINK = "deepLink";
41 const std::string JSON_KEY_JS_COMPONENT_NAME = "jsComponentName";
42 const std::string JSON_KEY_VALUE = "value";
43 const std::string JSON_KEY_NAME = "name";
44 const std::string JSON_KEY_ABILITY_NAME = "abilityName";
45 const std::string JSON_KEY_BUNDLE_NAME = "bundleName";
46 const std::string JSON_KEY_MODULE_NAME = "moduleName";
47 const std::string JSON_KEY_ORIGINAL_BUNDLE_NAME = "originalBundleName";
48 const std::string JSON_KEY_CUSTOMIZE_DATA = "customizeData";
49 const std::string JSON_KEY_DESCRIPTION = "description";
50 const std::string JSON_KEY_DESCRIPTION_ID = "descriptionId";
51 const std::string JSON_KEY_TYPE = "type";
52 const std::string JSON_KEY_LANDSCAPE_LAYOUTS = "landscapeLayouts";
53 const std::string JSON_KEY_FORMCONFIG_ABILITY = "formConfigAbility";
54 const std::string JSON_KEY_FORM_VISIBLE_NOTIFY = "formVisibleNotify";
55 const std::string JSON_KEY_RELATED_BUNDLE_NAME = "relatedBundleName";
56 const std::string JSON_KEY_DEFAULT_FLAG = "defaultFlag";
57 const std::string JSON_KEY_PORTRAIT_LAYOUTS = "portraitLayouts";
58 } // namespace
59
ReadFromParcel(Parcel & parcel)60 bool FormInfo::ReadFromParcel(Parcel &parcel)
61 {
62 name = Str16ToStr8(parcel.ReadString16());
63 package = Str16ToStr8(parcel.ReadString16());
64 bundleName = Str16ToStr8(parcel.ReadString16());
65 moduleName = Str16ToStr8(parcel.ReadString16());
66 abilityName = Str16ToStr8(parcel.ReadString16());
67 description = Str16ToStr8(parcel.ReadString16());
68 formConfigAbility = Str16ToStr8(parcel.ReadString16());
69 scheduledUpateTime = Str16ToStr8(parcel.ReadString16());
70 jsComponentName = Str16ToStr8(parcel.ReadString16());
71 relatedBundleName = Str16ToStr8(parcel.ReadString16());
72 originalBundleName = Str16ToStr8(parcel.ReadString16());
73 deepLink = Str16ToStr8(parcel.ReadString16());
74 updateEnabled = parcel.ReadBool();
75 defaultFlag = parcel.ReadBool();
76 formVisibleNotify = parcel.ReadBool();
77 defaultDimension = parcel.ReadInt32();
78 descriptionId = parcel.ReadInt32();
79 updateDuration = parcel.ReadInt32();
80
81 int32_t typeData;
82 READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, typeData);
83 type = static_cast<FormType>(typeData);
84
85 int32_t colorModeData;
86 READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, colorModeData);
87 colorMode = static_cast<FormsColorMode>(colorModeData);
88
89 int32_t supportDimensionSize;
90 READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, supportDimensionSize);
91
92 for (int32_t i = 0; i < supportDimensionSize; i++) {
93 supportDimensions.emplace_back(parcel.ReadInt32());
94 }
95
96 int32_t landscapeLayoutsSize;
97 READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, landscapeLayoutsSize);
98 for (auto i = 0; i < landscapeLayoutsSize; i++) {
99 landscapeLayouts.emplace_back(Str16ToStr8(parcel.ReadString16()));
100 }
101
102 int32_t portraitLayoutsSize;
103 READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, portraitLayoutsSize);
104 for (auto i = 0; i < portraitLayoutsSize; i++) {
105 portraitLayouts.emplace_back(Str16ToStr8(parcel.ReadString16()));
106 }
107
108 int32_t customizeDataSize;
109 READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, customizeDataSize);
110 for (auto i = 0; i < customizeDataSize; i++) {
111 FormCustomizeData customizeData;
112 std::string customizeName = Str16ToStr8(parcel.ReadString16());
113 std::string customizeValue = Str16ToStr8(parcel.ReadString16());
114 customizeData.name = customizeName;
115 customizeData.value = customizeValue;
116 customizeDatas.emplace_back(customizeData);
117 }
118 return true;
119 }
120
Unmarshalling(Parcel & parcel)121 FormInfo *FormInfo::Unmarshalling(Parcel &parcel)
122 {
123 FormInfo *info = new FormInfo();
124 if (!info->ReadFromParcel(parcel)) {
125 APP_LOGW("read from parcel failed");
126 delete info;
127 info = nullptr;
128 }
129 return info;
130 }
131
Marshalling(Parcel & parcel) const132 bool FormInfo::Marshalling(Parcel &parcel) const
133 {
134 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(name));
135 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(package));
136 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(bundleName));
137 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(moduleName));
138 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(abilityName));
139 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(description));
140 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(formConfigAbility));
141 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(scheduledUpateTime));
142 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(jsComponentName));
143 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(relatedBundleName));
144 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(originalBundleName));
145 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(deepLink));
146 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Bool, parcel, updateEnabled);
147 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Bool, parcel, defaultFlag);
148 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Bool, parcel, formVisibleNotify);
149 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, defaultDimension);
150 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, descriptionId);
151 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, updateDuration);
152 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, static_cast<int32_t>(type));
153 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, static_cast<int32_t>(colorMode));
154
155 const auto supportDimensionSize = static_cast<int32_t>(supportDimensions.size());
156 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, supportDimensionSize);
157 for (auto i = 0; i < supportDimensionSize; i++) {
158 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, supportDimensions[i]);
159 }
160
161 const auto landscapeLayoutsSize = static_cast<int32_t>(landscapeLayouts.size());
162 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, landscapeLayoutsSize);
163 for (auto i = 0; i < landscapeLayoutsSize; i++) {
164 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(landscapeLayouts[i]));
165 }
166
167 const auto portraitLayoutsSize = static_cast<int32_t>(portraitLayouts.size());
168 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, portraitLayoutsSize);
169 for (auto i = 0; i < portraitLayoutsSize; i++) {
170 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(portraitLayouts[i]));
171 }
172
173 const auto customizeDataSize = static_cast<int32_t>(customizeDatas.size());
174 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, customizeDataSize);
175 for (auto i = 0; i < customizeDataSize; i++) {
176 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(customizeDatas[i].name));
177 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(customizeDatas[i].value));
178 }
179 return true;
180 }
181
to_json(nlohmann::json & jsonObject,const FormCustomizeData & customizeDatas)182 void to_json(nlohmann::json &jsonObject, const FormCustomizeData &customizeDatas)
183 {
184 jsonObject = nlohmann::json{
185 {JSON_KEY_NAME, customizeDatas.name},
186 {JSON_KEY_VALUE, customizeDatas.value}
187 };
188 }
189
to_json(nlohmann::json & jsonObject,const FormInfo & formInfo)190 void to_json(nlohmann::json &jsonObject, const FormInfo &formInfo)
191 {
192 jsonObject = nlohmann::json{
193 {JSON_KEY_NAME, formInfo.name},
194 {JSON_KEY_PACKAGE, formInfo.package},
195 {JSON_KEY_BUNDLE_NAME, formInfo.bundleName},
196 {JSON_KEY_MODULE_NAME, formInfo.moduleName},
197 {JSON_KEY_ABILITY_NAME, formInfo.abilityName},
198 {JSON_KEY_DESCRIPTION, formInfo.description},
199 {JSON_KEY_RELATED_BUNDLE_NAME, formInfo.relatedBundleName},
200 {JSON_KEY_JS_COMPONENT_NAME, formInfo.jsComponentName},
201 {JSON_KEY_DEEP_LINK, formInfo.deepLink},
202 {JSON_KEY_FORMCONFIG_ABILITY, formInfo.formConfigAbility},
203 {JSON_KEY_SCHEDULED_UPDATE_TIME, formInfo.scheduledUpateTime},
204 {JSON_KEY_ORIGINAL_BUNDLE_NAME, formInfo.originalBundleName},
205 {JSON_KEY_DESCRIPTION_ID, formInfo.descriptionId},
206 {JSON_KEY_UPDATE_DURATION, formInfo.updateDuration},
207 {JSON_KEY_DEFAULT_DIMENSION, formInfo.defaultDimension},
208 {JSON_KEY_DEFAULT_FLAG, formInfo.defaultFlag},
209 {JSON_KEY_FORM_VISIBLE_NOTIFY, formInfo.formVisibleNotify},
210 {JSON_KEY_UPDATE_ENABLED, formInfo.updateEnabled},
211 {JSON_KEY_TYPE, formInfo.type},
212 {JSON_KEY_COLOR_MODE, formInfo.colorMode},
213 {JSON_KEY_SUPPORT_DIMENSIONS, formInfo.supportDimensions},
214 {JSON_KEY_CUSTOMIZE_DATA, formInfo.customizeDatas},
215 {JSON_KEY_LANDSCAPE_LAYOUTS, formInfo.landscapeLayouts},
216 {JSON_KEY_PORTRAIT_LAYOUTS, formInfo.portraitLayouts}
217 };
218 }
219
from_json(const nlohmann::json & jsonObject,FormCustomizeData & customizeDatas)220 void from_json(const nlohmann::json &jsonObject, FormCustomizeData &customizeDatas)
221 {
222 customizeDatas.name = jsonObject.at(JSON_KEY_NAME).get<std::string>();
223 customizeDatas.value = jsonObject.at(JSON_KEY_VALUE).get<std::string>();
224 }
225
from_json(const nlohmann::json & jsonObject,FormInfo & formInfo)226 void from_json(const nlohmann::json &jsonObject, FormInfo &formInfo)
227 {
228 formInfo.bundleName = jsonObject.at(JSON_KEY_BUNDLE_NAME).get<std::string>();
229 formInfo.package = jsonObject.at(JSON_KEY_PACKAGE).get<std::string>();
230 formInfo.moduleName = jsonObject.at(JSON_KEY_MODULE_NAME).get<std::string>();
231 formInfo.abilityName = jsonObject.at(JSON_KEY_ABILITY_NAME).get<std::string>();
232 formInfo.name = jsonObject.at(JSON_KEY_NAME).get<std::string>();
233 formInfo.description = jsonObject.at(JSON_KEY_DESCRIPTION).get<std::string>();
234 formInfo.relatedBundleName = jsonObject.at(JSON_KEY_RELATED_BUNDLE_NAME).get<std::string>();
235 formInfo.jsComponentName = jsonObject.at(JSON_KEY_JS_COMPONENT_NAME).get<std::string>();
236 formInfo.deepLink = jsonObject.at(JSON_KEY_DEEP_LINK).get<std::string>();
237 formInfo.formConfigAbility = jsonObject.at(JSON_KEY_FORMCONFIG_ABILITY).get<std::string>();
238 formInfo.scheduledUpateTime = jsonObject.at(JSON_KEY_SCHEDULED_UPDATE_TIME).get<std::string>();
239 formInfo.originalBundleName = jsonObject.at(JSON_KEY_ORIGINAL_BUNDLE_NAME).get<std::string>();
240 formInfo.descriptionId = jsonObject.at(JSON_KEY_DESCRIPTION_ID).get<int32_t>();
241 formInfo.updateDuration = jsonObject.at(JSON_KEY_UPDATE_DURATION).get<int32_t>();
242 formInfo.defaultDimension = jsonObject.at(JSON_KEY_DEFAULT_DIMENSION).get<int32_t>();
243 formInfo.defaultFlag = jsonObject.at(JSON_KEY_DEFAULT_FLAG).get<bool>();
244 formInfo.formVisibleNotify = jsonObject.at(JSON_KEY_FORM_VISIBLE_NOTIFY).get<bool>();
245 formInfo.updateEnabled = jsonObject.at(JSON_KEY_UPDATE_ENABLED).get<bool>();
246 formInfo.type = jsonObject.at(JSON_KEY_TYPE).get<FormType>();
247 formInfo.colorMode = jsonObject.at(JSON_KEY_COLOR_MODE).get<FormsColorMode>();
248 formInfo.supportDimensions = jsonObject.at(JSON_KEY_SUPPORT_DIMENSIONS).get<std::vector<int32_t>>();
249 formInfo.customizeDatas = jsonObject.at(JSON_KEY_CUSTOMIZE_DATA).get<std::vector<FormCustomizeData>>();
250 formInfo.landscapeLayouts = jsonObject.at(JSON_KEY_LANDSCAPE_LAYOUTS).get<std::vector<std::string>>();
251 formInfo.portraitLayouts = jsonObject.at(JSON_KEY_PORTRAIT_LAYOUTS).get<std::vector<std::string>>();
252 }
253 } // namespace AppExecFwk
254 } // namespace OHOS
255