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 #include "adapter/ohos/entrance/ace_data_ability.h"
17
18 #include "res_config.h"
19 #include "resource_manager.h"
20
21 #include "adapter/ohos/entrance/pa_container.h"
22 #include "adapter/ohos/entrance/pa_engine/pa_backend.h"
23 #include "adapter/ohos/entrance/platform_event_callback.h"
24 #include "adapter/ohos/entrance/utils.h"
25 #include "base/log/log.h"
26 #include "base/utils/utils.h"
27 #include "core/common/ace_engine.h"
28 #include "core/common/backend.h"
29
30 namespace OHOS {
31 namespace Ace {
32
33 using namespace OHOS::AAFwk;
34 using namespace OHOS::AppExecFwk;
35
36 using DataPlatformFinish = std::function<void()>;
37 class DataPlatformEventCallback final : public Platform::PlatformEventCallback {
38 public:
DataPlatformEventCallback(DataPlatformFinish onFinish)39 explicit DataPlatformEventCallback(DataPlatformFinish onFinish) : onFinish_(onFinish) {}
40
41 ~DataPlatformEventCallback() override = default;
42
OnFinish() const43 void OnFinish() const override
44 {
45 LOGI("DataPlatformEventCallback OnFinish");
46 CHECK_NULL_VOID_NOLOG(onFinish_);
47 onFinish_();
48 }
49
OnStatusBarBgColorChanged(uint32_t color)50 void OnStatusBarBgColorChanged(uint32_t color) override
51 {
52 LOGI("DataPlatformEventCallback OnStatusBarBgColorChanged");
53 }
54
55 private:
56 DataPlatformFinish onFinish_;
57 };
58
59 int32_t AceDataAbility::instanceId_ = 200000;
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 void AceDataAbility::OnStart(const OHOS::AAFwk::Want& want)
65 {
66 Ability::OnStart(want);
67 LOGI("AceDataAbility::OnStart called");
68
69 // get url
70 std::string parsedUrl;
71 if (want.HasParameter(URI)) {
72 parsedUrl = want.GetStringParam(URI);
73 } else {
74 parsedUrl = "data.js";
75 }
76
77 // get asset
78 auto packagePathStr = GetBundleCodePath();
79 auto moduleInfo = GetHapModuleInfo();
80 CHECK_NULL_VOID_NOLOG(moduleInfo);
81 packagePathStr += "/" + moduleInfo->package + "/";
82 // init data ability
83 bool isHap = moduleInfo ? !moduleInfo->hapPath.empty() : false;
84 std::string& packagePath = isHap ? moduleInfo->hapPath : packagePathStr;
85 BackendType backendType = BackendType::DATA;
86 bool isArkApp = GetIsArkFromConfig(packagePath, isHap);
87
88 Platform::PaContainer::CreateContainer(abilityId_, backendType, isArkApp, this,
89 std::make_unique<DataPlatformEventCallback>([this]() { TerminateAbility(); }));
90
91 AceEngine::InitJsDumpHeadSignal();
92 std::shared_ptr<AbilityInfo> info = GetAbilityInfo();
93 if (info != nullptr && !info->srcPath.empty()) {
94 LOGI("AceDataAbility::OnStart assetBasePathStr: %{public}s, parsedUrl: %{public}s",
95 info->srcPath.c_str(), parsedUrl.c_str());
96 auto assetBasePathStr = { "assets/js/" + info->srcPath + "/" };
97 Platform::PaContainer::AddAssetPath(abilityId_, packagePathStr, moduleInfo->hapPath, assetBasePathStr);
98 } else {
99 LOGI("AceDataAbility::OnStart parsedUrl: %{public}s", parsedUrl.c_str());
100 auto assetBasePathStr = { std::string("assets/js/default/"), std::string("assets/js/share/") };
101 Platform::PaContainer::AddAssetPath(abilityId_, packagePathStr, moduleInfo->hapPath, assetBasePathStr);
102 }
103 std::shared_ptr<ApplicationInfo> appInfo = GetApplicationInfo();
104 if (appInfo) {
105 /* Note: DO NOT modify the sequence of adding libPath */
106 std::string nativeLibraryPath = appInfo->nativeLibraryPath;
107 std::string quickFixLibraryPath = appInfo->appQuickFix.deployedAppqfInfo.nativeLibraryPath;
108 std::vector<std::string> libPaths;
109 if (!quickFixLibraryPath.empty()) {
110 std::string libPath = GenerateFullPath(GetBundleCodePath(), quickFixLibraryPath);
111 libPaths.push_back(libPath);
112 LOGI("napi quick fix lib path = %{private}s", libPath.c_str());
113 }
114 if (!nativeLibraryPath.empty()) {
115 std::string libPath = GenerateFullPath(GetBundleCodePath(), nativeLibraryPath);
116 libPaths.push_back(libPath);
117 LOGI("napi lib path = %{private}s", libPath.c_str());
118 }
119 if (!libPaths.empty()) {
120 Platform::PaContainer::AddLibPath(abilityId_, libPaths);
121 }
122 }
123
124 // run data ability
125 Platform::PaContainer::RunPa(abilityId_, parsedUrl, want);
126
127 LOGI("AceDataAbility::OnStart called End");
128 }
129
OnStop()130 void AceDataAbility::OnStop()
131 {
132 LOGI("AceDataAbility::OnStop called");
133 Ability::OnStop();
134 Platform::PaContainer::DestroyContainer(abilityId_);
135 LOGI("AceDataAbility::OnStop called End");
136 }
137
Insert(const Uri & uri,const NativeRdb::ValuesBucket & value)138 int32_t AceDataAbility::Insert(const Uri& uri, const NativeRdb::ValuesBucket& value)
139 {
140 LOGI("AceDataAbility::Insert called");
141 int32_t ret = Platform::PaContainer::Insert(abilityId_, uri, value);
142 LOGI("AceDataAbility::Insert called End");
143 return ret;
144 }
145
Query(const Uri & uri,const std::vector<std::string> & columns,const NativeRdb::DataAbilityPredicates & predicates)146 std::shared_ptr<NativeRdb::AbsSharedResultSet> AceDataAbility::Query(
147 const Uri& uri, const std::vector<std::string>& columns,
148 const NativeRdb::DataAbilityPredicates& predicates)
149 {
150 LOGI("AceDataAbility::Query called");
151 auto resultSet = Platform::PaContainer::Query(abilityId_, uri, columns, predicates);
152 LOGI("AceDataAbility::Query called End");
153 return resultSet;
154 }
155
Update(const Uri & uri,const NativeRdb::ValuesBucket & value,const NativeRdb::DataAbilityPredicates & predicates)156 int32_t AceDataAbility::Update(const Uri& uri, const NativeRdb::ValuesBucket& value,
157 const NativeRdb::DataAbilityPredicates& predicates)
158 {
159 LOGI("AceDataAbility::Update called");
160 int32_t ret = Platform::PaContainer::Update(abilityId_, uri, value, predicates);
161 LOGI("AceDataAbility::Update called End");
162 return ret;
163 }
164
Delete(const Uri & uri,const NativeRdb::DataAbilityPredicates & predicates)165 int32_t AceDataAbility::Delete(const Uri& uri, const NativeRdb::DataAbilityPredicates& predicates)
166 {
167 LOGI("AceDataAbility::Delete called");
168 int32_t ret = Platform::PaContainer::Delete(abilityId_, uri, predicates);
169 LOGI("AceDataAbility::Delete called End");
170 return ret;
171 }
172
BatchInsert(const Uri & uri,const std::vector<NativeRdb::ValuesBucket> & values)173 int32_t AceDataAbility::BatchInsert(const Uri& uri, const std::vector<NativeRdb::ValuesBucket>& values)
174 {
175 LOGI("AceDataAbility::BatchInsert called");
176 int32_t ret = Platform::PaContainer::BatchInsert(abilityId_, uri, values);
177 LOGI("AceDataAbility::BatchInsert called End");
178 return ret;
179 }
180
GetType(const Uri & uri)181 std::string AceDataAbility::GetType(const Uri& uri)
182 {
183 LOGI("AceDataAbility::GetType called");
184 std::string ret = Platform::PaContainer::GetType(abilityId_, uri);
185 LOGI("AceDataAbility::GetType called End");
186 return ret;
187 }
188
GetFileTypes(const Uri & uri,const std::string & mimeTypeFilter)189 std::vector<std::string> AceDataAbility::GetFileTypes(const Uri& uri, const std::string& mimeTypeFilter)
190 {
191 LOGI("AceDataAbility::GetFileTypes called");
192 std::vector<std::string> ret = Platform::PaContainer::GetFileTypes(abilityId_, uri, mimeTypeFilter);
193 LOGI("AceDataAbility::GetFileTypes called End");
194 return ret;
195 }
196
OpenFile(const Uri & uri,const std::string & mode)197 int32_t AceDataAbility::OpenFile(const Uri& uri, const std::string& mode)
198 {
199 LOGI("AceDataAbility::OpenFile called");
200 int32_t ret = Platform::PaContainer::OpenFile(abilityId_, uri, mode);
201 LOGI("AceDataAbility::OpenFile called End");
202 return ret;
203 }
204
OpenRawFile(const Uri & uri,const std::string & mode)205 int32_t AceDataAbility::OpenRawFile(const Uri& uri, const std::string& mode)
206 {
207 LOGI("AceDataAbility::OpenRawFile called");
208 int32_t ret = Platform::PaContainer::OpenRawFile(abilityId_, uri, mode);
209 LOGI("AceDataAbility::OpenRawFile called End");
210 return ret;
211 }
212
NormalizeUri(const Uri & uri)213 Uri AceDataAbility::NormalizeUri(const Uri& uri)
214 {
215 LOGI("AceDataAbility::NormalizeUri called");
216 Uri ret = Platform::PaContainer::NormalizeUri(abilityId_, uri);
217 LOGI("AceDataAbility::NormalizeUri called End");
218 return ret;
219 }
220
DenormalizeUri(const Uri & uri)221 Uri AceDataAbility::DenormalizeUri(const Uri& uri)
222 {
223 LOGI("AceDataAbility::DenormalizeUri called");
224 Uri ret = Platform::PaContainer::DenormalizeUri(abilityId_, uri);
225 LOGI("AceDataAbility::DenormalizeUri called End");
226 return ret;
227 }
228
Call(const Uri & uri,const std::string & method,const std::string & arg,const AppExecFwk::PacMap & pacMap)229 std::shared_ptr<AppExecFwk::PacMap> AceDataAbility::Call(const Uri& uri,
230 const std::string& method, const std::string& arg, const AppExecFwk::PacMap& pacMap)
231 {
232 LOGD("AceDataAbility::Call called");
233 std::shared_ptr<AppExecFwk::PacMap> ret = Platform::PaContainer::Call(abilityId_, uri, method, arg, pacMap);
234 return ret;
235 }
236 } // namespace Ace
237 } // namespace OHOS
238