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
24c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pellyextern void nfc_jni_llcp_transport_socket_err_callback(void*      pContext,
25b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau                                                       uint8_t    nErrCode);
26f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly/*
27f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * Callbacks
28f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly */
29c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pellystatic void nfc_jni_llcp_accept_socket_callback(void*        pContext,
30b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau                                                NFCSTATUS    status)
31f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly{
32b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau   struct nfc_jni_callback_data * pCallbackData = (struct nfc_jni_callback_data *) pContext;
33c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pelly   LOG_CALLBACK("nfc_jni_llcp_accept_socket_callback", status);
34f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
35b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau   /* Report the callback status and wake up the caller */
36b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau   pCallbackData->status = status;
37b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau   sem_post(&pCallbackData->sem);
38f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly}
39f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
40f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
41f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly/*
4252e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau * Utils
4352e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau */
4452e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau
4552e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneaustatic phLibNfc_Handle getIncomingSocket(nfc_jni_native_monitor_t * pMonitor,
4652e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau                                                 phLibNfc_Handle hServerSocket)
4752e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau{
4852e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau   nfc_jni_listen_data_t * pListenData;
4952e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau   phLibNfc_Handle pIncomingSocket = NULL;
5052e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau
5152e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau   /* Look for a pending incoming connection on the current server */
5252e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau   LIST_FOREACH(pListenData, &pMonitor->incoming_socket_head, entries)
5352e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau   {
5452e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau      if (pListenData->pServerSocket == hServerSocket)
5552e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau      {
5652e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau         pIncomingSocket = pListenData->pIncomingSocket;
5752e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau         LIST_REMOVE(pListenData, entries);
5852e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau         free(pListenData);
5952e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau         break;
6052e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau      }
6152e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau   }
6252e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau
6352e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau   return pIncomingSocket;
6452e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau}
6552e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau
6652e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau/*
67f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * Methods
68f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly */
6993915e1c6fe6d5d16fcebeda610782bf5812c9b4Nick Pellystatic jobject com_NativeLlcpServiceSocket_doAccept(JNIEnv *e, jobject o, jint miu, jint rw, jint linearBufferLength)
70f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly{
7152e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau   NFCSTATUS ret = NFCSTATUS_SUCCESS;
72f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   struct timespec ts;
73f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   phLibNfc_Llcp_sSocketOptions_t sOptions;
74f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   phNfc_sData_t sWorkingBuffer;
75f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   jfieldID f;
76f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   jclass clsNativeLlcpSocket;
77b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau   jobject clientSocket = NULL;
78b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau   struct nfc_jni_callback_data cb_data;
7952e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau   phLibNfc_Handle hIncomingSocket, hServerSocket;
8052e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau   nfc_jni_native_monitor_t * pMonitor = nfc_jni_get_monitor();
81c1b883338c7e909047b8d88251307ffd52c45174Sylvain Fonteneau
82b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau   /* Create the local semaphore */
83b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau   if (!nfc_cb_data_init(&cb_data, NULL))
84b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau   {
85b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau      goto clean_and_return;
86b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau   }
87b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau
8852e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau   /* Get server socket */
8952e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau   hServerSocket = nfc_jni_get_nfc_socket_handle(e,o);
9052e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau
91f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   /* Set socket options with the socket options of the service */
92f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   sOptions.miu = miu;
93f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   sOptions.rw = rw;
94f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
95f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   /* Allocate Working buffer length */
96f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   sWorkingBuffer.buffer = (uint8_t*)malloc((miu*rw)+miu+linearBufferLength);
97f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   sWorkingBuffer.length = (miu*rw)+ miu + linearBufferLength;
98ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton
9952e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau   while(cb_data.status != NFCSTATUS_SUCCESS)
100b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau   {
10152e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau      /* Wait for tag Notification */
10252e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau      pthread_mutex_lock(&pMonitor->incoming_socket_mutex);
10352e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau      while ((hIncomingSocket = getIncomingSocket(pMonitor, hServerSocket)) == NULL) {
10452e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau         pthread_cond_wait(&pMonitor->incoming_socket_cond, &pMonitor->incoming_socket_mutex);
10552e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau      }
10652e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau      pthread_mutex_unlock(&pMonitor->incoming_socket_mutex);
10752e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau
10852e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau      /* Accept the incomming socket */
10952e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau      TRACE("phLibNfc_Llcp_Accept()");
11052e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau      REENTRANCE_LOCK();
11152e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau      ret = phLibNfc_Llcp_Accept( hIncomingSocket,
11252e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau                                  &sOptions,
11352e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau                                  &sWorkingBuffer,
11452e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau                                  nfc_jni_llcp_transport_socket_err_callback,
11552e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau                                  nfc_jni_llcp_accept_socket_callback,
11652e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau                                  (void*)&cb_data);
11752e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau      REENTRANCE_UNLOCK();
11852e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau      if(ret != NFCSTATUS_PENDING)
11952e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau      {
12052e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau         // NOTE: This may happen if link went down since incoming socket detected, then
12152e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau         //       just drop it and start a new accept loop.
1227d4e962f71c5db6d71aca046bd1416f53a10653bSteve Block         ALOGD("phLibNfc_Llcp_Accept() returned 0x%04x[%s]", ret, nfc_jni_get_status_name(ret));
12352e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau         continue;
12452e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau      }
12552e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau      TRACE("phLibNfc_Llcp_Accept() returned 0x%04x[%s]", ret, nfc_jni_get_status_name(ret));
12652e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau
12752e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau      /* Wait for callback response */
12852e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau      if(sem_wait(&cb_data.sem))
12952e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau      {
130afc8705e932af9a3a27239b0ca6fdb2026f15dfcSteve Block         ALOGE("Failed to wait for semaphore (errno=0x%08x)", errno);
13152e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau         goto clean_and_return;
13252e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau      }
13352e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau
13452e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau      if(cb_data.status != NFCSTATUS_SUCCESS)
13552e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau      {
13652e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau         /* NOTE: Do not generate an error if the accept failed to avoid error in server application */
1377d4e962f71c5db6d71aca046bd1416f53a10653bSteve Block         ALOGD("Failed to accept incoming socket  0x%04x[%s]", cb_data.status, nfc_jni_get_status_name(cb_data.status));
13852e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau      }
139b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau   }
140ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton
141b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau   /* Create new LlcpSocket object */
142642ab20c81425ba93e206d2a30602cd67ae8bd38Martijn Coenen   if(nfc_jni_cache_object(e,"com/android/nfc/dhimpl/NativeLlcpSocket",&(clientSocket)) == -1)
143b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau   {
1447d4e962f71c5db6d71aca046bd1416f53a10653bSteve Block      ALOGD("LLCP Socket creation error");
145b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau      goto clean_and_return;
146f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   }
147b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau
148b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau   /* Get NativeConnectionOriented class object */
149b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau   clsNativeLlcpSocket = e->GetObjectClass(clientSocket);
150b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau   if(e->ExceptionCheck())
151f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   {
1527d4e962f71c5db6d71aca046bd1416f53a10653bSteve Block      ALOGD("LLCP Socket get class object error");
153b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau      goto clean_and_return;
154b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau   }
155b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau
156b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau   /* Set socket handle */
157b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau   f = e->GetFieldID(clsNativeLlcpSocket, "mHandle", "I");
15852e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau   e->SetIntField(clientSocket, f,(jint)hIncomingSocket);
159b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau
160b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau   /* Set socket MIU */
161b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau   f = e->GetFieldID(clsNativeLlcpSocket, "mLocalMiu", "I");
162b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau   e->SetIntField(clientSocket, f,(jint)miu);
163b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau
164b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau   /* Set socket RW */
165b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau   f = e->GetFieldID(clsNativeLlcpSocket, "mLocalRw", "I");
166b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau   e->SetIntField(clientSocket, f,(jint)rw);
167b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau
16852e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau   TRACE("socket handle 0x%02x: MIU = %d, RW = %d\n",hIncomingSocket, miu, rw);
169b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau
170b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneauclean_and_return:
171b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau   nfc_cb_data_deinit(&cb_data);
172b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau   return clientSocket;
173f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly}
174f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
17593915e1c6fe6d5d16fcebeda610782bf5812c9b4Nick Pellystatic jboolean com_NativeLlcpServiceSocket_doClose(JNIEnv *e, jobject o)
176f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly{
177f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   NFCSTATUS ret;
178f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   phLibNfc_Handle hLlcpSocket;
17952e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau   nfc_jni_native_monitor_t * pMonitor = nfc_jni_get_monitor();
18052e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau
181ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton   TRACE("Close Service socket");
18252e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau
183f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   /* Retrieve socket handle */
184c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pelly   hLlcpSocket = nfc_jni_get_nfc_socket_handle(e,o);
185f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
18652e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau   pthread_mutex_lock(&pMonitor->incoming_socket_mutex);
18752e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau   /* TODO: implement accept abort */
18852e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau   pthread_cond_broadcast(&pMonitor->incoming_socket_cond);
18952e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau   pthread_mutex_unlock(&pMonitor->incoming_socket_mutex);
19052e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau
191f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   REENTRANCE_LOCK();
192f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   ret = phLibNfc_Llcp_Close(hLlcpSocket);
193f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   REENTRANCE_UNLOCK();
194f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   if(ret == NFCSTATUS_SUCCESS)
195f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   {
196ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton      TRACE("Close Service socket OK");
197f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly      return TRUE;
198f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   }
199f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   else
200f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   {
2017d4e962f71c5db6d71aca046bd1416f53a10653bSteve Block      ALOGD("Close Service socket KO");
202f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly      return FALSE;
203f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   }
204f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly}
205f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
206f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
207f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly/*
208f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * JNI registration.
209f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly */
210f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pellystatic JNINativeMethod gMethods[] =
211f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly{
212642ab20c81425ba93e206d2a30602cd67ae8bd38Martijn Coenen   {"doAccept", "(III)Lcom/android/nfc/dhimpl/NativeLlcpSocket;",
21393915e1c6fe6d5d16fcebeda610782bf5812c9b4Nick Pelly      (void *)com_NativeLlcpServiceSocket_doAccept},
214f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
215f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   {"doClose", "()Z",
21693915e1c6fe6d5d16fcebeda610782bf5812c9b4Nick Pelly      (void *)com_NativeLlcpServiceSocket_doClose},
217f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly};
218f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
219f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
22013d8819d9d716c8f0ba03288d058f0bd462d70a7Nick Pellyint register_com_android_nfc_NativeLlcpServiceSocket(JNIEnv *e)
221f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly{
222f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   return jniRegisterNativeMethods(e,
223642ab20c81425ba93e206d2a30602cd67ae8bd38Martijn Coenen      "com/android/nfc/dhimpl/NativeLlcpServiceSocket",
224f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly      gMethods, NELEM(gMethods));
225f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly}
226f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
227f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly} // namespace android
228