javacommons/gcfprotocols/http/src.s60/nativetransaction.cpp
branchRCL_3
changeset 19 04becd199f91
child 24 0fd27995241b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javacommons/gcfprotocols/http/src.s60/nativetransaction.cpp	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,290 @@
+/*
+* 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:  NativeTransaction - all jni calls made through here
+*
+*/
+
+
+#include <e32def.h>
+#include <centralrepository.h>
+#include <cuseragent.h>
+#include "com_nokia_mj_impl_http_HttpConnectionNative.h"
+#include "nativehttptransaction.h"
+#include "nativehttpsession.h"
+#include "monitor.h"
+#include "logger.h"
+#include "s60commonutils.h"
+
+using namespace java::util;
+
+// Constants for default User-Agent Header
+const TUid KCRUidJ2MEConfiguration = {0x102823D3};
+const TUint KHTTPUserAgentHeader = 2;
+const TUint KHTTPUserAgentHeaderValue = 3;
+const TInt KHTTPUserAgentS60Header = 0;
+const TInt KHTTPUserAgentBrowserHeader = 1;
+const TInt KHTTPUserAgentDefinedHeader = 2;
+const TInt KMaxLength = 1024;
+
+// Forward declaration
+jstring GetUserAgentL(JNIEnv *aJni, jboolean aMidpRuntime);
+
+JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_http_HttpConnectionNative__1createHttpSession(JNIEnv* aJni, jobject aPeer, jint /*aCommsServerHandle*/, jint aType, jint aAPNId, jintArray  aReturnValue)
+{
+    TInt err = -1, apnerr = 0;
+
+    TRAPD(handle,   handle = NativeHttpSession::NewL(*aJni, aPeer,  aType, aAPNId, &err, &apnerr));
+    ILOG1(ESOCKET, "createsession returned %d ",err);
+    ILOG1(ESOCKET, "apn setting returned %d ",apnerr);
+    aJni->SetIntArrayRegion(aReturnValue,0,1,&err);
+    aJni->SetIntArrayRegion(aReturnValue,1,1,&apnerr);
+
+    //DEBUGCOMP_INT( KLogFileHttp ,"Java_com_symbian_midp_io_protocol_http_Protocol__1CreateHttpSession: handle = %d", handle );
+    return handle;
+}
+
+JNIEXPORT void JNICALL Java_com_nokia_mj_impl_http_HttpConnectionNative__1closeTransaction(
+    JNIEnv* aJni,
+    jobject aPeer,
+    jint aNativeHttpTransaction)
+{
+
+    NativeHttpTransaction* tran = reinterpret_cast<NativeHttpTransaction*>(aNativeHttpTransaction);
+    tran->iJniPeer = aJni->NewWeakGlobalRef(aPeer);
+    try
+		{
+        tran->Dispose();
+   	}
+   	catch(...)
+   	{
+   		  // function server usage may throw an exception.   		
+   		  // ignore, called when transcation is closed
+   	    ELOG(ESOCKET,"Http JNI Error, exception caught!: _closeTransaction");    	
+   	}
+    delete tran;
+}
+
+JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_http_HttpConnectionNative__1createNativeTransaction(
+    JNIEnv* aJni,
+    jobject aPeer,
+    jint aNativeHttpSession,
+    jstring aUri,
+    jstring aRequestMethod)
+{
+		LOG(ESOCKET,EInfo,"http jni _createNativeTransaction()");
+    NativeHttpSession* session = reinterpret_cast<NativeHttpSession*>(aNativeHttpSession);
+    //tran->iJniPeer = aJni->NewGlobalRef(aPeer);
+    try
+    {
+        TRAPD(handle,   handle = session->CreateTransactionL(aJni, aPeer , aUri, aRequestMethod););
+        return handle;
+    }
+    catch(...)
+    {
+        // function server usage may throw an exception.   	
+        ELOG(ESOCKET,"Http JNI Error, exception caught!: _createTransaction");    	
+        return -1;    	
+    }
+    
+}
+
+JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_http_HttpConnectionNative__1submitTransaction(
+    JNIEnv* aJni,
+    jobject aPeer,
+    jint aNativeHttpTransaction,
+    jobjectArray aHeaders,
+    jbyteArray aPostData,
+    jint aPostDataLength,
+    jint aResponseTimeout)
+{
+		LOG(ESOCKET,EInfo,"http jni _submitTransaction");
+    NativeHttpTransaction* tran = reinterpret_cast<NativeHttpTransaction*>(aNativeHttpTransaction);
+    int respTimeOut = aResponseTimeout;
+    tran->iJniPeer = aJni->NewWeakGlobalRef(aPeer);
+    try
+    {
+        TRAPD(err,tran->SubmitL(aJni, &aPeer,aHeaders, aPostData, aPostDataLength, respTimeOut));
+        return err;
+    }
+    catch(...)
+    {
+        ELOG(ESOCKET,"Http JNI Error, exception caught!: _submitTransaction");    	
+        return -1;	    	
+    }    
+}
+
+JNIEXPORT jobjectArray JNICALL Java_com_nokia_mj_impl_http_HttpConnectionNative__1getResponse(
+    JNIEnv* aJni,
+    jobject aPeer,
+    jint aNativeHttpTransaction)
+{
+		LOG(ESOCKET,EInfo,"http jni _getResponse");
+    jobjectArray rawHeaders=NULL;
+    NativeHttpTransaction* tran = reinterpret_cast<NativeHttpTransaction*>(aNativeHttpTransaction);
+    tran->iJniPeer = aJni->NewWeakGlobalRef(aPeer);
+    try
+    {
+		    TRAPD(err, rawHeaders =  tran->GetResponseL(aJni));
+		    if (err!=KErrNone)
+		    {
+		        rawHeaders=NULL;
+		    }
+		}
+		catch(...)
+		{
+				rawHeaders=NULL;
+				ELOG(ESOCKET,"Http JNI Error, exception caught!: _getResponse");    	
+			
+		}
+    return rawHeaders;
+}
+
+
+JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_http_HttpConnectionNative__1getBytes(
+    JNIEnv*     aEnv,
+    jobject aPeer,
+    jint        aNativeHttpTransaction,
+    jbyteArray  aBytes,
+    jint        aLength)
+{
+		LOG(ESOCKET,EInfo,"http jni _getBytes");
+    jbyte* bytes = aEnv->GetByteArrayElements(aBytes, NULL);
+
+    if (bytes == NULL)
+    {
+        return -1;
+    }
+		try
+		{
+		    NativeHttpTransaction* tran = reinterpret_cast<NativeHttpTransaction*>(aNativeHttpTransaction);
+		    tran->iJniPeer = aEnv->NewWeakGlobalRef(aPeer);
+		    TInt length = tran->ReadBytes(reinterpret_cast<TUint8*>(bytes), aLength);
+		
+		    aEnv->ReleaseByteArrayElements(aBytes, bytes, NULL);
+		    return length;
+		}
+		catch(...)
+		{
+				ELOG(ESOCKET,"Http JNI Error, exception caught!: _getBytes");    	
+				return -1;					
+		}
+}
+
+JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_http_HttpConnectionNative__1available(
+    JNIEnv* aJni,
+    jobject aPeer,
+    jint aNativeHttpTransaction)
+{
+    NativeHttpTransaction* tran = reinterpret_cast<NativeHttpTransaction*>(aNativeHttpTransaction);
+    tran->iJniPeer = aJni->NewWeakGlobalRef(aPeer);
+    try
+    {
+    		return tran->Available();
+    }
+    catch(...)
+    {
+    		ELOG(ESOCKET,"Http JNI Error, exception caught!: _available");    	
+    		return -1;    	
+    }
+}
+
+JNIEXPORT jstring JNICALL Java_com_nokia_mj_impl_http_HttpConnectionNative__1getUserAgentHeaderValue(
+    JNIEnv *aJni,
+    jobject, jboolean aMidpRuntime)
+{
+    jstring header = NULL;
+    TRAPD(err, header = GetUserAgentL(aJni, aMidpRuntime));
+    if (err != KErrNone)
+    {
+        header = NULL;
+    }
+    return header;
+}
+
+jstring GetUserAgentL(JNIEnv *aJni, jboolean aMidpRuntime)
+{
+
+    jstring header = NULL;
+
+    if (aMidpRuntime == false)
+    {
+        CUserAgent* userAgent = CUserAgent::NewL();
+        CleanupStack::PushL(userAgent);
+
+        HBufC8* agent8 = userAgent->UserAgentL();
+        CleanupStack::PushL(agent8);
+        HBufC* agent = HBufC::NewMaxLC(agent8->Length());
+        agent->Des().Copy(*agent8);
+        header = S60CommonUtils::NativeToJavaString(*aJni, agent->Des());
+
+        CleanupStack::PopAndDestroy(agent);
+        CleanupStack::PopAndDestroy(agent8);
+        CleanupStack::PopAndDestroy(userAgent);
+
+        return header;
+    }
+
+    CRepository* repository = NULL;
+
+    repository = CRepository::NewL(KCRUidJ2MEConfiguration);
+
+    if (repository)
+    {
+        CleanupStack::PushL(repository);
+
+        TInt headerType;
+        TInt ret = repository->Get(KHTTPUserAgentHeader, headerType);
+        if (ret == KErrNone)
+        {
+            switch (headerType)
+            {
+            case KHTTPUserAgentBrowserHeader:
+            {
+                CUserAgent* userAgent = CUserAgent::NewL();
+                CleanupStack::PushL(userAgent);
+
+                HBufC8* agent8 = userAgent->UserAgentL();
+                CleanupStack::PushL(agent8);
+                HBufC* agent = HBufC::NewMaxLC(agent8->Length());
+                agent->Des().Copy(*agent8);
+                header = S60CommonUtils::NativeToJavaString(*aJni, agent->Des());
+
+                CleanupStack::PopAndDestroy(agent);
+                CleanupStack::PopAndDestroy(agent8);
+                CleanupStack::PopAndDestroy(userAgent);
+            }
+            break;
+
+            case KHTTPUserAgentDefinedHeader:
+            {
+                HBufC* headerValue = HBufC::NewLC(KMaxLength);
+                TPtr ptr(headerValue->Des());
+                ret = repository->Get(KHTTPUserAgentHeaderValue, ptr);
+                header = S60CommonUtils::NativeToJavaString(*aJni, headerValue->Des());
+                CleanupStack::PopAndDestroy(headerValue);
+            }
+            break;
+
+            case KHTTPUserAgentS60Header:
+            default:
+                header = NULL;
+                break;
+            }
+        }
+
+        CleanupStack::PopAndDestroy(repository);
+    }
+
+    return header;
+}