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 "application_context.h"
23 #include "hilog_tag_wrapper.h"
24
25 namespace OHOS {
26 namespace AbilityDelegatorCJ {
27 using namespace OHOS::FFI;
28 using namespace OHOS::AbilityRuntime;
29
StartAbility(const AAFwk::Want & want)30 int32_t CJAbilityDelegator::StartAbility(const AAFwk::Want &want)
31 {
32 return delegator_->StartAbility(want);
33 }
34
ExecuteShellCommand(const char * cmd,int64_t timeoutSec)35 std::shared_ptr<AppExecFwk::ShellCmdResult> CJAbilityDelegator::ExecuteShellCommand(const char* cmd, int64_t timeoutSec)
36 {
37 auto shellCmd = delegator_->ExecuteShellCommand(cmd, timeoutSec);
38 std::shared_ptr<AppExecFwk::ShellCmdResult> ret = std::move(shellCmd);
39 return ret;
40 }
41
GetAppContext()42 std::shared_ptr<AbilityRuntime::ApplicationContext> CJAbilityDelegator::GetAppContext()
43 {
44 auto context = delegator_->GetAppContext();
45 if (context == nullptr) {
46 TAG_LOGE(AAFwkTag::DELEGATOR, "null context");
47 return nullptr;
48 }
49 return context->GetApplicationContext();
50 }
51
GetExitCode()52 int32_t CJShellCmdResult::GetExitCode()
53 {
54 return shellCmdResultr_->GetExitCode();
55 }
56
GetStdResult()57 std::string CJShellCmdResult::GetStdResult()
58 {
59 return shellCmdResultr_->GetStdResult();
60 }
61
Dump()62 std::string CJShellCmdResult::Dump()
63 {
64 return shellCmdResultr_->Dump();
65 }
66
FinishTest(const char * msg,int64_t code)67 void CJAbilityDelegator::FinishTest(const char* msg, int64_t code)
68 {
69 delegator_->FinishUserTest(msg, code);
70 }
71
72 extern "C" {
FFIAbilityDelegatorRegistryGetAbilityDelegator()73 int64_t FFIAbilityDelegatorRegistryGetAbilityDelegator()
74 {
75 auto delegator = OHOS::AppExecFwk::AbilityDelegatorRegistry::GetAbilityDelegator();
76 if (delegator == nullptr) {
77 TAG_LOGE(AAFwkTag::DELEGATOR, "null cj delegator");
78 return INVALID_CODE;
79 }
80 auto cjDelegator = FFI::FFIData::Create<CJAbilityDelegator>(delegator);
81 if (cjDelegator == nullptr) {
82 TAG_LOGE(AAFwkTag::CONTEXT, "cj delegator is null.");
83 return INVALID_CODE;
84 }
85 return cjDelegator->GetID();
86 }
87
FFIAbilityDelegatorStartAbility(int64_t id,WantHandle want)88 int32_t FFIAbilityDelegatorStartAbility(int64_t id, WantHandle want)
89 {
90 auto cjDelegator = FFI::FFIData::GetData<CJAbilityDelegator>(id);
91 if (cjDelegator == nullptr) {
92 TAG_LOGE(AAFwkTag::DELEGATOR, "null cj delegator");
93 return INVALID_CODE;
94 }
95 auto actualWant = reinterpret_cast<AAFwk::Want*>(want);
96 return cjDelegator->StartAbility(*actualWant);
97 }
98
FFIAbilityDelegatorExecuteShellCommand(int64_t id,const char * cmd,int64_t timeoutSec)99 int32_t FFIAbilityDelegatorExecuteShellCommand(int64_t id, const char* cmd, int64_t timeoutSec)
100 {
101 auto cjDelegator = FFI::FFIData::GetData<CJAbilityDelegator>(id);
102 if (cjDelegator == nullptr) {
103 TAG_LOGE(AAFwkTag::DELEGATOR, "null cj delegator");
104 return INVALID_CODE;
105 }
106 auto cJShellCmdResult = FFI::FFIData::Create<CJShellCmdResult>(cjDelegator->ExecuteShellCommand(cmd, timeoutSec));
107 if (cJShellCmdResult == nullptr) {
108 TAG_LOGE(AAFwkTag::CONTEXT, "cj shell command result is null.");
109 return INVALID_CODE;
110 }
111 return cJShellCmdResult->GetID();
112 }
113
FFIGetExitCode(int64_t id)114 int32_t FFIGetExitCode(int64_t id)
115 {
116 auto cjShellCmdResult = FFI::FFIData::GetData<CJShellCmdResult>(id);
117 if (cjShellCmdResult == nullptr) {
118 TAG_LOGE(AAFwkTag::DELEGATOR, "null cj shellcommand result");
119 return INVALID_CODE;
120 }
121 return cjShellCmdResult->GetExitCode();
122 }
123
FFIGetStdResult(int64_t id)124 const char* FFIGetStdResult(int64_t id)
125 {
126 auto cjShellCmdResult = FFI::FFIData::GetData<CJShellCmdResult>(id);
127 if (cjShellCmdResult == nullptr) {
128 TAG_LOGE(AAFwkTag::DELEGATOR, "null cj shellcommand result");
129 return nullptr;
130 }
131 const char* res = CreateCStringFromString(cjShellCmdResult->GetStdResult());
132 return res;
133 }
134
FFIDump(int64_t id)135 const char* FFIDump(int64_t id)
136 {
137 auto cjShellCmdResult = FFI::FFIData::GetData<CJShellCmdResult>(id);
138 if (cjShellCmdResult == nullptr) {
139 TAG_LOGE(AAFwkTag::DELEGATOR, "null cj shellcommand result");
140 return nullptr;
141 }
142 const char* dump = CreateCStringFromString(cjShellCmdResult->Dump());
143 return dump;
144 }
145
FFIAbilityDelegatorApplicationContext(int64_t id)146 int32_t FFIAbilityDelegatorApplicationContext(int64_t id)
147 {
148 auto cjDelegator = FFI::FFIData::GetData<CJAbilityDelegator>(id);
149 if (cjDelegator == nullptr) {
150 TAG_LOGE(AAFwkTag::DELEGATOR, "null cj delegator");
151 return INVALID_CODE;
152 }
153 auto appContext = FFI::FFIData::Create<ApplicationContextCJ::CJApplicationContext>(cjDelegator->GetAppContext());
154 if (appContext == nullptr) {
155 TAG_LOGE(AAFwkTag::DELEGATOR, "null app context");
156 return INVALID_CODE;
157 }
158 return appContext->GetID();
159 }
160
FFIAbilityDelegatorFinishTest(int64_t id,const char * msg,int64_t code)161 void FFIAbilityDelegatorFinishTest(int64_t id, const char* msg, int64_t code)
162 {
163 auto cjDelegator = FFI::FFIData::GetData<CJAbilityDelegator>(id);
164 if (cjDelegator == nullptr) {
165 TAG_LOGE(AAFwkTag::DELEGATOR, "null cj delegator");
166 }
167 cjDelegator->FinishTest(msg, code);
168 }
169 }
170 }
171 }