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