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