applayerprotocols/httpservice/src/chttpclienttransaction.cpp
changeset 0 b16258d2340f
child 19 c0c2f28ace9c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/applayerprotocols/httpservice/src/chttpclienttransaction.cpp	Tue Feb 02 01:09:52 2010 +0200
@@ -0,0 +1,384 @@
+// Copyright (c) 2003-2009 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:
+//
+
+#include "chttpclienttransaction.h"
+#include "chttpclienttransactionimpl.h"
+#include "httpclientutils.h"
+#include "cheaders.h"
+#include "cheaderfield.h"
+#include "mhttpdatareceiver.h"
+#include "mhttpdatasender.h"
+
+EXPORT_C THttpContentSinkOp::THttpContentSinkOp()
+: iDataReceiver(NULL)
+    {
+    
+    }
+
+EXPORT_C TBool THttpContentSinkOp::GetData(TPtrC8& aData)
+    {
+    return iDataReceiver->GetData(aData);
+    }
+
+EXPORT_C void THttpContentSinkOp::Release()
+    {
+    iDataReceiver->Release();
+    }
+
+EXPORT_C void THttpContentSinkOp::Store() // Store into a file if a sink is provided.
+    {
+    iDataReceiver->Store();
+    }
+
+THttpContentSinkOp::THttpContentSinkOp(MHttpDataReceiver& aReceiver)
+: iDataReceiver(&aReceiver)
+    {    
+    }
+// --------------------------------------------------------------------------------------------
+
+EXPORT_C THttpContentSourceOp::THttpContentSourceOp()
+: iDataSender(NULL)
+    {
+    
+    }
+
+EXPORT_C void THttpContentSourceOp::Notify(const TDesC8& aData, TBool aLast /* = EFalse */)
+    {    
+    iDataSender->Notify(aData, aLast);
+    }    
+
+THttpContentSourceOp::THttpContentSourceOp(MHttpDataSender* aSender)
+: iDataSender(aSender)
+    {
+    }
+
+// --------------------------------------------------------------------------------------------
+
+/**
+ * Create the HTTP transaction by specifiying the method [GET, POST etc..] and a URI
+ * 
+ * @param aClient - CHttpService instance
+ * @param aMethod - HTTP method. [GET, POST etc...]
+ * @param aUri - URI
+ * 
+ * @return KErrNoMemory incase of failure otherwise KErrNone for success
+ * 
+ */
+
+EXPORT_C TInt CHttpClientTransaction::Create(CHttpService& aClient, const TDesC8& aMethod, const TDesC8& aUri)
+	{
+	TRAPD(err, iHttpClientTrans = CHttpClientTransactionImpl::NewL(aClient, *this, aMethod, aUri));
+	return err;
+	}
+
+/**
+ * Destructor
+ */
+EXPORT_C CHttpClientTransaction::~CHttpClientTransaction()
+	{
+	delete	iHttpClientTrans;
+	}
+
+/**
+ * Returns HTTP response status code
+ * 
+ */
+EXPORT_C TInt CHttpClientTransaction::StatusCode() const
+	{
+	return iHttpClientTrans->Transaction().Response().StatusCode();	
+	}
+	
+/**
+ * Returns HTTP response status text
+ * 
+ */
+EXPORT_C const TDesC8& CHttpClientTransaction::StatusText() const
+	{
+	return iHttpClientTrans->Transaction().Response().StatusText().DesC();
+	}
+
+/**
+ * Disable the pipelining for “this” transaction. The transaction will be send on a 
+ * free TCP connection and no other transactions will be send via that TCP connection 
+ * till the response for “this” transaction is received
+ */
+EXPORT_C void CHttpClientTransaction::DisablePipelining()
+	{
+	RStringPool sp = iHttpClientTrans->StringPool();
+	RStringF property = sp.StringF(HTTP::EHttpPipelining, RHTTPSession::GetTable());
+	THTTPHdrVal disablePipelining = sp.StringF(HTTP::EDisablePipelining, RHTTPSession::GetTable());
+	iHttpClientTrans->Transaction().PropertySet().SetProperty(property, disablePipelining);	
+	}
+
+/**
+ * Disable automatic retry on a TCP connection failure. On TCP connection failure the error 
+ * will be notified via OnError function
+ * 
+ */
+EXPORT_C void CHttpClientTransaction::SetNoRetry()
+	{
+	RStringPool sp = iHttpClientTrans->StringPool();
+	RStringF property = sp.StringF(HTTP::ENotifyOnDisconnect, RHTTPSession::GetTable());
+	THTTPHdrVal disconnectNotify = sp.StringF(HTTP::EEnableDisconnectNotification, RHTTPSession::GetTable());
+	iHttpClientTrans->Transaction().PropertySet().SetProperty(property, disconnectNotify);	
+	}
+
+/**
+ * Set the dynamic HTTP content source.
+ */
+EXPORT_C TInt CHttpClientTransaction::SetContentSource(MHttpContentSource& aSource)
+	{
+	return iHttpClientTrans->SetDynamicContentSource(&aSource);
+	}
+	
+/**
+ * Set the static HTTP content source.
+ * 
+ * @param aFile - An opened file
+ */
+EXPORT_C TInt CHttpClientTransaction::SetContentSource(RFile& aFile)
+	{
+	return iHttpClientTrans->SetStaticContentSource(aFile);
+	}
+
+/**
+ * Set the dynamic HTTP content sink
+ * 
+ */
+EXPORT_C TInt CHttpClientTransaction::SetContentSink(MHttpContentSink& aSink)
+	{
+	return iHttpClientTrans->SetDynamicContentSink(&aSink);
+	}
+
+/**
+ * Set the static HTTP content sink
+ * 
+ * @param aFile - An opened file
+ */
+EXPORT_C TInt CHttpClientTransaction::SetContentSink(RFile& aFile)
+	{
+	return iHttpClientTrans->SetStaticContentSink(aFile);
+	}	
+/**
+ * Set the HTTP request timeout. If the HTTP request didn't send in the specified 
+ * time OnError will be called with an error code
+ * 
+ * @param aValue - Request timeout value
+ */
+EXPORT_C void CHttpClientTransaction::SetRequestTimeout(TInt aValue)
+	{
+	RStringPool sp = iHttpClientTrans->StringPool();
+	RStringF property = sp.StringF(HTTP::ESendTimeOutValue, RHTTPSession::GetTable());
+	THTTPHdrVal requestTimeout(aValue);
+	iHttpClientTrans->Transaction().PropertySet().SetProperty(property, requestTimeout);			
+	}
+
+/**
+ * Set the HTTP response timeout. If the HTTP response didn't arrive in the specified 
+ * time OnError will be called with an error code
+ */
+EXPORT_C void CHttpClientTransaction::SetResponseTimeout(TInt aValue)
+	{
+	RStringPool sp = iHttpClientTrans->StringPool();
+	RStringF property = sp.StringF(HTTP::EReceiveTimeOutValue, RHTTPSession::GetTable());
+	THTTPHdrVal responseTimeout(aValue);
+	iHttpClientTrans->Transaction().PropertySet().SetProperty(property, responseTimeout);			
+	}
+
+EXPORT_C TInt CHttpClientTransaction::AddRequestHeader(TInt aHeaderId, const THttpHeaderValueVariant& aHeaderValue)
+	{
+    RHTTPHeaders requestHeaders = iHttpClientTrans->Transaction().Request().GetHeaderCollection();;
+    RStringPool sp = iHttpClientTrans->StringPool();
+    THTTPHdrVal val = HttpClientUtils::CopyHttpHdrVal(aHeaderValue, sp);
+    if(val.Type() == THTTPHdrVal::KNoType)
+        return KErrNoMemory;
+    TInt err = requestHeaders.SetField(sp.StringF(aHeaderId, RHTTPSession::GetTable()), val);
+    HttpClientUtils::CloseString(val);
+    return err;	
+	}
+
+EXPORT_C TInt CHttpClientTransaction::AddRequestHeader(const TDesC8& aHeaderName, const THttpHeaderValueVariant& aHeaderValue)
+    {
+    RHTTPHeaders requestHeaders = iHttpClientTrans->Transaction().Request().GetHeaderCollection();;
+    RStringPool sp = iHttpClientTrans->StringPool();
+    THTTPHdrVal val = HttpClientUtils::CopyHttpHdrVal(aHeaderValue, sp);
+    if(val.Type() == THTTPHdrVal::KNoType)
+        return KErrNoMemory;
+    RStringF str;
+    TInt err = HttpClientUtils::OpenStringF(aHeaderName, sp, str); 
+    if(err != KErrNone)
+        {
+        HttpClientUtils::CloseString(val);
+        return err;
+        }
+    err = requestHeaders.SetField(str, val);
+    HttpClientUtils::CloseString(val);
+    str.Close();
+    return err;    
+    }
+
+EXPORT_C TInt CHttpClientTransaction::AddRequestHeader(TInt aHeaderId, const THttpHeaderValueVariant& aHeaderValue, TInt aParamId, const THttpHeaderValueVariant& aParamValue)
+	{
+    RHTTPHeaders requestHeaders = iHttpClientTrans->Transaction().Request().GetHeaderCollection();;
+    RStringPool sp = iHttpClientTrans->Transaction().Session().StringPool();
+    THTTPHdrVal val = HttpClientUtils::CopyHttpHdrVal(aHeaderValue, sp);
+    if(val.Type() == THTTPHdrVal::KNoType)
+        return KErrNoMemory;
+
+    THTTPHdrVal val2 = HttpClientUtils::CopyHttpHdrVal(aParamValue, sp);
+    if(val2.Type() == THTTPHdrVal::KNoType)
+        {
+        HttpClientUtils::CloseString(val);
+        return KErrNoMemory;
+        }
+    TInt err = requestHeaders.SetField(sp.StringF(aHeaderId, RHTTPSession::GetTable()), val,
+                                        sp.StringF(aParamId, RHTTPSession::GetTable()), val2);
+    HttpClientUtils::CloseString(val);
+    HttpClientUtils::CloseString(val2);
+    return err;
+	}
+
+EXPORT_C TInt CHttpClientTransaction::AddRequestHeader(const TDesC8& aHeaderName, const THttpHeaderValueVariant& aHeaderValue, const TDesC8& aParamName, const THttpHeaderValueVariant& aParamValue)
+    {
+    RHTTPHeaders requestHeaders = iHttpClientTrans->Transaction().Request().GetHeaderCollection();;
+    RStringPool sp = iHttpClientTrans->Transaction().Session().StringPool();
+    THTTPHdrVal val = HttpClientUtils::CopyHttpHdrVal(aHeaderValue, sp);
+    if(val.Type() == THTTPHdrVal::KNoType)
+        return KErrNoMemory;
+
+    THTTPHdrVal val2 = HttpClientUtils::CopyHttpHdrVal(aParamValue, sp);
+    if(val2.Type() == THTTPHdrVal::KNoType)
+        {
+        HttpClientUtils::CloseString(val);
+        return KErrNoMemory;
+        }
+    RStringF str;
+    TInt err = HttpClientUtils::OpenStringF(aHeaderName, sp, str); 
+    if(err != KErrNone)
+        {
+        HttpClientUtils::CloseString(val);
+        HttpClientUtils::CloseString(val2);
+        return err;
+        }
+
+    RStringF str2;
+    err = HttpClientUtils::OpenStringF(aParamName, sp, str2); 
+    if(err != KErrNone)
+        {
+        HttpClientUtils::CloseString(val);
+        HttpClientUtils::CloseString(val2);
+        str.Close();
+        return err;
+        }
+    err = requestHeaders.SetField(str, val, str2, val2);
+    HttpClientUtils::CloseString(val);
+    HttpClientUtils::CloseString(val2);
+    str.Close();
+    str2.Close();
+    return err;  
+    }
+
+EXPORT_C TInt CHttpClientTransaction::AddCustomRequestHeader(const TDesC8& aHeaderName, const TDesC8& aHeaderValue)
+	{
+    _LIT8(KFieldSeparator, "\n");
+    RHTTPHeaders requestHeaders = iHttpClientTrans->Transaction().Request().GetHeaderCollection();;   
+    RStringPool sp = iHttpClientTrans->StringPool();
+    RStringF str;
+    if(HttpClientUtils::OpenStringF(aHeaderName, sp, str) != KErrNone)
+        {
+        return KErrNoMemory;
+        }
+    TInt err = requestHeaders.SetRawField(str, aHeaderValue, KFieldSeparator);
+    str.Close();
+    return err;
+	}
+
+
+EXPORT_C THttpHeaderIterator CHttpClientTransaction::ResponseHeaders() const
+	{
+	CHeaders* responseHeaders = iHttpClientTrans->Transaction().Response().GetHeaderCollection().iImplementation;
+    return THttpHeaderIterator(responseHeaders);
+	}
+	
+EXPORT_C THttpHeaderElementIterator CHttpClientTransaction::ResponseHeader(TInt aHeaderId)
+	{
+	RStringPool sp = iHttpClientTrans->StringPool();
+	RHTTPHeaders responseHeaders = iHttpClientTrans->Transaction().Response().GetHeaderCollection();
+	CHeaderField* field = responseHeaders.iImplementation->LookupField(sp.StringF(aHeaderId, RHTTPSession::GetTable()));
+	if(field == NULL)
+	    {
+	    return THttpHeaderElementIterator(NULL);
+	    }
+	return THttpHeaderElementIterator(&field->iElementArray);
+	}
+	
+EXPORT_C THttpHeaderElementIterator CHttpClientTransaction::ResponseHeader(const TDesC8& aHeaderName)
+	{
+    RStringPool sp = iHttpClientTrans->StringPool();
+	RHTTPHeaders responseHeaders = iHttpClientTrans->Transaction().Response().GetHeaderCollection();
+	CHeaderField* field = NULL;
+	RStringF str;
+	if(HttpClientUtils::OpenStringF(aHeaderName, sp, str) == KErrNone)
+	    {
+	    field = responseHeaders.iImplementation->LookupField(str);
+	    str.Close();
+	    }
+	if(field == NULL)
+	    {
+	    return THttpHeaderElementIterator(NULL);
+	    }
+	return THttpHeaderElementIterator(&field->iElementArray);
+	}
+
+EXPORT_C TInt CHttpClientTransaction::SendRequest()
+	{
+    RStringF name = iHttpClientTrans->StringPool().StringF(HTTP::EContentLength, RHTTPSession::GetTable());
+    RHTTPHeaders requestHeaders = iHttpClientTrans->Transaction().Request().GetHeaderCollection();
+    THTTPHdrVal value;
+    if(requestHeaders.GetField(name, 0, value) == KErrNone)
+        {
+        iHttpClientTrans->SetDynamicContentSourceLength(value.Int());
+        }
+	
+	return iHttpClientTrans->Transaction().Submit();
+	}
+	
+EXPORT_C void CHttpClientTransaction::CancelRequest()
+	{
+	iHttpClientTrans->Transaction().Cancel();
+	}
+
+/**
+virtual functions
+*/
+EXPORT_C void CHttpClientTransaction::OnTransferProgress(TInt /* aTotal */, TInt /* aTransffered */)
+	{
+	
+	}
+	
+EXPORT_C TBool CHttpClientTransaction::OnRedirection()
+	{
+	return ETrue;
+	}
+
+EXPORT_C void CHttpClientTransaction::OnWarning(TInt /* aWarning */)
+    {
+    
+    }
+
+EXPORT_C CHttpClientTransaction::CHttpClientTransaction()
+: iHttpClientTrans(NULL)
+	{
+	}