• 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 "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