applayerprotocols/httpservice/src/chttpservice.cpp
changeset 0 b16258d2340f
child 5 337070b4fa18
--- /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);    
+	}
+