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
23namespace 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*******************************************************************************/
39static 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*******************************************************************************/
63static 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*******************************************************************************/
92static 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*******************************************************************************/
116static 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*******************************************************************************/
143static 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*******************************************************************************/
177static 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*******************************************************************************/
200static 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*****************************************************************************/
217static 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*******************************************************************************/
239int register_com_android_nfc_NativeLlcpSocket (JNIEnv* e)
240{
241    return jniRegisterNativeMethods (e, gNativeLlcpSocketClassName, gMethods, NELEM(gMethods));
242}
243
244
245} //namespace android
246