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 }