1 /*
2 * Copyright (C) 2022 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 "input_method_system_ability_stub.h"
17
18 #include <chrono>
19 #include <cinttypes>
20 #include <memory>
21
22 #include "element_name.h"
23 #include "input_client_proxy.h"
24 #include "input_method_core_proxy.h"
25 #include "ipc_skeleton.h"
26 #include "itypes_util.h"
27 #include "xcollie/xcollie.h"
28 #include "xcollie/xcollie_define.h"
29 namespace OHOS {
30 namespace MiscServices {
31 using namespace std::chrono;
32 using namespace HiviewDFX;
33 constexpr uint32_t FATAL_TIMEOUT = 30; // 30s
34 constexpr int64_t WARNING_TIMEOUT = 5000; // 5s
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)35 int32_t InputMethodSystemAbilityStub::OnRemoteRequest(
36 uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)
37 {
38 if (code != static_cast<uint32_t>(InputMethodInterfaceCode::RELEASE_INPUT)) {
39 IMSA_HILOGI("IMSA, code = %{public}u, callingPid/Uid/timestamp: %{public}d/%{public}d/%{public}lld", code,
40 IPCSkeleton::GetCallingPid(), IPCSkeleton::GetCallingUid(),
41 std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch())
42 .count());
43 }
44 std::u16string remoteDescriptor = data.ReadInterfaceToken();
45 if (remoteDescriptor != IInputMethodSystemAbility::GetDescriptor()) {
46 IMSA_HILOGE("%{public}s descriptor failed!", __func__);
47 return ErrorCode::ERROR_STATUS_UNKNOWN_TRANSACTION;
48 }
49 if (code >= static_cast<uint32_t>(InputMethodInterfaceCode::IMS_CMD_BEGIN) &&
50 code < static_cast<uint32_t>(InputMethodInterfaceCode::IMS_CMD_END)) {
51 // service reboot when timeout 30s
52 auto id = XCollie::GetInstance().SetTimer("IMSA_API[" + std::to_string(code) + "]", FATAL_TIMEOUT, nullptr,
53 nullptr, XCOLLIE_FLAG_DEFAULT);
54 int64_t startPoint = duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count();
55 auto ret = (this->*HANDLERS[code])(data, reply);
56 int64_t costTime = duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count() - startPoint;
57 // log warning when timeout 5s
58 if (costTime > WARNING_TIMEOUT) {
59 IMSA_HILOGW("code: %{public}d, pid: %{public}d, uid: %{public}d, cost: %{public}" PRId64 "", code,
60 IPCSkeleton::GetCallingPid(), IPCSkeleton::GetCallingUid(), costTime);
61 }
62 XCollie::GetInstance().CancelTimer(id);
63 return ret;
64 } else {
65 IMSA_HILOGE("code error, code = %{public}u, callingPid: %{public}d, callingUid: %{public}d.", code,
66 IPCSkeleton::GetCallingPid(), IPCSkeleton::GetCallingUid());
67 return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
68 }
69 }
70
StartInputOnRemote(MessageParcel & data,MessageParcel & reply)71 int32_t InputMethodSystemAbilityStub::StartInputOnRemote(MessageParcel &data, MessageParcel &reply)
72 {
73 InputClientInfo clientInfo;
74 sptr<IRemoteObject> client = nullptr;
75 if (!ITypesUtil::Unmarshal(data, clientInfo, client, clientInfo.channel)) {
76 IMSA_HILOGE("read clientInfo failed!");
77 return ErrorCode::ERROR_EX_PARCELABLE;
78 }
79 clientInfo.client = iface_cast<IInputClient>(client);
80 sptr<IRemoteObject> agent = nullptr;
81 int32_t ret = StartInput(clientInfo, agent);
82 return reply.WriteInt32(ret) && reply.WriteRemoteObject(agent) ? ErrorCode::NO_ERROR
83 : ErrorCode::ERROR_EX_PARCELABLE;
84 }
85
ShowCurrentInputOnRemote(MessageParcel & data,MessageParcel & reply)86 int32_t InputMethodSystemAbilityStub::ShowCurrentInputOnRemote(MessageParcel &data, MessageParcel &reply)
87 {
88 int32_t ret = ShowCurrentInput();
89 return reply.WriteInt32(ret) ? ErrorCode::NO_ERROR : ErrorCode::ERROR_EX_PARCELABLE;
90 }
91
HideCurrentInputOnRemote(MessageParcel & data,MessageParcel & reply)92 int32_t InputMethodSystemAbilityStub::HideCurrentInputOnRemote(MessageParcel &data, MessageParcel &reply)
93 {
94 int32_t ret = HideCurrentInput();
95 return reply.WriteInt32(ret) ? ErrorCode::NO_ERROR : ErrorCode::ERROR_EX_PARCELABLE;
96 }
97
StopInputSessionOnRemote(MessageParcel & data,MessageParcel & reply)98 int32_t InputMethodSystemAbilityStub::StopInputSessionOnRemote(MessageParcel &data, MessageParcel &reply)
99 {
100 int32_t ret = StopInputSession();
101 return reply.WriteInt32(ret) ? ErrorCode::NO_ERROR : ErrorCode::ERROR_EX_PARCELABLE;
102 }
103
ShowInputOnRemote(MessageParcel & data,MessageParcel & reply)104 int32_t InputMethodSystemAbilityStub::ShowInputOnRemote(MessageParcel &data, MessageParcel &reply)
105 {
106 auto clientObject = data.ReadRemoteObject();
107 if (clientObject == nullptr) {
108 IMSA_HILOGE("clientObject is nullptr!");
109 return ErrorCode::ERROR_EX_PARCELABLE;
110 }
111 int32_t ret = ShowInput(iface_cast<IInputClient>(clientObject));
112 return reply.WriteInt32(ret) ? ErrorCode::NO_ERROR : ErrorCode::ERROR_EX_PARCELABLE;
113 }
114
HideInputOnRemote(MessageParcel & data,MessageParcel & reply)115 int32_t InputMethodSystemAbilityStub::HideInputOnRemote(MessageParcel &data, MessageParcel &reply)
116 {
117 auto clientObject = data.ReadRemoteObject();
118 if (clientObject == nullptr) {
119 IMSA_HILOGE("clientObject is nullptr!");
120 return ErrorCode::ERROR_EX_PARCELABLE;
121 }
122 int32_t ret = HideInput(iface_cast<IInputClient>(clientObject));
123 return reply.WriteInt32(ret) ? ErrorCode::NO_ERROR : ErrorCode::ERROR_EX_PARCELABLE;
124 }
125
ReleaseInputOnRemote(MessageParcel & data,MessageParcel & reply)126 int32_t InputMethodSystemAbilityStub::ReleaseInputOnRemote(MessageParcel &data, MessageParcel &reply)
127 {
128 auto clientObject = data.ReadRemoteObject();
129 if (clientObject == nullptr) {
130 IMSA_HILOGE("clientObject is nullptr!");
131 return ErrorCode::ERROR_EX_PARCELABLE;
132 }
133 int32_t ret = ReleaseInput(iface_cast<IInputClient>(clientObject));
134 return reply.WriteInt32(ret) ? ErrorCode::NO_ERROR : ErrorCode::ERROR_EX_PARCELABLE;
135 }
136
RequestShowInputOnRemote(MessageParcel & data,MessageParcel & reply)137 int32_t InputMethodSystemAbilityStub::RequestShowInputOnRemote(MessageParcel &data, MessageParcel &reply)
138 {
139 return reply.WriteInt32(RequestShowInput()) ? ErrorCode::NO_ERROR : ErrorCode::ERROR_EX_PARCELABLE;
140 }
141
RequestHideInputOnRemote(MessageParcel & data,MessageParcel & reply)142 int32_t InputMethodSystemAbilityStub::RequestHideInputOnRemote(MessageParcel &data, MessageParcel &reply)
143 {
144 return reply.WriteInt32(RequestHideInput()) ? ErrorCode::NO_ERROR : ErrorCode::ERROR_EX_PARCELABLE;
145 }
146
DisplayOptionalInputMethodOnRemote(MessageParcel & data,MessageParcel & reply)147 int32_t InputMethodSystemAbilityStub::DisplayOptionalInputMethodOnRemote(MessageParcel &data, MessageParcel &reply)
148 {
149 int32_t ret = DisplayOptionalInputMethod();
150 return reply.WriteInt32(ret) ? ErrorCode::NO_ERROR : ErrorCode::ERROR_EX_PARCELABLE;
151 }
152
SetCoreAndAgentOnRemote(MessageParcel & data,MessageParcel & reply)153 int32_t InputMethodSystemAbilityStub::SetCoreAndAgentOnRemote(MessageParcel &data, MessageParcel &reply)
154 {
155 auto coreObject = data.ReadRemoteObject();
156 if (coreObject == nullptr) {
157 IMSA_HILOGE("coreObject is nullptr!");
158 return ErrorCode::ERROR_EX_PARCELABLE;
159 }
160 auto agentObject = data.ReadRemoteObject();
161 if (agentObject == nullptr) {
162 IMSA_HILOGE("agentObject is nullptr!");
163 return ErrorCode::ERROR_EX_PARCELABLE;
164 }
165 int32_t ret = SetCoreAndAgent(iface_cast<IInputMethodCore>(coreObject), agentObject);
166 return reply.WriteInt32(ret) ? ErrorCode::NO_ERROR : ErrorCode::ERROR_EX_PARCELABLE;
167 }
168
GetDefaultInputMethodOnRemote(MessageParcel & data,MessageParcel & reply)169 int32_t InputMethodSystemAbilityStub::GetDefaultInputMethodOnRemote(MessageParcel &data, MessageParcel &reply)
170 {
171 std::shared_ptr<Property> prop = std::make_shared<Property>();
172 bool isBrief = false;
173 auto ret = data.ReadBool(isBrief);
174 if (!ret) {
175 IMSA_HILOGE("read isBrief failed!");
176 }
177 ret = GetDefaultInputMethod(prop, isBrief);
178 if (prop == nullptr) {
179 return ErrorCode::ERROR_EX_PARCELABLE;
180 }
181 return ITypesUtil::Marshal(reply, ret, *prop) ? ErrorCode::NO_ERROR : ErrorCode::ERROR_EX_PARCELABLE;
182 }
183
IsDefaultImeSetOnRemote(MessageParcel & data,MessageParcel & reply)184 int32_t InputMethodSystemAbilityStub::IsDefaultImeSetOnRemote(MessageParcel &data, MessageParcel &reply)
185 {
186 return ITypesUtil::Marshal(reply, ErrorCode::NO_ERROR, IsDefaultImeSet()) ? ErrorCode::NO_ERROR
187 : ErrorCode::ERROR_EX_PARCELABLE;
188 }
189
EnableImeOnRemote(MessageParcel & data,MessageParcel & reply)190 int32_t InputMethodSystemAbilityStub::EnableImeOnRemote(MessageParcel &data, MessageParcel &reply)
191 {
192 std::string bundleName;
193 if (!ITypesUtil::Unmarshal(data, bundleName)) {
194 IMSA_HILOGE("unmarshal failed!");
195 return ErrorCode::ERROR_EX_PARCELABLE;
196 }
197 return ITypesUtil::Marshal(reply, ErrorCode::NO_ERROR, EnableIme(bundleName)) ? ErrorCode::NO_ERROR
198 : ErrorCode::ERROR_EX_PARCELABLE;
199 }
200
GetInputMethodConfigOnRemote(MessageParcel & data,MessageParcel & reply)201 int32_t InputMethodSystemAbilityStub::GetInputMethodConfigOnRemote(MessageParcel &data, MessageParcel &reply)
202 {
203 OHOS::AppExecFwk::ElementName inputMethodConfig;
204 auto ret = GetInputMethodConfig(inputMethodConfig);
205 IMSA_HILOGD("GetInputMethodConfigOnRemote inputMethodConfig is %{public}s, %{public}s",
206 inputMethodConfig.GetBundleName().c_str(), inputMethodConfig.GetAbilityName().c_str());
207 return ITypesUtil::Marshal(reply, ret, inputMethodConfig) ? ErrorCode::NO_ERROR : ErrorCode::ERROR_EX_PARCELABLE;
208 }
209
GetSecurityModeOnRemote(MessageParcel & data,MessageParcel & reply)210 int32_t InputMethodSystemAbilityStub::GetSecurityModeOnRemote(MessageParcel &data, MessageParcel &reply)
211 {
212 IMSA_HILOGD("GetSecurityModeOnRemote start.");
213 int32_t security;
214 auto ret = GetSecurityMode(security);
215 IMSA_HILOGD("GetSecurityModeOnRemote, security: %{public}d", security);
216 return ITypesUtil::Marshal(reply, ret, security) ? ErrorCode::NO_ERROR : ErrorCode::ERROR_EX_PARCELABLE;
217 }
218
GetCurrentInputMethodOnRemote(MessageParcel & data,MessageParcel & reply)219 int32_t InputMethodSystemAbilityStub::GetCurrentInputMethodOnRemote(MessageParcel &data, MessageParcel &reply)
220 {
221 auto property = GetCurrentInputMethod();
222 if (property == nullptr) {
223 IMSA_HILOGE("property is nullptr!");
224 return reply.WriteInt32(ErrorCode::ERROR_EX_NULL_POINTER) ? ErrorCode::NO_ERROR
225 : ErrorCode::ERROR_EX_PARCELABLE;
226 }
227 if (!ITypesUtil::Marshal(reply, ErrorCode::NO_ERROR, *property)) {
228 IMSA_HILOGE("marshal failed!");
229 return ErrorCode::ERROR_EX_PARCELABLE;
230 }
231 return ErrorCode::NO_ERROR;
232 }
233
GetCurrentInputMethodSubtypeOnRemote(MessageParcel & data,MessageParcel & reply)234 int32_t InputMethodSystemAbilityStub::GetCurrentInputMethodSubtypeOnRemote(MessageParcel &data, MessageParcel &reply)
235 {
236 auto property = GetCurrentInputMethodSubtype();
237 if (property == nullptr) {
238 IMSA_HILOGE("property is nullptr!");
239 return reply.WriteInt32(ErrorCode::ERROR_EX_NULL_POINTER) ? ErrorCode::NO_ERROR
240 : ErrorCode::ERROR_EX_PARCELABLE;
241 }
242 if (!ITypesUtil::Marshal(reply, ErrorCode::NO_ERROR, *property)) {
243 IMSA_HILOGE("marshal failed");
244 return ErrorCode::ERROR_EX_PARCELABLE;
245 }
246 return ErrorCode::NO_ERROR;
247 }
248
ListInputMethodOnRemote(MessageParcel & data,MessageParcel & reply)249 int32_t InputMethodSystemAbilityStub::ListInputMethodOnRemote(MessageParcel &data, MessageParcel &reply)
250 {
251 uint32_t status;
252 if (!ITypesUtil::Unmarshal(data, status)) {
253 IMSA_HILOGE("read status failed!");
254 return ErrorCode::ERROR_EX_PARCELABLE;
255 }
256 std::vector<Property> properties = {};
257 auto ret = ListInputMethod(InputMethodStatus(status), properties);
258 if (!ITypesUtil::Marshal(reply, ret, properties)) {
259 IMSA_HILOGE("marshal failed");
260 return ErrorCode::ERROR_EX_PARCELABLE;
261 }
262 return ErrorCode::NO_ERROR;
263 }
264
ListInputMethodSubtypeOnRemote(MessageParcel & data,MessageParcel & reply)265 int32_t InputMethodSystemAbilityStub::ListInputMethodSubtypeOnRemote(MessageParcel &data, MessageParcel &reply)
266 {
267 std::string bundleName;
268 if (!ITypesUtil::Unmarshal(data, bundleName)) {
269 IMSA_HILOGE("read bundleName failed!");
270 return ErrorCode::ERROR_EX_PARCELABLE;
271 }
272 std::vector<SubProperty> subProps = {};
273 auto ret = ListInputMethodSubtype(bundleName, subProps);
274 if (!ITypesUtil::Marshal(reply, ret, subProps)) {
275 IMSA_HILOGE("marshal failed!");
276 return ErrorCode::ERROR_EX_PARCELABLE;
277 }
278 return ErrorCode::NO_ERROR;
279 }
280
ListCurrentInputMethodSubtypeOnRemote(MessageParcel & data,MessageParcel & reply)281 int32_t InputMethodSystemAbilityStub::ListCurrentInputMethodSubtypeOnRemote(MessageParcel &data, MessageParcel &reply)
282 {
283 std::vector<SubProperty> subProps = {};
284 auto ret = ListCurrentInputMethodSubtype(subProps);
285 if (!ITypesUtil::Marshal(reply, ret, subProps)) {
286 IMSA_HILOGE("marshal failed!");
287 return ErrorCode::ERROR_EX_PARCELABLE;
288 }
289 return ErrorCode::NO_ERROR;
290 }
291
SwitchInputMethodOnRemote(MessageParcel & data,MessageParcel & reply)292 int32_t InputMethodSystemAbilityStub::SwitchInputMethodOnRemote(MessageParcel &data, MessageParcel &reply)
293 {
294 std::string name;
295 std::string subName;
296 SwitchTrigger trigger;
297 if (!ITypesUtil::Unmarshal(data, name, subName, trigger)) {
298 IMSA_HILOGE("unmarshal failed!");
299 return ErrorCode::ERROR_EX_PARCELABLE;
300 }
301 return reply.WriteInt32(SwitchInputMethod(name, subName, trigger)) ? ErrorCode::NO_ERROR
302 : ErrorCode::ERROR_EX_PARCELABLE;
303 }
304
PanelStatusChangeOnRemote(MessageParcel & data,MessageParcel & reply)305 int32_t InputMethodSystemAbilityStub::PanelStatusChangeOnRemote(MessageParcel &data, MessageParcel &reply)
306 {
307 uint32_t status = 0;
308 ImeWindowInfo info;
309 if (!ITypesUtil::Unmarshal(data, status, info)) {
310 IMSA_HILOGE("unmarshal failed!");
311 return ErrorCode::ERROR_EX_PARCELABLE;
312 }
313 int32_t ret = PanelStatusChange(static_cast<InputWindowStatus>(status), info);
314 return reply.WriteInt32(ret) ? ErrorCode::NO_ERROR : ErrorCode::ERROR_EX_PARCELABLE;
315 }
316
UpdateListenEventFlagOnRemote(MessageParcel & data,MessageParcel & reply)317 int32_t InputMethodSystemAbilityStub::UpdateListenEventFlagOnRemote(MessageParcel &data, MessageParcel &reply)
318 {
319 InputClientInfo clientInfo;
320 sptr<IRemoteObject> client = nullptr;
321 uint32_t eventFlag = 0;
322 if (!ITypesUtil::Unmarshal(data, clientInfo, client, clientInfo.channel, eventFlag)) {
323 IMSA_HILOGE("unmarshal failed!");
324 return ErrorCode::ERROR_EX_PARCELABLE;
325 }
326 clientInfo.client = iface_cast<IInputClient>(client);
327 int32_t ret = UpdateListenEventFlag(clientInfo, eventFlag);
328 return reply.WriteInt32(ret) ? ErrorCode::NO_ERROR : ErrorCode::ERROR_EX_PARCELABLE;
329 }
330
ShowCurrentInputOnRemoteDeprecated(MessageParcel & data,MessageParcel & reply)331 int32_t InputMethodSystemAbilityStub::ShowCurrentInputOnRemoteDeprecated(MessageParcel &data, MessageParcel &reply)
332 {
333 int32_t ret = ShowCurrentInputDeprecated();
334 return reply.WriteInt32(ret) ? ErrorCode::NO_ERROR : ErrorCode::ERROR_EX_PARCELABLE;
335 }
336
HideCurrentInputOnRemoteDeprecated(MessageParcel & data,MessageParcel & reply)337 int32_t InputMethodSystemAbilityStub::HideCurrentInputOnRemoteDeprecated(MessageParcel &data, MessageParcel &reply)
338 {
339 int32_t ret = HideCurrentInputDeprecated();
340 return reply.WriteInt32(ret) ? ErrorCode::NO_ERROR : ErrorCode::ERROR_EX_PARCELABLE;
341 }
342
IsCurrentImeOnRemote(MessageParcel & data,MessageParcel & reply)343 int32_t InputMethodSystemAbilityStub::IsCurrentImeOnRemote(MessageParcel &data, MessageParcel &reply)
344 {
345 return ITypesUtil::Marshal(reply, ErrorCode::NO_ERROR, IsCurrentIme()) ? ErrorCode::NO_ERROR
346 : ErrorCode::ERROR_EX_PARCELABLE;
347 }
348
UnRegisteredProxyImeOnRemote(MessageParcel & data,MessageParcel & reply)349 int32_t InputMethodSystemAbilityStub::UnRegisteredProxyImeOnRemote(MessageParcel &data, MessageParcel &reply)
350 {
351 int32_t type = -1;
352 sptr<IRemoteObject> coreObject = nullptr;
353 if (!ITypesUtil::Unmarshal(data, type, coreObject) || coreObject == nullptr) {
354 IMSA_HILOGE("coreObject is nullptr!");
355 return ErrorCode::ERROR_EX_PARCELABLE;
356 }
357 int32_t ret = UnRegisteredProxyIme(static_cast<UnRegisteredType>(type), iface_cast<IInputMethodCore>(coreObject));
358 return reply.WriteInt32(ret) ? ErrorCode::NO_ERROR : ErrorCode::ERROR_EX_PARCELABLE;
359 }
360
IsInputTypeSupportedOnRemote(MessageParcel & data,MessageParcel & reply)361 int32_t InputMethodSystemAbilityStub::IsInputTypeSupportedOnRemote(MessageParcel &data, MessageParcel &reply)
362 {
363 InputType type;
364 if (!ITypesUtil::Unmarshal(data, type)) {
365 IMSA_HILOGE("unmarshal failed!");
366 return ErrorCode::ERROR_EX_PARCELABLE;
367 }
368 return ITypesUtil::Marshal(reply, ErrorCode::NO_ERROR, IsInputTypeSupported(type)) ? ErrorCode::NO_ERROR
369 : ErrorCode::ERROR_EX_PARCELABLE;
370 }
371
StartInputTypeOnRemote(MessageParcel & data,MessageParcel & reply)372 int32_t InputMethodSystemAbilityStub::StartInputTypeOnRemote(MessageParcel &data, MessageParcel &reply)
373 {
374 InputType type;
375 if (!ITypesUtil::Unmarshal(data, type)) {
376 IMSA_HILOGE("unmarshal failed!");
377 return ErrorCode::ERROR_EX_PARCELABLE;
378 }
379 return ITypesUtil::Marshal(reply, StartInputType(type)) ? ErrorCode::NO_ERROR : ErrorCode::ERROR_EX_PARCELABLE;
380 }
381
ExitCurrentInputTypeOnRemote(MessageParcel & data,MessageParcel & reply)382 int32_t InputMethodSystemAbilityStub::ExitCurrentInputTypeOnRemote(MessageParcel &data, MessageParcel &reply)
383 {
384 return ITypesUtil::Marshal(reply, ExitCurrentInputType()) ? ErrorCode::NO_ERROR : ErrorCode::ERROR_EX_PARCELABLE;
385 }
386
IsPanelShownOnRemote(MessageParcel & data,MessageParcel & reply)387 int32_t InputMethodSystemAbilityStub::IsPanelShownOnRemote(MessageParcel &data, MessageParcel &reply)
388 {
389 PanelInfo info;
390 if (!ITypesUtil::Unmarshal(data, info)) {
391 IMSA_HILOGE("unmarshal failed!");
392 return ErrorCode::ERROR_EX_PARCELABLE;
393 }
394 bool isShown = false;
395 int32_t ret = IsPanelShown(info, isShown);
396 return ITypesUtil::Marshal(reply, ret, isShown) ? ErrorCode::NO_ERROR : ErrorCode::ERROR_EX_PARCELABLE;
397 }
398
IsDefaultImeOnRemote(MessageParcel & data,MessageParcel & reply)399 int32_t InputMethodSystemAbilityStub::IsDefaultImeOnRemote(MessageParcel &data, MessageParcel &reply)
400 {
401 return ITypesUtil::Marshal(reply, IsDefaultIme()) ? ErrorCode::NO_ERROR : ErrorCode::ERROR_EX_PARCELABLE;
402 }
403
ConnectSystemCmdOnRemote(MessageParcel & data,MessageParcel & reply)404 int32_t InputMethodSystemAbilityStub::ConnectSystemCmdOnRemote(MessageParcel &data, MessageParcel &reply)
405 {
406 auto systemCmdStub = data.ReadRemoteObject();
407 if (systemCmdStub == nullptr) {
408 IMSA_HILOGE("systemCmdStub is nullptr!");
409 return ErrorCode::ERROR_EX_PARCELABLE;
410 }
411 sptr<IRemoteObject> agent = nullptr;
412 int32_t ret = ConnectSystemCmd(systemCmdStub, agent);
413 return reply.WriteInt32(ret) && reply.WriteRemoteObject(agent) ? ErrorCode::NO_ERROR
414 : ErrorCode::ERROR_EX_PARCELABLE;
415 }
416
IsCurrentImeByPidOnRemote(MessageParcel & data,MessageParcel & reply)417 int32_t InputMethodSystemAbilityStub::IsCurrentImeByPidOnRemote(MessageParcel &data, MessageParcel &reply)
418 {
419 int32_t pid = -1;
420 if (!ITypesUtil::Unmarshal(data, pid)) {
421 IMSA_HILOGE("unmarshal failed!");
422 return ErrorCode::ERROR_EX_PARCELABLE;
423 }
424 return ITypesUtil::Marshal(reply, ErrorCode::NO_ERROR, IsCurrentImeByPid(pid)) ? ErrorCode::NO_ERROR
425 : ErrorCode::ERROR_EX_PARCELABLE;
426 }
427
InitConnectOnRemote(MessageParcel & data,MessageParcel & reply)428 int32_t InputMethodSystemAbilityStub::InitConnectOnRemote(MessageParcel &data, MessageParcel &reply)
429 {
430 return reply.WriteInt32(InitConnect()) ? ErrorCode::NO_ERROR : ErrorCode::ERROR_EX_PARCELABLE;
431 }
432 } // namespace MiscServices
433 } // namespace OHOS