telephonyserverplugins/simtsy/src/CSimPhoneIMSAuth.cpp
branchopencode
changeset 24 6638e7f4bd8f
parent 0 3553901f7fa8
--- a/telephonyserverplugins/simtsy/src/CSimPhoneIMSAuth.cpp	Mon May 03 13:37:20 2010 +0300
+++ b/telephonyserverplugins/simtsy/src/CSimPhoneIMSAuth.cpp	Thu May 06 15:10:38 2010 +0100
@@ -1,580 +1,580 @@
-// 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:
-// Implements the Phone IMS Authorization/Authentication code.
-// 
-//
-
-/**
- @file
-*/
-
-#include <testconfigfileparser.h>
-#include <etelmmerr.h>
-#include "CSimPhone.h"
-#include "Simlog.h"
-
-//
-// CSimPhoneIMSAuth
-//
-
-CSimPhoneIMSAuth* CSimPhoneIMSAuth::NewL(CSimPhone* aPhone)
-/**
- * Standard two phase constructor.
- * @param aPhone The phone object from which the Phone Smart Card applications will open
- */
-	{
-	CSimPhoneIMSAuth* obj=new(ELeave) CSimPhoneIMSAuth(aPhone);
-	CleanupStack::PushL(obj);
-	obj->ConstructL();
-	CleanupStack::Pop();
-	return obj;
-	}
-
-CSimPhoneIMSAuth::CSimPhoneIMSAuth(CSimPhone* aPhone)
-	: iPhone(aPhone)
-/**
- * Trivial first phase constructor.
- * @param aPhone	The phone object from which this Phone SmartCard App was opened.
- */
-	{}
-
-
-void CSimPhoneIMSAuth::ConstructL()
-/**
-* Second phase of the 2-phase constructor.
-* Constructs all the member data and retrieves all the data from the config file specific to this class.
-*
-* @leave Leaves due to not enough memory or if any data member does not construct for any reason.
-*/
-	{
-	iTimer=CSimTimer::NewL(iPhone);
-	iGetAuthorizationData = new CArrayPtrFlat<CListReadAllAttempt>(1);
-	LOGPHONE1("Starting to parse Phone IMS Authorization/Authentication config params...");
-	ParseAuthorizationInfoL();
-	ParseAuthenticationInfoL();
-	LOGPHONE1("Finished parsing Phone IMS Authorization/Authentication config params...");
-	}
-
-
-CSimPhoneIMSAuth::~CSimPhoneIMSAuth()
-/**
- * Standard destructor.  Any objects created by the ::ConstructL() function
- * will be destroyed here.
- */
-	{
-	delete iTimer;
-	if(iGetAuthorizationData)
-		{
-		iGetAuthorizationData->ResetAndDestroy();
-		}
-	delete iGetAuthorizationData;
-
-	TInt authInfoCount = iAuthorizationInfoList.Count();
-	TInt ii;
-	for(ii = 0; ii < authInfoCount; ii++)
-		{
-		iAuthorizationInfoList[ii].iIMPUArray.Close();
-		}
-	iAuthorizationInfoList.Close();
-
-	iAuthenticationInfoList.Close();
-
-	//RAJ TODO
-	}
-
-
-const CTestConfigSection* CSimPhoneIMSAuth::CfgFile()
-/**
-* Returns a pointer to the config file section
-*
-* @return CTestConfigSection a pointer to the configuration file data section
-*/
-	{
-	LOGPHONE1(">>CSimPhoneIMSAuth::CfgFile");
-	return iPhone->CfgFile();
-	}
-
-void CSimPhoneIMSAuth::TimerCallBack(TInt /*aId*/)
-/**
-* Timer callback function.  When the timer goes off, it will call back into this
-* function for further processing.
-*
-* @param aId an id identifying which timer callback is being called
-*/	
-	{
-	iTimerStarted = EFalse;
-	iCurrentAuthorizationInfo++;
-	if(iAuthInfoChangeNotifyPending)
-		{
-		iAuthInfoChangeNotifyPending = EFalse;
-		iPhone->ReqCompleted(iAuthInfoChangeNotifyReqHandle, KErrNone);
-		}
-	}
-	
-void CSimPhoneIMSAuth::ParseAuthorizationInfoL()
-/**
-* Parses the list of Authorization Info tags from the Config file
-*
-*/
-	{
-	const CTestConfigItem* item=NULL;
-	TInt ret=KErrNone;
-	TPtrC8 IMPI, IMPUValue, HNDN;
-	TInt IMPUCount, authorizationDataSource, infoChangeDelay;
-	TAuthorizationInfo authorizationInfo;
-	
-	LOGPHONE1("Starting to Parse IMS Authorization Info");
-	TInt count = CfgFile()->ItemCount(KAuthorizationInfo);
-	
-	TInt index;
-	for(index=0;index<count;index++)
-		{
-		item=CfgFile()->Item(KAuthorizationInfo,index);
-		TInt delimiterNum = 0;
-		if(!item)
-			{
-			break;
-			}
-			
-		//Get the IMPI
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,delimiterNum,IMPI);
-		if(ret!=KErrNone)
-			{
-			LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHORIZATION INFO TAG");
-			continue;
-			}
-		else
-			{
-			authorizationInfo.iIMPI.Copy(IMPI);
-			delimiterNum++;
-			}
-
-		//Get number of elements in the IMPU Array
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,delimiterNum,IMPUCount);
-		if(ret!=KErrNone)
-			{
-			LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHORIZATION INFO TAG");
-			continue;
-			}
-		else
-			{
-			delimiterNum++;
-			RArray<RMobilePhone::TIMPU> IMPUArray;
-			TBool IMPUError = EFalse;
-			
-			//Get the IMPU values
-			TInt ii;
-			for(ii = 0;ii < IMPUCount; ii++)
-				{
-				ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,delimiterNum,IMPUValue);
-				if(ret!=KErrNone)
-					{
-					LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHORIZATION INFO TAG");
-					IMPUError = ETrue;
-					break;
-					}
-				else
-					{
-					IMPUArray.Append(IMPUValue);
-					delimiterNum++;
-					}
-				}
-			
-			if(IMPUError)
-				{
-				LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHORIZATION INFO TAG");
-				continue;
-				}
-			else
-				{
-				authorizationInfo.iIMPUArray = IMPUArray;	
-				}
-			}
-			
-		//Get the HNDN
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,delimiterNum,HNDN);
-		if(ret!=KErrNone)
-			{
-			LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHORIZATION INFO TAG");
-			continue;
-			}
-		else
-			{
-			authorizationInfo.iHomeNetworkDomainName.Copy(HNDN);
-			delimiterNum++;
-			}
-			
-		//Get the Authorization Data Source
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,delimiterNum,authorizationDataSource);
-		if(ret!=KErrNone)
-			{
-			LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHORIZATION INFO TAG");
-			continue;
-			}
-		else
-			{
-			authorizationInfo.iAuthenticationDataSource = 
-				static_cast<RMobilePhone::TAuthorizationDataSource>(authorizationDataSource);
-				
-			delimiterNum++;
-			}
-		
-		//Get the Authorization Info change delay
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,delimiterNum,infoChangeDelay);
-		if(ret!=KErrNone)
-			{
-			LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHORIZATION INFO TAG");
-			continue;
-			}
-		else
-			{
-			authorizationInfo.iInfoChangeDelay = infoChangeDelay;
-			}		
-		
-		iAuthorizationInfoList.Append(authorizationInfo);
-		}//end FOR Loop
-	iCurrentAuthorizationInfo = 0;
-	}
-
-void CSimPhoneIMSAuth::ParseAuthenticationInfoL()
-/**
-* Parses the list of Authentication Info tags from the Config file
-*
-*/
-	{
-	const CTestConfigItem* item=NULL;
-	TInt ret=KErrNone;
-	TPtrC8 AUTN, RAND, RES, IK, CK, AUTS;
-	TInt authErr;
-	TAuthenticationInfo authenticationInfo;
-	
-	LOGPHONE1("Starting to Parse IMS Authentication Info");
-	TInt count = CfgFile()->ItemCount(KAuthenticationInfo);
-	
-	TInt index;
-	for(index=0; index<count; index++)
-		{
-		item=CfgFile()->Item(KAuthenticationInfo,index);
-		if(!item)
-			{
-			break;
-			}
-			
-		//Get the AUTN
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,AUTN);
-		if(ret!=KErrNone)
-			{
-			LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHENTICATION INFO TAG");
-			continue;
-			}
-		else
-			{
-			authenticationInfo.iAUTN.Copy(AUTN);
-			}
-
-		//Get the RAND
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,RAND);
-		if(ret!=KErrNone)
-			{
-			LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHENTICATION INFO TAG");
-			continue;
-			}
-		else
-			{
-			authenticationInfo.iRAND.Copy(RAND);
-			}
-
-		//Get the RES
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,RES);
-		if(ret!=KErrNone)
-			{
-			LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHENTICATION INFO TAG");
-			continue;
-			}
-		else
-			{
-			authenticationInfo.iRES.Copy(RES);
-			}
-		
-		//Get the IK
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,IK);
-		if(ret!=KErrNone)
-			{
-			LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHENTICATION INFO TAG");
-			continue;
-			}
-		else
-			{
-			authenticationInfo.iIK.Copy(IK);
-			}
-
-		//Get the CK
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,CK);
-		if(ret!=KErrNone)
-			{
-			LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHENTICATION INFO TAG");
-			continue;
-			}
-		else
-			{
-			authenticationInfo.iCK.Copy(CK);
-			}
-
-		//Get the AUTS
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,5,AUTS);
-		if(ret!=KErrNone)
-			{
-			LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHENTICATION INFO TAG");
-			continue;
-			}
-		else
-			{
-			authenticationInfo.iAUTS.Copy(AUTS);
-			}
-		
-		//Get authentication error
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,6,authErr);
-		if(ret!=KErrNone)
-			{
-			LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHENTICATION INFO TAG");
-			continue;
-			}
-		else
-			{
-			authenticationInfo.iAuthenticationErr = authErr;
-			}
-		
-		iAuthenticationInfoList.Append(authenticationInfo);	
-		}//end FOR Loop
-	}
-
-TInt CSimPhoneIMSAuth::GetAuthorizationInfoPhase1(const TTsyReqHandle aTsyReqHandle, 
-			RMobilePhone::TClientId* aClientId,TInt* aBufSize)
-	{
-	LOGPHONE1("CSimPhoneIMSAuth::GetAuthorizationInfoPhase1 called");
-	TInt ret(KErrNone);
-	TInt leaveCode(KErrNone);
-	TRAP(leaveCode, ret=ProcessGetAuthorizationInfoPhase1L(aTsyReqHandle, aClientId, aBufSize););
-	if (leaveCode != KErrNone)
-		{
-		iPhone->ReqCompleted(aTsyReqHandle,leaveCode);
-		}
-		
-	return ret;
-	}
-
-
-TInt CSimPhoneIMSAuth::ProcessGetAuthorizationInfoPhase1L(const TTsyReqHandle aTsyReqHandle,
-			RMobilePhone::TClientId* aClientId, TInt* aBufSize)
-	{
-		LOGPHONE1("CSimPhoneIMSAuth::GetAuthorizationInfoPhase1 called");	
-
-	// Store the streamed list and the client ID
-	CListReadAllAttempt* read=CListReadAllAttempt::NewL(*aClientId,aTsyReqHandle);
-	CleanupStack::PushL(read);
-	
-	RMobilePhone::CImsAuthorizationInfoV5* iAuthInfo = RMobilePhone::CImsAuthorizationInfoV5::NewL();
-    CleanupStack::PushL(iAuthInfo);
-
-	// Check that the data structure is supported by the simulated TSY version
-	TInt err = iPhone->CheckSimTsyVersion(*iAuthInfo);
-	if(err != KErrNone)
-		{
-		iPhone->ReqCompleted(aTsyReqHandle, err);
-        CleanupStack::PopAndDestroy(2, read); // iAuthInfo, read		
-		return KErrNone;
-		}
-
-	iAuthInfo->iIMPI = iAuthorizationInfoList[iCurrentAuthorizationInfo].iIMPI;
-
-	TInt IMPUCount = iAuthorizationInfoList[iCurrentAuthorizationInfo].iIMPUArray.Count();
-	TInt index;
-	for(index = 0; index < IMPUCount; index++)
-		{
-		iAuthInfo->iIMPUArray.Append(iAuthorizationInfoList[iCurrentAuthorizationInfo].iIMPUArray[index]);
-		}
-
-	iAuthInfo->iHomeNetworkDomainName = 
-		iAuthorizationInfoList[iCurrentAuthorizationInfo].iHomeNetworkDomainName;
-	iAuthInfo->iAuthenticationDataSource = 
-		iAuthorizationInfoList[iCurrentAuthorizationInfo].iAuthenticationDataSource;
-	
-	HBufC8* iBuff=NULL;
-	iAuthInfo->ExternalizeL(iBuff);
-    CleanupStack::PopAndDestroy(iAuthInfo);	
-	CleanupDeletePushL(iBuff);
-		
-	CBufFlat* buf=CBufFlat::NewL(iBuff->Length());
-	CleanupStack::PushL(buf);
-	buf->InsertL(0,*iBuff);	
-	
-	read->iListBuf = buf;
-	CleanupStack::Pop(buf);	
-	CleanupStack::PopAndDestroy(iBuff);
-	
-	iGetAuthorizationData->AppendL(read);
-    CleanupStack::Pop(read);
-	
-	// return the CBufBase’s size to client
-	*aBufSize=(read->iListBuf)->Size();
-	
-	// Complete first phase of list retrieval
-	iPhone->ReqCompleted(aTsyReqHandle,KErrNone);
-	return KErrNone;
-	
-	}
-
-
-TInt CSimPhoneIMSAuth::GetAuthorizationInfoPhase2(const TTsyReqHandle aTsyReqHandle,
-			RMobilePhone::TClientId* aClientId, TDes8* aBuffer)
-	{
-	LOGPHONE1("CSimPhoneIMSAuth::GetAuthorizationInfoPhase2 called");	
-	CListReadAllAttempt* read=NULL;
-
-	// Find the get Authorization Info attempt from this client
-	TInt index;
-	for (index = 0; index < iGetAuthorizationData->Count(); index++)
-		{
-		read = iGetAuthorizationData->At(index);
-		if ((read->iClient.iSessionHandle==aClientId->iSessionHandle) &&
-		    (read->iClient.iSubSessionHandle==aClientId->iSubSessionHandle))
-			{
-			TPtr8 bufPtr((read->iListBuf)->Ptr(0));
-			// Copy the streamed list to the client
-			aBuffer->Copy(bufPtr);
-			delete read;
-			iGetAuthorizationData->Delete(index);
-			iPhone->ReqCompleted(aTsyReqHandle,KErrNone);
-			return KErrNone;
-			}
-		}
-	iPhone->ReqCompleted(aTsyReqHandle,KErrBadHandle);
-	return KErrNone;	
-	}
-
-
-TInt CSimPhoneIMSAuth::GetAuthorizationInfoCancel(const TTsyReqHandle aTsyReqHandle)
-	{
-	LOGPHONE1("CSimPhoneIMSAuth::GetAuthorizationInfoCancel called");
-
-	// Remove the read all attempt from iGetAuthorizationData
-	CListReadAllAttempt* read=NULL;
-	TInt index;
-	for (index = 0; index <iGetAuthorizationData->Count(); index++)
-		{
-		read = iGetAuthorizationData->At(index);
-		if (read->iReqHandle == aTsyReqHandle)
-			{
-			delete read;
-			iGetAuthorizationData->Delete(index);
-			break;
-			}
-		}
-		
-	iPhone->ReqCompleted(aTsyReqHandle,KErrCancel);
-	return KErrNone;
-	}
-
-
-TInt CSimPhoneIMSAuth::NotifyImsAuthorizationInfoChanged(const TTsyReqHandle aTsyReqHandle)
-	{
-	LOGPHONE1("CSimPhoneIMSAuth::NotifyImsAuthorizationInfoChanged called");
-	__ASSERT_ALWAYS(!iAuthInfoChangeNotifyPending,SimPanic(ENotificationReqAlreadyOutstanding));
-
-	TInt count=iAuthorizationInfoList.Count();
-	if(iCurrentAuthorizationInfo < count)
-		{
-		iTimer->Start(iAuthorizationInfoList[iCurrentAuthorizationInfo].iInfoChangeDelay,this);
-		iTimerStarted = ETrue;
-		}
-
-	iAuthInfoChangeNotifyPending=ETrue;
-	iAuthInfoChangeNotifyReqHandle = aTsyReqHandle;		
-
-	return KErrNone;
-	}
-
-
-TInt CSimPhoneIMSAuth::NotifyImsAuthorizationInfoChangedCancel(const TTsyReqHandle aTsyReqHandle)
-	{
-	LOGPHONE1("CSimPhoneIMSAuth::NotifyImsAuthorizationInfoChangedCancel called");
-	if(iAuthInfoChangeNotifyPending)
-		{
-		if(iTimerStarted)
-			{
-			iTimer->Cancel();
-			}
-
-		iAuthInfoChangeNotifyPending=EFalse;
-		iPhone->ReqCompleted(aTsyReqHandle, KErrCancel);
-		}
-
-	return KErrNone;
-	}
-
-
-TInt CSimPhoneIMSAuth::GetAuthenticationData(const TTsyReqHandle aTsyReqHandle,TDes8* aAuthenticationData)
-	{
-	LOGPHONE1("CSimPhoneIMSAuth::AuthentificationData called");
-
-	RMobilePhone::TImsAuthenticateDataV5Pckg* authenticateDataPckgd =
-			(RMobilePhone::TImsAuthenticateDataV5Pckg*)aAuthenticationData;
-	RMobilePhone::TImsAuthenticateDataV5& authenticateData=(*authenticateDataPckgd)();
-
-	// Check that the data structure is supported by the simulated TSY version
-	TInt err = iPhone->CheckSimTsyVersion(authenticateData);
-	if(err != KErrNone)
-		{
-		iPhone->ReqCompleted(aTsyReqHandle, err);
-		return KErrNone;
-		}
-
-	TInt index;
-	for(index = 0; index < iAuthenticationInfoList.Count(); index++)
-		{
-		if(authenticateData.iAUTN == iAuthenticationInfoList[index].iAUTN &&
-			authenticateData.iRAND == iAuthenticationInfoList[index].iRAND)
-			{
-			TInt ret = iAuthenticationInfoList[index].iAuthenticationErr;
-			if(ret != KErrNone)
-				{
-				//return the AUTS and blank everything else
-				authenticateData.iAUTS = iAuthenticationInfoList[index].iAUTS;
-				authenticateData.iRES = _L8("");
-				authenticateData.iIK = _L8("");
-				authenticateData.iCK = _L8("");
-				}
-			else
-				{
-				authenticateData.iRES = iAuthenticationInfoList[index].iRES;
-				authenticateData.iIK = iAuthenticationInfoList[index].iIK;
-				authenticateData.iCK = iAuthenticationInfoList[index].iCK;
-				}
-
-			iPhone->ReqCompleted(aTsyReqHandle, ret);
-			return KErrNone;
-			}
-		}
-
-	iPhone->ReqCompleted(aTsyReqHandle, KErrCorrupt);
-	return KErrNone;
-	}
-
-
-TInt CSimPhoneIMSAuth::GetAuthenticationDataCancel(const TTsyReqHandle aTsyReqHandle)
-	{
-	LOGPHONE1("CSimPhoneIMSAuth::AuthentificationDatCancel called");	
-	iPhone->ReqCompleted(aTsyReqHandle, KErrCancel);
-	return KErrNone;
-	}
+// 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:
+// Implements the Phone IMS Authorization/Authentication code.
+// 
+//
+
+/**
+ @file
+*/
+
+#include <testconfigfileparser.h>
+#include <etelmmerr.h>
+#include "CSimPhone.h"
+#include "Simlog.h"
+
+//
+// CSimPhoneIMSAuth
+//
+
+CSimPhoneIMSAuth* CSimPhoneIMSAuth::NewL(CSimPhone* aPhone)
+/**
+ * Standard two phase constructor.
+ * @param aPhone The phone object from which the Phone Smart Card applications will open
+ */
+	{
+	CSimPhoneIMSAuth* obj=new(ELeave) CSimPhoneIMSAuth(aPhone);
+	CleanupStack::PushL(obj);
+	obj->ConstructL();
+	CleanupStack::Pop();
+	return obj;
+	}
+
+CSimPhoneIMSAuth::CSimPhoneIMSAuth(CSimPhone* aPhone)
+	: iPhone(aPhone)
+/**
+ * Trivial first phase constructor.
+ * @param aPhone	The phone object from which this Phone SmartCard App was opened.
+ */
+	{}
+
+
+void CSimPhoneIMSAuth::ConstructL()
+/**
+* Second phase of the 2-phase constructor.
+* Constructs all the member data and retrieves all the data from the config file specific to this class.
+*
+* @leave Leaves due to not enough memory or if any data member does not construct for any reason.
+*/
+	{
+	iTimer=CSimTimer::NewL(iPhone);
+	iGetAuthorizationData = new CArrayPtrFlat<CListReadAllAttempt>(1);
+	LOGPHONE1("Starting to parse Phone IMS Authorization/Authentication config params...");
+	ParseAuthorizationInfoL();
+	ParseAuthenticationInfoL();
+	LOGPHONE1("Finished parsing Phone IMS Authorization/Authentication config params...");
+	}
+
+
+CSimPhoneIMSAuth::~CSimPhoneIMSAuth()
+/**
+ * Standard destructor.  Any objects created by the ::ConstructL() function
+ * will be destroyed here.
+ */
+	{
+	delete iTimer;
+	if(iGetAuthorizationData)
+		{
+		iGetAuthorizationData->ResetAndDestroy();
+		}
+	delete iGetAuthorizationData;
+
+	TInt authInfoCount = iAuthorizationInfoList.Count();
+	TInt ii;
+	for(ii = 0; ii < authInfoCount; ii++)
+		{
+		iAuthorizationInfoList[ii].iIMPUArray.Close();
+		}
+	iAuthorizationInfoList.Close();
+
+	iAuthenticationInfoList.Close();
+
+	//RAJ TODO
+	}
+
+
+const CTestConfigSection* CSimPhoneIMSAuth::CfgFile()
+/**
+* Returns a pointer to the config file section
+*
+* @return CTestConfigSection a pointer to the configuration file data section
+*/
+	{
+	LOGPHONE1(">>CSimPhoneIMSAuth::CfgFile");
+	return iPhone->CfgFile();
+	}
+
+void CSimPhoneIMSAuth::TimerCallBack(TInt /*aId*/)
+/**
+* Timer callback function.  When the timer goes off, it will call back into this
+* function for further processing.
+*
+* @param aId an id identifying which timer callback is being called
+*/	
+	{
+	iTimerStarted = EFalse;
+	iCurrentAuthorizationInfo++;
+	if(iAuthInfoChangeNotifyPending)
+		{
+		iAuthInfoChangeNotifyPending = EFalse;
+		iPhone->ReqCompleted(iAuthInfoChangeNotifyReqHandle, KErrNone);
+		}
+	}
+	
+void CSimPhoneIMSAuth::ParseAuthorizationInfoL()
+/**
+* Parses the list of Authorization Info tags from the Config file
+*
+*/
+	{
+	const CTestConfigItem* item=NULL;
+	TInt ret=KErrNone;
+	TPtrC8 IMPI, IMPUValue, HNDN;
+	TInt IMPUCount, authorizationDataSource, infoChangeDelay;
+	TAuthorizationInfo authorizationInfo;
+	
+	LOGPHONE1("Starting to Parse IMS Authorization Info");
+	TInt count = CfgFile()->ItemCount(KAuthorizationInfo);
+	
+	TInt index;
+	for(index=0;index<count;index++)
+		{
+		item=CfgFile()->Item(KAuthorizationInfo,index);
+		TInt delimiterNum = 0;
+		if(!item)
+			{
+			break;
+			}
+			
+		//Get the IMPI
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,delimiterNum,IMPI);
+		if(ret!=KErrNone)
+			{
+			LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHORIZATION INFO TAG");
+			continue;
+			}
+		else
+			{
+			authorizationInfo.iIMPI.Copy(IMPI);
+			delimiterNum++;
+			}
+
+		//Get number of elements in the IMPU Array
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,delimiterNum,IMPUCount);
+		if(ret!=KErrNone)
+			{
+			LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHORIZATION INFO TAG");
+			continue;
+			}
+		else
+			{
+			delimiterNum++;
+			RArray<RMobilePhone::TIMPU> IMPUArray;
+			TBool IMPUError = EFalse;
+			
+			//Get the IMPU values
+			TInt ii;
+			for(ii = 0;ii < IMPUCount; ii++)
+				{
+				ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,delimiterNum,IMPUValue);
+				if(ret!=KErrNone)
+					{
+					LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHORIZATION INFO TAG");
+					IMPUError = ETrue;
+					break;
+					}
+				else
+					{
+					IMPUArray.Append(IMPUValue);
+					delimiterNum++;
+					}
+				}
+			
+			if(IMPUError)
+				{
+				LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHORIZATION INFO TAG");
+				continue;
+				}
+			else
+				{
+				authorizationInfo.iIMPUArray = IMPUArray;	
+				}
+			}
+			
+		//Get the HNDN
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,delimiterNum,HNDN);
+		if(ret!=KErrNone)
+			{
+			LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHORIZATION INFO TAG");
+			continue;
+			}
+		else
+			{
+			authorizationInfo.iHomeNetworkDomainName.Copy(HNDN);
+			delimiterNum++;
+			}
+			
+		//Get the Authorization Data Source
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,delimiterNum,authorizationDataSource);
+		if(ret!=KErrNone)
+			{
+			LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHORIZATION INFO TAG");
+			continue;
+			}
+		else
+			{
+			authorizationInfo.iAuthenticationDataSource = 
+				static_cast<RMobilePhone::TAuthorizationDataSource>(authorizationDataSource);
+				
+			delimiterNum++;
+			}
+		
+		//Get the Authorization Info change delay
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,delimiterNum,infoChangeDelay);
+		if(ret!=KErrNone)
+			{
+			LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHORIZATION INFO TAG");
+			continue;
+			}
+		else
+			{
+			authorizationInfo.iInfoChangeDelay = infoChangeDelay;
+			}		
+		
+		iAuthorizationInfoList.Append(authorizationInfo);
+		}//end FOR Loop
+	iCurrentAuthorizationInfo = 0;
+	}
+
+void CSimPhoneIMSAuth::ParseAuthenticationInfoL()
+/**
+* Parses the list of Authentication Info tags from the Config file
+*
+*/
+	{
+	const CTestConfigItem* item=NULL;
+	TInt ret=KErrNone;
+	TPtrC8 AUTN, RAND, RES, IK, CK, AUTS;
+	TInt authErr;
+	TAuthenticationInfo authenticationInfo;
+	
+	LOGPHONE1("Starting to Parse IMS Authentication Info");
+	TInt count = CfgFile()->ItemCount(KAuthenticationInfo);
+	
+	TInt index;
+	for(index=0; index<count; index++)
+		{
+		item=CfgFile()->Item(KAuthenticationInfo,index);
+		if(!item)
+			{
+			break;
+			}
+			
+		//Get the AUTN
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,AUTN);
+		if(ret!=KErrNone)
+			{
+			LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHENTICATION INFO TAG");
+			continue;
+			}
+		else
+			{
+			authenticationInfo.iAUTN.Copy(AUTN);
+			}
+
+		//Get the RAND
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,RAND);
+		if(ret!=KErrNone)
+			{
+			LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHENTICATION INFO TAG");
+			continue;
+			}
+		else
+			{
+			authenticationInfo.iRAND.Copy(RAND);
+			}
+
+		//Get the RES
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,RES);
+		if(ret!=KErrNone)
+			{
+			LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHENTICATION INFO TAG");
+			continue;
+			}
+		else
+			{
+			authenticationInfo.iRES.Copy(RES);
+			}
+		
+		//Get the IK
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,IK);
+		if(ret!=KErrNone)
+			{
+			LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHENTICATION INFO TAG");
+			continue;
+			}
+		else
+			{
+			authenticationInfo.iIK.Copy(IK);
+			}
+
+		//Get the CK
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,CK);
+		if(ret!=KErrNone)
+			{
+			LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHENTICATION INFO TAG");
+			continue;
+			}
+		else
+			{
+			authenticationInfo.iCK.Copy(CK);
+			}
+
+		//Get the AUTS
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,5,AUTS);
+		if(ret!=KErrNone)
+			{
+			LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHENTICATION INFO TAG");
+			continue;
+			}
+		else
+			{
+			authenticationInfo.iAUTS.Copy(AUTS);
+			}
+		
+		//Get authentication error
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,6,authErr);
+		if(ret!=KErrNone)
+			{
+			LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHENTICATION INFO TAG");
+			continue;
+			}
+		else
+			{
+			authenticationInfo.iAuthenticationErr = authErr;
+			}
+		
+		iAuthenticationInfoList.Append(authenticationInfo);	
+		}//end FOR Loop
+	}
+
+TInt CSimPhoneIMSAuth::GetAuthorizationInfoPhase1(const TTsyReqHandle aTsyReqHandle, 
+			RMobilePhone::TClientId* aClientId,TInt* aBufSize)
+	{
+	LOGPHONE1("CSimPhoneIMSAuth::GetAuthorizationInfoPhase1 called");
+	TInt ret(KErrNone);
+	TInt leaveCode(KErrNone);
+	TRAP(leaveCode, ret=ProcessGetAuthorizationInfoPhase1L(aTsyReqHandle, aClientId, aBufSize););
+	if (leaveCode != KErrNone)
+		{
+		iPhone->ReqCompleted(aTsyReqHandle,leaveCode);
+		}
+		
+	return ret;
+	}
+
+
+TInt CSimPhoneIMSAuth::ProcessGetAuthorizationInfoPhase1L(const TTsyReqHandle aTsyReqHandle,
+			RMobilePhone::TClientId* aClientId, TInt* aBufSize)
+	{
+		LOGPHONE1("CSimPhoneIMSAuth::GetAuthorizationInfoPhase1 called");	
+
+	// Store the streamed list and the client ID
+	CListReadAllAttempt* read=CListReadAllAttempt::NewL(*aClientId,aTsyReqHandle);
+	CleanupStack::PushL(read);
+	
+	RMobilePhone::CImsAuthorizationInfoV5* iAuthInfo = RMobilePhone::CImsAuthorizationInfoV5::NewL();
+    CleanupStack::PushL(iAuthInfo);
+
+	// Check that the data structure is supported by the simulated TSY version
+	TInt err = iPhone->CheckSimTsyVersion(*iAuthInfo);
+	if(err != KErrNone)
+		{
+		iPhone->ReqCompleted(aTsyReqHandle, err);
+        CleanupStack::PopAndDestroy(2, read); // iAuthInfo, read		
+		return KErrNone;
+		}
+
+	iAuthInfo->iIMPI = iAuthorizationInfoList[iCurrentAuthorizationInfo].iIMPI;
+
+	TInt IMPUCount = iAuthorizationInfoList[iCurrentAuthorizationInfo].iIMPUArray.Count();
+	TInt index;
+	for(index = 0; index < IMPUCount; index++)
+		{
+		iAuthInfo->iIMPUArray.Append(iAuthorizationInfoList[iCurrentAuthorizationInfo].iIMPUArray[index]);
+		}
+
+	iAuthInfo->iHomeNetworkDomainName = 
+		iAuthorizationInfoList[iCurrentAuthorizationInfo].iHomeNetworkDomainName;
+	iAuthInfo->iAuthenticationDataSource = 
+		iAuthorizationInfoList[iCurrentAuthorizationInfo].iAuthenticationDataSource;
+	
+	HBufC8* iBuff=NULL;
+	iAuthInfo->ExternalizeL(iBuff);
+    CleanupStack::PopAndDestroy(iAuthInfo);	
+	CleanupDeletePushL(iBuff);
+		
+	CBufFlat* buf=CBufFlat::NewL(iBuff->Length());
+	CleanupStack::PushL(buf);
+	buf->InsertL(0,*iBuff);	
+	
+	read->iListBuf = buf;
+	CleanupStack::Pop(buf);	
+	CleanupStack::PopAndDestroy(iBuff);
+	
+	iGetAuthorizationData->AppendL(read);
+    CleanupStack::Pop(read);
+	
+	// return the CBufBase’s size to client
+	*aBufSize=(read->iListBuf)->Size();
+	
+	// Complete first phase of list retrieval
+	iPhone->ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	
+	}
+
+
+TInt CSimPhoneIMSAuth::GetAuthorizationInfoPhase2(const TTsyReqHandle aTsyReqHandle,
+			RMobilePhone::TClientId* aClientId, TDes8* aBuffer)
+	{
+	LOGPHONE1("CSimPhoneIMSAuth::GetAuthorizationInfoPhase2 called");	
+	CListReadAllAttempt* read=NULL;
+
+	// Find the get Authorization Info attempt from this client
+	TInt index;
+	for (index = 0; index < iGetAuthorizationData->Count(); index++)
+		{
+		read = iGetAuthorizationData->At(index);
+		if ((read->iClient.iSessionHandle==aClientId->iSessionHandle) &&
+		    (read->iClient.iSubSessionHandle==aClientId->iSubSessionHandle))
+			{
+			TPtr8 bufPtr((read->iListBuf)->Ptr(0));
+			// Copy the streamed list to the client
+			aBuffer->Copy(bufPtr);
+			delete read;
+			iGetAuthorizationData->Delete(index);
+			iPhone->ReqCompleted(aTsyReqHandle,KErrNone);
+			return KErrNone;
+			}
+		}
+	iPhone->ReqCompleted(aTsyReqHandle,KErrBadHandle);
+	return KErrNone;	
+	}
+
+
+TInt CSimPhoneIMSAuth::GetAuthorizationInfoCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGPHONE1("CSimPhoneIMSAuth::GetAuthorizationInfoCancel called");
+
+	// Remove the read all attempt from iGetAuthorizationData
+	CListReadAllAttempt* read=NULL;
+	TInt index;
+	for (index = 0; index <iGetAuthorizationData->Count(); index++)
+		{
+		read = iGetAuthorizationData->At(index);
+		if (read->iReqHandle == aTsyReqHandle)
+			{
+			delete read;
+			iGetAuthorizationData->Delete(index);
+			break;
+			}
+		}
+		
+	iPhone->ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+
+
+TInt CSimPhoneIMSAuth::NotifyImsAuthorizationInfoChanged(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGPHONE1("CSimPhoneIMSAuth::NotifyImsAuthorizationInfoChanged called");
+	__ASSERT_ALWAYS(!iAuthInfoChangeNotifyPending,SimPanic(ENotificationReqAlreadyOutstanding));
+
+	TInt count=iAuthorizationInfoList.Count();
+	if(iCurrentAuthorizationInfo < count)
+		{
+		iTimer->Start(iAuthorizationInfoList[iCurrentAuthorizationInfo].iInfoChangeDelay,this);
+		iTimerStarted = ETrue;
+		}
+
+	iAuthInfoChangeNotifyPending=ETrue;
+	iAuthInfoChangeNotifyReqHandle = aTsyReqHandle;		
+
+	return KErrNone;
+	}
+
+
+TInt CSimPhoneIMSAuth::NotifyImsAuthorizationInfoChangedCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGPHONE1("CSimPhoneIMSAuth::NotifyImsAuthorizationInfoChangedCancel called");
+	if(iAuthInfoChangeNotifyPending)
+		{
+		if(iTimerStarted)
+			{
+			iTimer->Cancel();
+			}
+
+		iAuthInfoChangeNotifyPending=EFalse;
+		iPhone->ReqCompleted(aTsyReqHandle, KErrCancel);
+		}
+
+	return KErrNone;
+	}
+
+
+TInt CSimPhoneIMSAuth::GetAuthenticationData(const TTsyReqHandle aTsyReqHandle,TDes8* aAuthenticationData)
+	{
+	LOGPHONE1("CSimPhoneIMSAuth::AuthentificationData called");
+
+	RMobilePhone::TImsAuthenticateDataV5Pckg* authenticateDataPckgd =
+			(RMobilePhone::TImsAuthenticateDataV5Pckg*)aAuthenticationData;
+	RMobilePhone::TImsAuthenticateDataV5& authenticateData=(*authenticateDataPckgd)();
+
+	// Check that the data structure is supported by the simulated TSY version
+	TInt err = iPhone->CheckSimTsyVersion(authenticateData);
+	if(err != KErrNone)
+		{
+		iPhone->ReqCompleted(aTsyReqHandle, err);
+		return KErrNone;
+		}
+
+	TInt index;
+	for(index = 0; index < iAuthenticationInfoList.Count(); index++)
+		{
+		if(authenticateData.iAUTN == iAuthenticationInfoList[index].iAUTN &&
+			authenticateData.iRAND == iAuthenticationInfoList[index].iRAND)
+			{
+			TInt ret = iAuthenticationInfoList[index].iAuthenticationErr;
+			if(ret != KErrNone)
+				{
+				//return the AUTS and blank everything else
+				authenticateData.iAUTS = iAuthenticationInfoList[index].iAUTS;
+				authenticateData.iRES = _L8("");
+				authenticateData.iIK = _L8("");
+				authenticateData.iCK = _L8("");
+				}
+			else
+				{
+				authenticateData.iRES = iAuthenticationInfoList[index].iRES;
+				authenticateData.iIK = iAuthenticationInfoList[index].iIK;
+				authenticateData.iCK = iAuthenticationInfoList[index].iCK;
+				}
+
+			iPhone->ReqCompleted(aTsyReqHandle, ret);
+			return KErrNone;
+			}
+		}
+
+	iPhone->ReqCompleted(aTsyReqHandle, KErrCorrupt);
+	return KErrNone;
+	}
+
+
+TInt CSimPhoneIMSAuth::GetAuthenticationDataCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGPHONE1("CSimPhoneIMSAuth::AuthentificationDatCancel called");	
+	iPhone->ReqCompleted(aTsyReqHandle, KErrCancel);
+	return KErrNone;
+	}