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_RENDER_MGR_INNER_H 17 #define OHOS_FORM_FWK_FORM_RENDER_MGR_INNER_H 18 19 #include <atomic> 20 #include <queue> 21 #include <unordered_map> 22 23 #include "form_record.h" 24 #include "form_render_connection.h" 25 #include "form_render_interface.h" 26 #include "want.h" 27 28 namespace OHOS { 29 namespace AppExecFwk { 30 using Want = OHOS::AAFwk::Want; 31 using WantParams = OHOS::AAFwk::WantParams; 32 /** 33 * @class FormRenderMgrInner 34 * FormRenderMgrInner provides a facility for managing form render life cycle. 35 */ 36 class FormRenderMgrInner { 37 public: 38 FormRenderMgrInner(); 39 virtual ~FormRenderMgrInner(); 40 41 virtual ErrCode RenderForm( 42 const FormRecord &formRecord, Want &want, const sptr<IRemoteObject> &hostToken = nullptr); 43 44 ErrCode UpdateRenderingForm(FormRecord &formRecord, const FormProviderData &formProviderData, 45 const WantParams &wantParams, bool mergeData); 46 47 ErrCode StopRenderingForm(int64_t formId, const FormRecord &formRecord, 48 const std::string &compId = "", const sptr<IRemoteObject> &hostToken = nullptr); 49 50 ErrCode ReloadForm(const std::vector<FormRecord> &&formRecords, const std::string &bundleName, int32_t userId); 51 52 ErrCode StopRenderingFormCallback(int64_t formId, const Want &want); 53 54 ErrCode AddConnection(int64_t formId, sptr<FormRenderConnection> connection); 55 56 void RemoveConnection(int64_t formId); 57 58 void AddRenderDeathRecipient(const sptr<IRemoteObject> &renderRemoteObj); 59 60 void RerenderAllForms(); 61 62 void CleanFormHost(const sptr<IRemoteObject> &host); 63 64 void OnRenderingBlock(const std::string &bundleName); 65 66 ErrCode ReleaseRenderer(int64_t formId, const FormRecord &formRecord, const std::string &compId); 67 68 void PostOnUnlockTask(); 69 70 int32_t GetReRenderCount() const; 71 72 sptr<IFormRender> GetRenderRemoteObj() const; 73 74 void SetRenderRemoteObj(sptr<IFormRender> remoteObject); 75 76 ErrCode RecycleForms(const std::vector<int64_t> &formIds, const Want &want, 77 const sptr<IRemoteObject> &remoteObjectOfHost); 78 79 ErrCode RecoverForms(const std::vector<int64_t> &formIds, const std::string &bundleName, 80 const WantParams &wantParams); 81 82 private: 83 ErrCode ConnectRenderService(const sptr<FormRenderConnection> &connection, int32_t level) const; 84 85 void DisconnectRenderService(const sptr<FormRenderConnection> connection, size_t size) const; 86 87 void AddHostToken(const sptr<IRemoteObject> &host, int64_t formId); 88 89 void RemoveHostToken(const sptr<IRemoteObject> &host); 90 91 void NotifyHostRenderServiceIsDead() const; 92 93 int32_t GetCompatibleVersion(const std::string &bundleName) const; 94 95 void CheckIfFormRecycled(FormRecord &formRecord, Want& want) const; 96 97 private: 98 class RemoteObjHash { 99 public: operator()100 size_t operator() (const sptr<IRemoteObject> &remoteObj) const 101 { 102 return reinterpret_cast<size_t>(remoteObj.GetRefPtr()); 103 } 104 }; 105 106 mutable std::mutex resourceMutex_; 107 // <formId, connectionToRenderService> 108 std::unordered_map<int64_t, sptr<FormRenderConnection>> renderFormConnections_; 109 // <hostToken, formIds> 110 std::unordered_map<sptr<IRemoteObject>, std::unordered_set<int64_t>, RemoteObjHash> etsHosts_; 111 sptr<IFormRender> renderRemoteObj_ = nullptr; 112 sptr<IRemoteObject::DeathRecipient> renderDeathRecipient_ = nullptr; 113 std::atomic<int32_t> atomicRerenderCount_ = 0; 114 }; 115 116 /** 117 * @class FormRenderRecipient 118 * FormRenderRecipient notices IRemoteBroker died. 119 */ 120 class FormRenderRecipient : public IRemoteObject::DeathRecipient { 121 public: 122 using RemoteDiedHandler = std::function<void()>; 123 124 explicit FormRenderRecipient(RemoteDiedHandler handler); 125 126 virtual ~FormRenderRecipient(); 127 128 void OnRemoteDied(const wptr<IRemoteObject> &remote) override; 129 130 private: 131 RemoteDiedHandler handler_; 132 }; 133 } // namespace AppExecFwk 134 } // namespace OHOS 135 #endif // OHOS_FORM_FWK_FORM_RENDER_MGR_INNER_H 136