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