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