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_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<FormStatusMachineInfo> FORM_STATUS_TABLE_INIT = {
25 // INIT
26 {
27 FormFsmStatus::INIT,
28 FormFsmEvent::RENDER_FORM,
29 FormFsmStatus::RENDERING,
30 FormFsmProcessType::PROCESS_TASK_DIRECT,
31 FormEventTimeout::TIMEOUT_3_S,
32 },
33 {
34 FormFsmStatus::INIT,
35 FormFsmEvent::RECYCLE_DATA,
36 FormFsmStatus::RECYCLING_DATA,
37 FormFsmProcessType::PROCESS_TASK_DIRECT,
38 FormEventTimeout::TIMEOUT_3_S,
39 },
40 {
41 FormFsmStatus::INIT,
42 FormFsmEvent::RECYCLE_FORM,
43 FormFsmStatus::RECYCLING,
44 FormFsmProcessType::PROCESS_TASK_DIRECT,
45 FormEventTimeout::TIMEOUT_3_S,
46 },
47 {
48 FormFsmStatus::INIT,
49 FormFsmEvent::DELETE_FORM,
50 FormFsmStatus::DELETING,
51 FormFsmProcessType::PROCESS_TASK_DIRECT,
52 FormEventTimeout::TIMEOUT_3_S,
53 },
54 };
55
56 const std::vector<FormStatusMachineInfo> FORM_STATUS_TABLE_RENDERING = {
57 // RENDERING
58 {
59 FormFsmStatus::RENDERING,
60 FormFsmEvent::RENDER_FORM,
61 FormFsmStatus::RENDERING,
62 FormFsmProcessType::ADD_TASK_TO_QUEUE_UNIQUE,
63 FormEventTimeout::TIMEOUT_NO_NEED,
64 },
65 {
66 FormFsmStatus::RENDERING,
67 FormFsmEvent::RENDER_FORM_DONE,
68 FormFsmStatus::RENDERED,
69 FormFsmProcessType::PROCESS_TASK_FROM_QUEUE,
70 FormEventTimeout::TIMEOUT_NO_NEED,
71 },
72 {
73 FormFsmStatus::RENDERING,
74 FormFsmEvent::RENDER_FORM_FAIL,
75 FormFsmStatus::UNPROCESSABLE,
76 FormFsmProcessType::PROCESS_TASK_RETRY,
77 FormEventTimeout::TIMEOUT_NO_NEED,
78 },
79 {
80 FormFsmStatus::RENDERING,
81 FormFsmEvent::RECYCLE_DATA,
82 FormFsmStatus::RENDERING,
83 FormFsmProcessType::ADD_TASK_TO_QUEUE_PUSH,
84 FormEventTimeout::TIMEOUT_NO_NEED,
85 },
86 {
87 FormFsmStatus::RENDERING,
88 FormFsmEvent::RECYCLE_FORM,
89 FormFsmStatus::RENDERING,
90 FormFsmProcessType::ADD_TASK_TO_QUEUE_PUSH,
91 FormEventTimeout::TIMEOUT_NO_NEED,
92 },
93 {
94 FormFsmStatus::RENDERING,
95 FormFsmEvent::RECOVER_FORM,
96 FormFsmStatus::RENDERING,
97 FormFsmProcessType::ADD_TASK_TO_QUEUE_UNIQUE,
98 FormEventTimeout::TIMEOUT_NO_NEED,
99 },
100 {
101 FormFsmStatus::RENDERING,
102 FormFsmEvent::DELETE_FORM,
103 FormFsmStatus::RENDERING,
104 FormFsmProcessType::ADD_TASK_TO_QUEUE_DELETE,
105 FormEventTimeout::TIMEOUT_NO_NEED,
106 },
107 {
108 FormFsmStatus::RENDERING,
109 FormFsmEvent::EXECUTION_TIMEOUT,
110 FormFsmStatus::UNPROCESSABLE,
111 FormFsmProcessType::PROCESS_TASK_RETRY,
112 FormEventTimeout::TIMEOUT_NO_NEED,
113 },
114 };
115
116 const std::vector<FormStatusMachineInfo> FORM_STATUS_TABLE_RENDERED = {
117 {
118 FormFsmStatus::RENDERED,
119 FormFsmEvent::RENDER_FORM,
120 FormFsmStatus::RENDERING,
121 FormFsmProcessType::PROCESS_TASK_DIRECT,
122 FormEventTimeout::TIMEOUT_3_S,
123 },
124 {
125 FormFsmStatus::RENDERED,
126 FormFsmEvent::RECYCLE_DATA,
127 FormFsmStatus::RECYCLING_DATA,
128 FormFsmProcessType::PROCESS_TASK_DIRECT,
129 FormEventTimeout::TIMEOUT_3_S,
130 },
131 {
132 FormFsmStatus::RENDERED,
133 FormFsmEvent::RECYCLE_FORM,
134 FormFsmStatus::RECYCLING,
135 FormFsmProcessType::PROCESS_TASK_DIRECT,
136 FormEventTimeout::TIMEOUT_3_S,
137 },
138 {
139 FormFsmStatus::RENDERED,
140 FormFsmEvent::DELETE_FORM,
141 FormFsmStatus::DELETING,
142 FormFsmProcessType::PROCESS_TASK_DIRECT,
143 FormEventTimeout::TIMEOUT_3_S,
144 },
145 };
146
147 const std::vector<FormStatusMachineInfo> FORM_STATUS_TABLE_RECYCLED = {
148 {
149 FormFsmStatus::RECYCLED,
150 FormFsmEvent::RENDER_FORM,
151 FormFsmStatus::RENDERING,
152 FormFsmProcessType::PROCESS_TASK_DIRECT,
153 FormEventTimeout::TIMEOUT_3_S,
154 },
155 {
156 FormFsmStatus::RECYCLED,
157 FormFsmEvent::RECYCLE_FORM,
158 FormFsmStatus::RECYCLING,
159 FormFsmProcessType::PROCESS_TASK_DIRECT,
160 FormEventTimeout::TIMEOUT_3_S,
161 },
162 {
163 FormFsmStatus::RECYCLED,
164 FormFsmEvent::RECOVER_FORM,
165 FormFsmStatus::RECOVERING,
166 FormFsmProcessType::PROCESS_TASK_DIRECT,
167 FormEventTimeout::TIMEOUT_3_S,
168 },
169 {
170 FormFsmStatus::RECYCLED,
171 FormFsmEvent::DELETE_FORM,
172 FormFsmStatus::DELETING,
173 FormFsmProcessType::PROCESS_TASK_DIRECT,
174 FormEventTimeout::TIMEOUT_3_S,
175 },
176 };
177
178 const std::vector<FormStatusMachineInfo> FORM_STATUS_TABLE_RECYCLING_DATA = {
179 {
180 FormFsmStatus::RECYCLING_DATA,
181 FormFsmEvent::RENDER_FORM,
182 FormFsmStatus::RECYCLING_DATA,
183 FormFsmProcessType::ADD_TASK_TO_QUEUE_PUSH,
184 FormEventTimeout::TIMEOUT_NO_NEED,
185 },
186 {
187 FormFsmStatus::RECYCLING_DATA,
188 FormFsmEvent::RECYCLE_DATA_DONE,
189 FormFsmStatus::RECYCLING_DATA,
190 FormFsmProcessType::PROCESS_TASK_DIRECT,
191 FormEventTimeout::TIMEOUT_NO_NEED,
192 },
193 {
194 FormFsmStatus::RECYCLING_DATA,
195 FormFsmEvent::RECYCLE_DATA_FAIL,
196 FormFsmStatus::RENDERED,
197 FormFsmProcessType::PROCESS_TASK_DIRECT,
198 FormEventTimeout::TIMEOUT_NO_NEED,
199 },
200 {
201 FormFsmStatus::RECYCLING_DATA,
202 FormFsmEvent::RECYCLE_FORM,
203 FormFsmStatus::RECYCLING,
204 FormFsmProcessType::PROCESS_TASK_DIRECT,
205 FormEventTimeout::TIMEOUT_3_S,
206 },
207 {
208 FormFsmStatus::RECYCLING_DATA,
209 FormFsmEvent::RECOVER_FORM,
210 FormFsmStatus::RECYCLING_DATA,
211 FormFsmProcessType::ADD_TASK_TO_QUEUE_PUSH,
212 FormEventTimeout::TIMEOUT_NO_NEED,
213 },
214 {
215 FormFsmStatus::RECYCLING_DATA,
216 FormFsmEvent::DELETE_FORM,
217 FormFsmStatus::RECYCLING_DATA,
218 FormFsmProcessType::ADD_TASK_TO_QUEUE_DELETE,
219 FormEventTimeout::TIMEOUT_NO_NEED,
220 },
221 {
222 FormFsmStatus::RECYCLING_DATA,
223 FormFsmEvent::EXECUTION_TIMEOUT,
224 FormFsmStatus::UNPROCESSABLE,
225 FormFsmProcessType::PROCESS_TASK_RETRY,
226 FormEventTimeout::TIMEOUT_NO_NEED,
227 },
228 };
229
230 const std::vector<FormStatusMachineInfo> FORM_STATUS_TABLE_RECYCLING = {
231 {
232 FormFsmStatus::RECYCLING,
233 FormFsmEvent::RENDER_FORM,
234 FormFsmStatus::RECYCLING,
235 FormFsmProcessType::ADD_TASK_TO_QUEUE_PUSH,
236 FormEventTimeout::TIMEOUT_NO_NEED,
237 },
238 {
239 FormFsmStatus::RECYCLING,
240 FormFsmEvent::RECYCLE_FORM,
241 FormFsmStatus::RECYCLING,
242 FormFsmProcessType::ADD_TASK_TO_QUEUE_PUSH,
243 FormEventTimeout::TIMEOUT_NO_NEED,
244 },
245 {
246 FormFsmStatus::RECYCLING,
247 FormFsmEvent::RECYCLE_FORM_DONE,
248 FormFsmStatus::RECYCLED,
249 FormFsmProcessType::PROCESS_TASK_FROM_QUEUE,
250 FormEventTimeout::TIMEOUT_NO_NEED,
251 },
252 {
253 FormFsmStatus::RECYCLING,
254 FormFsmEvent::RECYCLE_FORM_FAIL,
255 FormFsmStatus::UNPROCESSABLE,
256 FormFsmProcessType::PROCESS_TASK_RETRY,
257 FormEventTimeout::TIMEOUT_NO_NEED,
258 },
259 {
260 FormFsmStatus::RECYCLING,
261 FormFsmEvent::RECOVER_FORM,
262 FormFsmStatus::RECYCLING,
263 FormFsmProcessType::ADD_TASK_TO_QUEUE_PUSH,
264 FormEventTimeout::TIMEOUT_NO_NEED,
265 },
266 {
267 FormFsmStatus::RECYCLING,
268 FormFsmEvent::DELETE_FORM,
269 FormFsmStatus::RECYCLING,
270 FormFsmProcessType::ADD_TASK_TO_QUEUE_DELETE,
271 FormEventTimeout::TIMEOUT_NO_NEED,
272 },
273 {
274 FormFsmStatus::RECYCLING,
275 FormFsmEvent::EXECUTION_TIMEOUT,
276 FormFsmStatus::UNPROCESSABLE,
277 FormFsmProcessType::PROCESS_TASK_RETRY,
278 FormEventTimeout::TIMEOUT_NO_NEED,
279 },
280 };
281
282 const std::vector<FormStatusMachineInfo> FORM_STATUS_TABLE_RECOVERING = {
283 {
284 FormFsmStatus::RECOVERING,
285 FormFsmEvent::RENDER_FORM,
286 FormFsmStatus::RECOVERING,
287 FormFsmProcessType::ADD_TASK_TO_QUEUE_UNIQUE,
288 FormEventTimeout::TIMEOUT_NO_NEED,
289 },
290 {
291 FormFsmStatus::RECOVERING,
292 FormFsmEvent::RECYCLE_DATA,
293 FormFsmStatus::RECOVERING,
294 FormFsmProcessType::ADD_TASK_TO_QUEUE_PUSH,
295 FormEventTimeout::TIMEOUT_NO_NEED,
296 },
297 {
298 FormFsmStatus::RECOVERING,
299 FormFsmEvent::RECYCLE_FORM,
300 FormFsmStatus::RECOVERING,
301 FormFsmProcessType::ADD_TASK_TO_QUEUE_PUSH,
302 FormEventTimeout::TIMEOUT_NO_NEED,
303 },
304 {
305 FormFsmStatus::RECOVERING,
306 FormFsmEvent::RECOVER_FORM_DONE,
307 FormFsmStatus::RENDERED,
308 FormFsmProcessType::PROCESS_TASK_FROM_QUEUE,
309 FormEventTimeout::TIMEOUT_NO_NEED,
310 },
311 {
312 FormFsmStatus::RECOVERING,
313 FormFsmEvent::RECOVER_FORM_FAIL,
314 FormFsmStatus::UNPROCESSABLE,
315 FormFsmProcessType::PROCESS_TASK_RETRY,
316 FormEventTimeout::TIMEOUT_NO_NEED,
317 },
318 {
319 FormFsmStatus::RECOVERING,
320 FormFsmEvent::DELETE_FORM,
321 FormFsmStatus::RECOVERING,
322 FormFsmProcessType::ADD_TASK_TO_QUEUE_DELETE,
323 FormEventTimeout::TIMEOUT_NO_NEED,
324 },
325 {
326 FormFsmStatus::RECOVERING,
327 FormFsmEvent::EXECUTION_TIMEOUT,
328 FormFsmStatus::UNPROCESSABLE,
329 FormFsmProcessType::PROCESS_TASK_RETRY,
330 FormEventTimeout::TIMEOUT_NO_NEED,
331 },
332 };
333
334 const std::vector<FormStatusMachineInfo> FORM_STATUS_TABLE_DELETING = {
335 {
336 FormFsmStatus::DELETING,
337 FormFsmEvent::RENDER_FORM,
338 FormFsmStatus::DELETING,
339 FormFsmProcessType::ADD_TASK_TO_QUEUE_PUSH,
340 FormEventTimeout::TIMEOUT_NO_NEED,
341 },
342 {
343 FormFsmStatus::DELETING,
344 FormFsmEvent::DELETE_FORM,
345 FormFsmStatus::DELETING,
346 FormFsmProcessType::ADD_TASK_TO_QUEUE_PUSH,
347 FormEventTimeout::TIMEOUT_NO_NEED,
348 },
349 {
350 FormFsmStatus::DELETING,
351 FormFsmEvent::DELETE_FORM_DONE,
352 FormFsmStatus::RENDERED,
353 FormFsmProcessType::PROCESS_TASK_FROM_QUEUE,
354 FormEventTimeout::TIMEOUT_NO_NEED,
355 },
356 {
357 FormFsmStatus::DELETING,
358 FormFsmEvent::DELETE_FORM_FAIL,
359 FormFsmStatus::UNPROCESSABLE,
360 FormFsmProcessType::PROCESS_TASK_RETRY,
361 FormEventTimeout::TIMEOUT_NO_NEED,
362 },
363 {
364 FormFsmStatus::DELETING,
365 FormFsmEvent::DELETE_FORM_FINISH,
366 FormFsmStatus::UNPROCESSABLE,
367 FormFsmProcessType::PROCESS_TASK_DELETE,
368 FormEventTimeout::TIMEOUT_NO_NEED,
369 },
370 {
371 FormFsmStatus::DELETING,
372 FormFsmEvent::EXECUTION_TIMEOUT,
373 FormFsmStatus::UNPROCESSABLE,
374 FormFsmProcessType::PROCESS_TASK_RETRY,
375 FormEventTimeout::TIMEOUT_NO_NEED,
376 },
377 };
378
379 const std::vector<FormStatusMachineInfo> FORM_STATUS_TABLE_UNPROCESSABLE = {
380 {
381 FormFsmStatus::UNPROCESSABLE,
382 FormFsmEvent::RENDER_FORM,
383 FormFsmStatus::RENDERING,
384 FormFsmProcessType::PROCESS_TASK_DIRECT,
385 FormEventTimeout::TIMEOUT_3_S,
386 },
387 {
388 FormFsmStatus::UNPROCESSABLE,
389 FormFsmEvent::RECYCLE_DATA,
390 FormFsmStatus::RECYCLING_DATA,
391 FormFsmProcessType::PROCESS_TASK_DIRECT,
392 FormEventTimeout::TIMEOUT_3_S,
393 },
394 {
395 FormFsmStatus::UNPROCESSABLE,
396 FormFsmEvent::RECYCLE_FORM,
397 FormFsmStatus::RECYCLING,
398 FormFsmProcessType::PROCESS_TASK_DIRECT,
399 FormEventTimeout::TIMEOUT_3_S,
400 },
401 {
402 FormFsmStatus::UNPROCESSABLE,
403 FormFsmEvent::RECOVER_FORM,
404 FormFsmStatus::RECOVERING,
405 FormFsmProcessType::PROCESS_TASK_DIRECT,
406 FormEventTimeout::TIMEOUT_3_S,
407 },
408 {
409 FormFsmStatus::UNPROCESSABLE,
410 FormFsmEvent::DELETE_FORM,
411 FormFsmStatus::DELETING,
412 FormFsmProcessType::PROCESS_TASK_DIRECT,
413 FormEventTimeout::TIMEOUT_3_S,
414 },
415 };
416
417 const std::unordered_map<FormFsmStatus, std::vector<FormStatusMachineInfo>> FORM_STATUS_TABLE = {
418 {FormFsmStatus::INIT, FORM_STATUS_TABLE_INIT},
419 {FormFsmStatus::RENDERING, FORM_STATUS_TABLE_RENDERING},
420 {FormFsmStatus::RENDERED, FORM_STATUS_TABLE_RENDERED},
421 {FormFsmStatus::RECYCLED, FORM_STATUS_TABLE_RECYCLED},
422 {FormFsmStatus::RECYCLING_DATA, FORM_STATUS_TABLE_RECYCLING_DATA},
423 {FormFsmStatus::RECYCLING, FORM_STATUS_TABLE_RECYCLING},
424 {FormFsmStatus::RECOVERING, FORM_STATUS_TABLE_RECOVERING},
425 {FormFsmStatus::DELETING, FORM_STATUS_TABLE_DELETING},
426 {FormFsmStatus::UNPROCESSABLE, FORM_STATUS_TABLE_UNPROCESSABLE},
427 };
428 } // namespace
429
FormStatusTable()430 FormStatusTable::FormStatusTable()
431 {
432 HILOG_INFO("create FormStatusTable");
433 }
434
~FormStatusTable()435 FormStatusTable::~FormStatusTable()
436 {
437 HILOG_DEBUG("destroy FormStatusTable");
438 }
439
GetFormStatusInfo(FormFsmStatus curStatus,FormFsmEvent event,FormStatusMachineInfo & info)440 bool FormStatusTable::GetFormStatusInfo(FormFsmStatus curStatus, FormFsmEvent event, FormStatusMachineInfo &info)
441 {
442 auto iter = FORM_STATUS_TABLE.find(curStatus);
443 if (iter == FORM_STATUS_TABLE.end()) {
444 HILOG_ERROR("form status error, curStatus is %{public}s, event is %{public}s.",
445 FormStatusPrint::FormStatusToString(curStatus).c_str(),
446 FormStatusPrint::FormEventToString(event).c_str());
447 return false;
448 }
449
450 auto tableInfo = iter->second;
451 for (size_t i = 0; i < tableInfo.size(); i++) {
452 if (tableInfo[i].event == event) {
453 info = tableInfo[i];
454 return true;
455 }
456 }
457
458 HILOG_ERROR("form status error, curStatus is %{public}s, event is %{public}s.",
459 FormStatusPrint::FormStatusToString(curStatus).c_str(),
460 FormStatusPrint::FormEventToString(event).c_str());
461 return false;
462 }
463 } // namespace AppExecFwk
464 } // namespace OHOS
465