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 #include "core/common/plugin_manager.h"
17
18 #include "base/log/log.h"
19 #include "base/utils/utils.h"
20
21 namespace OHOS::Ace {
22 std::shared_ptr<PluginUtils> PluginManager::pluginUtils_ = nullptr;
23 std::map<int64_t, RefPtr<PluginSubContainer>> PluginManager::pluginSubContainerMap_;
PluginManager()24 PluginManager::PluginManager() {}
25
~PluginManager()26 PluginManager::~PluginManager()
27 {
28 pluginSubContainerMap_.clear();
29 nonmatchedContainerMap_.clear();
30 }
31
AddPluginSubContainer(int64_t pluginId,const RefPtr<PluginSubContainer> & pluginSubContainer)32 void PluginManager::AddPluginSubContainer(int64_t pluginId, const RefPtr<PluginSubContainer>& pluginSubContainer)
33 {
34 std::lock_guard<std::mutex> lock(mutex_);
35 auto result = pluginSubContainerMap_.try_emplace(pluginId, pluginSubContainer);
36 if (!result.second) {
37 LOGW("already have pluginSubContainer of this instance");
38 }
39 }
40
RemovePluginSubContainer(int64_t pluginId)41 void PluginManager::RemovePluginSubContainer(int64_t pluginId)
42 {
43 std::lock_guard<std::mutex> lock(mutex_);
44 pluginSubContainerMap_.erase(pluginId);
45 }
46
GetPluginSubContainer(int64_t pluginId)47 RefPtr<PluginSubContainer> PluginManager::GetPluginSubContainer(int64_t pluginId)
48 {
49 std::lock_guard<std::mutex> lock(mutex_);
50 auto pluginSubContainer = pluginSubContainerMap_.find(pluginId);
51 if (pluginSubContainer != pluginSubContainerMap_.end()) {
52 return pluginSubContainer->second;
53 } else {
54 return nullptr;
55 }
56 }
57
UpdateConfigurationInPlugin(const ResourceConfiguration & resConfig,const RefPtr<TaskExecutor> & taskExecutor)58 void PluginManager::UpdateConfigurationInPlugin(
59 const ResourceConfiguration& resConfig, const RefPtr<TaskExecutor>& taskExecutor)
60 {
61 std::lock_guard<std::mutex> lock(mutex_);
62 for (const auto& pluginSubContainerMap : pluginSubContainerMap_) {
63 auto pluginSubContainer = pluginSubContainerMap.second;
64 auto pluginPipeline = pluginSubContainer->GetPipelineContext();
65 auto pluginThemeManager = pluginPipeline->GetThemeManager();
66 pluginThemeManager->UpdateConfig(resConfig);
67 pluginThemeManager->LoadResourceThemes();
68 CHECK_NULL_VOID(taskExecutor);
69 taskExecutor->PostTask(
70 [instanceId = pluginSubContainerMap.first,
71 weak = AceType::WeakClaim(AceType::RawPtr(pluginSubContainer))]() {
72 ContainerScope scope(instanceId);
73 auto pluginSubContainer = weak.Upgrade();
74 CHECK_NULL_VOID(pluginSubContainer);
75 pluginSubContainer->FlushReload();
76 },
77 TaskExecutor::TaskType::JS);
78 }
79 }
80
AddNonmatchedContainer(const std::string & pluginKey,const RefPtr<PluginSubContainer> & pluginSubContainer)81 void PluginManager::AddNonmatchedContainer(
82 const std::string& pluginKey, const RefPtr<PluginSubContainer>& pluginSubContainer)
83 {
84 std::lock_guard<std::mutex> lock(nonmatchedContainerMutex_);
85 auto result = nonmatchedContainerMap_.try_emplace(pluginKey, pluginSubContainer);
86 if (!result.second) {
87 LOGW("already have pluginSubContainer of this key: %{public}s", pluginKey.c_str());
88 }
89 }
90
MatchPluginSubContainerWithPluginId(int64_t pluginId,const std::string & pluginKey)91 RefPtr<PluginSubContainer> PluginManager::MatchPluginSubContainerWithPluginId(
92 int64_t pluginId, const std::string& pluginKey)
93 {
94 std::lock_guard<std::mutex> lock(nonmatchedContainerMutex_);
95 auto iter = nonmatchedContainerMap_.find(pluginKey);
96 if (iter == nonmatchedContainerMap_.end()) {
97 LOGW("no subcontainer of key: %{private}s", pluginKey.c_str());
98 return nullptr;
99 }
100 auto pluginSubContainer = iter->second;
101 AddPluginSubContainer(pluginId, pluginSubContainer);
102 nonmatchedContainerMap_.erase(iter);
103 return pluginSubContainer;
104 }
105
GetPluginSubContainerId()106 int64_t PluginManager::GetPluginSubContainerId()
107 {
108 std::lock_guard<std::mutex> lock(mutex_);
109 if (pluginSubContainerMap_.empty()) {
110 return MIN_PLUGIN_SUBCONTAINER_ID;
111 }
112 return pluginSubContainerMap_.rbegin()->first + 1;
113 }
114
StartAbility(const std::string & bundleName,const std::string & abilityName,const std::string & params)115 int32_t PluginManager::StartAbility(
116 const std::string& bundleName, const std::string& abilityName, const std::string& params)
117 {
118 CHECK_NULL_RETURN(pluginUtils_, -1);
119 return pluginUtils_->StartAbility(bundleName, abilityName, params);
120 }
121
AddPluginParentContainer(int64_t pluginId,int32_t pluginParentContainerId)122 void PluginManager::AddPluginParentContainer(int64_t pluginId, int32_t pluginParentContainerId)
123 {
124 std::lock_guard<std::mutex> lock(parentContainerMutex_);
125 auto result = parentContainerMap_.try_emplace(pluginId, pluginParentContainerId);
126 if (!result.second) {
127 LOGW("already have pluginSubContainer of this instance, pluginId: %{public}ld", static_cast<long>(pluginId));
128 }
129 }
130
RemovePluginParentContainer(int64_t pluginId)131 void PluginManager::RemovePluginParentContainer(int64_t pluginId)
132 {
133 std::lock_guard<std::mutex> lock(parentContainerMutex_);
134 parentContainerMap_.erase(pluginId);
135 }
136
GetPluginParentContainerId(int64_t pluginId)137 int64_t PluginManager::GetPluginParentContainerId(int64_t pluginId)
138 {
139 std::lock_guard<std::mutex> lock(parentContainerMutex_);
140 auto result = parentContainerMap_.find(pluginId);
141 if (result != parentContainerMap_.end()) {
142 return result->second;
143 } else {
144 LOGW("ParentContainerId is empty.");
145 return 0;
146 }
147 }
148 } // namespace OHOS::Ace
149