• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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