1 /* 2 * Copyright (C) 2012 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include "OverrideLog.h" 18 #include "NfcJniUtil.h" 19 #include "NfcAdaptation.h" 20 #include "PeerToPeer.h" 21 #include "JavaClassConstants.h" 22 23 #include <JNIHelp.h> 24 25 extern "C" 26 { 27 #include "nfa_api.h" 28 #include "nfa_p2p_api.h" 29 } 30 31 32 namespace android 33 { 34 35 36 /******************************************************************************* 37 ** 38 ** Function: nativeLlcpServiceSocket_doAccept 39 ** 40 ** Description: Accept a connection request from a peer. 41 ** e: JVM environment. 42 ** o: Java object. 43 ** miu: Maximum information unit. 44 ** rw: Receive window. 45 ** linearBufferLength: Not used. 46 ** 47 ** Returns: LlcpSocket Java object. 48 ** 49 *******************************************************************************/ 50 static jobject nativeLlcpServiceSocket_doAccept(JNIEnv *e, jobject o, jint miu, jint rw, jint /*linearBufferLength*/) 51 { 52 jobject clientSocket = NULL; 53 jclass clsNativeLlcpSocket = NULL; 54 jfieldID f = 0; 55 PeerToPeer::tJNI_HANDLE serverHandle; //handle of the local server 56 bool stat = false; 57 PeerToPeer::tJNI_HANDLE connHandle = PeerToPeer::getInstance().getNewJniHandle (); 58 59 ALOGD ("%s: enter", __FUNCTION__); 60 61 serverHandle = (PeerToPeer::tJNI_HANDLE) nfc_jni_get_nfc_socket_handle (e, o); 62 63 stat = PeerToPeer::getInstance().accept (serverHandle, connHandle, miu, rw); 64 65 if (! stat) 66 { 67 ALOGE ("%s: fail accept", __FUNCTION__); 68 goto TheEnd; 69 } 70 71 /* Create new LlcpSocket object */ 72 if (nfc_jni_cache_object(e, gNativeLlcpSocketClassName, &(clientSocket)) == -1) 73 { 74 ALOGE ("%s: fail create NativeLlcpSocket", __FUNCTION__); 75 goto TheEnd; 76 } 77 78 /* Get NativeConnectionOriented class object */ 79 clsNativeLlcpSocket = e->GetObjectClass (clientSocket); 80 if (e->ExceptionCheck()) 81 { 82 e->ExceptionClear(); 83 ALOGE ("%s: get class object error", __FUNCTION__); 84 goto TheEnd; 85 } 86 87 /* Set socket handle */ 88 f = e->GetFieldID (clsNativeLlcpSocket, "mHandle", "I"); 89 e->SetIntField (clientSocket, f, (jint) connHandle); 90 91 /* Set socket MIU */ 92 f = e->GetFieldID (clsNativeLlcpSocket, "mLocalMiu", "I"); 93 e->SetIntField (clientSocket, f, (jint)miu); 94 95 /* Set socket RW */ 96 f = e->GetFieldID (clsNativeLlcpSocket, "mLocalRw", "I"); 97 e->SetIntField (clientSocket, f, (jint)rw); 98 99 TheEnd: 100 ALOGD ("%s: exit", __FUNCTION__); 101 return clientSocket; 102 } 103 104 105 /******************************************************************************* 106 ** 107 ** Function: nativeLlcpServiceSocket_doClose 108 ** 109 ** Description: Close a server socket. 110 ** e: JVM environment. 111 ** o: Java object. 112 ** 113 ** Returns: True if ok. 114 ** 115 *******************************************************************************/ 116 static jboolean nativeLlcpServiceSocket_doClose(JNIEnv *e, jobject o) 117 { 118 ALOGD ("%s: enter", __FUNCTION__); 119 PeerToPeer::tJNI_HANDLE jniServerHandle = 0; 120 bool stat = false; 121 122 jniServerHandle = nfc_jni_get_nfc_socket_handle (e, o); 123 124 stat = PeerToPeer::getInstance().deregisterServer (jniServerHandle); 125 126 ALOGD ("%s: exit", __FUNCTION__); 127 return JNI_TRUE; 128 } 129 130 131 /***************************************************************************** 132 ** 133 ** Description: JNI functions 134 ** 135 *****************************************************************************/ 136 static JNINativeMethod gMethods[] = 137 { 138 {"doAccept", "(III)Lcom/android/nfc/dhimpl/NativeLlcpSocket;", (void*) nativeLlcpServiceSocket_doAccept}, 139 {"doClose", "()Z", (void*) nativeLlcpServiceSocket_doClose}, 140 }; 141 142 143 /******************************************************************************* 144 ** 145 ** Function: register_com_android_nfc_NativeLlcpServiceSocket 146 ** 147 ** Description: Regisgter JNI functions with Java Virtual Machine. 148 ** e: Environment of JVM. 149 ** 150 ** Returns: Status of registration. 151 ** 152 *******************************************************************************/ 153 int register_com_android_nfc_NativeLlcpServiceSocket (JNIEnv* e) 154 { 155 return jniRegisterNativeMethods (e, gNativeLlcpServiceSocketClassName, 156 gMethods, NELEM(gMethods)); 157 } 158 159 160 } //namespace android 161