applayerprotocols/httpservice/src/chttpclienttransactionimpl.cpp
changeset 0 b16258d2340f
child 19 c0c2f28ace9c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/applayerprotocols/httpservice/src/chttpclienttransactionimpl.cpp	Tue Feb 02 01:09:52 2010 +0200
@@ -0,0 +1,195 @@
+// 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 <uri8.h>
+#include "chttpclienttransaction.h"
+#include "chttpclienttransactionimpl.h"
+#include "chttpservice.h"
+#include "chttpdatareceiver.h"
+#include "chttpdatasender.h"
+#include "cheaders.h"
+
+CHttpClientTransactionImpl* CHttpClientTransactionImpl::NewL(CHttpService& aClient, CHttpClientTransaction& aTrans, const TDesC8& aMethod, const TDesC8& aUri)
+	{
+	CHttpClientTransactionImpl* impl = new(ELeave) CHttpClientTransactionImpl(aTrans, aClient.Session().StringPool());
+	CleanupStack::PushL(impl);
+	impl->ConstructL(aClient, aMethod, aUri);
+	CleanupStack::Pop(); // impl
+	return impl;
+	}
+	
+CHttpClientTransactionImpl::~CHttpClientTransactionImpl()
+	{
+	iTransaction.Close();
+	delete iDataSender;
+	delete iDataReceiver;
+	}
+
+void CHttpClientTransactionImpl::ConstructL(CHttpService& aClient, const TDesC8& aMethod, const TDesC8& aUri)
+	{
+	TUriParser8 parser;
+	User::LeaveIfError(parser.Parse(aUri));
+	RHTTPSession sess = aClient.Session();
+	RStringF method = iStringPool.OpenFStringL(aMethod);
+	CleanupClosePushL(method);
+	iTransaction = sess.OpenTransactionL(parser, *this, method);
+	CleanupStack::PopAndDestroy(); // method	
+	}
+
+	
+void CHttpClientTransactionImpl::MHFRunL(RHTTPTransaction aTransaction, const THTTPEvent& aEvent)
+	{
+    __ASSERT_DEBUG (iTransaction == aTransaction, User::Invariant());
+    switch(aEvent.iStatus)
+        {
+        case THTTPEvent::EGotResponseHeaders:
+            {
+            // Parse the headers
+            if(aTransaction.Response().GetHeaderCollection().iImplementation->ConvertAllHeadersToParsedFormat() != KErrNone)
+                {
+                iClientTrans.OnError(KErrCorrupt); // Change the error code.
+                return;
+                }
+            iClientTrans.OnResponseHeaders();
+            if(iDataReceiver)
+                {
+                iDataReceiver->SetDataSupplier(aTransaction.Response().Body());
+                }
+            }
+        break;
+        
+        case THTTPEvent::EGotResponseBodyData:
+            {
+            iDataReceiver->DataAvailable();
+            }
+        break;
+        
+        case THTTPEvent::ERedirectedTemporarily:
+        case THTTPEvent::ERedirectedPermanently:
+             {
+            if(!iClientTrans.OnRedirection())
+                {  
+                aTransaction.Cancel();
+                }
+              }
+        break;
+        case THTTPEvent::ERedirectRequiresConfirmation:
+            {
+            aTransaction.Cancel();
+            if(iClientTrans.OnRedirection())
+                {  
+                aTransaction.Submit();
+                }
+            // Otherwise no need to do anything. Response will complete by itself
+            }
+        break;
+        
+        case THTTPEvent::EResponseComplete:
+            // Do nothing
+            break;
+        
+        case THTTPEvent::ESucceeded:
+            {
+            iClientTrans.OnCompletion();
+            }
+        break;
+        
+        case THTTPEvent::EFailed:
+            {
+            // Cancel the transaction. The failure would have been indicated to the
+            // client already.
+            iTransaction.Cancel();
+            }
+        break;
+
+        case THTTPEvent::ESendTimeOut:
+            {            
+            }
+            break;
+            
+        case THTTPEvent::EReceiveTimeOut:
+            {
+            iTransaction.Cancel();
+            iClientTrans.OnError(KErrHttpResponseNotReceived);
+            }
+            break;
+                   
+        default:
+            {
+            iClientTrans.OnError(aEvent.iStatus);
+            }
+        break;
+        }
+	}
+	
+TInt CHttpClientTransactionImpl::MHFRunError(TInt aError, RHTTPTransaction /* aTransaction */, const THTTPEvent& /* aEvent */)
+	{
+	iClientTrans.OnError(aError);
+	return KErrNone;
+	}
+
+
+TInt CHttpClientTransactionImpl::SetDynamicContentSource(MHttpContentSource* aSource)
+    {
+    delete iDataSender;
+    iDataSender = NULL;
+    iDataSender = CHttpDataSender::New(iTransaction, iClientTrans, aSource);
+    if(iDataSender == NULL)
+        return KErrNoMemory;
+    iTransaction.Request().SetBody(*iDataSender);
+    return KErrNone;
+    }
+
+TInt CHttpClientTransactionImpl::SetDynamicContentSink(MHttpContentSink* aSink)
+    {
+    if(!iDataReceiver)
+        {
+        iDataReceiver = new CHttpDataReceiver(iTransaction, iClientTrans);
+        if(iDataReceiver == NULL)
+            return KErrNoMemory;
+        }
+    
+    iDataReceiver->SetDynamicSink(aSink);
+    return KErrNone;
+    }
+
+TInt CHttpClientTransactionImpl::SetStaticContentSource(RFile& aSource)
+    {
+    delete iDataSender;
+    iDataSender = NULL;
+    iDataSender = CHttpDataSender::New(iTransaction, iClientTrans, aSource);
+    if(iDataSender == NULL)
+         return KErrNoMemory;
+     iTransaction.Request().SetBody(*iDataSender);
+     return KErrNone;
+    }
+
+TInt CHttpClientTransactionImpl::SetStaticContentSink(RFile& aSink)
+    {
+    if(!iDataReceiver)
+         {
+         iDataReceiver = new CHttpDataReceiver(iTransaction, iClientTrans);
+         if(iDataReceiver == NULL)
+             return KErrNoMemory;
+         }
+    return iDataReceiver->SetFile(aSink);
+    }
+
+void CHttpClientTransactionImpl::SetDynamicContentSourceLength(TInt aLen)
+    {
+    if(iDataSender)
+        iDataSender->SetDynamicContentLen(aLen);
+    }
+