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