1 /*
2 * Copyright (c) 2021 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/components/plugin/resource/plugin_manager_delegate.h"
17
18 #include <algorithm>
19 #include <iomanip>
20 #include <sstream>
21
22 #include "frameworks/base/json/json_util.h"
23
24 #ifdef OHOS_STANDARD_SYSTEM
25 #include "frameworks/core/components/plugin/resource/plugin_callback_client.h"
26 #endif
27
28 namespace OHOS::Ace {
29 namespace {
30 constexpr char PLUGIN_EVENT_ON_PLUGIN_COMPLETE[] = "onPluginComplete";
31 constexpr char PLUGIN_EVENT_ON_UPDATE_PLUGIN[] = "onUpdatePlugin";
32 constexpr char PLUGIN_EVENT_ON_ERROR[] = "onPluginError";
33 constexpr char PLUGIN_ADAPTOR_RESOURCE_NAME[] = "pluginAdaptor";
34 constexpr char NTC_PARAM_RICH_TEXT[] = "pluginAdaptor";
35 } // namespace
36
~PluginManagerDelegate()37 PluginManagerDelegate::~PluginManagerDelegate() {}
38
UnregisterEvent()39 void PluginManagerDelegate::UnregisterEvent()
40 {
41 auto context = context_.Upgrade();
42 if (!context) {
43 return;
44 }
45 auto resRegister = context->GetPlatformResRegister();
46 resRegister->UnregisterEvent(MakeEventHash(PLUGIN_EVENT_ON_PLUGIN_COMPLETE));
47 resRegister->UnregisterEvent(MakeEventHash(PLUGIN_EVENT_ON_UPDATE_PLUGIN));
48 resRegister->UnregisterEvent(MakeEventHash(PLUGIN_EVENT_ON_ERROR));
49 }
50
RegisterEvent()51 void PluginManagerDelegate::RegisterEvent()
52 {
53 auto context = context_.Upgrade();
54 if (!context) {
55 return;
56 }
57 auto resRegister = context->GetPlatformResRegister();
58 resRegister->RegisterEvent(
59 MakeEventHash(PLUGIN_EVENT_ON_PLUGIN_COMPLETE), [weak = WeakClaim(this)](const std::string& param) {
60 auto delegate = weak.Upgrade();
61 if (delegate) {
62 delegate->OnPluginComplete(param);
63 }
64 });
65 resRegister->RegisterEvent(
66 MakeEventHash(PLUGIN_EVENT_ON_UPDATE_PLUGIN), [weak = WeakClaim(this)](const std::string& param) {
67 auto delegate = weak.Upgrade();
68 if (delegate) {
69 delegate->OnPluginUpdate(param);
70 }
71 });
72 resRegister->RegisterEvent(
73 MakeEventHash(PLUGIN_EVENT_ON_ERROR), [weak = WeakClaim(this)](const std::string& param) {
74 auto delegate = weak.Upgrade();
75 if (delegate) {
76 delegate->OnPluginError(param);
77 }
78 });
79 }
80
CreatePlatformResource(const WeakPtr<PipelineBase> & context,const RequestPluginInfo & info)81 void PluginManagerDelegate::CreatePlatformResource(const WeakPtr<PipelineBase>& context, const RequestPluginInfo& info)
82 {
83 context_ = context;
84 state_ = State::CREATING;
85
86 auto pipelineContext = context.Upgrade();
87 if (!pipelineContext) {
88 state_ = State::CREATEFAILED;
89 OnPluginError("internal error");
90 return;
91 }
92 auto platformTaskExecutor =
93 SingleTaskExecutor::Make(pipelineContext->GetTaskExecutor(), TaskExecutor::TaskType::PLATFORM);
94 auto resRegister = pipelineContext->GetPlatformResRegister();
95 auto weakRes = AceType::WeakClaim(AceType::RawPtr(resRegister));
96 platformTaskExecutor.PostTask([weak = WeakClaim(this), weakRes, info] {
97 auto delegate = weak.Upgrade();
98 if (!delegate) {
99 return;
100 }
101 auto resRegister = weakRes.Upgrade();
102 auto context = delegate->context_.Upgrade();
103 if (!resRegister || !context) {
104 return;
105 }
106
107 delegate->id_ = CREATING_ID;
108
109 std::stringstream paramStream;
110 paramStream << NTC_PARAM_RICH_TEXT << PLUGIN_MANAGER_PARAM_EQUALS << delegate->id_ << PLUGIN_MANAGER_PARAM_AND
111 << "bundle" << PLUGIN_MANAGER_PARAM_EQUALS << info.bundleName << PLUGIN_MANAGER_PARAM_AND
112 << "ability" << PLUGIN_MANAGER_PARAM_EQUALS << info.abilityName << PLUGIN_MANAGER_PARAM_AND
113 << "module" << PLUGIN_MANAGER_PARAM_EQUALS << info.moduleName << PLUGIN_MANAGER_PARAM_AND << "name"
114 << PLUGIN_MANAGER_PARAM_EQUALS << info.pluginName << PLUGIN_MANAGER_PARAM_AND << "dimension"
115 << PLUGIN_MANAGER_PARAM_EQUALS << info.dimension << PLUGIN_MANAGER_PARAM_AND << "id"
116 << PLUGIN_MANAGER_PARAM_EQUALS << info.id << PLUGIN_MANAGER_PARAM_AND;
117
118 std::string param = paramStream.str();
119 delegate->id_ = resRegister->CreateResource(PLUGIN_ADAPTOR_RESOURCE_NAME, param);
120 if (delegate->id_ == INVALID_ID) {
121 return;
122 }
123 delegate->state_ = State::CREATED;
124 delegate->hash_ = delegate->MakeResourceHash();
125 delegate->RegisterEvent();
126 });
127 OnPluginComplete("Complete");
128 }
129
AddPlugin(const WeakPtr<PipelineBase> & context,const RequestPluginInfo & info)130 void PluginManagerDelegate::AddPlugin(const WeakPtr<PipelineBase>& context, const RequestPluginInfo& info)
131 {
132 CreatePlatformResource(context, info);
133 }
134
AddPluginCompleteCallback(const OnPluginCompleteCallback & callback)135 void PluginManagerDelegate::AddPluginCompleteCallback(const OnPluginCompleteCallback& callback)
136 {
137 if (!callback || state_ == State::RELEASED) {
138 return;
139 }
140 onPluginCompleteCallback_ = callback;
141 }
142
AddPluginUpdateCallback(const OnPluginUpdateCallback & callback)143 void PluginManagerDelegate::AddPluginUpdateCallback(const OnPluginUpdateCallback& callback)
144 {
145 if (!callback || state_ == State::RELEASED) {
146 return;
147 }
148 onPluginUpdateCallback_ = callback;
149 }
150
AddPluginErrorCallback(const OnPluginErrorCallback & callback)151 void PluginManagerDelegate::AddPluginErrorCallback(const OnPluginErrorCallback& callback)
152 {
153 if (!callback || state_ == State::RELEASED) {
154 return;
155 }
156 onPluginErrorCallback_ = callback;
157 }
158
OnActionEvent(const std::string & action)159 void PluginManagerDelegate::OnActionEvent(const std::string& action)
160 {
161 auto eventAction = JsonUtil::ParseJsonString(action);
162 if (!eventAction->IsValid()) {
163 return;
164 }
165 auto actionType = eventAction->GetValue("action");
166 if (!actionType->IsValid()) {
167 return;
168 }
169
170 auto type = actionType->GetString();
171 if (type != "router" && type != "message") {
172 return;
173 }
174 }
175
OnPluginComplete(const std::string & param)176 void PluginManagerDelegate::OnPluginComplete(const std::string& param)
177 {
178 auto result = ParseMapFromString(param);
179 if (onPluginCompleteCallback_) {
180 onPluginCompleteCallback_();
181 }
182 }
183
OnPluginUpdate(const std::string & param)184 void PluginManagerDelegate::OnPluginUpdate(const std::string& param)
185 {
186 auto result = ParseMapFromString(param);
187 if (onPluginUpdateCallback_) {
188 onPluginUpdateCallback_(StringUtils::StringToLongInt(result["pluginId"]), result["data"]);
189 }
190 }
191
OnPluginError(const std::string & param)192 void PluginManagerDelegate::OnPluginError(const std::string& param)
193 {
194 auto result = ParseMapFromString(param);
195 if (onPluginErrorCallback_) {
196 if (result["code"].empty()) {
197 result["code"] = "-1";
198 result["msg"] = param;
199 }
200 onPluginErrorCallback_(result["code"], result["msg"]);
201 }
202 }
203 } // namespace OHOS::Ace
204