• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 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_data_proxy_mgr.h"
17 
18 #include "fms_log_wrapper.h"
19 #include "form_bms_helper.h"
20 #include "form_data_mgr.h"
21 #include "form_data_proxy_record.h"
22 #include "form_util.h"
23 #include "form_mgr_errors.h"
24 
25 namespace OHOS {
26 namespace AppExecFwk {
FormDataProxyMgr()27 FormDataProxyMgr::FormDataProxyMgr()
28 {}
29 
~FormDataProxyMgr()30 FormDataProxyMgr::~FormDataProxyMgr()
31 {}
32 
SubscribeFormData(int64_t formId,const std::vector<FormDataProxy> & formDataProxies)33 ErrCode FormDataProxyMgr::SubscribeFormData(int64_t formId, const std::vector<FormDataProxy> &formDataProxies)
34 {
35     HILOG_DEBUG("subscribe form data. formId: %{public}s, proxy data size: %{public}zu",
36         std::to_string(formId).c_str(), formDataProxies.size());
37     if (formDataProxies.empty()) {
38         HILOG_DEBUG("formDataProxies is empty.");
39         return ERR_OK;
40     }
41 
42     FormRecord formRecord;
43     if (!FormDataMgr::GetInstance().GetFormRecord(formId, formRecord)) {
44         HILOG_ERROR("not exist such form:%{public}" PRId64 ".", formId);
45         return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
46     }
47 
48     if (!formRecord.isDataProxy) {
49         HILOG_DEBUG("not data proxy form, formId:%{public}" PRId64 ".", formId);
50         return ERR_OK;
51     }
52 
53     std::lock_guard<std::mutex> lock(formDataProxyRecordMutex_);
54     auto search = formDataProxyRecordMap_.find(formId);
55     if (search != formDataProxyRecordMap_.end()) {
56         if (search->second != nullptr) {
57             HILOG_DEBUG("the form has already subscribed, formId: %{public}s.", std::to_string(formId).c_str());
58             search->second->UnsubscribeFormData();
59         }
60     }
61 
62     ApplicationInfo appInfo;
63     if (FormBmsHelper::GetInstance().GetApplicationInfo(formRecord.bundleName, FormUtil::GetCurrentAccountId(),
64         appInfo) != ERR_OK) {
65         HILOG_ERROR("get app info failed.");
66         return ERR_APPEXECFWK_FORM_COMMON_CODE;
67     }
68     std::shared_ptr<FormDataProxyRecord> formDataProxyRecord = std::make_shared<FormDataProxyRecord>(formId,
69         formRecord.bundleName, formRecord.uiSyntax, appInfo.accessTokenId, formRecord.uid);
70     auto ret = formDataProxyRecord->SubscribeFormData(formDataProxies);
71     if (ret != ERR_OK) {
72         HILOG_ERROR("SubscribeFormData failed.");
73         return ret;
74     }
75     formDataProxyRecordMap_[formId] = formDataProxyRecord;
76     return ERR_OK;
77 }
78 
UnsubscribeFormData(int64_t formId)79 ErrCode FormDataProxyMgr::UnsubscribeFormData(int64_t formId)
80 {
81     HILOG_DEBUG("unsubscribe form data. formId: %{public}s", std::to_string(formId).c_str());
82     std::lock_guard<std::mutex> lock(formDataProxyRecordMutex_);
83     auto search = formDataProxyRecordMap_.find(formId);
84     if (search != formDataProxyRecordMap_.end()) {
85         if (search->second != nullptr) {
86             search->second->UnsubscribeFormData();
87         }
88         formDataProxyRecordMap_.erase(formId);
89     }
90 
91     return ERR_OK;
92 }
93 
UpdateSubscribeFormData(int64_t formId,const std::vector<FormDataProxy> & formDataProxies)94 void FormDataProxyMgr::UpdateSubscribeFormData(int64_t formId, const std::vector<FormDataProxy> &formDataProxies)
95 {
96     HILOG_DEBUG("update subscribe form data. formId: %{public}s", std::to_string(formId).c_str());
97     std::lock_guard<std::mutex> lock(formDataProxyRecordMutex_);
98     auto search = formDataProxyRecordMap_.find(formId);
99     if (search != formDataProxyRecordMap_.end()) {
100         if (search->second != nullptr) {
101             search->second->UpdateSubscribeFormData(formDataProxies);
102         }
103     }
104 }
105 
ProduceFormDataProxies(int64_t formId,const std::vector<FormDataProxy> & formDataProxies)106 void FormDataProxyMgr::ProduceFormDataProxies(int64_t formId, const std::vector<FormDataProxy> &formDataProxies)
107 {
108     std::lock_guard<std::mutex> lock(formDataProxiesMutex_);
109     formDataProxiesMap_[formId] = formDataProxies;
110 }
111 
ConsumeFormDataProxies(int64_t formId,std::vector<FormDataProxy> & formDataProxies)112 bool FormDataProxyMgr::ConsumeFormDataProxies(int64_t formId, std::vector<FormDataProxy> &formDataProxies)
113 {
114     std::lock_guard<std::mutex> lock(formDataProxiesMutex_);
115     auto search = formDataProxiesMap_.find(formId);
116     if (search == formDataProxiesMap_.end()) {
117         HILOG_DEBUG("no form data proxies, formId: %{public}s", std::to_string(formId).c_str());
118         return false;
119     }
120     formDataProxies = search->second;
121     formDataProxiesMap_.erase(search);
122     return true;
123 }
124 
EnableSubscribeFormData(const std::vector<int64_t> & formIds)125 void FormDataProxyMgr::EnableSubscribeFormData(const std::vector<int64_t> &formIds)
126 {
127     std::lock_guard<std::mutex> lock(formDataProxyRecordMutex_);
128     for (const auto &formId : formIds) {
129         auto search = formDataProxyRecordMap_.find(formId);
130         if (search != formDataProxyRecordMap_.end()) {
131             if (search->second != nullptr) {
132                 search->second->EnableSubscribeFormData();
133                 HILOG_INFO("enable subscribe form data. formId: %{public}s", std::to_string(formId).c_str());
134             }
135         }
136     }
137 }
138 
DisableSubscribeFormData(const std::vector<int64_t> & formIds)139 void FormDataProxyMgr::DisableSubscribeFormData(const std::vector<int64_t> &formIds)
140 {
141     std::lock_guard<std::mutex> lock(formDataProxyRecordMutex_);
142     for (const auto &formId : formIds) {
143         auto search = formDataProxyRecordMap_.find(formId);
144         if (search != formDataProxyRecordMap_.end()) {
145             if (search->second != nullptr) {
146                 search->second->DisableSubscribeFormData();
147                 HILOG_INFO("disable subscribe form data. formId: %{public}s", std::to_string(formId).c_str());
148             }
149         }
150     }
151 }
152 
RetryFailureSubscribes()153 void FormDataProxyMgr::RetryFailureSubscribes()
154 {
155     std::lock_guard<std::mutex> lock(formDataProxyRecordMutex_);
156     for (auto& record : formDataProxyRecordMap_) {
157         record.second->RetryFailureSubscribes();
158     }
159 }
160 
GetFormSubscribeInfo(const int64_t formId,std::vector<std::string> & subscribedKeys,int32_t & count)161 void FormDataProxyMgr::GetFormSubscribeInfo(
162     const int64_t formId, std::vector<std::string> &subscribedKeys, int32_t &count)
163 {
164     auto search = formDataProxyRecordMap_.find(formId);
165     if (search != formDataProxyRecordMap_.end()) {
166         if (search->second != nullptr) {
167             search->second->GetFormSubscribeInfo(subscribedKeys, count);
168         }
169     }
170 }
171 } // namespace AppExecFwk
172 } // namespace OHOS
173