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