• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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