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