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