1 /*
2 * Copyright (c) 2024 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 "cj_ability_delegator.h"
17
18 #include "ability_delegator_registry.h"
19 #include "application_context.h"
20 #include "cj_application_context.h"
21 #include "cj_utils_ffi.h"
22 #include "hilog_tag_wrapper.h"
23 #include "shell_cmd_result.h"
24
25 namespace OHOS {
26 namespace AbilityDelegatorCJ {
27 using namespace OHOS::FFI;
28 using namespace OHOS::AbilityRuntime;
29
30 constexpr int COMMON_FAILED = 16000100;
31 constexpr int INCORRECT_PARAMETERS = 401;
32
33 std::map<int64_t, std::shared_ptr<CJAbilityMonitor>> g_monitorRecord;
34 std::map<int64_t, std::shared_ptr<CJAbilityStageMonitor>> g_stageMonitorRecord;
35 std::map<int64_t, sptr<OHOS::IRemoteObject>> g_abilityRecord;
36
CJAbilityDelegator(const std::shared_ptr<AppExecFwk::CJAbilityDelegatorImpl> & abilityDelegator)37 CJAbilityDelegator::CJAbilityDelegator(const std::shared_ptr<AppExecFwk::CJAbilityDelegatorImpl>& abilityDelegator)
38 : delegator_(abilityDelegator)
39 {
40 auto clearFunc = [](const std::shared_ptr<AppExecFwk::ACJDelegatorAbilityProperty>& property) {
41 TAG_LOGD(AAFwkTag::DELEGATOR, "clearFunc called");
42 if (!property) {
43 TAG_LOGE(AAFwkTag::DELEGATOR, "property is null");
44 return;
45 }
46
47 for (auto it = g_abilityRecord.begin(); it != g_abilityRecord.end();) {
48 if (it->second == property->token_) {
49 it = g_abilityRecord.erase(it);
50 continue;
51 }
52 ++it;
53 }
54 };
55 delegator_->RegisterClearFunc(clearFunc);
56 }
57
StartAbility(const AAFwk::Want & want)58 int32_t CJAbilityDelegator::StartAbility(const AAFwk::Want& want)
59 {
60 TAG_LOGD(AAFwkTag::DELEGATOR, "CJAbilityDelegator::StartAbility called");
61 return delegator_->StartAbility(want);
62 }
63
AddAbilityMonitor(const std::shared_ptr<CJAbilityMonitor> & abilityMonitor)64 void CJAbilityDelegator::AddAbilityMonitor(const std::shared_ptr<CJAbilityMonitor>& abilityMonitor)
65 {
66 TAG_LOGD(AAFwkTag::DELEGATOR, "CJAbilityDelegator::AddAbilityMonitor called");
67 delegator_->AddAbilityMonitor(abilityMonitor);
68 }
69
RemoveAbilityMonitor(const std::shared_ptr<CJAbilityMonitor> & abilityMonitor)70 void CJAbilityDelegator::RemoveAbilityMonitor(const std::shared_ptr<CJAbilityMonitor>& abilityMonitor)
71 {
72 TAG_LOGD(AAFwkTag::DELEGATOR, "CJAbilityDelegator::RemoveAbilityMonitor called");
73 delegator_->RemoveAbilityMonitor(abilityMonitor);
74 }
75
WaitAbilityMonitor(const std::shared_ptr<CJAbilityMonitor> & abilityMonitor)76 std::shared_ptr<AppExecFwk::ACJDelegatorAbilityProperty> CJAbilityDelegator::WaitAbilityMonitor(
77 const std::shared_ptr<CJAbilityMonitor>& abilityMonitor)
78 {
79 TAG_LOGD(AAFwkTag::DELEGATOR, "CJAbilityDelegator::WaitAbilityMonitor called");
80 std::shared_ptr<AppExecFwk::ACJDelegatorAbilityProperty> property = delegator_->WaitAbilityMonitor(abilityMonitor);
81 if (!property) {
82 TAG_LOGE(AAFwkTag::DELEGATOR, "property is null");
83 return nullptr;
84 }
85 g_abilityRecord.emplace(property->cjObject_, property->token_);
86 return property;
87 }
88
WaitAbilityMonitor(const std::shared_ptr<CJAbilityMonitor> & abilityMonitor,int64_t timeout)89 std::shared_ptr<AppExecFwk::ACJDelegatorAbilityProperty> CJAbilityDelegator::WaitAbilityMonitor(
90 const std::shared_ptr<CJAbilityMonitor>& abilityMonitor, int64_t timeout)
91 {
92 TAG_LOGD(AAFwkTag::DELEGATOR, "CJAbilityDelegator::WaitAbilityMonitor called");
93 std::shared_ptr<AppExecFwk::ACJDelegatorAbilityProperty> property =
94 delegator_->WaitAbilityMonitor(abilityMonitor, timeout);
95 if (!property) {
96 TAG_LOGE(AAFwkTag::DELEGATOR, "property is null");
97 return nullptr;
98 }
99 g_abilityRecord.emplace(property->cjObject_, property->token_);
100 return property;
101 }
102
AddAbilityStageMonitor(const std::shared_ptr<CJAbilityStageMonitor> & stageMonitor)103 void CJAbilityDelegator::AddAbilityStageMonitor(const std::shared_ptr<CJAbilityStageMonitor>& stageMonitor)
104 {
105 TAG_LOGD(AAFwkTag::DELEGATOR, "CJAbilityDelegator::AddAbilityStageMonitor called");
106 delegator_->AddAbilityStageMonitor(stageMonitor);
107 }
108
RemoveAbilityStageMonitor(const std::shared_ptr<CJAbilityStageMonitor> & stageMonitor)109 void CJAbilityDelegator::RemoveAbilityStageMonitor(const std::shared_ptr<CJAbilityStageMonitor>& stageMonitor)
110 {
111 TAG_LOGD(AAFwkTag::DELEGATOR, "CJAbilityDelegator::RemoveAbilityStageMonitor called");
112 delegator_->RemoveAbilityStageMonitor(stageMonitor);
113 }
114
WaitAbilityStageMonitor(const std::shared_ptr<CJAbilityStageMonitor> & stageMonitor)115 std::shared_ptr<AppExecFwk::CJDelegatorAbilityStageProperty> CJAbilityDelegator::WaitAbilityStageMonitor(
116 const std::shared_ptr<CJAbilityStageMonitor>& stageMonitor)
117 {
118 TAG_LOGD(AAFwkTag::DELEGATOR, "CJAbilityDelegator::WaitAbilityStageMonitor called");
119 std::shared_ptr<AppExecFwk::CJDelegatorAbilityStageProperty> property =
120 delegator_->WaitAbilityStageMonitor(stageMonitor);
121 if (!property) {
122 TAG_LOGE(AAFwkTag::DELEGATOR, "property is null");
123 return nullptr;
124 }
125 return property;
126 }
127
WaitAbilityStageMonitor(const std::shared_ptr<CJAbilityStageMonitor> & stageMonitor,int64_t timeout)128 std::shared_ptr<AppExecFwk::CJDelegatorAbilityStageProperty> CJAbilityDelegator::WaitAbilityStageMonitor(
129 const std::shared_ptr<CJAbilityStageMonitor>& stageMonitor, int64_t timeout)
130 {
131 TAG_LOGD(AAFwkTag::DELEGATOR, "CJAbilityDelegator::WaitAbilityStageMonitor called");
132 std::shared_ptr<AppExecFwk::CJDelegatorAbilityStageProperty> property =
133 delegator_->WaitAbilityStageMonitor(stageMonitor, timeout);
134 if (!property) {
135 TAG_LOGE(AAFwkTag::DELEGATOR, "property is null");
136 return nullptr;
137 }
138 return property;
139 }
140
Print(const std::string & msg)141 void CJAbilityDelegator::Print(const std::string& msg)
142 {
143 return delegator_->Print(msg);
144 }
145
GetAbilityState(const sptr<OHOS::IRemoteObject> & remoteObject)146 int64_t CJAbilityDelegator::GetAbilityState(const sptr<OHOS::IRemoteObject>& remoteObject)
147 {
148 return static_cast<int64_t>(delegator_->GetAbilityState(remoteObject));
149 }
150
GetCurrentTopAbility()151 std::shared_ptr<AppExecFwk::ACJDelegatorAbilityProperty> CJAbilityDelegator::GetCurrentTopAbility()
152 {
153 auto property = delegator_->GetCurrentTopAbility();
154 if (!property) {
155 TAG_LOGE(AAFwkTag::DELEGATOR, "property is null");
156 return nullptr;
157 }
158 return property;
159 }
160
DoAbilityForeground(const sptr<OHOS::IRemoteObject> & remoteObject)161 bool CJAbilityDelegator::DoAbilityForeground(const sptr<OHOS::IRemoteObject>& remoteObject)
162 {
163 return delegator_->DoAbilityForeground(remoteObject);
164 }
165
DoAbilityBackground(const sptr<OHOS::IRemoteObject> & remoteObject)166 bool CJAbilityDelegator::DoAbilityBackground(const sptr<OHOS::IRemoteObject>& remoteObject)
167 {
168 return delegator_->DoAbilityBackground(remoteObject);
169 }
170
ExecuteShellCommand(const char * cmd,int64_t timeoutSec)171 std::shared_ptr<AppExecFwk::ShellCmdResult> CJAbilityDelegator::ExecuteShellCommand(const char* cmd, int64_t timeoutSec)
172 {
173 auto shellCmd = delegator_->ExecuteShellCommand(cmd, timeoutSec);
174 std::shared_ptr<AppExecFwk::ShellCmdResult> ret = std::move(shellCmd);
175 return ret;
176 }
177
GetAppContext()178 std::shared_ptr<AbilityRuntime::ApplicationContext> CJAbilityDelegator::GetAppContext()
179 {
180 auto context = delegator_->GetAppContext();
181 if (context == nullptr) {
182 TAG_LOGE(AAFwkTag::DELEGATOR, "null context");
183 return nullptr;
184 }
185 return context->GetApplicationContext();
186 }
187
GetExitCode()188 int32_t CJShellCmdResult::GetExitCode()
189 {
190 return shellCmdResultr_->GetExitCode();
191 }
192
GetStdResult()193 std::string CJShellCmdResult::GetStdResult()
194 {
195 return shellCmdResultr_->GetStdResult();
196 }
197
Dump()198 std::string CJShellCmdResult::Dump()
199 {
200 return shellCmdResultr_->Dump();
201 }
202
FinishTest(const char * msg,int64_t code)203 void CJAbilityDelegator::FinishTest(const char* msg, int64_t code)
204 {
205 delegator_->FinishUserTest(msg, code);
206 }
207
ParseMonitorPara(int64_t monitorId,const std::string & abilityName,const std::string & moduleName,bool & isExisted)208 std::shared_ptr<CJAbilityMonitor> ParseMonitorPara(
209 int64_t monitorId, const std::string& abilityName, const std::string& moduleName, bool& isExisted)
210 {
211 for (auto iter = g_monitorRecord.begin(); iter != g_monitorRecord.end(); ++iter) {
212 if (iter->first == monitorId) {
213 TAG_LOGE(AAFwkTag::DELEGATOR, "monitor existed");
214 isExisted = true;
215 return iter->second;
216 }
217 }
218
219 auto cjMonitorObj = std::make_shared<CJMonitorObject>(monitorId);
220 std::shared_ptr<CJAbilityMonitor> cjMonitor = nullptr;
221 if (moduleName.empty()) {
222 cjMonitor = std::make_shared<CJAbilityMonitor>(abilityName, cjMonitorObj);
223 } else {
224 cjMonitor = std::make_shared<CJAbilityMonitor>(abilityName, moduleName, cjMonitorObj);
225 }
226 return cjMonitor;
227 }
228
ParseStageMonitorPara(int64_t stageMonitorId,const std::string & moduleName,const std::string & srcEntrance,bool & isExisted)229 std::shared_ptr<CJAbilityStageMonitor> ParseStageMonitorPara(
230 int64_t stageMonitorId, const std::string& moduleName, const std::string& srcEntrance, bool& isExisted)
231 {
232 for (auto iter = g_stageMonitorRecord.begin(); iter != g_stageMonitorRecord.end(); ++iter) {
233 if (iter->first == stageMonitorId) {
234 TAG_LOGE(AAFwkTag::DELEGATOR, "stageMonitor existed");
235 isExisted = true;
236 return iter->second;
237 }
238 }
239 auto cjStageMonitor = std::make_shared<CJAbilityStageMonitor>(moduleName, srcEntrance, stageMonitorId);
240 return cjStageMonitor;
241 }
242
243 extern "C" {
FFIAbilityDelegatorDoAbilityForeground(int64_t id,int64_t abilityId,bool * ret)244 int32_t FFIAbilityDelegatorDoAbilityForeground(int64_t id, int64_t abilityId, bool* ret)
245 {
246 if (!ret) {
247 TAG_LOGE(AAFwkTag::DELEGATOR, "receiver is nullptr");
248 return COMMON_FAILED;
249 }
250
251 auto cjDelegator = FFI::FFIData::GetData<CJAbilityDelegator>(id);
252 if (cjDelegator == nullptr) {
253 TAG_LOGE(AAFwkTag::DELEGATOR, "null cj delegator");
254 *ret = false;
255 return COMMON_FAILED;
256 }
257
258 sptr<OHOS::IRemoteObject> remoteObject = nullptr;
259 for (auto iter = g_abilityRecord.begin(); iter != g_abilityRecord.end(); ++iter) {
260 if (iter->first == abilityId) {
261 remoteObject = iter->second;
262 break;
263 }
264 }
265 if (!remoteObject) {
266 TAG_LOGE(AAFwkTag::DELEGATOR, "parase remoteObject failed");
267 *ret = false;
268 return INCORRECT_PARAMETERS;
269 }
270 if (!cjDelegator->DoAbilityForeground(remoteObject)) {
271 *ret = false;
272 return COMMON_FAILED;
273 }
274 *ret = true;
275 return 0;
276 }
277
FFIAbilityDelegatorDoAbilityBackground(int64_t id,int64_t abilityId,bool * ret)278 int32_t FFIAbilityDelegatorDoAbilityBackground(int64_t id, int64_t abilityId, bool* ret)
279 {
280 if (!ret) {
281 TAG_LOGE(AAFwkTag::DELEGATOR, "receiver is nullptr");
282 return COMMON_FAILED;
283 }
284
285 auto cjDelegator = FFI::FFIData::GetData<CJAbilityDelegator>(id);
286 if (cjDelegator == nullptr) {
287 TAG_LOGE(AAFwkTag::DELEGATOR, "null cj delegator");
288 *ret = false;
289 return COMMON_FAILED;
290 }
291
292 sptr<OHOS::IRemoteObject> remoteObject = nullptr;
293 for (auto iter = g_abilityRecord.begin(); iter != g_abilityRecord.end(); ++iter) {
294 if (iter->first == abilityId) {
295 remoteObject = iter->second;
296 break;
297 }
298 }
299 if (!remoteObject) {
300 TAG_LOGE(AAFwkTag::DELEGATOR, "parase remoteObject failed");
301 *ret = false;
302 return INCORRECT_PARAMETERS;
303 }
304 if (!cjDelegator->DoAbilityBackground(remoteObject)) {
305 *ret = false;
306 return COMMON_FAILED;
307 }
308 *ret = true;
309 return 0;
310 }
311
FFIAbilityDelegatorGetCurrentTopAbility(int64_t id,int64_t * abilityId)312 int32_t FFIAbilityDelegatorGetCurrentTopAbility(int64_t id, int64_t* abilityId)
313 {
314 if (!abilityId) {
315 TAG_LOGE(AAFwkTag::DELEGATOR, "receiver is nullptr");
316 return COMMON_FAILED;
317 }
318
319 auto cjDelegator = FFI::FFIData::GetData<CJAbilityDelegator>(id);
320 if (cjDelegator == nullptr) {
321 TAG_LOGE(AAFwkTag::DELEGATOR, "null cj delegator");
322 *abilityId = 0;
323 return COMMON_FAILED;
324 }
325
326 auto property = cjDelegator->GetCurrentTopAbility();
327 if (!property) {
328 TAG_LOGE(AAFwkTag::DELEGATOR, "null property");
329 *abilityId = 0;
330 return COMMON_FAILED;
331 }
332 g_abilityRecord.emplace(property->cjObject_, property->token_);
333 *abilityId = property->cjObject_;
334 return 0;
335 }
336
FFIAbilityDelegatorPrint(int64_t id,const char * msg)337 int32_t FFIAbilityDelegatorPrint(int64_t id, const char* msg)
338 {
339 auto cjDelegator = FFI::FFIData::GetData<CJAbilityDelegator>(id);
340 if (cjDelegator == nullptr) {
341 TAG_LOGE(AAFwkTag::DELEGATOR, "null cj delegator");
342 return COMMON_FAILED;
343 }
344 cjDelegator->Print(msg);
345 return 0;
346 }
FFIAbilityDelegatorGetAbilityState(int64_t id,int64_t abilityId,int64_t * state)347 int32_t FFIAbilityDelegatorGetAbilityState(int64_t id, int64_t abilityId, int64_t* state)
348 {
349 if (!state) {
350 TAG_LOGE(AAFwkTag::DELEGATOR, "receiver is nullptr");
351 return COMMON_FAILED;
352 }
353 auto cjDelegator = FFI::FFIData::GetData<CJAbilityDelegator>(id);
354 if (cjDelegator == nullptr) {
355 TAG_LOGE(AAFwkTag::DELEGATOR, "null cj delegator");
356 *state = -1;
357 return COMMON_FAILED;
358 }
359
360 sptr<OHOS::IRemoteObject> remoteObject = nullptr;
361 for (auto iter = g_abilityRecord.begin(); iter != g_abilityRecord.end(); ++iter) {
362 if (iter->first == abilityId) {
363 remoteObject = iter->second;
364 break;
365 }
366 }
367 if (!remoteObject) {
368 TAG_LOGE(AAFwkTag::DELEGATOR, "parase remoteObject failed");
369 *state = -1;
370 return INCORRECT_PARAMETERS;
371 }
372 *state = cjDelegator->GetAbilityState(remoteObject);
373 return 0;
374 }
375
FFIAbilityDelegatorAddAbilityMonitor(int64_t id,int64_t monitorId,const char * abilityName,const char * moduleName)376 int32_t FFIAbilityDelegatorAddAbilityMonitor(
377 int64_t id, int64_t monitorId, const char* abilityName, const char* moduleName)
378 {
379 auto cjDelegator = FFI::FFIData::GetData<CJAbilityDelegator>(id);
380 if (cjDelegator == nullptr) {
381 TAG_LOGE(AAFwkTag::DELEGATOR, "null cj delegator");
382 return COMMON_FAILED;
383 }
384 bool isExisted = false;
385 auto cjMonitor = ParseMonitorPara(monitorId, abilityName, moduleName, isExisted);
386 if (cjMonitor == nullptr) {
387 TAG_LOGE(AAFwkTag::DELEGATOR, "parase cj monitor failed");
388 return INCORRECT_PARAMETERS;
389 }
390
391 if (!isExisted) {
392 g_monitorRecord.emplace(monitorId, cjMonitor);
393 }
394 cjDelegator->AddAbilityMonitor(cjMonitor);
395 return 0;
396 }
397
FFIAbilityDelegatorRemoveAbilityMonitor(int64_t id,int64_t monitorId,const char * abilityName,const char * moduleName)398 int32_t FFIAbilityDelegatorRemoveAbilityMonitor(
399 int64_t id, int64_t monitorId, const char* abilityName, const char* moduleName)
400 {
401 auto cjDelegator = FFI::FFIData::GetData<CJAbilityDelegator>(id);
402 if (cjDelegator == nullptr) {
403 TAG_LOGE(AAFwkTag::DELEGATOR, "null cj delegator");
404 return COMMON_FAILED;
405 }
406 bool isExisted = false;
407 auto cjMonitor = ParseMonitorPara(monitorId, abilityName, moduleName, isExisted);
408 if (cjMonitor == nullptr) {
409 TAG_LOGE(AAFwkTag::DELEGATOR, "parase cj monitor failed");
410 return INCORRECT_PARAMETERS;
411 }
412
413 if (isExisted) {
414 for (auto iter = g_monitorRecord.begin(); iter != g_monitorRecord.end(); ++iter) {
415 if (iter->first == monitorId) {
416 g_monitorRecord.erase(iter);
417 break;
418 }
419 }
420 }
421 cjDelegator->RemoveAbilityMonitor(cjMonitor);
422 return 0;
423 }
424
FFIAbilityDelegatorWaitAbilityMonitor(int64_t id,int64_t monitorId,CJAbilityInfo abilityInfo,int64_t * abilityId)425 int32_t FFIAbilityDelegatorWaitAbilityMonitor(
426 int64_t id, int64_t monitorId, CJAbilityInfo abilityInfo, int64_t* abilityId)
427 {
428 if (!abilityId) {
429 TAG_LOGE(AAFwkTag::DELEGATOR, "receiver is nullptr");
430 return COMMON_FAILED;
431 }
432 auto cjDelegator = FFI::FFIData::GetData<CJAbilityDelegator>(id);
433 if (cjDelegator == nullptr) {
434 TAG_LOGE(AAFwkTag::DELEGATOR, "null cj delegator");
435 *abilityId = 0;
436 return COMMON_FAILED;
437 }
438
439 const char* abilityName = abilityInfo.abilityName;
440 const char* moduleName = abilityInfo.moduleName;
441 bool isExisted = false;
442 auto cjMonitor = ParseMonitorPara(monitorId, abilityName, moduleName, isExisted);
443 if (cjMonitor == nullptr) {
444 TAG_LOGE(AAFwkTag::DELEGATOR, "parase cj monitor failed");
445 *abilityId = 0;
446 return INCORRECT_PARAMETERS;
447 }
448
449 if (!isExisted) {
450 g_monitorRecord.emplace(monitorId, cjMonitor);
451 }
452
453 auto property = cjDelegator->WaitAbilityMonitor(cjMonitor);
454 if (!property) {
455 TAG_LOGE(AAFwkTag::DELEGATOR, "property is null");
456 *abilityId = 0;
457 return COMMON_FAILED;
458 }
459
460 g_abilityRecord.emplace(property->cjObject_, property->token_);
461 *abilityId = property->cjObject_;
462 return 0;
463 }
464
FFIAbilityDelegatorWaitAbilityMonitorWithTimeout(int64_t id,int64_t monitorId,CJAbilityInfo abilityInfo,int64_t timeout,int64_t * abilityId)465 int32_t FFIAbilityDelegatorWaitAbilityMonitorWithTimeout(
466 int64_t id, int64_t monitorId, CJAbilityInfo abilityInfo, int64_t timeout, int64_t* abilityId)
467 {
468 if (!abilityId) {
469 TAG_LOGE(AAFwkTag::DELEGATOR, "receiver is nullptr");
470 return COMMON_FAILED;
471 }
472 auto cjDelegator = FFI::FFIData::GetData<CJAbilityDelegator>(id);
473 if (cjDelegator == nullptr) {
474 TAG_LOGE(AAFwkTag::DELEGATOR, "null cj delegator");
475 *abilityId = 0;
476 return COMMON_FAILED;
477 }
478
479 const char* abilityName = abilityInfo.abilityName;
480 const char* moduleName = abilityInfo.moduleName;
481 bool isExisted = false;
482 auto cjMonitor = ParseMonitorPara(monitorId, abilityName, moduleName, isExisted);
483 if (cjMonitor == nullptr) {
484 TAG_LOGE(AAFwkTag::DELEGATOR, "parase cj monitor failed");
485 *abilityId = 0;
486 return INCORRECT_PARAMETERS;
487 }
488
489 if (!isExisted) {
490 g_monitorRecord.emplace(monitorId, cjMonitor);
491 }
492
493 auto property = cjDelegator->WaitAbilityMonitor(cjMonitor, timeout);
494 if (!property) {
495 TAG_LOGE(AAFwkTag::DELEGATOR, "property is null");
496 *abilityId = 0;
497 return COMMON_FAILED;
498 }
499
500 g_abilityRecord.emplace(property->cjObject_, property->token_);
501 *abilityId = property->cjObject_;
502 return 0;
503 }
504
FFIAbilityDelegatorAddAbilityStageMonitor(int64_t id,int64_t stageMonitorId,const char * moduleName,const char * srcEntrance)505 int32_t FFIAbilityDelegatorAddAbilityStageMonitor(
506 int64_t id, int64_t stageMonitorId, const char* moduleName, const char* srcEntrance)
507 {
508 auto cjDelegator = FFI::FFIData::GetData<CJAbilityDelegator>(id);
509 if (cjDelegator == nullptr) {
510 TAG_LOGE(AAFwkTag::DELEGATOR, "null cj delegator");
511 return COMMON_FAILED;
512 }
513 bool isExisted = false;
514 auto cjStageMonitor = ParseStageMonitorPara(stageMonitorId, moduleName, srcEntrance, isExisted);
515 if (cjStageMonitor == nullptr) {
516 TAG_LOGE(AAFwkTag::DELEGATOR, "parse cj stageMonitor failed");
517 return INCORRECT_PARAMETERS;
518 }
519
520 if (!isExisted) {
521 g_stageMonitorRecord.emplace(stageMonitorId, cjStageMonitor);
522 }
523 cjDelegator->AddAbilityStageMonitor(cjStageMonitor);
524 return 0;
525 }
526
FFIAbilityDelegatorRemoveAbilityStageMonitor(int64_t id,int64_t stageMonitorId,const char * moduleName,const char * srcEntrance)527 int32_t FFIAbilityDelegatorRemoveAbilityStageMonitor(
528 int64_t id, int64_t stageMonitorId, const char* moduleName, const char* srcEntrance)
529 {
530 auto cjDelegator = FFI::FFIData::GetData<CJAbilityDelegator>(id);
531 if (cjDelegator == nullptr) {
532 TAG_LOGE(AAFwkTag::DELEGATOR, "null cj delegator");
533 return COMMON_FAILED;
534 }
535 bool isExisted = false;
536 auto cjStageMonitor = ParseStageMonitorPara(stageMonitorId, moduleName, srcEntrance, isExisted);
537 if (cjStageMonitor == nullptr) {
538 TAG_LOGE(AAFwkTag::DELEGATOR, "parse cj stageMonitor failed");
539 return INCORRECT_PARAMETERS;
540 }
541
542 if (isExisted) {
543 for (auto iter = g_stageMonitorRecord.begin(); iter != g_stageMonitorRecord.end(); ++iter) {
544 if (iter->first == stageMonitorId) {
545 g_stageMonitorRecord.erase(iter);
546 break;
547 }
548 }
549 }
550 cjDelegator->RemoveAbilityStageMonitor(cjStageMonitor);
551 return 0;
552 }
553
FFIAbilityDelegatorWaitAbilityStageMonitor(int64_t id,int64_t stageMonitorId,CJAbilityStageInfo abilityStageInfo,int64_t * abilityStageId)554 int32_t FFIAbilityDelegatorWaitAbilityStageMonitor(
555 int64_t id, int64_t stageMonitorId, CJAbilityStageInfo abilityStageInfo, int64_t* abilityStageId)
556 {
557 if (!abilityStageId) {
558 TAG_LOGE(AAFwkTag::DELEGATOR, "receiver is nullptr");
559 return COMMON_FAILED;
560 }
561 auto cjDelegator = FFI::FFIData::GetData<CJAbilityDelegator>(id);
562 if (cjDelegator == nullptr) {
563 TAG_LOGE(AAFwkTag::DELEGATOR, "null cj delegator");
564 *abilityStageId = 0;
565 return COMMON_FAILED;
566 }
567 const char* moduleName = abilityStageInfo.moduleName;
568 const char* srcEntrance = abilityStageInfo.srcEntrance;
569 bool isExisted = false;
570 auto cjStageMonitor = ParseStageMonitorPara(stageMonitorId, moduleName, srcEntrance, isExisted);
571 if (cjStageMonitor == nullptr) {
572 TAG_LOGE(AAFwkTag::DELEGATOR, "parse cj stageMonitor failed");
573 *abilityStageId = 0;
574 return INCORRECT_PARAMETERS;
575 }
576
577 if (!isExisted) {
578 g_stageMonitorRecord.emplace(stageMonitorId, cjStageMonitor);
579 }
580
581 auto property = cjDelegator->WaitAbilityStageMonitor(cjStageMonitor);
582 if (!property) {
583 TAG_LOGE(AAFwkTag::DELEGATOR, "stageProperty is null");
584 *abilityStageId = 0;
585 return COMMON_FAILED;
586 }
587
588 *abilityStageId = property->cjStageObject_;
589 return 0;
590 }
591
FFIAbilityDelegatorWaitAbilityStageMonitorWithTimeout(int64_t id,int64_t stageMonitorId,CJAbilityStageInfo abilityStageInfo,int64_t timeout,int64_t * abilityStageId)592 int32_t FFIAbilityDelegatorWaitAbilityStageMonitorWithTimeout(
593 int64_t id, int64_t stageMonitorId, CJAbilityStageInfo abilityStageInfo, int64_t timeout, int64_t* abilityStageId)
594 {
595 if (!abilityStageId) {
596 TAG_LOGE(AAFwkTag::DELEGATOR, "receiver is nullptr");
597 return COMMON_FAILED;
598 }
599 auto cjDelegator = FFI::FFIData::GetData<CJAbilityDelegator>(id);
600 if (cjDelegator == nullptr) {
601 TAG_LOGE(AAFwkTag::DELEGATOR, "null cj delegator");
602 *abilityStageId = 0;
603 return COMMON_FAILED;
604 }
605 const char* moduleName = abilityStageInfo.moduleName;
606 const char* srcEntrance = abilityStageInfo.srcEntrance;
607 bool isExisted = false;
608 auto cjStageMonitor = ParseStageMonitorPara(stageMonitorId, moduleName, srcEntrance, isExisted);
609 if (cjStageMonitor == nullptr) {
610 TAG_LOGE(AAFwkTag::DELEGATOR, "parse cj stageMonitor failed");
611 *abilityStageId = 0;
612 return INCORRECT_PARAMETERS;
613 }
614
615 if (!isExisted) {
616 g_stageMonitorRecord.emplace(stageMonitorId, cjStageMonitor);
617 }
618
619 auto property = cjDelegator->WaitAbilityStageMonitor(cjStageMonitor, timeout);
620 if (!property) {
621 TAG_LOGE(AAFwkTag::DELEGATOR, "stageProperty is null");
622 *abilityStageId = 0;
623 return COMMON_FAILED;
624 }
625
626 *abilityStageId = property->cjStageObject_;
627 return 0;
628 }
629
FFIAbilityDelegatorRegistryGetAbilityDelegator()630 int64_t FFIAbilityDelegatorRegistryGetAbilityDelegator()
631 {
632 auto delegator = OHOS::AppExecFwk::AbilityDelegatorRegistry::GetCJAbilityDelegator();
633 if (delegator == nullptr) {
634 TAG_LOGE(AAFwkTag::DELEGATOR, "cjDelegatorImpl is null");
635 return INVALID_CODE;
636 }
637 auto cjDelegator = FFI::FFIData::Create<CJAbilityDelegator>(delegator);
638 if (cjDelegator == nullptr) {
639 TAG_LOGE(AAFwkTag::CONTEXT, "null cj delegator");
640 return INVALID_CODE;
641 }
642 return cjDelegator->GetID();
643 }
644
FFIAbilityDelegatorStartAbility(int64_t id,WantHandle want)645 int32_t FFIAbilityDelegatorStartAbility(int64_t id, WantHandle want)
646 {
647 auto cjDelegator = FFI::FFIData::GetData<CJAbilityDelegator>(id);
648 if (cjDelegator == nullptr) {
649 TAG_LOGE(AAFwkTag::DELEGATOR, "null cj delegator");
650 return INVALID_CODE;
651 }
652 auto actualWant = reinterpret_cast<AAFwk::Want*>(want);
653 return cjDelegator->StartAbility(*actualWant);
654 }
655
FFIAbilityDelegatorExecuteShellCommand(int64_t id,const char * cmd,int64_t timeoutSec)656 int32_t FFIAbilityDelegatorExecuteShellCommand(int64_t id, const char* cmd, int64_t timeoutSec)
657 {
658 auto cjDelegator = FFI::FFIData::GetData<CJAbilityDelegator>(id);
659 if (cjDelegator == nullptr) {
660 TAG_LOGE(AAFwkTag::DELEGATOR, "null cj delegator");
661 return INVALID_CODE;
662 }
663 auto cJShellCmdResult = FFI::FFIData::Create<CJShellCmdResult>(cjDelegator->ExecuteShellCommand(cmd, timeoutSec));
664 if (cJShellCmdResult == nullptr) {
665 TAG_LOGE(AAFwkTag::CONTEXT, "cj shell command result is null.");
666 return INVALID_CODE;
667 }
668 return cJShellCmdResult->GetID();
669 }
670
FFIGetExitCode(int64_t id)671 int32_t FFIGetExitCode(int64_t id)
672 {
673 auto cjShellCmdResult = FFI::FFIData::GetData<CJShellCmdResult>(id);
674 if (cjShellCmdResult == nullptr) {
675 TAG_LOGE(AAFwkTag::DELEGATOR, "null cj shellcommand result");
676 return INVALID_CODE;
677 }
678 return cjShellCmdResult->GetExitCode();
679 }
680
FFIGetStdResult(int64_t id)681 const char* FFIGetStdResult(int64_t id)
682 {
683 auto cjShellCmdResult = FFI::FFIData::GetData<CJShellCmdResult>(id);
684 if (cjShellCmdResult == nullptr) {
685 TAG_LOGE(AAFwkTag::DELEGATOR, "null cj shellcommand result");
686 return nullptr;
687 }
688 const char* res = CreateCStringFromString(cjShellCmdResult->GetStdResult());
689 return res;
690 }
691
FFIDump(int64_t id)692 const char* FFIDump(int64_t id)
693 {
694 auto cjShellCmdResult = FFI::FFIData::GetData<CJShellCmdResult>(id);
695 if (cjShellCmdResult == nullptr) {
696 TAG_LOGE(AAFwkTag::DELEGATOR, "null cj shellcommand result");
697 return nullptr;
698 }
699 const char* dump = CreateCStringFromString(cjShellCmdResult->Dump());
700 return dump;
701 }
702
FFIAbilityDelegatorApplicationContext(int64_t id)703 int32_t FFIAbilityDelegatorApplicationContext(int64_t id)
704 {
705 auto cjDelegator = FFI::FFIData::GetData<CJAbilityDelegator>(id);
706 if (cjDelegator == nullptr) {
707 TAG_LOGE(AAFwkTag::DELEGATOR, "null cj delegator");
708 return INVALID_CODE;
709 }
710 auto appContext = ApplicationContextCJ::CJApplicationContext::GetCJApplicationContext(cjDelegator->GetAppContext());
711 if (appContext == nullptr) {
712 TAG_LOGE(AAFwkTag::DELEGATOR, "null app context");
713 return INVALID_CODE;
714 }
715 return appContext->GetID();
716 }
717
FFIAbilityDelegatorFinishTest(int64_t id,const char * msg,int64_t code)718 void FFIAbilityDelegatorFinishTest(int64_t id, const char* msg, int64_t code)
719 {
720 auto cjDelegator = FFI::FFIData::GetData<CJAbilityDelegator>(id);
721 if (cjDelegator == nullptr) {
722 TAG_LOGE(AAFwkTag::DELEGATOR, "null cj delegator");
723 return;
724 }
725 cjDelegator->FinishTest(msg, code);
726 }
727 }
728 }
729 }