javacommons/gcfprotocols/socket/socket/src/socketserverconnectionjni.cpp
branchRCL_3
changeset 19 04becd199f91
child 87 1627c337e51e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javacommons/gcfprotocols/socket/socket/src/socketserverconnectionjni.cpp	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,235 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Contains JNI calls made by ServerSocketConnectionImpl
+*
+*/
+
+
+#include "com_nokia_mj_impl_socket_ServerSocketConnectionImpl.h"
+#include "socketserverconnectionfactory.h"
+#include "socketserverconnection.h"
+#include "javacommonutils.h"
+#include "logger.h"
+#include <stdio.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <stdlib.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netdb.h>
+#include <unistd.h>
+#include <arpa/inet.h>
+#include <string.h>
+#include <wchar.h>
+#include <dirent.h>
+
+#ifdef __SYMBIAN32__
+#include <e32def.h>
+#include <e32cmn.h>
+#endif // __SYMBIAN32__
+
+#ifndef __SYMBIAN32__
+#include <netinet/tcp.h>
+#endif
+
+#include "pushexception.h"
+#include "pusherrorcodes.h"
+#include "socketlocalhostinfo.h"
+using namespace java::util;
+using namespace java;
+
+JNIEXPORT jint JNICALL
+Java_com_nokia_mj_impl_socket_ServerSocketConnectionImpl__1createSocketServerNativePeer
+(JNIEnv *aJni, jobject /*peer*/, jstring aUrl, jint /*aMode*/, jint /*aPort*/, jintArray aFactoryHandle)
+{
+    JELOG2(ESOCKET);
+    LOG(ESOCKET, EInfo, "+SocketServerConnectionJNI::createSocketServerNativePeer");
+    const char* name = (aJni)->GetStringUTFChars(aUrl, 0);
+
+    SocketServerConnectionFactory * scf = NULL;
+    SocketServerConnection *iSocketServerPtr;
+    std::wstring Url = JavaCommonUtils::utf8ToWstring((const char *)name);
+    //NativeSocketServerConnection* nativeConn = new NativeSocketServerConnection(name, aMode, aPort);
+    try
+    {
+        scf = &SocketServerConnectionFactory::getFactory();
+        LOG(ESOCKET, EInfo, "-SocketServerConnectionJNI - getfactory created");
+        iSocketServerPtr = reinterpret_cast<SocketServerConnection*>(scf->create(Url));
+    }
+    catch (PushException& ex)
+    {
+        ELOG(ESOCKET,"ERROR!!! CreateConnection() PushException was caught");
+        int handle = reinterpret_cast<jint>(scf);
+        aJni->SetIntArrayRegion(aFactoryHandle,0,1,&handle);
+        if (scf != NULL)
+        {
+            // scf->releaseConnection(Url);
+            scf = NULL;
+            iSocketServerPtr = NULL;
+        }
+        (aJni)->ReleaseStringUTFChars(aUrl, name);
+        return 0;
+    }
+    LOG(ESOCKET, EInfo, "-SocketServerConnectionJNI::createSocketServerNativePeer");
+    int handle = reinterpret_cast<jint>(scf);
+    aJni->SetIntArrayRegion(aFactoryHandle,0,1,&handle);
+    (aJni)->ReleaseStringUTFChars(aUrl, name);
+
+    return reinterpret_cast<jint>(iSocketServerPtr);
+}
+
+JNIEXPORT jint JNICALL
+Java_com_nokia_mj_impl_socket_ServerSocketConnectionImpl__1openServerSocket
+(JNIEnv *aJni, jobject /*peer*/, jint nativePeerHandle, jint /*aSocketServerFactoryHandle*/, jstring aUrl)
+{
+    LOG(ESOCKET, EInfo, "+SocketServerConnectionJNI::openServerSocket");
+    SocketServerConnection * iSocketServerPtr = reinterpret_cast<SocketServerConnection* >(nativePeerHandle);
+    int retVal = -1;
+    try
+    {
+        if (iSocketServerPtr != NULL)
+        {
+            int mSD = iSocketServerPtr->open();
+
+            if (mSD < 0)
+            {
+                return -1;
+            }
+            retVal = mSD;
+        }
+    }
+    catch (PushException& ex)
+    {
+        ELOG(ESOCKET,"ERROR!!! CreateConnection() PushException was caught");
+        SocketServerConnectionFactory * SocketServerFactoryPtr = reinterpret_cast<SocketServerConnectionFactory* >(nativePeerHandle);
+        const char* name = (aJni)->GetStringUTFChars(aUrl, 0);
+        std::wstring Url = JavaCommonUtils::utf8ToWstring((const char *)name);
+        if (SocketServerFactoryPtr != NULL)
+        {
+            //SocketServerFactoryPtr->releaseConnection(Url);
+            SocketServerFactoryPtr = NULL;
+            iSocketServerPtr = NULL;
+        }
+        (aJni)->ReleaseStringUTFChars(aUrl, name);
+        if (PUSH_CONNECTION_ALREADY_EXISTS == ex.mErrCode)
+        {
+            LOG1(ESOCKET,EInfo,"PushConnection already Exists : %d",ex.mErrCode);
+            retVal = ex.mErrCode;
+        }
+        if (COMMON_SRV_CONN_PLUGIN_ERROR == ex.mErrCode)
+        {
+            LOG1(ESOCKET,EInfo,"Common pushConnection error : %d",ex.mErrCode);
+            retVal = ex.mErrCode;
+        }
+        else
+        {
+            retVal = -1;
+        }
+    }
+    return retVal;
+}
+
+JNIEXPORT jint JNICALL
+Java_com_nokia_mj_impl_socket_ServerSocketConnectionImpl__1getLocalAddress
+(JNIEnv *aJni, jobject /*peer*/, jint /*nativePeerHandle*/, jint aSockDesc, jint aMidletIapId, jint aApType, jobjectArray address)
+{
+    JELOG2(ESOCKET);
+    char *addr = new char[50];
+    int err = SocketLocalHostInfo::getLocalAddress(aSockDesc,addr,aMidletIapId,aApType);
+    PLOG2(ESOCKET, "getLocalAddress, ret = %d, addr = %s" , err, addr);
+    jstring jnistring = aJni->NewStringUTF(addr);
+    aJni->SetObjectArrayElement(address, 0, jnistring);
+    return err;
+}
+
+JNIEXPORT jint JNICALL
+Java_com_nokia_mj_impl_socket_ServerSocketConnectionImpl__1getLocalPort
+(JNIEnv* /*aJni*/, jobject /*peer*/, jint /*nativePeerHandle*/, jint aSockDesc)
+{
+    JELOG2(ESOCKET);
+    //NativeSocketServerConnection* nativeConn    =  reinterpret_cast<NativeSocketServerConnection* > (nativePeerHandle);
+
+    //return nativeConn->getLocalPort();
+
+    struct sockaddr_in addr;
+    socklen_t len = sizeof(addr);
+
+    if (getsockname(aSockDesc, (struct sockaddr*)&addr, &len) == -1)
+    {
+        LOG1(ESOCKET, EInfo, "SocketServerConnectionJNI::getLocalPort() : getlocalport failed : %d", errno);
+        return -errno;
+    }
+
+    return ntohs(addr.sin_port);
+}
+
+JNIEXPORT jint JNICALL
+Java_com_nokia_mj_impl_socket_ServerSocketConnectionImpl__1accept
+(JNIEnv* /*aJni*/, jobject /*peer*/, jint nativePeerHandle)
+{
+    JELOG2(ESOCKET);
+    LOG(ESOCKET, EInfo, "+SocketServerConnectionJNI::_accept");
+    //NativeSocketServerConnection* nativeConn = reinterpret_cast<NativeSocketServerConnection* > (nativePeerHandle);
+    //return nativeConn->accept();
+    SocketServerConnection * iSocketServerPtr = reinterpret_cast<SocketServerConnection* >(nativePeerHandle);
+    LOG(ESOCKET, EInfo, "-SocketServerConnectionJNI::_accept");
+    if (iSocketServerPtr != NULL)
+    {
+        return iSocketServerPtr->accept();
+    }
+    return -1;
+}
+
+JNIEXPORT jint JNICALL
+Java_com_nokia_mj_impl_socket_ServerSocketConnectionImpl__1close
+(JNIEnv *aJni, jobject /*peer*/, jint nativePeerHandle, jint aSocketServerFactoryHandle, jstring aUrl, jint aSockDesc)
+{
+    JELOG2(ESOCKET);
+    LOG(ESOCKET, EInfo, "+SocketServerConnectionJNI::_close");
+
+    const char* name = (aJni)->GetStringUTFChars(aUrl, 0);
+    std::wstring Url = JavaCommonUtils::utf8ToWstring((const char *)name);
+    SocketServerConnectionFactory * SocketServerFactoryPtr = reinterpret_cast<SocketServerConnectionFactory* >(aSocketServerFactoryHandle);
+    if (SocketServerFactoryPtr != NULL)
+    {
+        if (Url.length() != 10) // not dynamic url case
+        {
+            SocketServerFactoryPtr->releaseConnection(Url);
+            SocketServerFactoryPtr = NULL;
+        }
+        else  // dynamic url case, dont release socket://: url
+        {
+            SocketServerConnection * iSocketServerPtr = reinterpret_cast<SocketServerConnection* >(nativePeerHandle);
+            if (iSocketServerPtr != NULL)
+            {
+                if (iSocketServerPtr->isNormalServerConnection() == true)
+                {
+                    iSocketServerPtr->close(aSockDesc); // just close the socket in case of normal connection
+                }
+                else // in case the dynamic url is registered for push, then release the connection
+                {
+                    SocketServerFactoryPtr->releaseConnection(Url);
+                    SocketServerFactoryPtr = NULL;
+                    iSocketServerPtr = NULL;
+                }
+            }
+        }
+
+    }
+    (aJni)->ReleaseStringUTFChars(aUrl, name);
+    return 0;
+}