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 "status_mgr_center/form_render_status_table.h"
17 #include <unordered_map>
18 #include "fms_log_wrapper.h"
19 #include "form_status_print.h"
20
21 namespace OHOS {
22 namespace AppExecFwk {
23 namespace {
24 const std::vector<FormRenderStatusMachineInfo> FORM_STATUS_TABLE_INIT = {
25 // INIT
26 {
27 FormFsmStatus::INIT,
28 FormFsmEvent::RENDER_FORM,
29 FormFsmStatus::RENDERING,
30 FormFsmProcessType::PROCESS_TASK_DIRECT,
31 },
32 {
33 FormFsmStatus::INIT,
34 FormFsmEvent::RECYCLE_DATA,
35 FormFsmStatus::RECYCLING_DATA,
36 FormFsmProcessType::PROCESS_TASK_DIRECT,
37 },
38 {
39 FormFsmStatus::INIT,
40 FormFsmEvent::RECYCLE_FORM,
41 FormFsmStatus::RECYCLING,
42 FormFsmProcessType::PROCESS_TASK_DIRECT,
43 },
44 {
45 FormFsmStatus::INIT,
46 FormFsmEvent::DELETE_FORM,
47 FormFsmStatus::DELETING,
48 FormFsmProcessType::PROCESS_TASK_DIRECT,
49 },
50 };
51
52 const std::vector<FormRenderStatusMachineInfo> FORM_STATUS_TABLE_RENDERING = {
53 // RENDERING
54 {
55 FormFsmStatus::RENDERING,
56 FormFsmEvent::RENDER_FORM_DONE,
57 FormFsmStatus::RENDERED,
58 FormFsmProcessType::PROCESS_TASK_DIRECT,
59 },
60 {
61 FormFsmStatus::RENDERING,
62 FormFsmEvent::RENDER_FORM_FAIL,
63 FormFsmStatus::UNPROCESSABLE,
64 FormFsmProcessType::PROCESS_TASK_DIRECT,
65 },
66 };
67
68 const std::vector<FormRenderStatusMachineInfo> FORM_STATUS_TABLE_RENDERED = {
69 // RENDERED
70 {
71 FormFsmStatus::RENDERED,
72 FormFsmEvent::RENDER_FORM,
73 FormFsmStatus::RENDERING,
74 FormFsmProcessType::PROCESS_TASK_DIRECT,
75 },
76 {
77 FormFsmStatus::RENDERED,
78 FormFsmEvent::RECYCLE_DATA,
79 FormFsmStatus::RECYCLING_DATA,
80 FormFsmProcessType::PROCESS_TASK_DIRECT,
81 },
82 {
83 FormFsmStatus::RENDERED,
84 FormFsmEvent::RECYCLE_FORM,
85 FormFsmStatus::RECYCLING,
86 FormFsmProcessType::PROCESS_TASK_DIRECT,
87 },
88 {
89 FormFsmStatus::RENDERED,
90 FormFsmEvent::DELETE_FORM,
91 FormFsmStatus::DELETING,
92 FormFsmProcessType::PROCESS_TASK_DIRECT,
93 },
94 };
95
96 const std::vector<FormRenderStatusMachineInfo> FORM_STATUS_TABLE_RECYCLED = {
97 // RECYCLED
98 {
99 FormFsmStatus::RECYCLED,
100 FormFsmEvent::RENDER_FORM,
101 FormFsmStatus::RENDERING,
102 FormFsmProcessType::PROCESS_TASK_DIRECT,
103 },
104 {
105 FormFsmStatus::RECYCLED,
106 FormFsmEvent::RECYCLE_FORM,
107 FormFsmStatus::RECYCLING,
108 FormFsmProcessType::PROCESS_TASK_DIRECT,
109 },
110 {
111 FormFsmStatus::RECYCLED,
112 FormFsmEvent::RECOVER_FORM,
113 FormFsmStatus::RECOVERING,
114 FormFsmProcessType::PROCESS_TASK_DIRECT,
115 },
116 {
117 FormFsmStatus::RECYCLED,
118 FormFsmEvent::DELETE_FORM,
119 FormFsmStatus::DELETING,
120 FormFsmProcessType::PROCESS_TASK_DIRECT,
121 },
122 };
123
124 const std::vector<FormRenderStatusMachineInfo> FORM_STATUS_TABLE_RECYCLING_DATA = {
125 // RECYCLING_DATA
126 {
127 FormFsmStatus::RECYCLING_DATA,
128 FormFsmEvent::RECYCLE_DATA_DONE,
129 FormFsmStatus::RECYCLING_DATA,
130 FormFsmProcessType::PROCESS_TASK_DIRECT,
131 },
132 {
133 FormFsmStatus::RECYCLING_DATA,
134 FormFsmEvent::RECYCLE_DATA_FAIL,
135 FormFsmStatus::RENDERED,
136 FormFsmProcessType::PROCESS_TASK_DIRECT,
137 },
138 {
139 FormFsmStatus::RECYCLING_DATA,
140 FormFsmEvent::RECYCLE_FORM,
141 FormFsmStatus::RECYCLING,
142 FormFsmProcessType::PROCESS_TASK_DIRECT,
143 },
144 };
145
146 const std::vector<FormRenderStatusMachineInfo> FORM_STATUS_TABLE_RECYCLING = {
147 // RECYCLING
148 {
149 FormFsmStatus::RECYCLING,
150 FormFsmEvent::RECYCLE_FORM_DONE,
151 FormFsmStatus::RECYCLED,
152 FormFsmProcessType::PROCESS_TASK_DIRECT,
153 },
154 {
155 FormFsmStatus::RECYCLING,
156 FormFsmEvent::RECYCLE_FORM_FAIL,
157 FormFsmStatus::UNPROCESSABLE,
158 FormFsmProcessType::PROCESS_TASK_DIRECT,
159 },
160 };
161
162 const std::vector<FormRenderStatusMachineInfo> FORM_STATUS_TABLE_RECOVERING = {
163 // RECOVERING
164 {
165 FormFsmStatus::RECOVERING,
166 FormFsmEvent::RECOVER_FORM_DONE,
167 FormFsmStatus::RENDERED,
168 FormFsmProcessType::PROCESS_TASK_DIRECT,
169 },
170 {
171 FormFsmStatus::RECOVERING,
172 FormFsmEvent::RECOVER_FORM_FAIL,
173 FormFsmStatus::UNPROCESSABLE,
174 FormFsmProcessType::PROCESS_TASK_DIRECT,
175 },
176 };
177
178 const std::vector<FormRenderStatusMachineInfo> FORM_STATUS_TABLE_DELETING = {
179 // DELETING
180 {
181 FormFsmStatus::DELETING,
182 FormFsmEvent::DELETE_FORM_DONE,
183 FormFsmStatus::RENDERED,
184 FormFsmProcessType::PROCESS_TASK_DIRECT,
185 },
186 {
187 FormFsmStatus::DELETING,
188 FormFsmEvent::DELETE_FORM_FAIL,
189 FormFsmStatus::UNPROCESSABLE,
190 FormFsmProcessType::PROCESS_TASK_DIRECT,
191 },
192 {
193 FormFsmStatus::DELETING,
194 FormFsmEvent::DELETE_FORM_FINISH,
195 FormFsmStatus::UNPROCESSABLE,
196 FormFsmProcessType::PROCESS_TASK_DIRECT,
197 },
198 };
199
200 const std::vector<FormRenderStatusMachineInfo> FORM_STATUS_TABLE_UNPROCESSABLE = {
201 // UNPROCESSABLE
202 {
203 FormFsmStatus::UNPROCESSABLE,
204 FormFsmEvent::RENDER_FORM,
205 FormFsmStatus::RENDERING,
206 FormFsmProcessType::PROCESS_TASK_DIRECT,
207 },
208 {
209 FormFsmStatus::UNPROCESSABLE,
210 FormFsmEvent::RECYCLE_DATA,
211 FormFsmStatus::RECYCLING_DATA,
212 FormFsmProcessType::PROCESS_TASK_DIRECT,
213 },
214 {
215 FormFsmStatus::UNPROCESSABLE,
216 FormFsmEvent::RECYCLE_FORM,
217 FormFsmStatus::RECYCLING,
218 FormFsmProcessType::PROCESS_TASK_DIRECT,
219 },
220 {
221 FormFsmStatus::UNPROCESSABLE,
222 FormFsmEvent::RECOVER_FORM,
223 FormFsmStatus::RECOVERING,
224 FormFsmProcessType::PROCESS_TASK_DIRECT,
225 },
226 {
227 FormFsmStatus::UNPROCESSABLE,
228 FormFsmEvent::DELETE_FORM,
229 FormFsmStatus::DELETING,
230 FormFsmProcessType::PROCESS_TASK_DIRECT,
231 },
232 };
233
234 const std::unordered_map<FormFsmStatus, std::vector<FormRenderStatusMachineInfo>> FORM_STATUS_TABLE = {
235 {FormFsmStatus::INIT, FORM_STATUS_TABLE_INIT},
236 {FormFsmStatus::RENDERING, FORM_STATUS_TABLE_RENDERING},
237 {FormFsmStatus::RENDERED, FORM_STATUS_TABLE_RENDERED},
238 {FormFsmStatus::RECYCLED, FORM_STATUS_TABLE_RECYCLED},
239 {FormFsmStatus::RECYCLING_DATA, FORM_STATUS_TABLE_RECYCLING_DATA},
240 {FormFsmStatus::RECYCLING, FORM_STATUS_TABLE_RECYCLING},
241 {FormFsmStatus::RECOVERING, FORM_STATUS_TABLE_RECOVERING},
242 {FormFsmStatus::DELETING, FORM_STATUS_TABLE_DELETING},
243 {FormFsmStatus::UNPROCESSABLE, FORM_STATUS_TABLE_UNPROCESSABLE},
244 };
245 } // namespace
246
FormRenderStatusTable()247 FormRenderStatusTable::FormRenderStatusTable()
248 {
249 HILOG_INFO("create FormRenderStatusTable");
250 }
251
~FormRenderStatusTable()252 FormRenderStatusTable::~FormRenderStatusTable()
253 {
254 HILOG_DEBUG("destroy FormRenderStatusTable");
255 }
256
GetFormStatusInfo(FormFsmStatus curStatus,FormFsmEvent event,FormRenderStatusMachineInfo & info)257 bool FormRenderStatusTable::GetFormStatusInfo(
258 FormFsmStatus curStatus, FormFsmEvent event, FormRenderStatusMachineInfo &info)
259 {
260 auto iter = FORM_STATUS_TABLE.find(curStatus);
261 if (iter == FORM_STATUS_TABLE.end()) {
262 HILOG_ERROR("not find table, curStatus is %{public}s, event is %{public}s.",
263 FormStatusPrint::FormStatusToString(curStatus).c_str(),
264 FormStatusPrint::FormEventToString(event).c_str());
265 return false;
266 }
267
268 auto tableInfo = iter->second;
269 for (size_t i = 0; i < tableInfo.size(); i++) {
270 if (tableInfo[i].event == event) {
271 info = tableInfo[i];
272 return true;
273 }
274 }
275
276 HILOG_ERROR("form status error, curStatus is %{public}s, event is %{public}s.",
277 FormStatusPrint::FormStatusToString(curStatus).c_str(),
278 FormStatusPrint::FormEventToString(event).c_str());
279 return false;
280 }
281 } // namespace AppExecFwk
282 } // namespace OHOS
283