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 <android-base/stringprintf.h> 18 #include <base/logging.h> 19 #include <nativehelper/JNIHelp.h> 20 21 #include "JavaClassConstants.h" 22 #include "NfcAdaptation.h" 23 #include "NfcJniUtil.h" 24 #include "PeerToPeer.h" 25 #include "nfa_api.h" 26 #include "nfa_p2p_api.h" 27 28 using android::base::StringPrintf; 29 30 extern bool nfc_debug_enabled; 31 32 namespace android { 33 34 /******************************************************************************* 35 ** 36 ** Function: nativeLlcpServiceSocket_doAccept 37 ** 38 ** Description: Accept a connection request from a peer. 39 ** e: JVM environment. 40 ** o: Java object. 41 ** miu: Maximum information unit. 42 ** rw: Receive window. 43 ** linearBufferLength: Not used. 44 ** 45 ** Returns: LlcpSocket Java object. 46 ** 47 *******************************************************************************/ 48 static jobject nativeLlcpServiceSocket_doAccept(JNIEnv* e, jobject o, jint miu, 49 jint rw, 50 jint /*linearBufferLength*/) { 51 jobject clientSocket = NULL; 52 jclass clsNativeLlcpSocket = NULL; 53 jfieldID f = 0; 54 PeerToPeer::tJNI_HANDLE serverHandle; // handle of the local server 55 bool stat = false; 56 PeerToPeer::tJNI_HANDLE connHandle = 57 PeerToPeer::getInstance().getNewJniHandle(); 58 59 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s: enter", __func__); 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 LOG(ERROR) << StringPrintf("%s: fail accept", __func__); 67 goto TheEnd; 68 } 69 70 /* Create new LlcpSocket object */ 71 if (nfc_jni_cache_object_local(e, gNativeLlcpSocketClassName, 72 &(clientSocket)) == -1) { 73 LOG(ERROR) << StringPrintf("%s: fail create NativeLlcpSocket", __func__); 74 goto TheEnd; 75 } 76 77 /* Get NativeConnectionOriented class object */ 78 clsNativeLlcpSocket = e->GetObjectClass(clientSocket); 79 if (e->ExceptionCheck()) { 80 e->ExceptionClear(); 81 LOG(ERROR) << StringPrintf("%s: get class object error", __func__); 82 goto TheEnd; 83 } 84 85 /* Set socket handle */ 86 f = e->GetFieldID(clsNativeLlcpSocket, "mHandle", "I"); 87 e->SetIntField(clientSocket, f, (jint)connHandle); 88 89 /* Set socket MIU */ 90 f = e->GetFieldID(clsNativeLlcpSocket, "mLocalMiu", "I"); 91 e->SetIntField(clientSocket, f, (jint)miu); 92 93 /* Set socket RW */ 94 f = e->GetFieldID(clsNativeLlcpSocket, "mLocalRw", "I"); 95 e->SetIntField(clientSocket, f, (jint)rw); 96 97 TheEnd: 98 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s: exit", __func__); 99 return clientSocket; 100 } 101 102 /******************************************************************************* 103 ** 104 ** Function: nativeLlcpServiceSocket_doClose 105 ** 106 ** Description: Close a server socket. 107 ** e: JVM environment. 108 ** o: Java object. 109 ** 110 ** Returns: True if ok. 111 ** 112 *******************************************************************************/ 113 static jboolean nativeLlcpServiceSocket_doClose(JNIEnv* e, jobject o) { 114 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s: enter", __func__); 115 PeerToPeer::tJNI_HANDLE jniServerHandle = 0; 116 bool stat = false; 117 118 jniServerHandle = nfc_jni_get_nfc_socket_handle(e, o); 119 120 stat = PeerToPeer::getInstance().deregisterServer(jniServerHandle); 121 122 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s: exit", __func__); 123 return JNI_TRUE; 124 } 125 126 /***************************************************************************** 127 ** 128 ** Description: JNI functions 129 ** 130 *****************************************************************************/ 131 static JNINativeMethod gMethods[] = { 132 {"doAccept", "(III)Lcom/android/nfc/dhimpl/NativeLlcpSocket;", 133 (void*)nativeLlcpServiceSocket_doAccept}, 134 {"doClose", "()Z", (void*)nativeLlcpServiceSocket_doClose}, 135 }; 136 137 /******************************************************************************* 138 ** 139 ** Function: register_com_android_nfc_NativeLlcpServiceSocket 140 ** 141 ** Description: Regisgter JNI functions with Java Virtual Machine. 142 ** e: Environment of JVM. 143 ** 144 ** Returns: Status of registration. 145 ** 146 *******************************************************************************/ 147 int register_com_android_nfc_NativeLlcpServiceSocket(JNIEnv* e) { 148 return jniRegisterNativeMethods(e, gNativeLlcpServiceSocketClassName, 149 gMethods, NELEM(gMethods)); 150 } 151 152 } // namespace android 153