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