• 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 "app_mgr.h"
17 
18 #include <stdio.h>
19 #include <string.h>
20 #include <pthread.h>
21 #include <unistd.h>
22 
23 #include "ipc_skeleton.h"
24 #include "system_ability_definition.h"
25 #include "if_system_ability_manager.h"
26 #include "iservice_registry.h"
27 
28 using namespace OHOS;
29 using namespace OHOS::AAFwk;
30 using namespace OHOS::AppExecFwk;
31 
ParseBundleName(napi_env env,std::string & bundleName,napi_value args)32 static napi_value ParseBundleName(napi_env env, std::string &bundleName, napi_value args)
33 {
34     napi_status status;
35     napi_valuetype valuetype;
36     NAPI_CALL(env, napi_typeof(env, args, &valuetype));
37     NAPI_ASSERT(env, valuetype == napi_string, "Wrong argument type. String expected.");
38     char buf[BUFFER_LENGTH_MAX] = {0};
39     size_t len = 0;
40     napi_get_value_string_utf8(env, args, buf, BUFFER_LENGTH_MAX, &len);
41     HILOG_INFO("bundleName= [%{public}s].", buf);
42     bundleName = std::string {buf};
43     // create result code
44     napi_value result;
45     status = napi_create_int32(env, 1, &result);
46     NAPI_ASSERT(env, status == napi_ok, "napi_create_int32 error!");
47     return result;
48 }
49 
AbilityMgrKillProcess(const std::string & bundleName)50 static int32_t AbilityMgrKillProcess(const std::string &bundleName)
51 {
52     OHOS::sptr<OHOS::ISystemAbilityManager> systemAbilityManager =
53         OHOS::SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
54     OHOS::sptr<OHOS::IRemoteObject> abilityObject =
55         systemAbilityManager->GetSystemAbility(OHOS::ABILITY_MGR_SERVICE_ID);
56     OHOS::sptr<OHOS::AAFwk::IAbilityManager> abilityManager =
57         OHOS::iface_cast<OHOS::AAFwk::IAbilityManager>(abilityObject);
58 
59     return abilityManager->KillProcess(bundleName);
60 }
61 
NAPI_KillProcessesByBundleName(napi_env env,napi_callback_info info)62 napi_value NAPI_KillProcessesByBundleName(napi_env env, napi_callback_info info)
63 {
64     HILOG_INFO("NAPI_KillProcessesByBundleName called...");
65     size_t argc = 2;
66     napi_value argv[argc];
67     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, NULL, NULL));
68     HILOG_INFO("argc = [%{public}zu]", argc);
69 
70     size_t argcNum = 2;
71     if (argc >= argcNum) {
72         napi_valuetype valuetype;
73         NAPI_CALL(env, napi_typeof(env, argv[1], &valuetype));
74         NAPI_ASSERT(env, valuetype == napi_function, "Wrong argument type. Function expected.");
75     }
76 
77     AsyncCallbackInfo *async_callback_info =
78         new AsyncCallbackInfo { .env = env, .asyncWork = nullptr, .deferred = nullptr };
79     std::string bundleName;
80     ParseBundleName(env, bundleName, argv[0]);
81 
82     if (argc >= 2) {
83         async_callback_info->bundleName = bundleName;
84         napi_create_reference(env, argv[1], 1, &async_callback_info->callback[0]);
85 
86         napi_value resourceName;
87         napi_create_string_latin1(env, "NAPI_KillProcessesByBundleNameCallBack", NAPI_AUTO_LENGTH, &resourceName);
88 
89         napi_create_async_work(env,
90             nullptr,
91             resourceName,
92             [](napi_env env, void *data) {
93                 HILOG_INFO("killProcessesByBundleName called(CallBack Mode)...");
94                 AsyncCallbackInfo *async_callback_info = (AsyncCallbackInfo *)data;
95                 async_callback_info->result = AbilityMgrKillProcess(async_callback_info->bundleName);
96             },
97             [](napi_env env, napi_status status, void *data) {
98                 HILOG_INFO("killProcessesByBundleName compeleted(CallBack Mode)...");
99                 AsyncCallbackInfo *async_callback_info = (AsyncCallbackInfo *)data;
100 
101                 napi_value result;
102                 napi_value callback;
103                 napi_value undefined;
104 
105                 napi_create_int32(async_callback_info->env, async_callback_info->result, &result);
106                 napi_get_undefined(env, &undefined);
107 
108                 napi_get_reference_value(env, async_callback_info->callback[0], &callback);
109                 napi_call_function(env, undefined, callback, 1, &result, nullptr);
110 
111                 if (async_callback_info->callback[0] != nullptr) {
112                     napi_delete_reference(env, async_callback_info->callback[0]);
113                 }
114 
115                 napi_delete_async_work(env, async_callback_info->asyncWork);
116                 delete async_callback_info;
117             },
118             (void *)async_callback_info,
119             &async_callback_info->asyncWork);
120 
121         NAPI_CALL(env, napi_queue_async_work(env, async_callback_info->asyncWork));
122         return NULL;
123     } else {
124         napi_value resourceName;
125         napi_create_string_latin1(env, "NAPI_KillProcessesByBundleNamePromise", NAPI_AUTO_LENGTH, &resourceName);
126 
127         napi_deferred deferred;
128         napi_value promise;
129         NAPI_CALL(env, napi_create_promise(env, &deferred, &promise));
130         async_callback_info->deferred = deferred;
131         async_callback_info->bundleName = bundleName;
132 
133         napi_create_async_work(env,
134             nullptr,
135             resourceName,
136             [](napi_env env, void *data) {
137                 HILOG_INFO("killProcessesByBundleName called(Promise Mode)...");
138                 AsyncCallbackInfo *async_callback_info = (AsyncCallbackInfo *)data;
139                 async_callback_info->result = AbilityMgrKillProcess(async_callback_info->bundleName);
140             },
141             [](napi_env env, napi_status status, void *data) {
142                 HILOG_INFO("killProcessesByBundleName compeleted(Promise Mode)...");
143                 AsyncCallbackInfo *async_callback_info = (AsyncCallbackInfo *)data;
144                 napi_value result;
145                 napi_create_int32(async_callback_info->env, async_callback_info->result, &result);
146                 napi_resolve_deferred(async_callback_info->env, async_callback_info->deferred, result);
147                 napi_delete_async_work(env, async_callback_info->asyncWork);
148                 delete async_callback_info;
149             },
150             (void *)async_callback_info,
151             &async_callback_info->asyncWork);
152         napi_queue_async_work(env, async_callback_info->asyncWork);
153         return promise;
154     }
155 }