1 /*
2 * Copyright (c) 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 "js_application_context_utils.h"
17
18 #include <map>
19 #include "hilog_wrapper.h"
20 #include "js_context_utils.h"
21 #include "js_data_converter.h"
22 #include "js_runtime_utils.h"
23 #include "js_runtime.h"
24
25 namespace OHOS {
26 namespace AbilityRuntime {
27 namespace {
28 constexpr char APPLICATION_CONTEXT_NAME[] = "__application_context_ptr__";
29 const char *MD_NAME = "JsApplicationContextUtils";
30 } // namespace
31
CreateBundleContext(NativeEngine * engine,NativeCallbackInfo * info)32 NativeValue *JsApplicationContextUtils::CreateBundleContext(NativeEngine *engine, NativeCallbackInfo *info)
33 {
34 return nullptr;
35 }
36
SwitchArea(NativeEngine * engine,NativeCallbackInfo * info)37 NativeValue *JsApplicationContextUtils::SwitchArea(NativeEngine *engine, NativeCallbackInfo *info)
38 {
39 JsApplicationContextUtils *me =
40 CheckParamsAndGetThis<JsApplicationContextUtils>(engine, info, APPLICATION_CONTEXT_NAME);
41 return me != nullptr ? me->OnSwitchArea(*engine, *info) : nullptr;
42 }
43
OnSwitchArea(NativeEngine & engine,NativeCallbackInfo & info)44 NativeValue *JsApplicationContextUtils::OnSwitchArea(NativeEngine &engine, NativeCallbackInfo &info)
45 {
46 NativeValue *thisVar = info.thisVar;
47 NativeObject *object = ConvertNativeValueTo<NativeObject>(thisVar);
48 if (object == nullptr) {
49 HILOG_ERROR("object is nullptr");
50 return engine.CreateUndefined();
51 }
52 BindNativeProperty(*object, "cacheDir", GetCacheDir);
53 BindNativeProperty(*object, "tempDir", GetTempDir);
54 BindNativeProperty(*object, "filesDir", GetFilesDir);
55 BindNativeProperty(*object, "distributedFilesDir", GetDistributedFilesDir);
56 BindNativeProperty(*object, "databaseDir", GetDatabaseDir);
57 BindNativeProperty(*object, "preferencesDir", GetPreferencesDir);
58 BindNativeProperty(*object, "bundleCodeDir", GetBundleCodeDir);
59 return engine.CreateUndefined();
60 }
61
62
CreateModuleContext(NativeEngine * engine,NativeCallbackInfo * info)63 NativeValue *JsApplicationContextUtils::CreateModuleContext(NativeEngine *engine, NativeCallbackInfo *info)
64 {
65 return nullptr;
66 }
67
GetTempDir(NativeEngine * engine,NativeCallbackInfo * info)68 NativeValue *JsApplicationContextUtils::GetTempDir(NativeEngine *engine, NativeCallbackInfo *info)
69 {
70 HILOG_DEBUG("called");
71 JsApplicationContextUtils *me =
72 CheckParamsAndGetThis<JsApplicationContextUtils>(engine, info, APPLICATION_CONTEXT_NAME);
73 return me != nullptr ? me->OnGetTempDir(*engine, *info) : nullptr;
74 }
75
OnGetTempDir(NativeEngine & engine,NativeCallbackInfo & info)76 NativeValue *JsApplicationContextUtils::OnGetTempDir(NativeEngine &engine, NativeCallbackInfo &info)
77 {
78 auto context = context_.lock();
79 if (!context) {
80 HILOG_WARN("context is already released");
81 return engine.CreateUndefined();
82 }
83 std::string path = context->GetTempDir();
84 return engine.CreateString(path.c_str(), path.length());
85 }
86
GetArea(NativeEngine * engine,NativeCallbackInfo * info)87 NativeValue *JsApplicationContextUtils::GetArea(NativeEngine *engine, NativeCallbackInfo *info)
88 {
89 HILOG_DEBUG("called");
90 JsApplicationContextUtils *me =
91 CheckParamsAndGetThis<JsApplicationContextUtils>(engine, info, APPLICATION_CONTEXT_NAME);
92 return me != nullptr ? me->OnGetArea(*engine, *info) : nullptr;
93 }
94
OnGetArea(NativeEngine & engine,NativeCallbackInfo & info)95 NativeValue *JsApplicationContextUtils::OnGetArea(NativeEngine &engine, NativeCallbackInfo &info)
96 {
97 auto context = context_.lock();
98 if (!context) {
99 HILOG_WARN("context is already released");
100 return engine.CreateUndefined();
101 }
102 int area = context->GetArea();
103 return engine.CreateNumber(area);
104 }
105
GetCacheDir(NativeEngine * engine,NativeCallbackInfo * info)106 NativeValue *JsApplicationContextUtils::GetCacheDir(NativeEngine *engine, NativeCallbackInfo *info)
107 {
108 HILOG_DEBUG("called");
109 JsApplicationContextUtils *me =
110 CheckParamsAndGetThis<JsApplicationContextUtils>(engine, info, APPLICATION_CONTEXT_NAME);
111 return me != nullptr ? me->OnGetCacheDir(*engine, *info) : nullptr;
112 }
113
OnGetCacheDir(NativeEngine & engine,NativeCallbackInfo & info)114 NativeValue *JsApplicationContextUtils::OnGetCacheDir(NativeEngine &engine, NativeCallbackInfo &info)
115 {
116 auto context = context_.lock();
117 if (!context) {
118 HILOG_WARN("context is already released");
119 return engine.CreateUndefined();
120 }
121 std::string path = context->GetCacheDir();
122 return engine.CreateString(path.c_str(), path.length());
123 }
124
GetFilesDir(NativeEngine * engine,NativeCallbackInfo * info)125 NativeValue *JsApplicationContextUtils::GetFilesDir(NativeEngine *engine, NativeCallbackInfo *info)
126 {
127 HILOG_DEBUG("called");
128 JsApplicationContextUtils *me =
129 CheckParamsAndGetThis<JsApplicationContextUtils>(engine, info, APPLICATION_CONTEXT_NAME);
130 return me != nullptr ? me->OnGetFilesDir(*engine, *info) : nullptr;
131 }
132
OnGetFilesDir(NativeEngine & engine,NativeCallbackInfo & info)133 NativeValue *JsApplicationContextUtils::OnGetFilesDir(NativeEngine &engine, NativeCallbackInfo &info)
134 {
135 auto context = context_.lock();
136 if (!context) {
137 HILOG_WARN("context is already released");
138 return engine.CreateUndefined();
139 }
140 std::string path = context->GetFilesDir();
141 return engine.CreateString(path.c_str(), path.length());
142 }
143
GetDistributedFilesDir(NativeEngine * engine,NativeCallbackInfo * info)144 NativeValue *JsApplicationContextUtils::GetDistributedFilesDir(NativeEngine *engine, NativeCallbackInfo *info)
145 {
146 HILOG_DEBUG("called");
147 JsApplicationContextUtils *me =
148 CheckParamsAndGetThis<JsApplicationContextUtils>(engine, info, APPLICATION_CONTEXT_NAME);
149 return me != nullptr ? me->OnGetDistributedFilesDir(*engine, *info) : nullptr;
150 }
151
OnGetDistributedFilesDir(NativeEngine & engine,NativeCallbackInfo & info)152 NativeValue *JsApplicationContextUtils::OnGetDistributedFilesDir(NativeEngine &engine, NativeCallbackInfo &info)
153 {
154 auto context = context_.lock();
155 if (!context) {
156 HILOG_WARN("context is already released");
157 return engine.CreateUndefined();
158 }
159 std::string path = context->GetDistributedFilesDir();
160 return engine.CreateString(path.c_str(), path.length());
161 }
162
GetDatabaseDir(NativeEngine * engine,NativeCallbackInfo * info)163 NativeValue *JsApplicationContextUtils::GetDatabaseDir(NativeEngine *engine, NativeCallbackInfo *info)
164 {
165 HILOG_DEBUG("called");
166 JsApplicationContextUtils *me =
167 CheckParamsAndGetThis<JsApplicationContextUtils>(engine, info, APPLICATION_CONTEXT_NAME);
168 return me != nullptr ? me->OnGetDatabaseDir(*engine, *info) : nullptr;
169 }
170
OnGetDatabaseDir(NativeEngine & engine,NativeCallbackInfo & info)171 NativeValue *JsApplicationContextUtils::OnGetDatabaseDir(NativeEngine &engine, NativeCallbackInfo &info)
172 {
173 auto context = context_.lock();
174 if (!context) {
175 HILOG_WARN("context is already released");
176 return engine.CreateUndefined();
177 }
178 std::string path = context->GetDatabaseDir();
179 return engine.CreateString(path.c_str(), path.length());
180 }
181
GetPreferencesDir(NativeEngine * engine,NativeCallbackInfo * info)182 NativeValue *JsApplicationContextUtils::GetPreferencesDir(NativeEngine *engine, NativeCallbackInfo *info)
183 {
184 HILOG_DEBUG("called");
185 JsApplicationContextUtils *me =
186 CheckParamsAndGetThis<JsApplicationContextUtils>(engine, info, APPLICATION_CONTEXT_NAME);
187 return me != nullptr ? me->OnGetPreferencesDir(*engine, *info) : nullptr;
188 }
189
OnGetPreferencesDir(NativeEngine & engine,NativeCallbackInfo & info)190 NativeValue *JsApplicationContextUtils::OnGetPreferencesDir(NativeEngine &engine, NativeCallbackInfo &info)
191 {
192 auto context = context_.lock();
193 if (!context) {
194 HILOG_WARN("context is already released");
195 return engine.CreateUndefined();
196 }
197 std::string path = context->GetPreferencesDir();
198 return engine.CreateString(path.c_str(), path.length());
199 }
200
GetBundleCodeDir(NativeEngine * engine,NativeCallbackInfo * info)201 NativeValue *JsApplicationContextUtils::GetBundleCodeDir(NativeEngine *engine, NativeCallbackInfo *info)
202 {
203 HILOG_DEBUG("called");
204 JsApplicationContextUtils *me =
205 CheckParamsAndGetThis<JsApplicationContextUtils>(engine, info, APPLICATION_CONTEXT_NAME);
206 return me != nullptr ? me->OnGetBundleCodeDir(*engine, *info) : nullptr;
207 }
208
OnGetBundleCodeDir(NativeEngine & engine,NativeCallbackInfo & info)209 NativeValue *JsApplicationContextUtils::OnGetBundleCodeDir(NativeEngine &engine, NativeCallbackInfo &info)
210 {
211 auto context = context_.lock();
212 if (!context) {
213 HILOG_WARN("context is already released");
214 return engine.CreateUndefined();
215 }
216 std::string path = context->GetBundleCodeDir();
217 return engine.CreateString(path.c_str(), path.length());
218 }
219
KillProcessBySelf(NativeEngine * engine,NativeCallbackInfo * info)220 NativeValue *JsApplicationContextUtils::KillProcessBySelf(NativeEngine *engine, NativeCallbackInfo *info)
221 {
222 return nullptr;
223 }
224
GetRunningProcessInformation(NativeEngine * engine,NativeCallbackInfo * info)225 NativeValue *JsApplicationContextUtils::GetRunningProcessInformation(NativeEngine *engine, NativeCallbackInfo *info)
226 {
227 return nullptr;
228 }
229
Finalizer(NativeEngine * engine,void * data,void * hint)230 void JsApplicationContextUtils::Finalizer(NativeEngine *engine, void *data, void *hint)
231 {
232 std::unique_ptr<JsApplicationContextUtils>(static_cast<JsApplicationContextUtils *>(data));
233 }
234
RegisterAbilityLifecycleCallback(NativeEngine * engine,NativeCallbackInfo * info)235 NativeValue *JsApplicationContextUtils::RegisterAbilityLifecycleCallback(NativeEngine *engine, NativeCallbackInfo *info)
236 {
237 return nullptr;
238 }
239
UnregisterAbilityLifecycleCallback(NativeEngine * engine,NativeCallbackInfo * info)240 NativeValue *JsApplicationContextUtils::UnregisterAbilityLifecycleCallback(
241 NativeEngine *engine, NativeCallbackInfo *info)
242 {
243 return nullptr;
244 }
245
RegisterEnvironmentCallback(NativeEngine * engine,NativeCallbackInfo * info)246 NativeValue *JsApplicationContextUtils::RegisterEnvironmentCallback(NativeEngine *engine, NativeCallbackInfo *info)
247 {
248 return nullptr;
249 }
250
UnregisterEnvironmentCallback(NativeEngine * engine,NativeCallbackInfo * info)251 NativeValue *JsApplicationContextUtils::UnregisterEnvironmentCallback(
252 NativeEngine *engine, NativeCallbackInfo *info)
253 {
254 return nullptr;
255 }
256
On(NativeEngine * engine,NativeCallbackInfo * info)257 NativeValue *JsApplicationContextUtils::On(NativeEngine *engine, NativeCallbackInfo *info)
258 {
259 return nullptr;
260 }
261
Off(NativeEngine * engine,NativeCallbackInfo * info)262 NativeValue *JsApplicationContextUtils::Off(NativeEngine *engine, NativeCallbackInfo *info)
263 {
264 return nullptr;
265 }
266
GetApplicationContext(NativeEngine * engine,NativeCallbackInfo * info)267 NativeValue *JsApplicationContextUtils::GetApplicationContext(NativeEngine *engine, NativeCallbackInfo *info)
268 {
269 JsApplicationContextUtils *me =
270 CheckParamsAndGetThis<JsApplicationContextUtils>(engine, info, APPLICATION_CONTEXT_NAME);
271 return me != nullptr ? me->OnGetApplicationContext(*engine, *info) : nullptr;
272 }
273
OnGetApplicationContext(NativeEngine & engine,NativeCallbackInfo & info)274 NativeValue *JsApplicationContextUtils::OnGetApplicationContext(NativeEngine &engine, NativeCallbackInfo &info)
275 {
276 NativeValue *value = CreateJsApplicationContext(engine, context_.lock());
277 auto systemModule = JsRuntime::LoadSystemModuleByEngine(&engine, "application.ApplicationContext", &value, 1);
278 if (systemModule == nullptr) {
279 HILOG_WARN("OnGetApplicationContext, invalid systemModule.");
280 return engine.CreateUndefined();
281 }
282 auto contextObj = systemModule->Get();
283 return contextObj;
284 }
285
CreateJsApplicationContext(NativeEngine & engine,const std::shared_ptr<Context> & context)286 NativeValue *JsApplicationContextUtils::CreateJsApplicationContext(
287 NativeEngine &engine, const std::shared_ptr<Context> &context)
288 {
289 HILOG_DEBUG("called");
290 NativeValue *objValue = engine.CreateObject();
291 NativeObject *object = ConvertNativeValueTo<NativeObject>(objValue);
292 if (object == nullptr) {
293 return objValue;
294 }
295
296 auto jsApplicationContextUtils = std::make_unique<JsApplicationContextUtils>(context);
297 SetNamedNativePointer(engine, *object, APPLICATION_CONTEXT_NAME, jsApplicationContextUtils.release(),
298 JsApplicationContextUtils::Finalizer);
299
300 auto appInfo = context->GetApplicationInfo();
301 if (appInfo != nullptr) {
302 object->SetProperty("applicationInfo", CreateJsApplicationInfo(engine, *appInfo));
303 }
304
305 BindNativeApplicationContext(engine, object);
306
307 return objValue;
308 }
309
BindNativeApplicationContext(NativeEngine & engine,NativeObject * object)310 void JsApplicationContextUtils::BindNativeApplicationContext(NativeEngine &engine, NativeObject *object)
311 {
312 BindNativeProperty(*object, "cacheDir", JsApplicationContextUtils::GetCacheDir);
313 BindNativeProperty(*object, "tempDir", JsApplicationContextUtils::GetTempDir);
314 BindNativeProperty(*object, "filesDir", JsApplicationContextUtils::GetFilesDir);
315 BindNativeProperty(*object, "distributedFilesDir", JsApplicationContextUtils::GetDistributedFilesDir);
316 BindNativeProperty(*object, "databaseDir", JsApplicationContextUtils::GetDatabaseDir);
317 BindNativeProperty(*object, "preferencesDir", JsApplicationContextUtils::GetPreferencesDir);
318 BindNativeProperty(*object, "bundleCodeDir", JsApplicationContextUtils::GetBundleCodeDir);
319 BindNativeFunction(engine, *object, "registerAbilityLifecycleCallback", MD_NAME,
320 JsApplicationContextUtils::RegisterAbilityLifecycleCallback);
321 BindNativeFunction(engine, *object, "unregisterAbilityLifecycleCallback", MD_NAME,
322 JsApplicationContextUtils::UnregisterAbilityLifecycleCallback);
323 BindNativeFunction(engine, *object, "registerEnvironmentCallback", MD_NAME,
324 JsApplicationContextUtils::RegisterEnvironmentCallback);
325 BindNativeFunction(engine, *object, "unregisterEnvironmentCallback", MD_NAME,
326 JsApplicationContextUtils::UnregisterEnvironmentCallback);
327 BindNativeFunction(engine, *object, "createBundleContext", MD_NAME, JsApplicationContextUtils::CreateBundleContext);
328 BindNativeFunction(engine, *object, "switchArea", MD_NAME, JsApplicationContextUtils::SwitchArea);
329 BindNativeFunction(engine, *object, "getArea", MD_NAME, JsApplicationContextUtils::GetArea);
330 BindNativeFunction(engine, *object, "createModuleContext", MD_NAME, JsApplicationContextUtils::CreateModuleContext);
331 BindNativeFunction(engine, *object, "on", MD_NAME, JsApplicationContextUtils::On);
332 BindNativeFunction(engine, *object, "off", MD_NAME, JsApplicationContextUtils::Off);
333 BindNativeFunction(engine, *object, "getApplicationContext", MD_NAME,
334 JsApplicationContextUtils::GetApplicationContext);
335 BindNativeFunction(engine, *object, "killAllProcesses", MD_NAME, JsApplicationContextUtils::KillProcessBySelf);
336 BindNativeFunction(engine, *object, "getProcessRunningInformation", MD_NAME,
337 JsApplicationContextUtils::GetRunningProcessInformation);
338 BindNativeFunction(engine, *object, "getRunningProcessInformation", MD_NAME,
339 JsApplicationContextUtils::GetRunningProcessInformation);
340 }
341 } // namespace AbilityRuntime
342 } // namespace OHOS
343