| /* |
| * Copyright (C) 2012 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| #include "OverrideLog.h" |
| #include "PeerToPeer.h" |
| #include "JavaClassConstants.h" |
| |
| |
| namespace android |
| { |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: nativeLlcpSocket_doConnect |
| ** |
| ** Description: Establish a connection to the peer. |
| ** e: JVM environment. |
| ** o: Java object. |
| ** nSap: Service access point. |
| ** |
| ** Returns: True if ok. |
| ** |
| *******************************************************************************/ |
| static jboolean nativeLlcpSocket_doConnect (JNIEnv* e, jobject o, jint nSap) |
| { |
| bool stat = false; |
| jboolean retVal = JNI_FALSE; |
| |
| ALOGD ("%s: enter; sap=%d", __FUNCTION__, nSap); |
| |
| PeerToPeer::tJNI_HANDLE jniHandle = (PeerToPeer::tJNI_HANDLE) nfc_jni_get_nfc_socket_handle (e,o); |
| |
| stat = PeerToPeer::getInstance().connectConnOriented (jniHandle, nSap); |
| |
| if (stat) |
| retVal = JNI_TRUE; |
| |
| ALOGD ("%s: exit", __FUNCTION__); |
| return retVal; |
| } |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: nativeLlcpSocket_doConnectBy |
| ** |
| ** Description: Establish a connection to the peer. |
| ** e: JVM environment. |
| ** o: Java object. |
| ** sn: Service name. |
| ** |
| ** Returns: True if ok. |
| ** |
| *******************************************************************************/ |
| static jboolean nativeLlcpSocket_doConnectBy (JNIEnv* e, jobject o, jstring sn) |
| { |
| ALOGD ("%s: enter", __FUNCTION__); |
| bool stat = false; |
| jboolean retVal = JNI_FALSE; |
| |
| PeerToPeer::tJNI_HANDLE jniHandle = (PeerToPeer::tJNI_HANDLE) nfc_jni_get_nfc_socket_handle (e,o); |
| |
| const char* serviceName = e->GetStringUTFChars (sn, JNI_FALSE); //convert jstring, which is unicode, into char* |
| |
| stat = PeerToPeer::getInstance().connectConnOriented (jniHandle, serviceName); |
| |
| e->ReleaseStringUTFChars (sn, serviceName); //free the string |
| |
| if (stat) |
| retVal = JNI_TRUE; |
| |
| ALOGD ("%s: exit", __FUNCTION__); |
| return retVal; |
| } |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: nativeLlcpSocket_doClose |
| ** |
| ** Description: Close socket. |
| ** e: JVM environment. |
| ** o: Java object. |
| ** |
| ** Returns: True if ok. |
| ** |
| *******************************************************************************/ |
| static jboolean nativeLlcpSocket_doClose(JNIEnv *e, jobject o) |
| { |
| ALOGD ("%s: enter", __FUNCTION__); |
| bool stat = false; |
| jboolean retVal = JNI_FALSE; |
| |
| PeerToPeer::tJNI_HANDLE jniHandle = (PeerToPeer::tJNI_HANDLE) nfc_jni_get_nfc_socket_handle (e,o); |
| |
| stat = PeerToPeer::getInstance().disconnectConnOriented (jniHandle); |
| |
| retVal = JNI_TRUE; |
| ALOGD ("%s: exit", __FUNCTION__); |
| return retVal; |
| } |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: nativeLlcpSocket_doSend |
| ** |
| ** Description: Send data to peer. |
| ** e: JVM environment. |
| ** o: Java object. |
| ** data: Buffer of data. |
| ** |
| ** Returns: True if sent ok. |
| ** |
| *******************************************************************************/ |
| static jboolean nativeLlcpSocket_doSend (JNIEnv* e, jobject o, jbyteArray data) |
| { |
| ALOGD_IF ((appl_trace_level>=BT_TRACE_LEVEL_DEBUG), "%s: enter", __FUNCTION__); |
| uint8_t* dataBuffer = (uint8_t*) e->GetByteArrayElements (data, NULL); |
| uint32_t dataBufferLen = (uint32_t) e->GetArrayLength (data); |
| bool stat = false; |
| |
| PeerToPeer::tJNI_HANDLE jniHandle = (PeerToPeer::tJNI_HANDLE) nfc_jni_get_nfc_socket_handle (e,o); |
| |
| stat = PeerToPeer::getInstance().send (jniHandle, dataBuffer, dataBufferLen); |
| |
| e->ReleaseByteArrayElements (data, (jbyte*) dataBuffer, JNI_ABORT); |
| |
| ALOGD_IF ((appl_trace_level>=BT_TRACE_LEVEL_DEBUG), "%s: exit", __FUNCTION__); |
| return stat ? JNI_TRUE : JNI_FALSE; |
| } |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: nativeLlcpSocket_doReceive |
| ** |
| ** Description: Receive data from peer. |
| ** e: JVM environment. |
| ** o: Java object. |
| ** origBuffer: Buffer to put received data. |
| ** |
| ** Returns: Number of bytes received. |
| ** |
| *******************************************************************************/ |
| static jint nativeLlcpSocket_doReceive(JNIEnv *e, jobject o, jbyteArray origBuffer) |
| { |
| ALOGD_IF ((appl_trace_level>=BT_TRACE_LEVEL_DEBUG), "%s: enter", __FUNCTION__); |
| uint8_t* dataBuffer = (uint8_t*) e->GetByteArrayElements (origBuffer, NULL); |
| uint32_t dataBufferLen = (uint32_t) e->GetArrayLength (origBuffer); |
| uint16_t actualLen = 0; |
| bool stat = false; |
| jint retval = 0; |
| |
| PeerToPeer::tJNI_HANDLE jniHandle = (PeerToPeer::tJNI_HANDLE) nfc_jni_get_nfc_socket_handle (e,o); |
| |
| stat = PeerToPeer::getInstance().receive (jniHandle, dataBuffer, dataBufferLen, actualLen); |
| |
| if (stat && (actualLen>0)) |
| { |
| retval = actualLen; |
| } |
| else |
| retval = -1; |
| |
| e->ReleaseByteArrayElements (origBuffer, (jbyte*) dataBuffer, 0); |
| ALOGD_IF ((appl_trace_level>=BT_TRACE_LEVEL_DEBUG), "%s: exit; actual len=%d", __FUNCTION__, retval); |
| return retval; |
| } |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: nativeLlcpSocket_doGetRemoteSocketMIU |
| ** |
| ** Description: Get peer's maximum information unit. |
| ** e: JVM environment. |
| ** o: Java object. |
| ** |
| ** Returns: Peer's maximum information unit. |
| ** |
| *******************************************************************************/ |
| static jint nativeLlcpSocket_doGetRemoteSocketMIU (JNIEnv* e, jobject o) |
| { |
| ALOGD ("%s: enter", __FUNCTION__); |
| bool stat = false; |
| |
| PeerToPeer::tJNI_HANDLE jniHandle = (PeerToPeer::tJNI_HANDLE) nfc_jni_get_nfc_socket_handle (e,o); |
| jint miu = 0; |
| |
| miu = PeerToPeer::getInstance().getRemoteMaxInfoUnit (jniHandle); |
| |
| ALOGD ("%s: exit", __FUNCTION__); |
| return miu; |
| } |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: nativeLlcpSocket_doGetRemoteSocketRW |
| ** |
| ** Description: Get peer's receive window size. |
| ** e: JVM environment. |
| ** o: Java object. |
| ** |
| ** Returns: Peer's receive window size. |
| ** |
| *******************************************************************************/ |
| static jint nativeLlcpSocket_doGetRemoteSocketRW (JNIEnv* e, jobject o) |
| { |
| ALOGD ("%s: enter", __FUNCTION__); |
| bool stat = false; |
| jint rw = 0; |
| |
| PeerToPeer::tJNI_HANDLE jniHandle = (PeerToPeer::tJNI_HANDLE) nfc_jni_get_nfc_socket_handle (e,o); |
| |
| rw = PeerToPeer::getInstance().getRemoteRecvWindow (jniHandle); |
| |
| ALOGD ("%s: exit", __FUNCTION__); |
| return rw; |
| } |
| |
| |
| /***************************************************************************** |
| ** |
| ** Description: JNI functions |
| ** |
| *****************************************************************************/ |
| static JNINativeMethod gMethods[] = |
| { |
| {"doConnect", "(I)Z", (void * ) nativeLlcpSocket_doConnect}, |
| {"doConnectBy", "(Ljava/lang/String;)Z", (void*) nativeLlcpSocket_doConnectBy}, |
| {"doClose", "()Z", (void *) nativeLlcpSocket_doClose}, |
| {"doSend", "([B)Z", (void *) nativeLlcpSocket_doSend}, |
| {"doReceive", "([B)I", (void *) nativeLlcpSocket_doReceive}, |
| {"doGetRemoteSocketMiu", "()I", (void *) nativeLlcpSocket_doGetRemoteSocketMIU}, |
| {"doGetRemoteSocketRw", "()I", (void *) nativeLlcpSocket_doGetRemoteSocketRW}, |
| }; |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: register_com_android_nfc_NativeLlcpSocket |
| ** |
| ** Description: Regisgter JNI functions with Java Virtual Machine. |
| ** e: Environment of JVM. |
| ** |
| ** Returns: Status of registration. |
| ** |
| *******************************************************************************/ |
| int register_com_android_nfc_NativeLlcpSocket (JNIEnv* e) |
| { |
| return jniRegisterNativeMethods (e, gNativeLlcpSocketClassName, gMethods, NELEM(gMethods)); |
| } |
| |
| |
| } //namespace android |
| |