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