• 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 #ifndef FOUNDATION_ACE_ADAPTER_OHOS_ENTRANCE_PA_ENGINE_BACKEND_DELEGATE_IMPL_H
17 #define FOUNDATION_ACE_ADAPTER_OHOS_ENTRANCE_PA_ENGINE_BACKEND_DELEGATE_IMPL_H
18 
19 #include <future>
20 #include <mutex>
21 #include <unordered_map>
22 
23 #include "abs_shared_result_set.h"
24 #include "data_ability_predicates.h"
25 #include "form_provider_info.h"
26 #include "iremote_object.h"
27 #include "values_bucket.h"
28 #include "want.h"
29 
30 #include "adapter/ohos/entrance/pa_engine/backend_delegate.h"
31 #include "base/memory/ace_type.h"
32 #include "base/thread/cancelable_callback.h"
33 #include "core/common/backend.h"
34 #include "core/common/js_message_dispatcher.h"
35 #include "core/pipeline/pipeline_context.h"
36 #include "frameworks/bridge/common/manifest/manifest_parser.h"
37 
38 namespace OHOS::Ace {
39 
40 using LoadJsCallback = std::function<void(const std::string& url, const OHOS::AAFwk::Want& want)>;
41 using JsMessageDispatcherSetterCallback = std::function<void(const RefPtr<JsMessageDispatcher>&)>;
42 using PaEventCallback = std::function<void(const std::string&, const std::string&)>;
43 using DestroyApplicationCallback = std::function<void(const std::string& packageName)>;
44 using InsertCallback = std::function<int32_t(const Uri& uri, const OHOS::NativeRdb::ValuesBucket& value)>;
45 using QueryCallback = std::function<std::shared_ptr<OHOS::NativeRdb::AbsSharedResultSet>(
46     const Uri& uri, const std::vector<std::string>& columns, const OHOS::NativeRdb::DataAbilityPredicates& predicates)>;
47 using UpdateCallback = std::function<int32_t(const Uri& uri, const OHOS::NativeRdb::ValuesBucket& value,
48     const OHOS::NativeRdb::DataAbilityPredicates& predicates)>;
49 using DeleteCallback = std::function<int32_t(const Uri& uri, const OHOS::NativeRdb::DataAbilityPredicates& predicates)>;
50 using BatchInsertCallback =
51     std::function<int32_t(const Uri& uri, const std::vector<OHOS::NativeRdb::ValuesBucket>& values)>;
52 using GetTypeCallback = std::function<std::string(const Uri& uri)>;
53 using GetFileTypesCallback = std::function<std::vector<std::string>(const Uri& uri, const std::string& mimeTypeFilter)>;
54 using OpenFileCallback = std::function<int32_t(const Uri& uri, const std::string& mode)>;
55 using OpenRawFileCallback = std::function<int32_t(const Uri& uri, const std::string& mode)>;
56 using NormalizeUriCallback = std::function<Uri(const Uri& uri)>;
57 using DenormalizeUriCallback = std::function<Uri(const Uri& uri)>;
58 using ConnectCallback = std::function<sptr<IRemoteObject>(const OHOS::AAFwk::Want& want)>;
59 using DisConnectCallback = std::function<void(const OHOS::AAFwk::Want& want)>;
60 using CreateFormCallback = std::function<void(const OHOS::AAFwk::Want& want)>;
61 using DeleteFormCallback = std::function<void(const int64_t formId)>;
62 using TriggerEventCallback = std::function<void(const int64_t formId, const std::string& message)>;
63 using UpdateFormCallback = std::function<void(const int64_t formId)>;
64 using CastTemptoNormalCallback = std::function<void(const int64_t formId)>;
65 using VisibilityChangedCallback = std::function<void(const std::map<int64_t, int32_t>& formEventsMap)>;
66 using AcquireStateCallback = std::function<int32_t(const OHOS::AAFwk::Want &want)>;
67 using CommandCallback = std::function<void(const OHOS::AAFwk::Want &want, int startId)>;
68 using CommandApplicationCallback = std::function<void(const std::string& intent, int startId)>;
69 
70 struct BackendDelegateImplBuilder {
71     RefPtr<TaskExecutor> taskExecutor;
72     LoadJsCallback loadCallback;
73     PaEventCallback asyncEventCallback;
74     PaEventCallback syncEventCallback;
75     JsMessageDispatcherSetterCallback transferCallback;
76     DestroyApplicationCallback destroyApplicationCallback;
77     InsertCallback insertCallback;
78     QueryCallback queryCallback;
79     UpdateCallback updateCallback;
80     DeleteCallback deleteCallback;
81     BatchInsertCallback batchInsertCallback;
82     GetTypeCallback getTypeCallback;
83     GetFileTypesCallback getFileTypesCallback;
84     OpenFileCallback openFileCallback;
85     OpenRawFileCallback openRawFileCallback;
86     NormalizeUriCallback normalizeUriCallback;
87     DenormalizeUriCallback denormalizeUriCallback;
88     ConnectCallback connectCallback;
89     DisConnectCallback disConnectCallback;
90     CreateFormCallback createFormCallback;
91     DeleteFormCallback deleteFormCallback;
92     TriggerEventCallback triggerEventCallback;
93     UpdateFormCallback updateFormCallback;
94     CastTemptoNormalCallback castTemptoNormalCallback;
95     VisibilityChangedCallback visibilityChangedCallback;
96     AcquireStateCallback acquireStateCallback;
97     CommandCallback commandCallback;
98     CommandApplicationCallback commandApplicationCallback;
99     BackendType type;
100 };
101 
102 class BackendDelegateImpl : public BackendDelegate {
103     DECLARE_ACE_TYPE(BackendDelegateImpl, BackendDelegate);
104 
105 public:
106     explicit BackendDelegateImpl(const BackendDelegateImplBuilder& builder);
107     ~BackendDelegateImpl() override = default;
108 
109     // JsBackend delegate functions.
110     void RunPa(const std::string& url, const OHOS::AAFwk::Want& want);
111     void SetJsMessageDispatcher(const RefPtr<JsMessageDispatcher>& dispatcher) const;
112 
113     // BackendDelegate overrides.
114     void PostJsTask(std::function<void()>&& task) override;
115 
116     void PostDelayedJsTask(std::function<void()>&& task, uint32_t delayTime) override;
117 
118     SingleTaskExecutor GetAnimationJsTask() override;
119 
120     void AddTaskObserver(std::function<void()>&& task) override;
121     void RemoveTaskObserver() override;
122 
GetType()123     BackendType GetType() const override
124     {
125         return type_;
126     }
127 
GetGroupJsBridge()128     const RefPtr<GroupJsBridge>& GetGroupJsBridge() override
129     {
130         return groupJsBridge_;
131     }
132 
SetGroupJsBridge(const RefPtr<GroupJsBridge> & groupJsBridge)133     void SetGroupJsBridge(const RefPtr<GroupJsBridge>& groupJsBridge)
134     {
135         groupJsBridge_ = groupJsBridge;
136     }
137 
138     void SetCallBackResult(const std::string& callBackId, const std::string& result) override;
139 
140     bool GetAssetContent(const std::string& url, std::string& content) override;
141     bool GetAssetContent(const std::string& url, std::vector<uint8_t>& content) override;
142     bool GetResourceData(const std::string& fileUri, std::vector<uint8_t>& content, std::string& ami) override;
143     std::string GetAssetPath(const std::string& url) override;
144 
145     // JsEventHandler delegate functions.
146     void FireAsyncEvent(const std::string& eventId, const std::string& param, const std::string& jsonArgs);
147     bool FireSyncEvent(const std::string& eventId, const std::string& param, const std::string& jsonArgs);
148     void FireSyncEvent(
149         const std::string& eventId, const std::string& param, const std::string& jsonArgs, std::string& result);
150 
151     // special JsEventHandler
152     void OnApplicationDestroy(const std::string &packageName);
153     sptr<IRemoteObject> OnConnect(const OHOS::AAFwk::Want &want);
154     void OnDisConnect(const OHOS::AAFwk::Want &want);
155     void OnCommand(const OHOS::AAFwk::Want &want, int startId);
156     void OnApplicationCommand(const std::string& intent, int startId);
157 
158     void TransferJsResponseData(int32_t callbackId, int32_t code, std::vector<uint8_t>&& data) const;
159     void TransferJsPluginGetError(int32_t callbackId, int32_t errorCode, std::string&& errorMessage) const;
160     void TransferJsEventData(int32_t callbackId, int32_t code, std::vector<uint8_t>&& data) const;
161     void LoadPluginJsCode(std::string&& jsCode) const;
162     void LoadPluginJsByteCode(std::vector<uint8_t>&& jsCode, std::vector<int32_t>&& jsCodeLen) const;
163 
164     void MethodChannel(const std::string& methodName, std::string& jsonStr);
165 
166     int32_t Insert(const Uri& uri, const OHOS::NativeRdb::ValuesBucket& value);
167     std::shared_ptr<OHOS::NativeRdb::AbsSharedResultSet> Query(const Uri& uri, const std::vector<std::string>& columns,
168         const OHOS::NativeRdb::DataAbilityPredicates& predicates);
169     int32_t Update(const Uri& uri, const OHOS::NativeRdb::ValuesBucket& value,
170         const OHOS::NativeRdb::DataAbilityPredicates& predicates);
171     int32_t Delete(const Uri& uri, const OHOS::NativeRdb::DataAbilityPredicates& predicates);
172 
173     int32_t BatchInsert(const Uri& uri, const std::vector<OHOS::NativeRdb::ValuesBucket>& values);
174     std::string GetType(const Uri& uri);
175     std::vector<std::string> GetFileTypes(const Uri& uri, const std::string& mimeTypeFilter);
176     int32_t OpenFile(const Uri& uri, const std::string& mode);
177     int32_t OpenRawFile(const Uri& uri, const std::string& mode);
178     Uri NormalizeUri(const Uri& uri);
179     Uri DenormalizeUri(const Uri& uri);
180 
181     void OnCreate(const OHOS::AAFwk::Want &want);
182     void OnDelete(const int64_t formId);
183     void OnTriggerEvent(const int64_t formId, const std::string& message);
184     void OnUpdate(const int64_t formId);
185     void OnCastTemptoNormal(const int64_t formId);
186     void OnVisibilityChanged(const std::map<int64_t, int32_t>& formEventsMap);
187     int32_t OnAcquireFormState(const OHOS::AAFwk::Want& want);
188 
189 private:
190     void LoadPa(const std::string& url, const OHOS::AAFwk::Want& want);
191     bool ParseFileUri(
192         const RefPtr<AssetManager>& assetManager, const std::string& fileUri, std::string& assetsFilePath);
193 
194     void ParseManifest();
195     int32_t callbackCnt_ = 0;
196     bool isStagingPageExist_ = false;
197     std::unordered_map<int32_t, std::string> jsCallBackResult_;
198 
199     LoadJsCallback loadJs_;
200     JsMessageDispatcherSetterCallback dispatcherCallback_;
201 
202     PaEventCallback asyncEvent_;
203     PaEventCallback syncEvent_;
204 
205     InsertCallback insert_;
206     QueryCallback query_;
207     UpdateCallback update_;
208     DeleteCallback delete_;
209     BatchInsertCallback batchInsert_;
210     GetTypeCallback getType_;
211     GetFileTypesCallback getFileTypes_;
212     OpenFileCallback openFile_;
213     OpenRawFileCallback openRawFile_;
214     NormalizeUriCallback normalizeUri_;
215     DenormalizeUriCallback denormalizeUri_;
216 
217     DestroyApplicationCallback destroyApplication_;
218     CommandApplicationCallback commandApplication_;
219     ConnectCallback connectCallback_;
220     DisConnectCallback disConnectCallback_;
221 
222     CreateFormCallback createCallback_;
223     DeleteFormCallback deleteCallback_;
224     TriggerEventCallback triggerEventCallback_;
225     UpdateFormCallback updateCallback_;
226     CastTemptoNormalCallback castTemptoNormalCallback_;
227     VisibilityChangedCallback visibilityChangedCallback_;
228     AcquireStateCallback acquireStateCallback_;
229     CommandCallback commandCallback_;
230 
231     RefPtr<Framework::ManifestParser> manifestParser_;
232     BackendType type_ = BackendType::SERVICE;
233 
234     RefPtr<TaskExecutor> taskExecutor_;
235     RefPtr<GroupJsBridge> groupJsBridge_;
236     mutable std::mutex mutex_;
237     mutable std::once_flag onceFlag_;
238 
239     std::mutex LoadPaMutex_;
240     std::condition_variable condition_;
241 };
242 
243 } // namespace OHOS::Ace
244 
245 #endif // FOUNDATION_ACE_ADAPTER_OHOS_ENTRANCE_PA_ENGINE_BACKEND_DELEGATE_IMPL_H
246