1bc2ed2b3Sopenharmony_ci/* 2bc2ed2b3Sopenharmony_ci * Copyright (C) 2023 Huawei Device Co., Ltd. 3bc2ed2b3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4bc2ed2b3Sopenharmony_ci * you may not use this file except in compliance with the License. 5bc2ed2b3Sopenharmony_ci * You may obtain a copy of the License at 6bc2ed2b3Sopenharmony_ci * 7bc2ed2b3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8bc2ed2b3Sopenharmony_ci * 9bc2ed2b3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10bc2ed2b3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11bc2ed2b3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12bc2ed2b3Sopenharmony_ci * See the License for the specific language governing permissions and 13bc2ed2b3Sopenharmony_ci * limitations under the License. 14bc2ed2b3Sopenharmony_ci */ 15bc2ed2b3Sopenharmony_ci#include "hce_session_proxy.h" 16bc2ed2b3Sopenharmony_ci 17bc2ed2b3Sopenharmony_ci#include "element_name.h" 18bc2ed2b3Sopenharmony_ci#include "hce_cmd_callback_stub.h" 19bc2ed2b3Sopenharmony_ci#include "loghelper.h" 20bc2ed2b3Sopenharmony_ci#include "message_option.h" 21bc2ed2b3Sopenharmony_ci#include "message_parcel.h" 22bc2ed2b3Sopenharmony_ci#include "nfc_sdk_common.h" 23bc2ed2b3Sopenharmony_ci#include "nfc_service_ipc_interface_code.h" 24bc2ed2b3Sopenharmony_ci#include "ce_payment_services_parcelable.h" 25bc2ed2b3Sopenharmony_ci#include "start_hce_info_parcelable.h" 26bc2ed2b3Sopenharmony_ci 27bc2ed2b3Sopenharmony_cinamespace OHOS { 28bc2ed2b3Sopenharmony_cinamespace NFC { 29bc2ed2b3Sopenharmony_cinamespace HCE { 30bc2ed2b3Sopenharmony_ciusing OHOS::AppExecFwk::ElementName; 31bc2ed2b3Sopenharmony_cistatic sptr<HceCmdCallbackStub> g_hceCmdCallbackStub = 32bc2ed2b3Sopenharmony_ci sptr<HceCmdCallbackStub>(new (std::nothrow) HceCmdCallbackStub); 33bc2ed2b3Sopenharmony_ci 34bc2ed2b3Sopenharmony_ciKITS::ErrorCode HceSessionProxy::RegHceCmdCallback(const sptr<KITS::IHceCmdCallback> &callback, 35bc2ed2b3Sopenharmony_ci const std::string &type) 36bc2ed2b3Sopenharmony_ci{ 37bc2ed2b3Sopenharmony_ci MessageParcel data; 38bc2ed2b3Sopenharmony_ci MessageParcel reply; 39bc2ed2b3Sopenharmony_ci MessageOption option(MessageOption::TF_SYNC); 40bc2ed2b3Sopenharmony_ci if (g_hceCmdCallbackStub == nullptr) { 41bc2ed2b3Sopenharmony_ci ErrorLog("%{public}s:g_hceCmdCallbackStub is nullptr", __func__); 42bc2ed2b3Sopenharmony_ci return KITS::ERR_HCE_PARAMETERS; 43bc2ed2b3Sopenharmony_ci } 44bc2ed2b3Sopenharmony_ci g_hceCmdCallbackStub->RegHceCmdCallback(callback, type); 45bc2ed2b3Sopenharmony_ci if (!data.WriteInterfaceToken(GetDescriptor())) { 46bc2ed2b3Sopenharmony_ci ErrorLog("Write interface token error"); 47bc2ed2b3Sopenharmony_ci return KITS::ERR_HCE_PARAMETERS; 48bc2ed2b3Sopenharmony_ci } 49bc2ed2b3Sopenharmony_ci if (!data.WriteString(type)) { 50bc2ed2b3Sopenharmony_ci ErrorLog("Write type error"); 51bc2ed2b3Sopenharmony_ci return KITS::ERR_HCE_PARAMETERS; 52bc2ed2b3Sopenharmony_ci } 53bc2ed2b3Sopenharmony_ci data.WriteInt32(0); 54bc2ed2b3Sopenharmony_ci if (!data.WriteRemoteObject(g_hceCmdCallbackStub->AsObject())) { 55bc2ed2b3Sopenharmony_ci ErrorLog("RegHceCmdCallback WriteRemoteObject failed!"); 56bc2ed2b3Sopenharmony_ci return KITS::ERR_HCE_PARAMETERS; 57bc2ed2b3Sopenharmony_ci } 58bc2ed2b3Sopenharmony_ci 59bc2ed2b3Sopenharmony_ci int error = SendRequestExpectReplyNone(static_cast<uint32_t>(NfcServiceIpcInterfaceCode::COMMAND_CE_HCE_ON), 60bc2ed2b3Sopenharmony_ci data, option); 61bc2ed2b3Sopenharmony_ci if (error != ERR_NONE) { 62bc2ed2b3Sopenharmony_ci ErrorLog("RegHceCmdCallback failed, error code is %{public}d", error); 63bc2ed2b3Sopenharmony_ci return KITS::ERR_HCE_PARAMETERS; 64bc2ed2b3Sopenharmony_ci } 65bc2ed2b3Sopenharmony_ci return KITS::ERR_NONE; 66bc2ed2b3Sopenharmony_ci} 67bc2ed2b3Sopenharmony_ci 68bc2ed2b3Sopenharmony_ciint HceSessionProxy::SendRawFrame(std::string hexCmdData, bool raw, std::string &hexRespData) 69bc2ed2b3Sopenharmony_ci{ 70bc2ed2b3Sopenharmony_ci MessageParcel data; 71bc2ed2b3Sopenharmony_ci MessageParcel reply; 72bc2ed2b3Sopenharmony_ci MessageOption option(MessageOption::TF_SYNC); 73bc2ed2b3Sopenharmony_ci if (!data.WriteInterfaceToken(GetDescriptor())) { 74bc2ed2b3Sopenharmony_ci return KITS::ErrorCode::ERR_HCE_PARAMETERS; 75bc2ed2b3Sopenharmony_ci } 76bc2ed2b3Sopenharmony_ci 77bc2ed2b3Sopenharmony_ci if (hexCmdData.size() > KITS::MAX_APDU_DATA_HEX_STR) { 78bc2ed2b3Sopenharmony_ci ErrorLog("raw frame too long"); 79bc2ed2b3Sopenharmony_ci return KITS::ErrorCode::ERR_HCE_PARAMETERS; 80bc2ed2b3Sopenharmony_ci } 81bc2ed2b3Sopenharmony_ci data.WriteString(hexCmdData); 82bc2ed2b3Sopenharmony_ci data.WriteBool(raw); 83bc2ed2b3Sopenharmony_ci int statusCode = Remote()->SendRequest( 84bc2ed2b3Sopenharmony_ci static_cast<uint32_t>(NfcServiceIpcInterfaceCode::COMMAND_CE_HCE_TRANSMIT), data, reply, option); 85bc2ed2b3Sopenharmony_ci if (statusCode == ERR_NONE) { 86bc2ed2b3Sopenharmony_ci hexRespData = reply.ReadString(); 87bc2ed2b3Sopenharmony_ci } 88bc2ed2b3Sopenharmony_ci return statusCode; 89bc2ed2b3Sopenharmony_ci} 90bc2ed2b3Sopenharmony_ciint HceSessionProxy::GetPaymentServices(std::vector<AbilityInfo> &abilityInfos) 91bc2ed2b3Sopenharmony_ci{ 92bc2ed2b3Sopenharmony_ci MessageParcel data; 93bc2ed2b3Sopenharmony_ci MessageParcel reply; 94bc2ed2b3Sopenharmony_ci MessageOption option(MessageOption::TF_SYNC); 95bc2ed2b3Sopenharmony_ci if (!data.WriteInterfaceToken(GetDescriptor())) { 96bc2ed2b3Sopenharmony_ci return KITS::ErrorCode::ERR_HCE_PARAMETERS; 97bc2ed2b3Sopenharmony_ci } 98bc2ed2b3Sopenharmony_ci data.WriteInt32(0); 99bc2ed2b3Sopenharmony_ci 100bc2ed2b3Sopenharmony_ci int statusCode = Remote()->SendRequest( 101bc2ed2b3Sopenharmony_ci static_cast<uint32_t>(NfcServiceIpcInterfaceCode::COMMAND_CE_HCE_GET_PAYMENT_SERVICES), data, reply, 102bc2ed2b3Sopenharmony_ci option); 103bc2ed2b3Sopenharmony_ci if (statusCode != ERR_NONE) { 104bc2ed2b3Sopenharmony_ci ErrorLog("GetPaymentServices failed, error code is %{public}d", statusCode); 105bc2ed2b3Sopenharmony_ci return statusCode; 106bc2ed2b3Sopenharmony_ci } 107bc2ed2b3Sopenharmony_ci 108bc2ed2b3Sopenharmony_ci std::shared_ptr<KITS::CePaymentServicesParcelable> paymentServices( 109bc2ed2b3Sopenharmony_ci reply.ReadParcelable<KITS::CePaymentServicesParcelable>()); 110bc2ed2b3Sopenharmony_ci if (paymentServices == nullptr) { 111bc2ed2b3Sopenharmony_ci ErrorLog("paymentServices read failed."); 112bc2ed2b3Sopenharmony_ci return KITS::ErrorCode::ERR_HCE_PARAMETERS; 113bc2ed2b3Sopenharmony_ci } 114bc2ed2b3Sopenharmony_ci std::vector<AbilityInfo> paymentAbilityInfos = paymentServices->paymentAbilityInfos; 115bc2ed2b3Sopenharmony_ci DebugLog("GetPaymentServices size %{public}zu", paymentAbilityInfos.size()); 116bc2ed2b3Sopenharmony_ci abilityInfos = std::move(paymentAbilityInfos); 117bc2ed2b3Sopenharmony_ci return statusCode; 118bc2ed2b3Sopenharmony_ci} 119bc2ed2b3Sopenharmony_ciKITS::ErrorCode HceSessionProxy::StopHce(ElementName &element) 120bc2ed2b3Sopenharmony_ci{ 121bc2ed2b3Sopenharmony_ci MessageParcel data; 122bc2ed2b3Sopenharmony_ci MessageParcel reply; 123bc2ed2b3Sopenharmony_ci MessageOption option(MessageOption::TF_SYNC); 124bc2ed2b3Sopenharmony_ci if (!data.WriteInterfaceToken(GetDescriptor())) { 125bc2ed2b3Sopenharmony_ci ErrorLog("Write interface token error"); 126bc2ed2b3Sopenharmony_ci return KITS::ERR_HCE_PARAMETERS; 127bc2ed2b3Sopenharmony_ci } 128bc2ed2b3Sopenharmony_ci if (!element.Marshalling(data)) { 129bc2ed2b3Sopenharmony_ci ErrorLog("Write element error"); 130bc2ed2b3Sopenharmony_ci return KITS::ERR_HCE_PARAMETERS; 131bc2ed2b3Sopenharmony_ci } 132bc2ed2b3Sopenharmony_ci 133bc2ed2b3Sopenharmony_ci data.WriteInt32(0); 134bc2ed2b3Sopenharmony_ci int error = SendRequestExpectReplyNone(static_cast<uint32_t>(NfcServiceIpcInterfaceCode::COMMAND_CE_HCE_STOP), 135bc2ed2b3Sopenharmony_ci data, option); 136bc2ed2b3Sopenharmony_ci if (error != ERR_NONE) { 137bc2ed2b3Sopenharmony_ci ErrorLog("StopHce failed, error code is %{public}d", error); 138bc2ed2b3Sopenharmony_ci return KITS::ERR_HCE_PARAMETERS; 139bc2ed2b3Sopenharmony_ci } 140bc2ed2b3Sopenharmony_ci return KITS::ERR_NONE; 141bc2ed2b3Sopenharmony_ci} 142bc2ed2b3Sopenharmony_ciKITS::ErrorCode HceSessionProxy::IsDefaultService(ElementName &element, const std::string &type, 143bc2ed2b3Sopenharmony_ci bool &isDefaultService) 144bc2ed2b3Sopenharmony_ci{ 145bc2ed2b3Sopenharmony_ci MessageParcel data; 146bc2ed2b3Sopenharmony_ci MessageParcel reply; 147bc2ed2b3Sopenharmony_ci MessageOption option(MessageOption::TF_SYNC); 148bc2ed2b3Sopenharmony_ci if (!data.WriteInterfaceToken(GetDescriptor())) { 149bc2ed2b3Sopenharmony_ci ErrorLog("Write interface token error"); 150bc2ed2b3Sopenharmony_ci return KITS::ERR_HCE_PARAMETERS; 151bc2ed2b3Sopenharmony_ci } 152bc2ed2b3Sopenharmony_ci if (!element.Marshalling(data)) { 153bc2ed2b3Sopenharmony_ci ErrorLog("Write element error"); 154bc2ed2b3Sopenharmony_ci return KITS::ERR_HCE_PARAMETERS; 155bc2ed2b3Sopenharmony_ci } 156bc2ed2b3Sopenharmony_ci 157bc2ed2b3Sopenharmony_ci if (!data.WriteString(type)) { 158bc2ed2b3Sopenharmony_ci ErrorLog("Write type error"); 159bc2ed2b3Sopenharmony_ci return KITS::ERR_HCE_PARAMETERS; 160bc2ed2b3Sopenharmony_ci } 161bc2ed2b3Sopenharmony_ci data.WriteInt32(0); 162bc2ed2b3Sopenharmony_ci int error = SendRequestExpectReplyBool( 163bc2ed2b3Sopenharmony_ci static_cast<uint32_t>(NfcServiceIpcInterfaceCode::COMMAND_CE_HCE_IS_DEFAULT_SERVICE), data, option, 164bc2ed2b3Sopenharmony_ci isDefaultService); 165bc2ed2b3Sopenharmony_ci if (error != ERR_NONE) { 166bc2ed2b3Sopenharmony_ci ErrorLog("IsDefaultService failed, error code is %{public}d", error); 167bc2ed2b3Sopenharmony_ci return KITS::ERR_HCE_PARAMETERS; 168bc2ed2b3Sopenharmony_ci } 169bc2ed2b3Sopenharmony_ci return KITS::ERR_NONE; 170bc2ed2b3Sopenharmony_ci} 171bc2ed2b3Sopenharmony_ci 172bc2ed2b3Sopenharmony_ciKITS::ErrorCode HceSessionProxy::StartHce(const ElementName &element, const std::vector<std::string> &aids) 173bc2ed2b3Sopenharmony_ci{ 174bc2ed2b3Sopenharmony_ci MessageParcel data; 175bc2ed2b3Sopenharmony_ci MessageParcel reply; 176bc2ed2b3Sopenharmony_ci MessageOption option(MessageOption::TF_SYNC); 177bc2ed2b3Sopenharmony_ci if (!data.WriteInterfaceToken(GetDescriptor())) { 178bc2ed2b3Sopenharmony_ci ErrorLog("Write interface token error"); 179bc2ed2b3Sopenharmony_ci return KITS::ERR_HCE_PARAMETERS; 180bc2ed2b3Sopenharmony_ci } 181bc2ed2b3Sopenharmony_ci 182bc2ed2b3Sopenharmony_ci KITS::StartHceInfoParcelable startHceInfo; 183bc2ed2b3Sopenharmony_ci startHceInfo.SetAids(aids); 184bc2ed2b3Sopenharmony_ci startHceInfo.SetElement(element); 185bc2ed2b3Sopenharmony_ci if (!startHceInfo.Marshalling(data)) { 186bc2ed2b3Sopenharmony_ci ErrorLog("Write start info error"); 187bc2ed2b3Sopenharmony_ci return KITS::ERR_HCE_PARAMETERS; 188bc2ed2b3Sopenharmony_ci } 189bc2ed2b3Sopenharmony_ci 190bc2ed2b3Sopenharmony_ci data.WriteInt32(0); 191bc2ed2b3Sopenharmony_ci int error = SendRequestExpectReplyNone( 192bc2ed2b3Sopenharmony_ci static_cast<uint32_t>(NfcServiceIpcInterfaceCode::COMMAND_CE_HCE_START), data, option); 193bc2ed2b3Sopenharmony_ci if (error != ERR_NONE) { 194bc2ed2b3Sopenharmony_ci ErrorLog("StartHce failed, error code is %{public}d", error); 195bc2ed2b3Sopenharmony_ci return KITS::ERR_HCE_PARAMETERS; 196bc2ed2b3Sopenharmony_ci } 197bc2ed2b3Sopenharmony_ci return KITS::ERR_NONE; 198bc2ed2b3Sopenharmony_ci} 199bc2ed2b3Sopenharmony_ci} // namespace HCE 200bc2ed2b3Sopenharmony_ci} // namespace NFC 201bc2ed2b3Sopenharmony_ci} // namespace OHOS 202