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