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 #include "OverrideLog.h" 17 #include "PeerToPeer.h" 18 #include "JavaClassConstants.h" 19 #include <ScopedPrimitiveArray.h> 20 #include <ScopedUtfChars.h> 21 22 23 namespace android 24 { 25 26 27 /******************************************************************************* 28 ** 29 ** Function: nativeLlcpSocket_doConnect 30 ** 31 ** Description: Establish a connection to the peer. 32 ** e: JVM environment. 33 ** o: Java object. 34 ** nSap: Service access point. 35 ** 36 ** Returns: True if ok. 37 ** 38 *******************************************************************************/ 39 static jboolean nativeLlcpSocket_doConnect (JNIEnv* e, jobject o, jint nSap) 40 { 41 ALOGD ("%s: enter; sap=%d", __FUNCTION__, nSap); 42 43 PeerToPeer::tJNI_HANDLE jniHandle = (PeerToPeer::tJNI_HANDLE) nfc_jni_get_nfc_socket_handle(e, o); 44 bool stat = PeerToPeer::getInstance().connectConnOriented (jniHandle, nSap); 45 46 ALOGD ("%s: exit", __FUNCTION__); 47 return stat ? JNI_TRUE : JNI_FALSE; 48 } 49 50 51 /******************************************************************************* 52 ** 53 ** Function: nativeLlcpSocket_doConnectBy 54 ** 55 ** Description: Establish a connection to the peer. 56 ** e: JVM environment. 57 ** o: Java object. 58 ** sn: Service name. 59 ** 60 ** Returns: True if ok. 61 ** 62 *******************************************************************************/ 63 static jboolean nativeLlcpSocket_doConnectBy (JNIEnv* e, jobject o, jstring sn) 64 { 65 ALOGD ("%s: enter", __FUNCTION__); 66 67 PeerToPeer::tJNI_HANDLE jniHandle = (PeerToPeer::tJNI_HANDLE) nfc_jni_get_nfc_socket_handle(e, o); 68 69 ScopedUtfChars serviceName(e, sn); 70 if (serviceName.c_str() == NULL) 71 { 72 return JNI_FALSE; 73 } 74 bool stat = PeerToPeer::getInstance().connectConnOriented(jniHandle, serviceName.c_str()); 75 76 ALOGD ("%s: exit", __FUNCTION__); 77 return stat ? JNI_TRUE : JNI_FALSE; 78 } 79 80 81 /******************************************************************************* 82 ** 83 ** Function: nativeLlcpSocket_doClose 84 ** 85 ** Description: Close socket. 86 ** e: JVM environment. 87 ** o: Java object. 88 ** 89 ** Returns: True if ok. 90 ** 91 *******************************************************************************/ 92 static jboolean nativeLlcpSocket_doClose(JNIEnv *e, jobject o) 93 { 94 ALOGD ("%s: enter", __FUNCTION__); 95 96 PeerToPeer::tJNI_HANDLE jniHandle = (PeerToPeer::tJNI_HANDLE) nfc_jni_get_nfc_socket_handle(e, o); 97 bool stat = PeerToPeer::getInstance().disconnectConnOriented (jniHandle); 98 99 ALOGD ("%s: exit", __FUNCTION__); 100 return stat ? JNI_TRUE : JNI_FALSE; 101 } 102 103 104 /******************************************************************************* 105 ** 106 ** Function: nativeLlcpSocket_doSend 107 ** 108 ** Description: Send data to peer. 109 ** e: JVM environment. 110 ** o: Java object. 111 ** data: Buffer of data. 112 ** 113 ** Returns: True if sent ok. 114 ** 115 *******************************************************************************/ 116 static jboolean nativeLlcpSocket_doSend (JNIEnv* e, jobject o, jbyteArray data) 117 { 118 ALOGD_IF ((appl_trace_level>=BT_TRACE_LEVEL_DEBUG), "%s: enter", __FUNCTION__); 119 120 ScopedByteArrayRO bytes(e, data); 121 122 PeerToPeer::tJNI_HANDLE jniHandle = (PeerToPeer::tJNI_HANDLE) nfc_jni_get_nfc_socket_handle(e, o); 123 UINT8* raw_ptr = const_cast<UINT8*>(reinterpret_cast<const UINT8*>(&bytes[0])); // TODO: API bug: send should take const*! 124 bool stat = PeerToPeer::getInstance().send(jniHandle, raw_ptr, bytes.size()); 125 126 ALOGD_IF ((appl_trace_level>=BT_TRACE_LEVEL_DEBUG), "%s: exit", __FUNCTION__); 127 return stat ? JNI_TRUE : JNI_FALSE; 128 } 129 130 131 /******************************************************************************* 132 ** 133 ** Function: nativeLlcpSocket_doReceive 134 ** 135 ** Description: Receive data from peer. 136 ** e: JVM environment. 137 ** o: Java object. 138 ** origBuffer: Buffer to put received data. 139 ** 140 ** Returns: Number of bytes received. 141 ** 142 *******************************************************************************/ 143 static jint nativeLlcpSocket_doReceive(JNIEnv *e, jobject o, jbyteArray origBuffer) 144 { 145 ALOGD_IF ((appl_trace_level>=BT_TRACE_LEVEL_DEBUG), "%s: enter", __FUNCTION__); 146 147 ScopedByteArrayRW bytes(e, origBuffer); 148 149 PeerToPeer::tJNI_HANDLE jniHandle = (PeerToPeer::tJNI_HANDLE) nfc_jni_get_nfc_socket_handle(e, o); 150 uint16_t actualLen = 0; 151 bool stat = PeerToPeer::getInstance().receive(jniHandle, reinterpret_cast<UINT8*>(&bytes[0]), bytes.size(), actualLen); 152 153 jint retval = 0; 154 if (stat && (actualLen>0)) 155 { 156 retval = actualLen; 157 } 158 else 159 retval = -1; 160 161 ALOGD_IF ((appl_trace_level>=BT_TRACE_LEVEL_DEBUG), "%s: exit; actual len=%d", __FUNCTION__, retval); 162 return retval; 163 } 164 165 166 /******************************************************************************* 167 ** 168 ** Function: nativeLlcpSocket_doGetRemoteSocketMIU 169 ** 170 ** Description: Get peer's maximum information unit. 171 ** e: JVM environment. 172 ** o: Java object. 173 ** 174 ** Returns: Peer's maximum information unit. 175 ** 176 *******************************************************************************/ 177 static jint nativeLlcpSocket_doGetRemoteSocketMIU (JNIEnv* e, jobject o) 178 { 179 ALOGD ("%s: enter", __FUNCTION__); 180 181 PeerToPeer::tJNI_HANDLE jniHandle = (PeerToPeer::tJNI_HANDLE) nfc_jni_get_nfc_socket_handle(e, o); 182 jint miu = PeerToPeer::getInstance().getRemoteMaxInfoUnit(jniHandle); 183 184 ALOGD ("%s: exit", __FUNCTION__); 185 return miu; 186 } 187 188 189 /******************************************************************************* 190 ** 191 ** Function: nativeLlcpSocket_doGetRemoteSocketRW 192 ** 193 ** Description: Get peer's receive window size. 194 ** e: JVM environment. 195 ** o: Java object. 196 ** 197 ** Returns: Peer's receive window size. 198 ** 199 *******************************************************************************/ 200 static jint nativeLlcpSocket_doGetRemoteSocketRW (JNIEnv* e, jobject o) 201 { 202 ALOGD ("%s: enter", __FUNCTION__); 203 204 PeerToPeer::tJNI_HANDLE jniHandle = (PeerToPeer::tJNI_HANDLE) nfc_jni_get_nfc_socket_handle(e, o); 205 jint rw = PeerToPeer::getInstance().getRemoteRecvWindow (jniHandle); 206 207 ALOGD ("%s: exit", __FUNCTION__); 208 return rw; 209 } 210 211 212 /***************************************************************************** 213 ** 214 ** Description: JNI functions 215 ** 216 *****************************************************************************/ 217 static JNINativeMethod gMethods[] = 218 { 219 {"doConnect", "(I)Z", (void * ) nativeLlcpSocket_doConnect}, 220 {"doConnectBy", "(Ljava/lang/String;)Z", (void*) nativeLlcpSocket_doConnectBy}, 221 {"doClose", "()Z", (void *) nativeLlcpSocket_doClose}, 222 {"doSend", "([B)Z", (void *) nativeLlcpSocket_doSend}, 223 {"doReceive", "([B)I", (void *) nativeLlcpSocket_doReceive}, 224 {"doGetRemoteSocketMiu", "()I", (void *) nativeLlcpSocket_doGetRemoteSocketMIU}, 225 {"doGetRemoteSocketRw", "()I", (void *) nativeLlcpSocket_doGetRemoteSocketRW}, 226 }; 227 228 229 /******************************************************************************* 230 ** 231 ** Function: register_com_android_nfc_NativeLlcpSocket 232 ** 233 ** Description: Regisgter JNI functions with Java Virtual Machine. 234 ** e: Environment of JVM. 235 ** 236 ** Returns: Status of registration. 237 ** 238 *******************************************************************************/ 239 int register_com_android_nfc_NativeLlcpSocket (JNIEnv* e) 240 { 241 return jniRegisterNativeMethods (e, gNativeLlcpSocketClassName, gMethods, NELEM(gMethods)); 242 } 243 244 245 } //namespace android 246