1 /*
2  * Copyright (c) 2021-2023 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 "adapter/ohos/entrance/ace_data_ability.h"
17 
18 #include "res_config.h"
19 #include "resource_manager.h"
20 #include "session_info.h"
21 
22 #include "adapter/ohos/entrance/pa_container.h"
23 #include "adapter/ohos/entrance/pa_engine/pa_backend.h"
24 #include "adapter/ohos/entrance/platform_event_callback.h"
25 #include "adapter/ohos/entrance/utils.h"
26 #include "base/log/log.h"
27 #include "base/utils/utils.h"
28 #include "core/common/ace_engine.h"
29 #include "core/common/backend.h"
30 
31 namespace OHOS {
32 namespace Ace {
33 
34 using namespace OHOS::AAFwk;
35 using namespace OHOS::AppExecFwk;
36 
37 using DataPlatformFinish = std::function<void()>;
38 class DataPlatformEventCallback final : public Platform::PlatformEventCallback {
39 public:
DataPlatformEventCallback(DataPlatformFinish onFinish)40     explicit DataPlatformEventCallback(DataPlatformFinish onFinish) : onFinish_(onFinish) {}
41 
42     ~DataPlatformEventCallback() override = default;
43 
OnFinish() const44     void OnFinish() const override
45     {
46         LOGI("DataPlatformEventCallback OnFinish");
47         CHECK_NULL_VOID(onFinish_);
48         onFinish_();
49     }
50 
OnStatusBarBgColorChanged(uint32_t color)51     void OnStatusBarBgColorChanged(uint32_t color) override
52     {
53         LOGI("DataPlatformEventCallback OnStatusBarBgColorChanged");
54     }
55 
56 private:
57     DataPlatformFinish onFinish_;
58 };
59 
60 const std::string AceDataAbility::START_PARAMS_KEY = "__startParams";
61 const std::string AceDataAbility::URI = "url";
62 
REGISTER_AA(AceDataAbility)63 REGISTER_AA(AceDataAbility)
64 
65 AceDataAbility::AceDataAbility()
66 {
67     abilityId_ = Container::GenerateId<PA_DATA_CONTAINER>();
68 }
69 
OnStart(const OHOS::AAFwk::Want & want,sptr<AAFwk::SessionInfo> sessionInfo)70 void AceDataAbility::OnStart(const OHOS::AAFwk::Want& want, sptr<AAFwk::SessionInfo> sessionInfo)
71 {
72     Ability::OnStart(want, sessionInfo);
73     LOGI("AceDataAbility OnStart called");
74 
75     // get url
76     std::string parsedUrl;
77     if (want.HasParameter(URI)) {
78         parsedUrl = want.GetStringParam(URI);
79     } else {
80         parsedUrl = "data.js";
81     }
82 
83     // get asset
84     auto packagePathStr = GetBundleCodePath();
85     auto moduleInfo = GetHapModuleInfo();
86     CHECK_NULL_VOID(moduleInfo);
87     packagePathStr += "/" + moduleInfo->package + "/";
88     std::shared_ptr<AbilityInfo> abilityInfo = GetAbilityInfo();
89 
90     // init data ability
91     BackendType backendType = BackendType::DATA;
92     SrcLanguage srcLanguage = SrcLanguage::ETS;
93     if (abilityInfo != nullptr && !abilityInfo->srcLanguage.empty()) {
94         if (abilityInfo->srcLanguage == "js") {
95             srcLanguage = SrcLanguage::JS;
96         }
97     }
98 
99     std::shared_ptr<Platform::WorkerPath> workerPath = std::make_shared<Platform::WorkerPath>();
100     workerPath->packagePathStr = packagePathStr;
101     std::vector<std::string> assetBasePathStr;
102 
103     AceEngine::InitJsDumpHeadSignal();
104     if (abilityInfo != nullptr && !abilityInfo->srcPath.empty()) {
105         assetBasePathStr = { "assets/js/" + abilityInfo->srcPath + "/", std::string("assets/js/") };
106     } else {
107         assetBasePathStr = { std::string("assets/js/default/"), std::string("assets/js/share/") };
108     }
109     workerPath->assetBasePathStr = assetBasePathStr;
110 
111     Platform::PaContainerOptions options;
112     options.type = backendType;
113     options.language = srcLanguage;
114     options.hapPath = moduleInfo->hapPath;
115     options.workerPath = workerPath;
116 
117     Platform::PaContainer::CreateContainer(abilityId_, this, options,
118         std::make_unique<DataPlatformEventCallback>([this]() { TerminateAbility(); }));
119     Platform::PaContainer::AddAssetPath(abilityId_, packagePathStr, moduleInfo->hapPath, assetBasePathStr);
120 
121     // run data ability
122     Platform::PaContainer::RunPa(abilityId_, parsedUrl, want);
123 }
124 
OnStop()125 void AceDataAbility::OnStop()
126 {
127     LOGI("AceDataAbility OnStop called");
128     Ability::OnStop();
129     Platform::PaContainer::DestroyContainer(abilityId_);
130 }
131 
Insert(const Uri & uri,const NativeRdb::ValuesBucket & value)132 int32_t AceDataAbility::Insert(const Uri& uri, const NativeRdb::ValuesBucket& value)
133 {
134     LOGI("AceDataAbility Insert called");
135     int32_t ret = Platform::PaContainer::Insert(abilityId_, uri, value);
136     return ret;
137 }
138 
Query(const Uri & uri,const std::vector<std::string> & columns,const NativeRdb::DataAbilityPredicates & predicates)139 std::shared_ptr<NativeRdb::AbsSharedResultSet> AceDataAbility::Query(
140     const Uri& uri, const std::vector<std::string>& columns,
141     const NativeRdb::DataAbilityPredicates& predicates)
142 {
143     LOGI("AceDataAbility Query called");
144     auto resultSet = Platform::PaContainer::Query(abilityId_, uri, columns, predicates);
145     return resultSet;
146 }
147 
Update(const Uri & uri,const NativeRdb::ValuesBucket & value,const NativeRdb::DataAbilityPredicates & predicates)148 int32_t AceDataAbility::Update(const Uri& uri, const NativeRdb::ValuesBucket& value,
149     const NativeRdb::DataAbilityPredicates& predicates)
150 {
151     LOGI("AceDataAbility Update called");
152     int32_t ret = Platform::PaContainer::Update(abilityId_, uri, value, predicates);
153     return ret;
154 }
155 
Delete(const Uri & uri,const NativeRdb::DataAbilityPredicates & predicates)156 int32_t AceDataAbility::Delete(const Uri& uri, const NativeRdb::DataAbilityPredicates& predicates)
157 {
158     LOGI("AceDataAbility Delete called");
159     int32_t ret = Platform::PaContainer::Delete(abilityId_, uri, predicates);
160     return ret;
161 }
162 
BatchInsert(const Uri & uri,const std::vector<NativeRdb::ValuesBucket> & values)163 int32_t AceDataAbility::BatchInsert(const Uri& uri, const std::vector<NativeRdb::ValuesBucket>& values)
164 {
165     LOGI("AceDataAbility BatchInsert called");
166     int32_t ret = Platform::PaContainer::BatchInsert(abilityId_, uri, values);
167     return ret;
168 }
169 
GetType(const Uri & uri)170 std::string AceDataAbility::GetType(const Uri& uri)
171 {
172     LOGI("AceDataAbility GetType called");
173     std::string ret = Platform::PaContainer::GetType(abilityId_, uri);
174     return ret;
175 }
176 
GetFileTypes(const Uri & uri,const std::string & mimeTypeFilter)177 std::vector<std::string> AceDataAbility::GetFileTypes(const Uri& uri, const std::string& mimeTypeFilter)
178 {
179     LOGI("AceDataAbility GetFileTypes called");
180     std::vector<std::string> ret = Platform::PaContainer::GetFileTypes(abilityId_, uri, mimeTypeFilter);
181     return ret;
182 }
183 
OpenFile(const Uri & uri,const std::string & mode)184 int32_t AceDataAbility::OpenFile(const Uri& uri, const std::string& mode)
185 {
186     LOGI("AceDataAbility OpenFile called");
187     int32_t ret = Platform::PaContainer::OpenFile(abilityId_, uri, mode);
188     return ret;
189 }
190 
OpenRawFile(const Uri & uri,const std::string & mode)191 int32_t AceDataAbility::OpenRawFile(const Uri& uri, const std::string& mode)
192 {
193     LOGI("AceDataAbility OpenRawFile called");
194     int32_t ret = Platform::PaContainer::OpenRawFile(abilityId_, uri, mode);
195     return ret;
196 }
197 
NormalizeUri(const Uri & uri)198 Uri AceDataAbility::NormalizeUri(const Uri& uri)
199 {
200     LOGI("AceDataAbility NormalizeUri called");
201     Uri ret = Platform::PaContainer::NormalizeUri(abilityId_, uri);
202     return ret;
203 }
204 
DenormalizeUri(const Uri & uri)205 Uri AceDataAbility::DenormalizeUri(const Uri& uri)
206 {
207     LOGI("AceDataAbility DenormalizeUri called");
208     Uri ret = Platform::PaContainer::DenormalizeUri(abilityId_, uri);
209     return ret;
210 }
211 
Call(const Uri & uri,const std::string & method,const std::string & arg,const AppExecFwk::PacMap & pacMap)212 std::shared_ptr<AppExecFwk::PacMap> AceDataAbility::Call(const Uri& uri,
213     const std::string& method, const std::string& arg, const AppExecFwk::PacMap& pacMap)
214 {
215     std::shared_ptr<AppExecFwk::PacMap> ret = Platform::PaContainer::Call(abilityId_, uri, method, arg, pacMap);
216     return ret;
217 }
218 } // namespace Ace
219 } // namespace OHOS
220