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 "accessible_ability_client_stub.h"
17#include "accessibility_element_info_parcel.h"
18#include "accessibility_event_info_parcel.h"
19#include "accessibility_ipc_interface_code.h"
20#include "hilog_wrapper.h"
21
22#define SWITCH_BEGIN(code) switch (code) {
23#define SWITCH_CASE(case_code, func)     \
24    case case_code: {                    \
25        result_code = func(data, reply); \
26        break;                           \
27    }
28
29#define SWITCH_END()                                                                           \
30    default: {                                                                                 \
31        result_code = ERR_CODE_DEFAULT;                                                        \
32        HILOG_WARN("AccessibleAbilityClientStub::OnRemoteRequest, default case, need check."); \
33        break;                                                                                 \
34    }                                                                                          \
35        }
36
37#define ACCESSIBLE_ABILITY_CLIENT_STUB_CASES()                                                  \
38    SWITCH_CASE(AccessibilityInterfaceCode::INIT, HandleInit)                                   \
39    SWITCH_CASE(AccessibilityInterfaceCode::DISCONNECT, HandleDisconnect)                       \
40    SWITCH_CASE(AccessibilityInterfaceCode::ON_ACCESSIBILITY_EVENT, HandleOnAccessibilityEvent) \
41    SWITCH_CASE(AccessibilityInterfaceCode::ON_KEY_PRESS_EVENT, HandleOnKeyPressEvent)
42
43namespace OHOS {
44namespace Accessibility {
45constexpr int32_t ERR_CODE_DEFAULT = -1000;
46
47AccessibleAbilityClientStub::AccessibleAbilityClientStub()
48{
49}
50
51AccessibleAbilityClientStub::~AccessibleAbilityClientStub()
52{
53}
54
55int AccessibleAbilityClientStub::OnRemoteRequest(uint32_t code,
56    MessageParcel &data, MessageParcel &reply, MessageOption &option)
57{
58    HILOG_DEBUG("AccessibleAbilityClientStub::OnRemoteRequest, cmd = %d, flags= %d", code, option.GetFlags());
59    std::u16string descriptor = AccessibleAbilityClientStub::GetDescriptor();
60    std::u16string remote = data.ReadInterfaceToken();
61    if (descriptor != remote) {
62        HILOG_ERROR("local descriptor is not equal to remote descriptor");
63        return ERR_INVALID_STATE;
64    }
65
66    ErrCode result_code = ERR_NONE;
67    SWITCH_BEGIN(code)
68    ACCESSIBLE_ABILITY_CLIENT_STUB_CASES()
69    SWITCH_END()
70
71    if (result_code != ERR_CODE_DEFAULT) {
72        return result_code;
73    }
74
75    return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
76}
77
78ErrCode AccessibleAbilityClientStub::HandleInit(MessageParcel &data, MessageParcel &reply)
79{
80    HILOG_DEBUG();
81    sptr<IRemoteObject> remote = data.ReadRemoteObject();
82    if (remote == nullptr) {
83        HILOG_ERROR("object is nullptr.");
84        return ERR_INVALID_VALUE;
85    }
86
87    sptr<IAccessibleAbilityChannel> channel = iface_cast<IAccessibleAbilityChannel>(remote);
88    if (channel == nullptr) {
89        HILOG_ERROR("channel is nullptr.");
90        return ERR_INVALID_VALUE;
91    }
92    int32_t channelId = data.ReadInt32();
93
94    Init(channel, channelId);
95    return NO_ERROR;
96}
97
98ErrCode AccessibleAbilityClientStub::HandleDisconnect(MessageParcel &data, MessageParcel &reply)
99{
100    HILOG_DEBUG();
101    int32_t channelId = data.ReadInt32();
102    Disconnect(channelId);
103    return NO_ERROR;
104}
105
106ErrCode AccessibleAbilityClientStub::HandleOnAccessibilityEvent(MessageParcel &data, MessageParcel &reply)
107{
108    HILOG_DEBUG();
109    sptr<AccessibilityEventInfoParcel> eventInfo = data.ReadStrongParcelable<AccessibilityEventInfoParcel>();
110    if (eventInfo == nullptr) {
111        HILOG_ERROR("ReadStrongParcelable<AccessibilityEventInfo> failed");
112        return ERR_INVALID_VALUE;
113    }
114
115    OnAccessibilityEvent(*eventInfo);
116    return NO_ERROR;
117}
118
119ErrCode AccessibleAbilityClientStub::HandleOnKeyPressEvent(MessageParcel &data, MessageParcel &reply)
120{
121    HILOG_DEBUG();
122    int32_t sequence = data.ReadInt32();
123
124    std::shared_ptr<MMI::KeyEvent> keyEvent = MMI::KeyEvent::Create();
125    if (keyEvent == nullptr) {
126        HILOG_ERROR("keyEvent is nullptr");
127        return ERR_INVALID_VALUE;
128    }
129
130    if (!keyEvent->ReadFromParcel(data)) {
131        HILOG_ERROR("keyEvent ReadFromParcel failed");
132        return ERR_INVALID_VALUE;
133    }
134    OnKeyPressEvent(*keyEvent, sequence);
135    return NO_ERROR;
136}
137} // namespace Accessibility
138} // namespace OHOS