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