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