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