1/* 2 * Copyright (c) 2022-2023 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 <hdf_base.h> 17#include <hdf_device_desc.h> 18#include <hdf_log.h> 19#include <hdf_sbuf_ipc.h> 20#include "v1_1/nfc_interface_stub.h" 21 22#define HDF_LOG_TAG hdf_nfc_dal 23 24#ifdef LOG_DOMAIN 25#undef LOG_DOMAIN 26#endif 27 28#define LOG_DOMAIN 0xD000306 29 30using namespace OHOS::HDI::Nfc::V1_1; 31using namespace OHOS::HDI::Nfc; 32 33struct HdfNfcInterfaceHost { 34 struct IDeviceIoService ioservice; 35 OHOS::sptr<OHOS::IRemoteObject> stub; 36}; 37 38static int32_t NfcInterfaceDriverDispatch(struct HdfDeviceIoClient *client, int cmdId, struct HdfSBuf *data, 39 struct HdfSBuf *reply) 40{ 41 auto *hdfNfcInterfaceHost = 42 CONTAINER_OF(client->device->service, struct HdfNfcInterfaceHost, ioservice); 43 44 OHOS::MessageParcel *dataParcel = nullptr; 45 OHOS::MessageParcel *replyParcel = nullptr; 46 OHOS::MessageOption option; 47 48 if (SbufToParcel(data, &dataParcel) != HDF_SUCCESS) { 49 HDF_LOGE("NfcInterfaceDriverDispatc, invalid data sbuf object to dispatch"); 50 return HDF_ERR_INVALID_PARAM; 51 } 52 if (SbufToParcel(reply, &replyParcel) != HDF_SUCCESS) { 53 HDF_LOGE("NfcInterfaceDriverDispatch, invalid reply sbuf object to dispatch"); 54 return HDF_ERR_INVALID_PARAM; 55 } 56 57 return hdfNfcInterfaceHost->stub->SendRequest(cmdId, *dataParcel, *replyParcel, option); 58} 59 60static int HdfNfcInterfaceDriverInit(struct HdfDeviceObject *deviceObject) 61{ 62 HDF_LOGI("HdfNfcInterfaceDriverInit enter"); 63 return HDF_SUCCESS; 64} 65 66static int HdfNfcInterfaceDriverBind(struct HdfDeviceObject *deviceObject) 67{ 68 HDF_LOGI("HdfNfcInterfaceDriverBind enter"); 69 70 auto *hdfNfcInterfaceHost = new (std::nothrow) HdfNfcInterfaceHost; 71 if (hdfNfcInterfaceHost == nullptr) { 72 HDF_LOGE("HdfNfcInterfaceDriverBind, failed to create HdfNfcInterfaceDriverBind Object!"); 73 return HDF_FAILURE; 74 } 75 76 hdfNfcInterfaceHost->ioservice.Dispatch = NfcInterfaceDriverDispatch; 77 hdfNfcInterfaceHost->ioservice.Open = nullptr; 78 hdfNfcInterfaceHost->ioservice.Release = nullptr; 79 80 auto serviceImpl = OHOS::HDI::Nfc::V1_1::INfcInterface::Get(true); 81 if (serviceImpl == nullptr) { 82 HDF_LOGE("HdfNfcInterfaceDriverBind, failed to get of implement service"); 83 delete hdfNfcInterfaceHost; 84 return HDF_FAILURE; 85 } 86 87 hdfNfcInterfaceHost->stub = OHOS::HDI::ObjectCollector::GetInstance().GetOrNewObject(serviceImpl, 88 OHOS::HDI::Nfc::V1_1::INfcInterface::GetDescriptor()); 89 if (hdfNfcInterfaceHost->stub == nullptr) { 90 HDF_LOGE("HdfNfcInterfaceDriverBind, failed to get stub object"); 91 delete hdfNfcInterfaceHost; 92 return HDF_FAILURE; 93 } 94 95 deviceObject->service = &hdfNfcInterfaceHost->ioservice; 96 HDF_LOGI("HdfNfcInterfaceDriverBind Success"); 97 return HDF_SUCCESS; 98} 99 100static void HdfNfcInterfaceDriverRelease(struct HdfDeviceObject *deviceObject) 101{ 102 HDF_LOGI("HdfNfcInterfaceDriverRelease enter"); 103 if (deviceObject->service == nullptr) { 104 HDF_LOGE("HdfNfcInterfaceDriverRelease not initted"); 105 return; 106 } 107 108 auto *hdfNfcInterfaceHost = 109 CONTAINER_OF(deviceObject->service, struct HdfNfcInterfaceHost, ioservice); 110 delete hdfNfcInterfaceHost; 111 HDF_LOGI("HdfNfcInterfaceDriverRelease Success"); 112} 113 114static struct HdfDriverEntry g_nfcinterfaceDriverEntry = { 115 .moduleVersion = 1, 116 .moduleName = "nfc_service", 117 .Bind = HdfNfcInterfaceDriverBind, 118 .Init = HdfNfcInterfaceDriverInit, 119 .Release = HdfNfcInterfaceDriverRelease, 120}; 121 122#ifdef __cplusplus 123extern "C" { 124#endif /* __cplusplus */ 125HDF_INIT(g_nfcinterfaceDriverEntry); 126#ifdef __cplusplus 127} 128#endif /* __cplusplus */ 129