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