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