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