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_NOLOG(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 int32_t AceDataAbility::instanceId_ = 200000;
61 const std::string AceDataAbility::START_PARAMS_KEY = "__startParams";
62 const std::string AceDataAbility::URI = "url";
63
REGISTER_AA(AceDataAbility)64 REGISTER_AA(AceDataAbility)
65 void AceDataAbility::OnStart(const OHOS::AAFwk::Want& want, sptr<AAFwk::SessionInfo> sessionInfo)
66 {
67 Ability::OnStart(want, sessionInfo);
68 LOGI("AceDataAbility::OnStart called");
69
70 // get url
71 std::string parsedUrl;
72 if (want.HasParameter(URI)) {
73 parsedUrl = want.GetStringParam(URI);
74 } else {
75 parsedUrl = "data.js";
76 }
77
78 // get asset
79 auto packagePathStr = GetBundleCodePath();
80 auto moduleInfo = GetHapModuleInfo();
81 CHECK_NULL_VOID_NOLOG(moduleInfo);
82 packagePathStr += "/" + moduleInfo->package + "/";
83 std::shared_ptr<AbilityInfo> abilityInfo = GetAbilityInfo();
84
85 // init data ability
86 BackendType backendType = BackendType::DATA;
87 SrcLanguage srcLanguage = SrcLanguage::ETS;
88 if (abilityInfo != nullptr && !abilityInfo->srcLanguage.empty()) {
89 if (abilityInfo->srcLanguage == "js") {
90 srcLanguage = SrcLanguage::JS;
91 }
92 }
93
94 std::shared_ptr<Platform::WorkerPath> workerPath = std::make_shared<Platform::WorkerPath>();
95 workerPath->packagePathStr = packagePathStr;
96 std::vector<std::string> assetBasePathStr;
97
98 AceEngine::InitJsDumpHeadSignal();
99 if (abilityInfo != nullptr && !abilityInfo->srcPath.empty()) {
100 LOGI("AceDataAbility::OnStart assetBasePathStr: %{public}s, parsedUrl: %{public}s",
101 abilityInfo->srcPath.c_str(), parsedUrl.c_str());
102 assetBasePathStr = { "assets/js/" + abilityInfo->srcPath + "/", std::string("assets/js/") };
103 } else {
104 LOGI("AceDataAbility::OnStart parsedUrl: %{public}s", parsedUrl.c_str());
105 assetBasePathStr = { std::string("assets/js/default/"), std::string("assets/js/share/") };
106 }
107 workerPath->assetBasePathStr = assetBasePathStr;
108
109 Platform::PaContainerOptions options;
110 options.type = backendType;
111 options.language = srcLanguage;
112 options.hapPath = moduleInfo->hapPath;
113 options.workerPath = workerPath;
114
115 Platform::PaContainer::CreateContainer(abilityId_, this, options,
116 std::make_unique<DataPlatformEventCallback>([this]() { TerminateAbility(); }));
117 Platform::PaContainer::AddAssetPath(abilityId_, packagePathStr, moduleInfo->hapPath, assetBasePathStr);
118
119 // run data ability
120 Platform::PaContainer::RunPa(abilityId_, parsedUrl, want);
121
122 LOGI("AceDataAbility::OnStart called End");
123 }
124
OnStop()125 void AceDataAbility::OnStop()
126 {
127 LOGI("AceDataAbility::OnStop called");
128 Ability::OnStop();
129 Platform::PaContainer::DestroyContainer(abilityId_);
130 LOGI("AceDataAbility::OnStop called End");
131 }
132
Insert(const Uri & uri,const NativeRdb::ValuesBucket & value)133 int32_t AceDataAbility::Insert(const Uri& uri, const NativeRdb::ValuesBucket& value)
134 {
135 LOGI("AceDataAbility::Insert called");
136 int32_t ret = Platform::PaContainer::Insert(abilityId_, uri, value);
137 LOGI("AceDataAbility::Insert called End");
138 return ret;
139 }
140
Query(const Uri & uri,const std::vector<std::string> & columns,const NativeRdb::DataAbilityPredicates & predicates)141 std::shared_ptr<NativeRdb::AbsSharedResultSet> AceDataAbility::Query(
142 const Uri& uri, const std::vector<std::string>& columns,
143 const NativeRdb::DataAbilityPredicates& predicates)
144 {
145 LOGI("AceDataAbility::Query called");
146 auto resultSet = Platform::PaContainer::Query(abilityId_, uri, columns, predicates);
147 LOGI("AceDataAbility::Query called End");
148 return resultSet;
149 }
150
Update(const Uri & uri,const NativeRdb::ValuesBucket & value,const NativeRdb::DataAbilityPredicates & predicates)151 int32_t AceDataAbility::Update(const Uri& uri, const NativeRdb::ValuesBucket& value,
152 const NativeRdb::DataAbilityPredicates& predicates)
153 {
154 LOGI("AceDataAbility::Update called");
155 int32_t ret = Platform::PaContainer::Update(abilityId_, uri, value, predicates);
156 LOGI("AceDataAbility::Update called End");
157 return ret;
158 }
159
Delete(const Uri & uri,const NativeRdb::DataAbilityPredicates & predicates)160 int32_t AceDataAbility::Delete(const Uri& uri, const NativeRdb::DataAbilityPredicates& predicates)
161 {
162 LOGI("AceDataAbility::Delete called");
163 int32_t ret = Platform::PaContainer::Delete(abilityId_, uri, predicates);
164 LOGI("AceDataAbility::Delete called End");
165 return ret;
166 }
167
BatchInsert(const Uri & uri,const std::vector<NativeRdb::ValuesBucket> & values)168 int32_t AceDataAbility::BatchInsert(const Uri& uri, const std::vector<NativeRdb::ValuesBucket>& values)
169 {
170 LOGI("AceDataAbility::BatchInsert called");
171 int32_t ret = Platform::PaContainer::BatchInsert(abilityId_, uri, values);
172 LOGI("AceDataAbility::BatchInsert called End");
173 return ret;
174 }
175
GetType(const Uri & uri)176 std::string AceDataAbility::GetType(const Uri& uri)
177 {
178 LOGI("AceDataAbility::GetType called");
179 std::string ret = Platform::PaContainer::GetType(abilityId_, uri);
180 LOGI("AceDataAbility::GetType called End");
181 return ret;
182 }
183
GetFileTypes(const Uri & uri,const std::string & mimeTypeFilter)184 std::vector<std::string> AceDataAbility::GetFileTypes(const Uri& uri, const std::string& mimeTypeFilter)
185 {
186 LOGI("AceDataAbility::GetFileTypes called");
187 std::vector<std::string> ret = Platform::PaContainer::GetFileTypes(abilityId_, uri, mimeTypeFilter);
188 LOGI("AceDataAbility::GetFileTypes called End");
189 return ret;
190 }
191
OpenFile(const Uri & uri,const std::string & mode)192 int32_t AceDataAbility::OpenFile(const Uri& uri, const std::string& mode)
193 {
194 LOGI("AceDataAbility::OpenFile called");
195 int32_t ret = Platform::PaContainer::OpenFile(abilityId_, uri, mode);
196 LOGI("AceDataAbility::OpenFile called End");
197 return ret;
198 }
199
OpenRawFile(const Uri & uri,const std::string & mode)200 int32_t AceDataAbility::OpenRawFile(const Uri& uri, const std::string& mode)
201 {
202 LOGI("AceDataAbility::OpenRawFile called");
203 int32_t ret = Platform::PaContainer::OpenRawFile(abilityId_, uri, mode);
204 LOGI("AceDataAbility::OpenRawFile called End");
205 return ret;
206 }
207
NormalizeUri(const Uri & uri)208 Uri AceDataAbility::NormalizeUri(const Uri& uri)
209 {
210 LOGI("AceDataAbility::NormalizeUri called");
211 Uri ret = Platform::PaContainer::NormalizeUri(abilityId_, uri);
212 LOGI("AceDataAbility::NormalizeUri called End");
213 return ret;
214 }
215
DenormalizeUri(const Uri & uri)216 Uri AceDataAbility::DenormalizeUri(const Uri& uri)
217 {
218 LOGI("AceDataAbility::DenormalizeUri called");
219 Uri ret = Platform::PaContainer::DenormalizeUri(abilityId_, uri);
220 LOGI("AceDataAbility::DenormalizeUri called End");
221 return ret;
222 }
223
Call(const Uri & uri,const std::string & method,const std::string & arg,const AppExecFwk::PacMap & pacMap)224 std::shared_ptr<AppExecFwk::PacMap> AceDataAbility::Call(const Uri& uri,
225 const std::string& method, const std::string& arg, const AppExecFwk::PacMap& pacMap)
226 {
227 LOGD("AceDataAbility::Call called");
228 std::shared_ptr<AppExecFwk::PacMap> ret = Platform::PaContainer::Call(abilityId_, uri, method, arg, pacMap);
229 return ret;
230 }
231 } // namespace Ace
232 } // namespace OHOS
233