diff -r 000000000000 -r b16258d2340f applayerprotocols/httpservice/src/chttpservice.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/applayerprotocols/httpservice/src/chttpservice.cpp Tue Feb 02 01:09:52 2010 +0200 @@ -0,0 +1,231 @@ +// 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 "chttpservice.h" +#include "httpclientutils.h" + +const TInt KMaxNoOfConnections = 6; +const TInt KMaxTransToPipeline = 5; + +/** + * The default 2-phase constructor to create a CHttpService instance + * + */ +EXPORT_C CHttpService* CHttpService::NewL() + { + CHttpService* self = new(ELeave) CHttpService; + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); // self + return self; + } +/** + * Destructor + */ + +EXPORT_C CHttpService::~CHttpService() + { + if(iHttpServiceStruct) + { + iHttpServiceStruct->iHttpSession.Close(); + } + delete iHttpServiceStruct; + } + +/** + * Retrieves the equivalent string for a give string ID from the + * HTTP string pool + * + * @param @aStringId String ID + * @param aPtr String + * + * @return KErrNotFound if the string ID is not found in the HTTP string pool + * otherwise KErrNone for success + */ +EXPORT_C TInt CHttpService::String(TInt aStringId, TPtrC8& aPtr) + { + RStringF str = iHttpServiceStruct->iHttpSession.StringPool().StringF(aStringId, RHTTPSession::GetTable()); + aPtr.Set(str.DesC()); + return KErrNone; + } +/** + * Set the proxy that applies to all HTTP client transactions that "this" + * CHttpService instance creates + * + * @param aProxyAddress Proxy address. [for ex; http://myproxy.org:8081] + * @return KErrNoMemory if the proxy information cannot be set other KErrNone for success. + * + */ + +EXPORT_C TInt CHttpService::SetProxy(const TDesC8& aProxyAddress) + { + RHTTPSession sess = iHttpServiceStruct->iHttpSession; + RStringPool sp = sess.StringPool(); + RHTTPConnectionInfo connInfo = sess.ConnectionInfo(); + RStringF property = sp.StringF(HTTP::EProxyUsage, RHTTPSession::GetTable()); + RStringF useProxy = sp.StringF(HTTP::EUseProxy, RHTTPSession::GetTable()); + TInt err = connInfo.SetProperty(property, useProxy); + if(err == KErrNone) + { + RStringF str; + err = HttpClientUtils::OpenStringF(aProxyAddress, sp, str); + if(err == KErrNone) + { + err = connInfo.SetProperty(sp.StringF(HTTP::EProxyAddress,RHTTPSession::GetTable()), str); + str.Close(); + } + } + return err; + } + +/** + * Returns the proxy address that is set + * + * @return Proxy address otherwise KNullDesC8 if the proxy information + * is not set. + * + */ + +EXPORT_C const TDesC8& CHttpService::ProxyAddress() const + { + RHTTPSession sess = iHttpServiceStruct->iHttpSession; + RStringPool sp = sess.StringPool(); + RHTTPConnectionInfo connInfo = sess.ConnectionInfo(); + THTTPHdrVal useProxy; + if(connInfo.Property(sp.StringF(HTTP::EProxyUsage, RHTTPSession::GetTable()), useProxy)) + { + THTTPHdrVal proxyAddress; + if(connInfo.Property(sp.StringF(HTTP::EProxyAddress, RHTTPSession::GetTable()), proxyAddress)) + { + return proxyAddress.StrF().DesC(); + } + } + return KNullDesC8(); + } + +/** + * Set the maxuimum number of TCP connections[socket] CHttpService instance that can activated + * at any time. The default no. of connections that the CHttpService instance uses is 6. + * + * @param aValue aValue No. of connections + */ + +EXPORT_C void CHttpService::SetMaxConnections(TInt aValue) + { + RHTTPSession sess = iHttpServiceStruct->iHttpSession; + RStringPool sp = sess.StringPool(); + RHTTPConnectionInfo connInfo = sess.ConnectionInfo(); + + connInfo.SetProperty(sp.StringF(HTTP::EMaxNumTransportHandlers, RHTTPSession::GetTable()), THTTPHdrVal(aValue)); + } + +/** + * Returns the maximum no. of TCP connections that is set. + * + */ + +EXPORT_C TInt CHttpService::MaxConnections() const + { + RHTTPSession sess = iHttpServiceStruct->iHttpSession; + RStringPool sp = sess.StringPool(); + RHTTPConnectionInfo connInfo = sess.ConnectionInfo(); + THTTPHdrVal val; + if(connInfo.Property(sp.StringF(HTTP::EMaxNumTransportHandlers, RHTTPSession::GetTable()), val)) + { + if(val.Type() == THTTPHdrVal::KTIntVal) + return val.Int(); + } + return 0; + } + + +EXPORT_C void CHttpService::SetMaxTransactionsToPipeline(TInt aValue) + { + RHTTPSession sess = iHttpServiceStruct->iHttpSession; + RStringPool sp = sess.StringPool(); + RHTTPConnectionInfo connInfo = sess.ConnectionInfo(); + + connInfo.SetProperty(sp.StringF(HTTP::EMaxNumTransactionsToPipeline, RHTTPSession::GetTable()), THTTPHdrVal(aValue)); + } + +EXPORT_C TInt CHttpService::MaxTransactionsToPipeline() const + { + RHTTPSession sess = iHttpServiceStruct->iHttpSession; + RStringPool sp = sess.StringPool(); + RHTTPConnectionInfo connInfo = sess.ConnectionInfo(); + THTTPHdrVal val; + if(connInfo.Property(sp.StringF(HTTP::EMaxNumTransactionsToPipeline, RHTTPSession::GetTable()), val)) + { + if(val.Type() == THTTPHdrVal::KTIntVal) + return val.Int(); + } + return 0; + } + +/** + * This method facilitates to set the header once in the CHttpService instance that is applicable + * for all HTTP client transactions. [For ex; User-Agent header] + * + * @param aStringId - Pre-defined String ID in the HTTP string pool + * @param aHeaderValue - Value for the header + */ +EXPORT_C TInt CHttpService::AddRequestHeader(TInt aStringId, const THttpHeaderValueVariant& aHeaderValue) + { + RHTTPHeaders sessHeaders = iHttpServiceStruct->iSessionHeaders; + RStringPool sp = iHttpServiceStruct->iHttpSession.StringPool(); + THTTPHdrVal val = HttpClientUtils::CopyHttpHdrVal(aHeaderValue, sp); + TInt err = sessHeaders.SetField(sp.StringF(aStringId, RHTTPSession::GetTable()), val); + HttpClientUtils::CloseString(val); + return err; + } + +/** + * This method facilitates to set the custom HTTP header once in the CHttpService instance that is + * applicable for all HTTP client transactions. [For ex; User-Agent header] + * + * @param aHeaderName - Custom header name + * @param aHeaderValue - Value for the header + */ +EXPORT_C TInt CHttpService::AddCustomRequestHeader(const TDesC8& aHeaderName, const TDesC8& aHeaderValue) + { + _LIT8(KFieldSeparator, "\n"); + RStringPool sp = iHttpServiceStruct->iHttpSession.StringPool(); + RStringF str; + if(HttpClientUtils::OpenStringF(aHeaderName, sp, str) != KErrNone) + { + return KErrNoMemory; + } + TInt err = iHttpServiceStruct->iSessionHeaders.SetRawField(str, aHeaderValue, KFieldSeparator); + str.Close(); + return err; + } + +/** + * Constructor + */ +CHttpService::CHttpService() +: iHttpServiceStruct(NULL) + { + } + +void CHttpService::ConstructL() + { + iHttpServiceStruct = new(ELeave) CHttpServiceStruct(); + iHttpServiceStruct->iHttpSession.OpenL(); + iHttpServiceStruct->iSessionHeaders = iHttpServiceStruct->iHttpSession.RequestSessionHeadersL(); + SetMaxConnections(KMaxNoOfConnections); + SetMaxTransactionsToPipeline(KMaxTransToPipeline); + } +