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