1 /*
2 * Copyright (c) 2023-2024 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_status_mgr.h"
17 #include "form_status_queue.h"
18 #include "fms_log_wrapper.h"
19
20 namespace OHOS {
21 namespace AppExecFwk {
FormStatusMgr()22 FormStatusMgr::FormStatusMgr()
23 {
24 HILOG_DEBUG("create FormStatusMgr");
25 }
26
~FormStatusMgr()27 FormStatusMgr::~FormStatusMgr()
28 {
29 HILOG_DEBUG("destroy FormStatusMgr");
30 }
31
AddFormStatus(const int64_t formId,FormStatus formStatus)32 void FormStatusMgr::AddFormStatus(const int64_t formId, FormStatus formStatus)
33 {
34 std::unique_lock<std::shared_mutex> lock(formStatusMutex_);
35 formStatusMap_[formId] = formStatus;
36 HILOG_INFO("AddFormStatus formId:%{public}" PRId64 ", formStatus is %{public}d.", formId, (int)formStatus);
37 }
38
DeleteFormStatus(const int64_t formId)39 void FormStatusMgr::DeleteFormStatus(const int64_t formId)
40 {
41 std::unique_lock<std::shared_mutex> lock(formStatusMutex_);
42 formStatusMap_.erase(formId);
43 HILOG_INFO("formStatusMap_ erase, formId:%{public}" PRId64 ". ", formId);
44 }
45
GetFormStatus(const int64_t formId,FormStatus & formStatus)46 bool FormStatusMgr::GetFormStatus(const int64_t formId, FormStatus &formStatus)
47 {
48 FormStatus currentFormStatus;
49 {
50 std::shared_lock<std::shared_mutex> lock(formStatusMutex_);
51 auto iter = formStatusMap_.find(formId);
52 if (iter == formStatusMap_.end()) {
53 HILOG_ERROR("formStatusMap_ do not exist, formId:%{public}" PRId64 ". ", formId);
54 return false;
55 }
56 currentFormStatus = iter->second;
57 }
58 formStatus = currentFormStatus;
59 HILOG_INFO("GetFormStatus formId:%{public}" PRId64 ", formStatus is %{public}d.", formId, (int)formStatus);
60 return true;
61 }
62
SetFormStatus(const int64_t formId,FormStatus formStatus)63 bool FormStatusMgr::SetFormStatus(const int64_t formId, FormStatus formStatus)
64 {
65 std::unique_lock<std::shared_mutex> lock(formStatusMutex_);
66 auto iter = formStatusMap_.find(formId);
67 if (iter == formStatusMap_.end()) {
68 HILOG_ERROR("formStatusMap_ do not exist, formId:%{public}" PRId64 ". ", formId);
69 return false;
70 }
71 iter->second = formStatus;
72 HILOG_INFO("SetFormStatus formId:%{public}" PRId64 ", formStatus is %{public}d.", formId, (int)formStatus);
73 return true;
74 }
75
isProcessableFormStatus(const int64_t formId)76 bool FormStatusMgr::isProcessableFormStatus(const int64_t formId)
77 {
78 std::shared_lock<std::shared_mutex> lock(formStatusMutex_);
79 if (formStatusMap_.find(formId) == formStatusMap_.end()) {
80 HILOG_ERROR("formStatusMap_ do not exist, formId:%{public}" PRId64 ". ", formId);
81 return false;
82 }
83 if (formStatusMap_[formId] == FormStatus::RECOVERED) {
84 return true;
85 } else if (formStatusMap_[formId] == FormStatus::RECYCLED) {
86 return true;
87 } else {
88 return false;
89 }
90 }
91
ResetFormStatus(const int64_t & formId)92 void FormStatusMgr::ResetFormStatus(const int64_t &formId)
93 {
94 if (isProcessableFormStatus(formId)) {
95 return;
96 }
97 HILOG_INFO("Reset formId:%{public}" PRId64 " status.", formId);
98 SetFormStatus(formId, FormStatus::RECOVERED);
99 }
100
OnRenderFormDone(const int64_t & formId)101 void FormStatusMgr::OnRenderFormDone(const int64_t &formId)
102 {
103 SetFormStatus(formId, FormStatus::RECOVERED);
104 FormStatusQueue::GetInstance().PostFormCommandTaskByFormId(formId);
105 }
106
OnRecoverFormDone(const int64_t & formId)107 void FormStatusMgr::OnRecoverFormDone(const int64_t &formId)
108 {
109 SetFormStatus(formId, FormStatus::RECOVERED);
110 FormStatusQueue::GetInstance().PostFormCommandTaskByFormId(formId);
111 }
112
OnRecycleFormDone(const int64_t & formId)113 void FormStatusMgr::OnRecycleFormDone(const int64_t &formId)
114 {
115 SetFormStatus(formId, FormStatus::RECYCLED);
116 FormStatusQueue::GetInstance().PostFormCommandTaskByFormId(formId);
117 }
118 } // namespace AppExecFwk
119 } // namespace OHOS
120