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 }