/* * Copyright (c) 2023 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef OHOS_FORM_FWK_FORM_RENDER_MGR_H #define OHOS_FORM_FWK_FORM_RENDER_MGR_H #include #include #include #include "form_record.h" #include "form_render_connection.h" #include "form_render_interface.h" #include "want.h" namespace OHOS { namespace AppExecFwk { using Want = OHOS::AAFwk::Want; using WantParams = OHOS::AAFwk::WantParams; /** * @class FormRenderService * FormRenderService provides a facility for managing form render life cycle. */ class FormRenderMgr : public DelayedRefSingleton { DECLARE_DELAYED_REF_SINGLETON(FormRenderMgr) public: DISALLOW_COPY_AND_MOVE(FormRenderMgr); ErrCode RenderForm( const FormRecord &formRecord, const WantParams &wantParams, const sptr &hostToken = nullptr); ErrCode UpdateRenderingForm(int64_t formId, const FormProviderData &formProviderData, const WantParams &wantParams, bool mergeData); ErrCode StopRenderingForm(int64_t formId, const FormRecord &formRecord, const std::string &compId = "", const sptr &hostToken = nullptr); ErrCode ReloadForm(std::vector &&formIds, const std::string &bundleName, int32_t userId); ErrCode RenderFormCallback(int64_t formId, const Want &want); ErrCode StopRenderingFormCallback(int64_t formId, const Want &want); ErrCode AddConnection(int64_t formId, sptr connection); void AddRenderDeathRecipient(const sptr &renderRemoteObj); bool IsNeedRender(int64_t formId); void RerenderAllForms(); void CleanFormHost(const sptr &host); void HandleConnectFailed(int64_t formId, int32_t errorCode) const; bool IsRerenderForRenderServiceDied(int64_t formId); private: ErrCode ConnectRenderService(const sptr &connection) const; void DisconnectRenderService(const sptr connection, size_t size) const; void AddHostToken(const sptr &host, int64_t formId); void RemoveHostToken(const sptr &host); void NotifyHostRenderServiceIsDead() const; private: class RemoteObjHash { public: size_t operator() (const sptr &remoteObj) const { return reinterpret_cast(remoteObj.GetRefPtr()); } }; int32_t maxConnectKey = 0; mutable std::mutex resourceMutex_; // std::unordered_map> renderFormConnections_; // std::unordered_map, std::unordered_set, RemoteObjHash> etsHosts_; sptr renderRemoteObj_ = nullptr; sptr renderDeathRecipient_ = nullptr; std::atomic atomicRerenderCount_ = 0; }; /** * @class FormRenderRecipient * FormRenderRecipient notices IRemoteBroker died. */ class FormRenderRecipient : public IRemoteObject::DeathRecipient { public: using RemoteDiedHandler = std::function; explicit FormRenderRecipient(RemoteDiedHandler handler); virtual ~FormRenderRecipient(); void OnRemoteDied(const wptr &remote) override; private: RemoteDiedHandler handler_; }; } // namespace AppExecFwk } // namespace OHOS #endif // OHOS_FORM_FWK_FORM_RENDER_MGR_H