• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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