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_PA_BACKEND_H
17 #define FOUNDATION_ACE_ADAPTER_OHOS_ENTRANCE_PA_ENGINE_PA_BACKEND_H
18 
19 #include <string>
20 #include <unordered_map>
21 
22 #include "abs_shared_result_set.h"
23 #include "data_ability_predicates.h"
24 #include "form_provider_info.h"
25 #include "iremote_object.h"
26 #include "values_bucket.h"
27 #include "want.h"
28 
29 #include "adapter/ohos/entrance/pa_engine/engine/common/js_backend_asset_manager.h"
30 #include "adapter/ohos/entrance/pa_engine/engine/common/js_backend_engine.h"
31 #include "base/memory/ace_type.h"
32 #include "base/utils/string_utils.h"
33 #include "core/common/backend.h"
34 #include "frameworks/bridge/common/manifest/manifest_parser.h"
35 
36 namespace OHOS::Ace {
37 
38 class PaBackend : public Backend {
39     DECLARE_ACE_TYPE(PaBackend, Backend);
40 
41 public:
42 
43     PaBackend() = default;
44     ~PaBackend() noexcept override;
45 
46     bool Initialize(BackendType type, SrcLanguage language) override;
47 
48     void LoadEngine(const char* libName, int32_t instanceId) override;
49 
50     void UpdateState(Backend::State state) override;
51 
SetJsEngine(const RefPtr<JsBackendEngine> & jsBackEngine)52     void SetJsEngine(const RefPtr<JsBackendEngine>& jsBackEngine)
53     {
54         jsBackendEngine_ = jsBackEngine;
55     }
56 
57     void SetAssetManager(const RefPtr<AssetManager>& assetManager) override;
58 
59     void RunPa(const std::string& url, const OHOS::AAFwk::Want& want);
60     void OnCreate(const OHOS::AAFwk::Want& want);
61     void OnDelete(const int64_t formId);
62     void OnTriggerEvent(const int64_t formId, const std::string& message);
63     void OnUpdate(const int64_t formId);
64     void OnCastTemptoNormal(const int64_t formId);
65     void OnVisibilityChanged(const std::map<int64_t, int32_t>& formEventsMap);
66     int32_t OnAcquireFormState(const OHOS::AAFwk::Want& want);
67     sptr<IRemoteObject> OnConnect(const OHOS::AAFwk::Want& want);
68     void OnDisConnect(const OHOS::AAFwk::Want& want);
69 
70     int32_t Insert(const Uri& uri, const OHOS::NativeRdb::ValuesBucket& value);
71     std::shared_ptr<OHOS::NativeRdb::AbsSharedResultSet> Query(const Uri& uri, const std::vector<std::string>& columns,
72         const OHOS::NativeRdb::DataAbilityPredicates& predicates);
73     int32_t Update(const Uri& uri, const OHOS::NativeRdb::ValuesBucket& value,
74         const OHOS::NativeRdb::DataAbilityPredicates& predicates);
75     int32_t Delete(const Uri& uri, const OHOS::NativeRdb::DataAbilityPredicates& predicates);
76 
77     int32_t BatchInsert(const Uri& uri, const std::vector<OHOS::NativeRdb::ValuesBucket>& values);
78     std::string GetType(const Uri& uri);
79     std::vector<std::string> GetFileTypes(const Uri& uri, const std::string& mimeTypeFilter);
80     int32_t OpenFile(const Uri& uri, const std::string& mode);
81     int32_t OpenRawFile(const Uri& uri, const std::string& mode);
82     Uri NormalizeUri(const Uri& uri);
83     Uri DenormalizeUri(const Uri& uri);
84     std::shared_ptr<AppExecFwk::PacMap> Call(const Uri& uri,
85         const std::string& method, const std::string& arg, const AppExecFwk::PacMap& pacMap);
86     bool OnShare(int64_t formId, OHOS::AAFwk::WantParams &wantParams);
87 
GetFormData()88     AppExecFwk::FormProviderData GetFormData() const
89     {
90         if (jsBackendEngine_) {
91             return jsBackendEngine_->GetFormData();
92         } else {
93             LOGE("PA: PaBackend::jsBackendEngine_ is null");
94             return AppExecFwk::FormProviderData("");
95         }
96     }
97 
98     void OnCommand(const OHOS::AAFwk::Want &want, int startId);
99 
100 private:
101     void ParseManifest();
102     void LoadPa(const std::string& url, const OHOS::AAFwk::Want& want);
103 
104     BackendType type_ = BackendType::SERVICE;
105     SrcLanguage language_ = SrcLanguage::ETS;
106 
107     RefPtr<Framework::ManifestParser> manifestParser_ = nullptr;
108     RefPtr<AssetManager> assetManager_ = nullptr;
109     RefPtr<JsBackendAssetManager> jsBackendAssetManager_ = nullptr;
110     RefPtr<JsBackendEngine> jsBackendEngine_ = nullptr;
111 
112     mutable std::once_flag onceFlag_;
113     std::mutex LoadPaMutex_;
114     std::condition_variable condition_;
115     bool isStagingPageExist_ = false;
116 };
117 } // namespace OHOS::Ace
118 
119 #endif // FOUNDATION_ACE_ADAPTER_OHOS_ENTRANCE_PA_ENGINE_PA_BACKEND_H
120