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_H 17 #define OHOS_FORM_FWK_FORM_RENDER_MGR_H 18 19 #include <atomic> 20 #include <singleton.h> 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 FormRenderService 34 * FormRenderService provides a facility for managing form render life cycle. 35 */ 36 class FormRenderMgr : public DelayedRefSingleton<FormRenderMgr> { 37 DECLARE_DELAYED_REF_SINGLETON(FormRenderMgr) 38 public: 39 DISALLOW_COPY_AND_MOVE(FormRenderMgr); 40 41 ErrCode RenderForm( 42 const FormRecord &formRecord, const WantParams &wantParams, const sptr<IRemoteObject> &hostToken = nullptr); 43 44 ErrCode UpdateRenderingForm(int64_t formId, const FormProviderData &formProviderData, 45 const WantParams &wantParams, bool mergeData); 46 47 ErrCode StopRenderingForm(int64_t formId, const FormRecord &formRecord, const std::string &compId = "", const sptr<IRemoteObject> &hostToken = nullptr); 48 49 ErrCode ReloadForm(std::vector<int64_t> &&formIds, const std::string &bundleName, int32_t userId); 50 51 ErrCode RenderFormCallback(int64_t formId, const Want &want); 52 53 ErrCode StopRenderingFormCallback(int64_t formId, const Want &want); 54 55 ErrCode AddConnection(int64_t formId, sptr<FormRenderConnection> connection); 56 57 void AddRenderDeathRecipient(const sptr<IRemoteObject> &renderRemoteObj); 58 59 bool IsNeedRender(int64_t formId); 60 61 void RerenderAllForms(); 62 63 void CleanFormHost(const sptr<IRemoteObject> &host); 64 65 void HandleConnectFailed(int64_t formId, int32_t errorCode) const; 66 67 bool IsRerenderForRenderServiceDied(int64_t formId); 68 69 private: 70 ErrCode ConnectRenderService(const sptr<FormRenderConnection> &connection) const; 71 72 void DisconnectRenderService(const sptr<FormRenderConnection> connection, size_t size) const; 73 74 void AddHostToken(const sptr<IRemoteObject> &host, int64_t formId); 75 76 void RemoveHostToken(const sptr<IRemoteObject> &host); 77 78 void NotifyHostRenderServiceIsDead() const; 79 80 private: 81 class RemoteObjHash { 82 public: operator()83 size_t operator() (const sptr<IRemoteObject> &remoteObj) const 84 { 85 return reinterpret_cast<size_t>(remoteObj.GetRefPtr()); 86 } 87 }; 88 89 int32_t maxConnectKey = 0; 90 mutable std::mutex resourceMutex_; 91 // <formId, connectionToRenderService> 92 std::unordered_map<int64_t, sptr<FormRenderConnection>> renderFormConnections_; 93 // <hostToken, formIds> 94 std::unordered_map<sptr<IRemoteObject>, std::unordered_set<int64_t>, RemoteObjHash> etsHosts_; 95 sptr<IFormRender> renderRemoteObj_ = nullptr; 96 sptr<IRemoteObject::DeathRecipient> renderDeathRecipient_ = nullptr; 97 std::atomic<int32_t> atomicRerenderCount_ = 0; 98 }; 99 100 /** 101 * @class FormRenderRecipient 102 * FormRenderRecipient notices IRemoteBroker died. 103 */ 104 class FormRenderRecipient : public IRemoteObject::DeathRecipient { 105 public: 106 using RemoteDiedHandler = std::function<void()>; 107 108 explicit FormRenderRecipient(RemoteDiedHandler handler); 109 110 virtual ~FormRenderRecipient(); 111 112 void OnRemoteDied(const wptr<IRemoteObject> &remote) override; 113 114 private: 115 RemoteDiedHandler handler_; 116 }; 117 } // namespace AppExecFwk 118 } // namespace OHOS 119 #endif // OHOS_FORM_FWK_FORM_RENDER_MGR_H 120