cryptomgmtlibs/securityutils/source/secutil/ExplicitHTTPSession.cpp
changeset 0 2c201484c85f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cryptomgmtlibs/securityutils/source/secutil/ExplicitHTTPSession.cpp	Wed Jul 08 11:25:26 2009 +0100
@@ -0,0 +1,246 @@
+/*
+* Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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: 
+*
+*/
+
+
+
+
+/**
+ @file
+ @internalTechnology
+*/
+
+#include "explicit_http_session.h"
+
+#include <commdbconnpref.h>
+
+#include <cdblen.h>
+#include <metadatabase.h>
+#include <commsdattypesv1_1.h>
+using namespace CommsDat;
+
+
+_LIT(KSlashChar, "\\");
+const TInt32 KMaxLenColonNumberStr = (1 + 10);	// 1 Char for ':' and 10 Chars for TUint32 string
+
+EXPORT_C RExplicitHTTPSession::RExplicitHTTPSession()
+	{
+	}
+
+EXPORT_C void RExplicitHTTPSession::OpenL(const TUriC8& aUri, TUint32 aIapNumber, TBool aStartConnection)
+	{
+	BindConnectionL(aIapNumber, aStartConnection);
+	
+	/*
+	 Finally, get the proxy settings from the comms database. Note that if 
+	 there is a problem with retrieving this info, we will use no proxy by 
+	 default.
+	 The proxy which is retrieved is based on the scheme used by the URI
+	 to be opened. eg if the URI to be opened is https://myhost.com/...
+	 then the HTTPS proxy will be used
+	*/
+	
+	HBufC8* proxy = NULL;
+	
+	TBool useProxy = EFalse;
+	
+	TRAPD(err, useProxy = UseProxyL(aUri.Extract(EUriScheme), proxy));
+	
+	if (useProxy && !err)
+		{
+		RStringPool strPool = iHTTPSession.StringPool();
+		RHTTPConnectionInfo connInfo = iHTTPSession.ConnectionInfo();
+		
+		CleanupStack::PushL(proxy);
+		RStringF proxyAddr = strPool.OpenFStringL(*proxy);
+		CleanupClosePushL(proxyAddr);
+		
+		THTTPHdrVal proxyUsage(strPool.StringF(HTTP::EUseProxy,
+			                   RHTTPSession::GetTable()));
+			                   
+		connInfo.SetPropertyL(strPool.StringF(HTTP::EProxyUsage,
+			                  RHTTPSession::GetTable()), proxyUsage);
+			                  
+		connInfo.SetPropertyL(strPool.StringF(HTTP::EProxyAddress,
+			                  RHTTPSession::GetTable()), proxyAddr);
+			                  
+		CleanupStack::PopAndDestroy(2, proxy);	// pop proxyAddr and proxy
+		}				
+	}
+	
+EXPORT_C void RExplicitHTTPSession::StartConnection(TRequestStatus& aStatus)
+	{
+	if (iIap)
+		{
+		TCommDbConnPref connectionPref;
+		connectionPref.SetIapId(iIap);
+		connectionPref.SetDialogPreference(ECommDbDialogPrefDoNotPrompt);
+		iConnection.Start(connectionPref, aStatus);
+		}
+	else
+		{
+		iConnection.Start(aStatus);
+		}
+	}
+	
+EXPORT_C void RExplicitHTTPSession::CancelStart()
+	{
+	iConnection.Close();
+	iConnection.Open(iSocketServ);
+	}
+	
+EXPORT_C void RExplicitHTTPSession::Close()
+	{
+	iHTTPSession.Close();
+	iConnection.Close();
+	iSocketServ.Close();
+	}
+
+EXPORT_C RHTTPSession& RExplicitHTTPSession::HTTPSession()
+	{
+	return iHTTPSession;
+	}
+
+void RExplicitHTTPSession::BindConnectionL(TUint32 aIap, TBool aStartConnection)
+	{
+	iIap = aIap;
+	// Open the socket server to create the connection
+	User::LeaveIfError(iSocketServ.Connect());
+	User::LeaveIfError(iConnection.Open(iSocketServ));
+
+	// we may wish to do an async connection start.
+	if (aStartConnection)
+		{
+		// If the IAP number is non-zero, we have an explicit IAP to use
+		if (iIap)
+			{
+			TCommDbConnPref connectionPref;
+			connectionPref.SetIapId(iIap);
+			connectionPref.SetDialogPreference(ECommDbDialogPrefDoNotPrompt);
+			User::LeaveIfError(iConnection.Start(connectionPref));
+			}
+		else
+			{
+			User::LeaveIfError(iConnection.Start());
+			}
+		}
+
+	// Now open the real HTTP session and bind this session with the
+	// socket server/connection
+	iHTTPSession.OpenL();
+	RStringPool strPool = iHTTPSession.StringPool();
+	
+	RHTTPConnectionInfo connInfo = iHTTPSession.ConnectionInfo();
+	
+	connInfo.SetPropertyL(strPool.StringF(HTTP::EHttpSocketServ, 
+						  RHTTPSession::GetTable()), THTTPHdrVal(iSocketServ.Handle()));
+						  
+	connInfo.SetPropertyL(strPool.StringF(HTTP::EHttpSocketConnection, 
+						  RHTTPSession::GetTable()), 
+		                  THTTPHdrVal(reinterpret_cast<TInt>(&iConnection)));
+	}
+
+TBool RExplicitHTTPSession::UseProxyL(const TDesC8& aScheme, HBufC8*& aProxyServer)
+	{
+	TBool useProxy = EFalse;
+
+	// Get the service id and service type from the connection
+	TBuf<KCommsDbSvrMaxFieldLength> field;
+
+	field = TPtrC(IAP);
+	field.Append(KSlashChar);
+	field.Append(TPtrC(IAP_SERVICE));
+
+	TUint32 serviceId;
+	User::LeaveIfError(iConnection.GetIntSetting(field, serviceId));
+
+	field = TPtrC(IAP);
+	field.Append(KSlashChar);
+	field.Append(TPtrC(IAP_SERVICE_TYPE));
+
+	TBuf<KCommsDbSvrMaxFieldLength> serviceType;
+	
+	User::LeaveIfError(iConnection.GetDesSetting(field, serviceType));
+
+	// Now we've got the comms database, from the serviceId and serviceType,
+	// get the proxy record
+	
+	// use commsDat API
+
+ 	// Create CommmsDat seesion using latest version of commsdat
+ 	CMDBSession* session = CMDBSession::NewLC(CMDBSession::LatestVersion());
+	//CMDBSession* session = CMDBSession::NewLC(KCommsDatVersion);
+	
+	// ***************************************
+	// Create the CMDBRecordSet for the search
+	// ***************************************
+	CMDBRecordSet<CCDProxiesRecord>* pProxiesRecordSet = new (ELeave)CMDBRecordSet<CCDProxiesRecord>(KCDTIdProxiesRecord);
+	CleanupStack::PushL(pProxiesRecordSet);
+
+	CCDProxiesRecord* primingRecord = static_cast <CCDProxiesRecord*> (CCDRecordBase::RecordFactoryL(KCDTIdProxiesRecord));
+	CleanupStack::PushL(primingRecord);
+
+	// ************************************
+	// build priming record for the search
+	// ************************************
+	primingRecord->iServiceType.SetMaxLengthL(serviceType.Length());
+	primingRecord->iServiceType = serviceType;
+	
+	primingRecord->iService = serviceId;
+	primingRecord->iUseProxyServer = ETrue;
+
+	// Create 16-bit copy and set ProtocolName
+	HBufC16* protocolName16 = HBufC16::NewLC(aScheme.Length());
+	TPtr16 ptr(protocolName16->Des());
+	ptr.Copy(aScheme);
+	primingRecord->iProtocolName.SetMaxLengthL(ptr.Length());
+	primingRecord->iProtocolName = ptr;
+	CleanupStack::PopAndDestroy(protocolName16);
+	
+	pProxiesRecordSet->iRecords.AppendL(primingRecord);
+	CleanupStack::Pop(primingRecord);
+	
+	// *****************************
+	// Search for the priming record
+	// *****************************
+	if (pProxiesRecordSet->FindL(*session))
+		{
+			// Proxy is located so copy settings to aProxyServer
+			TPtrC serverName(static_cast <CCDProxiesRecord*> (pProxiesRecordSet->iRecords[0])->iServerName);
+
+			// Create the 8-bit version allowing extra characters for port number
+			HBufC8* proxyServer = HBufC8::NewLC(serverName.Length() + KMaxLenColonNumberStr);
+
+			TPtr8 ptr(proxyServer->Des());
+			ptr.Copy(serverName);
+
+			ptr.Append(':');
+			ptr.AppendNum(static_cast <CCDProxiesRecord*> (pProxiesRecordSet->iRecords[0])->iPortNumber);
+			useProxy = ETrue;
+			CleanupStack::Pop(proxyServer);
+			aProxyServer = proxyServer;
+		}
+	else
+		{
+			// do nothing
+			// useProxy = FALSE
+		}
+
+	CleanupStack::PopAndDestroy(pProxiesRecordSet);
+	CleanupStack::PopAndDestroy(session);
+
+	return useProxy;
+	}