diff -r 000000000000 -r b16258d2340f applayerprotocols/httpservice/src/chttpclienttransactionimpl.cpp --- /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 +#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); + } +