1f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly/* 2f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * Copyright (C) 2010 The Android Open Source Project 3f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * 4f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * Licensed under the Apache License, Version 2.0 (the "License"); 5f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * you may not use this file except in compliance with the License. 6f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * You may obtain a copy of the License at 7f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * 8f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * http://www.apache.org/licenses/LICENSE-2.0 9f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * 10f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * Unless required by applicable law or agreed to in writing, software 11f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * distributed under the License is distributed on an "AS IS" BASIS, 12f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * See the License for the specific language governing permissions and 14f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * limitations under the License. 15f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly */ 16f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 17b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau#include <errno.h> 18983b839bc07f834b007a57d134352d477b1aa9a7Elliott Hughes#include <malloc.h> 19983b839bc07f834b007a57d134352d477b1aa9a7Elliott Hughes#include <semaphore.h> 20f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 21c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pelly#include "com_android_nfc.h" 22f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 23f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pellynamespace android { 24f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 25f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly/* 26f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * Callbacks 27f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly */ 28f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 29c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pellystatic void nfc_jni_receive_callback(void* pContext, uint8_t ssap, NFCSTATUS status) 30b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau{ 31b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau struct nfc_jni_callback_data * pCallbackData = (struct nfc_jni_callback_data *) pContext; 32c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pelly LOG_CALLBACK("nfc_jni_receiveFrom_callback", status); 33f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 34f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly if(status == NFCSTATUS_SUCCESS) 35f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly { 36644be37973031c80c64ba09ec1b691b5d032ed37Colin Cross pCallbackData->pContext = (void*)(uintptr_t)ssap; 37b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau TRACE("RECEIVE UI_FRAME FROM SAP %d OK \n", ssap); 38f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly } 39b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 40b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau /* Report the callback status and wake up the caller */ 41b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau pCallbackData->status = status; 42b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau sem_post(&pCallbackData->sem); 43f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly} 44f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 45c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pellystatic void nfc_jni_send_callback(void *pContext, NFCSTATUS status) 46b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau{ 47b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau struct nfc_jni_callback_data * pCallbackData = (struct nfc_jni_callback_data *) pContext; 48c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pelly LOG_CALLBACK("nfc_jni_sendTo_callback", status); 49f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 50b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau /* Report the callback status and wake up the caller */ 51b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau pCallbackData->status = status; 52b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau sem_post(&pCallbackData->sem); 53f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly} 54f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 55f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly/* 56f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly* Methods 57f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly*/ 5813d8819d9d716c8f0ba03288d058f0bd462d70a7Nick Pellystatic jboolean com_android_nfc_NativeLlcpConnectionlessSocket_doSendTo(JNIEnv *e, jobject o, jint nsap, jbyteArray data) 59f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly{ 60f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly NFCSTATUS ret; 61b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau struct timespec ts; 621878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau phLibNfc_Handle hRemoteDevice; 63f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly phLibNfc_Handle hLlcpSocket; 648ddea174e7436fd35d8440c3e6876ee095af2636Sylvain Fonteneau phNfc_sData_t sSendBuffer = {NULL, 0}; 65b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau struct nfc_jni_callback_data cb_data; 66b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau jboolean result = JNI_FALSE; 67f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 681878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau /* Retrieve handles */ 691878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau hRemoteDevice = nfc_jni_get_p2p_device_handle(e,o); 70c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pelly hLlcpSocket = nfc_jni_get_nfc_socket_handle(e,o); 71b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 72b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau /* Create the local semaphore */ 73b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau if (!nfc_cb_data_init(&cb_data, NULL)) 74b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau { 75b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau goto clean_and_return; 76b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau } 77b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 78f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly sSendBuffer.buffer = (uint8_t*)e->GetByteArrayElements(data, NULL); 79f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly sSendBuffer.length = (uint32_t)e->GetArrayLength(data); 80f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 81ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton TRACE("phLibNfc_Llcp_SendTo()"); 82f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly REENTRANCE_LOCK(); 831878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau ret = phLibNfc_Llcp_SendTo(hRemoteDevice, 841878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau hLlcpSocket, 85f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly nsap, 86f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly &sSendBuffer, 87c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pelly nfc_jni_send_callback, 88b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau (void*)&cb_data); 89f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly REENTRANCE_UNLOCK(); 90f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly if(ret != NFCSTATUS_PENDING) 91f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly { 92afc8705e932af9a3a27239b0ca6fdb2026f15dfcSteve Block ALOGE("phLibNfc_Llcp_SendTo() returned 0x%04x[%s]", ret, nfc_jni_get_status_name(ret)); 93b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau goto clean_and_return; 94f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly } 95ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton TRACE("phLibNfc_Llcp_SendTo() returned 0x%04x[%s]", ret, nfc_jni_get_status_name(ret)); 96f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 97f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly /* Wait for callback response */ 98b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau if(sem_wait(&cb_data.sem)) 99f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly { 100afc8705e932af9a3a27239b0ca6fdb2026f15dfcSteve Block ALOGE("Failed to wait for semaphore (errno=0x%08x)", errno); 101b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau goto clean_and_return; 102f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly } 103b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 104b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau if(cb_data.status != NFCSTATUS_SUCCESS) 105f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly { 106b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau goto clean_and_return; 107b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau } 108b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 109b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau result = JNI_TRUE; 110b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 111b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneauclean_and_return: 1128ddea174e7436fd35d8440c3e6876ee095af2636Sylvain Fonteneau if (sSendBuffer.buffer != NULL) 1138ddea174e7436fd35d8440c3e6876ee095af2636Sylvain Fonteneau { 1148ddea174e7436fd35d8440c3e6876ee095af2636Sylvain Fonteneau e->ReleaseByteArrayElements(data, (jbyte*)sSendBuffer.buffer, JNI_ABORT); 1158ddea174e7436fd35d8440c3e6876ee095af2636Sylvain Fonteneau } 116b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau nfc_cb_data_deinit(&cb_data); 117b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau return result; 118f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly} 119f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 12013d8819d9d716c8f0ba03288d058f0bd462d70a7Nick Pellystatic jobject com_android_nfc_NativeLlcpConnectionlessSocket_doReceiveFrom(JNIEnv *e, jobject o, jint linkMiu) 121f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly{ 122f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly NFCSTATUS ret; 123f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly struct timespec ts; 124f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly uint8_t ssap; 125f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly jobject llcpPacket = NULL; 1261878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau phLibNfc_Handle hRemoteDevice; 127f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly phLibNfc_Handle hLlcpSocket; 128f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly phNfc_sData_t sReceiveBuffer; 129f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly jclass clsLlcpPacket; 130f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly jfieldID f; 1318ddea174e7436fd35d8440c3e6876ee095af2636Sylvain Fonteneau jbyteArray receivedData = NULL; 132b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau struct nfc_jni_callback_data cb_data; 133b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 134b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau /* Create the local semaphore */ 135b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau if (!nfc_cb_data_init(&cb_data, NULL)) 136b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau { 137b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau goto clean_and_return; 138b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau } 139b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 140f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly /* Create new LlcpPacket object */ 141e008eba3b51c5303d52bf3e9e989dfd03b18435aMartijn Coenen if(nfc_jni_cache_object(e,"com/android/nfc/LlcpPacket",&(llcpPacket)) == -1) 142f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly { 143afc8705e932af9a3a27239b0ca6fdb2026f15dfcSteve Block ALOGE("Find LlcpPacket class error"); 144b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau goto clean_and_return; 145f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly } 146b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 147f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly /* Get NativeConnectionless class object */ 148f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly clsLlcpPacket = e->GetObjectClass(llcpPacket); 149f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly if(e->ExceptionCheck()) 150f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly { 151afc8705e932af9a3a27239b0ca6fdb2026f15dfcSteve Block ALOGE("Get Object class error"); 152b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau goto clean_and_return; 153f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly } 154b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 1551878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau /* Retrieve handles */ 1561878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau hRemoteDevice = nfc_jni_get_p2p_device_handle(e,o); 157c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pelly hLlcpSocket = nfc_jni_get_nfc_socket_handle(e,o); 158ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton TRACE("phLibNfc_Llcp_RecvFrom(), Socket Handle = 0x%02x, Link LIU = %d", hLlcpSocket, linkMiu); 159b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 160f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly sReceiveBuffer.buffer = (uint8_t*)malloc(linkMiu); 161f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly sReceiveBuffer.length = linkMiu; 162b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 163f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly REENTRANCE_LOCK(); 1641878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau ret = phLibNfc_Llcp_RecvFrom(hRemoteDevice, 1651878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau hLlcpSocket, 166f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly &sReceiveBuffer, 167c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pelly nfc_jni_receive_callback, 168b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau &cb_data); 169f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly REENTRANCE_UNLOCK(); 17042c765d72fa4e5a3fe2bcf0cfc10b45471d0e386Martijn Coenen if(ret != NFCSTATUS_PENDING && ret != NFCSTATUS_SUCCESS) 171f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly { 172afc8705e932af9a3a27239b0ca6fdb2026f15dfcSteve Block ALOGE("phLibNfc_Llcp_RecvFrom() returned 0x%04x[%s]", ret, nfc_jni_get_status_name(ret)); 173b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau goto clean_and_return; 174f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly } 175ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton TRACE("phLibNfc_Llcp_RecvFrom() returned 0x%04x[%s]", ret, nfc_jni_get_status_name(ret)); 176f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 177b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau /* Wait for callback response */ 178b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau if(sem_wait(&cb_data.sem)) 179f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly { 180afc8705e932af9a3a27239b0ca6fdb2026f15dfcSteve Block ALOGE("Failed to wait for semaphore (errno=0x%08x)", errno); 181b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau goto clean_and_return; 182f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly } 183b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 184b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau if(cb_data.status != NFCSTATUS_SUCCESS) 185f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly { 186b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau goto clean_and_return; 187b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau } 188b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 189644be37973031c80c64ba09ec1b691b5d032ed37Colin Cross ssap = (uintptr_t)cb_data.pContext; 190b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau TRACE("Data Received From SSAP = %d\n, length = %d", ssap, sReceiveBuffer.length); 191b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 192b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau /* Set Llcp Packet remote SAP */ 193b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau f = e->GetFieldID(clsLlcpPacket, "mRemoteSap", "I"); 194b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau e->SetIntField(llcpPacket, f,(jbyte)ssap); 195b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 196b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau /* Set Llcp Packet Buffer */ 1977d4e962f71c5db6d71aca046bd1416f53a10653bSteve Block ALOGD("Set LlcpPacket Data Buffer\n"); 198b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau f = e->GetFieldID(clsLlcpPacket, "mDataBuffer", "[B"); 199b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau receivedData = e->NewByteArray(sReceiveBuffer.length); 200b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau e->SetByteArrayRegion(receivedData, 0, sReceiveBuffer.length,(jbyte *)sReceiveBuffer.buffer); 201b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau e->SetObjectField(llcpPacket, f, receivedData); 202b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 203b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneauclean_and_return: 204b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau nfc_cb_data_deinit(&cb_data); 205b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau return llcpPacket; 206f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly} 207f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 20813d8819d9d716c8f0ba03288d058f0bd462d70a7Nick Pellystatic jboolean com_android_nfc_NativeLlcpConnectionlessSocket_doClose(JNIEnv *e, jobject o) 209f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly{ 210f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly NFCSTATUS ret; 211f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly phLibNfc_Handle hLlcpSocket; 212ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton TRACE("Close Connectionless socket"); 213f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 214f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly /* Retrieve socket handle */ 215c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pelly hLlcpSocket = nfc_jni_get_nfc_socket_handle(e,o); 216f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 217ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton TRACE("phLibNfc_Llcp_Close()"); 218f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly REENTRANCE_LOCK(); 219f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly ret = phLibNfc_Llcp_Close(hLlcpSocket); 220f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly REENTRANCE_UNLOCK(); 221f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly if(ret == NFCSTATUS_SUCCESS) 222f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly { 223ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton TRACE("phLibNfc_Llcp_Close() returned 0x%04x[%s]", ret, nfc_jni_get_status_name(ret)); 224f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly return TRUE; 225f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly } 226f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly else 227f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly { 228afc8705e932af9a3a27239b0ca6fdb2026f15dfcSteve Block ALOGE("phLibNfc_Llcp_Close() returned 0x%04x[%s]", ret, nfc_jni_get_status_name(ret)); 229f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly return FALSE; 230f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly } 231f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly} 232f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 233f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 234f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly/* 235f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * JNI registration. 236f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly */ 237f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pellystatic JNINativeMethod gMethods[] = 238f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly{ 23913d8819d9d716c8f0ba03288d058f0bd462d70a7Nick Pelly {"doSendTo", "(I[B)Z", (void *)com_android_nfc_NativeLlcpConnectionlessSocket_doSendTo}, 240f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 241e008eba3b51c5303d52bf3e9e989dfd03b18435aMartijn Coenen {"doReceiveFrom", "(I)Lcom/android/nfc/LlcpPacket;", (void *)com_android_nfc_NativeLlcpConnectionlessSocket_doReceiveFrom}, 242f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 24313d8819d9d716c8f0ba03288d058f0bd462d70a7Nick Pelly {"doClose", "()Z", (void *)com_android_nfc_NativeLlcpConnectionlessSocket_doClose}, 244f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly}; 245f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 246f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 24713d8819d9d716c8f0ba03288d058f0bd462d70a7Nick Pellyint register_com_android_nfc_NativeLlcpConnectionlessSocket(JNIEnv *e) 248f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly{ 249f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly return jniRegisterNativeMethods(e, 250642ab20c81425ba93e206d2a30602cd67ae8bd38Martijn Coenen "com/android/nfc/dhimpl/NativeLlcpConnectionlessSocket", 251f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly gMethods, NELEM(gMethods)); 252f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly} 253f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 254f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly} // android namespace 255