1 /* 2 * Copyright (c) 2021-2022 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 FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_PLUGIN_COMPONENT_MANAGER_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_PLUGIN_COMPONENT_MANAGER_H 18 19 #include <map> 20 #include <mutex> 21 #include <unordered_set> 22 23 #include "bundlemgr/bundle_mgr_interface.h" 24 #ifdef UI_SERVICE_WITH_IDL 25 #include "iu_i_service_new.h" 26 #include "ui_service_new_stub.h" 27 #else 28 #include "ui_service_interface.h" 29 #include "ui_service_stub.h" 30 #endif 31 #include "want.h" 32 33 #include "base/json/json_util.h" 34 #include "base/memory/ace_type.h" 35 #include "core/components/common/layout/grid_column_info.h" 36 #include "core/components/plugin/plugin_component_callback.h" 37 #include "core/components/plugin/plugin_component_template.h" 38 39 namespace OHOS::Ace { 40 class ACE_FORCE_EXPORT PluginComponentManager final { 41 public: PluginComponentManager()42 PluginComponentManager() 43 { 44 if (!listener_) { 45 listener_ = new (std::nothrow) UIServiceListener(); 46 } 47 } 48 ~PluginComponentManager() = default; 49 50 ACE_EXPORT static std::shared_ptr<PluginComponentManager> GetInstance(); 51 52 int Push(const AAFwk::Want& want, const std::string& name, const std::string& jsonPath, const std::string& data, 53 const std::string& extraData); 54 int Request(const AAFwk::Want& want, const std::string& name, const std::string& jsonPath, const std::string& data); 55 int ReturnRequest( 56 const AAFwk::Want& want, const std::string& pluginName, const std::string& data, const std::string& extraData); 57 void RegisterCallBack( 58 const AAFwk::Want& want, const std::shared_ptr<PluginComponentCallBack>& callback, CallBackType callBackType); 59 void UnregisterCallBack(const std::shared_ptr<PluginComponentCallBack>& callback); 60 void UnregisterCallBack(const AAFwk::Want& want); 61 62 bool GetTemplatePathFromJsonFile(const std::string& packagePathStr, const std::string& srcPath, 63 const std::string& jsonPath, std::string& jsonStr); 64 std::string GetPackagePath(const AAFwk::Want& want) const; 65 66 sptr<AppExecFwk::IBundleMgr> GetBundleManager(); 67 68 #ifdef UI_SERVICE_WITH_IDL 69 class UIServiceListener final : public Ace::UIServiceNewStub { 70 #else 71 class UIServiceListener final : public Ace::UIServiceStub { 72 #endif 73 public: 74 UIServiceListener() = default; ~UIServiceListener()75 ~UIServiceListener() 76 { 77 std::lock_guard<std::recursive_mutex> lock(mutex_); 78 callbackVec_.clear(); 79 }; 80 81 void ResgisterListener(const std::shared_ptr<PluginComponentCallBack>& callback, CallBackType callBackType); 82 void UnresgisterListener(const std::shared_ptr<PluginComponentCallBack>& callback); 83 #ifdef UI_SERVICE_WITH_IDL 84 ErrCode OnPushCallBack(const AAFwk::Want& want, const std::string& name, const std::string& jsonPath, 85 const std::string& data, const std::string& extraData) override; 86 ErrCode OnRequestCallBack(const AAFwk::Want& want, const std::string& name, const std::string& data) override; 87 ErrCode OnReturnRequest(const AAFwk::Want& want, const std::string& source, const std::string& data, 88 const std::string& extraData) override; 89 #else 90 void OnPushCallBack(const AAFwk::Want& want, const std::string& name, const std::string& jsonPath, 91 const std::string& data, const std::string& extraData) override; 92 void OnRequestCallBack(const AAFwk::Want& want, const std::string& name, const std::string& data) override; 93 void OnReturnRequest(const AAFwk::Want& want, const std::string& source, const std::string& data, 94 const std::string& extraData) override; 95 #endif 96 void RequestByJsonPath(const PluginComponentTemplate& pluginTemplate, const std::string& data); 97 98 private: 99 std::recursive_mutex mutex_; 100 std::map<std::shared_ptr<PluginComponentCallBack>, CallBackType> callbackVec_; 101 std::unordered_set<std::shared_ptr<PluginComponentCallBack>> callbacks_; 102 103 #ifdef UI_SERVICE_WITH_IDL 104 DISALLOW_COPY_AND_MOVE(UIServiceListener); 105 #endif 106 }; 107 108 private: 109 static std::mutex mutex_; 110 static std::shared_ptr<PluginComponentManager> instance_; 111 sptr<UIServiceListener> listener_ = nullptr; 112 113 ACE_DISALLOW_COPY_AND_MOVE(PluginComponentManager); 114 }; 115 } // namespace OHOS::Ace 116 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_PLUGIN_COMPONENT_MANAGER_H 117