javacommons/gcfprotocols/http/src.s60/nativetransaction.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 13 Oct 2010 14:23:59 +0300
branchRCL_3
changeset 83 26b2b12093af
parent 71 d5e927d5853b
permissions -rw-r--r--
Revision: v2.2.17 Kit: 201041

/*
* 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>

#ifdef RD_JAVA_S60_RELEASE_10_1_ONWARDS
#include <CUserAgent.h>
#else
#include <cuseragent.h>
#endif

#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;
}