cellularsrvapitest/datatransferhaitest/esock/src/T_RConnectionData.cpp
branchopencode
changeset 24 6638e7f4bd8f
parent 0 3553901f7fa8
--- a/cellularsrvapitest/datatransferhaitest/esock/src/T_RConnectionData.cpp	Mon May 03 13:37:20 2010 +0300
+++ b/cellularsrvapitest/datatransferhaitest/esock/src/T_RConnectionData.cpp	Thu May 06 15:10:38 2010 +0100
@@ -1,403 +1,403 @@
-/*
-* Copyright (c) 2005-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 "T_RConnectionData.h"
-#include "T_RSocketServData.h"
-#include <in_sock.h>
-
-/*@{*/
-//LIT's for reading parameters from ini
-_LIT( KRSocketServ,		"RSocketServ");
-_LIT( KIAPName,      	"IAP" );
-_LIT( KRetries,      	"Retries" );
-/*@}*/
-
-/*@{*/
-//LIT's for Commands
-_LIT(KCmdOpen,				"Open");
-_LIT(KCmdStart,				"Start");
-_LIT(KCmdStop,				"Stop");
-_LIT(KCmdClose,				"Close");
-_LIT(KCmdSelectOutgoingIAP,	"SelectOutgoingIAP");
-/*@}*/
-
-
-CT_RConnectionData* CT_RConnectionData::NewL()
-	{
-	CT_RConnectionData * ret = new (ELeave)CT_RConnectionData();
-	CleanupStack::PushL(ret);
-	ret->ConstructL();
-	CleanupStack::Pop(ret);
-	return ret;
-	}
-
-CT_RConnectionData::~CT_RConnectionData()
-	{
-		
-	if (iCommDbConnPref)
-		{
-		delete iCommDbConnPref;
-		iCommDbConnPref = NULL;
-		}
-	if (iConnection)
-		{
-		delete iConnection;
-		iConnection = NULL;
-		}
-	}
-
-CT_RConnectionData::CT_RConnectionData()
-:	iConnection(NULL),
-	iCommDbConnPref(NULL),
-	iIAP(0)
-	{
-	
-	}
-void CT_RConnectionData::ConstructL()
-	{
-	iConnection = new (ELeave)RConnection();
-	}
-
-void CT_RConnectionData::RunL(CActive* aActive, TInt aIndex)
-    {
-    INFO_PRINTF1(_L("*START* CT_RSocketData::RunL"));
-    DecOutstanding(); // One of the async calls has completed 
-    
-	if(aActive == iActiveCallback)
-		{
-		INFO_PRINTF1(_L("Asynchronous task has completed. RunL  called"));
-		}
-	else
-		{ 
-		ERR_PRINTF1(_L("Stray RunL signal"));
-		TInt err = aActive->iStatus.Int(); 
-		if( err != KErrNone )
-			{
-	        ERR_PRINTF2(_L("RunL Error %d"), err); 
-	        SetAsyncError( aIndex, err );
-			}
-		}
-	INFO_PRINTF1(_L("*END* CT_RSocketData::RunL"));
-	}
-    
-
-/**
- * Return a pointer to the object that the data wraps
- *
- * @return	pointer to the object that the data wraps
- */
-TAny* CT_RConnectionData::GetObject()
-	{
-	 return iConnection;
-	}
-
-
-/**
- * Process a command read from the ini file
- *
- * @param aCommand			The command to process
- * @param aSection			The section in the ini containing data for the command
- * @param aAsyncErrorIndex	Command index for async calls to return errors to
- *
- * @return					ETrue if the command is processed
- *
- */
-TBool CT_RConnectionData::DoCommandL(const TTEFFunction& aCommand, const TTEFSectionName& aSection, const TInt /*aAsyncErrorIndex*/)
-	{
-	TBool ret = ETrue;
-	if(aCommand == KCmdOpen)
-		{
-		DoCmdOpenL(aSection);
-		}
-	else if(aCommand == KCmdStart)
-		{
-		DoCmdStart(aSection);
-		}
-	else if ( aCommand == KCmdStop)
-		{
-		DoCmdStop();
-		}
-	else if(aCommand == KCmdClose)
-		{
-		DoCmdClose();
-		}
-	else if (aCommand == KCmdSelectOutgoingIAP)
-		{
-		DoCmdSelectOutgoingIAPL(aSection);		
-		}
-	else
-		{
-		ERR_PRINTF1(_L("Unknown command"));
-		ret= EFalse;
-		}
-	
-	return ret;
-	}
-
-/**
- * 	Opens a RConnection to connect to an Internet Access Point.
- * 	@param aSection - The section in config file to look for the Access Point name and RSocketServ  
- */
-void CT_RConnectionData::DoCmdOpenL(const TTEFSectionName& aSection)
-    {
-    INFO_PRINTF1(_L("*START* CT_RConnectionData::DoCmdOpenL"));
-    
-    TBool dataOk = ETrue;
-    
-    TPtrC accessPointName;    
-    if(!GetStringFromConfig(aSection, KIAPName, accessPointName))
-    	{
-    	ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KIAPName);
-    	SetBlockResult(EFail);
-    	dataOk = EFalse;
-    	}
-    else
-    	{
-    	INFO_PRINTF2(_L("Connect to IAP \"%S\""), &accessPointName);
-        }
-        
-    TPtrC socketServName;
-    // Open RConnection for CommsDat IAP selection and connection information reading.
-	if(!GetStringFromConfig(aSection, KRSocketServ, socketServName))
-		{
-		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KRSocketServ);
-    	SetBlockResult(EFail);
-    	dataOk = EFalse;
-		}
-	
-    TInt error = KErrNone;
-    
-    if (dataOk)
-    	{
-    	RSocketServ* socketServ=static_cast<RSocketServ*>(GetDataObjectL(socketServName));
-    	error = iConnection->Open(*socketServ, KAfInet);
-    	if(error == KErrNone)
-    		{
-    		INFO_PRINTF1(_L("RConnection was opened successfully"));		
-    		}
-    	else
-    		{
-    		ERR_PRINTF2(_L("Failed to open RConnection with error [%d]"),error);
-    		SetError(error);
-    		}
-    	}
-    INFO_PRINTF1(_L("*END* CT_RConnectionData::DoCmdOpenL"));
-	}
-
-/**
- *	Selects an outgoing Internet Access Point.
- * 	@param aSection - Section from config file to read the IAP's name.
- */
-void CT_RConnectionData::DoCmdSelectOutgoingIAPL(const TTEFSectionName& aSection)
-	{
-    INFO_PRINTF1(_L("*START* CT_RConnectionData::DoCmdSelectOutgoingIAPL"));
-
-    TBool dataOk = ETrue;
-    
-	TPtrC accessPointName;    
-    if(!GetStringFromConfig(aSection, KIAPName, accessPointName))
-    	{
-    	ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KIAPName);
-    	SetBlockResult(EFail);
-    	dataOk = EFalse;
-    	}
-    
-    TInt error = KErrNone;
-    
-    if (dataOk)
-    	{
-    	// Search for IAP from CommsDat.
-    	TRAP(error, iCommDbConnPref = SelectOutgoingIAPL(accessPointName))
-		if (error != KErrNone)
-			{
-			ERR_PRINTF2(_L("Failed to select IAP [%d]"), error);
-			SetError(error);
-			}
-    	}	
-    INFO_PRINTF1(_L("*END* CT_RConnectionData::DoCmdSelectOutgoingIAPL"));
-	}
-
-/**
- * 	Starts RConnection using CActiveCallback.
- * 
- * 	@param aSection 		-	Section in config file to look for number of retries.
- * 
- */
-void CT_RConnectionData::DoCmdStart(const TTEFSectionName& aSection)
-	{
-    INFO_PRINTF1(_L("*START* CT_RConnectionData::DoCmdStart"));
-	
-    TBool dataOk = ETrue;
-    
-	TInt retries = 1;
-    if(!GetIntFromConfig(aSection, KRetries, retries ))
-    	{
-    	ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KRetries);
-    	SetBlockResult(EFail);
-    	dataOk = EFalse;
-    	}
-	// If IAP was found, start RConnection with that IAPs preferences (ID and No dialog shown)
-	// if no IAP was found return with error code.
-	if (dataOk && iCommDbConnPref)
-		{
-		INFO_PRINTF2(_L("Connecting to the IAP with [%d] tries"), retries);
-
-		// Wait before the connection is really made, this is because
-		// the DOS seems to need some time to get ready for data calls.
-		// Wait time is 8 seconds.
-		const TInt KTimeBeforeConnection = 8000000;
-        // In future releases this should be checked on time to time
-        // Heavy testing is needed before this pause can be changed.
-		User::After(KTimeBeforeConnection);
-
-		TRequestStatus status;
-
-        // Try connection more than once to avoid operator problems
-		INFO_PRINTF1(_L("Try connection more than once to avoid operator problems"));
-		TInt i = 0;
-        do	{
-            iConnection->Start(*iCommDbConnPref,status);
-            INFO_PRINTF2(_L("Status = [%d]"),status.Int());
-            User::WaitForRequest(status);
-    	    }
-        while(status.Int() != KErrNone && i++ < retries);
-
-		}    
-	
-    INFO_PRINTF1(_L("*END* CT_RConnectionData::DoCmdStart"));
-    }
-
-
-
-/**
- * Stops RConnection.
- * Sets TEF error if not successful.
- */
-void CT_RConnectionData::DoCmdStop()
-    {
-    INFO_PRINTF1(_L("*START* CT_RConnectionData::DoCmdStop"));
-
-    TInt error = iConnection->Stop(RConnection::EStopNormal);
-    if (error != KErrNone)
-        {
-        ERR_PRINTF2(_L("Failed to stop RConnection [%d]"), error);
-        SetError(error);
-        }
-    
-    INFO_PRINTF1(_L("*END* CT_RConnectionData::DoCmdStop"));
-    }
-
-/**
- * Closes RConnection.
- * Sets TEF error if not successful.
- */
-void CT_RConnectionData::DoCmdClose()
-	{
-	INFO_PRINTF1(_L("*START* CT_RConnectionData::DoCmdClose"));
-	
-	iConnection->Close();
-	
-	INFO_PRINTF1(_L("RConnection is closed"));
-
-	INFO_PRINTF1(_L("*END* CT_RConnectionData::DoCmdClose"));
-	}
-
-
-/**
- *  Select the outgoing IAP
- * 	@param TDesC IAP name
- * 	@return Pointer to TCommDbConnPref
- */
-TCommDbConnPref* CT_RConnectionData::SelectOutgoingIAPL(const TDesC& aIAPName)
-	{
-	const TUint32 KIAPMask = 0xffffffff;
-	
-	INFO_PRINTF1(_L("Connecting to CommsDat. This will leave with KErrNotSupported if it does not exist"));
-	
-	// Open a connection to the CommsDat.
-	CCommsDatabase* commsDat = CCommsDatabase::NewL(ETrue);
-	CleanupStack::PushL(commsDat);
-	
-	INFO_PRINTF1(_L("Connected to CommsDat"));
-	INFO_PRINTF1(_L("Searching for IAPs"));
-	
-	// Open a view from CommsDat IAP table listing all outgoing IAPs.
-	CCommsDbTableView* searchView = commsDat->OpenIAPTableViewMatchingBearerSetLC(KIAPMask,
-												ECommDbConnectionDirectionOutgoing);
-	
-	// Go to first record in the view.
-	TInt error = searchView->GotoFirstRecord();
-	
-	// Buffer for IAP names in the view.
-	TBuf<KCommsDbSvrMaxColumnNameLength> iapName;
-	TUint32 iapID = 0;
-	TBool found = EFalse;
-	
-	INFO_PRINTF1(_L("Searching through IAPs"));
-	
-	// Read IAPs until correct one is found or all IAPs are browsed through.
-	while (error == KErrNone)
-		{
-		// Read the IAP name from CommsDat.
-		iapName.FillZ();
-		searchView->ReadTextL(TPtrC(COMMDB_NAME), iapName);
-	    searchView->ReadUintL( TPtrC( COMMDB_ID ), iapID );
-	
-	    INFO_PRINTF3(_L( "IAP (ID = %d): \"%S\""), iapID, &iapName );
-	
-		// Try to match the name with user input.
-		if (iapName.Match(aIAPName) == KErrNone)
-			{
-			searchView->ReadUintL(TPtrC(COMMDB_ID), iIAP);
-	        found = ETrue;
-			}
-	
-		error = searchView->GotoNextRecord();
-		}
-	
-	// CommsDat and search view.
-	CleanupStack::PopAndDestroy(searchView);
-	CleanupStack::PopAndDestroy(commsDat);
-
-	// no IAP found.
-	if (!found)
-		{
-		ERR_PRINTF3(_L("No IAP found with name \"%S\" [%d]"), &aIAPName, error);
-		User::Leave(error);
-		}
-	else
-	    {
-		INFO_PRINTF2(_L("IAP found with ID \"%d\""), iIAP);
-	    }
-	
-	// Construct a CommsDat connection preferences structure.
-	TCommDbConnPref* commDbConnPref = new (ELeave) TCommDbConnPref;
-	
-	// Connection preferences IAP Id, Network Id, Dialog Preference, Direction, Bearer Set
-	// can be set through commDbConnPref.
-	
-	// Set only the values we use and leave rest untouched .
-	commDbConnPref->SetIapId(iIAP);
-	commDbConnPref->SetDialogPreference(ECommDbDialogPrefDoNotPrompt);
-	commDbConnPref->SetBearerSet(KCommDbBearerUnknown);
-	
-	INFO_PRINTF1(_L("Constructed TCommDbConnPref for the IAP ID"));
-	
-	return commDbConnPref;
-	}
-
+/*
+* Copyright (c) 2005-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 "T_RConnectionData.h"
+#include "T_RSocketServData.h"
+#include <in_sock.h>
+
+/*@{*/
+//LIT's for reading parameters from ini
+_LIT( KRSocketServ,		"RSocketServ");
+_LIT( KIAPName,      	"IAP" );
+_LIT( KRetries,      	"Retries" );
+/*@}*/
+
+/*@{*/
+//LIT's for Commands
+_LIT(KCmdOpen,				"Open");
+_LIT(KCmdStart,				"Start");
+_LIT(KCmdStop,				"Stop");
+_LIT(KCmdClose,				"Close");
+_LIT(KCmdSelectOutgoingIAP,	"SelectOutgoingIAP");
+/*@}*/
+
+
+CT_RConnectionData* CT_RConnectionData::NewL()
+	{
+	CT_RConnectionData * ret = new (ELeave)CT_RConnectionData();
+	CleanupStack::PushL(ret);
+	ret->ConstructL();
+	CleanupStack::Pop(ret);
+	return ret;
+	}
+
+CT_RConnectionData::~CT_RConnectionData()
+	{
+		
+	if (iCommDbConnPref)
+		{
+		delete iCommDbConnPref;
+		iCommDbConnPref = NULL;
+		}
+	if (iConnection)
+		{
+		delete iConnection;
+		iConnection = NULL;
+		}
+	}
+
+CT_RConnectionData::CT_RConnectionData()
+:	iConnection(NULL),
+	iCommDbConnPref(NULL),
+	iIAP(0)
+	{
+	
+	}
+void CT_RConnectionData::ConstructL()
+	{
+	iConnection = new (ELeave)RConnection();
+	}
+
+void CT_RConnectionData::RunL(CActive* aActive, TInt aIndex)
+    {
+    INFO_PRINTF1(_L("*START* CT_RSocketData::RunL"));
+    DecOutstanding(); // One of the async calls has completed 
+    
+	if(aActive == iActiveCallback)
+		{
+		INFO_PRINTF1(_L("Asynchronous task has completed. RunL  called"));
+		}
+	else
+		{ 
+		ERR_PRINTF1(_L("Stray RunL signal"));
+		TInt err = aActive->iStatus.Int(); 
+		if( err != KErrNone )
+			{
+	        ERR_PRINTF2(_L("RunL Error %d"), err); 
+	        SetAsyncError( aIndex, err );
+			}
+		}
+	INFO_PRINTF1(_L("*END* CT_RSocketData::RunL"));
+	}
+    
+
+/**
+ * Return a pointer to the object that the data wraps
+ *
+ * @return	pointer to the object that the data wraps
+ */
+TAny* CT_RConnectionData::GetObject()
+	{
+	 return iConnection;
+	}
+
+
+/**
+ * Process a command read from the ini file
+ *
+ * @param aCommand			The command to process
+ * @param aSection			The section in the ini containing data for the command
+ * @param aAsyncErrorIndex	Command index for async calls to return errors to
+ *
+ * @return					ETrue if the command is processed
+ *
+ */
+TBool CT_RConnectionData::DoCommandL(const TTEFFunction& aCommand, const TTEFSectionName& aSection, const TInt /*aAsyncErrorIndex*/)
+	{
+	TBool ret = ETrue;
+	if(aCommand == KCmdOpen)
+		{
+		DoCmdOpenL(aSection);
+		}
+	else if(aCommand == KCmdStart)
+		{
+		DoCmdStart(aSection);
+		}
+	else if ( aCommand == KCmdStop)
+		{
+		DoCmdStop();
+		}
+	else if(aCommand == KCmdClose)
+		{
+		DoCmdClose();
+		}
+	else if (aCommand == KCmdSelectOutgoingIAP)
+		{
+		DoCmdSelectOutgoingIAPL(aSection);		
+		}
+	else
+		{
+		ERR_PRINTF1(_L("Unknown command"));
+		ret= EFalse;
+		}
+	
+	return ret;
+	}
+
+/**
+ * 	Opens a RConnection to connect to an Internet Access Point.
+ * 	@param aSection - The section in config file to look for the Access Point name and RSocketServ  
+ */
+void CT_RConnectionData::DoCmdOpenL(const TTEFSectionName& aSection)
+    {
+    INFO_PRINTF1(_L("*START* CT_RConnectionData::DoCmdOpenL"));
+    
+    TBool dataOk = ETrue;
+    
+    TPtrC accessPointName;    
+    if(!GetStringFromConfig(aSection, KIAPName, accessPointName))
+    	{
+    	ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KIAPName);
+    	SetBlockResult(EFail);
+    	dataOk = EFalse;
+    	}
+    else
+    	{
+    	INFO_PRINTF2(_L("Connect to IAP \"%S\""), &accessPointName);
+        }
+        
+    TPtrC socketServName;
+    // Open RConnection for CommsDat IAP selection and connection information reading.
+	if(!GetStringFromConfig(aSection, KRSocketServ, socketServName))
+		{
+		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KRSocketServ);
+    	SetBlockResult(EFail);
+    	dataOk = EFalse;
+		}
+	
+    TInt error = KErrNone;
+    
+    if (dataOk)
+    	{
+    	RSocketServ* socketServ=static_cast<RSocketServ*>(GetDataObjectL(socketServName));
+    	error = iConnection->Open(*socketServ, KAfInet);
+    	if(error == KErrNone)
+    		{
+    		INFO_PRINTF1(_L("RConnection was opened successfully"));		
+    		}
+    	else
+    		{
+    		ERR_PRINTF2(_L("Failed to open RConnection with error [%d]"),error);
+    		SetError(error);
+    		}
+    	}
+    INFO_PRINTF1(_L("*END* CT_RConnectionData::DoCmdOpenL"));
+	}
+
+/**
+ *	Selects an outgoing Internet Access Point.
+ * 	@param aSection - Section from config file to read the IAP's name.
+ */
+void CT_RConnectionData::DoCmdSelectOutgoingIAPL(const TTEFSectionName& aSection)
+	{
+    INFO_PRINTF1(_L("*START* CT_RConnectionData::DoCmdSelectOutgoingIAPL"));
+
+    TBool dataOk = ETrue;
+    
+	TPtrC accessPointName;    
+    if(!GetStringFromConfig(aSection, KIAPName, accessPointName))
+    	{
+    	ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KIAPName);
+    	SetBlockResult(EFail);
+    	dataOk = EFalse;
+    	}
+    
+    TInt error = KErrNone;
+    
+    if (dataOk)
+    	{
+    	// Search for IAP from CommsDat.
+    	TRAP(error, iCommDbConnPref = SelectOutgoingIAPL(accessPointName))
+		if (error != KErrNone)
+			{
+			ERR_PRINTF2(_L("Failed to select IAP [%d]"), error);
+			SetError(error);
+			}
+    	}	
+    INFO_PRINTF1(_L("*END* CT_RConnectionData::DoCmdSelectOutgoingIAPL"));
+	}
+
+/**
+ * 	Starts RConnection using CActiveCallback.
+ * 
+ * 	@param aSection 		-	Section in config file to look for number of retries.
+ * 
+ */
+void CT_RConnectionData::DoCmdStart(const TTEFSectionName& aSection)
+	{
+    INFO_PRINTF1(_L("*START* CT_RConnectionData::DoCmdStart"));
+	
+    TBool dataOk = ETrue;
+    
+	TInt retries = 1;
+    if(!GetIntFromConfig(aSection, KRetries, retries ))
+    	{
+    	ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KRetries);
+    	SetBlockResult(EFail);
+    	dataOk = EFalse;
+    	}
+	// If IAP was found, start RConnection with that IAPs preferences (ID and No dialog shown)
+	// if no IAP was found return with error code.
+	if (dataOk && iCommDbConnPref)
+		{
+		INFO_PRINTF2(_L("Connecting to the IAP with [%d] tries"), retries);
+
+		// Wait before the connection is really made, this is because
+		// the DOS seems to need some time to get ready for data calls.
+		// Wait time is 8 seconds.
+		const TInt KTimeBeforeConnection = 8000000;
+        // In future releases this should be checked on time to time
+        // Heavy testing is needed before this pause can be changed.
+		User::After(KTimeBeforeConnection);
+
+		TRequestStatus status;
+
+        // Try connection more than once to avoid operator problems
+		INFO_PRINTF1(_L("Try connection more than once to avoid operator problems"));
+		TInt i = 0;
+        do	{
+            iConnection->Start(*iCommDbConnPref,status);
+            INFO_PRINTF2(_L("Status = [%d]"),status.Int());
+            User::WaitForRequest(status);
+    	    }
+        while(status.Int() != KErrNone && i++ < retries);
+
+		}    
+	
+    INFO_PRINTF1(_L("*END* CT_RConnectionData::DoCmdStart"));
+    }
+
+
+
+/**
+ * Stops RConnection.
+ * Sets TEF error if not successful.
+ */
+void CT_RConnectionData::DoCmdStop()
+    {
+    INFO_PRINTF1(_L("*START* CT_RConnectionData::DoCmdStop"));
+
+    TInt error = iConnection->Stop(RConnection::EStopNormal);
+    if (error != KErrNone)
+        {
+        ERR_PRINTF2(_L("Failed to stop RConnection [%d]"), error);
+        SetError(error);
+        }
+    
+    INFO_PRINTF1(_L("*END* CT_RConnectionData::DoCmdStop"));
+    }
+
+/**
+ * Closes RConnection.
+ * Sets TEF error if not successful.
+ */
+void CT_RConnectionData::DoCmdClose()
+	{
+	INFO_PRINTF1(_L("*START* CT_RConnectionData::DoCmdClose"));
+	
+	iConnection->Close();
+	
+	INFO_PRINTF1(_L("RConnection is closed"));
+
+	INFO_PRINTF1(_L("*END* CT_RConnectionData::DoCmdClose"));
+	}
+
+
+/**
+ *  Select the outgoing IAP
+ * 	@param TDesC IAP name
+ * 	@return Pointer to TCommDbConnPref
+ */
+TCommDbConnPref* CT_RConnectionData::SelectOutgoingIAPL(const TDesC& aIAPName)
+	{
+	const TUint32 KIAPMask = 0xffffffff;
+	
+	INFO_PRINTF1(_L("Connecting to CommsDat. This will leave with KErrNotSupported if it does not exist"));
+	
+	// Open a connection to the CommsDat.
+	CCommsDatabase* commsDat = CCommsDatabase::NewL(ETrue);
+	CleanupStack::PushL(commsDat);
+	
+	INFO_PRINTF1(_L("Connected to CommsDat"));
+	INFO_PRINTF1(_L("Searching for IAPs"));
+	
+	// Open a view from CommsDat IAP table listing all outgoing IAPs.
+	CCommsDbTableView* searchView = commsDat->OpenIAPTableViewMatchingBearerSetLC(KIAPMask,
+												ECommDbConnectionDirectionOutgoing);
+	
+	// Go to first record in the view.
+	TInt error = searchView->GotoFirstRecord();
+	
+	// Buffer for IAP names in the view.
+	TBuf<KCommsDbSvrMaxColumnNameLength> iapName;
+	TUint32 iapID = 0;
+	TBool found = EFalse;
+	
+	INFO_PRINTF1(_L("Searching through IAPs"));
+	
+	// Read IAPs until correct one is found or all IAPs are browsed through.
+	while (error == KErrNone)
+		{
+		// Read the IAP name from CommsDat.
+		iapName.FillZ();
+		searchView->ReadTextL(TPtrC(COMMDB_NAME), iapName);
+	    searchView->ReadUintL( TPtrC( COMMDB_ID ), iapID );
+	
+	    INFO_PRINTF3(_L( "IAP (ID = %d): \"%S\""), iapID, &iapName );
+	
+		// Try to match the name with user input.
+		if (iapName.Match(aIAPName) == KErrNone)
+			{
+			searchView->ReadUintL(TPtrC(COMMDB_ID), iIAP);
+	        found = ETrue;
+			}
+	
+		error = searchView->GotoNextRecord();
+		}
+	
+	// CommsDat and search view.
+	CleanupStack::PopAndDestroy(searchView);
+	CleanupStack::PopAndDestroy(commsDat);
+
+	// no IAP found.
+	if (!found)
+		{
+		ERR_PRINTF3(_L("No IAP found with name \"%S\" [%d]"), &aIAPName, error);
+		User::Leave(error);
+		}
+	else
+	    {
+		INFO_PRINTF2(_L("IAP found with ID \"%d\""), iIAP);
+	    }
+	
+	// Construct a CommsDat connection preferences structure.
+	TCommDbConnPref* commDbConnPref = new (ELeave) TCommDbConnPref;
+	
+	// Connection preferences IAP Id, Network Id, Dialog Preference, Direction, Bearer Set
+	// can be set through commDbConnPref.
+	
+	// Set only the values we use and leave rest untouched .
+	commDbConnPref->SetIapId(iIAP);
+	commDbConnPref->SetDialogPreference(ECommDbDialogPrefDoNotPrompt);
+	commDbConnPref->SetBearerSet(KCommDbBearerUnknown);
+	
+	INFO_PRINTF1(_L("Constructed TCommDbConnPref for the IAP ID"));
+	
+	return commDbConnPref;
+	}
+