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 #ifndef OHOS_FORM_FWK_FORM_DATA_PROXY_RECORD_H
17 #define OHOS_FORM_FWK_FORM_DATA_PROXY_RECORD_H
18 
19 #include <string>
20 #include <unordered_map>
21 #include <unordered_set>
22 #include <vector>
23 
24 #include "datashare_helper.h"
25 #include "form_ashmem.h"
26 #include "form_provider_data_proxy.h"
27 #include "form_info_base.h"
28 #include "nlohmann/json.hpp"
29 #include "perm_state_change_callback_customize.h"
30 #include "want.h"
31 
32 namespace OHOS {
33 namespace AppExecFwk {
34 /**
35  * @class FormDataSharerRecord
36  * data share form record.
37  */
38 class FormDataProxyRecord : public std::enable_shared_from_this<FormDataProxyRecord> {
39 public:
40     FormDataProxyRecord(int64_t formId, const std::string &bundleName,
41         FormType uiSyntax, uint32_t tokenId, const int32_t uid);
42     ~FormDataProxyRecord();
43 
44     ErrCode SubscribeFormData(const std::vector<FormDataProxy> &formDataProxies);
45     ErrCode UnsubscribeFormData();
46     void UpdateSubscribeFormData(const std::vector<FormDataProxy> &formDataProxies);
47     void EnableSubscribeFormData();
48     void DisableSubscribeFormData();
49     void RetryFailureSubscribes();
50     void GetFormSubscribeInfo(std::vector<std::string> &subscribedKeys, int32_t &count);
51     void UnRegisterPermissionListener();
52     void PermStateChangeCallback(const int32_t permStateChangeType, const std::string permissionName);
53     void SetWant(const AAFwk::Want &want);
54 private:
55     struct FormDataProxyRequest {
56         int64_t subscribeId;
57         std::vector<std::string> uris;
58     };
59     struct SubscribeResultRecord {
60         std::string uri;
61         int64_t subscribeId;
62         int ret;
63         bool retry;
64         int retryRet;
65     };
66 
67     // map from key to vector of subscriberId
68     using SubscribeMap = std::unordered_map<std::string, std::unordered_set<std::string>>;
69 
70     void ParseFormDataProxies(const std::vector<FormDataProxy> &formDataProxies, SubscribeMap &rdbSubscribeMap,
71         SubscribeMap &publishSubscribeMap);
72     void ParseFormDataProxiesIntoSubscribeMapWithExpectedKeys(
73         const std::vector<FormDataProxy> &formDataProxies, const std::unordered_set<std::string> &expectedKeys,
74         bool keyCheckingNeeded, SubscribeMap &subscribeMap);
75     void ConvertSubscribeMapToRequests(const SubscribeMap &subscribeMap,
76         std::vector<FormDataProxyRequest> &formDataProxyRequests);
77     void UpdatePublishedDataForm(const std::vector<DataShare::PublishedDataItem> &data);
78     void UpdateRdbDataForm(const std::vector<std::string> &data);
79     ErrCode SubscribeRdbFormData(const SubscribeMap &rdbSubscribeMap);
80     ErrCode SubscribePublishFormData(const SubscribeMap &publishSubscribeMap);
81     ErrCode UnsubscribeFormData(SubscribeMap &rdbSubscribeMap, SubscribeMap &publishSubscribeMap);
82     void OnRdbDataChange(const DataShare::RdbChangeNode &changeNode);
83     void OnPublishedDataChange(const DataShare::PublishedDataChangeNode &changeNode);
84 
85     void UpdateSubscribeMap(const std::vector<FormDataProxy> &formDataProxies,
86         SubscribeMap &originRdbMap, SubscribeMap &newRdbMap,
87         SubscribeMap &originPublishMap, SubscribeMap &newPublishMap);
88 
89     ErrCode SetRdbSubsState(const SubscribeMap &rdbSubscribeMap, bool subsState);
90     ErrCode SetPublishSubsState(const SubscribeMap &publishSubscribeMap, bool subsState);
91 
92     bool PrepareImageData(const DataShare::PublishedDataItem &data, nlohmann::json &jsonObj,
93         std::map<std::string, std::pair<sptr<FormAshmem>, int32_t>> &imageDataMap);
94     void AddSubscribeResultRecord(SubscribeResultRecord record, bool isRdbType);
95     void RemoveSubscribeResultRecord(const std::string &uri, int64_t subscribeId, bool isRdbType);
96     void PrintSubscribeState(const std::string &uri, int64_t subscribeId, bool isRdbType);
97     void RetryFailureRdbSubscribes(SubscribeResultRecord &record);
98     void RetryFailurePublishedSubscribes(SubscribeResultRecord &record);
99     void GetFormSubscribeKeys(std::vector<std::string> &subscribedKeys, bool isRdbType);
100 
101     void RegisterPermissionListener(const std::vector<FormDataProxy> &formDataProxies);
102     ErrCode SubscribeFormData(const std::vector<FormDataProxy> &formDataProxies, SubscribeMap &rdbSubscribeMap,
103         SubscribeMap &publicSubscribeMap);
104     void GetSubscribeFormDataProxies(const FormDataProxy formdataProxy,
105         std::vector<FormDataProxy> &subscribeFormDataProxies, std::vector<FormDataProxy> &unsubscribeFormDataProxies);
106 
107     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper_;
108     std::shared_ptr<Security::AccessToken::PermStateChangeCallbackCustomize> callbackPtr_;
109     int64_t formId_ = -1;
110     std::string bundleName_;
111     FormType uiSyntax_;
112     int32_t tokenId_;
113     int32_t uid_;
114     AAFwk::Want wantCache_;
115     SubscribeMap rdbSubscribeMap_;
116     SubscribeMap publishSubscribeMap_;
117     std::map<std::string, std::map<int64_t, SubscribeResultRecord>> rdbSubscribeResultMap_;
118     std::map<std::string, std::map<int64_t, SubscribeResultRecord>> publishSubscribeResultMap_;
119     std::map<std::string, std::vector<FormDataProxy>> formDataPermissionProxyMap_;
120     int32_t receivedDataCount_ = 0;
121     const int32_t PERMISSION_GRANTED_OPER = 1;
122 };
123 } // namespace AppExecFwk
124 } // namespace OHOS
125 
126 #endif // OHOS_FORM_FWK_FORM_DATA_PROXY_RECORD_H