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 17f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly#include <semaphore.h> 18b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau#include <errno.h> 19f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 20c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pelly#include "com_android_nfc.h" 21f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 22f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pellynamespace android { 23f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 24f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly/* 25f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * Callbacks 26f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly */ 27f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 28c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pellystatic void nfc_jni_disconnect_callback(void* pContext, 29f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly NFCSTATUS status) 30f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly{ 31b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau struct nfc_jni_callback_data * pCallbackData = (struct nfc_jni_callback_data *) pContext; 32b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau LOG_CALLBACK("nfc_jni_disconnect_callback", status); 33f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 34b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau /* Report the callback status and wake up the caller */ 35b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau pCallbackData->status = status; 36b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau sem_post(&pCallbackData->sem); 37f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly} 38f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 39f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 40c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pellystatic void nfc_jni_connect_callback(void* pContext, uint8_t nErrCode, NFCSTATUS status) 41f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly{ 42b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau struct nfc_jni_callback_data * pCallbackData = (struct nfc_jni_callback_data *) pContext; 43c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pelly LOG_CALLBACK("nfc_jni_llcp_connect_callback", status); 44f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 45f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly if(status == NFCSTATUS_SUCCESS) 46f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly { 47ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton TRACE("Socket connected\n"); 48f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly } 49f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly else 50f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly { 517d4e962f71c5db6d71aca046bd1416f53a10653bSteve Block ALOGD("Socket not connected:"); 52f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly switch(nErrCode) 53f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly { 54f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly case PHFRINFC_LLCP_DM_OPCODE_SAP_NOT_ACTIVE: 55f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly { 567d4e962f71c5db6d71aca046bd1416f53a10653bSteve Block ALOGD("> SAP NOT ACTIVE\n"); 57f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly }break; 58f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 59f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly case PHFRINFC_LLCP_DM_OPCODE_SAP_NOT_FOUND: 60f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly { 617d4e962f71c5db6d71aca046bd1416f53a10653bSteve Block ALOGD("> SAP NOT FOUND\n"); 62f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly }break; 63f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 64f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly case PHFRINFC_LLCP_DM_OPCODE_CONNECT_REJECTED: 65f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly { 667d4e962f71c5db6d71aca046bd1416f53a10653bSteve Block ALOGD("> CONNECT REJECTED\n"); 67f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly }break; 68f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 69f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly case PHFRINFC_LLCP_DM_OPCODE_CONNECT_NOT_ACCEPTED: 70f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly { 717d4e962f71c5db6d71aca046bd1416f53a10653bSteve Block ALOGD("> CONNECT NOT ACCEPTED\n"); 72f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly }break; 73f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 74f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly case PHFRINFC_LLCP_DM_OPCODE_SOCKET_NOT_AVAILABLE: 75f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly { 767d4e962f71c5db6d71aca046bd1416f53a10653bSteve Block ALOGD("> SOCKET NOT AVAILABLE\n"); 77f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly }break; 78f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly } 79f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly } 80f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 81b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau /* Report the callback status and wake up the caller */ 82b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau pCallbackData->status = status; 83b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau sem_post(&pCallbackData->sem); 84f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly} 85f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 86f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 87f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 88f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 89c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pellystatic void nfc_jni_receive_callback(void* pContext, NFCSTATUS status) 90f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly{ 91b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau struct nfc_jni_callback_data * pCallbackData = (struct nfc_jni_callback_data *) pContext; 92c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pelly LOG_CALLBACK("nfc_jni_llcp_receive_callback", status); 93f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 94b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau /* Report the callback status and wake up the caller */ 95b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau pCallbackData->status = status; 96b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau sem_post(&pCallbackData->sem); 97f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly} 98f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 99c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pellystatic void nfc_jni_send_callback(void *pContext, NFCSTATUS status) 100f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly{ 101b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau struct nfc_jni_callback_data * pCallbackData = (struct nfc_jni_callback_data *) pContext; 102c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pelly LOG_CALLBACK("nfc_jni_llcp_send_callback", status); 103f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 104b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau /* Report the callback status and wake up the caller */ 105b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau pCallbackData->status = status; 106b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau sem_post(&pCallbackData->sem); 107f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly} 108f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 109f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly/* 110f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * Methods 111f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly */ 11293915e1c6fe6d5d16fcebeda610782bf5812c9b4Nick Pellystatic jboolean com_android_nfc_NativeLlcpSocket_doConnect(JNIEnv *e, jobject o, jint nSap) 113f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly{ 114f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly NFCSTATUS ret; 115f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly struct timespec ts; 1161878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau phLibNfc_Handle hRemoteDevice; 117f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly phLibNfc_Handle hLlcpSocket; 118b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau struct nfc_jni_callback_data cb_data; 119b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau jboolean result = JNI_FALSE; 120b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 1211878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau /* Retrieve handles */ 1221878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau hRemoteDevice = nfc_jni_get_p2p_device_handle(e,o); 123c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pelly hLlcpSocket = nfc_jni_get_nfc_socket_handle(e,o); 124f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 125b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau /* Create the local semaphore */ 126b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau if (!nfc_cb_data_init(&cb_data, NULL)) 127b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau { 128b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau goto clean_and_return; 129b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau } 130b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 131ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton TRACE("phLibNfc_Llcp_Connect(%d)",nSap); 132f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly REENTRANCE_LOCK(); 1331878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau ret = phLibNfc_Llcp_Connect(hRemoteDevice, 1341878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau hLlcpSocket, 135f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly nSap, 136c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pelly nfc_jni_connect_callback, 137b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau (void*)&cb_data); 138f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly REENTRANCE_UNLOCK(); 139f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly if(ret != NFCSTATUS_PENDING) 140f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly { 141afc8705e932af9a3a27239b0ca6fdb2026f15dfcSteve Block ALOGE("phLibNfc_Llcp_Connect(%d) returned 0x%04x[%s]", nSap, ret, nfc_jni_get_status_name(ret)); 142b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau goto clean_and_return; 143f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly } 144ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton TRACE("phLibNfc_Llcp_Connect(%d) returned 0x%04x[%s]", nSap, ret, nfc_jni_get_status_name(ret)); 145b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 14693915e1c6fe6d5d16fcebeda610782bf5812c9b4Nick Pelly /* Wait for callback response */ 147b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau if(sem_wait(&cb_data.sem)) 148f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly { 149afc8705e932af9a3a27239b0ca6fdb2026f15dfcSteve Block ALOGE("Failed to wait for semaphore (errno=0x%08x)", errno); 150b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau goto clean_and_return; 151f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly } 152b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 153b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau if(cb_data.status != NFCSTATUS_SUCCESS) 154f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly { 15515be799e6a9c6c2c24b2008d2d52944a01a4dc63Steve Block ALOGW("LLCP Connect request failed"); 156b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau goto clean_and_return; 157f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly } 158b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 159b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau result = JNI_TRUE; 160b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 161b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneauclean_and_return: 162b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau nfc_cb_data_deinit(&cb_data); 163b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau return result; 164f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly} 165f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 16693915e1c6fe6d5d16fcebeda610782bf5812c9b4Nick Pellystatic jboolean com_android_nfc_NativeLlcpSocket_doConnectBy(JNIEnv *e, jobject o, jstring sn) 167f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly{ 168f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly NFCSTATUS ret; 169f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly struct timespec ts; 17053ee4de0f77a55b13359a5c44166377a126a2c85Ashok Bhat phNfc_sData_t serviceName = {NULL, 0}; 1711878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau phLibNfc_Handle hRemoteDevice; 172f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly phLibNfc_Handle hLlcpSocket; 173b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau struct nfc_jni_callback_data cb_data; 174b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau jboolean result = JNI_FALSE; 175b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 1761878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau /* Retrieve handles */ 1771878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau hRemoteDevice = nfc_jni_get_p2p_device_handle(e,o); 178c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pelly hLlcpSocket = nfc_jni_get_nfc_socket_handle(e,o); 179b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 180b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau /* Create the local semaphore */ 181b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau if (!nfc_cb_data_init(&cb_data, NULL)) 182b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau { 183b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau goto clean_and_return; 184b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau } 185b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 186f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly /* Service socket */ 187f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly serviceName.buffer = (uint8_t*)e->GetStringUTFChars(sn, NULL); 188f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly serviceName.length = (uint32_t)e->GetStringUTFLength(sn); 189f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 190ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton TRACE("phLibNfc_Llcp_ConnectByUri()"); 191f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly REENTRANCE_LOCK(); 1921878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau ret = phLibNfc_Llcp_ConnectByUri(hRemoteDevice, 1931878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau hLlcpSocket, 194f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly &serviceName, 195c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pelly nfc_jni_connect_callback, 196b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau (void*)&cb_data); 197f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly REENTRANCE_UNLOCK(); 198f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly if(ret != NFCSTATUS_PENDING) 199f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly { 200afc8705e932af9a3a27239b0ca6fdb2026f15dfcSteve Block ALOGE("phLibNfc_Llcp_ConnectByUri() returned 0x%04x[%s]", ret, nfc_jni_get_status_name(ret)); 201b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau goto clean_and_return; 202b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau } 203ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton TRACE("phLibNfc_Llcp_ConnectByUri() returned 0x%04x[%s]", ret, nfc_jni_get_status_name(ret)); 204b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 20593915e1c6fe6d5d16fcebeda610782bf5812c9b4Nick Pelly /* Wait for callback response */ 206b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau if(sem_wait(&cb_data.sem)) 207f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly { 208afc8705e932af9a3a27239b0ca6fdb2026f15dfcSteve Block ALOGE("Failed to wait for semaphore (errno=0x%08x)", errno); 209b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau goto clean_and_return; 210f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly } 211b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 212b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau if(cb_data.status != NFCSTATUS_SUCCESS) 213f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly { 214b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau goto clean_and_return; 215b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau } 216b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 217b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau result = JNI_TRUE; 218b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 219b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneauclean_and_return: 2203b82eef50f734cab061330f55de8b8bf5396f24bMartijn Coenen if (serviceName.buffer != NULL) { 2213b82eef50f734cab061330f55de8b8bf5396f24bMartijn Coenen e->ReleaseStringUTFChars(sn, (const char *)serviceName.buffer); 2223b82eef50f734cab061330f55de8b8bf5396f24bMartijn Coenen } 223b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau nfc_cb_data_deinit(&cb_data); 224b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau return result; 225f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly} 226f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 22713d8819d9d716c8f0ba03288d058f0bd462d70a7Nick Pellystatic jboolean com_android_nfc_NativeLlcpSocket_doClose(JNIEnv *e, jobject o) 228f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly{ 229f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly NFCSTATUS ret; 230f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly phLibNfc_Handle hLlcpSocket; 231b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 232f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly /* Retrieve socket handle */ 233c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pelly hLlcpSocket = nfc_jni_get_nfc_socket_handle(e,o); 234b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 235ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton TRACE("phLibNfc_Llcp_Close()"); 236f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly REENTRANCE_LOCK(); 237f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly ret = phLibNfc_Llcp_Close(hLlcpSocket); 238f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly REENTRANCE_UNLOCK(); 239f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly if(ret != NFCSTATUS_SUCCESS) 240f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly { 241afc8705e932af9a3a27239b0ca6fdb2026f15dfcSteve Block ALOGE("phLibNfc_Llcp_Close() returned 0x%04x[%s]", ret, nfc_jni_get_status_name(ret)); 242f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly return FALSE; 243f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly } 244ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton TRACE("phLibNfc_Llcp_Close() returned 0x%04x[%s]", ret, nfc_jni_get_status_name(ret)); 245f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly return TRUE; 246f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly} 247f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 24813d8819d9d716c8f0ba03288d058f0bd462d70a7Nick Pellystatic jboolean com_android_nfc_NativeLlcpSocket_doSend(JNIEnv *e, jobject o, jbyteArray data) 249f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly{ 250f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly NFCSTATUS ret; 2511878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau struct timespec ts; 2521878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau phLibNfc_Handle hRemoteDevice; 253f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly phLibNfc_Handle hLlcpSocket; 2548ddea174e7436fd35d8440c3e6876ee095af2636Sylvain Fonteneau phNfc_sData_t sSendBuffer = {NULL, 0}; 255b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau struct nfc_jni_callback_data cb_data; 256b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau jboolean result = JNI_FALSE; 257f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 2581878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau /* Retrieve handles */ 2591878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau hRemoteDevice = nfc_jni_get_p2p_device_handle(e,o); 260c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pelly hLlcpSocket = nfc_jni_get_nfc_socket_handle(e,o); 261f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 262b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau /* Create the local semaphore */ 263b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau if (!nfc_cb_data_init(&cb_data, NULL)) 264b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau { 265b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau goto clean_and_return; 266b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau } 267b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 268f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly sSendBuffer.buffer = (uint8_t*)e->GetByteArrayElements(data, NULL); 269f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly sSendBuffer.length = (uint32_t)e->GetArrayLength(data); 270f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 271ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton TRACE("phLibNfc_Llcp_Send()"); 272f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly REENTRANCE_LOCK(); 2731878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau ret = phLibNfc_Llcp_Send(hRemoteDevice, 2741878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau hLlcpSocket, 275f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly &sSendBuffer, 276c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pelly nfc_jni_send_callback, 277b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau (void*)&cb_data); 278f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly REENTRANCE_UNLOCK(); 279f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly if(ret != NFCSTATUS_PENDING) 280f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly { 281afc8705e932af9a3a27239b0ca6fdb2026f15dfcSteve Block ALOGE("phLibNfc_Llcp_Send() returned 0x%04x[%s]", ret, nfc_jni_get_status_name(ret)); 282b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau goto clean_and_return; 283f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly } 284ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton TRACE("phLibNfc_Llcp_Send() returned 0x%04x[%s]", ret, nfc_jni_get_status_name(ret)); 285f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 286b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau /* Wait for callback response */ 287b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau if(sem_wait(&cb_data.sem)) 288f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly { 289afc8705e932af9a3a27239b0ca6fdb2026f15dfcSteve Block ALOGE("Failed to wait for semaphore (errno=0x%08x)", errno); 290b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau goto clean_and_return; 291f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly } 292b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 293b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau if(cb_data.status != NFCSTATUS_SUCCESS) 294f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly { 295b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau goto clean_and_return; 296b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau } 297b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 298b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau result = JNI_TRUE; 299b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 300b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneauclean_and_return: 3018ddea174e7436fd35d8440c3e6876ee095af2636Sylvain Fonteneau if (sSendBuffer.buffer != NULL) 3028ddea174e7436fd35d8440c3e6876ee095af2636Sylvain Fonteneau { 3038ddea174e7436fd35d8440c3e6876ee095af2636Sylvain Fonteneau e->ReleaseByteArrayElements(data, (jbyte*)sSendBuffer.buffer, JNI_ABORT); 3048ddea174e7436fd35d8440c3e6876ee095af2636Sylvain Fonteneau } 305b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau nfc_cb_data_deinit(&cb_data); 306b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau return result; 307f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly} 308f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 30913d8819d9d716c8f0ba03288d058f0bd462d70a7Nick Pellystatic jint com_android_nfc_NativeLlcpSocket_doReceive(JNIEnv *e, jobject o, jbyteArray buffer) 310f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly{ 311f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly NFCSTATUS ret; 3121878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau struct timespec ts; 3131878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau phLibNfc_Handle hRemoteDevice; 314f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly phLibNfc_Handle hLlcpSocket; 3158ddea174e7436fd35d8440c3e6876ee095af2636Sylvain Fonteneau phNfc_sData_t sReceiveBuffer = {NULL, 0}; 316b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau struct nfc_jni_callback_data cb_data; 3173714e3430e3f44578d7799d163809ad0a77f7460Martijn Coenen jint result = -1; 318f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 3191878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau /* Retrieve handles */ 3201878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau hRemoteDevice = nfc_jni_get_p2p_device_handle(e,o); 321c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pelly hLlcpSocket = nfc_jni_get_nfc_socket_handle(e,o); 322f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 323b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau /* Create the local semaphore */ 324b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau if (!nfc_cb_data_init(&cb_data, NULL)) 325b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau { 326b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau goto clean_and_return; 327b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau } 328b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 329f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly sReceiveBuffer.buffer = (uint8_t*)e->GetByteArrayElements(buffer, NULL); 330f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly sReceiveBuffer.length = (uint32_t)e->GetArrayLength(buffer); 331f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 332ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton TRACE("phLibNfc_Llcp_Recv()"); 333f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly REENTRANCE_LOCK(); 3341878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau ret = phLibNfc_Llcp_Recv(hRemoteDevice, 3351878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau hLlcpSocket, 336f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly &sReceiveBuffer, 337c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pelly nfc_jni_receive_callback, 338b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau (void*)&cb_data); 339f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly REENTRANCE_UNLOCK(); 34015a344d89e0187d669989963c7a918a29b229ae3Arnaud Ferir if(ret == NFCSTATUS_PENDING) 341f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly { 34215a344d89e0187d669989963c7a918a29b229ae3Arnaud Ferir /* Wait for callback response */ 34315a344d89e0187d669989963c7a918a29b229ae3Arnaud Ferir if(sem_wait(&cb_data.sem)) 34415a344d89e0187d669989963c7a918a29b229ae3Arnaud Ferir { 345afc8705e932af9a3a27239b0ca6fdb2026f15dfcSteve Block ALOGE("Failed to wait for semaphore (errno=0x%08x)", errno); 34615a344d89e0187d669989963c7a918a29b229ae3Arnaud Ferir goto clean_and_return; 34715a344d89e0187d669989963c7a918a29b229ae3Arnaud Ferir } 348de1770748ed464e23bfee6a9c7e12150a83babaaSylvain Fonteneau 34915a344d89e0187d669989963c7a918a29b229ae3Arnaud Ferir if(cb_data.status == NFCSTATUS_SUCCESS) 35015a344d89e0187d669989963c7a918a29b229ae3Arnaud Ferir { 35115a344d89e0187d669989963c7a918a29b229ae3Arnaud Ferir result = sReceiveBuffer.length; 35215a344d89e0187d669989963c7a918a29b229ae3Arnaud Ferir } 353de1770748ed464e23bfee6a9c7e12150a83babaaSylvain Fonteneau } 35415a344d89e0187d669989963c7a918a29b229ae3Arnaud Ferir else if (ret == NFCSTATUS_SUCCESS) 355f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly { 356b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau result = sReceiveBuffer.length; 357de1770748ed464e23bfee6a9c7e12150a83babaaSylvain Fonteneau } 35815a344d89e0187d669989963c7a918a29b229ae3Arnaud Ferir else 35915a344d89e0187d669989963c7a918a29b229ae3Arnaud Ferir { 36015a344d89e0187d669989963c7a918a29b229ae3Arnaud Ferir /* Return status should be either SUCCESS or PENDING */ 361afc8705e932af9a3a27239b0ca6fdb2026f15dfcSteve Block ALOGE("phLibNfc_Llcp_Recv() returned 0x%04x[%s]", ret, nfc_jni_get_status_name(ret)); 36215a344d89e0187d669989963c7a918a29b229ae3Arnaud Ferir goto clean_and_return; 36315a344d89e0187d669989963c7a918a29b229ae3Arnaud Ferir } 36415a344d89e0187d669989963c7a918a29b229ae3Arnaud Ferir TRACE("phLibNfc_Llcp_Recv() returned 0x%04x[%s]", ret, nfc_jni_get_status_name(ret)); 365b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 366b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneauclean_and_return: 3678ddea174e7436fd35d8440c3e6876ee095af2636Sylvain Fonteneau if (sReceiveBuffer.buffer != NULL) 3688ddea174e7436fd35d8440c3e6876ee095af2636Sylvain Fonteneau { 3698ddea174e7436fd35d8440c3e6876ee095af2636Sylvain Fonteneau e->ReleaseByteArrayElements(buffer, (jbyte*)sReceiveBuffer.buffer, 0); 3708ddea174e7436fd35d8440c3e6876ee095af2636Sylvain Fonteneau } 371b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau nfc_cb_data_deinit(&cb_data); 372b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau return result; 373f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly} 374f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 37513d8819d9d716c8f0ba03288d058f0bd462d70a7Nick Pellystatic jint com_android_nfc_NativeLlcpSocket_doGetRemoteSocketMIU(JNIEnv *e, jobject o) 376f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly{ 377f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly NFCSTATUS ret; 3781878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau phLibNfc_Handle hRemoteDevice; 379f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly phLibNfc_Handle hLlcpSocket; 380f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly phLibNfc_Llcp_sSocketOptions_t remoteSocketOption; 381f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 3821878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau /* Retrieve handles */ 3831878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau hRemoteDevice = nfc_jni_get_p2p_device_handle(e,o); 384c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pelly hLlcpSocket = nfc_jni_get_nfc_socket_handle(e,o); 385f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 386ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton TRACE("phLibNfc_Llcp_SocketGetRemoteOptions(MIU)"); 387f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly REENTRANCE_LOCK(); 3881878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau ret = phLibNfc_Llcp_SocketGetRemoteOptions(hRemoteDevice, 3891878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau hLlcpSocket, 390f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly &remoteSocketOption); 391f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly REENTRANCE_UNLOCK(); 392f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly if(ret == NFCSTATUS_SUCCESS) 393f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly { 394ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton TRACE("phLibNfc_Llcp_SocketGetRemoteOptions(MIU) returned 0x%04x[%s]", ret, nfc_jni_get_status_name(ret)); 395f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly return remoteSocketOption.miu; 396f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly } 397f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly else 398f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly { 39915be799e6a9c6c2c24b2008d2d52944a01a4dc63Steve Block ALOGW("phLibNfc_Llcp_SocketGetRemoteOptions(MIU) returned 0x%04x[%s]", ret, nfc_jni_get_status_name(ret)); 400f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly return 0; 401f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly } 402f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly} 403f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 40413d8819d9d716c8f0ba03288d058f0bd462d70a7Nick Pellystatic jint com_android_nfc_NativeLlcpSocket_doGetRemoteSocketRW(JNIEnv *e, jobject o) 405f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly{ 406f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly NFCSTATUS ret; 4071878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau phLibNfc_Handle hRemoteDevice; 408f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly phLibNfc_Handle hLlcpSocket; 409f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly phLibNfc_Llcp_sSocketOptions_t remoteSocketOption; 410f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 4111878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau /* Retrieve handles */ 4121878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau hRemoteDevice = nfc_jni_get_p2p_device_handle(e,o); 413c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pelly hLlcpSocket = nfc_jni_get_nfc_socket_handle(e,o); 414f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 415ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton TRACE("phLibNfc_Llcp_SocketGetRemoteOptions(RW)"); 416f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly REENTRANCE_LOCK(); 4171878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau ret = phLibNfc_Llcp_SocketGetRemoteOptions(hRemoteDevice, 4181878c7b6e2cef1e52138ee3a5588913cc165faa5Sylvain Fonteneau hLlcpSocket, 419f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly &remoteSocketOption); 420f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly REENTRANCE_UNLOCK(); 421f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly if(ret == NFCSTATUS_SUCCESS) 422f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly { 423ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton TRACE("phLibNfc_Llcp_SocketGetRemoteOptions(RW) returned 0x%04x[%s]", ret, nfc_jni_get_status_name(ret)); 424f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly return remoteSocketOption.rw; 425f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly } 426f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly else 427f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly { 42815be799e6a9c6c2c24b2008d2d52944a01a4dc63Steve Block ALOGW("phLibNfc_Llcp_SocketGetRemoteOptions(RW) returned 0x%04x[%s]", ret, nfc_jni_get_status_name(ret)); 429f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly return 0; 430f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly } 431f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly} 432f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 433f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 434f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly/* 435f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * JNI registration. 436f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly */ 437f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pellystatic JNINativeMethod gMethods[] = 438f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly{ 43993915e1c6fe6d5d16fcebeda610782bf5812c9b4Nick Pelly {"doConnect", "(I)Z", 44013d8819d9d716c8f0ba03288d058f0bd462d70a7Nick Pelly (void *)com_android_nfc_NativeLlcpSocket_doConnect}, 441f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 44293915e1c6fe6d5d16fcebeda610782bf5812c9b4Nick Pelly {"doConnectBy", "(Ljava/lang/String;)Z", 44313d8819d9d716c8f0ba03288d058f0bd462d70a7Nick Pelly (void *)com_android_nfc_NativeLlcpSocket_doConnectBy}, 444f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 445f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly {"doClose", "()Z", 44613d8819d9d716c8f0ba03288d058f0bd462d70a7Nick Pelly (void *)com_android_nfc_NativeLlcpSocket_doClose}, 447f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 448f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly {"doSend", "([B)Z", 44913d8819d9d716c8f0ba03288d058f0bd462d70a7Nick Pelly (void *)com_android_nfc_NativeLlcpSocket_doSend}, 450f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 451f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly {"doReceive", "([B)I", 45213d8819d9d716c8f0ba03288d058f0bd462d70a7Nick Pelly (void *)com_android_nfc_NativeLlcpSocket_doReceive}, 453f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 454f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly {"doGetRemoteSocketMiu", "()I", 45513d8819d9d716c8f0ba03288d058f0bd462d70a7Nick Pelly (void *)com_android_nfc_NativeLlcpSocket_doGetRemoteSocketMIU}, 456f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 457f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly {"doGetRemoteSocketRw", "()I", 45813d8819d9d716c8f0ba03288d058f0bd462d70a7Nick Pelly (void *)com_android_nfc_NativeLlcpSocket_doGetRemoteSocketRW}, 459f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly}; 460f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 461f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 46213d8819d9d716c8f0ba03288d058f0bd462d70a7Nick Pellyint register_com_android_nfc_NativeLlcpSocket(JNIEnv *e) 463f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly{ 464f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly return jniRegisterNativeMethods(e, 465642ab20c81425ba93e206d2a30602cd67ae8bd38Martijn Coenen "com/android/nfc/dhimpl/NativeLlcpSocket",gMethods, NELEM(gMethods)); 466f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly} 467f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 468f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly} // namespace android 469