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_COMMON_PLUGIN_MANAGER_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMMON_PLUGIN_MANAGER_H
18 
19 #include <mutex>
20 #include <unordered_map>
21 
22 #include "base/utils/macros.h"
23 #include "base/utils/singleton.h"
24 #include "bridge/js_frontend/engine/common/js_engine_loader.h"
25 #include "core/common/plugin_utils.h"
26 #include "core/components/plugin/plugin_sub_container.h"
27 namespace OHOS::Ace {
28 
29 class ACE_EXPORT PluginManager final : public Singleton<PluginManager> {
30     DECLARE_SINGLETON(PluginManager);
31 
32 public:
33     void UpdateConfigurationInPlugin(const ResourceConfiguration& resConfig, const RefPtr<TaskExecutor>& taskExecutor);
34     void AddPluginSubContainer(int64_t pluginId, const RefPtr<PluginSubContainer>& pluginSubContainer);
35     void RemovePluginSubContainer(int64_t pluginId);
36     void AddPluginParentContainer(int64_t pluginId, int32_t pluginParentContainerId);
37     void RemovePluginParentContainer(int64_t pluginId);
38     void AddNonmatchedContainer(const std::string& pluginKey, const RefPtr<PluginSubContainer>& pluginSubContainer);
39     RefPtr<PluginSubContainer> GetPluginSubContainer(int64_t pluginId);
40     RefPtr<PluginSubContainer> MatchPluginSubContainerWithPluginId(int64_t pluginId, const std::string& pluginKey);
41     int64_t GetPluginSubContainerId();
42     int32_t GetPluginParentContainerId(int64_t pluginId);
SetJsEngineLoader(Framework::JsEngineLoader * jsEngineLoader)43     void SetJsEngineLoader(Framework::JsEngineLoader* jsEngineLoader)
44     {
45         jsEngineLoader_ = jsEngineLoader;
46     }
47 
GetJsEngineLoader()48     Framework::JsEngineLoader* GetJsEngineLoader()
49     {
50         return jsEngineLoader_;
51     }
52 
SetAceAbility(void * aceAbility,const std::shared_ptr<PluginUtils> & pluginUtils)53     void SetAceAbility(void* aceAbility, const std::shared_ptr<PluginUtils>& pluginUtils)
54     {
55         std::lock_guard<std::mutex> lock(pluginUtilsMutex_);
56         aceAbility_ = aceAbility;
57         pluginUtils_ = pluginUtils;
58     };
59 
GetAceAbility()60     void* GetAceAbility() const
61     {
62         return aceAbility_;
63     };
64 
65     int32_t StartAbility(const std::string& bundleName, const std::string& abilityName, const std::string& params);
66 
67 private:
68     std::mutex mutex_;
69     std::mutex pluginUtilsMutex_;
70     std::map<int64_t, RefPtr<PluginSubContainer>> pluginSubContainerMap_;
71     std::mutex nonmatchedContainerMutex_;
72     std::unordered_map<std::string, RefPtr<PluginSubContainer>> nonmatchedContainerMap_;
73     std::mutex parentContainerMutex_;
74     std::unordered_map<int64_t, int32_t> parentContainerMap_;
75     Framework::JsEngineLoader* jsEngineLoader_ = nullptr;
76     void* aceAbility_ = nullptr;
77     std::shared_ptr<PluginUtils> pluginUtils_;
78 };
79 } // namespace OHOS::Ace
80 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMMON_PLUGIN_MANAGER_H
81