1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright (c) 2022-2023 Huawei Device Co., Ltd. 3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License. 5094332d3Sopenharmony_ci * You may obtain a copy of the License at 6094332d3Sopenharmony_ci * 7094332d3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8094332d3Sopenharmony_ci * 9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and 13094332d3Sopenharmony_ci * limitations under the License. 14094332d3Sopenharmony_ci */ 15094332d3Sopenharmony_ci 16094332d3Sopenharmony_ci#include "nfc_impl.h" 17094332d3Sopenharmony_ci#include <hdf_base.h> 18094332d3Sopenharmony_ci#include <hdf_log.h> 19094332d3Sopenharmony_ci#include <iproxy_broker.h> 20094332d3Sopenharmony_ci#include <vector> 21094332d3Sopenharmony_ci#include "nfc_vendor_adaptions.h" 22094332d3Sopenharmony_ci 23094332d3Sopenharmony_ci#define HDF_LOG_TAG hdf_nfc_dal 24094332d3Sopenharmony_ci 25094332d3Sopenharmony_ci#ifdef LOG_DOMAIN 26094332d3Sopenharmony_ci#undef LOG_DOMAIN 27094332d3Sopenharmony_ci#endif 28094332d3Sopenharmony_ci 29094332d3Sopenharmony_ci#define LOG_DOMAIN 0xD000306 30094332d3Sopenharmony_ci 31094332d3Sopenharmony_cinamespace OHOS { 32094332d3Sopenharmony_cinamespace HDI { 33094332d3Sopenharmony_cinamespace Nfc { 34094332d3Sopenharmony_cinamespace V1_1 { 35094332d3Sopenharmony_cistatic sptr<INfcCallback> g_callbackV1_1 = nullptr; 36094332d3Sopenharmony_ci 37094332d3Sopenharmony_cistatic void EventCallback(unsigned char event, unsigned char status) 38094332d3Sopenharmony_ci{ 39094332d3Sopenharmony_ci if (g_callbackV1_1 != nullptr) { 40094332d3Sopenharmony_ci g_callbackV1_1->OnEvent((NfcEvent)event, (NfcStatus)status); 41094332d3Sopenharmony_ci } 42094332d3Sopenharmony_ci} 43094332d3Sopenharmony_ci 44094332d3Sopenharmony_cistatic void DataCallback(uint16_t len, uint8_t *data) 45094332d3Sopenharmony_ci{ 46094332d3Sopenharmony_ci if (g_callbackV1_1 != nullptr) { 47094332d3Sopenharmony_ci std::vector<uint8_t> vec(data, data + len / sizeof(uint8_t)); 48094332d3Sopenharmony_ci g_callbackV1_1->OnData(vec); 49094332d3Sopenharmony_ci } 50094332d3Sopenharmony_ci} 51094332d3Sopenharmony_ci 52094332d3Sopenharmony_ciextern "C" INfcInterface *NfcInterfaceImplGetInstance(void) 53094332d3Sopenharmony_ci{ 54094332d3Sopenharmony_ci using OHOS::HDI::Nfc::V1_1::NfcImpl; 55094332d3Sopenharmony_ci NfcImpl *service = new (std::nothrow) NfcImpl(); 56094332d3Sopenharmony_ci if (service == nullptr) { 57094332d3Sopenharmony_ci return nullptr; 58094332d3Sopenharmony_ci } 59094332d3Sopenharmony_ci return service; 60094332d3Sopenharmony_ci} 61094332d3Sopenharmony_ci 62094332d3Sopenharmony_ciNfcImpl::NfcImpl() 63094332d3Sopenharmony_ci{ 64094332d3Sopenharmony_ci remoteDeathRecipient_ = 65094332d3Sopenharmony_ci new RemoteDeathRecipient(std::bind(&NfcImpl::OnRemoteDied, this, std::placeholders::_1)); 66094332d3Sopenharmony_ci} 67094332d3Sopenharmony_ci 68094332d3Sopenharmony_ciNfcImpl::~NfcImpl() 69094332d3Sopenharmony_ci{ 70094332d3Sopenharmony_ci HDF_LOGI("~NfcImpl"); 71094332d3Sopenharmony_ci std::lock_guard<std::mutex> guard(callbacksMutex_); 72094332d3Sopenharmony_ci if (callbacks_ != nullptr) { 73094332d3Sopenharmony_ci RemoveNfcDeathRecipient(callbacks_); 74094332d3Sopenharmony_ci callbacks_ = nullptr; 75094332d3Sopenharmony_ci } 76094332d3Sopenharmony_ci} 77094332d3Sopenharmony_ci 78094332d3Sopenharmony_ciint32_t NfcImpl::Open(const sptr<INfcCallback> &callbackObj, NfcStatus &status) 79094332d3Sopenharmony_ci{ 80094332d3Sopenharmony_ci HDF_LOGI("NfcImpl::Open"); 81094332d3Sopenharmony_ci std::lock_guard<std::mutex> guard(callbacksMutex_); 82094332d3Sopenharmony_ci if (callbackObj == nullptr) { 83094332d3Sopenharmony_ci HDF_LOGE("Open, callback is nullptr!"); 84094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 85094332d3Sopenharmony_ci } 86094332d3Sopenharmony_ci g_callbackV1_1 = callbackObj; 87094332d3Sopenharmony_ci 88094332d3Sopenharmony_ci int ret = adaptor_.VendorOpen(EventCallback, DataCallback); 89094332d3Sopenharmony_ci if (ret == 0) { 90094332d3Sopenharmony_ci callbacks_ = callbackObj; 91094332d3Sopenharmony_ci AddNfcDeathRecipient(callbacks_); 92094332d3Sopenharmony_ci status = NfcStatus::OK; 93094332d3Sopenharmony_ci return HDF_SUCCESS; 94094332d3Sopenharmony_ci } 95094332d3Sopenharmony_ci status = NfcStatus::FAILED; 96094332d3Sopenharmony_ci return HDF_FAILURE; 97094332d3Sopenharmony_ci} 98094332d3Sopenharmony_ci 99094332d3Sopenharmony_ciint32_t NfcImpl::CoreInitialized(const std::vector<uint8_t> &data, NfcStatus &status) 100094332d3Sopenharmony_ci{ 101094332d3Sopenharmony_ci if (data.empty()) { 102094332d3Sopenharmony_ci HDF_LOGE("CoreInitialized, data is nullptr!"); 103094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 104094332d3Sopenharmony_ci } 105094332d3Sopenharmony_ci int ret = adaptor_.VendorCoreInitialized(data.size(), (uint8_t *)&data[0]); 106094332d3Sopenharmony_ci if (ret == 0) { 107094332d3Sopenharmony_ci status = NfcStatus::OK; 108094332d3Sopenharmony_ci return HDF_SUCCESS; 109094332d3Sopenharmony_ci } 110094332d3Sopenharmony_ci status = NfcStatus::FAILED; 111094332d3Sopenharmony_ci return HDF_FAILURE; 112094332d3Sopenharmony_ci} 113094332d3Sopenharmony_ci 114094332d3Sopenharmony_ciint32_t NfcImpl::Prediscover(NfcStatus &status) 115094332d3Sopenharmony_ci{ 116094332d3Sopenharmony_ci int ret = adaptor_.VendorPrediscover(); 117094332d3Sopenharmony_ci if (ret == 0) { 118094332d3Sopenharmony_ci status = NfcStatus::OK; 119094332d3Sopenharmony_ci return HDF_SUCCESS; 120094332d3Sopenharmony_ci } 121094332d3Sopenharmony_ci status = NfcStatus::FAILED; 122094332d3Sopenharmony_ci return HDF_FAILURE; 123094332d3Sopenharmony_ci} 124094332d3Sopenharmony_ci 125094332d3Sopenharmony_ciint32_t NfcImpl::Write(const std::vector<uint8_t> &data, NfcStatus &status) 126094332d3Sopenharmony_ci{ 127094332d3Sopenharmony_ci if (data.empty()) { 128094332d3Sopenharmony_ci HDF_LOGE("Write, data is nullptr!"); 129094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 130094332d3Sopenharmony_ci } 131094332d3Sopenharmony_ci int ret = adaptor_.VendorWrite(data.size(), (uint8_t *)&data[0]); 132094332d3Sopenharmony_ci if (ret == 0) { 133094332d3Sopenharmony_ci status = NfcStatus::OK; 134094332d3Sopenharmony_ci return HDF_SUCCESS; 135094332d3Sopenharmony_ci } 136094332d3Sopenharmony_ci status = NfcStatus::FAILED; 137094332d3Sopenharmony_ci return HDF_FAILURE; 138094332d3Sopenharmony_ci} 139094332d3Sopenharmony_ci 140094332d3Sopenharmony_ciint32_t NfcImpl::ControlGranted(NfcStatus &status) 141094332d3Sopenharmony_ci{ 142094332d3Sopenharmony_ci int ret = adaptor_.VendorControlGranted(); 143094332d3Sopenharmony_ci if (ret == 0) { 144094332d3Sopenharmony_ci status = NfcStatus::OK; 145094332d3Sopenharmony_ci return HDF_SUCCESS; 146094332d3Sopenharmony_ci } 147094332d3Sopenharmony_ci status = NfcStatus::FAILED; 148094332d3Sopenharmony_ci return HDF_FAILURE; 149094332d3Sopenharmony_ci} 150094332d3Sopenharmony_ci 151094332d3Sopenharmony_ciint32_t NfcImpl::PowerCycle(NfcStatus &status) 152094332d3Sopenharmony_ci{ 153094332d3Sopenharmony_ci int ret = adaptor_.VendorPowerCycle(); 154094332d3Sopenharmony_ci if (ret == 0) { 155094332d3Sopenharmony_ci status = NfcStatus::OK; 156094332d3Sopenharmony_ci return HDF_SUCCESS; 157094332d3Sopenharmony_ci } 158094332d3Sopenharmony_ci status = NfcStatus::FAILED; 159094332d3Sopenharmony_ci return HDF_FAILURE; 160094332d3Sopenharmony_ci} 161094332d3Sopenharmony_ci 162094332d3Sopenharmony_ciint32_t NfcImpl::Close(NfcStatus &status) 163094332d3Sopenharmony_ci{ 164094332d3Sopenharmony_ci HDF_LOGI("NfcImpl::Close"); 165094332d3Sopenharmony_ci std::lock_guard<std::mutex> guard(callbacksMutex_); 166094332d3Sopenharmony_ci int ret = adaptor_.VendorClose(false); 167094332d3Sopenharmony_ci g_callbackV1_1 = nullptr; 168094332d3Sopenharmony_ci if (callbacks_ != nullptr) { 169094332d3Sopenharmony_ci RemoveNfcDeathRecipient(callbacks_); 170094332d3Sopenharmony_ci callbacks_ = nullptr; 171094332d3Sopenharmony_ci } 172094332d3Sopenharmony_ci if (ret == 0) { 173094332d3Sopenharmony_ci status = NfcStatus::OK; 174094332d3Sopenharmony_ci return HDF_SUCCESS; 175094332d3Sopenharmony_ci } 176094332d3Sopenharmony_ci status = NfcStatus::FAILED; 177094332d3Sopenharmony_ci return HDF_FAILURE; 178094332d3Sopenharmony_ci} 179094332d3Sopenharmony_ci 180094332d3Sopenharmony_ciint32_t NfcImpl::Ioctl(NfcCommand cmd, const std::vector<uint8_t> &data, NfcStatus &status) 181094332d3Sopenharmony_ci{ 182094332d3Sopenharmony_ci if (data.empty()) { 183094332d3Sopenharmony_ci HDF_LOGE("Ioctl, data is nullptr!"); 184094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 185094332d3Sopenharmony_ci } 186094332d3Sopenharmony_ci int ret = adaptor_.VendorIoctl(data.size(), (uint8_t *)&data[0]); 187094332d3Sopenharmony_ci if (ret == 0) { 188094332d3Sopenharmony_ci status = NfcStatus::OK; 189094332d3Sopenharmony_ci return HDF_SUCCESS; 190094332d3Sopenharmony_ci } 191094332d3Sopenharmony_ci status = NfcStatus::FAILED; 192094332d3Sopenharmony_ci return HDF_FAILURE; 193094332d3Sopenharmony_ci} 194094332d3Sopenharmony_ci 195094332d3Sopenharmony_ciint32_t NfcImpl::IoctlWithResponse(NfcCommand cmd, const std::vector<uint8_t> &data, 196094332d3Sopenharmony_ci std::vector<uint8_t> &response, NfcStatus &status) 197094332d3Sopenharmony_ci{ 198094332d3Sopenharmony_ci if (data.empty()) { 199094332d3Sopenharmony_ci HDF_LOGE("NfcImpl::IoctlWithResponse, data is nullptr!"); 200094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 201094332d3Sopenharmony_ci } 202094332d3Sopenharmony_ci int ret = adaptor_.VendorIoctlWithResponse(cmd, (void*)&data[0], data.size(), response); 203094332d3Sopenharmony_ci if (ret == 0) { 204094332d3Sopenharmony_ci status = NfcStatus::OK; 205094332d3Sopenharmony_ci return HDF_SUCCESS; 206094332d3Sopenharmony_ci } 207094332d3Sopenharmony_ci status = NfcStatus::FAILED; 208094332d3Sopenharmony_ci return HDF_FAILURE; 209094332d3Sopenharmony_ci} 210094332d3Sopenharmony_ci 211094332d3Sopenharmony_ciint32_t NfcImpl::GetVendorConfig(NfcVendorConfig &config, NfcStatus &status) 212094332d3Sopenharmony_ci{ 213094332d3Sopenharmony_ci if (adaptor_.VendorGetConfig(config) != HDF_SUCCESS) { 214094332d3Sopenharmony_ci HDF_LOGE("GetConfig, fail to get vendor config!"); 215094332d3Sopenharmony_ci status = NfcStatus::FAILED; 216094332d3Sopenharmony_ci return HDF_FAILURE; 217094332d3Sopenharmony_ci } 218094332d3Sopenharmony_ci status = NfcStatus::OK; 219094332d3Sopenharmony_ci return HDF_SUCCESS; 220094332d3Sopenharmony_ci} 221094332d3Sopenharmony_ci 222094332d3Sopenharmony_ciint32_t NfcImpl::DoFactoryReset(NfcStatus &status) 223094332d3Sopenharmony_ci{ 224094332d3Sopenharmony_ci int ret = adaptor_.VendorFactoryReset(); 225094332d3Sopenharmony_ci if (ret == 0) { 226094332d3Sopenharmony_ci status = NfcStatus::OK; 227094332d3Sopenharmony_ci return HDF_SUCCESS; 228094332d3Sopenharmony_ci } 229094332d3Sopenharmony_ci status = NfcStatus::FAILED; 230094332d3Sopenharmony_ci return HDF_FAILURE; 231094332d3Sopenharmony_ci} 232094332d3Sopenharmony_ci 233094332d3Sopenharmony_ciint32_t NfcImpl::Shutdown(NfcStatus &status) 234094332d3Sopenharmony_ci{ 235094332d3Sopenharmony_ci int ret = adaptor_.VendorShutdownCase(); 236094332d3Sopenharmony_ci if (ret == 0) { 237094332d3Sopenharmony_ci status = NfcStatus::OK; 238094332d3Sopenharmony_ci return HDF_SUCCESS; 239094332d3Sopenharmony_ci } 240094332d3Sopenharmony_ci status = NfcStatus::FAILED; 241094332d3Sopenharmony_ci return HDF_FAILURE; 242094332d3Sopenharmony_ci} 243094332d3Sopenharmony_ci 244094332d3Sopenharmony_civoid NfcImpl::OnRemoteDied(const wptr<IRemoteObject> &object) 245094332d3Sopenharmony_ci{ 246094332d3Sopenharmony_ci HDF_LOGW("NfcImpl::OnRemoteDied"); 247094332d3Sopenharmony_ci { 248094332d3Sopenharmony_ci std::lock_guard<std::mutex> guard(callbacksMutex_); 249094332d3Sopenharmony_ci callbacks_ = nullptr; 250094332d3Sopenharmony_ci } 251094332d3Sopenharmony_ci NfcStatus status = NfcStatus::FAILED; 252094332d3Sopenharmony_ci int32_t ret = Close(status); 253094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 254094332d3Sopenharmony_ci HDF_LOGE("OnRemoteDied, Close failed, status(%{public}d)!", status); 255094332d3Sopenharmony_ci } 256094332d3Sopenharmony_ci} 257094332d3Sopenharmony_ci 258094332d3Sopenharmony_ciint32_t NfcImpl::AddNfcDeathRecipient(const sptr<INfcCallback> &callbackObj) 259094332d3Sopenharmony_ci{ 260094332d3Sopenharmony_ci if (callbackObj == nullptr) { 261094332d3Sopenharmony_ci HDF_LOGE("AddNfcDeathRecipient callbackobj nullptr"); 262094332d3Sopenharmony_ci return HDF_FAILURE; 263094332d3Sopenharmony_ci } 264094332d3Sopenharmony_ci const sptr<IRemoteObject> &remote = OHOS::HDI::hdi_objcast<INfcCallback>(callbackObj); 265094332d3Sopenharmony_ci if (remote == nullptr) { 266094332d3Sopenharmony_ci HDF_LOGE("AddNfcDeathRecipient remote nullptr"); 267094332d3Sopenharmony_ci return HDF_FAILURE; 268094332d3Sopenharmony_ci } 269094332d3Sopenharmony_ci bool result = remote->AddDeathRecipient(remoteDeathRecipient_); 270094332d3Sopenharmony_ci if (!result) { 271094332d3Sopenharmony_ci HDF_LOGE("NfcImpl AddDeathRecipient failed!"); 272094332d3Sopenharmony_ci return HDF_FAILURE; 273094332d3Sopenharmony_ci } 274094332d3Sopenharmony_ci return HDF_SUCCESS; 275094332d3Sopenharmony_ci} 276094332d3Sopenharmony_ci 277094332d3Sopenharmony_ciint32_t NfcImpl::RemoveNfcDeathRecipient(const sptr<INfcCallback> &callbackObj) 278094332d3Sopenharmony_ci{ 279094332d3Sopenharmony_ci if (callbackObj == nullptr) { 280094332d3Sopenharmony_ci HDF_LOGE("RemoveNfcDeathRecipient callbackobj nullptr"); 281094332d3Sopenharmony_ci return HDF_FAILURE; 282094332d3Sopenharmony_ci } 283094332d3Sopenharmony_ci const sptr<IRemoteObject> &remote = OHOS::HDI::hdi_objcast<INfcCallback>(callbackObj); 284094332d3Sopenharmony_ci if (remote == nullptr) { 285094332d3Sopenharmony_ci HDF_LOGE("RemoveNfcDeathRecipient remote nullptr"); 286094332d3Sopenharmony_ci return HDF_FAILURE; 287094332d3Sopenharmony_ci } 288094332d3Sopenharmony_ci bool result = remote->RemoveDeathRecipient(remoteDeathRecipient_); 289094332d3Sopenharmony_ci if (!result) { 290094332d3Sopenharmony_ci HDF_LOGE("NfcImpl RemoveDeathRecipient failed!"); 291094332d3Sopenharmony_ci return HDF_FAILURE; 292094332d3Sopenharmony_ci } 293094332d3Sopenharmony_ci return HDF_SUCCESS; 294094332d3Sopenharmony_ci} 295094332d3Sopenharmony_ci} // V1_1 296094332d3Sopenharmony_ci} // Nfc 297094332d3Sopenharmony_ci} // HDI 298094332d3Sopenharmony_ci} // OHOS 299