• 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 #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