telephonyserverplugins/simtsy/src/CSimPacketService.cpp
branchopencode
changeset 24 6638e7f4bd8f
parent 0 3553901f7fa8
--- a/telephonyserverplugins/simtsy/src/CSimPacketService.cpp	Mon May 03 13:37:20 2010 +0300
+++ b/telephonyserverplugins/simtsy/src/CSimPacketService.cpp	Thu May 06 15:10:38 2010 +0100
@@ -1,3931 +1,3931 @@
-// 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 "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:
-// implementattion for CSimPacketService Class
-// This file contains the implementation of the Similator TSY Packet Service functionality.  
-// CSimPacketService class provides a simulated packet-switched connection to a packet 
-// (GPRS and CDMA) network.
-// 
-//
-
-/**
- @file
-*/
-
-#include "CSimPacketService.h"
-#include "Simlog.h"
-#include <pcktcs.h>
-#include "CSimPhone.h"
-#include "utils.h"
-#include "CSimPacketContext.h"
-#include "CSimPubSubChange.h"
-
-
-#include "CSimIncomingContextManager.h"
-
-
-_LIT(KApn, "ACME INTERNET PROVIDERS LTD");
-_LIT(KProtocolAddress, "i-MODE GATEWAY");
-_LIT(KUsername, "USER1");
-_LIT(KPassword, "PASSWORD1");
-_LIT(KChallenge, "CHALLENGE1");
-_LIT(KResponse, "RESPONSE1");
-_LIT(KPrimaryDNS, "PRIMARYSERVER1");
-_LIT(KSecondaryDNS, "SECONDARYSERVER1");
-
-
-// enum for caps
-const TUint KPacketServiceCaps=(RPacketService::KCapsSuspendSupported |
-								RPacketService::KCapsMSClassSupported |
-								RPacketService::KCapsCDMA2000HighSpeedDataSupported |
-								RPacketService::KCapsNetworkAvailabilitySupported |
-								RPacketService::KCapsProtocolPPPSupported |
-								RPacketService::KCapsHSDPASupported |
-								RPacketService::KCapsEGPRSSupported |
-								RPacketService::KCapsHSUPASupported );
-								 
-CSimPacketService* CSimPacketService::NewL(CSimPhone* aPhone)
-/**
-* Standard two phase constructor
-*
-* @param aPhone Pointer to the phone object (CSimPhone)
-* @return CSimPacketService pointer to the packet service object created.
-* @leave Leaves if no memory or object is not created for any reason.
-*/
-	{
-	CSimPacketService* simPacket=new(ELeave) CSimPacketService(aPhone);
-	CleanupStack::PushL(simPacket);
-	simPacket->ConstructL();
-	CleanupStack::Pop();
-	return simPacket;
-	}
-
-void CSimPacketService::Init()
-	{}
-
-CSimPacketService::CSimPacketService(CSimPhone* aPhone)
-	: iPhone(aPhone), iContextCount(0), iPrimaryContextNameInc(0),
-	  iSecondaryContextNameInc(0), iAttachMode(RPacketService::EAttachWhenNeeded),
-	  iCurrentEvent(EPacketEventNone), iPacketReleaseModeIndex(0), 
-	  iPcktTimerBool(EFalse), iCurrentPrimaryContextIndex(0)
-/**
-* Trivial Constructor.  Initialises all the data members
-*
-* @param aPhone pointer to the phone object that owns this class.
-*/
-	{
-	iState=RPacketService::EStatusUnattached;
-	iMSClass = RPacketService::EMSClassSuspensionRequired;
-	iNotifyStatusChange.iNotifyPending = EFalse;		
-	iNotifyContextAdded.iNotifyPending = EFalse;
-	iNotifyChangeOfNtwk.iNotifyPending = EFalse;
-	iNotifyMSClassChange.iNotifyPending = EFalse;
-	iNotifyChangeOfReleaseMode.iNotifyPending=EFalse;
-	iNotifyChangeOfAttachMode.iNotifyPending=EFalse;
-	iNotifyDynamicCapsChange.iNotifyPending = EFalse;
-	iNotifyMbmsNetworkStatusChange.iNotifyPending = EFalse;
-	iNotifyMbmsServAvailChange.iNotifyPending = EFalse;
-	iSecondaryContext = EFalse;
-	}
-
-
-void CSimPacketService::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 no memory or any data member does not construct for any reason.
-* @panic Panics with SIMTSY EInvalidParameterFormatInConfigFile if an additional param data item is in an invalid format
-*/
-	{
-	LOGPACKET1("CSimPacketService: Entered ConstructL()");
-	
-	iTimer = CSimTimer::NewL(iPhone);
-	iPcktRegTimer = CSimTimer::NewL(iPhone);
-	iNtwkRegTimer = CSimTimer::NewL(iPhone);
-	iReleaseModeTimer = CSimTimer::NewL(iPhone);
-	iDynamicCapsTimer = CSimTimer::NewL(iPhone);
-	iMbmsPcktTimer = CSimTimer::NewL(iPhone);
-	iMutex.CreateGlobal(KNullDesC, EOwnerProcess);
-	
-	iNtwkRegStatusInfo = new(ELeave) CArrayFixFlat<TNtwkRegStatus>(KGranularity);
-	iPcktRegStatusInfo=new(ELeave) CArrayFixFlat<TPacketRegStatus>(KGranularity);
-	iPacketReleaseModeArray=new (ELeave) CArrayFixFlat<TPacketReleaseMode>(KGranularity);
-	iDynamicCapsArray = new (ELeave) CArrayFixFlat<TPacketDynamicCaps>(KGranularity);
-	iSecondaryContextCountArray = new(ELeave)CArrayFixFlat<TInt>(KGranularity);
-	iMbmsBroadcastParamsArray = new(ELeave)CArrayFixFlat<TMbmsBroadCastParams>(KGranularity);
-	iMbmsMonitorListParamsArray = new(ELeave)CArrayFixFlat<TMbmsMonitorListParams>(KGranularity);
-	iMbmsServicesList = new CArrayPtrFlat<CPcktListReadAllAttempt>(1);
-	
-	iNtwkRegStatusChangeProperty = CSimPubSub::TPubSubProperty(KUidPSSimTsyCategory, KPSSimtsyPacketServiceNtwkRegStatusChange, KPSSimtsyPacketServiceNtwkRegStatusChangeKeyType);
-	iNtwkRegStatusChange =  CSimPubSub::NewL(this,iNtwkRegStatusChangeProperty);
-	iNtwkRegStatusChange->Start(); 
-	
-	iMbmsActivation = CSimPubSubChange::NewL(this,CSimPubSub::TPubSubProperty(KUidPSSimTsyCategory, KPSSimTsyMbmsService, KPSSimTsyMbmsServiceType));
-
-	const CTestConfigItem* item=NULL;
-	TInt ret=KErrNone;
-	
-	item=CfgFile()->Item(KAttachPauseDuration); //< Retrieves the attach pause duration number from the config file
-	if(item)
-		{
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,iAttachPause);
-		if(ret!=KErrNone)
-			iAttachPause = KDefaultPauseDuration;
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,iAttachFail);
-		if(ret==KErrNotFound)
-			iAttachFail = KErrNone;
-		}
-
-	item=CfgFile()->Item(KDetachPauseDuration);	//< Retrieves the detach pause duration number from the config file
-	if(item)
-		{
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,iDetachPause);
-		if(ret!=KErrNone)
-			iDetachPause = KDefaultPauseDuration;
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,iDetachFail);
-		if(ret==KErrNotFound)
-			iDetachFail = KErrNone;
-		}
-
-	TInt count=CfgFile()->ItemCount(KPacketRegStatus); //< Retrieves the packet registration info
-	item=NULL;
-	TInt i;
-	for(i=0;i<count;i++)
-		{
-		item=CfgFile()->Item(KPacketRegStatus,i);
-		if(!item)
-			break;
-
-		TInt time,regState;
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,time);
-		if(ret!=KErrNone)
-			break;
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,regState);
-		if(ret!=KErrNone)
-			break;
-
-		TPacketRegStatus status;
-		status.iDuration=time;
-		status.iStatus=(RPacketService::TStatus)regState;
-		TRAP_IGNORE(iPcktRegStatusInfo->AppendL(status));
-		}
-
-	iNtwkRegStatusNotificationType = ETimer;
-	item=CfgFile()->Item(KNetworkRegStatusType);
-	if(item)
-		{
-		TPtrC8 networkRegStatusType;
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,networkRegStatusType);
-		if(ret==KErrNone && networkRegStatusType.Compare(KNotificationTypePublishSubscribe)==0)
-			{
-			iNtwkRegStatusNotificationType = EPublishAndSubscribe;
-			}
-		}
-
-	count=CfgFile()->ItemCount(KNetworkRegStatus); //< Retrieves the packet registration info
-	item=NULL;
-	for(i=0;i<count;i++)
-		{
-		item=CfgFile()->Item(KNetworkRegStatus,i);
-		if(!item)
-			break;
-
-		TInt time,regState;
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,time);
-		if(ret!=KErrNone)
-			break;
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,regState);
-		if(ret!=KErrNone)
-			break;
-
-		TNtwkRegStatus status;
-		status.iDuration=time;
-		status.iRegStatus=(RPacketService::TRegistrationStatus)regState;
-		TRAP_IGNORE(iNtwkRegStatusInfo->AppendL(status));
-		}
-
-	if(iPcktRegStatusInfo->Count()!=0)
-		{
-		iPcktRegStatIndex=0;
-		iState=(RPacketService::TStatus)iPcktRegStatusInfo->At(0).iStatus;
-		iPcktRegTimer->Start(iPcktRegStatusInfo->At(0).iDuration,this,ETimerIdPcktServPacket);
-		}
-
-	if(iNtwkRegStatusInfo->Count()!=0)
-		{
-		iCurrentRegStatus=(RPacketService::TRegistrationStatus)iNtwkRegStatusInfo->At(0).iRegStatus;
-		if (iNtwkRegStatusNotificationType == ETimer)
-			{
-			iNtwkRegStatIndex=0;
-			iNtwkRegTimer->Start(iNtwkRegStatusInfo->At(0).iDuration,this,ETimerIdPcktServNtwkStatusChange);
-			}
-		}
-
-	//< Read in all dynamic capabilities data
-	count = CfgFile()->ItemCount(KDynamicCaps);
-	item = NULL;
-	for (i = 0; i < count; ++i)
-		{
-		item = CfgFile()->Item(KDynamicCaps,i);
-		if (!item)
-			break;
-		
-		TInt duration(0); 
-		TInt dynamicCaps(0);
-		ret = CTestConfig::GetElement(item->Value(),KStdDelimiter,0,duration);
-		if (ret != KErrNone)
-			break;
-		ret = CTestConfig::GetElement(item->Value(),KStdDelimiter,1,dynamicCaps);
-		if (ret != KErrNone)
-			break;
-		
-		TPacketDynamicCaps dynamicCapsData;
-		dynamicCapsData.iDuration = duration;
-		dynamicCapsData.iDynamicCaps = dynamicCaps;
-		
-		TRAP_IGNORE(iDynamicCapsArray->AppendL(dynamicCapsData));
-		}
-	
-	if (iDynamicCapsArray->Count() != 0)
-		{
-		iDynamicCapsIndex = 0;
-		TPacketDynamicCaps initialCaps = iDynamicCapsArray->At(0);
-		iCurrentDynamicCaps = initialCaps.iDynamicCaps;
-		iDynamicCapsTimer->Start(initialCaps.iDuration, this, ETimerIdPcktServDynamicCaps);
-		}
-	// end of dynamic caps simulation setup
-	
-	//< Read in all the data for getting the default GPRS configuration parameters
-	
-	item = CfgFile()->Item(KDefaultContextparamGPRS);
-	if(item) 
-		{
-		TInt protocolType,pdpCompression, anonymousAccess, useEdge;
-		TPtrC8 gsnAddress, protocolAddress;
-		TInt protocol;	
-		TPtrC8 username,password, challenge, response, primaryDNS, secondaryDNS, iMiscBuffer;
-		TInt id, numAdditionalParams;
-
-		iGPRSDefaultConfig.iProtocolConfigOption.iMiscBuffer.Zero();
-		
-		TPtr8 pcoPtr(const_cast<TUint8*>(iGPRSDefaultConfig.iProtocolConfigOption.iMiscBuffer.Ptr()), 
-			RPacketContext::KMiscProtocolBufferLength);
-
-		// Attach TTlv to the buffer
-		TTlvStruct<RPacketContext::TPcoId,RPacketContext::TPcoItemDataLength> tlvStruct(pcoPtr,0);
-
-		RPacketContext::TPcoId pcoId;
-		
-		TUint itemOffSet = 0; // Used for nested Addional Param items		
-		
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,protocolType);
-		if(ret==KErrNone)
-			iGPRSDefaultConfig.iProtocolType = protocolType;
-
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,gsnAddress);
-		if(ret==KErrNone)
-			iGPRSDefaultConfig.iGsnAddress.Set(gsnAddress);
-
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,protocolAddress);
-		if(ret==KErrNone)
-			iGPRSDefaultConfig.iProtocolAddress.Set(protocolAddress);
-
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,pdpCompression);
-		if(ret==KErrNone)
-			iGPRSDefaultConfig.iPdpCompression = pdpCompression;
-
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,anonymousAccess);
-		if(ret==KErrNone)
-			iGPRSDefaultConfig.iAnonymousAccess = anonymousAccess;
-
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,5,useEdge);
-		if(ret==KErrNone)
-			iGPRSDefaultConfig.iUseEdge = useEdge;
-
-		// Protocol configuration and DNS server parameters added
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,6,protocol);
-		if(ret==KErrNone)
-			iGPRSDefaultConfig.iProtocolConfigOption.iAuthProtocol = protocol;
-
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,7,username);
-		if(ret==KErrNone)
-			iGPRSDefaultConfig.iProtocolConfigOption.iUsername.Set(username);
-
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,8,password);
-		if(ret==KErrNone)
-			iGPRSDefaultConfig.iProtocolConfigOption.iPassword.Set(password);
-
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,9,challenge);
-		if(ret==KErrNone)
-			iGPRSDefaultConfig.iProtocolConfigOption.iChallenge.Set(challenge);
-
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,10,response);
-		if(ret==KErrNone)
-			iGPRSDefaultConfig.iProtocolConfigOption.iResponse.Set(response);
-
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,11,primaryDNS);
-		if(ret==KErrNone)
-			iGPRSDefaultConfig.iProtocolConfigOption.iPrimaryDNS.Set(primaryDNS);
-
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,12,secondaryDNS);
-		if(ret==KErrNone)
-			iGPRSDefaultConfig.iProtocolConfigOption.iSecondaryDNS.Set(secondaryDNS);
-
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,13,id);
-		if(ret==KErrNone)
-			iGPRSDefaultConfig.iProtocolConfigOption.iId = id;
-		
-		//Get the Additional Params List
-		//Get the number of items in the Additional Params List
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,14,numAdditionalParams);
-		if(ret==KErrNone)
-			{
-			TInt nestedItemNumber;
-			TUint16 digit, format;
-			const CTestConfigItem* item2;
-			
-			for(nestedItemNumber=itemOffSet; nestedItemNumber<itemOffSet+numAdditionalParams; nestedItemNumber++)
-				{
-				item2 = CfgFile()->Item(KDefaultGPRSAdditionalParamItem, nestedItemNumber);
-		
-				if(item2)
-					{
-					TPtrC8 additionalParamId, additionalParamContent, additionalParamDataFormat;
-				
-					// Get ID
-					ret=CTestConfig::GetElement(item2->Value(),KStdDelimiter,0,additionalParamId);
-					if(ret==KErrNone)
-						{
-						if(AsciiToNum(additionalParamId, digit)==KErrNone)
-							{
-							pcoId.SetId(digit);
-							}
-						}
-					
-					// Read AdditionalParamDataFormat field to find out how
-					// to interpret data in the AdditionalParamData field
-					ret=CTestConfig::GetElement(item2->Value(),KStdDelimiter,2,additionalParamDataFormat);
-					if (ret != KErrNone)
-						{
-						// AdditionalParamDataFormat not been specified,
-						// default to plain ASCII
-						LOGPARSERR("AdditionalParamItem::additionalParamDataFormat",ret,2,&KDefaultGPRSAdditionalParamItem);
-						format = EConfigDataFormatAscii;
-						}
-					else
-						{
-						if (AsciiToNum(additionalParamDataFormat, format) != KErrNone)
-							{
-							LOGPARSERR("AdditionalParamItem::additionalParamDataFormat",KErrArgument,2,&KDefaultGPRSAdditionalParamItem);
-							format = EConfigDataFormatAscii;
-							}
-
-						// Check that the AdditionalParamDataFormat value
-						// specified in the config file is a valid one,
-						// default to ASCII if not.
-						if (format >= EMaxConfigDataFormat)
-							{
-							LOGPARSERR("AdditionalParamItem::additionalParamDataFormat",KErrArgument,2,&KDefaultGPRSAdditionalParamItem);
-							format = EConfigDataFormatAscii;
-							}
-						}
-										
-					// Get AdditionalParamData
-					ret=CTestConfig::GetElement(item2->Value(),KStdDelimiter,1,additionalParamContent);
-					if(ret==KErrNone)
-						{
-						// Add AdditionalParamData to PCO buffer depending on format
-						switch (format)
-							{
-						case EConfigDataFormatMixedBinaryAndAscii:
-							{
-							// Parse the string here
-							// Will store the parsed data when algorithm has completed
-							TBuf8<RPacketContext::KMiscProtocolBufferLength> additionalParamDataBuffer;
-							additionalParamDataBuffer.Copy (additionalParamContent);
-
-							if (ParseMixedBinaryAsciiDataL(additionalParamDataBuffer) != KErrNone)
-								{
-								LOGPARSERR("AdditionalParamItem::additionalParamContent",KErrArgument,1,&KDefaultGPRSAdditionalParamItem);
-								SimPanic(EInvalidParameterFormatInConfigFile);
-								}
-
-							TPtr8 paramPtr(const_cast<TUint8*>(additionalParamDataBuffer.Ptr()), 
-								additionalParamDataBuffer.Length(), additionalParamDataBuffer.Length());
-							tlvStruct.AppendItemL(pcoId, paramPtr);
-
-							} // case EAdditionalParamDataFormatMixedBinaryAndAscii
-							break;
-						case EConfigDataFormatAscii:
-						default:
-							TPtr8 paramPtr(const_cast<TUint8*>(additionalParamContent.Ptr()), 
-								additionalParamContent.Length(), additionalParamContent.Length());
-							tlvStruct.AppendItemL(pcoId, paramPtr);
-
-							break;
-							} // switch (format)
-						
-						iGPRSDefaultConfig.iProtocolConfigOption.iMiscBuffer.SetLength(pcoPtr.Length());						
-						} // if (ret == KErrNone)
-					}
-				}
-
-				itemOffSet= itemOffSet + numAdditionalParams;;
-			}
-		else
-			{
-			LOGPARSERR("ProtocolConfigOption::numAdditionalParams",ret,14,&KDefaultContextparamGPRS);	
-			} 
-		} 
-
-	//< Read in all the data for getting the default UMTS configuration parameters
-	item = CfgFile()->Item(KDefaultContextparamRel99);
-	if(item)
-		{
-		TInt protocolType,useEdge;
-		TPtrC8 gsnAddress, protocolAddress;
-		TInt protocol;
-		TPtrC8 username,password, challenge, response, primaryDNS, secondaryDNS, iMiscBuffer;
-		TInt id, numAdditionalParams;
-
-		iR99_R4DefaultConfig.iProtocolConfigOption.iMiscBuffer.Zero();
-		
-		TPtr8 pcoPtr(const_cast<TUint8*>(iR99_R4DefaultConfig.iProtocolConfigOption.iMiscBuffer.Ptr()), 
-			RPacketContext::KMiscProtocolBufferLength);
-
-		// Attach TTlv to the buffer
-		TTlvStruct<RPacketContext::TPcoId,RPacketContext::TPcoItemDataLength> tlvStruct(pcoPtr,0);
-
-		RPacketContext::TPcoId pcoId;
-		
-		TUint itemOffSet = 0; // Used for nested Addional Param items
-
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,protocolType);
-		if(ret==KErrNone)
-			iR99_R4DefaultConfig.iProtocolType = protocolType;
-
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,gsnAddress);
-		if(ret==KErrNone)
-			iR99_R4DefaultConfig.iGsnAddress.Set(gsnAddress);
-
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,protocolAddress);
-		if(ret==KErrNone)
-			iR99_R4DefaultConfig.iProtocolAddress.Set(protocolAddress);
-
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,useEdge);
-		if(ret==KErrNone)
-			iR99_R4DefaultConfig.iUseEdge = useEdge;
-
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,protocol);
-		if(ret==KErrNone)
-			iR99_R4DefaultConfig.iProtocolConfigOption.iAuthProtocol = protocol;
-
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,5,username);
-		if(ret==KErrNone)
-			iR99_R4DefaultConfig.iProtocolConfigOption.iUsername.Set(username);
-
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,6,password);
-		if(ret==KErrNone)
-			iR99_R4DefaultConfig.iProtocolConfigOption.iPassword.Set(password);
-
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,7,challenge);
-		if(ret==KErrNone)
-			iR99_R4DefaultConfig.iProtocolConfigOption.iChallenge.Set(challenge);
-
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,8,response);
-		if(ret==KErrNone)
-			iR99_R4DefaultConfig.iProtocolConfigOption.iResponse.Set(response);
-
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,9,primaryDNS);
-		if(ret==KErrNone)
-			iR99_R4DefaultConfig.iProtocolConfigOption.iPrimaryDNS.Set(primaryDNS);
-
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,10,secondaryDNS);
-		if(ret==KErrNone)
-			iR99_R4DefaultConfig.iProtocolConfigOption.iSecondaryDNS.Set(secondaryDNS);
-
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,11,id);
-		if(ret==KErrNone)
-			iR99_R4DefaultConfig.iProtocolConfigOption.iId = id;
-		
-		//Get the Additional Params List
-		//Get the number of items in the Additional Params List
-		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,12,numAdditionalParams);
-		if(ret==KErrNone)
-			{
-			TInt nestedItemNumber;
-			TUint16 digit, format;
-			const CTestConfigItem* item2;
-			
-			for(nestedItemNumber=itemOffSet; nestedItemNumber<itemOffSet+numAdditionalParams; nestedItemNumber++)
-				{
-				item2 = CfgFile()->Item(KDefaultAdditionalParamItemRel99, nestedItemNumber);
-		
-				if(item2)
-					{
-					TPtrC8 additionalParamId, additionalParamContent, additionalParamDataFormat;
-				
-					ret=CTestConfig::GetElement(item2->Value(),KStdDelimiter,0,additionalParamId);
-					if(ret==KErrNone)
-						{
-						if(AsciiToNum(additionalParamId, digit)==KErrNone)
-							{
-							pcoId.SetId(digit);
-							}
-						}
-
-					// Read AdditionalParamDataFormat field to find out how
-					// to interpret data in the AdditionalParamData field
-					ret=CTestConfig::GetElement(item2->Value(),KStdDelimiter,2,additionalParamDataFormat);
-					if (ret != KErrNone)
-						{
-						// AdditionalParamDataFormat not been specified,
-						// default to plain ASCII
-						LOGPARSERR("No AdditionalParamItem::additionalParamDataFormat",ret,2,&KDefaultAdditionalParamItemRel99);
-						format = EConfigDataFormatAscii;
-						}
-					else
-						{
-						if (AsciiToNum(additionalParamDataFormat, format) != KErrNone)
-							{
-							LOGPARSERR("AdditionalParamItem::additionalParamDataFormat",KErrArgument,2,&KDefaultAdditionalParamItemRel99);
-							format = EConfigDataFormatAscii;
-							}
-
-						// Check that the AdditionalParamDataFormat value
-						// specified in the config file is a valid one,
-						// default to ASCII if not.
-						if (format >= EMaxConfigDataFormat)
-							{
-							LOGPARSERR("AdditionalParamItem::additionalParamDataFormat",KErrArgument,2,&KDefaultAdditionalParamItemRel99);
-							format = EConfigDataFormatAscii;
-							}
-						}
-						
-					ret=CTestConfig::GetElement(item2->Value(),KStdDelimiter,1,additionalParamContent);
-					if(ret==KErrNone)
-						{
-						// Add AdditionalParamData to PCO buffer depending on format
-						switch (format)
-							{
-						case EConfigDataFormatMixedBinaryAndAscii:
-							{
-							// Parse the string here
-							// Will store the parsed data when algorithm has completed
-							TBuf8<RPacketContext::KMiscProtocolBufferLength> additionalParamDataBuffer;
-							additionalParamDataBuffer.Copy (additionalParamContent);
-
-							if (ParseMixedBinaryAsciiDataL(additionalParamDataBuffer) != KErrNone)
-								{
-								LOGPARSERR("AdditionalParamItem::additionalParamContent",KErrArgument,1,&KDefaultAdditionalParamItemRel99);
-								SimPanic(EInvalidParameterFormatInConfigFile);
-								}
-
-							TPtr8 paramPtr(const_cast<TUint8*>(additionalParamDataBuffer.Ptr()), 
-								additionalParamDataBuffer.Length(), additionalParamDataBuffer.Length());
-							tlvStruct.AppendItemL(pcoId, paramPtr);
-
-							} // case EAdditionalParamDataFormatMixedBinaryAndAscii
-							break;
-						case EConfigDataFormatAscii:
-						default:
-							TPtr8 paramPtr(const_cast<TUint8*>(additionalParamContent.Ptr()), 
-								additionalParamContent.Length(), additionalParamContent.Length());
-							tlvStruct.AppendItemL(pcoId, paramPtr);
-
-							break;
-							} // switch (format)
-						iR99_R4DefaultConfig.iProtocolConfigOption.iMiscBuffer.SetLength(pcoPtr.Length());
-						}
-					}
-				}
-
-				itemOffSet= itemOffSet + numAdditionalParams;;
-			}
-		else
-			{
-			LOGPARSERR("ProtocolConfigOption::numAdditionalParams",ret,12,&KDefaultContextparamRel99);	
-			} 		
-
-		}
-
-		//< Read in all the data for getting the default R5 configuration parameters
-		item = CfgFile()->Item(KDefaultContextParamRel5);
-		if(item)
-			{
-			TInt protocolType, useEdge, protocol, id;
-			TInt pdpDataCompression, pdpHeaderCompression, numAdditionalParams;
-			TPtrC8 gsnAddress, protocolAddress, username, password, challenge;
-			TPtrC8 response, primaryDNS, secondaryDNS, iMiscBuffer;
-
-			iR5DefaultConfig.iProtocolConfigOption.iMiscBuffer.Zero();
-
-			TPtr8 pcoPtr(const_cast<TUint8*>(iR5DefaultConfig.iProtocolConfigOption.iMiscBuffer.Ptr()), 
-				RPacketContext::KMiscProtocolBufferLength);
-
-			// Attach the TTlv to the buffer
-			TTlvStruct<RPacketContext::TPcoId,RPacketContext::TPcoItemDataLength> tlvStruct(pcoPtr,0);
-
-			RPacketContext::TPcoId pcoId;
-			
-			TUint itemOffSet = 0; //Used for nested Addional Param items
-
-			//Get the Protocol Type from the config file
-			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,protocolType);
-			if(ret==KErrNone)
-				{
-				iR5DefaultConfig.iProtocolType = protocolType;	
-				}
-			
-			//Get the GGSN Address from the config file
-			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,gsnAddress);
-			if(ret==KErrNone)
-				{
-				iR5DefaultConfig.iGsnAddress.Set(gsnAddress);
-				}
-
-			//Get the ProtocolAddress from the config file
-			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,protocolAddress);
-			if(ret==KErrNone)
-				{
-				iR5DefaultConfig.iProtocolAddress.Set(protocolAddress);
-				}	
-				
-			//Get the UseEdge config param from the config file
-			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,useEdge);
-			if(ret==KErrNone)
-				{
-				iR5DefaultConfig.iUseEdge = useEdge;	
-				}
-			
-			
-			//Get the Autorisation Protocol config param from the config file
-			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,protocol);
-			if(ret==KErrNone)
-				{
-				iR5DefaultConfig.iProtocolConfigOption.iAuthProtocol = protocol;	
-				}
-
-
-			//Get the Username config param from the config file
-			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,5,username);
-			if(ret==KErrNone)
-				{
-				iR5DefaultConfig.iProtocolConfigOption.iUsername.Set(username);	
-				}
-
-			//Get the psword config param from the config file
-			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,6,password);
-			if(ret==KErrNone)
-				{
-				iR5DefaultConfig.iProtocolConfigOption.iPassword.Set(password);	
-				}
-			
-			//Get the Challenge config param from the config file
-			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,7,challenge);
-			if(ret==KErrNone)
-				{
-				iR5DefaultConfig.iProtocolConfigOption.iChallenge.Set(challenge);	
-				}
-
-			//Get the Response config param from the config file
-			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,8,response);
-			if(ret==KErrNone)
-				{
-				iR5DefaultConfig.iProtocolConfigOption.iResponse.Set(response);	
-				}
-
-			//Get the Primary DNS config param from the config file
-			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,9,primaryDNS);
-			if(ret==KErrNone)
-				{
-				iR5DefaultConfig.iProtocolConfigOption.iPrimaryDNS.Set(primaryDNS);	
-				}
-
-			//Get the Secondary DNS config param from the config file
-			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,10,secondaryDNS);
-			if(ret==KErrNone)
-				{
-				iR5DefaultConfig.iProtocolConfigOption.iSecondaryDNS.Set(secondaryDNS);	
-				}
-				
-			//Get the ID config param from the config file.
-			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,11,id);
-			if(ret==KErrNone)
-				{
-				iR5DefaultConfig.iProtocolConfigOption.iId = id;	
-				}
-
-			//Get the PDP Header Compression params
-			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,12,pdpHeaderCompression);
-			if(ret==KErrNone)
-				{
-				iR5DefaultConfig.iPdpHeaderCompression = pdpHeaderCompression;
-				}
-			
-			//Get the PDP Data compression params
-			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,13,pdpDataCompression);
-			if(ret==KErrNone)
-				{
-				iR5DefaultConfig.iPdpDataCompression = pdpDataCompression;
-				}
-				
-
-			//Get the Additional Params List
-			//Get the number of items in the Additional Params List
-			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,14,numAdditionalParams);
-			if(ret==KErrNone)
-				{
-				TInt nestedItemNumber;
-				TUint16 digit, format;
-				const CTestConfigItem* item2;
-				
-				for(nestedItemNumber=itemOffSet; nestedItemNumber<itemOffSet+numAdditionalParams; nestedItemNumber++)
-					{
-					item2 = CfgFile()->Item(KDefaultAdditionalParamItem, nestedItemNumber);
-			
-					if(item2)
-						{
-						TPtrC8 additionalParamId, additionalParamContent, additionalParamDataFormat;
-					
-						ret=CTestConfig::GetElement(item2->Value(),KStdDelimiter,0,additionalParamId);
-						if(ret==KErrNone)
-							{
-							if(AsciiToNum(additionalParamId, digit)==KErrNone)
-								{
-								pcoId.SetId(digit);
-								}
-							}
-
-					// Read AdditionalParamDataFormat field to find out how
-					// to interpret data in the AdditionalParamData field
-					ret=CTestConfig::GetElement(item2->Value(),KStdDelimiter,2,additionalParamDataFormat);
-					if (ret != KErrNone)
-						{
-						// AdditionalParamDataFormat not been specified,
-						// default to plain ASCII
-						LOGPARSERR("No AdditionalParamItem::additionalParamDataFormat",ret,2,&KDefaultAdditionalParamItem);
-						format = EConfigDataFormatAscii;
-						}
-					else
-						{
-						if (AsciiToNum(additionalParamDataFormat, format) != KErrNone)
-							{
-							LOGPARSERR("AdditionalParamItem::additionalParamDataFormat",KErrArgument,2,&KDefaultAdditionalParamItem);
-							format = EConfigDataFormatAscii;
-							}
-
-						// Check that the AdditionalParamDataFormat value
-						// specified in the config file is a valid one,
-						// default to ASCII if not.
-						if (format >= EMaxConfigDataFormat)
-							{
-							LOGPARSERR("AdditionalParamItem::additionalParamDataFormat",KErrArgument,2,&KDefaultAdditionalParamItem);
-							format = EConfigDataFormatAscii;
-							}
-						}
-
-						ret=CTestConfig::GetElement(item2->Value(),KStdDelimiter,1,additionalParamContent);
-						if(ret==KErrNone)
-							{
-							// Add AdditionalParamData to PCO buffer depending on format
-							switch (format)
-								{
-							case EConfigDataFormatMixedBinaryAndAscii:
-								{
-								// Parse the string here
-								// Will store the parsed data when algorithm has completed
-								TBuf8<RPacketContext::KMiscProtocolBufferLength> additionalParamDataBuffer;
-								additionalParamDataBuffer.Copy (additionalParamContent);
-
-								if (ParseMixedBinaryAsciiDataL(additionalParamDataBuffer) != KErrNone)
-									{
-									LOGPARSERR("AdditionalParamItem::additionalParamContent",KErrArgument,1,&KDefaultAdditionalParamItem);
-									SimPanic(EInvalidParameterFormatInConfigFile);
-									}
-
-								TPtr8 paramPtr(const_cast<TUint8*>(additionalParamDataBuffer.Ptr()), 
-									additionalParamDataBuffer.Length(), additionalParamDataBuffer.Length());
-								tlvStruct.AppendItemL(pcoId, paramPtr);
-
-								} // case EAdditionalParamDataFormatMixedBinaryAndAscii
-								break;
-							case EConfigDataFormatAscii:
-							default:
-								TPtr8 paramPtr(const_cast<TUint8*>(additionalParamContent.Ptr()), 
-									additionalParamContent.Length(), additionalParamContent.Length());
-								tlvStruct.AppendItemL(pcoId, paramPtr);
-
-								break;
-								} // switch (format)
-							iR5DefaultConfig.iProtocolConfigOption.iMiscBuffer.SetLength(pcoPtr.Length());
-							}
-						}
-					}
-
-					itemOffSet= itemOffSet + numAdditionalParams;;
-				}
-			}
-
-		count=CfgFile()->ItemCount(KPacketReleaseMode); //< Retrieves the packet registration info
-		item=NULL;
-		for(i=0;i<count;i++)
-			{
-			item=CfgFile()->Item(KPacketReleaseMode,i);
-			if(!item)
-				break;
-			TInt release,duration;
-			
-			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,release);
-			if(ret!=KErrNone)
-				break;
-			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,duration);
-			if(ret!=KErrNone)
-				break;
-
-			TPacketReleaseMode releaseMode;
-			releaseMode.iDuration=duration;
-			releaseMode.iReleaseMode=release;
-			TRAP_IGNORE(iPacketReleaseModeArray->AppendL(releaseMode));
-			}
-
-		item=NULL;
-		count=CfgFile()->ItemCount(KMBMSBroadCastPacketServiceParams); //< Retrieves the Count of MBMS related information
-
-		for(i=0;i<count;i++)
-			{
-			item = CfgFile()->Item(KMBMSBroadCastPacketServiceParams,i); //< Retrieves the MBMS related information
-
-			TInt duration =0;
-			TInt status =0;
-			if(!item)
-				{
-				break;
-				}
-
-			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,duration);
-			if(ret!=KErrNone)
-				{
-				break;
-				}
-			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,status);
-			if(ret!=KErrNone)
-				{
-				status = EMbmsSupportUnknown;
-				}
-
-			TMbmsBroadCastParams mbmsParams;
-			mbmsParams.iDuration = duration;
-			mbmsParams.iMbmsNetworkStatus = reinterpret_cast<TMbmsNetworkServiceStatus&> (status);
-			TRAP_IGNORE(iMbmsBroadcastParamsArray->AppendL(mbmsParams));
-			}
-
-		item=NULL;
-		count=CfgFile()->ItemCount(KMBMSBroadcastMonitorList); //< Retrieves the Count of MBMS related information
-
-		for(i=0;i<count;i++)
-			{
-			item = CfgFile()->Item(KMBMSBroadcastMonitorList,i); //< Retrieves the MBMS related information
-
-			TInt duration =0;
-			TInt mnc=0;
-			TInt mcc=0;
-			TInt serviceId=0;
-			TInt accessBearer=0;
-			TInt serviceMode=0;
-			TInt serviceAvailability=0;
-			TInt entryValid=0;
-			
-			if(!item)
-				{
-				break;
-				}
-
-			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,duration);
-			if(ret!=KErrNone)
-				{
-				break;
-				}
-
-			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,mcc);
-			if(ret!=KErrNone)
-				{
-				break;
-				}
-
-			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,mnc);
-			if(ret!=KErrNone)
-				{
-				break;
-				}
-
-			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,serviceId);
-			if(ret!=KErrNone)
-				{
-				break;
-				}
-
-			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,accessBearer);
-			if(ret!=KErrNone)
-				{
-				break;
-				}
-
-			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,5,serviceMode);
-			if(ret!=KErrNone)
-				{
-				break;
-				}
-
-			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,6,serviceAvailability);
-			if(ret!=KErrNone)
-				{
-				break;
-				}
-
-			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,7,entryValid);
-			if(ret!=KErrNone)
-				{
-				entryValid = 0; //default Entry is Invalid
-				}
-			TMbmsMonitorListParams mbmsMonitorParams;
-
-			mbmsMonitorParams.iDuration = duration;
-			mbmsMonitorParams.iMCC = mcc;
-			mbmsMonitorParams.iMNC = mnc;
-			mbmsMonitorParams.iServiceId = serviceId;
-			mbmsMonitorParams.iAccessBearer = reinterpret_cast<TMbmsScope&> (accessBearer);
-			mbmsMonitorParams.iServiceMode = reinterpret_cast<TMbmsServiceMode&> (serviceMode);
-			mbmsMonitorParams.iAvailStatus = reinterpret_cast<TMbmsAvailabilityStatus&> (serviceAvailability);
-			mbmsMonitorParams.iIsEntryValid = reinterpret_cast<TBool&> (entryValid);
-
-			TRAP_IGNORE(iMbmsMonitorListParamsArray->AppendL(mbmsMonitorParams));
-
-			}
-
-			if(iMbmsBroadcastParamsArray->Count()!=0)
-				{
-				iMbmsPcktTimer->Start(iMbmsBroadcastParamsArray->At(0).iDuration,this,ETimerIdMbmsPcktService);
-				}
-			else if (iMbmsMonitorListParamsArray->Count()!=0)
-				{
-				iMbmsPcktTimer->Start(iMbmsMonitorListParamsArray->At(0).iDuration,this,ETimerIdMbmsPcktService);
-				}
-
-			if(iPacketReleaseModeArray->Count()!=0)
-				{
-				iPacketReleaseModeIndex = 0;
-				iCurrentPacketReleaseMode = iPacketReleaseModeArray->At(0).iReleaseMode;
-				iReleaseModeTimer->Start(iPacketReleaseModeArray->At(0).iDuration,this,ETimerIdPcktServReleaseMode);
-				}
-			iIncomingContextManager = CSimIncomingContextManager::NewL(iPhone, this);
-			iIncomingContextManager->LoadIncomingContextsL( KDelayIncomingContext() );
-			iIncomingContextManager->SetUseTimerOn();
-			}
-	
-
-CSimPacketService::~CSimPacketService()
-/**
-* Trivial Destructor
-* Closes all CObject type objects and destroys all other objects created in the ConstructL()
-*
-*/
-	{
-	LOGPACKET1("CSimPacketService: Entered destructor");
-		
-	delete iIncomingContextManager;
-	
-	iMutex.Close();
-	// delete nifs' contexts
-	int count = iNifWrappers.Count();
-
-	for(TInt i = 0; i<count; i++)
-		{
-		iNifWrappers[i].Close();
-		}
-
-	iNifWrappers.Close();
-	
-	if (iPcktRegStatusInfo != NULL)
-		{
-		iPcktRegStatusInfo->Delete(0,iPcktRegStatusInfo->Count());
-		delete iPcktRegStatusInfo;
-		}
-
-	if(iNtwkRegStatusInfo != NULL)
-		{
-		iNtwkRegStatusInfo->Delete(0,iNtwkRegStatusInfo->Count());
-		delete iNtwkRegStatusInfo;
-		}
-
-	delete iTimer;
-	
-	delete iPcktRegTimer;
-
-	delete iNtwkRegTimer;
-
-	delete iReleaseModeTimer;
-	
-	delete iDynamicCapsTimer;
-	
-	delete iMbmsPcktTimer;
-
-	if (iPacketReleaseModeArray != NULL)
-		{	
-		iPacketReleaseModeArray->Delete(0,iPacketReleaseModeArray->Count());
-		delete iPacketReleaseModeArray;
-		}
-	if (iDynamicCapsArray != NULL)
-		{
-		iDynamicCapsArray->Delete(0,iDynamicCapsArray->Count());
-		delete iDynamicCapsArray;
-		}
-	
-	if (iSecondaryContextCountArray != NULL)
-		{
-		iSecondaryContextCountArray->Delete(0,iSecondaryContextCountArray->Count());
-		delete iSecondaryContextCountArray;
-		}
-	
-	if(iMbmsBroadcastParamsArray != NULL)
-		{
-		iMbmsBroadcastParamsArray->Delete(0,iMbmsBroadcastParamsArray->Count());
-		delete iMbmsBroadcastParamsArray;
-		}
-	
-	if(iMbmsMonitorListParamsArray != NULL)
-		{
-		iMbmsMonitorListParamsArray->Delete(0,iMbmsMonitorListParamsArray->Count());
-		delete iMbmsMonitorListParamsArray;
-		}
-	
-	if(iMbmsServicesList)
-		{
-		iMbmsServicesList->ResetAndDestroy();
-		}
-	delete iMbmsServicesList;
-	
-	// delete nifs' contexts
-	count = iMbmsNifWrappers.Count();
-
-	for(TInt i = 0; i<count; i++)
-		{
-		iMbmsNifWrappers[i].Close();
-		}
-
-	iMbmsNifWrappers.Close();
-	
-	delete iNtwkRegStatusChange;
-	
-	delete iMbmsActivation;
-	}
-
-CSimPhone* CSimPacketService::PhonePtr() const
-/**
-* Returns a pointer to the phone (parent) object
-*
-* @return CSimPhone Pointer to the phone object
-*/
-	{
-		return iPhone; 
-	}
-
-CTelObject* CSimPacketService::OpenNewObjectByNameL(const TDesC& aName)
-/**
-* Returns a pointer to an existing Context object identified by name.
-* If the object is deleted then reopen it then return a handle to it.
-*
-* @param aName name of the Context object to be opened
-* @return CTelObject pointer to the CSimPacketContext object or null if not possible or not found
-* @leave Leaves if object cannot be opened or created.
-*/
-	{
-	CSimPacketContext*  packetContext = NULL;
-
-	// go through every nif, and from there through every context in nif
-	TInt counter = iNifWrappers.Count();
-	
-	for(TInt i=0; i<counter; i++)
-		{
-		// now go through all contexts of the nif at index i
-		TInt totalContexts = iNifWrappers[i].NumberOfContexts();
-		for (TInt x=0; x<totalContexts; x++)
-			{
-			packetContext = iNifWrappers[i].GetContext(x);
-						
-			// if context name matches parameter, reactivate
-			if(aName.Compare(packetContext->ContextName())==KErrNone)
-				{
-				iCurrentPrimaryContextIndex = i;
-				TInt err = packetContext->ReActivate(this,aName);
-				if(err != KErrNone)
-					{
-					User::Leave(err);
-					return NULL;
-					}	
-				return packetContext;
-				}
-			}
-		}
-	
-	// if the control has reached here, then the context requested is not in the PDP context
-	// hence lets search in the list of MBMS contexts.
-	CSimMbmsPacketContext* pcktMbmsContext = NULL;
-	
-	counter = iMbmsNifWrappers.Count();
-	
-	for(TInt i=0;i<counter;i++)
-		{
-		TInt totalContexts = iMbmsNifWrappers[i].NumberOfContexts();
-		for (TInt x=0; x<totalContexts; x++)
-			{
-			pcktMbmsContext = iMbmsNifWrappers[i].GetContext(x);
-						
-			// if context name matches parameter, reactivate
-			if(aName.Compare(pcktMbmsContext->ContextName())==KErrNone)
-				{
-				TInt err = pcktMbmsContext->ReActivate(this,aName);
-				if(err != KErrNone)
-					{
-					User::Leave(err);
-					return NULL;
-					}	
-				return pcktMbmsContext;
-				}
-			}
-		}
-	
-	User::Leave(KErrNotFound);
-	return NULL;
-	}
-
-CTelObject* CSimPacketService::OpenNewObjectL(TDes& aNewName)
-/**
-* Creates a new CSimPacketContext object and returns a pointer to it.
-*
-* @param aName new name of the object created
-* @return CTelObject pointer to the CSimPacketContext object created
-* @leave Leaves if out of memory.
-*/
-	{
-	// Check whether the context creation is for MBMS of PDP context
-
-	if(aNewName.Compare(_L("MBMS_CONTEXT"))== KErrNone)  
-		{
-		// Processing for MBMS context creation starts
-		CSimMbmsPacketContext* pcktMbmsContext = NULL;
-
-		TInt ctr = iMbmsNifWrappers.Count();
-		TInt mbmsCnxtCount = 0;
-		for(TInt i=0;i<ctr; i++)
-			{
-			TInt mbmsContextsCount = iMbmsNifWrappers[i].NumberOfContexts();
-			for(TInt j=0;j<mbmsContextsCount;j++)
-				{
-				pcktMbmsContext = iMbmsNifWrappers[i].GetContext(j);
-				RPacketContext::TContextStatus tStat = pcktMbmsContext->ContextStatus();
-				if(tStat != RPacketContext::EStatusDeleted)
-					{
-					mbmsCnxtCount++;
-					}
-				}
-			}
-		if ( mbmsCnxtCount > KMaxMbmsContextSupportedByPhone )
-			{
-			if(iNotifyContextAdded.iNotifyPending)
-				{
-				iNotifyContextAdded.iNotifyPending = EFalse;
-				ReqCompleted(iNotifyContextAdded.iNotifyHandle,KErrUmtsMaxNumOfContextExceededByPhone);
-				}
-			User::Leave(KErrNoMemory);
-			return NULL;
-			}
-		else if (mbmsCnxtCount > KMaxMbmsContextSupportedByNetwork)
-			{
-			if(iNotifyContextAdded.iNotifyPending)
-				{
-				iNotifyContextAdded.iNotifyPending = EFalse;
-				ReqCompleted(iNotifyContextAdded.iNotifyHandle,KMaxMbmsContextSupportedByNetwork);
-				}
-			User::Leave(KErrNoMemory);
-			return NULL;
-			}
-		
-		aNewName.AppendNum(++iMbmsContextNameInc);  
-		pcktMbmsContext = CSimMbmsPacketContext::NewL(iPhone, this, aNewName);
-		CleanupStack::PushL(pcktMbmsContext);
-		
-		if(pcktMbmsContext->Open()==KErrNone)
-			{
-			TMbmsNifWrapper tMbmsNif;
-			tMbmsNif.AddContext(pcktMbmsContext);
-			iMbmsNifWrappers.Append(tMbmsNif);
-			}
-		iMbmsContextCount++;		
-
-		// Check for a pending line state notification.
-		if(iNotifyContextAdded.iNotifyPending)
-			{
-			iNotifyContextAdded.iNotifyPending=EFalse;
-			*(reinterpret_cast<TName*>(iNotifyContextAdded.iNotifyData))=pcktMbmsContext->ContextName();
-			ReqCompleted(iNotifyContextAdded.iNotifyHandle,KErrNone);
-			}
-
-		CleanupStack::Pop(pcktMbmsContext);
-		return pcktMbmsContext;
-
-
-		} // End of MBMS Context processing.
-
-	else 
-		{
-		// Processing for PDP context creation starts
-		
-		// if there are more contexts than the maximum allowed, return error code
-		CSimPacketContext*  packetContext = NULL;
-
-		// go through every nif, and from there through every context in nif
-		TInt counter = iNifWrappers.Count();
-		TInt contextCount=0;
-
-		for(TInt i=0; i<counter; i++)
-			{
-			// now go through all contexts of the nif at index i
-			TInt totalContexts = iNifWrappers[i].NumberOfContexts();
-			for (TInt x=0; x<totalContexts; x++)
-				{
-				packetContext = iNifWrappers[i].GetContext(x);	
-				RPacketContext::TContextStatus tstat = packetContext->ContextStatus();
-				if(tstat != RPacketContext::EStatusDeleted)
-					contextCount++;
-				}
-			}
-
-		if(contextCount >= KMaxContextPoolSize)
-			{
-			if(iNotifyContextAdded.iNotifyPending)
-				{
-				iNotifyContextAdded.iNotifyPending = EFalse;
-				ReqCompleted(iNotifyContextAdded.iNotifyHandle,KErrNoMemory);
-				}
-			User::Leave(KErrNoMemory);
-			return NULL;
-			}
-
-		CSimPacketContext* newContext;
-		
-		// if this is not a secondary context, give the new context the primary
-		// context name increment
-		if (!iSecondaryContext)
-			{
-			aNewName.Append(KSimPacketPrimaryContextName); 
-			aNewName.AppendNum(++iPrimaryContextNameInc);
-
-			newContext = CSimPacketContext::NewL(iPhone, this, aNewName);
-			CleanupStack::PushL(newContext);
-			if (newContext->Open() == KErrNone)
-				{
-				TNifWrapper nif;
-				nif.AddContext(newContext);
-				iNifWrappers.Append(nif);
-				iCurrentPrimaryContextIndex = iNifWrappers.Count() - 1;
-				}
-
-			// for every primary context, add an element in the array so that a count
-			// can be kept for each primary's secondary contexts
-			iSecondaryContextCountArray->AppendL(iCurrentPrimaryContextIndex);
-			iCurrentPrimaryContextIndex++;
-			}
-		else
-			{ 
-			// if this is a secondary context, name it accordingly
-			// and increment the count of the secondary's primary context
-			aNewName.Append(KSimPacketSecondaryContextName);
-			iSecondaryContextCountArray->At(iCurrentPrimaryContextIndex)++;
-			aNewName.AppendNum(iSecondaryContextCountArray->At(iCurrentPrimaryContextIndex));
-
-			newContext = CSimPacketContext::NewL(iPhone, this, aNewName);
-			CleanupStack::PushL(newContext);
-
-			if(newContext->Open()==KErrNone)
-				{
-				iNifWrappers[iCurrentPrimaryContextIndex].AddContext(newContext);
-				iSecondaryContextNameInc++;	// keep a global count of number of secondary contexts
-				}
-			}
-		iContextCount++;
-
-		// Check for a pending line state notification.
-		if(iNotifyContextAdded.iNotifyPending)
-			{
-			iNotifyContextAdded.iNotifyPending=EFalse;
-			*(TName*)iNotifyContextAdded.iNotifyData=newContext->ContextName();
-			ReqCompleted(iNotifyContextAdded.iNotifyHandle,KErrNone);
-			}
-
-		// ie assume false until PrepareOpenSecondary() is called again
-		iSecondaryContext = EFalse;
-		CleanupStack::Pop(newContext);
-		return newContext;
-		}
-	}
-
-CTelObject::TReqMode CSimPacketService::ReqModeL(const TInt aIpc)
-/**
-* ReqModeL is called from the server's CTelObject::ReqAnalyserL
-* in order to check the type of request it has.
-* 
-* 
-* @param aIpc the ipc number that identifies the client request
-* @return CTelObject::TReqMode The request mode to be used for this request
-* @leave Leaves if not supported by this tsy
-*/	
-	{
-	CTelObject::TReqMode ret=0;
-	switch (aIpc)
-		{
-		case EPacketAttach:
-		case EPacketDetach:
-		case EPacketRejectActivationRequest:
-		case EPacketSetMSClass:
-		case EPacketSetAttachMode:
-		case EPacketSetDefaultContextParams:
-		case EPacketGetStatus:
-		case EPacketGetContextInfo:
-		case EPacketGetNtwkRegStatus:
-		case EPacketGetMSClass:
-		case EPacketGetStaticCaps:
-		case EPacketGetDynamicCaps:
-		case EPacketGetAttachMode:
-		case EPacketGetDefaultContextParams:
-		case EPacketEnumerateContexts:
-		case EPacketGetCurrentReleaseMode:
-		case EPacketEnumerateNifs:
-		case EPacketGetNifInfo:
-		case EPacketEnumerateContextsInNif:
-		case EPacketGetContextNameInNif:
-		case EPacketPrepareOpenSecondary:
-		case EPacketGetMbmsNetworkServiceStatus:
-		case EPacketUpdateMbmsMonitorServiceList:
-		case EPacketGetMbmsMonitoredServicesPhase1:
-		case EPacketGetMbmsMonitoredServicesPhase2:
-		case EPacketEnumerateMbmsMonitorServiceList:
-		case EPacketEnumerateMbmsActiveServiceList:
-			break;
-
-		case EPacketNotifyContextAdded:
-		case EPacketNotifyStatusChange:
-		case EPacketNotifyContextActivationRequested:
-		case EPacketNotifyChangeOfNtwkRegStatus:
-		case EPacketNotifyMSClassChange:
-		case EPacketNotifyDynamicCapsChange:
-		case EPacketNotifyReleaseModeChange:
-		case EPacketNotifyAttachModeChange:
-		case EPacketNotifyMbmsNetworkServiceStatusChange:
-		case EPacketNotifyMbmsServiceAvailabilityChange:
-			ret=KReqModeMultipleCompletionEnabled | KReqModeRePostImmediately;
-			break;
-
-		default:
-			User::Leave(KErrNotSupported);
-			break;
-		}
-	return ret;
-	}
-
-RHandleBase* CSimPacketService::GlobalKernelObjectHandle()
-/**
-* Implements CSubSessionExtBase virtual method, which provides
-* handle of the mutex object to etel server that passes it up to clients.
-* @return pointer to synchronisation mutex object
-*/
-	{
-		return &iMutex;
-	}
-
-TInt CSimPacketService::RegisterNotification(const TInt aIpc)
-/**
-* RegisterNotification is called when the server recognises that this notification
-* is being posted for the first time on this sub-session object.
-* 
-* It enables the TSY to "turn on" any regular notification messages that it may receive 
-* from the phone
-*
-* @param aIpc the ipc number that identifies the client request
-* @return err KErrNone if fine
-*/
-	{
-	switch (aIpc)
-		{
-		case EPacketNotifyContextAdded:
-		case EPacketNotifyStatusChange:
-		case EPacketNotifyContextActivationRequested:
-		case EPacketNotifyChangeOfNtwkRegStatus:
-		case EPacketNotifyMSClassChange:
-		case EPacketNotifyDynamicCapsChange:
-		case EPacketNotifyReleaseModeChange:
-		case EPacketNotifyAttachModeChange:
-		case EPacketNotifyMbmsNetworkServiceStatusChange:
-		case EPacketNotifyMbmsServiceAvailabilityChange:
-			LOGPACKET1("CSimPacketService: RegisterNotification");
-			return KErrNone;
-		default:
-			// Unknown or invalid IPC
-			LOGPACKET1("CSimPacketService: Register error, unknown IPC");
-			return KErrNotSupported;
-		}
-	}
-
-TInt CSimPacketService::DeregisterNotification(const TInt aIpc)
-/**
-* DeregisterNotification is called when the server recognises that this notification
-* will not be posted again because the last client to have a handle on this sub-session
-* object has just closed the handle.
-*
-* It enables the TSY to "turn off" any regular notification messages that it may 
-* receive from the phone
-*
-* @param aIpc the ipc number that identifies the client request
-* @return err KErrNone if fine
-*/
-	{
-	switch (aIpc)
-		{
-		case EPacketNotifyContextAdded:
-		case EPacketNotifyStatusChange:
-		case EPacketNotifyContextActivationRequested:
-		case EPacketNotifyChangeOfNtwkRegStatus:
-		case EPacketNotifyMSClassChange:
-		case EPacketNotifyDynamicCapsChange:
-		case EPacketNotifyReleaseModeChange:
-		case EPacketNotifyAttachModeChange:
-		case EPacketNotifyMbmsNetworkServiceStatusChange:
-		case EPacketNotifyMbmsServiceAvailabilityChange:
-			LOGPACKET1("CSimPacketService: DeregisterNotification");
-			return KErrNone;
-		default:
-			// Unknown or invalid IPC
-			LOGPACKET1("CSimPacketService: Deregister error, unknown IPC");
-			return KErrNotSupported;
-		}
-	}
-
-TInt CSimPacketService::NumberOfSlotsL(const TInt aIpc)
-/**
-* NumberOfSlotsL is called by the server when it is registering a new notification
-* It enables the TSY to tell the server how many buffer slots to allocate for
-* "repost immediately" notifications that may trigger before clients collect them
-*
-* @param aIpc the ipc number that identifies the client request
-* @return err KErrNone if fine
-*/
-	{
-	TInt numberOfSlots=1;
-	switch (aIpc)
-		{
-		case EPacketNotifyStatusChange:
-		case EPacketNotifyDynamicCapsChange:
-		case EPacketNotifyMbmsNetworkServiceStatusChange:
-			LOGPACKET1("CSimPacketService: Registered with 10 slots");
-			numberOfSlots=10;
-			break;
-		case EPacketNotifyContextAdded:
-		case EPacketNotifyContextActivationRequested:
-		case EPacketNotifyChangeOfNtwkRegStatus:
-		case EPacketNotifyMSClassChange:
-		case EPacketNotifyReleaseModeChange:
-		case EPacketNotifyAttachModeChange:
-		case EPacketNotifyMbmsServiceAvailabilityChange:
-			LOGPACKET1("CSimPacketService: Registered with 2 slots");
-			numberOfSlots=2;
-			break;
-		default:
-			// Unknown or invalid IPC
-			LOGPACKET1("CSimPacketService: Number of Slots error, unknown IPC");
-			User::Leave(KErrNotSupported);
-			break;
-		}  
-	return numberOfSlots;
-	}
-
-
-TInt CSimPacketService::ExtFunc(const TTsyReqHandle aTsyReqHandle,const TInt aIpc,
-							  const TDataPackage& aPackage)
-/**
-* ExtFunc is called by the server when it has a "extended", i.e. non-core ETel request
-* for the TSY to process.
-* A request handle, request type and request data are passed to the TSY
-* 
-* @param aTsyReqHandle  The request handle for completing the request 
-* @param aIpc Ipc representing the request
-* @param aPackage any data associated with the request
-* @return err KErrNone if request completes ok
-*/
-	{
-	TAny* dataPtr=aPackage.Ptr1();
-	TAny* dataPtr2=aPackage.Ptr2();
-
-	switch (aIpc)
-		{
-		case EPacketNotifyContextAdded:
-			return NotifyContextAdded(aTsyReqHandle, aPackage.Des1u());
-		case EPacketGetStatus:
-			return GetStatus(aTsyReqHandle,
-					REINTERPRET_CAST(RPacketService::TStatus*, dataPtr));
-		case EPacketNotifyStatusChange:
-			return NotifyStatusChange(aTsyReqHandle,
-					REINTERPRET_CAST(RPacketService::TStatus*, dataPtr));
-		case EPacketNotifyContextActivationRequested:
-			return NotifyContextActivationRequested(aTsyReqHandle, 
-					aPackage.Des1n());
-		case EPacketEnumerateContexts:
-			return EnumerateContexts(aTsyReqHandle,
-					REINTERPRET_CAST(TInt*, dataPtr),
-					REINTERPRET_CAST(TInt*, dataPtr2));
-		case EPacketGetContextInfo:
-			return GetContextInfo(aTsyReqHandle,
-					REINTERPRET_CAST(TInt*, dataPtr),
-					REINTERPRET_CAST(RPacketService::TContextInfo*, dataPtr2));
-		case EPacketGetNtwkRegStatus:
-			return GetNtwkRegStatus(aTsyReqHandle,
-					REINTERPRET_CAST(RPacketService::TRegistrationStatus*, dataPtr));
-		case EPacketNotifyChangeOfNtwkRegStatus:
-			return NotifyChangeOfNtwkRegStatus(aTsyReqHandle,
-					REINTERPRET_CAST(RPacketService::TRegistrationStatus*, dataPtr));
-		case EPacketGetMSClass:
-			return GetMSClass(aTsyReqHandle,
-					REINTERPRET_CAST(RPacketService::TMSClass*, dataPtr),
-					REINTERPRET_CAST(RPacketService::TMSClass*, dataPtr2));
-		case EPacketSetMSClass:
-			return SetMSClass(aTsyReqHandle,
-					REINTERPRET_CAST(RPacketService::TMSClass*, dataPtr));
-		case EPacketNotifyMSClassChange:
-			return NotifyMSClassChange(aTsyReqHandle,
-					REINTERPRET_CAST(RPacketService::TMSClass*, dataPtr));
-		case EPacketGetStaticCaps:
-			return GetStaticCaps(aTsyReqHandle, 
-					REINTERPRET_CAST(TUint*, dataPtr),
-					REINTERPRET_CAST(RPacketContext::TProtocolType*, dataPtr2));
-		case EPacketGetDynamicCaps:
-			return GetDynamicCaps(aTsyReqHandle,
-					REINTERPRET_CAST(RPacketService::TDynamicCapsFlags*, dataPtr));
-		case EPacketNotifyDynamicCapsChange:
-			return NotifyDynamicCapsChange(aTsyReqHandle,
-					REINTERPRET_CAST(RPacketService::TDynamicCapsFlags*, dataPtr));
-		case EPacketSetAttachMode:
-			return SetAttachMode(aTsyReqHandle,
-					REINTERPRET_CAST(RPacketService::TAttachMode*, dataPtr));
-		case EPacketGetAttachMode:
-			return GetAttachMode(aTsyReqHandle,
-					REINTERPRET_CAST(RPacketService::TAttachMode*, dataPtr));
-		case EPacketNotifyAttachModeChange:
-			return NotifyAttachModeChange(aTsyReqHandle,
-					REINTERPRET_CAST(RPacketService::TAttachMode*, dataPtr));
-		case EPacketAttach:
-			return Attach(aTsyReqHandle);
-		case EPacketDetach:
-			return Detach(aTsyReqHandle);
-		case EPacketRejectActivationRequest:
-			return RejectActivationRequest(aTsyReqHandle);
-		case EPacketSetDefaultContextParams:
-			return SetDefaultContextParams(aTsyReqHandle, aPackage.Des1n());
-		case EPacketGetDefaultContextParams:
-			return GetDefaultContextParams(aTsyReqHandle, aPackage.Des1n());
-		case EPacketGetCurrentReleaseMode:
-			return GetCurrentReleaseMode(aTsyReqHandle, REINTERPRET_CAST(RPacketService::TPacketReleaseMode*, dataPtr));
-		case EPacketNotifyReleaseModeChange:
-			return NotifyReleaseModeChange(aTsyReqHandle,
-					REINTERPRET_CAST(RPacketService::TPacketReleaseMode*, dataPtr));
-		case EPacketEnumerateNifs:
-			return EnumerateNifs(aTsyReqHandle, *(REINTERPRET_CAST(TInt*, dataPtr)));
-		case EPacketGetNifInfo:
-			return GetNifInfo(aTsyReqHandle, *REINTERPRET_CAST(TInt*, dataPtr), aPackage.Des2n());
-		case EPacketEnumerateContextsInNif:
-			return EnumerateContextsInNif(aTsyReqHandle, aPackage.Des2u(), *REINTERPRET_CAST(TInt*, dataPtr));			
-		case EPacketGetContextNameInNif:
-			return GetContextNameInNif(aTsyReqHandle, aPackage.Des2u(), *REINTERPRET_CAST(TInt*, dataPtr), aPackage.Des2u());
-		case EPacketPrepareOpenSecondary:
-			//return PrepareOpenSecondary(aTsyReqHandle, *REINTERPRET_CAST(TDesC*, dataPtr));
-			return PrepareOpenSecondary(aTsyReqHandle, aPackage.Des1u());
-		case EPacketGetNifInfoCancel:
-			return GetNifInfoCancel(aTsyReqHandle);
-		case EPacketGetMbmsNetworkServiceStatus:
-			return GetMbmsNetworkServiceStatus(aTsyReqHandle, reinterpret_cast<TBool> (dataPtr),
-					reinterpret_cast<TMbmsNetworkServiceStatus*> (dataPtr2));
-		case EPacketNotifyMbmsNetworkServiceStatusChange:
-			return NotifyMbmsNetworkServiceStatusChange(aTsyReqHandle,
-					reinterpret_cast<TMbmsNetworkServiceStatus*>(dataPtr));
-		case EPacketNotifyMbmsServiceAvailabilityChange:
-			return NotifyMbmsServiceAvailabilityChange(aTsyReqHandle);
-		case EPacketUpdateMbmsMonitorServiceList:
-			TInt retValue;
-			TInt err;
-			if(dataPtr2)
-				{
-				TRAP(err, retValue = UpdateMbmsMonitorServiceListL(aTsyReqHandle,
-					reinterpret_cast<TMbmsAction*>(dataPtr),aPackage.Des2n()));
-				}
-			else
-				{
-				TRAP(err, retValue = UpdateMbmsMonitorServiceListL(aTsyReqHandle,
-					reinterpret_cast<TMbmsAction*>(dataPtr)));
-				}
-			if(err != KErrNone)
-				{
-				retValue = err;
-				}
-			return retValue;
-		case EPacketGetMbmsMonitoredServicesPhase1:
-			return GetMbmsMonitoredServicesListPhase1(aTsyReqHandle, 
-					reinterpret_cast<TClientId*>(dataPtr), 
-					reinterpret_cast<TInt*>(dataPtr2));
-		case EPacketGetMbmsMonitoredServicesPhase2:
-			return GetMbmsMonitoredServicesListPhase2(aTsyReqHandle, 
-					reinterpret_cast<TClientId*>(dataPtr), aPackage.Des2n());	
-		case EPacketEnumerateMbmsMonitorServiceList:
-			return EnumerateMbmsMonitorServiceList(aTsyReqHandle,
-					reinterpret_cast<TInt*>(dataPtr),
-					reinterpret_cast<TInt*>(dataPtr2));
-		case EPacketEnumerateMbmsActiveServiceList:
-			return EnumerateMbmsActiveServiceList(aTsyReqHandle,
-					reinterpret_cast<TInt*>(dataPtr),
-					reinterpret_cast<TInt*>(dataPtr2));
-		default:
-			return KErrNotSupported;
-		}
-	}
-
-TInt CSimPacketService::CancelService(const TInt aIpc,const TTsyReqHandle aTsyReqHandle)
-/**
-* CancelService is called by the server when it is "cleaning-up" any still outstanding
-* asynchronous requests before closing a client's sub-session.
-* This will happen if a client closes its R-class handle without cancelling outstanding asynchronous requests.
-* 
-*  This function will be called when a client explicitly cancels
-*
-* @param aTsyReqHandle  The request handle for completing the request 
-* @param aIpc Ipc representing the request
-* @return err KErrNone if request completes ok
-*/
-	{
-	LOGPACKET1("CSimPacketService: - CancelService called");
-	switch (aIpc)
-		{
-		case EPacketNotifyContextAdded:
-			return NotifyContextAddedCancel(aTsyReqHandle);
-		case EPacketAttach:
-			return AttachCancel(aTsyReqHandle);
-		case EPacketDetach:
-			return DetachCancel(aTsyReqHandle);
-		case EPacketNotifyStatusChange:
-			return NotifyStatusChangeCancel(aTsyReqHandle);
-		case EPacketNotifyContextActivationRequested:
-			return NotifyContextActivationRequestedCancel(aTsyReqHandle);
-		case EPacketRejectActivationRequest:
-			return RejectActivationRequestCancel(aTsyReqHandle);
-		case EPacketGetContextInfo:
-			return GetContextInfoCancel(aTsyReqHandle);
-		case EPacketNotifyChangeOfNtwkRegStatus:
-			return NotifyChangeOfNtwkRegStatusCancel(aTsyReqHandle);
-		case EPacketGetMSClass:
-			return GetMSClassCancel(aTsyReqHandle);
-		case EPacketSetMSClass:
-			return SetMSClassCancel(aTsyReqHandle);
-		case EPacketNotifyMSClassChange:
-			return NotifyMSClassChangeCancel(aTsyReqHandle);
-		case EPacketNotifyDynamicCapsChange:
-			return NotifyDynamicCapsChangeCancel(aTsyReqHandle);
-		case EPacketEnumerateContextsCancel:
-			return EnumerateContextsCancel(aTsyReqHandle);
-		case EPacketGetCurrentReleaseMode:
-			return GetCurrentReleaseModeCancel(aTsyReqHandle);
-		case EPacketNotifyReleaseModeChange:
-			return NotifyReleaseModeChangeCancel(aTsyReqHandle);
-		case EPacketEnumerateNifs:
-			return EnumerateNifsCancel(aTsyReqHandle);
-		case EPacketGetNifInfo:
-			return GetNifInfoCancel(aTsyReqHandle);
-		case EPacketEnumerateContextsInNif:	
-			return EnumerateContextsInNifCancel(aTsyReqHandle);
-		case EPacketGetContextNameInNif:
-			return GetContextNameInNifCancel(aTsyReqHandle);
-		case EPacketNotifyAttachModeChange:
-			return NotifyAttachModeChangeCancel(aTsyReqHandle);
-		case EPacketGetMbmsNetworkServiceStatus:
-			return GetMbmsNetworkServiceStatusCancel(aTsyReqHandle);
-		case EPacketNotifyMbmsNetworkServiceStatusChange:
-			return NotifyMbmsNetworkServiceStatusChangeCancel(aTsyReqHandle);
-		case EPacketNotifyMbmsServiceAvailabilityChange:
-			return NotifyMbmsServiceAvailabilityChangeCancel(aTsyReqHandle);
-		case EPacketUpdateMbmsMonitorServiceList:
-			return UpdateMbmsMonitorServiceListCancel(aTsyReqHandle);
-		case EPacketGetMbmsMonitoredServicesPhase1:
-		case EPacketGetMbmsMonitoredServicesPhase2:
-			return GetMbmsMonitoredServicesListCancel(aTsyReqHandle);
-		case EPacketEnumerateMbmsMonitorServiceList:
-			return EnumerateMbmsMonitorServiceListCancel(aTsyReqHandle);
-		case EPacketEnumerateMbmsActiveServiceList:
-			return EnumerateMbmsActiveServiceListCancel(aTsyReqHandle);
-
-		default:
-			return KErrGeneral; 
-		} 
-	}
-
-TInt CSimPacketService::NotifyContextAdded(const TTsyReqHandle aTsyReqHandle, TDes* aContextId)
-/**
-* Record a client's interest in being notified when a new context is added to the network.
-* First check that there isn't already a notification pending (the ETel Server should protect
-* against this) and then record the information necessary to complete the request later, when
-* the status does actually change.
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @param aContextId pointer to the packet context data
-* @return KErrNone
-*/
-	{
-	__ASSERT_ALWAYS(!iNotifyContextAdded.iNotifyPending,SimPanic(ENotificationAlreadyPending));
-
-	iNotifyContextAdded.iNotifyPending = ETrue;
-	iNotifyContextAdded.iNotifyHandle = aTsyReqHandle;
-	iNotifyContextAdded.iNotifyData = aContextId;
-	return KErrNone;
-	}
-
-TInt CSimPacketService::NotifyContextAddedCancel(const TTsyReqHandle aTsyReqHandle)
-/**
-* Cancel a client's interest in being notified when a new context is added.
-* This is acheived simply by resetting the flag that indicates a notification is pending.
-* 
-* @param aTsyReqHandle Tsy Request handle for the client cancel request
-* @return KErrNone
-*/
-	{
-	LOGPACKET1("CSimPacketService::NotifyContextAddedCancel called");
-	if(iNotifyContextAdded.iNotifyPending)
-		{
-		iNotifyContextAdded.iNotifyPending=EFalse;
-		ReqCompleted(aTsyReqHandle,KErrCancel);
-		}
-	return KErrNone;
-	}
-
-TInt CSimPacketService::Attach(const TTsyReqHandle aTsyReqHandle)
-/**
-* Client calls this method to attach to the service network.
-* In this TSY, the request is registered then the state machine (ActionEvent) is called
-* to handle the request making sure that the class state is updated and the phone is informed.
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @return TInt KErrnone if request completes ok
-*/
-	{
-	LOGPACKET1("CSimPacketService::Attach called");
-	iAttachRequestHandle=aTsyReqHandle;
-	return ActionEvent(EPacketEventAttach);
-	}
-
-TInt CSimPacketService::AttachCancel(const TTsyReqHandle aTsyReqHandle)
-/**
-* Cancels a clients interest in attaching to a network.
-* this can only be achieved if we're not already attached otherwise the request is ignored.
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @return TInt KErrnone if request completes ok
-*/
-	{
-	LOGPACKET1("CSimPacketService::AttachCancel called");
-	if((iState == RPacketService::EStatusUnattached) && (iCurrentEvent==EPacketEventAttach))
-		{
-		iTimer->Cancel();
-		iCurrentEvent= EPacketEventNone;
-		ReqCompleted(aTsyReqHandle,KErrCancel);
-		}
-	return KErrNone;
-	}
-
-/***
-* This function will detach the packet service and all its contexts from the network
-***/
-TInt CSimPacketService::DoDetach()
-	{
-	TInt ret=KErrNone;
-
-	switch(iState)
-		{
-		case RPacketService::EStatusUnattached:
-			break;
-
-		case RPacketService::EStatusAttached:
-			ret=ChangeState(RPacketService::EStatusUnattached);
-			ReqCompleted(iDetachRequestHandle,ret);
-			break;
-
-		case RPacketService::EStatusActive:
-		case RPacketService::EStatusSuspended:
-			{
-			TInt totalWrappers = iNifWrappers.Count();
-				
-			// deactivate all contexts in every nif
-			for(TInt j=0; j < totalWrappers; j++)
-				{
-				TInt totalContexts = iNifWrappers[j].NumberOfContexts();
-				for(TInt x =0; x<totalContexts; x++)
-					{
-					ret = iNifWrappers[j].GetContext(x)->AttemptDeactivateImmediately();
-					if(ret!=KErrNone)
-						{
-						break;
-						}
-					}
-				}
-	
-			if(ret==KErrNone)
-				{
-					ret=ChangeState(RPacketService::EStatusUnattached);
-				}
-				ReqCompleted(iDetachRequestHandle,ret);
-			}
-			break;
-		default:
-			break;
-		}
-	return ret;
-	}
-TInt CSimPacketService::Detach(const TTsyReqHandle aTsyReqHandle)
-/**
-* Client calls this method to detach from the service network.
-* In this TSY, the request is registered then the state machine (ActionEvent) is called
-* to handle the request making sure that the class state is updated and the phone is informed.
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @return TInt KErrnone if request completes ok
-*/
-	{
-	LOGPACKET1("CSimPacketService::Detach called");
-	iDetachRequestHandle=aTsyReqHandle;
-	return ActionEvent(EPacketEventDetach);
-	}
-
-TInt CSimPacketService::DetachCancel(const TTsyReqHandle aTsyReqHandle)
-/**
-* Cancels a clients interest in detaching from the network.
-* this can only be achieved if we're not already attached and in the process of detaching
-* but not detached yet otherwise the request is ignored.
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @return TInt KErrnone if request completes ok
-*/
-	{
-	LOGPACKET1("CSimPacketService::DetachCancel called");
-	if((iState == RPacketService::EStatusAttached) && (iCurrentEvent==EPacketEventDetach))
-			{
-			iTimer->Cancel();
-			iCurrentEvent= EPacketEventNone;
-			ReqCompleted(aTsyReqHandle,KErrCancel);
-			}
-	return KErrNone;
-	}
-
-TInt CSimPacketService::GetStatus(const TTsyReqHandle aTsyReqHandle, RPacketService::TStatus* aStatus)
-/**
-* Retrieves and returns the status of the Packet service
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @param aStatus pointer to the status
-* @return TInt err KErrNone if ok
-*/
-	{
-	LOGPACKET1("CSimPacketService::GetStatus called");
-	*aStatus = iState;
-	ReqCompleted(aTsyReqHandle,KErrNone);
-	return KErrNone;
-	}
-
-TInt CSimPacketService::NotifyStatusChange(const TTsyReqHandle aTsyReqHandle, RPacketService::TStatus* aStatus)
-/**
-* Record a client's interest in being notified of the state of the packet network and contexts.
-* First check that there isn't already a notification pending (the ETel Server should protect
-* against this) and then record the information necessary to complete the request later, when
-* the status does actually change.
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @param aStatus pointer to the packet service status
-* @return KErrNone
-*/
-	{
- 	__ASSERT_ALWAYS(!iNotifyStatusChange.iNotifyPending,SimPanic(ENotificationAlreadyPending));
-
-	iNotifyStatusChange.iNotifyPending = ETrue;
-	iNotifyStatusChange.iNotifyHandle = aTsyReqHandle;
-	iNotifyStatusChange.iNotifyData = aStatus;
-	return KErrNone;
-	}
-
-TInt CSimPacketService::NotifyStatusChangeCancel(const TTsyReqHandle aTsyReqHandle)
-/**
-* Cancel a client's interest in being notified when the call status changes.
-* This is acheived simply by resetting the flag that indicates a notification is pending.
-* 
-* @param aTsyReqHandle Tsy Request handle for the client cancel request
-* @return KErrNone
-*/
-	{
-	LOGPACKET1("CSimPacketService::NotifyStatusChangeCancel called");
-	if(iNotifyStatusChange.iNotifyPending)
-		{
-		iNotifyStatusChange.iNotifyPending=EFalse;
-		ReqCompleted(aTsyReqHandle,KErrCancel);
-		}
-	return KErrNone;
-	}
-
-
-
-TInt CSimPacketService::NotifyContextActivationRequested(const TTsyReqHandle aTsyReqHandle, TDes8* aContextParameters)
-/**
-* Record a client's interest in being notified when a context is activated.
-* First check that there isn't already a notification pending (the ETel Server should protect
-* against this) and then record the information necessary to complete the request later, when
-* the status does actually change.
-*
-* Hurricane does not support this method
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @param aStatus pointer to the packet service status
-* @return KErrNone
-*/
-	{
-	LOGPACKET1("CSimPacketService::NotifyContextActivationRequested called");
-	
-	iConfigData.iTsyReqHandle = aTsyReqHandle;
-	iConfigData.iData = aContextParameters;
-
-	if ( iIncomingContextManager->IsUseTimerOn() )
-		{ // Timer use is on, so we can use it.	
-		// 1st time by the reguest for notifictaion, 
-		// 2nd time when do ReqCompleted(aTsyReqHandle,KErrCancel);
-		    
-		iIncomingContextManager->StartFirstIncomingEvent();
-			// When timer is done we have completed the request to activate a PDP.
-		iIncomingContextManager->SetUseTimerOff();
-		}
-		
-	return KErrNone;
-	}
-
-TInt CSimPacketService::NotifyContextActivationRequestedCancel(const TTsyReqHandle aTsyReqHandle)
-/**
-* Cancel a client's interest in being notified when a context is activated.
-* This is acheived simply by resetting the flag that indicates a notification is pending.
-* 
-* @param aTsyReqHandle Tsy Request handle for the client cancel request
-* @return KErrNone
-*/
-	{
-	LOGPACKET1("CSimPacketService::NotifyContextActivationRequestedCancel called");
-
-	iIncomingContextManager->Cancel();	
-	iIncomingContextManager->SetUseTimerOff();	
-	
-	ReqCompleted(aTsyReqHandle, KErrNone);
-	return KErrNone;
-	}
-
-TInt CSimPacketService::RejectActivationRequest(const TTsyReqHandle aTsyReqHandle)
-/**
-* This method is called when a client wishes to reject an Activation request from the network
-* This is currently not supported in this version of the simulator tsy.
-*
-* Hurricane does not support this method
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @return KErrNone
-*/
-	{
-	ReqCompleted(aTsyReqHandle, KErrNotSupported);
-	return KErrNone;
-	}
-
-TInt CSimPacketService::RejectActivationRequestCancel(const TTsyReqHandle aTsyReqHandle)
-/**
-* This method cancels a clients' request  in rejecting an activation request.
-* The TSY is not supporting this method
-*
-* @param aTsyReqHandle Tsy Request handle for the client cancel request
-* @return KErrNone
-*/
-	{
-	ReqCompleted(aTsyReqHandle, KErrCancel);
-	return KErrNone;
-	}
-
-TInt CSimPacketService::EnumerateContexts(const TTsyReqHandle aTsyReqHandle, TInt* aCount, TInt* aMaxAllowed)
-/**
-* Returns the number of contexts opened on the packet service
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @param aCount pointer to the number of contexts opened.
-* @param aMaxAllowed pointer to the maximum number of contexts that can be opened on the packet service
-* @return KErrNone
-*/
-	{
-	LOGPACKET1("CSimPacketService::EnumerateContexts called");
-	// this should enumerate all primary and secondary contexts
-	*aCount = iPrimaryContextNameInc + iSecondaryContextNameInc;
-	*aMaxAllowed = KMaxContextPoolSize;
-	ReqCompleted(aTsyReqHandle,KErrNone);
-	return KErrNone;
-	}
-	
-TInt CSimPacketService::EnumerateContextsCancel(const TTsyReqHandle /*aTsyReqHandle*/)
-/**
-* This method cancels a clients' request in Enmerationg the contexts
-* This does nothing as Enumerate context is processed synchronously
-* 
-* @param aTsyReqHandle Tsy Request handle for the client cancel request
-* @return KErrNone
-*/
-	{
-	LOGPACKET1("CSimPacketService::Enumerate Context Cancel called");
-	return KErrNone;
-	}
-
-TInt CSimPacketService::GetContextInfo(const TTsyReqHandle aTsyReqHandle, TInt* aIndex,RPacketService::TContextInfo* aInfo)
-/**
-* Retrieves a specific context info specified by the index variable
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @param aIndex pointer to the index of the context the info is requested from
-* @param aInfo pointer to the context info. 
-* @return KErrNone if context is found in the list of contexts 
-*/
-	{
-	LOGPACKET1("CSimPacketService::GetContextInfo called");
-	CSimPacketContext*  packetContext;
-
-	if((*aIndex >= iContextCount) || (*aIndex < 0))
-		ReqCompleted(aTsyReqHandle,KErrArgument);
-	else {
-		// this method is used in conjunction with EnumerateContexts() which for Jetstream
-		// now returns the number of all contexts - not just the number of primary contexts as
-		// was done in Hurricane. To that end, the index passed as a parameter needs to be translated
-		// to take into account the nifwrappers array's contexts.
-		TInt realIndex=*aIndex;
-		TInt i;
-		TInt wrappersCount = iNifWrappers.Count();
-		for(i = 0; i<wrappersCount; i++)
-			{
-			if(iNifWrappers[i].NumberOfContexts() <= realIndex)
-				{
-				realIndex-=iNifWrappers[i].NumberOfContexts();
-				continue;
-				}
-			else
-				{
-				break;
-				}
-			}
-		packetContext = iNifWrappers[i].GetContext(realIndex);
-		aInfo->iName.Copy(packetContext->ContextName());
-		aInfo->iStatus = packetContext->ContextStatus();
-		ReqCompleted(aTsyReqHandle,KErrNone);
-		}
-	return KErrNone;
-	}
-
-TInt CSimPacketService::GetContextInfoCancel(const TTsyReqHandle /*aTsyReqHandle*/) 
-/**
-* Cancels a clients request for a context info
-*
-* @param aTsyReqHandle Tsy Request handle for the client cancel request
-* @return KErrNone
-*/
-	{
-	return KErrNone;
-	}
-
-TInt CSimPacketService::GetNtwkRegStatus(const TTsyReqHandle aTsyReqHandle, RPacketService::TRegistrationStatus* aRegistrationStatus)
-/**
-* Returns the Network registration status to the client.
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @param aRegistrationStatus pointer to the registration status info requested
-* @return KErrNone 
-*/
-	{
-	LOGPACKET1("CSimPacketService::GetNtwkRegStatus called");
-	*aRegistrationStatus = (RPacketService::TRegistrationStatus)iCurrentRegStatus;
-	ReqCompleted(aTsyReqHandle,KErrNone);
-	return KErrNone;
-	}
-
-TInt CSimPacketService::NotifyChangeOfNtwkRegStatus(const TTsyReqHandle aTsyReqHandle, RPacketService::TRegistrationStatus* aRegistrationStatus)
-/**
-* Record a client's interest in being notified of a change in the Nk registration status.
-* First check that there isn't already a notification pending (the ETel Server should protect
-* against this) and then record the information necessary to complete the request later, when
-* the status does actually change.
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @param aRegistrationStatus pointer to the Network registration status
-* @return KErrNone
-*/
-	{
-	if(iNtwkRegStatusInfo->Count()==0)
-		{
-		ReqCompleted(aTsyReqHandle,KErrNotSupported);
-		return KErrNone;
-		}
-
-	__ASSERT_ALWAYS(!iNotifyChangeOfNtwk.iNotifyPending,SimPanic(ENotificationReqAlreadyOutstanding));
-	iNotifyChangeOfNtwk.iNotifyPending=ETrue;
-	iNotifyChangeOfNtwk.iNotifyHandle=aTsyReqHandle;
-	iNotifyChangeOfNtwk.iNotifyData=aRegistrationStatus;
-	return KErrNone;
-	}
-
-TInt CSimPacketService::NotifyChangeOfNtwkRegStatusCancel(const TTsyReqHandle aTsyReqHandle)
-/**
-* Cancel a client's interest in being notified of a change in the Nk registration status.
-* This is acheived simply by resetting the flag that indicates a notification is pending.
-* 
-* @param aTsyReqHandle Tsy Request handle for the client cancel request
-* @return KErrNone
-*/
-	{
-	LOGPACKET1("CSimPacketService::NotifyChangeOfNtwkRegStatusCancel called");
-	if(iNotifyChangeOfNtwk.iNotifyPending)
-		{
-		iNotifyChangeOfNtwk.iNotifyPending=EFalse;
-		ReqCompleted(aTsyReqHandle,KErrCancel);
-		}
-	return KErrNone;
-	}
-
-TInt CSimPacketService::GetMSClass(const TTsyReqHandle aTsyReqHandle, RPacketService::TMSClass* aCurrentClass, RPacketService::TMSClass* aMaxClass)
-/**
-* Returns the Current MSClass supported by the TSY.
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @param aCurrentClass pointer to the current MSClass
-* @param aMaxClass the maximum MSClass this TSY can support
-* @return KErrNone 
-*/
-	{
-	//This version of the Simulator TSY will only support CLASS B i.e EMSClassSuspensionRequired
-	*aCurrentClass = iMSClass;
-	*aMaxClass = RPacketService::EMSClassSuspensionRequired;
-	ReqCompleted(aTsyReqHandle,KErrNone);
-	return KErrNone;
-	}
-
-TInt CSimPacketService::GetMSClassCancel(const TTsyReqHandle /*aTsyReqHandle*/)
-/**
-* Cancels a clients request in retrieving the current MSClass supported by the TSY.
-*
-* @param aTsyReqHandle Tsy Request handle for the client cancel request
-* @return KErrNone
-*/
-	{
-	return KErrNone;
-	}
-
-TInt CSimPacketService::SetMSClass(const TTsyReqHandle aTsyReqHandle, RPacketService::TMSClass* aClass)
-/**
-* Sets the MSClass for the TSY. This TSY current support Class B only and cannot be reset.
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @param aClass pointer to the MSClass to set the TSY to support
-* @return KErrNone
-*/
-	{
-	if(*aClass != RPacketService::EMSClassSuspensionRequired)
-		ReqCompleted(aTsyReqHandle,KErrNotSupported);
-	else {
-		iMSClass = *aClass;
-		ReqCompleted(aTsyReqHandle,KErrNone);
-		}
-	return KErrNone;
-	}
-
-TInt CSimPacketService::SetMSClassCancel(const TTsyReqHandle /*aTsyReqHandle*/)
-/**
-* Cancels a clients interest in setting the MSClass support for the TSY.
-*
-* @param aTsyReqHandle Tsy Request handle for the client cancel request
-* @return KErrNone
-*/
-	{
-	return KErrNone;
-	}
-
-TInt CSimPacketService::NotifyMSClassChange(const TTsyReqHandle aTsyReqHandle, RPacketService::TMSClass* /*aNewClass*/)
-/**
-* Record a client's interest in being notified of a change of MSClass supported.
-* First check that there isn't already a notification pending (the ETel Server should protect
-* against this) and then record the information necessary to complete the request later, when
-* the status does actually change.
-* 
-* Currently the TSY will only support Class B and thus this method is not supported.
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @param aNewClass pointer to the MSClass to set to
-* @return KErrNone
-*/
-	{
-	ReqCompleted(aTsyReqHandle,KErrNotSupported);
-	return KErrNone;
-	}
-
-TInt CSimPacketService::NotifyMSClassChangeCancel(const TTsyReqHandle /*aTsyReqHandle*/)
-/**
-* Cancel a client's interest in being notified of a change of MSClass supported.
-* This is acheived simply by resetting the flag that indicates a notification is pending.
-* 
-* @param aTsyReqHandle Tsy Request handle for the client cancel request
-* @return KErrNone
-*/
-	{
-	return KErrNone;
-	}
-
-TInt CSimPacketService::GetStaticCaps(const TTsyReqHandle aTsyReqHandle, TUint* aCaps,RPacketContext::TProtocolType* aPdpType)
-/**
-* Returns the Static capabilities supported by the TSY
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @param aCaps pointer to the TSY's capability
-* @param aPdpType protocol type used by the TSY
-* @return KErrNone
-*/
-	{
-	LOGPACKET1("CSimPacketService::GetStaticCaps called");
-	*aCaps = KPacketServiceCaps;
-	*aPdpType = RPacketContext::EPdpTypePPP;
-	ReqCompleted(aTsyReqHandle,KErrNone);
-	return KErrNone;
-	}
-
-/**
-* Returns the Dynamic capabilities supported by the TSY
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @param aCaps Pointer to be populated with the dynamic capabilities of the TSY
-* @return KErrNone
-*/
-TInt CSimPacketService::GetDynamicCaps(const TTsyReqHandle aTsyReqHandle, RPacketService::TDynamicCapsFlags* aCaps)
-	{
-	LOGPACKET1("CSimPacketService::GetDynamicCaps called");
-	
-	if (iDynamicCapsArray->Count() == 0)
-		{
-		ReqCompleted(aTsyReqHandle, KErrNotSupported);
-		return KErrNone;
-		}
-	*aCaps = iCurrentDynamicCaps;
-	ReqCompleted(aTsyReqHandle,KErrNone);
-	return KErrNone;
-	}
-
-/**
-* Registers a client interest of change in the Dynamic capabilities change.
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @param aCaps Pointer to be populated with the dynamic capabilities of the TSY
-* @return KErrNone
-*/
-TInt CSimPacketService::NotifyDynamicCapsChange(const TTsyReqHandle aTsyReqHandle, RPacketService::TDynamicCapsFlags* aCaps)
-	{
-	LOGPACKET1("CSimPacketService::NotifyDynamicCapsChange called");
-	__ASSERT_ALWAYS(!iNotifyDynamicCapsChange.iNotifyPending,SimPanic(ENotificationAlreadyPending));
- 
-	if (iDynamicCapsArray->Count() == 0)
-		{
-		ReqCompleted(aTsyReqHandle,KErrNotSupported);
-		return KErrNone;
-		}
-	
-	iNotifyDynamicCapsChange.iNotifyPending = ETrue;
-	iNotifyDynamicCapsChange.iNotifyHandle = aTsyReqHandle;
-	iNotifyDynamicCapsChange.iNotifyData = aCaps;
-	return KErrNone;
-	}
-
-/**
-* Cancels a clients interest in the change of dynamic caps.
-*
-* @param aTsyReqHandle Tsy Request handle for the client cancel request
-* @return KErrNone
-*/
-TInt CSimPacketService::NotifyDynamicCapsChangeCancel(const TTsyReqHandle aTsyReqHandle)
-	{
-	LOGPACKET1("CSimPacketService::NotifyDynamicCapsChangeCancel called");
-	if( (iNotifyDynamicCapsChange.iNotifyPending) && (aTsyReqHandle == iNotifyDynamicCapsChange.iNotifyHandle))
-		{
-		iNotifyDynamicCapsChange.iNotifyPending=EFalse;
-		ReqCompleted(aTsyReqHandle,KErrCancel);
-		}
-	return KErrNone;
-	}
-
-/**
-* Timer callback function to simulate a change in the dynamic capabilities of the TSY
-*/
-void CSimPacketService::TimerCallBackDynamicCaps()
-	{
-	if (++iDynamicCapsIndex >= iDynamicCapsArray->Count())
-		{
-		return;
-		}
-	iCurrentDynamicCaps = iDynamicCapsArray->At(iDynamicCapsIndex).iDynamicCaps;
-	if (iNotifyDynamicCapsChange.iNotifyPending)
-		{
-		iNotifyDynamicCapsChange.iNotifyPending = EFalse;
-		*(TInt*)iNotifyDynamicCapsChange.iNotifyData = iCurrentDynamicCaps;
-		ReqCompleted(iNotifyDynamicCapsChange.iNotifyHandle,KErrNone);
-		}
-	
-	iDynamicCapsTimer->Start(iDynamicCapsArray->At(iDynamicCapsIndex).iDuration, this, ETimerIdPcktServDynamicCaps);
-	}
-
-TInt CSimPacketService::SetAttachMode(const TTsyReqHandle aTsyReqHandle, RPacketService::TAttachMode* aMode)
-/**
-* Sets the attach mode to be used by the tsy.
-* Currently The TSY supports EAttachWhenNeeded only.
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @param aMode pointer to the mode to change to
-* @return KErrNone 
-*/
-	{
-	LOGPACKET1("CSimPacketService::SetAttachMode called");
-	if(*aMode != RPacketService::EAttachWhenNeeded)
-		{
-		ReqCompleted(aTsyReqHandle, KErrNotSupported);
-		}
-	else 
-		{
-		iAttachMode = *aMode;
-		// Check for a pending attach mode notification.
-		if(iNotifyChangeOfAttachMode.iNotifyPending)
-			{
-			iNotifyChangeOfAttachMode.iNotifyPending=EFalse;
-			*(RPacketService::TAttachMode*)iNotifyChangeOfAttachMode.iNotifyData = iAttachMode;
-			ReqCompleted(iNotifyChangeOfAttachMode.iNotifyHandle,KErrNone);
-			}	
-		ReqCompleted(aTsyReqHandle,KErrNone);
-		}
-	return KErrNone;
-	}
-
-TInt CSimPacketService::GetAttachMode(const TTsyReqHandle aTsyReqHandle, RPacketService::TAttachMode* aMode)
-/**
-* Retrieves and returns the current attach mode for the TSY.
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @param aMode pointer to the mode to change
-* @return KErrNone 
-*/
-	{
-	LOGPACKET1("CSimPacketService::GetAttachMode called");
-	*aMode = iAttachMode;
-	ReqCompleted(aTsyReqHandle,KErrNone);
-	return KErrNone;
-	}
-	
-TInt CSimPacketService::NotifyAttachModeChange(const TTsyReqHandle aTsyReqHandle, RPacketService::TAttachMode* aMode)
-/**
-* Set notification request for change of current attach mode
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @param aMode pointer to the mode to change
-* @return KErrNone 
-*/
-	{
-	LOGPACKET1("CSimPacketService::NotifyAttachModeChange called");
-	
-	__ASSERT_ALWAYS(!iNotifyChangeOfAttachMode.iNotifyPending,SimPanic(ENotificationAlreadyPending));
-	
-	iNotifyChangeOfAttachMode.iNotifyPending=ETrue;
-	iNotifyChangeOfAttachMode.iNotifyHandle=aTsyReqHandle;
-	iNotifyChangeOfAttachMode.iNotifyData=aMode;
-		
-	return KErrNone;
-	}
-
-TInt CSimPacketService::SetDefaultContextParams(const TTsyReqHandle aTsyReqHandle, const TDesC8* aPckg)
-/**
-* Sets the Default Context Parameters to be used when attaching and activating a context.
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @param aPckg pointer containing the parameters to set to.
-* @return KErrNone
-*/
-	{
-	LOGPACKET1("CSimPacketService::SetDefaultContextParams called");
-	
-	TPckg<TPacketDataConfigBase>* configBase = (TPckg<TPacketDataConfigBase>*)aPckg;
-	TPacketDataConfigBase& configBaseV1 = (*configBase)();
-
-		
-	// GPRS
-	if(configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigGPRS)
-		{
-		iPhone->UpdateNetworkMode(RMobilePhone::ENetworkModeGsm);
-		TPckg<RPacketContext::TContextConfigGPRS>* defaultContextGPRSPckg = (TPckg<RPacketContext::TContextConfigGPRS>*)aPckg;
-		RPacketContext::TContextConfigGPRS& defaultContextGPRSV1 = (*defaultContextGPRSPckg)();
-
-		TBuf8<RPacketContext::KGSNNameLength> accessPointName;
-		accessPointName.Copy(defaultContextGPRSV1.iAccessPointName);
-
-		TBuf8<RPacketContext::KMaxPDPAddressLength> dpAddress;
-		dpAddress.Copy(defaultContextGPRSV1.iPdpAddress);
-
-		TBuf8<RPacketContext::KMaxAuthDataLength> password;
-		password.Copy(defaultContextGPRSV1.iProtocolConfigOption.iAuthInfo.iPassword);
-
-		TBuf8<RPacketContext::KMaxAuthDataLength> username;
-		username.Copy(defaultContextGPRSV1.iProtocolConfigOption.iAuthInfo.iUsername);
-
-		TBuf8<RPacketContext::KMaxAuthDataLength> challenge;
-		challenge.Copy(defaultContextGPRSV1.iProtocolConfigOption.iChallenge);
-		
-		TBuf8<RPacketContext::KMaxAuthDataLength> response;
-		response.Copy(defaultContextGPRSV1.iProtocolConfigOption.iResponse);
-
-		TBuf8<RPacketContext::KMaxPDPAddressLength> primaryDNS;
-		primaryDNS.Copy(defaultContextGPRSV1.iProtocolConfigOption.iDnsAddresses.iPrimaryDns);
-
-		TBuf8<RPacketContext::KMaxAuthDataLength> secondaryDNS;
-		secondaryDNS.Copy(defaultContextGPRSV1.iProtocolConfigOption.iDnsAddresses.iSecondaryDns);
-
-		TBuf8<RPacketContext::KMiscProtocolBufferLength> miscBuffer;
-		miscBuffer.Copy(defaultContextGPRSV1.iProtocolConfigOption.iMiscBuffer);
-
-		if ((defaultContextGPRSV1.iPdpType != iGPRSDefaultConfig.iProtocolType)||
-			(iGPRSDefaultConfig.iGsnAddress.Compare(accessPointName) != KErrNone) ||
-			(iGPRSDefaultConfig.iProtocolAddress.Compare(dpAddress) != KErrNone) ||
-			(defaultContextGPRSV1.iPdpCompression != iGPRSDefaultConfig.iPdpCompression) ||
-			(defaultContextGPRSV1.iAnonymousAccessReqd != iGPRSDefaultConfig.iAnonymousAccess) ||
-			(defaultContextGPRSV1.iUseEdge != iGPRSDefaultConfig.iUseEdge) ||
-			(defaultContextGPRSV1.iProtocolConfigOption.iAuthInfo.iProtocol != iGPRSDefaultConfig.iProtocolConfigOption.iAuthProtocol) ||
-			((iGPRSDefaultConfig.iProtocolConfigOption.iPassword).Compare(password) != KErrNone) ||
-			((iGPRSDefaultConfig.iProtocolConfigOption.iUsername).Compare(username) != KErrNone) ||
-			((iGPRSDefaultConfig.iProtocolConfigOption.iChallenge).Compare(challenge) != KErrNone) ||
-			((iGPRSDefaultConfig.iProtocolConfigOption.iResponse).Compare(response) != KErrNone) ||
-			((iGPRSDefaultConfig.iProtocolConfigOption.iPrimaryDNS).Compare(primaryDNS) != KErrNone) ||
-			((iGPRSDefaultConfig.iProtocolConfigOption.iSecondaryDNS).Compare(secondaryDNS) != KErrNone) ||
-			(iGPRSDefaultConfig.iProtocolConfigOption.iId != defaultContextGPRSV1.iProtocolConfigOption.iId))
-				ReqCompleted(aTsyReqHandle,KErrArgument);
-		else
-				ReqCompleted(aTsyReqHandle,KErrNone);
-		}
-	// UMTS
-	else if (configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigRel99Rel4)
-		{
-		iPhone->UpdateNetworkMode(RMobilePhone::ENetworkModeGsm);
-		TPckg<RPacketContext::TContextConfigR99_R4>* defaultContextR99_R4Pckg = (TPckg<RPacketContext::TContextConfigR99_R4>*)aPckg;
-		RPacketContext::TContextConfigR99_R4& defaultContextR99_R4V1 = (*defaultContextR99_R4Pckg)();
-
-		TBuf8<RPacketContext::KGSNNameLength> accessPointName;
-		accessPointName.Copy(defaultContextR99_R4V1.iAccessPointName);
-
-		TBuf8<RPacketContext::KMaxPDPAddressLength> dpAddress;
-		dpAddress.Copy(defaultContextR99_R4V1.iPdpAddress);
-
-		TBuf8<RPacketContext::KMaxAuthDataLength> password;
-		password.Copy(defaultContextR99_R4V1.iProtocolConfigOption.iAuthInfo.iPassword);
-
-		TBuf8<RPacketContext::KMaxAuthDataLength> username;
-		username.Copy(defaultContextR99_R4V1.iProtocolConfigOption.iAuthInfo.iUsername);
-
-		TBuf8<RPacketContext::KMaxAuthDataLength> challenge;
-		challenge.Copy(defaultContextR99_R4V1.iProtocolConfigOption.iChallenge);
-		
-		TBuf8<RPacketContext::KMaxAuthDataLength> response;
-		response.Copy(defaultContextR99_R4V1.iProtocolConfigOption.iResponse);
-
-		TBuf8<RPacketContext::KMaxPDPAddressLength> primaryDNS;
-		primaryDNS.Copy(defaultContextR99_R4V1.iProtocolConfigOption.iDnsAddresses.iPrimaryDns);
-
-		TBuf8<RPacketContext::KMaxAuthDataLength> secondaryDNS;
-		secondaryDNS.Copy(defaultContextR99_R4V1.iProtocolConfigOption.iDnsAddresses.iSecondaryDns);
-
-		TBuf8<RPacketContext::KMiscProtocolBufferLength> miscBuffer;
-		miscBuffer.Copy(defaultContextR99_R4V1.iProtocolConfigOption.iMiscBuffer);
-		
-		if ((defaultContextR99_R4V1.iPdpType != iR99_R4DefaultConfig.iProtocolType)||
-				(iR99_R4DefaultConfig.iGsnAddress.Compare(accessPointName) != KErrNone) ||
-				(iR99_R4DefaultConfig.iProtocolAddress.Compare(dpAddress) != KErrNone) ||
-				(defaultContextR99_R4V1.iUseEdge != iR99_R4DefaultConfig.iUseEdge) ||
-			   (defaultContextR99_R4V1.iProtocolConfigOption.iAuthInfo.iProtocol != iR99_R4DefaultConfig.iProtocolConfigOption.iAuthProtocol) ||
-			   ((iR99_R4DefaultConfig.iProtocolConfigOption.iPassword).Compare(password) != KErrNone) ||
-			   ((iR99_R4DefaultConfig.iProtocolConfigOption.iUsername).Compare(username) != KErrNone) ||
-			   ((iR99_R4DefaultConfig.iProtocolConfigOption.iChallenge).Compare(challenge) != KErrNone) ||
-			   ((iR99_R4DefaultConfig.iProtocolConfigOption.iResponse).Compare(response) != KErrNone) ||
-			   ((iR99_R4DefaultConfig.iProtocolConfigOption.iPrimaryDNS).Compare(primaryDNS) != KErrNone) ||
-			   ((iR99_R4DefaultConfig.iProtocolConfigOption.iSecondaryDNS.Compare(secondaryDNS) != KErrNone) ||
-			   (iR99_R4DefaultConfig.iProtocolConfigOption.iId != defaultContextR99_R4V1.iProtocolConfigOption.iId)))
-
-			ReqCompleted(aTsyReqHandle,KErrArgument);
-		else
-			ReqCompleted(aTsyReqHandle,KErrNone);
-		}
-	//R5
-	else if(configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigRel5)
-		{
-		iPhone->UpdateNetworkMode(RMobilePhone::ENetworkModeGsm);
-		TPckg<RPacketContext::TContextConfig_R5>* defaultContext_R5Pckg = (TPckg<RPacketContext::TContextConfig_R5>*)aPckg;
-		RPacketContext::TContextConfig_R5& defaultContextR5 = (*defaultContext_R5Pckg)();
-
-		TBuf8<RPacketContext::KGSNNameLength> accessPointName;
-		accessPointName.Copy(defaultContextR5.iAccessPointName);
-
-		TBuf8<RPacketContext::KMaxPDPAddressLength> dpAddress;
-		dpAddress.Copy(defaultContextR5.iPdpAddress);
-
-		TBuf8<RPacketContext::KMaxAuthDataLength> password;
-		password.Copy(defaultContextR5.iProtocolConfigOption.iAuthInfo.iPassword);
-
-		TBuf8<RPacketContext::KMaxAuthDataLength> username;
-		username.Copy(defaultContextR5.iProtocolConfigOption.iAuthInfo.iUsername);
-
-		TBuf8<RPacketContext::KMaxAuthDataLength> challenge;
-		challenge.Copy(defaultContextR5.iProtocolConfigOption.iChallenge);
-		
-		TBuf8<RPacketContext::KMaxAuthDataLength> response;
-		response.Copy(defaultContextR5.iProtocolConfigOption.iResponse);
-
-		TBuf8<RPacketContext::KMaxPDPAddressLength> primaryDNS;
-		primaryDNS.Copy(defaultContextR5.iProtocolConfigOption.iDnsAddresses.iPrimaryDns);
-
-		TBuf8<RPacketContext::KMaxAuthDataLength> secondaryDNS;
-		secondaryDNS.Copy(defaultContextR5.iProtocolConfigOption.iDnsAddresses.iSecondaryDns);
-
-		TBuf8<RPacketContext::KMiscProtocolBufferLength> miscBuffer;
-		miscBuffer.Copy(defaultContextR5.iProtocolConfigOption.iMiscBuffer);
-
-		if ((defaultContextR5.iPdpType != iR5DefaultConfig.iProtocolType)||
-			(iR5DefaultConfig.iGsnAddress.Compare(accessPointName) != KErrNone) ||
-			(iR5DefaultConfig.iProtocolAddress.Compare(dpAddress) != KErrNone) ||
-			(defaultContextR5.iUseEdge != iR5DefaultConfig.iUseEdge) ||
-			(defaultContextR5.iProtocolConfigOption.iAuthInfo.iProtocol != iR5DefaultConfig.iProtocolConfigOption.iAuthProtocol) ||
-			((iR5DefaultConfig.iProtocolConfigOption.iPassword).Compare(password) != KErrNone) ||
-			((iR5DefaultConfig.iProtocolConfigOption.iUsername).Compare(username) != KErrNone) ||
-			((iR5DefaultConfig.iProtocolConfigOption.iChallenge).Compare(challenge) != KErrNone) ||
-			((iR5DefaultConfig.iProtocolConfigOption.iResponse).Compare(response) != KErrNone) ||
-			((iR5DefaultConfig.iProtocolConfigOption.iPrimaryDNS).Compare(primaryDNS) != KErrNone) ||
-			((iR5DefaultConfig.iProtocolConfigOption.iSecondaryDNS).Compare(secondaryDNS) != KErrNone) ||
-			(iR5DefaultConfig.iProtocolConfigOption.iId != defaultContextR5.iProtocolConfigOption.iId) ||
-			(iR5DefaultConfig.iPdpHeaderCompression != defaultContextR5.iPdpHeaderCompression) ||
-			(iR5DefaultConfig.iPdpDataCompression != defaultContextR5.iPdpDataCompression))
-			{
-			ReqCompleted(aTsyReqHandle,KErrArgument);
-			}
-		else
-			{
-			ReqCompleted(aTsyReqHandle,KErrNone);
-			}
-		}
-	else 
-		{
-		iPhone->UpdateNetworkMode(RMobilePhone::ENetworkModeUnknown);
-		}
-	return KErrNone;
-	}
-
-
-TInt CSimPacketService::GetGPRSDefaultContextParams(const TTsyReqHandle aTsyReqHandle, TDes8* aPckg)
-/**
-* Returns the Default Context Parameters set by the client.
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @param aPckg pointer containing the parameters to return to client.
-* @return KErrNone
-*/
-	{
-	LOGPACKET1("CSimPacketService::GetDefaultContextParams called");
-
-	TPckg<RPacketContext::TContextConfigGPRS>* contextConfigGPRSPckg = (TPckg<RPacketContext::TContextConfigGPRS>*)aPckg;
-	RPacketContext::TContextConfigGPRS& contextConfigV1 = (*contextConfigGPRSPckg)();
-
-	contextConfigV1.iAccessPointName.Copy(KApn);
-	contextConfigV1.iAnonymousAccessReqd = RPacketContext::ERequired;
-	contextConfigV1.iPdpAddress.Copy(KProtocolAddress);
-	contextConfigV1.iPdpCompression = 1;
-	contextConfigV1.iPdpType =  RPacketContext::EPdpTypeIPv6;  
-
-	contextConfigV1.iUseEdge = ETrue;
-	contextConfigV1.iProtocolConfigOption.iAuthInfo.iUsername.Copy(KUsername);
-	contextConfigV1.iProtocolConfigOption.iAuthInfo.iPassword.Copy(KPassword);
-	contextConfigV1.iProtocolConfigOption.iChallenge.Copy(KChallenge);
-	contextConfigV1.iProtocolConfigOption.iResponse.Copy(KResponse);
-	contextConfigV1.iProtocolConfigOption.iDnsAddresses.iPrimaryDns.Copy(KPrimaryDNS);
-	contextConfigV1.iProtocolConfigOption.iDnsAddresses.iSecondaryDns.Copy(KSecondaryDNS);
-	contextConfigV1.iProtocolConfigOption.iId = 1;
-	contextConfigV1.iProtocolConfigOption.iMiscBuffer.Copy(_L(""));
-	ReqCompleted(aTsyReqHandle,KErrNone);
-	return KErrNone;
-	}
-	
-TInt CSimPacketService::GetDefaultContextParams(const TTsyReqHandle aTsyReqHandle, TDes8* aPckg)
-/**
-* Returns the Default Context Parameters set by the client.
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @param aPckg pointer containing the parameters to return to client.
-* @return KErrNone
-*/
-	{
-	LOGPACKET1("CSimPacketService::GetDefaultContextParams called");
-	TPckg<TPacketDataConfigBase>* configBase = (TPckg<TPacketDataConfigBase>*)aPckg;
-	TPacketDataConfigBase& configBaseV1 = (*configBase)();
-
-	// GPRS
-	if(configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigGPRS)
-		{
-		TPckg<RPacketContext::TContextConfigGPRS>* contextConfigGPRSPckg = (TPckg<RPacketContext::TContextConfigGPRS>*)aPckg;
-		RPacketContext::TContextConfigGPRS& contextConfigV1 = (*contextConfigGPRSPckg)();
-
-		contextConfigV1.iAccessPointName.Copy(iGPRSDefaultConfig.iGsnAddress);// = STATIC_CAST(RPacketContext::TGSNAddress,accessPointName);
-		contextConfigV1.iAnonymousAccessReqd = STATIC_CAST(RPacketContext::TAnonymousAccess,iGPRSDefaultConfig.iAnonymousAccess);
-		contextConfigV1.iPdpAddress.Copy(iGPRSDefaultConfig.iProtocolAddress);// = STATIC_CAST(RPacketContext::TProtocolAddress, dpAddress);
-		contextConfigV1.iPdpCompression = STATIC_CAST(TUint, iGPRSDefaultConfig.iPdpCompression);
-		contextConfigV1.iPdpType = STATIC_CAST(RPacketContext::TProtocolType, iGPRSDefaultConfig.iProtocolType);
-		contextConfigV1.iUseEdge = iGPRSDefaultConfig.iUseEdge;
-		contextConfigV1.iProtocolConfigOption.iAuthInfo.iProtocol = STATIC_CAST(RPacketContext::TAuthProtocol, iGPRSDefaultConfig.iProtocolConfigOption.iAuthProtocol);
-		contextConfigV1.iProtocolConfigOption.iAuthInfo.iUsername.Copy(iGPRSDefaultConfig.iProtocolConfigOption.iUsername);
-		contextConfigV1.iProtocolConfigOption.iAuthInfo.iPassword.Copy(iGPRSDefaultConfig.iProtocolConfigOption.iPassword);
-		contextConfigV1.iProtocolConfigOption.iChallenge.Copy(iGPRSDefaultConfig.iProtocolConfigOption.iChallenge);
-		contextConfigV1.iProtocolConfigOption.iResponse.Copy(iGPRSDefaultConfig.iProtocolConfigOption.iResponse);
-		contextConfigV1.iProtocolConfigOption.iDnsAddresses.iPrimaryDns.Copy(iGPRSDefaultConfig.iProtocolConfigOption.iPrimaryDNS);
-		contextConfigV1.iProtocolConfigOption.iDnsAddresses.iSecondaryDns.Copy(iGPRSDefaultConfig.iProtocolConfigOption.iSecondaryDNS);
-		contextConfigV1.iProtocolConfigOption.iId = STATIC_CAST(TUint8, iGPRSDefaultConfig.iProtocolConfigOption.iId);
-		contextConfigV1.iProtocolConfigOption.iMiscBuffer.Copy(iGPRSDefaultConfig.iProtocolConfigOption.iMiscBuffer);
-		ReqCompleted(aTsyReqHandle,KErrNone);
-		}
-	// UMTS
-	else if(configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigRel99Rel4)
-		{
-		TPckg<RPacketContext::TContextConfigR99_R4>* contextConfigR99_R4Pckg = (TPckg<RPacketContext::TContextConfigR99_R4>*)aPckg;
-		RPacketContext::TContextConfigR99_R4& contextConfigV1 = (*contextConfigR99_R4Pckg)();
-
-		contextConfigV1.iAccessPointName.Copy(iR99_R4DefaultConfig.iGsnAddress);// = STATIC_CAST(RPacketContext::TGSNAddress,accessPointName);
-		contextConfigV1.iPdpAddress.Copy(iR99_R4DefaultConfig.iProtocolAddress);// = STATIC_CAST(RPacketContext::TProtocolAddress, dpAddress);
-		contextConfigV1.iPdpType = STATIC_CAST(RPacketContext::TProtocolType, iR99_R4DefaultConfig.iProtocolType);
-		contextConfigV1.iUseEdge = iR99_R4DefaultConfig.iUseEdge;
-		contextConfigV1.iProtocolConfigOption.iAuthInfo.iProtocol = STATIC_CAST(RPacketContext::TAuthProtocol, iR99_R4DefaultConfig.iProtocolConfigOption.iAuthProtocol);
-		contextConfigV1.iProtocolConfigOption.iAuthInfo.iUsername.Copy(iR99_R4DefaultConfig.iProtocolConfigOption.iUsername);
-		contextConfigV1.iProtocolConfigOption.iAuthInfo.iPassword.Copy(iR99_R4DefaultConfig.iProtocolConfigOption.iPassword);
-		contextConfigV1.iProtocolConfigOption.iChallenge.Copy(iR99_R4DefaultConfig.iProtocolConfigOption.iChallenge);
-		contextConfigV1.iProtocolConfigOption.iResponse.Copy(iR99_R4DefaultConfig.iProtocolConfigOption.iResponse);
-		contextConfigV1.iProtocolConfigOption.iDnsAddresses.iPrimaryDns.Copy(iR99_R4DefaultConfig.iProtocolConfigOption.iPrimaryDNS);
-		contextConfigV1.iProtocolConfigOption.iDnsAddresses.iSecondaryDns.Copy(iR99_R4DefaultConfig.iProtocolConfigOption.iSecondaryDNS);
-		contextConfigV1.iProtocolConfigOption.iId = STATIC_CAST(TUint8, iR99_R4DefaultConfig.iProtocolConfigOption.iId);
-		contextConfigV1.iProtocolConfigOption.iMiscBuffer.Copy(iR99_R4DefaultConfig.iProtocolConfigOption.iMiscBuffer);
-		ReqCompleted(aTsyReqHandle,KErrNone);
-		}
-
-	//R5
-	else if(configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigRel5)
-		{
-		TPckg<RPacketContext::TContextConfig_R5>* contextConfigR5Pckg = (TPckg<RPacketContext::TContextConfig_R5>*)aPckg;
-		RPacketContext::TContextConfig_R5& contextConfigV1 = (*contextConfigR5Pckg)();
-
-		contextConfigV1.iAccessPointName.Copy(iR5DefaultConfig.iGsnAddress);
-		contextConfigV1.iPdpAddress.Copy(iR5DefaultConfig.iProtocolAddress);
-		contextConfigV1.iPdpType = static_cast<RPacketContext::TProtocolType>(iR5DefaultConfig.iProtocolType);
-		contextConfigV1.iUseEdge = iR5DefaultConfig.iUseEdge;
-		contextConfigV1.iPdpHeaderCompression = 
-			static_cast<RPacketContext::THeaderCompression>(iR5DefaultConfig.iPdpHeaderCompression);
-		contextConfigV1.iPdpDataCompression = 
-			static_cast<RPacketContext::TDataCompression>(iR5DefaultConfig.iPdpDataCompression);
-		contextConfigV1.iProtocolConfigOption.iAuthInfo.iProtocol = 
-			static_cast<RPacketContext::TAuthProtocol>(iR5DefaultConfig.iProtocolConfigOption.iAuthProtocol);
-		contextConfigV1.iProtocolConfigOption.iAuthInfo.iUsername.Copy(
-			iR5DefaultConfig.iProtocolConfigOption.iUsername);
-		contextConfigV1.iProtocolConfigOption.iAuthInfo.iPassword.Copy(
-			iR5DefaultConfig.iProtocolConfigOption.iPassword);
-		contextConfigV1.iProtocolConfigOption.iChallenge.Copy(
-			iR5DefaultConfig.iProtocolConfigOption.iChallenge);
-		contextConfigV1.iProtocolConfigOption.iResponse.Copy(
-			iR5DefaultConfig.iProtocolConfigOption.iResponse);
-		contextConfigV1.iProtocolConfigOption.iDnsAddresses.iPrimaryDns.Copy(
-			iR5DefaultConfig.iProtocolConfigOption.iPrimaryDNS);
-		contextConfigV1.iProtocolConfigOption.iDnsAddresses.iSecondaryDns.Copy(
-			iR5DefaultConfig.iProtocolConfigOption.iSecondaryDNS);
-		contextConfigV1.iProtocolConfigOption.iId = 
-			static_cast<TUint8>(iR5DefaultConfig.iProtocolConfigOption.iId);
-		contextConfigV1.iProtocolConfigOption.iMiscBuffer.Copy(
-			iR5DefaultConfig.iProtocolConfigOption.iMiscBuffer);
-
-		ReqCompleted(aTsyReqHandle,KErrNone);
-		}
-
-	return KErrNone;
-	}
-
-
-void CSimPacketService::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
-*/
-	{
-	LOGPACKET1(">>CSimPacketService::TimerCallBack");
-
-	if(aId == ETimerIdPcktServPacket)
-		{
-		TimerCallBackPcktRegStatus();
-		}
-	else if (aId== ETimerIdPcktServReleaseMode)
-		{
-		TimerCallBackReleaseMode();
-		}
-	else if (aId == ETimerIdPcktServNtwkStatusChange)
-		{
-		TimerCallBackNtwkRegStatus();
-		}
-	else if (aId == ETimerIdPcktServStatusSuspend || 
-			 aId == ETimerIdPcktServStatusDetach  ||
-			 aId == ETimerIdPcktServStatusUnattach)
-		{
-		TimerCallBackDeactivate();	
-		}
-	else if (aId == ETimerIdPcktServDynamicCaps)
-		{
-		TimerCallBackDynamicCaps();
-		}		
-	else if(aId == ETimerIdContextActivationRequestedChange)
-		{
-
-
-		iIncomingContextManager->NextIncomingEvent(iConfigData.iData);
-			// Set up for the next incoming PDP if any.
-			// Note at moment can only handle 1 GPRS incoming.
-			// There is no support for 2ndary contexts, so can not have 2 incoming (of the same type).
-			// And at the moment there is no support for any other type thanm GPRS.
-
-		iIncomingContextManager->Cancel();	
-			// No more timers.
-								
-		iIncomingContextManager->SetUseTimerOff();								
-		ReqCompleted(iConfigData.iTsyReqHandle,KErrNone);
-		iIncomingContextManager->SetUseTimerOn();								
-						
-		}
-	else if(aId == ETimerIdMbmsPcktService)
-		{
-		if(iNotifyMbmsNetworkStatusChange.iNotifyPending)
-			{
-			iNotifyMbmsNetworkStatusChange.iNotifyPending = EFalse;
-			*(static_cast<TMbmsNetworkServiceStatus*>(iNotifyMbmsNetworkStatusChange.iNotifyData))=
-			iMbmsBroadcastParamsArray->At(iCurrentMbmsParamsIndex).iMbmsNetworkStatus;
-			ReqCompleted(iNotifyMbmsNetworkStatusChange.iNotifyHandle,KErrNone);
-			}
-
-		if(iNotifyMbmsServAvailChange.iNotifyPending)
-			{
-			iNotifyMbmsServAvailChange.iNotifyPending = EFalse;
-			ReqCompleted(iNotifyMbmsServAvailChange.iNotifyHandle,KErrNone);
-			}
-
-		if(iMbmsBroadcastParamsArray->Count() > iCurrentMbmsParamsIndex)
-			{
-			iMbmsPcktTimer->Start(iMbmsBroadcastParamsArray->At(iCurrentMbmsParamsIndex).iDuration,this,ETimerIdMbmsPcktService);
-			}
-		else if (iMbmsMonitorListParamsArray->Count() > iCurrentMbmsMonitorListIndex)
-			{
-			iMbmsPcktTimer->Start(iMbmsMonitorListParamsArray->At(iCurrentMbmsMonitorListIndex).iDuration,this,ETimerIdMbmsPcktService);
-			}
-
-		}
-	else
-		{
-		TInt ret = ActionEvent(EPacketEventTimeOut);
-		__ASSERT_ALWAYS(ret==KErrNone,SimPanic(ETimeOutEventActionFailed));	// Note: this is very crude error handling and should be replaced by something rather more elegant.
-		}
-	LOGPACKET1("<<CSimPacketService::TimerCallBack");
-	}
-
-void CSimPacketService::TimerCallBackDeactivate()
-{
-	// deactivate all contexts in every nif
-	TInt totalWrappers = iNifWrappers.Count();
-	for(TInt j=0; j < totalWrappers; j++)
-		{
-		TInt totalContexts = iNifWrappers[j].NumberOfContexts();
-		for(TInt x =0; x<totalContexts; x++)
-			{
-			iNifWrappers[j].GetContext(x)->AttemptDeactivateImmediately();
-			}
-		}
-}
-
-void CSimPacketService::TimerCallBackReleaseMode()
-/**
-* called when release mode timer callback occurs
-*/
-	{
-	if(iPacketReleaseModeArray->Count()<=iPacketReleaseModeIndex)
-		return;
-
-	iCurrentPacketReleaseMode=iPacketReleaseModeArray->At(iPacketReleaseModeIndex).iReleaseMode;
-
-	// if event is pending complete request
-	if(iNotifyChangeOfReleaseMode.iNotifyPending)
-	{
-	iNotifyChangeOfReleaseMode.iNotifyPending=EFalse;
-	*(RPacketService::TPacketReleaseMode*)iNotifyChangeOfReleaseMode.iNotifyData=(RPacketService::TPacketReleaseMode)iCurrentPacketReleaseMode;
-	ReqCompleted(iNotifyChangeOfReleaseMode.iNotifyHandle,KErrNone);
-	}
-
-	iPacketReleaseModeIndex++;
-	if (iPacketReleaseModeArray->Count() > (iPacketReleaseModeIndex))
-		{	
-		// start timer again
-		iReleaseModeTimer->Start(iPacketReleaseModeArray->At(iPacketReleaseModeIndex).iDuration,this,ETimerIdPcktServReleaseMode);
-		}
-	}
-
-void CSimPacketService::TimerCallBackPcktRegStatus()
-/**
-* Timer Call back for the Network Registration status.
-*
-*/
-	{
-	iState=(RPacketService::TStatus)iPcktRegStatusInfo->At(iPcktRegStatIndex).iStatus;
-
-	if(iNotifyStatusChange.iNotifyPending)
-		{
-		iNotifyStatusChange.iNotifyPending=EFalse;
-		*(RPacketService::TStatus*)iNotifyStatusChange.iNotifyData=(RPacketService::TStatus)iState;
-		ReqCompleted(iNotifyStatusChange.iNotifyHandle,KErrNone);
-		}
-	
-	// please note that this bool is in case the test code is setting 
-	// iState to another value, in which case the request will not complete
-	// unless this bool is set and therefore the request will complete
-	// in ActionEvent() 
-	if (iCurrentEvent != EPacketEventNone)
-		iPcktTimerBool = ETrue;
-
-	iPcktRegStatIndex++;
-	if (iPcktRegStatusInfo->Count() > iPcktRegStatIndex)
-		{
-		iPcktRegTimer->Start(iPcktRegStatusInfo->At(iPcktRegStatIndex).iDuration,this,ETimerIdPcktServPacket);
-		}
-	}
-
-void CSimPacketService::SimPSEvent(const CSimPubSub::TPubSubProperty aProperty, TInt aStatus)
-	{
-
-	
-	if (aProperty == iNtwkRegStatusChangeProperty)
-		{ // The call is for the network.
-		TInt index = aStatus;
-		TInt length = iNtwkRegStatusInfo->Count();
-		if (index < length)
-			{
-			TNtwkRegStatus& ntwkRegStatus = iNtwkRegStatusInfo->At(index);
-			CompleteNtwkRegStatus(ntwkRegStatus.iRegStatus);
-			}
-		}
-	else if ( iIncomingContextManager->IsForcedIncoming( aProperty ) )
-		{ //  Lets force the completion of the PDP, rather than waiting around 
-		  // for a large time to finish.
-		TInt index = aStatus;
-		iIncomingContextManager->ForcedIncoming( index, iConfigData.iData );
-		iIncomingContextManager->SetUseTimerOff();								
-		ReqCompleted(iConfigData.iTsyReqHandle,KErrNone);
-			// Force the change through as if the timer had timed out.
-		iIncomingContextManager->SetUseTimerOn();								
-			// May get more timeouts for other primary PDP's.
-		}
-	else
-		{  // Error. Some sort of stange request. Hopefully impossible.
-		LOGPACKET1("CSimPacketService::SimPSEvent property mismatch.");
-		SimPanic(EFailedToSetProperty);
-		}
-	
-	}
-
-void CSimPacketService::PubSubCallback(TInt aIndex)
-	{
-
-	if(aIndex ==0 )
-		{
-		ReqCompleted(iGetMbmsNetworkReqHandle,KErrNone);	
-		}
-
-	else if (aIndex ==1)
-		{
-		if(iNotifyMbmsServAvailChange.iNotifyPending)
-			{
-			iNotifyMbmsServAvailChange.iNotifyPending = EFalse;
-			ReqCompleted(iNotifyMbmsServAvailChange.iNotifyHandle,KErrNone);
-			}
-		}
-
-	else if(aIndex ==2)
-		{
-		if(iUpdateMbmsServiceReqHandle)
-			{
-			ReqCompleted(iUpdateMbmsServiceReqHandle,iUpdateMbmsServiceError);
-			}
-		}
-
-	else if(aIndex ==3)
-		{
-		ReqCompleted(iEnumerateActiveListReqHandle,KErrNone);
-		}
-
-	else if(aIndex ==4)
-		{
-		ReqCompleted(iEnumerateMonitorListReqHandle,KErrNone);
-		}
-
-	else {}
-}
-
-void CSimPacketService::TimerCallBackNtwkRegStatus()
-	{
-	if(iNtwkRegStatusInfo->Count()<=iNtwkRegStatIndex)
-		return;
-
-	TNtwkRegStatus& ntwkRegStatus = iNtwkRegStatusInfo->At(iNtwkRegStatIndex);
-	CompleteNtwkRegStatus(ntwkRegStatus.iRegStatus);
-
-	iNtwkRegStatIndex++;
-	if(iNtwkRegStatusInfo->Count()>iNtwkRegStatIndex)
-		iNtwkRegTimer->Start(iNtwkRegStatusInfo->At(iNtwkRegStatIndex).iDuration,this,ETimerIdPcktServNtwkStatusChange);
-	}
-	
-void CSimPacketService::CompleteNtwkRegStatus(RPacketService::TRegistrationStatus aRegistrationStatus)
-	{
-	iCurrentRegStatus = aRegistrationStatus;
-
-	if(iNotifyChangeOfNtwk.iNotifyPending)
-		{
-		iNotifyChangeOfNtwk.iNotifyPending=EFalse;
-		*(RPacketService::TRegistrationStatus*)iNotifyChangeOfNtwk.iNotifyData=(RPacketService::TRegistrationStatus)iCurrentRegStatus;
-		ReqCompleted(iNotifyChangeOfNtwk.iNotifyHandle,KErrNone);
-		}
-
-	if (//iCurrentRegStatus == RPacketService::ENotRegisteredSearching || 
-		iCurrentRegStatus == RPacketService::ERegistrationDenied ||
-		iCurrentRegStatus == RPacketService::ENotRegisteredButAvailable ||
-		iCurrentRegStatus == RPacketService::ENotRegisteredAndNotAvailable)
-	{
-		// deactivate all contexts in every nif
-		TInt totalWrappers = iNifWrappers.Count();
-		for(TInt j=0; j < totalWrappers; j++)
-			{
-			TInt totalContexts = iNifWrappers[j].NumberOfContexts();
-			for(TInt x =0; x<totalContexts; x++)
-				{
-				iNifWrappers[j].GetContext(x)->AttemptDeactivateImmediately();
-				}
-			}
-	}
-}
-
-TInt CSimPacketService::ChangeState(RPacketService::TStatus aNewState)
-/**
-* Attempt to change state.
-* First validate that the requested state change is ok.  If it is then proceed to change
-* the state and complete any pending state change notification.
-*
-* @param aState the new state to change to
-* @return Error indication if change of state is successful or not
-*/
-	{
-	LOGPACKET2(">>CSimPacketService::ChangeState [newState=%d]", aNewState);
-	if(iState == aNewState)
-		return KErrNone;
-
-	TInt ret=KErrGeneral;
-	const TPacketStateChangeValidity* stateChangePnt=KPacketStateChangeValidity;
-	while(stateChangePnt->iOldState!=KPacketStateTableTerminator)
-		{
-		if((stateChangePnt->iOldState==iState) && (stateChangePnt->iNewState==aNewState))
-			{
-			ret=stateChangePnt->iError;
-			break;
-			}
-		stateChangePnt++;
-		}
-
-	if(ret!=KErrNone)
-		return ret;
-
-//Request permission from the phone to change the state of the packet connection
-	ret = iPhone->ValidateChangeState(aNewState);
-	if(ret!=KErrNone)
-		return ret;
-
-// Actually change the state.
-	iState=aNewState;
-
-// if suspended or unattached take appropriate action
-	if (iState==RPacketService::EStatusSuspended || iState == RPacketService::EStatusUnattached)
-		{
-			// deactivate all contexts in every nif
-			TInt totalWrappers = iNifWrappers.Count();
-			for(TInt j=0; j < totalWrappers; j++)
-				{
-				TInt totalContexts = iNifWrappers[j].NumberOfContexts();
-				for(TInt x =0; x<totalContexts; x++)
-					{
-					ret = iNifWrappers[j].GetContext(x)->AttemptDeactivateImmediately();
-					if(ret!=KErrNone)
-						{
-						break;
-						}
-					}
-				}
-		}
-
-// Check for a pending line state notification.
-	if(iNotifyStatusChange.iNotifyPending)
-		{
-		iNotifyStatusChange.iNotifyPending=EFalse;
-		*(RPacketService::TStatus*)iNotifyStatusChange.iNotifyData=iState;
-		ReqCompleted(iNotifyStatusChange.iNotifyHandle,KErrNone);
-		}
-
-	LOGPACKET1("<<CSimPacketService::ChangeState");
-	return KErrNone;
-	}
-
-TInt CSimPacketService::ActionEvent(TPacketEvent aEvent)
-/**
-* Entry point when an event has occured that may advance the state machine.
-* The aEvent parameter describes the event.
-*
-* This function contains the main state machine for the packet service.  
-*
-* @param aEvent The Packet Service event to handle
-* @return value represents the error state caused by the attempted state machine jump.
-*/
-	{
-	TInt ret=KErrNone;
-
-	switch(aEvent)
-		{
-	case EPacketEventAttach:
-		LOGPACKET1(">>CSimPacketService::ActionEvent = [EPacketEventAttach]");
-		if(iState==RPacketService::EStatusUnattached)
-			{
-			iCurrentEvent=EPacketEventAttach;
-			iTimer->Start(iAttachPause,this);
-			}
-		else
-			ReqCompleted(iAttachRequestHandle, KErrNone);
-		break;
-
-	case EPacketEventDetach:
-		LOGPACKET1(">>CSimPacketService::ActionEvent = [EPacketEventDetach]");
-		if(iState !=RPacketService::EStatusUnattached)
-			{
-			iCurrentEvent=EPacketEventDetach;
-			iTimer->Start(iDetachPause,this);
-			}
-		else
-			{
-			ReqCompleted(iDetachRequestHandle, KErrNone);
-			}
-		break;
-
-	case EPacketEventTimeOut:
-		switch(iCurrentEvent)
-			{
-		case EPacketEventNone:
-			break;
-		case EPacketEventAttach:
-			if(iAttachFail != KErrNone)
-				{
-				ReqCompleted(iAttachRequestHandle,iAttachFail);
-				iCurrentEvent=EPacketEventNone;
-				iAttachFail = KErrNone;
-				break;
-				}
-			if(iState==RPacketService::EStatusUnattached)
-				{
-				ret=ChangeState(RPacketService::EStatusAttached);
-				ReqCompleted(iAttachRequestHandle,ret);
-				}
-			else if (iPcktTimerBool)
-				{	
-				ReqCompleted(iAttachRequestHandle,KErrNone);
-				iPcktTimerBool= EFalse;
-				}
-			iCurrentEvent=EPacketEventNone;
-			break;
-		case EPacketEventDetach:
-			if(iDetachFail != KErrNone)
-				{
-				ReqCompleted(iDetachRequestHandle,iDetachFail);
-				iCurrentEvent=EPacketEventNone;
-				iDetachFail = KErrNone;
-				break;
-				}
-			ret = DoDetach();
-			if (iPcktTimerBool)
-				{	
-				ReqCompleted(iDetachRequestHandle,KErrNone);
-				iPcktTimerBool= EFalse;
-				}
-			iCurrentEvent=EPacketEventNone;
-			break;
-		default:
-			break;
-			}
-		break;
-
-	default:
-		break;
-		}
-	return ret;
-	}
-
-const CTestConfigSection* CSimPacketService::CfgFile()
-/**
-*	Return a pointer to the Configuration File Section
-*
-* @return CTestConfigSection	pointer to the configuration file section
-*/
-	{
-	return iPhone->CfgFile();
-	}
-
-/**
-* check that there is a primary context and that opening a secondary
-* is a valid action
-**/
-TInt CSimPacketService::PrepareOpenSecondary(const TTsyReqHandle aTsyReqHandle, const TDesC* aOriginalContextName)
-	{
-	TInt i = 0;
-	TInt err = KErrNone;
-
-	for(i = 0; i<iNifWrappers.Count(); i++)
-		{
-		TNifWrapper& nifWrapper = iNifWrappers[i];
-		for (TInt j = 0; j < nifWrapper.NumberOfContexts(); j++)
-			{
-			if (nifWrapper.GetContext(j)->ContextName().Compare(*aOriginalContextName) == KErrNone)
-				{
-				iSecondaryContext = ETrue;
-				iCurrentPrimaryContextIndex = i;
-				break;
-				}
-			}
-		}
-	
-	if (iSecondaryContext == EFalse)
-		err = KErrNotSupported;
-	
-	ReqCompleted(aTsyReqHandle, err);
-	return err;
-	}
-
-TInt CSimPacketService::GetCurrentReleaseMode(const TTsyReqHandle aTsyReqHandle,RPacketService::TPacketReleaseMode* aReleaseMode)
-// return current release mode
-	{
-	LOGPACKET1("CSimPacketService::GetCurrentReleaseMode called");
-	*aReleaseMode = (RPacketService::TPacketReleaseMode)iCurrentPacketReleaseMode;
-	ReqCompleted(aTsyReqHandle, KErrNone);
-	return KErrNone;
-	}
-	
-TInt CSimPacketService::NotifyReleaseModeChange(const TTsyReqHandle aTsyReqHandle, RPacketService::TPacketReleaseMode* aReleaseMode)
-	{
-	// if release mode has changed
-	if(iPacketReleaseModeArray->Count()==0)
-		{
-		ReqCompleted(aTsyReqHandle,KErrNotSupported);
-		return KErrNotSupported;
-		}
-
-	__ASSERT_ALWAYS(!iNotifyChangeOfReleaseMode.iNotifyPending,SimPanic(ENotificationReqAlreadyOutstanding));
-
-	iNotifyChangeOfReleaseMode.iNotifyPending=ETrue;
-	iNotifyChangeOfReleaseMode.iNotifyHandle=aTsyReqHandle;
-	iNotifyChangeOfReleaseMode.iNotifyData=&aReleaseMode;
-	return KErrNone;
-	}
-
-TInt CSimPacketService::EnumerateNifs(const TTsyReqHandle aTsyReqHandle, TInt& aCount) 
-	{
-// return number of nifs
-	aCount = iNifWrappers.Count();
-	ReqCompleted(aTsyReqHandle,KErrNone);
-	return KErrNone;
-	}
-
-TInt CSimPacketService::GetNifInfo(const TTsyReqHandle aTsyReqHandle, TInt aIndex, TDes8* aNifInfoV2) 
-	{
-// get info for nif
-	TInt range = iNifWrappers.Count()-1;
-	if (aIndex < 0 || aIndex > range)
-		{
-		ReqCompleted(aTsyReqHandle,KErrArgument);
-		return KErrArgument;
-		}
-
-	RPacketService::TNifInfoV2Pckg* nifInfoV2Pckg = (RPacketService::TNifInfoV2Pckg*)aNifInfoV2;
-	RPacketService::TNifInfoV2& nifInfoV2 = (*nifInfoV2Pckg)();
-
-	// Check that the data structure is supported by the simulated TSY version
-	TInt err = iPhone->CheckSimTsyVersion(nifInfoV2);
-	if(err != KErrNone)
-		{
-		iPhone->ReqCompleted(aTsyReqHandle, err);
-		return KErrNone;
-		}
-
-	nifInfoV2.iContextName.Copy(iNifWrappers[aIndex].GetContext(0)->ContextName());
-	nifInfoV2.iContextType = STATIC_CAST(RPacketService::TContextType, iNifWrappers[aIndex].GetContext(0)->ContextType());
-
-	ReqCompleted(aTsyReqHandle,KErrNone);
-	return KErrNone;
-	}
-
-/***
-* This function takes the name passed in the parameter aExistingContextName and 
-* returns the number of contexts sharing its Nif. 
-***/
-TInt CSimPacketService::EnumerateContextsInNif(const TTsyReqHandle aTsyReqHandle, const TDesC* aExistingContextName, TInt& aCount) 
-	{
-	// find contexts sharing name aExistingContextName, ie primary and secondary as well
-	TInt number = KErrNotFound;
-	TInt wrappersCount = iNifWrappers.Count();
-
-	for(TInt i = 0; i<wrappersCount; i++)
-		{
-		TInt contextsTotal = iNifWrappers[i].NumberOfContexts();
-		for(TInt j = 0; j<contextsTotal; j++)
-			{
-			if(iNifWrappers[i].GetContext(j)->ContextName().Compare(*aExistingContextName) == KErrNone)
-				{
-				number = iNifWrappers[i].NumberOfContexts();
-				break;
-				}
-			}
-		}
-
-	// ie couldn't find context of aExistingContextName
-	if (number == KErrNotFound)
-		{
-		ReqCompleted(aTsyReqHandle, KErrArgument);
-		return KErrArgument;
-		}
-
-	// count primary context as well!
-	aCount = number;
-	ReqCompleted(aTsyReqHandle, KErrNone);
-	return KErrNone;
-	}
-
-TInt CSimPacketService::GetContextNameInNif(const TTsyReqHandle aTsyReqHandle, const TDesC* aExistingContextName, TInt aIndex, TDes* aContextName) 
-	{
-// get for context name specified, find nif's context name at index given
-	// first, check aExistingContextName exists in contexts
-	TInt number = KErrNotFound;
-	TInt wrappersCount =  iNifWrappers.Count();
-
-	for(TInt i = 0; i<wrappersCount; i++)
-		{
-		TInt contextsTotal = iNifWrappers[i].NumberOfContexts();
-		for(TInt j = 0; j<contextsTotal; j++)
-			{
-			if (iNifWrappers[i].GetContext(j)->ContextName().Compare(*aExistingContextName) == KErrNone)
-				{
-				number = i;
-				break;
-				}
-			}
-		}
-
-	// total no. of contexts with name is number of secondary contexts plus primary, so
-	// number + 1
-	// so range should be within number+1-1 ie number.
-	if (number == KErrNotFound || aIndex < 0 || aIndex > number)
-		{
-		ReqCompleted(aTsyReqHandle, KErrArgument);
-		return KErrArgument;
-		}
-	
-	*aContextName = iNifWrappers[number].GetContext(aIndex)->ContextName();
-	ReqCompleted(aTsyReqHandle, KErrNone);
-	return KErrNone;
-	}
-
-/**
-* Cancel method, returns KErrNone
-*/
-TInt CSimPacketService::GetCurrentReleaseModeCancel(const TTsyReqHandle /*aTsyReqHandle*/)
-	{
-	return KErrNone;
-	}
-
-/**
-* Cancel method, returns KErrNone
-*/
-TInt CSimPacketService::NotifyReleaseModeChangeCancel(const TTsyReqHandle aTsyReqHandle)
-	{
-	LOGPACKET1("CSimPacketService::NotifyChangeOfNtwkRegStatusCancel called");
-	if(iNotifyChangeOfReleaseMode.iNotifyPending)
-		{
-		iNotifyChangeOfReleaseMode.iNotifyPending=EFalse;
-		ReqCompleted(aTsyReqHandle,KErrCancel);
-		}
-	return KErrNone;
-	}
-
-/**
-* Cancel method, returns KErrNone
-*/
-TInt CSimPacketService::EnumerateNifsCancel(const TTsyReqHandle /*aTsyReqHandle*/)
-	{
-	return KErrNone;
-	}
-
-/**
-* Cancel method, returns KErrNone
-*/
-TInt CSimPacketService::GetNifInfoCancel(const TTsyReqHandle /*aTsyReqHandle*/)
-	{
-	return KErrNone;
-	}
-
-/**
-* Cancel method, returns KErrNone
-*/
-TInt CSimPacketService::EnumerateContextsInNifCancel(const TTsyReqHandle /*aTsyReqHandle*/)
-	{
-	return KErrNone;
-	}
-
-/**
-* Cancel method, returns KErrNone
-*/	
-TInt CSimPacketService::GetContextNameInNifCancel(const TTsyReqHandle /*aTsyReqHandle*/)
-	{
-	return KErrNone;
-	}
-	
-/**
-* Cancel method, returns KErrNone
-*/
-TInt CSimPacketService::NotifyAttachModeChangeCancel(const TTsyReqHandle aTsyReqHandle)
-	{
-	LOGPACKET1("CSimPacketService::NotifyAttachModeChangeCancel called");
-	if(iNotifyChangeOfAttachMode.iNotifyPending)
-		{
-		iNotifyChangeOfAttachMode.iNotifyPending=EFalse;
-		ReqCompleted(aTsyReqHandle,KErrCancel);
-		}
-	return KErrNone;
-	}
-
-TInt CSimPacketService::GetMbmsNetworkServiceStatus(const TTsyReqHandle aTsyReqHandle, TBool aAttemptAttach,TMbmsNetworkServiceStatus* aStatus)
-/**
-* Retrieves and returns the status of the MBMS Packet service
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @param aStatus pointer to the status
-* @return TInt err KErrNone if ok
-*/
-	{
-	LOGPACKET1("CSimPacketService::GetMbmsNetworkServiceStatus called");
-	*aStatus = (iMbmsBroadcastParamsArray->At(iCurrentMbmsParamsIndex).iMbmsNetworkStatus);
-	if(aAttemptAttach)
-		{
-		if(*aStatus == EMbmsSupportUnknown)
-			{
-			*aStatus = EMbmsSupported;
-			}
-		}
-	iGetMbmsNetworkReqHandle = aTsyReqHandle;
-	iCurrentMbmsParamsIndex++;
-	TInt totCount = iMbmsBroadcastParamsArray->Count();
-	if(iCurrentMbmsParamsIndex == totCount)
-		{
-		iCurrentMbmsParamsIndex--;
-		}
-	return KErrNone;
-	}
-
-TInt CSimPacketService::GetMbmsNetworkServiceStatusCancel(const TTsyReqHandle aTsyReqHandle)
-/* 
- * Cancels the GetMBMSNetworkServiceStatus request.
- * In fact this is not needed- just to avoid Panic if called, this implementation is done.
- */
-	{
-	if(iGetMbmsNetworkReqHandle == aTsyReqHandle)
-		{
-		ReqCompleted(iGetMbmsNetworkReqHandle,KErrCancel);
-		}
-	else
-		{
-		ReqCompleted(iGetMbmsNetworkReqHandle,KErrCorrupt);
-		}
-	return KErrNone;
-	}
-
-TInt CSimPacketService::NotifyMbmsNetworkServiceStatusChange(const TTsyReqHandle aTsyReqHandle, TMbmsNetworkServiceStatus* aStatus)
-/**
-* Record a client's interest in being notified of the state of the MBMS packet network and contexts.
-* First check that there isn't already a notification pending (the ETel Server should protect
-* against this) and then record the information necessary to complete the request later, when
-* the status does actually change.
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @param aStatus pointer to the mbms packet service status
-* @return KErrNone
-*/
-	{
-	LOGPACKET1("CSimPacketService::NotifyMbmsNetworkServiceStatusChange called");
- 	__ASSERT_ALWAYS(!iNotifyMbmsNetworkStatusChange.iNotifyPending,SimPanic(ENotificationAlreadyPending));
-
- 	iNotifyMbmsNetworkStatusChange.iNotifyPending = ETrue;
-	iNotifyMbmsNetworkStatusChange.iNotifyHandle = aTsyReqHandle;
- 	iNotifyMbmsNetworkStatusChange.iNotifyData = aStatus;
-	return KErrNone;
-	}
-
-TInt CSimPacketService::NotifyMbmsNetworkServiceStatusChangeCancel(const TTsyReqHandle aTsyReqHandle)
-/**
-* Cancel a client's interest in being notified when the mbms network status changes.
-* This is acheived simply by resetting the flag that indicates a notification is pending.
-* 
-* @param aTsyReqHandle Tsy Request handle for the client cancel request
-* @return KErrNone
-*/
-	{
-	LOGPACKET1("CSimPacketService::NotifyMbmsNetworkServiceStatusChangeCancel called");
-	if(iNotifyMbmsNetworkStatusChange.iNotifyPending)
-		{
-		iNotifyMbmsNetworkStatusChange.iNotifyPending=EFalse;
-		ReqCompleted(aTsyReqHandle,KErrCancel);
-		}
-	return KErrNone;
-	}
-
-TInt CSimPacketService::NotifyMbmsServiceAvailabilityChange(const TTsyReqHandle aTsyReqHandle)
-/**
-* Record a client's interest in being notified of the service availability of the MBMS packet network.
-* First check that there isn't already a notification pending (the ETel Server should protect
-* against this) and then record the information necessary to complete the request later, when
-* the status does actually change.
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @return KErrNone
-*/
-	{
-	LOGPACKET1("CSimPacketService::NotifyMbmsServiceAvailabilityChange called");
- 	__ASSERT_ALWAYS(!iNotifyMbmsNetworkStatusChange.iNotifyPending,SimPanic(ENotificationAlreadyPending));
-
- 	iNotifyMbmsServAvailChange.iNotifyPending = ETrue;
- 	iNotifyMbmsServAvailChange.iNotifyHandle = aTsyReqHandle;
- 	(void)iNotifyMbmsServAvailChange.iNotifyData;
-	return KErrNone;
-	}
-
-TInt CSimPacketService::NotifyMbmsServiceAvailabilityChangeCancel(const TTsyReqHandle aTsyReqHandle)
-/**
-* Cancel a client's interest in being notified when the mbms service availability changes.
-* This is acheived simply by resetting the flag that indicates a notification is pending.
-* 
-* @param aTsyReqHandle Tsy Request handle for the client cancel request
-* @return KErrNone
-*/
-	{
-	LOGPACKET1("CSimPacketService::NotifyMbmsServiceAvailabilityChangeCancel called");
-	if(iNotifyMbmsServAvailChange.iNotifyPending)
-		{
-		iNotifyMbmsServAvailChange.iNotifyPending=EFalse;
-		ReqCompleted(aTsyReqHandle,KErrCancel);
-		}
-	return KErrNone;
-	}
-
-TInt CSimPacketService::UpdateMbmsMonitorServiceListL(const TTsyReqHandle aTsyReqHandle,TMbmsAction* aAction, TDes8* aBuffer)
-/**
-* client's interest in updating the MBMS Service Monitoring list.
-* The update action is also passed as the MBMS Action parameter.
-* This will update the MBMS Service Monitoring List in TSY.
-* 
-* @param aTsyReqHandle Tsy Request handle for the client cancel request
-* @param aAction TMbmsAction to be performed
-* @param aBuffer list of TMbmsServiceAvailabilityV1 class passed.
-* @return KErrNone
-*/
-	{
-	LOGPACKET1("CSimPacketService::UpdateMbmsMonitorServiceListL called");
-	CPcktMbmsMonitoredServiceList* monServList = CPcktMbmsMonitoredServiceList::NewL();
-	CleanupStack::PushL(monServList); 
-
-	TInt error=KErrNone;
-	TInt i=0;
-	TInt j=0;
-	TInt ii=0;
-	TInt countAdd=0;
-	TInt countRem=0;
-	RPacketService::TMbmsServiceAvailabilityV1 entry;
-	
-	switch(*aAction)
-		{
-		case SIMTSY_PACKET_MBMS_ADD_ENTRIES:
-			LOGPACKET1("CSimPacketService::UpdateMbmsMonitorServiceListL Action: ADD ");
-			monServList->RestoreL(*aBuffer);
-			countAdd = monServList->Enumerate();
-			if(countAdd != SIMTSY_PACKET_MBMS_ADD_ENTRIES_COUNT)
-				{
-				ReqCompleted(aTsyReqHandle,KErrCorrupt);
-				CleanupStack::PopAndDestroy(); // monServList
-				return KErrNone;
-				}
-			for(;i<SIMTSY_PACKET_MBMS_ADD_ENTRIES_COUNT;i++)
-				{
-				TRAPD(ret,entry=monServList->GetEntryL(i));
-				if (ret != KErrNone)
-					{
-					break;
-					}
-				TBool entryFound=EFalse;
-				
-				for(ii=0;ii<iMbmsMonitorListParamsArray->Count();ii++)
-					{
-					 if((entry.iMbmsServiceMode == iMbmsMonitorListParamsArray->At(ii).iServiceMode) &&
-						(entry.iMbmsAccessBearer == iMbmsMonitorListParamsArray->At(ii).iAccessBearer) &&
-						(entry.iTmgi.GetMCC() == iMbmsMonitorListParamsArray->At(ii).iMCC) &&
-						(entry.iTmgi.GetMNC() == iMbmsMonitorListParamsArray->At(ii).iMNC) &&
-						(entry.iTmgi.GetServiceId() == iMbmsMonitorListParamsArray->At(ii).iServiceId))		
-							{
-							entryFound =  ETrue;
-							break;
-							}
-					}
-					
-				if(!entryFound)
-					{
-					error = KErrMbmsImpreciseServiceEntries;
-					}
-					
-				else
-					{
-					entry.iMbmsAvailabilityStatus = iMbmsMonitorListParamsArray->At(ii).iAvailStatus ;
-					}
-				 	
-				}
-			iMbmsMonitorListCount += i;
-			if(iMbmsMonitorListCount > KMaxMbmsMonitorContexts)
-				{
-				error =KErrNoMemory;
-				iMbmsMonitorListCount -= i;
-				}
-			
-			ReqCompleted(aTsyReqHandle, error);
-			CleanupStack::PopAndDestroy(); // monServList
-			break;
-
-		case SIMTSY_PACKET_MBMS_REM_ENTRIES:
-			LOGPACKET1("CSimPacketService::UpdateMbmsMonitorServiceListL Action: REMOVE ");
-			monServList->RestoreL(*aBuffer);
-			countRem = monServList->Enumerate();
-			if(countRem != SIMTSY_PACKET_MBMS_REM_ENTRIES_COUNT)
-				{
-				ReqCompleted(aTsyReqHandle,KErrCorrupt);
-				CleanupStack::PopAndDestroy(); // monServList
-				return KErrNone;
-				}
-	
-			for(;i<SIMTSY_PACKET_MBMS_REM_ENTRIES_COUNT;i++)
-				{
-				TRAPD(ret,entry=monServList->GetEntryL(i));
-				
-				if (ret != KErrNone)
-					{
-					break;
-					}
-					
-				TBool entryFound=EFalse;
-				
-				for(ii=0;ii<iMbmsMonitorListParamsArray->Count();ii++)
-					{
-					 if((entry.iMbmsServiceMode == iMbmsMonitorListParamsArray->At(ii).iServiceMode) &&
-						(entry.iMbmsAccessBearer == iMbmsMonitorListParamsArray->At(ii).iAccessBearer) &&
-						(entry.iTmgi.GetMCC() == iMbmsMonitorListParamsArray->At(ii).iMCC) &&
-						(entry.iTmgi.GetMNC() == iMbmsMonitorListParamsArray->At(ii).iMNC) &&
-						(entry.iTmgi.GetServiceId() == iMbmsMonitorListParamsArray->At(ii).iServiceId))		
-					 		{
-					 		entryFound =  ETrue;
-					 		break;
-					 		}
-					}
-					
-				if(!entryFound)
-					{
-					j++;
-					error = KErrMbmsImpreciseServiceEntries;
-					}
-					
-				else
-					{
-					entry.iMbmsAvailabilityStatus = iMbmsMonitorListParamsArray->At(ii).iAvailStatus ;
-					iMbmsMonitorListParamsArray->Delete(ii);
-					}
-				 	
-				}
-				if(j == SIMTSY_PACKET_MBMS_REM_ENTRIES_COUNT)
-					{
-					error = KErrNotFound;					
-					}
-					
-			if(iMbmsMonitorListCount >=j)
-				{
-				iMbmsMonitorListCount -= j;
-				}
-				
-			iUpdateMbmsServiceError = error;
-			iUpdateMbmsServiceReqHandle = aTsyReqHandle;
-			
-			CleanupStack::PopAndDestroy(); // monServList
-			break;
-			
-		case SIMTSY_PACKET_MBMS_REM_ALL_ENTRIES:
-			iMbmsMonitorListCount = 0;
-			iMbmsMonitorListParamsArray->Delete(0,iMbmsMonitorListParamsArray->Count());
-			LOGPACKET1("CSimPacketService::UpdateMbmsMonitorServiceListL Action: REMOVE_ALL ");
-			iUpdateMbmsServiceError = KErrNone;
-			iUpdateMbmsServiceReqHandle = aTsyReqHandle;
-			CleanupStack::PopAndDestroy(); // monServList
-			break;
-			
-		default:
-			LOGPACKET1("CSimPacketService::UpdateMbmsMonitorServiceListL Action: Default ");
-			ReqCompleted(aTsyReqHandle,KErrNotFound);
-			CleanupStack::PopAndDestroy(); // monServList
-			break;
-		}
-	return KErrNone;
-	}
-
-TInt CSimPacketService::UpdateMbmsMonitorServiceListCancel(const TTsyReqHandle aTsyReqHandle)
-/**
-* client's interest in cancelling the updation MBMS Service Monitoring list.
-* 
-* @param aTsyReqHandle Tsy Request handle for the client cancel request
-* @return KErrNone
-*/
-	{
-	LOGPACKET1("CSimPacketService::UpdateMbmsMonitorServiceListCancel Called ");
-	ReqCompleted(aTsyReqHandle,KErrCancel);
-	return KErrNone;
-	}
-
-// CHANGES FOR 2 Phase retrieval of MBMS Monitored Services list starts here.
-
-TInt CSimPacketService::GetMbmsMonitoredServicesListPhase1(const TTsyReqHandle aTsyReqHandle, TClientId* aClient, TInt* aBufSize)
-/**
-* client's interest in retrieving the MBMS Service Monitoring list.
-* This function is the call for the first phase of 2 phase retrieval.
-* 
-* @param aTsyReqHandle Tsy Request handle for the client cancel request
-* @param aAction TClientId to be used
-* @param aBufSize Size to be allocated for retrieving the actual list in second phase.
-* @return KErrNone
-*/
-	{
-	LOGPACKET1("CSimPacketService::GetMbmsMonitoredServicesListPhase1 called");
-	TInt ret=KErrNone;
-	TInt leaveCode=KErrNone;
-	TRAP(leaveCode, ret=ProcessGetMbmsMonitoredServicesListPhase1L(aTsyReqHandle, aClient, aBufSize););
-	if (leaveCode != KErrNone)
-		{
-		ReqCompleted(aTsyReqHandle,leaveCode);
-		}
-	return ret;
-	}	
-	
-TInt CSimPacketService::ProcessGetMbmsMonitoredServicesListPhase1L(const TTsyReqHandle aTsyReqHandle, 
-													 TClientId* aClient, 
-													 TInt* aBufSize)
-/**
-* Local function to perform the first phse of the 2 phase retrieval.
-* 
-* @param aTsyReqHandle Tsy Request handle for the client cancel request
-* @param aAction TClientId to be used
-* @param aBufSize Size to be allocated for retrieving the actual list in second phase.
-* @return KErrNone
-*/
-	{
-	
-	LOGPACKET1("CSimPacketService::ProcessGetMbmsMonitoredServicesListPhase1L called");
-	CPcktMbmsMonitoredServiceList* list=CPcktMbmsMonitoredServiceList::NewL();
-	CleanupStack::PushL(list);
-
-	RPacketService::TMbmsServiceAvailabilityV1 entry;
-	
-	for (TInt i=0; i <iMbmsMonitorListParamsArray->Count(); i++)
-		{
-			entry.iMbmsServiceMode = iMbmsMonitorListParamsArray->At(i).iServiceMode;
-			entry.iMbmsAccessBearer = iMbmsMonitorListParamsArray->At(i).iAccessBearer;
-			entry.iMbmsAvailabilityStatus = iMbmsMonitorListParamsArray->At(i).iAvailStatus;
-			entry.iTmgi.SetMCC(iMbmsMonitorListParamsArray->At(i).iMCC);
-			entry.iTmgi.SetMNC(iMbmsMonitorListParamsArray->At(i).iMNC);
-			entry.iTmgi.SetServiceId(iMbmsMonitorListParamsArray->At(i).iServiceId);
-			// Add the entry into the list, at the next empty location
-			LOGPACKET2("Adding the Entry no. %d to the List",i+1);
-			list->AddEntryL(entry);
-		}
-	
-	// Store the  streamed list and the client ID
-	CPcktListReadAllAttempt* read=CPcktListReadAllAttempt::NewL(*aClient,aTsyReqHandle);
-	CleanupStack::PushL(read);
-	
-	read->iListBuf = list->StoreLC();
-	CleanupStack::Pop(); // pop the CBufBase allocated by StoreLC
-	
-	iMbmsServicesList->AppendL(read);
-	CleanupStack::Pop(); // pop the CPcktListReadAllAttempt
-	
-	// return the CBufBase size to client
-	*aBufSize=(read->iListBuf)->Size();
-	
-	// Complete first phase of list retrieval
-	ReqCompleted(aTsyReqHandle,KErrNone);
-	CleanupStack::PopAndDestroy(); // pop&destroy list
-	
-	return KErrNone;
-	}
-
-TInt CSimPacketService::GetMbmsMonitoredServicesListPhase2(const TTsyReqHandle aTsyReqHandle,TClientId* aClient, TDes8* aBuf)
-/**
-* client's interest in retrieving the MBMS Service Monitoring list.
-* This function is the call for the second phase of 2 phase retrieval.
-* 
-* @param aTsyReqHandle Tsy Request handle for the client cancel request
-* @param aAction TClientId to be used
-* @param aBuf buffer for the actual list to be populated.
-* @return KErrNone
-*/
-	{
-	LOGPACKET1("CSimPacketService::GetMbmsMonitoredServicesListPhase2 called");
-	CPcktListReadAllAttempt* read=NULL;
-	// Find the get MBMS Monitor Service List from this client
-	for (TInt i=0; i<iMbmsServicesList->Count(); ++i)
-		{
-		read = iMbmsServicesList->At(i);
-		if ((read->iClient.iSessionHandle==aClient->iSessionHandle) &&
-		    (read->iClient.iSubSessionHandle==aClient->iSubSessionHandle))
-			{
-			TPtr8 bufPtr((read->iListBuf)->Ptr(0));
-			// Copy the streamed list to the client
-			aBuf->Copy(bufPtr);
-			delete read;
-			
-			iMbmsServicesList->Delete(i);
-			ReqCompleted(aTsyReqHandle,KErrNone);
-			return KErrNone;
-			}
-		}
-	// Should handle error case of not finding the matching client from read all phase 1
-	return KErrNotFound;
-	}
-	
-TInt CSimPacketService::GetMbmsMonitoredServicesListCancel(const TTsyReqHandle aTsyReqHandle)
-/**
-* client's interest in canceling the retrieval of the MBMS Service Monitoring list.
-* 
-* @param aTsyReqHandle Tsy Request handle for the client cancel request
-* @return KErrNone
-*/
-	{
-	LOGPACKET1("CSimPacketService::GetMbmsMonitoredServicesListCancel called");
-	// Remove the read all attempt from iGetMbmsMonitoredServices
-
-	CPcktListReadAllAttempt* read=NULL;
-	for (TInt i=0; i<iMbmsServicesList->Count(); ++i)
-		{
-		read = iMbmsServicesList->At(i);
-		if (read->iReqHandle == aTsyReqHandle)
-			{
-			delete read;
-			iMbmsServicesList->Delete(i);
-			break;
-			}
-		}
-	ReqCompleted(aTsyReqHandle,KErrCancel);
-	return KErrNone;
-	}
-
-TInt CSimPacketService::EnumerateMbmsMonitorServiceList(const TTsyReqHandle aTsyReqHandle, TInt* aCount, TInt* aMaxAllowed)
-/**
-* client's interest in retrieving the information regarding the MBMS Monitoring Service list.
-* 
-* @param aTsyReqHandle Tsy Request handle for the client cancel request
-* @param aCount count of the MBMS monitoring services in the list
-* @param aMaxAllowed maximum MBMS monitoring services allowed
-* @return KErrNone
-*/
-	{
-	LOGPACKET1("CSimPacketService::EnumerateMbmsMonitorServiceList called");
-	*aCount = iMbmsMonitorListCount;
-	*aMaxAllowed = KMaxMbmsMonitorContexts;
-	iEnumerateMonitorListReqHandle = aTsyReqHandle;
-	return KErrNone;
-	}
-
-TInt CSimPacketService::EnumerateMbmsMonitorServiceListCancel(const TTsyReqHandle aTsyReqHandle)
-/**
-* client's interest in canceling the enumeration the MBMS Service Monitoring list.
-* This function is just a dummy function.
-* 
-* @param aTsyReqHandle Tsy Request handle for the client cancel request
-* @return KErrNone
-*/
-	{
-	if(iEnumerateMonitorListReqHandle == aTsyReqHandle)
-		{
-		ReqCompleted(iEnumerateMonitorListReqHandle,KErrCancel);
-		}
-	else
-		{
-		ReqCompleted(iEnumerateMonitorListReqHandle,KErrCorrupt);
-		}
-	return KErrNone;
-	}
-	
-TInt CSimPacketService::EnumerateMbmsActiveServiceList(const TTsyReqHandle aTsyReqHandle, TInt* aCount, TInt* aMaxAllowed)
-/**
-* client's interest in retrieving the information regarding the MBMS Active Service list.
-* 
-* @param aTsyReqHandle Tsy Request handle for the client cancel request
-* @param aCount count of the MBMS active services in the list
-* @param aMaxAllowed maximum MBMS active services allowed
-* @return KErrNone
-*/
-	{
-	LOGPACKET1("CSimPacketService::EnumerateMbmsActiveServiceList called");
-	*aCount = iMbmsNifWrappers.Count(); // The NifWrapper contains the list of mbmsContexts that are activated.
-	*aMaxAllowed = KMaxMbmsActiveContexts;
-	iEnumerateActiveListReqHandle = aTsyReqHandle;
-	return KErrNone;
-	}
-
-TInt CSimPacketService::EnumerateMbmsActiveServiceListCancel(const TTsyReqHandle aTsyReqHandle)
-/**
-* client's interest in canceling the enumeration the MBMS Service active list.
-* This function is just a dummy function.
-* 
-* @param aTsyReqHandle Tsy Request handle for the client cancel request
-* @return KErrNone
-*/
-	{
-	if(iEnumerateActiveListReqHandle == aTsyReqHandle)
-		{
-		ReqCompleted(iEnumerateActiveListReqHandle,KErrCancel);
-		}
-	else
-		{
-		ReqCompleted(iEnumerateActiveListReqHandle,KErrCorrupt);
-		}
-	return KErrNone;
-	}	
-		
-/**
-* A CSimPacketContext object has been destroyed - this method will be called in its 
-* destructor
-*/
-void CSimPacketService::DecrementContextCount()
-	{
-	iContextCount--;
-	}
-
-/**
-* A CSimPacketContext object has been destroyed - this method will be called in its 
-* destructor
-*/
-void CSimPacketService::DecrementMbmsContextCount()
-	{
-	iMbmsContextCount--;
-	}
-
-
+// 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 "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:
+// implementattion for CSimPacketService Class
+// This file contains the implementation of the Similator TSY Packet Service functionality.  
+// CSimPacketService class provides a simulated packet-switched connection to a packet 
+// (GPRS and CDMA) network.
+// 
+//
+
+/**
+ @file
+*/
+
+#include "CSimPacketService.h"
+#include "Simlog.h"
+#include <pcktcs.h>
+#include "CSimPhone.h"
+#include "utils.h"
+#include "CSimPacketContext.h"
+#include "CSimPubSubChange.h"
+
+
+#include "CSimIncomingContextManager.h"
+
+
+_LIT(KApn, "ACME INTERNET PROVIDERS LTD");
+_LIT(KProtocolAddress, "i-MODE GATEWAY");
+_LIT(KUsername, "USER1");
+_LIT(KPassword, "PASSWORD1");
+_LIT(KChallenge, "CHALLENGE1");
+_LIT(KResponse, "RESPONSE1");
+_LIT(KPrimaryDNS, "PRIMARYSERVER1");
+_LIT(KSecondaryDNS, "SECONDARYSERVER1");
+
+
+// enum for caps
+const TUint KPacketServiceCaps=(RPacketService::KCapsSuspendSupported |
+								RPacketService::KCapsMSClassSupported |
+								RPacketService::KCapsCDMA2000HighSpeedDataSupported |
+								RPacketService::KCapsNetworkAvailabilitySupported |
+								RPacketService::KCapsProtocolPPPSupported |
+								RPacketService::KCapsHSDPASupported |
+								RPacketService::KCapsEGPRSSupported |
+								RPacketService::KCapsHSUPASupported );
+								 
+CSimPacketService* CSimPacketService::NewL(CSimPhone* aPhone)
+/**
+* Standard two phase constructor
+*
+* @param aPhone Pointer to the phone object (CSimPhone)
+* @return CSimPacketService pointer to the packet service object created.
+* @leave Leaves if no memory or object is not created for any reason.
+*/
+	{
+	CSimPacketService* simPacket=new(ELeave) CSimPacketService(aPhone);
+	CleanupStack::PushL(simPacket);
+	simPacket->ConstructL();
+	CleanupStack::Pop();
+	return simPacket;
+	}
+
+void CSimPacketService::Init()
+	{}
+
+CSimPacketService::CSimPacketService(CSimPhone* aPhone)
+	: iPhone(aPhone), iContextCount(0), iPrimaryContextNameInc(0),
+	  iSecondaryContextNameInc(0), iAttachMode(RPacketService::EAttachWhenNeeded),
+	  iCurrentEvent(EPacketEventNone), iPacketReleaseModeIndex(0), 
+	  iPcktTimerBool(EFalse), iCurrentPrimaryContextIndex(0)
+/**
+* Trivial Constructor.  Initialises all the data members
+*
+* @param aPhone pointer to the phone object that owns this class.
+*/
+	{
+	iState=RPacketService::EStatusUnattached;
+	iMSClass = RPacketService::EMSClassSuspensionRequired;
+	iNotifyStatusChange.iNotifyPending = EFalse;		
+	iNotifyContextAdded.iNotifyPending = EFalse;
+	iNotifyChangeOfNtwk.iNotifyPending = EFalse;
+	iNotifyMSClassChange.iNotifyPending = EFalse;
+	iNotifyChangeOfReleaseMode.iNotifyPending=EFalse;
+	iNotifyChangeOfAttachMode.iNotifyPending=EFalse;
+	iNotifyDynamicCapsChange.iNotifyPending = EFalse;
+	iNotifyMbmsNetworkStatusChange.iNotifyPending = EFalse;
+	iNotifyMbmsServAvailChange.iNotifyPending = EFalse;
+	iSecondaryContext = EFalse;
+	}
+
+
+void CSimPacketService::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 no memory or any data member does not construct for any reason.
+* @panic Panics with SIMTSY EInvalidParameterFormatInConfigFile if an additional param data item is in an invalid format
+*/
+	{
+	LOGPACKET1("CSimPacketService: Entered ConstructL()");
+	
+	iTimer = CSimTimer::NewL(iPhone);
+	iPcktRegTimer = CSimTimer::NewL(iPhone);
+	iNtwkRegTimer = CSimTimer::NewL(iPhone);
+	iReleaseModeTimer = CSimTimer::NewL(iPhone);
+	iDynamicCapsTimer = CSimTimer::NewL(iPhone);
+	iMbmsPcktTimer = CSimTimer::NewL(iPhone);
+	iMutex.CreateGlobal(KNullDesC, EOwnerProcess);
+	
+	iNtwkRegStatusInfo = new(ELeave) CArrayFixFlat<TNtwkRegStatus>(KGranularity);
+	iPcktRegStatusInfo=new(ELeave) CArrayFixFlat<TPacketRegStatus>(KGranularity);
+	iPacketReleaseModeArray=new (ELeave) CArrayFixFlat<TPacketReleaseMode>(KGranularity);
+	iDynamicCapsArray = new (ELeave) CArrayFixFlat<TPacketDynamicCaps>(KGranularity);
+	iSecondaryContextCountArray = new(ELeave)CArrayFixFlat<TInt>(KGranularity);
+	iMbmsBroadcastParamsArray = new(ELeave)CArrayFixFlat<TMbmsBroadCastParams>(KGranularity);
+	iMbmsMonitorListParamsArray = new(ELeave)CArrayFixFlat<TMbmsMonitorListParams>(KGranularity);
+	iMbmsServicesList = new CArrayPtrFlat<CPcktListReadAllAttempt>(1);
+	
+	iNtwkRegStatusChangeProperty = CSimPubSub::TPubSubProperty(KUidPSSimTsyCategory, KPSSimtsyPacketServiceNtwkRegStatusChange, KPSSimtsyPacketServiceNtwkRegStatusChangeKeyType);
+	iNtwkRegStatusChange =  CSimPubSub::NewL(this,iNtwkRegStatusChangeProperty);
+	iNtwkRegStatusChange->Start(); 
+	
+	iMbmsActivation = CSimPubSubChange::NewL(this,CSimPubSub::TPubSubProperty(KUidPSSimTsyCategory, KPSSimTsyMbmsService, KPSSimTsyMbmsServiceType));
+
+	const CTestConfigItem* item=NULL;
+	TInt ret=KErrNone;
+	
+	item=CfgFile()->Item(KAttachPauseDuration); //< Retrieves the attach pause duration number from the config file
+	if(item)
+		{
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,iAttachPause);
+		if(ret!=KErrNone)
+			iAttachPause = KDefaultPauseDuration;
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,iAttachFail);
+		if(ret==KErrNotFound)
+			iAttachFail = KErrNone;
+		}
+
+	item=CfgFile()->Item(KDetachPauseDuration);	//< Retrieves the detach pause duration number from the config file
+	if(item)
+		{
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,iDetachPause);
+		if(ret!=KErrNone)
+			iDetachPause = KDefaultPauseDuration;
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,iDetachFail);
+		if(ret==KErrNotFound)
+			iDetachFail = KErrNone;
+		}
+
+	TInt count=CfgFile()->ItemCount(KPacketRegStatus); //< Retrieves the packet registration info
+	item=NULL;
+	TInt i;
+	for(i=0;i<count;i++)
+		{
+		item=CfgFile()->Item(KPacketRegStatus,i);
+		if(!item)
+			break;
+
+		TInt time,regState;
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,time);
+		if(ret!=KErrNone)
+			break;
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,regState);
+		if(ret!=KErrNone)
+			break;
+
+		TPacketRegStatus status;
+		status.iDuration=time;
+		status.iStatus=(RPacketService::TStatus)regState;
+		TRAP_IGNORE(iPcktRegStatusInfo->AppendL(status));
+		}
+
+	iNtwkRegStatusNotificationType = ETimer;
+	item=CfgFile()->Item(KNetworkRegStatusType);
+	if(item)
+		{
+		TPtrC8 networkRegStatusType;
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,networkRegStatusType);
+		if(ret==KErrNone && networkRegStatusType.Compare(KNotificationTypePublishSubscribe)==0)
+			{
+			iNtwkRegStatusNotificationType = EPublishAndSubscribe;
+			}
+		}
+
+	count=CfgFile()->ItemCount(KNetworkRegStatus); //< Retrieves the packet registration info
+	item=NULL;
+	for(i=0;i<count;i++)
+		{
+		item=CfgFile()->Item(KNetworkRegStatus,i);
+		if(!item)
+			break;
+
+		TInt time,regState;
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,time);
+		if(ret!=KErrNone)
+			break;
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,regState);
+		if(ret!=KErrNone)
+			break;
+
+		TNtwkRegStatus status;
+		status.iDuration=time;
+		status.iRegStatus=(RPacketService::TRegistrationStatus)regState;
+		TRAP_IGNORE(iNtwkRegStatusInfo->AppendL(status));
+		}
+
+	if(iPcktRegStatusInfo->Count()!=0)
+		{
+		iPcktRegStatIndex=0;
+		iState=(RPacketService::TStatus)iPcktRegStatusInfo->At(0).iStatus;
+		iPcktRegTimer->Start(iPcktRegStatusInfo->At(0).iDuration,this,ETimerIdPcktServPacket);
+		}
+
+	if(iNtwkRegStatusInfo->Count()!=0)
+		{
+		iCurrentRegStatus=(RPacketService::TRegistrationStatus)iNtwkRegStatusInfo->At(0).iRegStatus;
+		if (iNtwkRegStatusNotificationType == ETimer)
+			{
+			iNtwkRegStatIndex=0;
+			iNtwkRegTimer->Start(iNtwkRegStatusInfo->At(0).iDuration,this,ETimerIdPcktServNtwkStatusChange);
+			}
+		}
+
+	//< Read in all dynamic capabilities data
+	count = CfgFile()->ItemCount(KDynamicCaps);
+	item = NULL;
+	for (i = 0; i < count; ++i)
+		{
+		item = CfgFile()->Item(KDynamicCaps,i);
+		if (!item)
+			break;
+		
+		TInt duration(0); 
+		TInt dynamicCaps(0);
+		ret = CTestConfig::GetElement(item->Value(),KStdDelimiter,0,duration);
+		if (ret != KErrNone)
+			break;
+		ret = CTestConfig::GetElement(item->Value(),KStdDelimiter,1,dynamicCaps);
+		if (ret != KErrNone)
+			break;
+		
+		TPacketDynamicCaps dynamicCapsData;
+		dynamicCapsData.iDuration = duration;
+		dynamicCapsData.iDynamicCaps = dynamicCaps;
+		
+		TRAP_IGNORE(iDynamicCapsArray->AppendL(dynamicCapsData));
+		}
+	
+	if (iDynamicCapsArray->Count() != 0)
+		{
+		iDynamicCapsIndex = 0;
+		TPacketDynamicCaps initialCaps = iDynamicCapsArray->At(0);
+		iCurrentDynamicCaps = initialCaps.iDynamicCaps;
+		iDynamicCapsTimer->Start(initialCaps.iDuration, this, ETimerIdPcktServDynamicCaps);
+		}
+	// end of dynamic caps simulation setup
+	
+	//< Read in all the data for getting the default GPRS configuration parameters
+	
+	item = CfgFile()->Item(KDefaultContextparamGPRS);
+	if(item) 
+		{
+		TInt protocolType,pdpCompression, anonymousAccess, useEdge;
+		TPtrC8 gsnAddress, protocolAddress;
+		TInt protocol;	
+		TPtrC8 username,password, challenge, response, primaryDNS, secondaryDNS, iMiscBuffer;
+		TInt id, numAdditionalParams;
+
+		iGPRSDefaultConfig.iProtocolConfigOption.iMiscBuffer.Zero();
+		
+		TPtr8 pcoPtr(const_cast<TUint8*>(iGPRSDefaultConfig.iProtocolConfigOption.iMiscBuffer.Ptr()), 
+			RPacketContext::KMiscProtocolBufferLength);
+
+		// Attach TTlv to the buffer
+		TTlvStruct<RPacketContext::TPcoId,RPacketContext::TPcoItemDataLength> tlvStruct(pcoPtr,0);
+
+		RPacketContext::TPcoId pcoId;
+		
+		TUint itemOffSet = 0; // Used for nested Addional Param items		
+		
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,protocolType);
+		if(ret==KErrNone)
+			iGPRSDefaultConfig.iProtocolType = protocolType;
+
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,gsnAddress);
+		if(ret==KErrNone)
+			iGPRSDefaultConfig.iGsnAddress.Set(gsnAddress);
+
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,protocolAddress);
+		if(ret==KErrNone)
+			iGPRSDefaultConfig.iProtocolAddress.Set(protocolAddress);
+
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,pdpCompression);
+		if(ret==KErrNone)
+			iGPRSDefaultConfig.iPdpCompression = pdpCompression;
+
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,anonymousAccess);
+		if(ret==KErrNone)
+			iGPRSDefaultConfig.iAnonymousAccess = anonymousAccess;
+
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,5,useEdge);
+		if(ret==KErrNone)
+			iGPRSDefaultConfig.iUseEdge = useEdge;
+
+		// Protocol configuration and DNS server parameters added
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,6,protocol);
+		if(ret==KErrNone)
+			iGPRSDefaultConfig.iProtocolConfigOption.iAuthProtocol = protocol;
+
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,7,username);
+		if(ret==KErrNone)
+			iGPRSDefaultConfig.iProtocolConfigOption.iUsername.Set(username);
+
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,8,password);
+		if(ret==KErrNone)
+			iGPRSDefaultConfig.iProtocolConfigOption.iPassword.Set(password);
+
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,9,challenge);
+		if(ret==KErrNone)
+			iGPRSDefaultConfig.iProtocolConfigOption.iChallenge.Set(challenge);
+
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,10,response);
+		if(ret==KErrNone)
+			iGPRSDefaultConfig.iProtocolConfigOption.iResponse.Set(response);
+
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,11,primaryDNS);
+		if(ret==KErrNone)
+			iGPRSDefaultConfig.iProtocolConfigOption.iPrimaryDNS.Set(primaryDNS);
+
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,12,secondaryDNS);
+		if(ret==KErrNone)
+			iGPRSDefaultConfig.iProtocolConfigOption.iSecondaryDNS.Set(secondaryDNS);
+
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,13,id);
+		if(ret==KErrNone)
+			iGPRSDefaultConfig.iProtocolConfigOption.iId = id;
+		
+		//Get the Additional Params List
+		//Get the number of items in the Additional Params List
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,14,numAdditionalParams);
+		if(ret==KErrNone)
+			{
+			TInt nestedItemNumber;
+			TUint16 digit, format;
+			const CTestConfigItem* item2;
+			
+			for(nestedItemNumber=itemOffSet; nestedItemNumber<itemOffSet+numAdditionalParams; nestedItemNumber++)
+				{
+				item2 = CfgFile()->Item(KDefaultGPRSAdditionalParamItem, nestedItemNumber);
+		
+				if(item2)
+					{
+					TPtrC8 additionalParamId, additionalParamContent, additionalParamDataFormat;
+				
+					// Get ID
+					ret=CTestConfig::GetElement(item2->Value(),KStdDelimiter,0,additionalParamId);
+					if(ret==KErrNone)
+						{
+						if(AsciiToNum(additionalParamId, digit)==KErrNone)
+							{
+							pcoId.SetId(digit);
+							}
+						}
+					
+					// Read AdditionalParamDataFormat field to find out how
+					// to interpret data in the AdditionalParamData field
+					ret=CTestConfig::GetElement(item2->Value(),KStdDelimiter,2,additionalParamDataFormat);
+					if (ret != KErrNone)
+						{
+						// AdditionalParamDataFormat not been specified,
+						// default to plain ASCII
+						LOGPARSERR("AdditionalParamItem::additionalParamDataFormat",ret,2,&KDefaultGPRSAdditionalParamItem);
+						format = EConfigDataFormatAscii;
+						}
+					else
+						{
+						if (AsciiToNum(additionalParamDataFormat, format) != KErrNone)
+							{
+							LOGPARSERR("AdditionalParamItem::additionalParamDataFormat",KErrArgument,2,&KDefaultGPRSAdditionalParamItem);
+							format = EConfigDataFormatAscii;
+							}
+
+						// Check that the AdditionalParamDataFormat value
+						// specified in the config file is a valid one,
+						// default to ASCII if not.
+						if (format >= EMaxConfigDataFormat)
+							{
+							LOGPARSERR("AdditionalParamItem::additionalParamDataFormat",KErrArgument,2,&KDefaultGPRSAdditionalParamItem);
+							format = EConfigDataFormatAscii;
+							}
+						}
+										
+					// Get AdditionalParamData
+					ret=CTestConfig::GetElement(item2->Value(),KStdDelimiter,1,additionalParamContent);
+					if(ret==KErrNone)
+						{
+						// Add AdditionalParamData to PCO buffer depending on format
+						switch (format)
+							{
+						case EConfigDataFormatMixedBinaryAndAscii:
+							{
+							// Parse the string here
+							// Will store the parsed data when algorithm has completed
+							TBuf8<RPacketContext::KMiscProtocolBufferLength> additionalParamDataBuffer;
+							additionalParamDataBuffer.Copy (additionalParamContent);
+
+							if (ParseMixedBinaryAsciiDataL(additionalParamDataBuffer) != KErrNone)
+								{
+								LOGPARSERR("AdditionalParamItem::additionalParamContent",KErrArgument,1,&KDefaultGPRSAdditionalParamItem);
+								SimPanic(EInvalidParameterFormatInConfigFile);
+								}
+
+							TPtr8 paramPtr(const_cast<TUint8*>(additionalParamDataBuffer.Ptr()), 
+								additionalParamDataBuffer.Length(), additionalParamDataBuffer.Length());
+							tlvStruct.AppendItemL(pcoId, paramPtr);
+
+							} // case EAdditionalParamDataFormatMixedBinaryAndAscii
+							break;
+						case EConfigDataFormatAscii:
+						default:
+							TPtr8 paramPtr(const_cast<TUint8*>(additionalParamContent.Ptr()), 
+								additionalParamContent.Length(), additionalParamContent.Length());
+							tlvStruct.AppendItemL(pcoId, paramPtr);
+
+							break;
+							} // switch (format)
+						
+						iGPRSDefaultConfig.iProtocolConfigOption.iMiscBuffer.SetLength(pcoPtr.Length());						
+						} // if (ret == KErrNone)
+					}
+				}
+
+				itemOffSet= itemOffSet + numAdditionalParams;;
+			}
+		else
+			{
+			LOGPARSERR("ProtocolConfigOption::numAdditionalParams",ret,14,&KDefaultContextparamGPRS);	
+			} 
+		} 
+
+	//< Read in all the data for getting the default UMTS configuration parameters
+	item = CfgFile()->Item(KDefaultContextparamRel99);
+	if(item)
+		{
+		TInt protocolType,useEdge;
+		TPtrC8 gsnAddress, protocolAddress;
+		TInt protocol;
+		TPtrC8 username,password, challenge, response, primaryDNS, secondaryDNS, iMiscBuffer;
+		TInt id, numAdditionalParams;
+
+		iR99_R4DefaultConfig.iProtocolConfigOption.iMiscBuffer.Zero();
+		
+		TPtr8 pcoPtr(const_cast<TUint8*>(iR99_R4DefaultConfig.iProtocolConfigOption.iMiscBuffer.Ptr()), 
+			RPacketContext::KMiscProtocolBufferLength);
+
+		// Attach TTlv to the buffer
+		TTlvStruct<RPacketContext::TPcoId,RPacketContext::TPcoItemDataLength> tlvStruct(pcoPtr,0);
+
+		RPacketContext::TPcoId pcoId;
+		
+		TUint itemOffSet = 0; // Used for nested Addional Param items
+
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,protocolType);
+		if(ret==KErrNone)
+			iR99_R4DefaultConfig.iProtocolType = protocolType;
+
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,gsnAddress);
+		if(ret==KErrNone)
+			iR99_R4DefaultConfig.iGsnAddress.Set(gsnAddress);
+
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,protocolAddress);
+		if(ret==KErrNone)
+			iR99_R4DefaultConfig.iProtocolAddress.Set(protocolAddress);
+
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,useEdge);
+		if(ret==KErrNone)
+			iR99_R4DefaultConfig.iUseEdge = useEdge;
+
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,protocol);
+		if(ret==KErrNone)
+			iR99_R4DefaultConfig.iProtocolConfigOption.iAuthProtocol = protocol;
+
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,5,username);
+		if(ret==KErrNone)
+			iR99_R4DefaultConfig.iProtocolConfigOption.iUsername.Set(username);
+
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,6,password);
+		if(ret==KErrNone)
+			iR99_R4DefaultConfig.iProtocolConfigOption.iPassword.Set(password);
+
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,7,challenge);
+		if(ret==KErrNone)
+			iR99_R4DefaultConfig.iProtocolConfigOption.iChallenge.Set(challenge);
+
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,8,response);
+		if(ret==KErrNone)
+			iR99_R4DefaultConfig.iProtocolConfigOption.iResponse.Set(response);
+
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,9,primaryDNS);
+		if(ret==KErrNone)
+			iR99_R4DefaultConfig.iProtocolConfigOption.iPrimaryDNS.Set(primaryDNS);
+
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,10,secondaryDNS);
+		if(ret==KErrNone)
+			iR99_R4DefaultConfig.iProtocolConfigOption.iSecondaryDNS.Set(secondaryDNS);
+
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,11,id);
+		if(ret==KErrNone)
+			iR99_R4DefaultConfig.iProtocolConfigOption.iId = id;
+		
+		//Get the Additional Params List
+		//Get the number of items in the Additional Params List
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,12,numAdditionalParams);
+		if(ret==KErrNone)
+			{
+			TInt nestedItemNumber;
+			TUint16 digit, format;
+			const CTestConfigItem* item2;
+			
+			for(nestedItemNumber=itemOffSet; nestedItemNumber<itemOffSet+numAdditionalParams; nestedItemNumber++)
+				{
+				item2 = CfgFile()->Item(KDefaultAdditionalParamItemRel99, nestedItemNumber);
+		
+				if(item2)
+					{
+					TPtrC8 additionalParamId, additionalParamContent, additionalParamDataFormat;
+				
+					ret=CTestConfig::GetElement(item2->Value(),KStdDelimiter,0,additionalParamId);
+					if(ret==KErrNone)
+						{
+						if(AsciiToNum(additionalParamId, digit)==KErrNone)
+							{
+							pcoId.SetId(digit);
+							}
+						}
+
+					// Read AdditionalParamDataFormat field to find out how
+					// to interpret data in the AdditionalParamData field
+					ret=CTestConfig::GetElement(item2->Value(),KStdDelimiter,2,additionalParamDataFormat);
+					if (ret != KErrNone)
+						{
+						// AdditionalParamDataFormat not been specified,
+						// default to plain ASCII
+						LOGPARSERR("No AdditionalParamItem::additionalParamDataFormat",ret,2,&KDefaultAdditionalParamItemRel99);
+						format = EConfigDataFormatAscii;
+						}
+					else
+						{
+						if (AsciiToNum(additionalParamDataFormat, format) != KErrNone)
+							{
+							LOGPARSERR("AdditionalParamItem::additionalParamDataFormat",KErrArgument,2,&KDefaultAdditionalParamItemRel99);
+							format = EConfigDataFormatAscii;
+							}
+
+						// Check that the AdditionalParamDataFormat value
+						// specified in the config file is a valid one,
+						// default to ASCII if not.
+						if (format >= EMaxConfigDataFormat)
+							{
+							LOGPARSERR("AdditionalParamItem::additionalParamDataFormat",KErrArgument,2,&KDefaultAdditionalParamItemRel99);
+							format = EConfigDataFormatAscii;
+							}
+						}
+						
+					ret=CTestConfig::GetElement(item2->Value(),KStdDelimiter,1,additionalParamContent);
+					if(ret==KErrNone)
+						{
+						// Add AdditionalParamData to PCO buffer depending on format
+						switch (format)
+							{
+						case EConfigDataFormatMixedBinaryAndAscii:
+							{
+							// Parse the string here
+							// Will store the parsed data when algorithm has completed
+							TBuf8<RPacketContext::KMiscProtocolBufferLength> additionalParamDataBuffer;
+							additionalParamDataBuffer.Copy (additionalParamContent);
+
+							if (ParseMixedBinaryAsciiDataL(additionalParamDataBuffer) != KErrNone)
+								{
+								LOGPARSERR("AdditionalParamItem::additionalParamContent",KErrArgument,1,&KDefaultAdditionalParamItemRel99);
+								SimPanic(EInvalidParameterFormatInConfigFile);
+								}
+
+							TPtr8 paramPtr(const_cast<TUint8*>(additionalParamDataBuffer.Ptr()), 
+								additionalParamDataBuffer.Length(), additionalParamDataBuffer.Length());
+							tlvStruct.AppendItemL(pcoId, paramPtr);
+
+							} // case EAdditionalParamDataFormatMixedBinaryAndAscii
+							break;
+						case EConfigDataFormatAscii:
+						default:
+							TPtr8 paramPtr(const_cast<TUint8*>(additionalParamContent.Ptr()), 
+								additionalParamContent.Length(), additionalParamContent.Length());
+							tlvStruct.AppendItemL(pcoId, paramPtr);
+
+							break;
+							} // switch (format)
+						iR99_R4DefaultConfig.iProtocolConfigOption.iMiscBuffer.SetLength(pcoPtr.Length());
+						}
+					}
+				}
+
+				itemOffSet= itemOffSet + numAdditionalParams;;
+			}
+		else
+			{
+			LOGPARSERR("ProtocolConfigOption::numAdditionalParams",ret,12,&KDefaultContextparamRel99);	
+			} 		
+
+		}
+
+		//< Read in all the data for getting the default R5 configuration parameters
+		item = CfgFile()->Item(KDefaultContextParamRel5);
+		if(item)
+			{
+			TInt protocolType, useEdge, protocol, id;
+			TInt pdpDataCompression, pdpHeaderCompression, numAdditionalParams;
+			TPtrC8 gsnAddress, protocolAddress, username, password, challenge;
+			TPtrC8 response, primaryDNS, secondaryDNS, iMiscBuffer;
+
+			iR5DefaultConfig.iProtocolConfigOption.iMiscBuffer.Zero();
+
+			TPtr8 pcoPtr(const_cast<TUint8*>(iR5DefaultConfig.iProtocolConfigOption.iMiscBuffer.Ptr()), 
+				RPacketContext::KMiscProtocolBufferLength);
+
+			// Attach the TTlv to the buffer
+			TTlvStruct<RPacketContext::TPcoId,RPacketContext::TPcoItemDataLength> tlvStruct(pcoPtr,0);
+
+			RPacketContext::TPcoId pcoId;
+			
+			TUint itemOffSet = 0; //Used for nested Addional Param items
+
+			//Get the Protocol Type from the config file
+			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,protocolType);
+			if(ret==KErrNone)
+				{
+				iR5DefaultConfig.iProtocolType = protocolType;	
+				}
+			
+			//Get the GGSN Address from the config file
+			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,gsnAddress);
+			if(ret==KErrNone)
+				{
+				iR5DefaultConfig.iGsnAddress.Set(gsnAddress);
+				}
+
+			//Get the ProtocolAddress from the config file
+			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,protocolAddress);
+			if(ret==KErrNone)
+				{
+				iR5DefaultConfig.iProtocolAddress.Set(protocolAddress);
+				}	
+				
+			//Get the UseEdge config param from the config file
+			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,useEdge);
+			if(ret==KErrNone)
+				{
+				iR5DefaultConfig.iUseEdge = useEdge;	
+				}
+			
+			
+			//Get the Autorisation Protocol config param from the config file
+			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,protocol);
+			if(ret==KErrNone)
+				{
+				iR5DefaultConfig.iProtocolConfigOption.iAuthProtocol = protocol;	
+				}
+
+
+			//Get the Username config param from the config file
+			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,5,username);
+			if(ret==KErrNone)
+				{
+				iR5DefaultConfig.iProtocolConfigOption.iUsername.Set(username);	
+				}
+
+			//Get the psword config param from the config file
+			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,6,password);
+			if(ret==KErrNone)
+				{
+				iR5DefaultConfig.iProtocolConfigOption.iPassword.Set(password);	
+				}
+			
+			//Get the Challenge config param from the config file
+			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,7,challenge);
+			if(ret==KErrNone)
+				{
+				iR5DefaultConfig.iProtocolConfigOption.iChallenge.Set(challenge);	
+				}
+
+			//Get the Response config param from the config file
+			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,8,response);
+			if(ret==KErrNone)
+				{
+				iR5DefaultConfig.iProtocolConfigOption.iResponse.Set(response);	
+				}
+
+			//Get the Primary DNS config param from the config file
+			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,9,primaryDNS);
+			if(ret==KErrNone)
+				{
+				iR5DefaultConfig.iProtocolConfigOption.iPrimaryDNS.Set(primaryDNS);	
+				}
+
+			//Get the Secondary DNS config param from the config file
+			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,10,secondaryDNS);
+			if(ret==KErrNone)
+				{
+				iR5DefaultConfig.iProtocolConfigOption.iSecondaryDNS.Set(secondaryDNS);	
+				}
+				
+			//Get the ID config param from the config file.
+			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,11,id);
+			if(ret==KErrNone)
+				{
+				iR5DefaultConfig.iProtocolConfigOption.iId = id;	
+				}
+
+			//Get the PDP Header Compression params
+			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,12,pdpHeaderCompression);
+			if(ret==KErrNone)
+				{
+				iR5DefaultConfig.iPdpHeaderCompression = pdpHeaderCompression;
+				}
+			
+			//Get the PDP Data compression params
+			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,13,pdpDataCompression);
+			if(ret==KErrNone)
+				{
+				iR5DefaultConfig.iPdpDataCompression = pdpDataCompression;
+				}
+				
+
+			//Get the Additional Params List
+			//Get the number of items in the Additional Params List
+			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,14,numAdditionalParams);
+			if(ret==KErrNone)
+				{
+				TInt nestedItemNumber;
+				TUint16 digit, format;
+				const CTestConfigItem* item2;
+				
+				for(nestedItemNumber=itemOffSet; nestedItemNumber<itemOffSet+numAdditionalParams; nestedItemNumber++)
+					{
+					item2 = CfgFile()->Item(KDefaultAdditionalParamItem, nestedItemNumber);
+			
+					if(item2)
+						{
+						TPtrC8 additionalParamId, additionalParamContent, additionalParamDataFormat;
+					
+						ret=CTestConfig::GetElement(item2->Value(),KStdDelimiter,0,additionalParamId);
+						if(ret==KErrNone)
+							{
+							if(AsciiToNum(additionalParamId, digit)==KErrNone)
+								{
+								pcoId.SetId(digit);
+								}
+							}
+
+					// Read AdditionalParamDataFormat field to find out how
+					// to interpret data in the AdditionalParamData field
+					ret=CTestConfig::GetElement(item2->Value(),KStdDelimiter,2,additionalParamDataFormat);
+					if (ret != KErrNone)
+						{
+						// AdditionalParamDataFormat not been specified,
+						// default to plain ASCII
+						LOGPARSERR("No AdditionalParamItem::additionalParamDataFormat",ret,2,&KDefaultAdditionalParamItem);
+						format = EConfigDataFormatAscii;
+						}
+					else
+						{
+						if (AsciiToNum(additionalParamDataFormat, format) != KErrNone)
+							{
+							LOGPARSERR("AdditionalParamItem::additionalParamDataFormat",KErrArgument,2,&KDefaultAdditionalParamItem);
+							format = EConfigDataFormatAscii;
+							}
+
+						// Check that the AdditionalParamDataFormat value
+						// specified in the config file is a valid one,
+						// default to ASCII if not.
+						if (format >= EMaxConfigDataFormat)
+							{
+							LOGPARSERR("AdditionalParamItem::additionalParamDataFormat",KErrArgument,2,&KDefaultAdditionalParamItem);
+							format = EConfigDataFormatAscii;
+							}
+						}
+
+						ret=CTestConfig::GetElement(item2->Value(),KStdDelimiter,1,additionalParamContent);
+						if(ret==KErrNone)
+							{
+							// Add AdditionalParamData to PCO buffer depending on format
+							switch (format)
+								{
+							case EConfigDataFormatMixedBinaryAndAscii:
+								{
+								// Parse the string here
+								// Will store the parsed data when algorithm has completed
+								TBuf8<RPacketContext::KMiscProtocolBufferLength> additionalParamDataBuffer;
+								additionalParamDataBuffer.Copy (additionalParamContent);
+
+								if (ParseMixedBinaryAsciiDataL(additionalParamDataBuffer) != KErrNone)
+									{
+									LOGPARSERR("AdditionalParamItem::additionalParamContent",KErrArgument,1,&KDefaultAdditionalParamItem);
+									SimPanic(EInvalidParameterFormatInConfigFile);
+									}
+
+								TPtr8 paramPtr(const_cast<TUint8*>(additionalParamDataBuffer.Ptr()), 
+									additionalParamDataBuffer.Length(), additionalParamDataBuffer.Length());
+								tlvStruct.AppendItemL(pcoId, paramPtr);
+
+								} // case EAdditionalParamDataFormatMixedBinaryAndAscii
+								break;
+							case EConfigDataFormatAscii:
+							default:
+								TPtr8 paramPtr(const_cast<TUint8*>(additionalParamContent.Ptr()), 
+									additionalParamContent.Length(), additionalParamContent.Length());
+								tlvStruct.AppendItemL(pcoId, paramPtr);
+
+								break;
+								} // switch (format)
+							iR5DefaultConfig.iProtocolConfigOption.iMiscBuffer.SetLength(pcoPtr.Length());
+							}
+						}
+					}
+
+					itemOffSet= itemOffSet + numAdditionalParams;;
+				}
+			}
+
+		count=CfgFile()->ItemCount(KPacketReleaseMode); //< Retrieves the packet registration info
+		item=NULL;
+		for(i=0;i<count;i++)
+			{
+			item=CfgFile()->Item(KPacketReleaseMode,i);
+			if(!item)
+				break;
+			TInt release,duration;
+			
+			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,release);
+			if(ret!=KErrNone)
+				break;
+			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,duration);
+			if(ret!=KErrNone)
+				break;
+
+			TPacketReleaseMode releaseMode;
+			releaseMode.iDuration=duration;
+			releaseMode.iReleaseMode=release;
+			TRAP_IGNORE(iPacketReleaseModeArray->AppendL(releaseMode));
+			}
+
+		item=NULL;
+		count=CfgFile()->ItemCount(KMBMSBroadCastPacketServiceParams); //< Retrieves the Count of MBMS related information
+
+		for(i=0;i<count;i++)
+			{
+			item = CfgFile()->Item(KMBMSBroadCastPacketServiceParams,i); //< Retrieves the MBMS related information
+
+			TInt duration =0;
+			TInt status =0;
+			if(!item)
+				{
+				break;
+				}
+
+			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,duration);
+			if(ret!=KErrNone)
+				{
+				break;
+				}
+			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,status);
+			if(ret!=KErrNone)
+				{
+				status = EMbmsSupportUnknown;
+				}
+
+			TMbmsBroadCastParams mbmsParams;
+			mbmsParams.iDuration = duration;
+			mbmsParams.iMbmsNetworkStatus = reinterpret_cast<TMbmsNetworkServiceStatus&> (status);
+			TRAP_IGNORE(iMbmsBroadcastParamsArray->AppendL(mbmsParams));
+			}
+
+		item=NULL;
+		count=CfgFile()->ItemCount(KMBMSBroadcastMonitorList); //< Retrieves the Count of MBMS related information
+
+		for(i=0;i<count;i++)
+			{
+			item = CfgFile()->Item(KMBMSBroadcastMonitorList,i); //< Retrieves the MBMS related information
+
+			TInt duration =0;
+			TInt mnc=0;
+			TInt mcc=0;
+			TInt serviceId=0;
+			TInt accessBearer=0;
+			TInt serviceMode=0;
+			TInt serviceAvailability=0;
+			TInt entryValid=0;
+			
+			if(!item)
+				{
+				break;
+				}
+
+			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,duration);
+			if(ret!=KErrNone)
+				{
+				break;
+				}
+
+			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,mcc);
+			if(ret!=KErrNone)
+				{
+				break;
+				}
+
+			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,mnc);
+			if(ret!=KErrNone)
+				{
+				break;
+				}
+
+			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,serviceId);
+			if(ret!=KErrNone)
+				{
+				break;
+				}
+
+			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,accessBearer);
+			if(ret!=KErrNone)
+				{
+				break;
+				}
+
+			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,5,serviceMode);
+			if(ret!=KErrNone)
+				{
+				break;
+				}
+
+			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,6,serviceAvailability);
+			if(ret!=KErrNone)
+				{
+				break;
+				}
+
+			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,7,entryValid);
+			if(ret!=KErrNone)
+				{
+				entryValid = 0; //default Entry is Invalid
+				}
+			TMbmsMonitorListParams mbmsMonitorParams;
+
+			mbmsMonitorParams.iDuration = duration;
+			mbmsMonitorParams.iMCC = mcc;
+			mbmsMonitorParams.iMNC = mnc;
+			mbmsMonitorParams.iServiceId = serviceId;
+			mbmsMonitorParams.iAccessBearer = reinterpret_cast<TMbmsScope&> (accessBearer);
+			mbmsMonitorParams.iServiceMode = reinterpret_cast<TMbmsServiceMode&> (serviceMode);
+			mbmsMonitorParams.iAvailStatus = reinterpret_cast<TMbmsAvailabilityStatus&> (serviceAvailability);
+			mbmsMonitorParams.iIsEntryValid = reinterpret_cast<TBool&> (entryValid);
+
+			TRAP_IGNORE(iMbmsMonitorListParamsArray->AppendL(mbmsMonitorParams));
+
+			}
+
+			if(iMbmsBroadcastParamsArray->Count()!=0)
+				{
+				iMbmsPcktTimer->Start(iMbmsBroadcastParamsArray->At(0).iDuration,this,ETimerIdMbmsPcktService);
+				}
+			else if (iMbmsMonitorListParamsArray->Count()!=0)
+				{
+				iMbmsPcktTimer->Start(iMbmsMonitorListParamsArray->At(0).iDuration,this,ETimerIdMbmsPcktService);
+				}
+
+			if(iPacketReleaseModeArray->Count()!=0)
+				{
+				iPacketReleaseModeIndex = 0;
+				iCurrentPacketReleaseMode = iPacketReleaseModeArray->At(0).iReleaseMode;
+				iReleaseModeTimer->Start(iPacketReleaseModeArray->At(0).iDuration,this,ETimerIdPcktServReleaseMode);
+				}
+			iIncomingContextManager = CSimIncomingContextManager::NewL(iPhone, this);
+			iIncomingContextManager->LoadIncomingContextsL( KDelayIncomingContext() );
+			iIncomingContextManager->SetUseTimerOn();
+			}
+	
+
+CSimPacketService::~CSimPacketService()
+/**
+* Trivial Destructor
+* Closes all CObject type objects and destroys all other objects created in the ConstructL()
+*
+*/
+	{
+	LOGPACKET1("CSimPacketService: Entered destructor");
+		
+	delete iIncomingContextManager;
+	
+	iMutex.Close();
+	// delete nifs' contexts
+	int count = iNifWrappers.Count();
+
+	for(TInt i = 0; i<count; i++)
+		{
+		iNifWrappers[i].Close();
+		}
+
+	iNifWrappers.Close();
+	
+	if (iPcktRegStatusInfo != NULL)
+		{
+		iPcktRegStatusInfo->Delete(0,iPcktRegStatusInfo->Count());
+		delete iPcktRegStatusInfo;
+		}
+
+	if(iNtwkRegStatusInfo != NULL)
+		{
+		iNtwkRegStatusInfo->Delete(0,iNtwkRegStatusInfo->Count());
+		delete iNtwkRegStatusInfo;
+		}
+
+	delete iTimer;
+	
+	delete iPcktRegTimer;
+
+	delete iNtwkRegTimer;
+
+	delete iReleaseModeTimer;
+	
+	delete iDynamicCapsTimer;
+	
+	delete iMbmsPcktTimer;
+
+	if (iPacketReleaseModeArray != NULL)
+		{	
+		iPacketReleaseModeArray->Delete(0,iPacketReleaseModeArray->Count());
+		delete iPacketReleaseModeArray;
+		}
+	if (iDynamicCapsArray != NULL)
+		{
+		iDynamicCapsArray->Delete(0,iDynamicCapsArray->Count());
+		delete iDynamicCapsArray;
+		}
+	
+	if (iSecondaryContextCountArray != NULL)
+		{
+		iSecondaryContextCountArray->Delete(0,iSecondaryContextCountArray->Count());
+		delete iSecondaryContextCountArray;
+		}
+	
+	if(iMbmsBroadcastParamsArray != NULL)
+		{
+		iMbmsBroadcastParamsArray->Delete(0,iMbmsBroadcastParamsArray->Count());
+		delete iMbmsBroadcastParamsArray;
+		}
+	
+	if(iMbmsMonitorListParamsArray != NULL)
+		{
+		iMbmsMonitorListParamsArray->Delete(0,iMbmsMonitorListParamsArray->Count());
+		delete iMbmsMonitorListParamsArray;
+		}
+	
+	if(iMbmsServicesList)
+		{
+		iMbmsServicesList->ResetAndDestroy();
+		}
+	delete iMbmsServicesList;
+	
+	// delete nifs' contexts
+	count = iMbmsNifWrappers.Count();
+
+	for(TInt i = 0; i<count; i++)
+		{
+		iMbmsNifWrappers[i].Close();
+		}
+
+	iMbmsNifWrappers.Close();
+	
+	delete iNtwkRegStatusChange;
+	
+	delete iMbmsActivation;
+	}
+
+CSimPhone* CSimPacketService::PhonePtr() const
+/**
+* Returns a pointer to the phone (parent) object
+*
+* @return CSimPhone Pointer to the phone object
+*/
+	{
+		return iPhone; 
+	}
+
+CTelObject* CSimPacketService::OpenNewObjectByNameL(const TDesC& aName)
+/**
+* Returns a pointer to an existing Context object identified by name.
+* If the object is deleted then reopen it then return a handle to it.
+*
+* @param aName name of the Context object to be opened
+* @return CTelObject pointer to the CSimPacketContext object or null if not possible or not found
+* @leave Leaves if object cannot be opened or created.
+*/
+	{
+	CSimPacketContext*  packetContext = NULL;
+
+	// go through every nif, and from there through every context in nif
+	TInt counter = iNifWrappers.Count();
+	
+	for(TInt i=0; i<counter; i++)
+		{
+		// now go through all contexts of the nif at index i
+		TInt totalContexts = iNifWrappers[i].NumberOfContexts();
+		for (TInt x=0; x<totalContexts; x++)
+			{
+			packetContext = iNifWrappers[i].GetContext(x);
+						
+			// if context name matches parameter, reactivate
+			if(aName.Compare(packetContext->ContextName())==KErrNone)
+				{
+				iCurrentPrimaryContextIndex = i;
+				TInt err = packetContext->ReActivate(this,aName);
+				if(err != KErrNone)
+					{
+					User::Leave(err);
+					return NULL;
+					}	
+				return packetContext;
+				}
+			}
+		}
+	
+	// if the control has reached here, then the context requested is not in the PDP context
+	// hence lets search in the list of MBMS contexts.
+	CSimMbmsPacketContext* pcktMbmsContext = NULL;
+	
+	counter = iMbmsNifWrappers.Count();
+	
+	for(TInt i=0;i<counter;i++)
+		{
+		TInt totalContexts = iMbmsNifWrappers[i].NumberOfContexts();
+		for (TInt x=0; x<totalContexts; x++)
+			{
+			pcktMbmsContext = iMbmsNifWrappers[i].GetContext(x);
+						
+			// if context name matches parameter, reactivate
+			if(aName.Compare(pcktMbmsContext->ContextName())==KErrNone)
+				{
+				TInt err = pcktMbmsContext->ReActivate(this,aName);
+				if(err != KErrNone)
+					{
+					User::Leave(err);
+					return NULL;
+					}	
+				return pcktMbmsContext;
+				}
+			}
+		}
+	
+	User::Leave(KErrNotFound);
+	return NULL;
+	}
+
+CTelObject* CSimPacketService::OpenNewObjectL(TDes& aNewName)
+/**
+* Creates a new CSimPacketContext object and returns a pointer to it.
+*
+* @param aName new name of the object created
+* @return CTelObject pointer to the CSimPacketContext object created
+* @leave Leaves if out of memory.
+*/
+	{
+	// Check whether the context creation is for MBMS of PDP context
+
+	if(aNewName.Compare(_L("MBMS_CONTEXT"))== KErrNone)  
+		{
+		// Processing for MBMS context creation starts
+		CSimMbmsPacketContext* pcktMbmsContext = NULL;
+
+		TInt ctr = iMbmsNifWrappers.Count();
+		TInt mbmsCnxtCount = 0;
+		for(TInt i=0;i<ctr; i++)
+			{
+			TInt mbmsContextsCount = iMbmsNifWrappers[i].NumberOfContexts();
+			for(TInt j=0;j<mbmsContextsCount;j++)
+				{
+				pcktMbmsContext = iMbmsNifWrappers[i].GetContext(j);
+				RPacketContext::TContextStatus tStat = pcktMbmsContext->ContextStatus();
+				if(tStat != RPacketContext::EStatusDeleted)
+					{
+					mbmsCnxtCount++;
+					}
+				}
+			}
+		if ( mbmsCnxtCount > KMaxMbmsContextSupportedByPhone )
+			{
+			if(iNotifyContextAdded.iNotifyPending)
+				{
+				iNotifyContextAdded.iNotifyPending = EFalse;
+				ReqCompleted(iNotifyContextAdded.iNotifyHandle,KErrUmtsMaxNumOfContextExceededByPhone);
+				}
+			User::Leave(KErrNoMemory);
+			return NULL;
+			}
+		else if (mbmsCnxtCount > KMaxMbmsContextSupportedByNetwork)
+			{
+			if(iNotifyContextAdded.iNotifyPending)
+				{
+				iNotifyContextAdded.iNotifyPending = EFalse;
+				ReqCompleted(iNotifyContextAdded.iNotifyHandle,KMaxMbmsContextSupportedByNetwork);
+				}
+			User::Leave(KErrNoMemory);
+			return NULL;
+			}
+		
+		aNewName.AppendNum(++iMbmsContextNameInc);  
+		pcktMbmsContext = CSimMbmsPacketContext::NewL(iPhone, this, aNewName);
+		CleanupStack::PushL(pcktMbmsContext);
+		
+		if(pcktMbmsContext->Open()==KErrNone)
+			{
+			TMbmsNifWrapper tMbmsNif;
+			tMbmsNif.AddContext(pcktMbmsContext);
+			iMbmsNifWrappers.Append(tMbmsNif);
+			}
+		iMbmsContextCount++;		
+
+		// Check for a pending line state notification.
+		if(iNotifyContextAdded.iNotifyPending)
+			{
+			iNotifyContextAdded.iNotifyPending=EFalse;
+			*(reinterpret_cast<TName*>(iNotifyContextAdded.iNotifyData))=pcktMbmsContext->ContextName();
+			ReqCompleted(iNotifyContextAdded.iNotifyHandle,KErrNone);
+			}
+
+		CleanupStack::Pop(pcktMbmsContext);
+		return pcktMbmsContext;
+
+
+		} // End of MBMS Context processing.
+
+	else 
+		{
+		// Processing for PDP context creation starts
+		
+		// if there are more contexts than the maximum allowed, return error code
+		CSimPacketContext*  packetContext = NULL;
+
+		// go through every nif, and from there through every context in nif
+		TInt counter = iNifWrappers.Count();
+		TInt contextCount=0;
+
+		for(TInt i=0; i<counter; i++)
+			{
+			// now go through all contexts of the nif at index i
+			TInt totalContexts = iNifWrappers[i].NumberOfContexts();
+			for (TInt x=0; x<totalContexts; x++)
+				{
+				packetContext = iNifWrappers[i].GetContext(x);	
+				RPacketContext::TContextStatus tstat = packetContext->ContextStatus();
+				if(tstat != RPacketContext::EStatusDeleted)
+					contextCount++;
+				}
+			}
+
+		if(contextCount >= KMaxContextPoolSize)
+			{
+			if(iNotifyContextAdded.iNotifyPending)
+				{
+				iNotifyContextAdded.iNotifyPending = EFalse;
+				ReqCompleted(iNotifyContextAdded.iNotifyHandle,KErrNoMemory);
+				}
+			User::Leave(KErrNoMemory);
+			return NULL;
+			}
+
+		CSimPacketContext* newContext;
+		
+		// if this is not a secondary context, give the new context the primary
+		// context name increment
+		if (!iSecondaryContext)
+			{
+			aNewName.Append(KSimPacketPrimaryContextName); 
+			aNewName.AppendNum(++iPrimaryContextNameInc);
+
+			newContext = CSimPacketContext::NewL(iPhone, this, aNewName);
+			CleanupStack::PushL(newContext);
+			if (newContext->Open() == KErrNone)
+				{
+				TNifWrapper nif;
+				nif.AddContext(newContext);
+				iNifWrappers.Append(nif);
+				iCurrentPrimaryContextIndex = iNifWrappers.Count() - 1;
+				}
+
+			// for every primary context, add an element in the array so that a count
+			// can be kept for each primary's secondary contexts
+			iSecondaryContextCountArray->AppendL(iCurrentPrimaryContextIndex);
+			iCurrentPrimaryContextIndex++;
+			}
+		else
+			{ 
+			// if this is a secondary context, name it accordingly
+			// and increment the count of the secondary's primary context
+			aNewName.Append(KSimPacketSecondaryContextName);
+			iSecondaryContextCountArray->At(iCurrentPrimaryContextIndex)++;
+			aNewName.AppendNum(iSecondaryContextCountArray->At(iCurrentPrimaryContextIndex));
+
+			newContext = CSimPacketContext::NewL(iPhone, this, aNewName);
+			CleanupStack::PushL(newContext);
+
+			if(newContext->Open()==KErrNone)
+				{
+				iNifWrappers[iCurrentPrimaryContextIndex].AddContext(newContext);
+				iSecondaryContextNameInc++;	// keep a global count of number of secondary contexts
+				}
+			}
+		iContextCount++;
+
+		// Check for a pending line state notification.
+		if(iNotifyContextAdded.iNotifyPending)
+			{
+			iNotifyContextAdded.iNotifyPending=EFalse;
+			*(TName*)iNotifyContextAdded.iNotifyData=newContext->ContextName();
+			ReqCompleted(iNotifyContextAdded.iNotifyHandle,KErrNone);
+			}
+
+		// ie assume false until PrepareOpenSecondary() is called again
+		iSecondaryContext = EFalse;
+		CleanupStack::Pop(newContext);
+		return newContext;
+		}
+	}
+
+CTelObject::TReqMode CSimPacketService::ReqModeL(const TInt aIpc)
+/**
+* ReqModeL is called from the server's CTelObject::ReqAnalyserL
+* in order to check the type of request it has.
+* 
+* 
+* @param aIpc the ipc number that identifies the client request
+* @return CTelObject::TReqMode The request mode to be used for this request
+* @leave Leaves if not supported by this tsy
+*/	
+	{
+	CTelObject::TReqMode ret=0;
+	switch (aIpc)
+		{
+		case EPacketAttach:
+		case EPacketDetach:
+		case EPacketRejectActivationRequest:
+		case EPacketSetMSClass:
+		case EPacketSetAttachMode:
+		case EPacketSetDefaultContextParams:
+		case EPacketGetStatus:
+		case EPacketGetContextInfo:
+		case EPacketGetNtwkRegStatus:
+		case EPacketGetMSClass:
+		case EPacketGetStaticCaps:
+		case EPacketGetDynamicCaps:
+		case EPacketGetAttachMode:
+		case EPacketGetDefaultContextParams:
+		case EPacketEnumerateContexts:
+		case EPacketGetCurrentReleaseMode:
+		case EPacketEnumerateNifs:
+		case EPacketGetNifInfo:
+		case EPacketEnumerateContextsInNif:
+		case EPacketGetContextNameInNif:
+		case EPacketPrepareOpenSecondary:
+		case EPacketGetMbmsNetworkServiceStatus:
+		case EPacketUpdateMbmsMonitorServiceList:
+		case EPacketGetMbmsMonitoredServicesPhase1:
+		case EPacketGetMbmsMonitoredServicesPhase2:
+		case EPacketEnumerateMbmsMonitorServiceList:
+		case EPacketEnumerateMbmsActiveServiceList:
+			break;
+
+		case EPacketNotifyContextAdded:
+		case EPacketNotifyStatusChange:
+		case EPacketNotifyContextActivationRequested:
+		case EPacketNotifyChangeOfNtwkRegStatus:
+		case EPacketNotifyMSClassChange:
+		case EPacketNotifyDynamicCapsChange:
+		case EPacketNotifyReleaseModeChange:
+		case EPacketNotifyAttachModeChange:
+		case EPacketNotifyMbmsNetworkServiceStatusChange:
+		case EPacketNotifyMbmsServiceAvailabilityChange:
+			ret=KReqModeMultipleCompletionEnabled | KReqModeRePostImmediately;
+			break;
+
+		default:
+			User::Leave(KErrNotSupported);
+			break;
+		}
+	return ret;
+	}
+
+RHandleBase* CSimPacketService::GlobalKernelObjectHandle()
+/**
+* Implements CSubSessionExtBase virtual method, which provides
+* handle of the mutex object to etel server that passes it up to clients.
+* @return pointer to synchronisation mutex object
+*/
+	{
+		return &iMutex;
+	}
+
+TInt CSimPacketService::RegisterNotification(const TInt aIpc)
+/**
+* RegisterNotification is called when the server recognises that this notification
+* is being posted for the first time on this sub-session object.
+* 
+* It enables the TSY to "turn on" any regular notification messages that it may receive 
+* from the phone
+*
+* @param aIpc the ipc number that identifies the client request
+* @return err KErrNone if fine
+*/
+	{
+	switch (aIpc)
+		{
+		case EPacketNotifyContextAdded:
+		case EPacketNotifyStatusChange:
+		case EPacketNotifyContextActivationRequested:
+		case EPacketNotifyChangeOfNtwkRegStatus:
+		case EPacketNotifyMSClassChange:
+		case EPacketNotifyDynamicCapsChange:
+		case EPacketNotifyReleaseModeChange:
+		case EPacketNotifyAttachModeChange:
+		case EPacketNotifyMbmsNetworkServiceStatusChange:
+		case EPacketNotifyMbmsServiceAvailabilityChange:
+			LOGPACKET1("CSimPacketService: RegisterNotification");
+			return KErrNone;
+		default:
+			// Unknown or invalid IPC
+			LOGPACKET1("CSimPacketService: Register error, unknown IPC");
+			return KErrNotSupported;
+		}
+	}
+
+TInt CSimPacketService::DeregisterNotification(const TInt aIpc)
+/**
+* DeregisterNotification is called when the server recognises that this notification
+* will not be posted again because the last client to have a handle on this sub-session
+* object has just closed the handle.
+*
+* It enables the TSY to "turn off" any regular notification messages that it may 
+* receive from the phone
+*
+* @param aIpc the ipc number that identifies the client request
+* @return err KErrNone if fine
+*/
+	{
+	switch (aIpc)
+		{
+		case EPacketNotifyContextAdded:
+		case EPacketNotifyStatusChange:
+		case EPacketNotifyContextActivationRequested:
+		case EPacketNotifyChangeOfNtwkRegStatus:
+		case EPacketNotifyMSClassChange:
+		case EPacketNotifyDynamicCapsChange:
+		case EPacketNotifyReleaseModeChange:
+		case EPacketNotifyAttachModeChange:
+		case EPacketNotifyMbmsNetworkServiceStatusChange:
+		case EPacketNotifyMbmsServiceAvailabilityChange:
+			LOGPACKET1("CSimPacketService: DeregisterNotification");
+			return KErrNone;
+		default:
+			// Unknown or invalid IPC
+			LOGPACKET1("CSimPacketService: Deregister error, unknown IPC");
+			return KErrNotSupported;
+		}
+	}
+
+TInt CSimPacketService::NumberOfSlotsL(const TInt aIpc)
+/**
+* NumberOfSlotsL is called by the server when it is registering a new notification
+* It enables the TSY to tell the server how many buffer slots to allocate for
+* "repost immediately" notifications that may trigger before clients collect them
+*
+* @param aIpc the ipc number that identifies the client request
+* @return err KErrNone if fine
+*/
+	{
+	TInt numberOfSlots=1;
+	switch (aIpc)
+		{
+		case EPacketNotifyStatusChange:
+		case EPacketNotifyDynamicCapsChange:
+		case EPacketNotifyMbmsNetworkServiceStatusChange:
+			LOGPACKET1("CSimPacketService: Registered with 10 slots");
+			numberOfSlots=10;
+			break;
+		case EPacketNotifyContextAdded:
+		case EPacketNotifyContextActivationRequested:
+		case EPacketNotifyChangeOfNtwkRegStatus:
+		case EPacketNotifyMSClassChange:
+		case EPacketNotifyReleaseModeChange:
+		case EPacketNotifyAttachModeChange:
+		case EPacketNotifyMbmsServiceAvailabilityChange:
+			LOGPACKET1("CSimPacketService: Registered with 2 slots");
+			numberOfSlots=2;
+			break;
+		default:
+			// Unknown or invalid IPC
+			LOGPACKET1("CSimPacketService: Number of Slots error, unknown IPC");
+			User::Leave(KErrNotSupported);
+			break;
+		}  
+	return numberOfSlots;
+	}
+
+
+TInt CSimPacketService::ExtFunc(const TTsyReqHandle aTsyReqHandle,const TInt aIpc,
+							  const TDataPackage& aPackage)
+/**
+* ExtFunc is called by the server when it has a "extended", i.e. non-core ETel request
+* for the TSY to process.
+* A request handle, request type and request data are passed to the TSY
+* 
+* @param aTsyReqHandle  The request handle for completing the request 
+* @param aIpc Ipc representing the request
+* @param aPackage any data associated with the request
+* @return err KErrNone if request completes ok
+*/
+	{
+	TAny* dataPtr=aPackage.Ptr1();
+	TAny* dataPtr2=aPackage.Ptr2();
+
+	switch (aIpc)
+		{
+		case EPacketNotifyContextAdded:
+			return NotifyContextAdded(aTsyReqHandle, aPackage.Des1u());
+		case EPacketGetStatus:
+			return GetStatus(aTsyReqHandle,
+					REINTERPRET_CAST(RPacketService::TStatus*, dataPtr));
+		case EPacketNotifyStatusChange:
+			return NotifyStatusChange(aTsyReqHandle,
+					REINTERPRET_CAST(RPacketService::TStatus*, dataPtr));
+		case EPacketNotifyContextActivationRequested:
+			return NotifyContextActivationRequested(aTsyReqHandle, 
+					aPackage.Des1n());
+		case EPacketEnumerateContexts:
+			return EnumerateContexts(aTsyReqHandle,
+					REINTERPRET_CAST(TInt*, dataPtr),
+					REINTERPRET_CAST(TInt*, dataPtr2));
+		case EPacketGetContextInfo:
+			return GetContextInfo(aTsyReqHandle,
+					REINTERPRET_CAST(TInt*, dataPtr),
+					REINTERPRET_CAST(RPacketService::TContextInfo*, dataPtr2));
+		case EPacketGetNtwkRegStatus:
+			return GetNtwkRegStatus(aTsyReqHandle,
+					REINTERPRET_CAST(RPacketService::TRegistrationStatus*, dataPtr));
+		case EPacketNotifyChangeOfNtwkRegStatus:
+			return NotifyChangeOfNtwkRegStatus(aTsyReqHandle,
+					REINTERPRET_CAST(RPacketService::TRegistrationStatus*, dataPtr));
+		case EPacketGetMSClass:
+			return GetMSClass(aTsyReqHandle,
+					REINTERPRET_CAST(RPacketService::TMSClass*, dataPtr),
+					REINTERPRET_CAST(RPacketService::TMSClass*, dataPtr2));
+		case EPacketSetMSClass:
+			return SetMSClass(aTsyReqHandle,
+					REINTERPRET_CAST(RPacketService::TMSClass*, dataPtr));
+		case EPacketNotifyMSClassChange:
+			return NotifyMSClassChange(aTsyReqHandle,
+					REINTERPRET_CAST(RPacketService::TMSClass*, dataPtr));
+		case EPacketGetStaticCaps:
+			return GetStaticCaps(aTsyReqHandle, 
+					REINTERPRET_CAST(TUint*, dataPtr),
+					REINTERPRET_CAST(RPacketContext::TProtocolType*, dataPtr2));
+		case EPacketGetDynamicCaps:
+			return GetDynamicCaps(aTsyReqHandle,
+					REINTERPRET_CAST(RPacketService::TDynamicCapsFlags*, dataPtr));
+		case EPacketNotifyDynamicCapsChange:
+			return NotifyDynamicCapsChange(aTsyReqHandle,
+					REINTERPRET_CAST(RPacketService::TDynamicCapsFlags*, dataPtr));
+		case EPacketSetAttachMode:
+			return SetAttachMode(aTsyReqHandle,
+					REINTERPRET_CAST(RPacketService::TAttachMode*, dataPtr));
+		case EPacketGetAttachMode:
+			return GetAttachMode(aTsyReqHandle,
+					REINTERPRET_CAST(RPacketService::TAttachMode*, dataPtr));
+		case EPacketNotifyAttachModeChange:
+			return NotifyAttachModeChange(aTsyReqHandle,
+					REINTERPRET_CAST(RPacketService::TAttachMode*, dataPtr));
+		case EPacketAttach:
+			return Attach(aTsyReqHandle);
+		case EPacketDetach:
+			return Detach(aTsyReqHandle);
+		case EPacketRejectActivationRequest:
+			return RejectActivationRequest(aTsyReqHandle);
+		case EPacketSetDefaultContextParams:
+			return SetDefaultContextParams(aTsyReqHandle, aPackage.Des1n());
+		case EPacketGetDefaultContextParams:
+			return GetDefaultContextParams(aTsyReqHandle, aPackage.Des1n());
+		case EPacketGetCurrentReleaseMode:
+			return GetCurrentReleaseMode(aTsyReqHandle, REINTERPRET_CAST(RPacketService::TPacketReleaseMode*, dataPtr));
+		case EPacketNotifyReleaseModeChange:
+			return NotifyReleaseModeChange(aTsyReqHandle,
+					REINTERPRET_CAST(RPacketService::TPacketReleaseMode*, dataPtr));
+		case EPacketEnumerateNifs:
+			return EnumerateNifs(aTsyReqHandle, *(REINTERPRET_CAST(TInt*, dataPtr)));
+		case EPacketGetNifInfo:
+			return GetNifInfo(aTsyReqHandle, *REINTERPRET_CAST(TInt*, dataPtr), aPackage.Des2n());
+		case EPacketEnumerateContextsInNif:
+			return EnumerateContextsInNif(aTsyReqHandle, aPackage.Des2u(), *REINTERPRET_CAST(TInt*, dataPtr));			
+		case EPacketGetContextNameInNif:
+			return GetContextNameInNif(aTsyReqHandle, aPackage.Des2u(), *REINTERPRET_CAST(TInt*, dataPtr), aPackage.Des2u());
+		case EPacketPrepareOpenSecondary:
+			//return PrepareOpenSecondary(aTsyReqHandle, *REINTERPRET_CAST(TDesC*, dataPtr));
+			return PrepareOpenSecondary(aTsyReqHandle, aPackage.Des1u());
+		case EPacketGetNifInfoCancel:
+			return GetNifInfoCancel(aTsyReqHandle);
+		case EPacketGetMbmsNetworkServiceStatus:
+			return GetMbmsNetworkServiceStatus(aTsyReqHandle, reinterpret_cast<TBool> (dataPtr),
+					reinterpret_cast<TMbmsNetworkServiceStatus*> (dataPtr2));
+		case EPacketNotifyMbmsNetworkServiceStatusChange:
+			return NotifyMbmsNetworkServiceStatusChange(aTsyReqHandle,
+					reinterpret_cast<TMbmsNetworkServiceStatus*>(dataPtr));
+		case EPacketNotifyMbmsServiceAvailabilityChange:
+			return NotifyMbmsServiceAvailabilityChange(aTsyReqHandle);
+		case EPacketUpdateMbmsMonitorServiceList:
+			TInt retValue;
+			TInt err;
+			if(dataPtr2)
+				{
+				TRAP(err, retValue = UpdateMbmsMonitorServiceListL(aTsyReqHandle,
+					reinterpret_cast<TMbmsAction*>(dataPtr),aPackage.Des2n()));
+				}
+			else
+				{
+				TRAP(err, retValue = UpdateMbmsMonitorServiceListL(aTsyReqHandle,
+					reinterpret_cast<TMbmsAction*>(dataPtr)));
+				}
+			if(err != KErrNone)
+				{
+				retValue = err;
+				}
+			return retValue;
+		case EPacketGetMbmsMonitoredServicesPhase1:
+			return GetMbmsMonitoredServicesListPhase1(aTsyReqHandle, 
+					reinterpret_cast<TClientId*>(dataPtr), 
+					reinterpret_cast<TInt*>(dataPtr2));
+		case EPacketGetMbmsMonitoredServicesPhase2:
+			return GetMbmsMonitoredServicesListPhase2(aTsyReqHandle, 
+					reinterpret_cast<TClientId*>(dataPtr), aPackage.Des2n());	
+		case EPacketEnumerateMbmsMonitorServiceList:
+			return EnumerateMbmsMonitorServiceList(aTsyReqHandle,
+					reinterpret_cast<TInt*>(dataPtr),
+					reinterpret_cast<TInt*>(dataPtr2));
+		case EPacketEnumerateMbmsActiveServiceList:
+			return EnumerateMbmsActiveServiceList(aTsyReqHandle,
+					reinterpret_cast<TInt*>(dataPtr),
+					reinterpret_cast<TInt*>(dataPtr2));
+		default:
+			return KErrNotSupported;
+		}
+	}
+
+TInt CSimPacketService::CancelService(const TInt aIpc,const TTsyReqHandle aTsyReqHandle)
+/**
+* CancelService is called by the server when it is "cleaning-up" any still outstanding
+* asynchronous requests before closing a client's sub-session.
+* This will happen if a client closes its R-class handle without cancelling outstanding asynchronous requests.
+* 
+*  This function will be called when a client explicitly cancels
+*
+* @param aTsyReqHandle  The request handle for completing the request 
+* @param aIpc Ipc representing the request
+* @return err KErrNone if request completes ok
+*/
+	{
+	LOGPACKET1("CSimPacketService: - CancelService called");
+	switch (aIpc)
+		{
+		case EPacketNotifyContextAdded:
+			return NotifyContextAddedCancel(aTsyReqHandle);
+		case EPacketAttach:
+			return AttachCancel(aTsyReqHandle);
+		case EPacketDetach:
+			return DetachCancel(aTsyReqHandle);
+		case EPacketNotifyStatusChange:
+			return NotifyStatusChangeCancel(aTsyReqHandle);
+		case EPacketNotifyContextActivationRequested:
+			return NotifyContextActivationRequestedCancel(aTsyReqHandle);
+		case EPacketRejectActivationRequest:
+			return RejectActivationRequestCancel(aTsyReqHandle);
+		case EPacketGetContextInfo:
+			return GetContextInfoCancel(aTsyReqHandle);
+		case EPacketNotifyChangeOfNtwkRegStatus:
+			return NotifyChangeOfNtwkRegStatusCancel(aTsyReqHandle);
+		case EPacketGetMSClass:
+			return GetMSClassCancel(aTsyReqHandle);
+		case EPacketSetMSClass:
+			return SetMSClassCancel(aTsyReqHandle);
+		case EPacketNotifyMSClassChange:
+			return NotifyMSClassChangeCancel(aTsyReqHandle);
+		case EPacketNotifyDynamicCapsChange:
+			return NotifyDynamicCapsChangeCancel(aTsyReqHandle);
+		case EPacketEnumerateContextsCancel:
+			return EnumerateContextsCancel(aTsyReqHandle);
+		case EPacketGetCurrentReleaseMode:
+			return GetCurrentReleaseModeCancel(aTsyReqHandle);
+		case EPacketNotifyReleaseModeChange:
+			return NotifyReleaseModeChangeCancel(aTsyReqHandle);
+		case EPacketEnumerateNifs:
+			return EnumerateNifsCancel(aTsyReqHandle);
+		case EPacketGetNifInfo:
+			return GetNifInfoCancel(aTsyReqHandle);
+		case EPacketEnumerateContextsInNif:	
+			return EnumerateContextsInNifCancel(aTsyReqHandle);
+		case EPacketGetContextNameInNif:
+			return GetContextNameInNifCancel(aTsyReqHandle);
+		case EPacketNotifyAttachModeChange:
+			return NotifyAttachModeChangeCancel(aTsyReqHandle);
+		case EPacketGetMbmsNetworkServiceStatus:
+			return GetMbmsNetworkServiceStatusCancel(aTsyReqHandle);
+		case EPacketNotifyMbmsNetworkServiceStatusChange:
+			return NotifyMbmsNetworkServiceStatusChangeCancel(aTsyReqHandle);
+		case EPacketNotifyMbmsServiceAvailabilityChange:
+			return NotifyMbmsServiceAvailabilityChangeCancel(aTsyReqHandle);
+		case EPacketUpdateMbmsMonitorServiceList:
+			return UpdateMbmsMonitorServiceListCancel(aTsyReqHandle);
+		case EPacketGetMbmsMonitoredServicesPhase1:
+		case EPacketGetMbmsMonitoredServicesPhase2:
+			return GetMbmsMonitoredServicesListCancel(aTsyReqHandle);
+		case EPacketEnumerateMbmsMonitorServiceList:
+			return EnumerateMbmsMonitorServiceListCancel(aTsyReqHandle);
+		case EPacketEnumerateMbmsActiveServiceList:
+			return EnumerateMbmsActiveServiceListCancel(aTsyReqHandle);
+
+		default:
+			return KErrGeneral; 
+		} 
+	}
+
+TInt CSimPacketService::NotifyContextAdded(const TTsyReqHandle aTsyReqHandle, TDes* aContextId)
+/**
+* Record a client's interest in being notified when a new context is added to the network.
+* First check that there isn't already a notification pending (the ETel Server should protect
+* against this) and then record the information necessary to complete the request later, when
+* the status does actually change.
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @param aContextId pointer to the packet context data
+* @return KErrNone
+*/
+	{
+	__ASSERT_ALWAYS(!iNotifyContextAdded.iNotifyPending,SimPanic(ENotificationAlreadyPending));
+
+	iNotifyContextAdded.iNotifyPending = ETrue;
+	iNotifyContextAdded.iNotifyHandle = aTsyReqHandle;
+	iNotifyContextAdded.iNotifyData = aContextId;
+	return KErrNone;
+	}
+
+TInt CSimPacketService::NotifyContextAddedCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+* Cancel a client's interest in being notified when a new context is added.
+* This is acheived simply by resetting the flag that indicates a notification is pending.
+* 
+* @param aTsyReqHandle Tsy Request handle for the client cancel request
+* @return KErrNone
+*/
+	{
+	LOGPACKET1("CSimPacketService::NotifyContextAddedCancel called");
+	if(iNotifyContextAdded.iNotifyPending)
+		{
+		iNotifyContextAdded.iNotifyPending=EFalse;
+		ReqCompleted(aTsyReqHandle,KErrCancel);
+		}
+	return KErrNone;
+	}
+
+TInt CSimPacketService::Attach(const TTsyReqHandle aTsyReqHandle)
+/**
+* Client calls this method to attach to the service network.
+* In this TSY, the request is registered then the state machine (ActionEvent) is called
+* to handle the request making sure that the class state is updated and the phone is informed.
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @return TInt KErrnone if request completes ok
+*/
+	{
+	LOGPACKET1("CSimPacketService::Attach called");
+	iAttachRequestHandle=aTsyReqHandle;
+	return ActionEvent(EPacketEventAttach);
+	}
+
+TInt CSimPacketService::AttachCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+* Cancels a clients interest in attaching to a network.
+* this can only be achieved if we're not already attached otherwise the request is ignored.
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @return TInt KErrnone if request completes ok
+*/
+	{
+	LOGPACKET1("CSimPacketService::AttachCancel called");
+	if((iState == RPacketService::EStatusUnattached) && (iCurrentEvent==EPacketEventAttach))
+		{
+		iTimer->Cancel();
+		iCurrentEvent= EPacketEventNone;
+		ReqCompleted(aTsyReqHandle,KErrCancel);
+		}
+	return KErrNone;
+	}
+
+/***
+* This function will detach the packet service and all its contexts from the network
+***/
+TInt CSimPacketService::DoDetach()
+	{
+	TInt ret=KErrNone;
+
+	switch(iState)
+		{
+		case RPacketService::EStatusUnattached:
+			break;
+
+		case RPacketService::EStatusAttached:
+			ret=ChangeState(RPacketService::EStatusUnattached);
+			ReqCompleted(iDetachRequestHandle,ret);
+			break;
+
+		case RPacketService::EStatusActive:
+		case RPacketService::EStatusSuspended:
+			{
+			TInt totalWrappers = iNifWrappers.Count();
+				
+			// deactivate all contexts in every nif
+			for(TInt j=0; j < totalWrappers; j++)
+				{
+				TInt totalContexts = iNifWrappers[j].NumberOfContexts();
+				for(TInt x =0; x<totalContexts; x++)
+					{
+					ret = iNifWrappers[j].GetContext(x)->AttemptDeactivateImmediately();
+					if(ret!=KErrNone)
+						{
+						break;
+						}
+					}
+				}
+	
+			if(ret==KErrNone)
+				{
+					ret=ChangeState(RPacketService::EStatusUnattached);
+				}
+				ReqCompleted(iDetachRequestHandle,ret);
+			}
+			break;
+		default:
+			break;
+		}
+	return ret;
+	}
+TInt CSimPacketService::Detach(const TTsyReqHandle aTsyReqHandle)
+/**
+* Client calls this method to detach from the service network.
+* In this TSY, the request is registered then the state machine (ActionEvent) is called
+* to handle the request making sure that the class state is updated and the phone is informed.
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @return TInt KErrnone if request completes ok
+*/
+	{
+	LOGPACKET1("CSimPacketService::Detach called");
+	iDetachRequestHandle=aTsyReqHandle;
+	return ActionEvent(EPacketEventDetach);
+	}
+
+TInt CSimPacketService::DetachCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+* Cancels a clients interest in detaching from the network.
+* this can only be achieved if we're not already attached and in the process of detaching
+* but not detached yet otherwise the request is ignored.
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @return TInt KErrnone if request completes ok
+*/
+	{
+	LOGPACKET1("CSimPacketService::DetachCancel called");
+	if((iState == RPacketService::EStatusAttached) && (iCurrentEvent==EPacketEventDetach))
+			{
+			iTimer->Cancel();
+			iCurrentEvent= EPacketEventNone;
+			ReqCompleted(aTsyReqHandle,KErrCancel);
+			}
+	return KErrNone;
+	}
+
+TInt CSimPacketService::GetStatus(const TTsyReqHandle aTsyReqHandle, RPacketService::TStatus* aStatus)
+/**
+* Retrieves and returns the status of the Packet service
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @param aStatus pointer to the status
+* @return TInt err KErrNone if ok
+*/
+	{
+	LOGPACKET1("CSimPacketService::GetStatus called");
+	*aStatus = iState;
+	ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CSimPacketService::NotifyStatusChange(const TTsyReqHandle aTsyReqHandle, RPacketService::TStatus* aStatus)
+/**
+* Record a client's interest in being notified of the state of the packet network and contexts.
+* First check that there isn't already a notification pending (the ETel Server should protect
+* against this) and then record the information necessary to complete the request later, when
+* the status does actually change.
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @param aStatus pointer to the packet service status
+* @return KErrNone
+*/
+	{
+ 	__ASSERT_ALWAYS(!iNotifyStatusChange.iNotifyPending,SimPanic(ENotificationAlreadyPending));
+
+	iNotifyStatusChange.iNotifyPending = ETrue;
+	iNotifyStatusChange.iNotifyHandle = aTsyReqHandle;
+	iNotifyStatusChange.iNotifyData = aStatus;
+	return KErrNone;
+	}
+
+TInt CSimPacketService::NotifyStatusChangeCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+* Cancel a client's interest in being notified when the call status changes.
+* This is acheived simply by resetting the flag that indicates a notification is pending.
+* 
+* @param aTsyReqHandle Tsy Request handle for the client cancel request
+* @return KErrNone
+*/
+	{
+	LOGPACKET1("CSimPacketService::NotifyStatusChangeCancel called");
+	if(iNotifyStatusChange.iNotifyPending)
+		{
+		iNotifyStatusChange.iNotifyPending=EFalse;
+		ReqCompleted(aTsyReqHandle,KErrCancel);
+		}
+	return KErrNone;
+	}
+
+
+
+TInt CSimPacketService::NotifyContextActivationRequested(const TTsyReqHandle aTsyReqHandle, TDes8* aContextParameters)
+/**
+* Record a client's interest in being notified when a context is activated.
+* First check that there isn't already a notification pending (the ETel Server should protect
+* against this) and then record the information necessary to complete the request later, when
+* the status does actually change.
+*
+* Hurricane does not support this method
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @param aStatus pointer to the packet service status
+* @return KErrNone
+*/
+	{
+	LOGPACKET1("CSimPacketService::NotifyContextActivationRequested called");
+	
+	iConfigData.iTsyReqHandle = aTsyReqHandle;
+	iConfigData.iData = aContextParameters;
+
+	if ( iIncomingContextManager->IsUseTimerOn() )
+		{ // Timer use is on, so we can use it.	
+		// 1st time by the reguest for notifictaion, 
+		// 2nd time when do ReqCompleted(aTsyReqHandle,KErrCancel);
+		    
+		iIncomingContextManager->StartFirstIncomingEvent();
+			// When timer is done we have completed the request to activate a PDP.
+		iIncomingContextManager->SetUseTimerOff();
+		}
+		
+	return KErrNone;
+	}
+
+TInt CSimPacketService::NotifyContextActivationRequestedCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+* Cancel a client's interest in being notified when a context is activated.
+* This is acheived simply by resetting the flag that indicates a notification is pending.
+* 
+* @param aTsyReqHandle Tsy Request handle for the client cancel request
+* @return KErrNone
+*/
+	{
+	LOGPACKET1("CSimPacketService::NotifyContextActivationRequestedCancel called");
+
+	iIncomingContextManager->Cancel();	
+	iIncomingContextManager->SetUseTimerOff();	
+	
+	ReqCompleted(aTsyReqHandle, KErrNone);
+	return KErrNone;
+	}
+
+TInt CSimPacketService::RejectActivationRequest(const TTsyReqHandle aTsyReqHandle)
+/**
+* This method is called when a client wishes to reject an Activation request from the network
+* This is currently not supported in this version of the simulator tsy.
+*
+* Hurricane does not support this method
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @return KErrNone
+*/
+	{
+	ReqCompleted(aTsyReqHandle, KErrNotSupported);
+	return KErrNone;
+	}
+
+TInt CSimPacketService::RejectActivationRequestCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+* This method cancels a clients' request  in rejecting an activation request.
+* The TSY is not supporting this method
+*
+* @param aTsyReqHandle Tsy Request handle for the client cancel request
+* @return KErrNone
+*/
+	{
+	ReqCompleted(aTsyReqHandle, KErrCancel);
+	return KErrNone;
+	}
+
+TInt CSimPacketService::EnumerateContexts(const TTsyReqHandle aTsyReqHandle, TInt* aCount, TInt* aMaxAllowed)
+/**
+* Returns the number of contexts opened on the packet service
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @param aCount pointer to the number of contexts opened.
+* @param aMaxAllowed pointer to the maximum number of contexts that can be opened on the packet service
+* @return KErrNone
+*/
+	{
+	LOGPACKET1("CSimPacketService::EnumerateContexts called");
+	// this should enumerate all primary and secondary contexts
+	*aCount = iPrimaryContextNameInc + iSecondaryContextNameInc;
+	*aMaxAllowed = KMaxContextPoolSize;
+	ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+	
+TInt CSimPacketService::EnumerateContextsCancel(const TTsyReqHandle /*aTsyReqHandle*/)
+/**
+* This method cancels a clients' request in Enmerationg the contexts
+* This does nothing as Enumerate context is processed synchronously
+* 
+* @param aTsyReqHandle Tsy Request handle for the client cancel request
+* @return KErrNone
+*/
+	{
+	LOGPACKET1("CSimPacketService::Enumerate Context Cancel called");
+	return KErrNone;
+	}
+
+TInt CSimPacketService::GetContextInfo(const TTsyReqHandle aTsyReqHandle, TInt* aIndex,RPacketService::TContextInfo* aInfo)
+/**
+* Retrieves a specific context info specified by the index variable
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @param aIndex pointer to the index of the context the info is requested from
+* @param aInfo pointer to the context info. 
+* @return KErrNone if context is found in the list of contexts 
+*/
+	{
+	LOGPACKET1("CSimPacketService::GetContextInfo called");
+	CSimPacketContext*  packetContext;
+
+	if((*aIndex >= iContextCount) || (*aIndex < 0))
+		ReqCompleted(aTsyReqHandle,KErrArgument);
+	else {
+		// this method is used in conjunction with EnumerateContexts() which for Jetstream
+		// now returns the number of all contexts - not just the number of primary contexts as
+		// was done in Hurricane. To that end, the index passed as a parameter needs to be translated
+		// to take into account the nifwrappers array's contexts.
+		TInt realIndex=*aIndex;
+		TInt i;
+		TInt wrappersCount = iNifWrappers.Count();
+		for(i = 0; i<wrappersCount; i++)
+			{
+			if(iNifWrappers[i].NumberOfContexts() <= realIndex)
+				{
+				realIndex-=iNifWrappers[i].NumberOfContexts();
+				continue;
+				}
+			else
+				{
+				break;
+				}
+			}
+		packetContext = iNifWrappers[i].GetContext(realIndex);
+		aInfo->iName.Copy(packetContext->ContextName());
+		aInfo->iStatus = packetContext->ContextStatus();
+		ReqCompleted(aTsyReqHandle,KErrNone);
+		}
+	return KErrNone;
+	}
+
+TInt CSimPacketService::GetContextInfoCancel(const TTsyReqHandle /*aTsyReqHandle*/) 
+/**
+* Cancels a clients request for a context info
+*
+* @param aTsyReqHandle Tsy Request handle for the client cancel request
+* @return KErrNone
+*/
+	{
+	return KErrNone;
+	}
+
+TInt CSimPacketService::GetNtwkRegStatus(const TTsyReqHandle aTsyReqHandle, RPacketService::TRegistrationStatus* aRegistrationStatus)
+/**
+* Returns the Network registration status to the client.
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @param aRegistrationStatus pointer to the registration status info requested
+* @return KErrNone 
+*/
+	{
+	LOGPACKET1("CSimPacketService::GetNtwkRegStatus called");
+	*aRegistrationStatus = (RPacketService::TRegistrationStatus)iCurrentRegStatus;
+	ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CSimPacketService::NotifyChangeOfNtwkRegStatus(const TTsyReqHandle aTsyReqHandle, RPacketService::TRegistrationStatus* aRegistrationStatus)
+/**
+* Record a client's interest in being notified of a change in the Nk registration status.
+* First check that there isn't already a notification pending (the ETel Server should protect
+* against this) and then record the information necessary to complete the request later, when
+* the status does actually change.
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @param aRegistrationStatus pointer to the Network registration status
+* @return KErrNone
+*/
+	{
+	if(iNtwkRegStatusInfo->Count()==0)
+		{
+		ReqCompleted(aTsyReqHandle,KErrNotSupported);
+		return KErrNone;
+		}
+
+	__ASSERT_ALWAYS(!iNotifyChangeOfNtwk.iNotifyPending,SimPanic(ENotificationReqAlreadyOutstanding));
+	iNotifyChangeOfNtwk.iNotifyPending=ETrue;
+	iNotifyChangeOfNtwk.iNotifyHandle=aTsyReqHandle;
+	iNotifyChangeOfNtwk.iNotifyData=aRegistrationStatus;
+	return KErrNone;
+	}
+
+TInt CSimPacketService::NotifyChangeOfNtwkRegStatusCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+* Cancel a client's interest in being notified of a change in the Nk registration status.
+* This is acheived simply by resetting the flag that indicates a notification is pending.
+* 
+* @param aTsyReqHandle Tsy Request handle for the client cancel request
+* @return KErrNone
+*/
+	{
+	LOGPACKET1("CSimPacketService::NotifyChangeOfNtwkRegStatusCancel called");
+	if(iNotifyChangeOfNtwk.iNotifyPending)
+		{
+		iNotifyChangeOfNtwk.iNotifyPending=EFalse;
+		ReqCompleted(aTsyReqHandle,KErrCancel);
+		}
+	return KErrNone;
+	}
+
+TInt CSimPacketService::GetMSClass(const TTsyReqHandle aTsyReqHandle, RPacketService::TMSClass* aCurrentClass, RPacketService::TMSClass* aMaxClass)
+/**
+* Returns the Current MSClass supported by the TSY.
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @param aCurrentClass pointer to the current MSClass
+* @param aMaxClass the maximum MSClass this TSY can support
+* @return KErrNone 
+*/
+	{
+	//This version of the Simulator TSY will only support CLASS B i.e EMSClassSuspensionRequired
+	*aCurrentClass = iMSClass;
+	*aMaxClass = RPacketService::EMSClassSuspensionRequired;
+	ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CSimPacketService::GetMSClassCancel(const TTsyReqHandle /*aTsyReqHandle*/)
+/**
+* Cancels a clients request in retrieving the current MSClass supported by the TSY.
+*
+* @param aTsyReqHandle Tsy Request handle for the client cancel request
+* @return KErrNone
+*/
+	{
+	return KErrNone;
+	}
+
+TInt CSimPacketService::SetMSClass(const TTsyReqHandle aTsyReqHandle, RPacketService::TMSClass* aClass)
+/**
+* Sets the MSClass for the TSY. This TSY current support Class B only and cannot be reset.
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @param aClass pointer to the MSClass to set the TSY to support
+* @return KErrNone
+*/
+	{
+	if(*aClass != RPacketService::EMSClassSuspensionRequired)
+		ReqCompleted(aTsyReqHandle,KErrNotSupported);
+	else {
+		iMSClass = *aClass;
+		ReqCompleted(aTsyReqHandle,KErrNone);
+		}
+	return KErrNone;
+	}
+
+TInt CSimPacketService::SetMSClassCancel(const TTsyReqHandle /*aTsyReqHandle*/)
+/**
+* Cancels a clients interest in setting the MSClass support for the TSY.
+*
+* @param aTsyReqHandle Tsy Request handle for the client cancel request
+* @return KErrNone
+*/
+	{
+	return KErrNone;
+	}
+
+TInt CSimPacketService::NotifyMSClassChange(const TTsyReqHandle aTsyReqHandle, RPacketService::TMSClass* /*aNewClass*/)
+/**
+* Record a client's interest in being notified of a change of MSClass supported.
+* First check that there isn't already a notification pending (the ETel Server should protect
+* against this) and then record the information necessary to complete the request later, when
+* the status does actually change.
+* 
+* Currently the TSY will only support Class B and thus this method is not supported.
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @param aNewClass pointer to the MSClass to set to
+* @return KErrNone
+*/
+	{
+	ReqCompleted(aTsyReqHandle,KErrNotSupported);
+	return KErrNone;
+	}
+
+TInt CSimPacketService::NotifyMSClassChangeCancel(const TTsyReqHandle /*aTsyReqHandle*/)
+/**
+* Cancel a client's interest in being notified of a change of MSClass supported.
+* This is acheived simply by resetting the flag that indicates a notification is pending.
+* 
+* @param aTsyReqHandle Tsy Request handle for the client cancel request
+* @return KErrNone
+*/
+	{
+	return KErrNone;
+	}
+
+TInt CSimPacketService::GetStaticCaps(const TTsyReqHandle aTsyReqHandle, TUint* aCaps,RPacketContext::TProtocolType* aPdpType)
+/**
+* Returns the Static capabilities supported by the TSY
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @param aCaps pointer to the TSY's capability
+* @param aPdpType protocol type used by the TSY
+* @return KErrNone
+*/
+	{
+	LOGPACKET1("CSimPacketService::GetStaticCaps called");
+	*aCaps = KPacketServiceCaps;
+	*aPdpType = RPacketContext::EPdpTypePPP;
+	ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+/**
+* Returns the Dynamic capabilities supported by the TSY
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @param aCaps Pointer to be populated with the dynamic capabilities of the TSY
+* @return KErrNone
+*/
+TInt CSimPacketService::GetDynamicCaps(const TTsyReqHandle aTsyReqHandle, RPacketService::TDynamicCapsFlags* aCaps)
+	{
+	LOGPACKET1("CSimPacketService::GetDynamicCaps called");
+	
+	if (iDynamicCapsArray->Count() == 0)
+		{
+		ReqCompleted(aTsyReqHandle, KErrNotSupported);
+		return KErrNone;
+		}
+	*aCaps = iCurrentDynamicCaps;
+	ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+/**
+* Registers a client interest of change in the Dynamic capabilities change.
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @param aCaps Pointer to be populated with the dynamic capabilities of the TSY
+* @return KErrNone
+*/
+TInt CSimPacketService::NotifyDynamicCapsChange(const TTsyReqHandle aTsyReqHandle, RPacketService::TDynamicCapsFlags* aCaps)
+	{
+	LOGPACKET1("CSimPacketService::NotifyDynamicCapsChange called");
+	__ASSERT_ALWAYS(!iNotifyDynamicCapsChange.iNotifyPending,SimPanic(ENotificationAlreadyPending));
+ 
+	if (iDynamicCapsArray->Count() == 0)
+		{
+		ReqCompleted(aTsyReqHandle,KErrNotSupported);
+		return KErrNone;
+		}
+	
+	iNotifyDynamicCapsChange.iNotifyPending = ETrue;
+	iNotifyDynamicCapsChange.iNotifyHandle = aTsyReqHandle;
+	iNotifyDynamicCapsChange.iNotifyData = aCaps;
+	return KErrNone;
+	}
+
+/**
+* Cancels a clients interest in the change of dynamic caps.
+*
+* @param aTsyReqHandle Tsy Request handle for the client cancel request
+* @return KErrNone
+*/
+TInt CSimPacketService::NotifyDynamicCapsChangeCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGPACKET1("CSimPacketService::NotifyDynamicCapsChangeCancel called");
+	if( (iNotifyDynamicCapsChange.iNotifyPending) && (aTsyReqHandle == iNotifyDynamicCapsChange.iNotifyHandle))
+		{
+		iNotifyDynamicCapsChange.iNotifyPending=EFalse;
+		ReqCompleted(aTsyReqHandle,KErrCancel);
+		}
+	return KErrNone;
+	}
+
+/**
+* Timer callback function to simulate a change in the dynamic capabilities of the TSY
+*/
+void CSimPacketService::TimerCallBackDynamicCaps()
+	{
+	if (++iDynamicCapsIndex >= iDynamicCapsArray->Count())
+		{
+		return;
+		}
+	iCurrentDynamicCaps = iDynamicCapsArray->At(iDynamicCapsIndex).iDynamicCaps;
+	if (iNotifyDynamicCapsChange.iNotifyPending)
+		{
+		iNotifyDynamicCapsChange.iNotifyPending = EFalse;
+		*(TInt*)iNotifyDynamicCapsChange.iNotifyData = iCurrentDynamicCaps;
+		ReqCompleted(iNotifyDynamicCapsChange.iNotifyHandle,KErrNone);
+		}
+	
+	iDynamicCapsTimer->Start(iDynamicCapsArray->At(iDynamicCapsIndex).iDuration, this, ETimerIdPcktServDynamicCaps);
+	}
+
+TInt CSimPacketService::SetAttachMode(const TTsyReqHandle aTsyReqHandle, RPacketService::TAttachMode* aMode)
+/**
+* Sets the attach mode to be used by the tsy.
+* Currently The TSY supports EAttachWhenNeeded only.
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @param aMode pointer to the mode to change to
+* @return KErrNone 
+*/
+	{
+	LOGPACKET1("CSimPacketService::SetAttachMode called");
+	if(*aMode != RPacketService::EAttachWhenNeeded)
+		{
+		ReqCompleted(aTsyReqHandle, KErrNotSupported);
+		}
+	else 
+		{
+		iAttachMode = *aMode;
+		// Check for a pending attach mode notification.
+		if(iNotifyChangeOfAttachMode.iNotifyPending)
+			{
+			iNotifyChangeOfAttachMode.iNotifyPending=EFalse;
+			*(RPacketService::TAttachMode*)iNotifyChangeOfAttachMode.iNotifyData = iAttachMode;
+			ReqCompleted(iNotifyChangeOfAttachMode.iNotifyHandle,KErrNone);
+			}	
+		ReqCompleted(aTsyReqHandle,KErrNone);
+		}
+	return KErrNone;
+	}
+
+TInt CSimPacketService::GetAttachMode(const TTsyReqHandle aTsyReqHandle, RPacketService::TAttachMode* aMode)
+/**
+* Retrieves and returns the current attach mode for the TSY.
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @param aMode pointer to the mode to change
+* @return KErrNone 
+*/
+	{
+	LOGPACKET1("CSimPacketService::GetAttachMode called");
+	*aMode = iAttachMode;
+	ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+	
+TInt CSimPacketService::NotifyAttachModeChange(const TTsyReqHandle aTsyReqHandle, RPacketService::TAttachMode* aMode)
+/**
+* Set notification request for change of current attach mode
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @param aMode pointer to the mode to change
+* @return KErrNone 
+*/
+	{
+	LOGPACKET1("CSimPacketService::NotifyAttachModeChange called");
+	
+	__ASSERT_ALWAYS(!iNotifyChangeOfAttachMode.iNotifyPending,SimPanic(ENotificationAlreadyPending));
+	
+	iNotifyChangeOfAttachMode.iNotifyPending=ETrue;
+	iNotifyChangeOfAttachMode.iNotifyHandle=aTsyReqHandle;
+	iNotifyChangeOfAttachMode.iNotifyData=aMode;
+		
+	return KErrNone;
+	}
+
+TInt CSimPacketService::SetDefaultContextParams(const TTsyReqHandle aTsyReqHandle, const TDesC8* aPckg)
+/**
+* Sets the Default Context Parameters to be used when attaching and activating a context.
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @param aPckg pointer containing the parameters to set to.
+* @return KErrNone
+*/
+	{
+	LOGPACKET1("CSimPacketService::SetDefaultContextParams called");
+	
+	TPckg<TPacketDataConfigBase>* configBase = (TPckg<TPacketDataConfigBase>*)aPckg;
+	TPacketDataConfigBase& configBaseV1 = (*configBase)();
+
+		
+	// GPRS
+	if(configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigGPRS)
+		{
+		iPhone->UpdateNetworkMode(RMobilePhone::ENetworkModeGsm);
+		TPckg<RPacketContext::TContextConfigGPRS>* defaultContextGPRSPckg = (TPckg<RPacketContext::TContextConfigGPRS>*)aPckg;
+		RPacketContext::TContextConfigGPRS& defaultContextGPRSV1 = (*defaultContextGPRSPckg)();
+
+		TBuf8<RPacketContext::KGSNNameLength> accessPointName;
+		accessPointName.Copy(defaultContextGPRSV1.iAccessPointName);
+
+		TBuf8<RPacketContext::KMaxPDPAddressLength> dpAddress;
+		dpAddress.Copy(defaultContextGPRSV1.iPdpAddress);
+
+		TBuf8<RPacketContext::KMaxAuthDataLength> password;
+		password.Copy(defaultContextGPRSV1.iProtocolConfigOption.iAuthInfo.iPassword);
+
+		TBuf8<RPacketContext::KMaxAuthDataLength> username;
+		username.Copy(defaultContextGPRSV1.iProtocolConfigOption.iAuthInfo.iUsername);
+
+		TBuf8<RPacketContext::KMaxAuthDataLength> challenge;
+		challenge.Copy(defaultContextGPRSV1.iProtocolConfigOption.iChallenge);
+		
+		TBuf8<RPacketContext::KMaxAuthDataLength> response;
+		response.Copy(defaultContextGPRSV1.iProtocolConfigOption.iResponse);
+
+		TBuf8<RPacketContext::KMaxPDPAddressLength> primaryDNS;
+		primaryDNS.Copy(defaultContextGPRSV1.iProtocolConfigOption.iDnsAddresses.iPrimaryDns);
+
+		TBuf8<RPacketContext::KMaxAuthDataLength> secondaryDNS;
+		secondaryDNS.Copy(defaultContextGPRSV1.iProtocolConfigOption.iDnsAddresses.iSecondaryDns);
+
+		TBuf8<RPacketContext::KMiscProtocolBufferLength> miscBuffer;
+		miscBuffer.Copy(defaultContextGPRSV1.iProtocolConfigOption.iMiscBuffer);
+
+		if ((defaultContextGPRSV1.iPdpType != iGPRSDefaultConfig.iProtocolType)||
+			(iGPRSDefaultConfig.iGsnAddress.Compare(accessPointName) != KErrNone) ||
+			(iGPRSDefaultConfig.iProtocolAddress.Compare(dpAddress) != KErrNone) ||
+			(defaultContextGPRSV1.iPdpCompression != iGPRSDefaultConfig.iPdpCompression) ||
+			(defaultContextGPRSV1.iAnonymousAccessReqd != iGPRSDefaultConfig.iAnonymousAccess) ||
+			(defaultContextGPRSV1.iUseEdge != iGPRSDefaultConfig.iUseEdge) ||
+			(defaultContextGPRSV1.iProtocolConfigOption.iAuthInfo.iProtocol != iGPRSDefaultConfig.iProtocolConfigOption.iAuthProtocol) ||
+			((iGPRSDefaultConfig.iProtocolConfigOption.iPassword).Compare(password) != KErrNone) ||
+			((iGPRSDefaultConfig.iProtocolConfigOption.iUsername).Compare(username) != KErrNone) ||
+			((iGPRSDefaultConfig.iProtocolConfigOption.iChallenge).Compare(challenge) != KErrNone) ||
+			((iGPRSDefaultConfig.iProtocolConfigOption.iResponse).Compare(response) != KErrNone) ||
+			((iGPRSDefaultConfig.iProtocolConfigOption.iPrimaryDNS).Compare(primaryDNS) != KErrNone) ||
+			((iGPRSDefaultConfig.iProtocolConfigOption.iSecondaryDNS).Compare(secondaryDNS) != KErrNone) ||
+			(iGPRSDefaultConfig.iProtocolConfigOption.iId != defaultContextGPRSV1.iProtocolConfigOption.iId))
+				ReqCompleted(aTsyReqHandle,KErrArgument);
+		else
+				ReqCompleted(aTsyReqHandle,KErrNone);
+		}
+	// UMTS
+	else if (configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigRel99Rel4)
+		{
+		iPhone->UpdateNetworkMode(RMobilePhone::ENetworkModeGsm);
+		TPckg<RPacketContext::TContextConfigR99_R4>* defaultContextR99_R4Pckg = (TPckg<RPacketContext::TContextConfigR99_R4>*)aPckg;
+		RPacketContext::TContextConfigR99_R4& defaultContextR99_R4V1 = (*defaultContextR99_R4Pckg)();
+
+		TBuf8<RPacketContext::KGSNNameLength> accessPointName;
+		accessPointName.Copy(defaultContextR99_R4V1.iAccessPointName);
+
+		TBuf8<RPacketContext::KMaxPDPAddressLength> dpAddress;
+		dpAddress.Copy(defaultContextR99_R4V1.iPdpAddress);
+
+		TBuf8<RPacketContext::KMaxAuthDataLength> password;
+		password.Copy(defaultContextR99_R4V1.iProtocolConfigOption.iAuthInfo.iPassword);
+
+		TBuf8<RPacketContext::KMaxAuthDataLength> username;
+		username.Copy(defaultContextR99_R4V1.iProtocolConfigOption.iAuthInfo.iUsername);
+
+		TBuf8<RPacketContext::KMaxAuthDataLength> challenge;
+		challenge.Copy(defaultContextR99_R4V1.iProtocolConfigOption.iChallenge);
+		
+		TBuf8<RPacketContext::KMaxAuthDataLength> response;
+		response.Copy(defaultContextR99_R4V1.iProtocolConfigOption.iResponse);
+
+		TBuf8<RPacketContext::KMaxPDPAddressLength> primaryDNS;
+		primaryDNS.Copy(defaultContextR99_R4V1.iProtocolConfigOption.iDnsAddresses.iPrimaryDns);
+
+		TBuf8<RPacketContext::KMaxAuthDataLength> secondaryDNS;
+		secondaryDNS.Copy(defaultContextR99_R4V1.iProtocolConfigOption.iDnsAddresses.iSecondaryDns);
+
+		TBuf8<RPacketContext::KMiscProtocolBufferLength> miscBuffer;
+		miscBuffer.Copy(defaultContextR99_R4V1.iProtocolConfigOption.iMiscBuffer);
+		
+		if ((defaultContextR99_R4V1.iPdpType != iR99_R4DefaultConfig.iProtocolType)||
+				(iR99_R4DefaultConfig.iGsnAddress.Compare(accessPointName) != KErrNone) ||
+				(iR99_R4DefaultConfig.iProtocolAddress.Compare(dpAddress) != KErrNone) ||
+				(defaultContextR99_R4V1.iUseEdge != iR99_R4DefaultConfig.iUseEdge) ||
+			   (defaultContextR99_R4V1.iProtocolConfigOption.iAuthInfo.iProtocol != iR99_R4DefaultConfig.iProtocolConfigOption.iAuthProtocol) ||
+			   ((iR99_R4DefaultConfig.iProtocolConfigOption.iPassword).Compare(password) != KErrNone) ||
+			   ((iR99_R4DefaultConfig.iProtocolConfigOption.iUsername).Compare(username) != KErrNone) ||
+			   ((iR99_R4DefaultConfig.iProtocolConfigOption.iChallenge).Compare(challenge) != KErrNone) ||
+			   ((iR99_R4DefaultConfig.iProtocolConfigOption.iResponse).Compare(response) != KErrNone) ||
+			   ((iR99_R4DefaultConfig.iProtocolConfigOption.iPrimaryDNS).Compare(primaryDNS) != KErrNone) ||
+			   ((iR99_R4DefaultConfig.iProtocolConfigOption.iSecondaryDNS.Compare(secondaryDNS) != KErrNone) ||
+			   (iR99_R4DefaultConfig.iProtocolConfigOption.iId != defaultContextR99_R4V1.iProtocolConfigOption.iId)))
+
+			ReqCompleted(aTsyReqHandle,KErrArgument);
+		else
+			ReqCompleted(aTsyReqHandle,KErrNone);
+		}
+	//R5
+	else if(configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigRel5)
+		{
+		iPhone->UpdateNetworkMode(RMobilePhone::ENetworkModeGsm);
+		TPckg<RPacketContext::TContextConfig_R5>* defaultContext_R5Pckg = (TPckg<RPacketContext::TContextConfig_R5>*)aPckg;
+		RPacketContext::TContextConfig_R5& defaultContextR5 = (*defaultContext_R5Pckg)();
+
+		TBuf8<RPacketContext::KGSNNameLength> accessPointName;
+		accessPointName.Copy(defaultContextR5.iAccessPointName);
+
+		TBuf8<RPacketContext::KMaxPDPAddressLength> dpAddress;
+		dpAddress.Copy(defaultContextR5.iPdpAddress);
+
+		TBuf8<RPacketContext::KMaxAuthDataLength> password;
+		password.Copy(defaultContextR5.iProtocolConfigOption.iAuthInfo.iPassword);
+
+		TBuf8<RPacketContext::KMaxAuthDataLength> username;
+		username.Copy(defaultContextR5.iProtocolConfigOption.iAuthInfo.iUsername);
+
+		TBuf8<RPacketContext::KMaxAuthDataLength> challenge;
+		challenge.Copy(defaultContextR5.iProtocolConfigOption.iChallenge);
+		
+		TBuf8<RPacketContext::KMaxAuthDataLength> response;
+		response.Copy(defaultContextR5.iProtocolConfigOption.iResponse);
+
+		TBuf8<RPacketContext::KMaxPDPAddressLength> primaryDNS;
+		primaryDNS.Copy(defaultContextR5.iProtocolConfigOption.iDnsAddresses.iPrimaryDns);
+
+		TBuf8<RPacketContext::KMaxAuthDataLength> secondaryDNS;
+		secondaryDNS.Copy(defaultContextR5.iProtocolConfigOption.iDnsAddresses.iSecondaryDns);
+
+		TBuf8<RPacketContext::KMiscProtocolBufferLength> miscBuffer;
+		miscBuffer.Copy(defaultContextR5.iProtocolConfigOption.iMiscBuffer);
+
+		if ((defaultContextR5.iPdpType != iR5DefaultConfig.iProtocolType)||
+			(iR5DefaultConfig.iGsnAddress.Compare(accessPointName) != KErrNone) ||
+			(iR5DefaultConfig.iProtocolAddress.Compare(dpAddress) != KErrNone) ||
+			(defaultContextR5.iUseEdge != iR5DefaultConfig.iUseEdge) ||
+			(defaultContextR5.iProtocolConfigOption.iAuthInfo.iProtocol != iR5DefaultConfig.iProtocolConfigOption.iAuthProtocol) ||
+			((iR5DefaultConfig.iProtocolConfigOption.iPassword).Compare(password) != KErrNone) ||
+			((iR5DefaultConfig.iProtocolConfigOption.iUsername).Compare(username) != KErrNone) ||
+			((iR5DefaultConfig.iProtocolConfigOption.iChallenge).Compare(challenge) != KErrNone) ||
+			((iR5DefaultConfig.iProtocolConfigOption.iResponse).Compare(response) != KErrNone) ||
+			((iR5DefaultConfig.iProtocolConfigOption.iPrimaryDNS).Compare(primaryDNS) != KErrNone) ||
+			((iR5DefaultConfig.iProtocolConfigOption.iSecondaryDNS).Compare(secondaryDNS) != KErrNone) ||
+			(iR5DefaultConfig.iProtocolConfigOption.iId != defaultContextR5.iProtocolConfigOption.iId) ||
+			(iR5DefaultConfig.iPdpHeaderCompression != defaultContextR5.iPdpHeaderCompression) ||
+			(iR5DefaultConfig.iPdpDataCompression != defaultContextR5.iPdpDataCompression))
+			{
+			ReqCompleted(aTsyReqHandle,KErrArgument);
+			}
+		else
+			{
+			ReqCompleted(aTsyReqHandle,KErrNone);
+			}
+		}
+	else 
+		{
+		iPhone->UpdateNetworkMode(RMobilePhone::ENetworkModeUnknown);
+		}
+	return KErrNone;
+	}
+
+
+TInt CSimPacketService::GetGPRSDefaultContextParams(const TTsyReqHandle aTsyReqHandle, TDes8* aPckg)
+/**
+* Returns the Default Context Parameters set by the client.
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @param aPckg pointer containing the parameters to return to client.
+* @return KErrNone
+*/
+	{
+	LOGPACKET1("CSimPacketService::GetDefaultContextParams called");
+
+	TPckg<RPacketContext::TContextConfigGPRS>* contextConfigGPRSPckg = (TPckg<RPacketContext::TContextConfigGPRS>*)aPckg;
+	RPacketContext::TContextConfigGPRS& contextConfigV1 = (*contextConfigGPRSPckg)();
+
+	contextConfigV1.iAccessPointName.Copy(KApn);
+	contextConfigV1.iAnonymousAccessReqd = RPacketContext::ERequired;
+	contextConfigV1.iPdpAddress.Copy(KProtocolAddress);
+	contextConfigV1.iPdpCompression = 1;
+	contextConfigV1.iPdpType =  RPacketContext::EPdpTypeIPv6;  
+
+	contextConfigV1.iUseEdge = ETrue;
+	contextConfigV1.iProtocolConfigOption.iAuthInfo.iUsername.Copy(KUsername);
+	contextConfigV1.iProtocolConfigOption.iAuthInfo.iPassword.Copy(KPassword);
+	contextConfigV1.iProtocolConfigOption.iChallenge.Copy(KChallenge);
+	contextConfigV1.iProtocolConfigOption.iResponse.Copy(KResponse);
+	contextConfigV1.iProtocolConfigOption.iDnsAddresses.iPrimaryDns.Copy(KPrimaryDNS);
+	contextConfigV1.iProtocolConfigOption.iDnsAddresses.iSecondaryDns.Copy(KSecondaryDNS);
+	contextConfigV1.iProtocolConfigOption.iId = 1;
+	contextConfigV1.iProtocolConfigOption.iMiscBuffer.Copy(_L(""));
+	ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+	
+TInt CSimPacketService::GetDefaultContextParams(const TTsyReqHandle aTsyReqHandle, TDes8* aPckg)
+/**
+* Returns the Default Context Parameters set by the client.
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @param aPckg pointer containing the parameters to return to client.
+* @return KErrNone
+*/
+	{
+	LOGPACKET1("CSimPacketService::GetDefaultContextParams called");
+	TPckg<TPacketDataConfigBase>* configBase = (TPckg<TPacketDataConfigBase>*)aPckg;
+	TPacketDataConfigBase& configBaseV1 = (*configBase)();
+
+	// GPRS
+	if(configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigGPRS)
+		{
+		TPckg<RPacketContext::TContextConfigGPRS>* contextConfigGPRSPckg = (TPckg<RPacketContext::TContextConfigGPRS>*)aPckg;
+		RPacketContext::TContextConfigGPRS& contextConfigV1 = (*contextConfigGPRSPckg)();
+
+		contextConfigV1.iAccessPointName.Copy(iGPRSDefaultConfig.iGsnAddress);// = STATIC_CAST(RPacketContext::TGSNAddress,accessPointName);
+		contextConfigV1.iAnonymousAccessReqd = STATIC_CAST(RPacketContext::TAnonymousAccess,iGPRSDefaultConfig.iAnonymousAccess);
+		contextConfigV1.iPdpAddress.Copy(iGPRSDefaultConfig.iProtocolAddress);// = STATIC_CAST(RPacketContext::TProtocolAddress, dpAddress);
+		contextConfigV1.iPdpCompression = STATIC_CAST(TUint, iGPRSDefaultConfig.iPdpCompression);
+		contextConfigV1.iPdpType = STATIC_CAST(RPacketContext::TProtocolType, iGPRSDefaultConfig.iProtocolType);
+		contextConfigV1.iUseEdge = iGPRSDefaultConfig.iUseEdge;
+		contextConfigV1.iProtocolConfigOption.iAuthInfo.iProtocol = STATIC_CAST(RPacketContext::TAuthProtocol, iGPRSDefaultConfig.iProtocolConfigOption.iAuthProtocol);
+		contextConfigV1.iProtocolConfigOption.iAuthInfo.iUsername.Copy(iGPRSDefaultConfig.iProtocolConfigOption.iUsername);
+		contextConfigV1.iProtocolConfigOption.iAuthInfo.iPassword.Copy(iGPRSDefaultConfig.iProtocolConfigOption.iPassword);
+		contextConfigV1.iProtocolConfigOption.iChallenge.Copy(iGPRSDefaultConfig.iProtocolConfigOption.iChallenge);
+		contextConfigV1.iProtocolConfigOption.iResponse.Copy(iGPRSDefaultConfig.iProtocolConfigOption.iResponse);
+		contextConfigV1.iProtocolConfigOption.iDnsAddresses.iPrimaryDns.Copy(iGPRSDefaultConfig.iProtocolConfigOption.iPrimaryDNS);
+		contextConfigV1.iProtocolConfigOption.iDnsAddresses.iSecondaryDns.Copy(iGPRSDefaultConfig.iProtocolConfigOption.iSecondaryDNS);
+		contextConfigV1.iProtocolConfigOption.iId = STATIC_CAST(TUint8, iGPRSDefaultConfig.iProtocolConfigOption.iId);
+		contextConfigV1.iProtocolConfigOption.iMiscBuffer.Copy(iGPRSDefaultConfig.iProtocolConfigOption.iMiscBuffer);
+		ReqCompleted(aTsyReqHandle,KErrNone);
+		}
+	// UMTS
+	else if(configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigRel99Rel4)
+		{
+		TPckg<RPacketContext::TContextConfigR99_R4>* contextConfigR99_R4Pckg = (TPckg<RPacketContext::TContextConfigR99_R4>*)aPckg;
+		RPacketContext::TContextConfigR99_R4& contextConfigV1 = (*contextConfigR99_R4Pckg)();
+
+		contextConfigV1.iAccessPointName.Copy(iR99_R4DefaultConfig.iGsnAddress);// = STATIC_CAST(RPacketContext::TGSNAddress,accessPointName);
+		contextConfigV1.iPdpAddress.Copy(iR99_R4DefaultConfig.iProtocolAddress);// = STATIC_CAST(RPacketContext::TProtocolAddress, dpAddress);
+		contextConfigV1.iPdpType = STATIC_CAST(RPacketContext::TProtocolType, iR99_R4DefaultConfig.iProtocolType);
+		contextConfigV1.iUseEdge = iR99_R4DefaultConfig.iUseEdge;
+		contextConfigV1.iProtocolConfigOption.iAuthInfo.iProtocol = STATIC_CAST(RPacketContext::TAuthProtocol, iR99_R4DefaultConfig.iProtocolConfigOption.iAuthProtocol);
+		contextConfigV1.iProtocolConfigOption.iAuthInfo.iUsername.Copy(iR99_R4DefaultConfig.iProtocolConfigOption.iUsername);
+		contextConfigV1.iProtocolConfigOption.iAuthInfo.iPassword.Copy(iR99_R4DefaultConfig.iProtocolConfigOption.iPassword);
+		contextConfigV1.iProtocolConfigOption.iChallenge.Copy(iR99_R4DefaultConfig.iProtocolConfigOption.iChallenge);
+		contextConfigV1.iProtocolConfigOption.iResponse.Copy(iR99_R4DefaultConfig.iProtocolConfigOption.iResponse);
+		contextConfigV1.iProtocolConfigOption.iDnsAddresses.iPrimaryDns.Copy(iR99_R4DefaultConfig.iProtocolConfigOption.iPrimaryDNS);
+		contextConfigV1.iProtocolConfigOption.iDnsAddresses.iSecondaryDns.Copy(iR99_R4DefaultConfig.iProtocolConfigOption.iSecondaryDNS);
+		contextConfigV1.iProtocolConfigOption.iId = STATIC_CAST(TUint8, iR99_R4DefaultConfig.iProtocolConfigOption.iId);
+		contextConfigV1.iProtocolConfigOption.iMiscBuffer.Copy(iR99_R4DefaultConfig.iProtocolConfigOption.iMiscBuffer);
+		ReqCompleted(aTsyReqHandle,KErrNone);
+		}
+
+	//R5
+	else if(configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigRel5)
+		{
+		TPckg<RPacketContext::TContextConfig_R5>* contextConfigR5Pckg = (TPckg<RPacketContext::TContextConfig_R5>*)aPckg;
+		RPacketContext::TContextConfig_R5& contextConfigV1 = (*contextConfigR5Pckg)();
+
+		contextConfigV1.iAccessPointName.Copy(iR5DefaultConfig.iGsnAddress);
+		contextConfigV1.iPdpAddress.Copy(iR5DefaultConfig.iProtocolAddress);
+		contextConfigV1.iPdpType = static_cast<RPacketContext::TProtocolType>(iR5DefaultConfig.iProtocolType);
+		contextConfigV1.iUseEdge = iR5DefaultConfig.iUseEdge;
+		contextConfigV1.iPdpHeaderCompression = 
+			static_cast<RPacketContext::THeaderCompression>(iR5DefaultConfig.iPdpHeaderCompression);
+		contextConfigV1.iPdpDataCompression = 
+			static_cast<RPacketContext::TDataCompression>(iR5DefaultConfig.iPdpDataCompression);
+		contextConfigV1.iProtocolConfigOption.iAuthInfo.iProtocol = 
+			static_cast<RPacketContext::TAuthProtocol>(iR5DefaultConfig.iProtocolConfigOption.iAuthProtocol);
+		contextConfigV1.iProtocolConfigOption.iAuthInfo.iUsername.Copy(
+			iR5DefaultConfig.iProtocolConfigOption.iUsername);
+		contextConfigV1.iProtocolConfigOption.iAuthInfo.iPassword.Copy(
+			iR5DefaultConfig.iProtocolConfigOption.iPassword);
+		contextConfigV1.iProtocolConfigOption.iChallenge.Copy(
+			iR5DefaultConfig.iProtocolConfigOption.iChallenge);
+		contextConfigV1.iProtocolConfigOption.iResponse.Copy(
+			iR5DefaultConfig.iProtocolConfigOption.iResponse);
+		contextConfigV1.iProtocolConfigOption.iDnsAddresses.iPrimaryDns.Copy(
+			iR5DefaultConfig.iProtocolConfigOption.iPrimaryDNS);
+		contextConfigV1.iProtocolConfigOption.iDnsAddresses.iSecondaryDns.Copy(
+			iR5DefaultConfig.iProtocolConfigOption.iSecondaryDNS);
+		contextConfigV1.iProtocolConfigOption.iId = 
+			static_cast<TUint8>(iR5DefaultConfig.iProtocolConfigOption.iId);
+		contextConfigV1.iProtocolConfigOption.iMiscBuffer.Copy(
+			iR5DefaultConfig.iProtocolConfigOption.iMiscBuffer);
+
+		ReqCompleted(aTsyReqHandle,KErrNone);
+		}
+
+	return KErrNone;
+	}
+
+
+void CSimPacketService::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
+*/
+	{
+	LOGPACKET1(">>CSimPacketService::TimerCallBack");
+
+	if(aId == ETimerIdPcktServPacket)
+		{
+		TimerCallBackPcktRegStatus();
+		}
+	else if (aId== ETimerIdPcktServReleaseMode)
+		{
+		TimerCallBackReleaseMode();
+		}
+	else if (aId == ETimerIdPcktServNtwkStatusChange)
+		{
+		TimerCallBackNtwkRegStatus();
+		}
+	else if (aId == ETimerIdPcktServStatusSuspend || 
+			 aId == ETimerIdPcktServStatusDetach  ||
+			 aId == ETimerIdPcktServStatusUnattach)
+		{
+		TimerCallBackDeactivate();	
+		}
+	else if (aId == ETimerIdPcktServDynamicCaps)
+		{
+		TimerCallBackDynamicCaps();
+		}		
+	else if(aId == ETimerIdContextActivationRequestedChange)
+		{
+
+
+		iIncomingContextManager->NextIncomingEvent(iConfigData.iData);
+			// Set up for the next incoming PDP if any.
+			// Note at moment can only handle 1 GPRS incoming.
+			// There is no support for 2ndary contexts, so can not have 2 incoming (of the same type).
+			// And at the moment there is no support for any other type thanm GPRS.
+
+		iIncomingContextManager->Cancel();	
+			// No more timers.
+								
+		iIncomingContextManager->SetUseTimerOff();								
+		ReqCompleted(iConfigData.iTsyReqHandle,KErrNone);
+		iIncomingContextManager->SetUseTimerOn();								
+						
+		}
+	else if(aId == ETimerIdMbmsPcktService)
+		{
+		if(iNotifyMbmsNetworkStatusChange.iNotifyPending)
+			{
+			iNotifyMbmsNetworkStatusChange.iNotifyPending = EFalse;
+			*(static_cast<TMbmsNetworkServiceStatus*>(iNotifyMbmsNetworkStatusChange.iNotifyData))=
+			iMbmsBroadcastParamsArray->At(iCurrentMbmsParamsIndex).iMbmsNetworkStatus;
+			ReqCompleted(iNotifyMbmsNetworkStatusChange.iNotifyHandle,KErrNone);
+			}
+
+		if(iNotifyMbmsServAvailChange.iNotifyPending)
+			{
+			iNotifyMbmsServAvailChange.iNotifyPending = EFalse;
+			ReqCompleted(iNotifyMbmsServAvailChange.iNotifyHandle,KErrNone);
+			}
+
+		if(iMbmsBroadcastParamsArray->Count() > iCurrentMbmsParamsIndex)
+			{
+			iMbmsPcktTimer->Start(iMbmsBroadcastParamsArray->At(iCurrentMbmsParamsIndex).iDuration,this,ETimerIdMbmsPcktService);
+			}
+		else if (iMbmsMonitorListParamsArray->Count() > iCurrentMbmsMonitorListIndex)
+			{
+			iMbmsPcktTimer->Start(iMbmsMonitorListParamsArray->At(iCurrentMbmsMonitorListIndex).iDuration,this,ETimerIdMbmsPcktService);
+			}
+
+		}
+	else
+		{
+		TInt ret = ActionEvent(EPacketEventTimeOut);
+		__ASSERT_ALWAYS(ret==KErrNone,SimPanic(ETimeOutEventActionFailed));	// Note: this is very crude error handling and should be replaced by something rather more elegant.
+		}
+	LOGPACKET1("<<CSimPacketService::TimerCallBack");
+	}
+
+void CSimPacketService::TimerCallBackDeactivate()
+{
+	// deactivate all contexts in every nif
+	TInt totalWrappers = iNifWrappers.Count();
+	for(TInt j=0; j < totalWrappers; j++)
+		{
+		TInt totalContexts = iNifWrappers[j].NumberOfContexts();
+		for(TInt x =0; x<totalContexts; x++)
+			{
+			iNifWrappers[j].GetContext(x)->AttemptDeactivateImmediately();
+			}
+		}
+}
+
+void CSimPacketService::TimerCallBackReleaseMode()
+/**
+* called when release mode timer callback occurs
+*/
+	{
+	if(iPacketReleaseModeArray->Count()<=iPacketReleaseModeIndex)
+		return;
+
+	iCurrentPacketReleaseMode=iPacketReleaseModeArray->At(iPacketReleaseModeIndex).iReleaseMode;
+
+	// if event is pending complete request
+	if(iNotifyChangeOfReleaseMode.iNotifyPending)
+	{
+	iNotifyChangeOfReleaseMode.iNotifyPending=EFalse;
+	*(RPacketService::TPacketReleaseMode*)iNotifyChangeOfReleaseMode.iNotifyData=(RPacketService::TPacketReleaseMode)iCurrentPacketReleaseMode;
+	ReqCompleted(iNotifyChangeOfReleaseMode.iNotifyHandle,KErrNone);
+	}
+
+	iPacketReleaseModeIndex++;
+	if (iPacketReleaseModeArray->Count() > (iPacketReleaseModeIndex))
+		{	
+		// start timer again
+		iReleaseModeTimer->Start(iPacketReleaseModeArray->At(iPacketReleaseModeIndex).iDuration,this,ETimerIdPcktServReleaseMode);
+		}
+	}
+
+void CSimPacketService::TimerCallBackPcktRegStatus()
+/**
+* Timer Call back for the Network Registration status.
+*
+*/
+	{
+	iState=(RPacketService::TStatus)iPcktRegStatusInfo->At(iPcktRegStatIndex).iStatus;
+
+	if(iNotifyStatusChange.iNotifyPending)
+		{
+		iNotifyStatusChange.iNotifyPending=EFalse;
+		*(RPacketService::TStatus*)iNotifyStatusChange.iNotifyData=(RPacketService::TStatus)iState;
+		ReqCompleted(iNotifyStatusChange.iNotifyHandle,KErrNone);
+		}
+	
+	// please note that this bool is in case the test code is setting 
+	// iState to another value, in which case the request will not complete
+	// unless this bool is set and therefore the request will complete
+	// in ActionEvent() 
+	if (iCurrentEvent != EPacketEventNone)
+		iPcktTimerBool = ETrue;
+
+	iPcktRegStatIndex++;
+	if (iPcktRegStatusInfo->Count() > iPcktRegStatIndex)
+		{
+		iPcktRegTimer->Start(iPcktRegStatusInfo->At(iPcktRegStatIndex).iDuration,this,ETimerIdPcktServPacket);
+		}
+	}
+
+void CSimPacketService::SimPSEvent(const CSimPubSub::TPubSubProperty aProperty, TInt aStatus)
+	{
+
+	
+	if (aProperty == iNtwkRegStatusChangeProperty)
+		{ // The call is for the network.
+		TInt index = aStatus;
+		TInt length = iNtwkRegStatusInfo->Count();
+		if (index < length)
+			{
+			TNtwkRegStatus& ntwkRegStatus = iNtwkRegStatusInfo->At(index);
+			CompleteNtwkRegStatus(ntwkRegStatus.iRegStatus);
+			}
+		}
+	else if ( iIncomingContextManager->IsForcedIncoming( aProperty ) )
+		{ //  Lets force the completion of the PDP, rather than waiting around 
+		  // for a large time to finish.
+		TInt index = aStatus;
+		iIncomingContextManager->ForcedIncoming( index, iConfigData.iData );
+		iIncomingContextManager->SetUseTimerOff();								
+		ReqCompleted(iConfigData.iTsyReqHandle,KErrNone);
+			// Force the change through as if the timer had timed out.
+		iIncomingContextManager->SetUseTimerOn();								
+			// May get more timeouts for other primary PDP's.
+		}
+	else
+		{  // Error. Some sort of stange request. Hopefully impossible.
+		LOGPACKET1("CSimPacketService::SimPSEvent property mismatch.");
+		SimPanic(EFailedToSetProperty);
+		}
+	
+	}
+
+void CSimPacketService::PubSubCallback(TInt aIndex)
+	{
+
+	if(aIndex ==0 )
+		{
+		ReqCompleted(iGetMbmsNetworkReqHandle,KErrNone);	
+		}
+
+	else if (aIndex ==1)
+		{
+		if(iNotifyMbmsServAvailChange.iNotifyPending)
+			{
+			iNotifyMbmsServAvailChange.iNotifyPending = EFalse;
+			ReqCompleted(iNotifyMbmsServAvailChange.iNotifyHandle,KErrNone);
+			}
+		}
+
+	else if(aIndex ==2)
+		{
+		if(iUpdateMbmsServiceReqHandle)
+			{
+			ReqCompleted(iUpdateMbmsServiceReqHandle,iUpdateMbmsServiceError);
+			}
+		}
+
+	else if(aIndex ==3)
+		{
+		ReqCompleted(iEnumerateActiveListReqHandle,KErrNone);
+		}
+
+	else if(aIndex ==4)
+		{
+		ReqCompleted(iEnumerateMonitorListReqHandle,KErrNone);
+		}
+
+	else {}
+}
+
+void CSimPacketService::TimerCallBackNtwkRegStatus()
+	{
+	if(iNtwkRegStatusInfo->Count()<=iNtwkRegStatIndex)
+		return;
+
+	TNtwkRegStatus& ntwkRegStatus = iNtwkRegStatusInfo->At(iNtwkRegStatIndex);
+	CompleteNtwkRegStatus(ntwkRegStatus.iRegStatus);
+
+	iNtwkRegStatIndex++;
+	if(iNtwkRegStatusInfo->Count()>iNtwkRegStatIndex)
+		iNtwkRegTimer->Start(iNtwkRegStatusInfo->At(iNtwkRegStatIndex).iDuration,this,ETimerIdPcktServNtwkStatusChange);
+	}
+	
+void CSimPacketService::CompleteNtwkRegStatus(RPacketService::TRegistrationStatus aRegistrationStatus)
+	{
+	iCurrentRegStatus = aRegistrationStatus;
+
+	if(iNotifyChangeOfNtwk.iNotifyPending)
+		{
+		iNotifyChangeOfNtwk.iNotifyPending=EFalse;
+		*(RPacketService::TRegistrationStatus*)iNotifyChangeOfNtwk.iNotifyData=(RPacketService::TRegistrationStatus)iCurrentRegStatus;
+		ReqCompleted(iNotifyChangeOfNtwk.iNotifyHandle,KErrNone);
+		}
+
+	if (//iCurrentRegStatus == RPacketService::ENotRegisteredSearching || 
+		iCurrentRegStatus == RPacketService::ERegistrationDenied ||
+		iCurrentRegStatus == RPacketService::ENotRegisteredButAvailable ||
+		iCurrentRegStatus == RPacketService::ENotRegisteredAndNotAvailable)
+	{
+		// deactivate all contexts in every nif
+		TInt totalWrappers = iNifWrappers.Count();
+		for(TInt j=0; j < totalWrappers; j++)
+			{
+			TInt totalContexts = iNifWrappers[j].NumberOfContexts();
+			for(TInt x =0; x<totalContexts; x++)
+				{
+				iNifWrappers[j].GetContext(x)->AttemptDeactivateImmediately();
+				}
+			}
+	}
+}
+
+TInt CSimPacketService::ChangeState(RPacketService::TStatus aNewState)
+/**
+* Attempt to change state.
+* First validate that the requested state change is ok.  If it is then proceed to change
+* the state and complete any pending state change notification.
+*
+* @param aState the new state to change to
+* @return Error indication if change of state is successful or not
+*/
+	{
+	LOGPACKET2(">>CSimPacketService::ChangeState [newState=%d]", aNewState);
+	if(iState == aNewState)
+		return KErrNone;
+
+	TInt ret=KErrGeneral;
+	const TPacketStateChangeValidity* stateChangePnt=KPacketStateChangeValidity;
+	while(stateChangePnt->iOldState!=KPacketStateTableTerminator)
+		{
+		if((stateChangePnt->iOldState==iState) && (stateChangePnt->iNewState==aNewState))
+			{
+			ret=stateChangePnt->iError;
+			break;
+			}
+		stateChangePnt++;
+		}
+
+	if(ret!=KErrNone)
+		return ret;
+
+//Request permission from the phone to change the state of the packet connection
+	ret = iPhone->ValidateChangeState(aNewState);
+	if(ret!=KErrNone)
+		return ret;
+
+// Actually change the state.
+	iState=aNewState;
+
+// if suspended or unattached take appropriate action
+	if (iState==RPacketService::EStatusSuspended || iState == RPacketService::EStatusUnattached)
+		{
+			// deactivate all contexts in every nif
+			TInt totalWrappers = iNifWrappers.Count();
+			for(TInt j=0; j < totalWrappers; j++)
+				{
+				TInt totalContexts = iNifWrappers[j].NumberOfContexts();
+				for(TInt x =0; x<totalContexts; x++)
+					{
+					ret = iNifWrappers[j].GetContext(x)->AttemptDeactivateImmediately();
+					if(ret!=KErrNone)
+						{
+						break;
+						}
+					}
+				}
+		}
+
+// Check for a pending line state notification.
+	if(iNotifyStatusChange.iNotifyPending)
+		{
+		iNotifyStatusChange.iNotifyPending=EFalse;
+		*(RPacketService::TStatus*)iNotifyStatusChange.iNotifyData=iState;
+		ReqCompleted(iNotifyStatusChange.iNotifyHandle,KErrNone);
+		}
+
+	LOGPACKET1("<<CSimPacketService::ChangeState");
+	return KErrNone;
+	}
+
+TInt CSimPacketService::ActionEvent(TPacketEvent aEvent)
+/**
+* Entry point when an event has occured that may advance the state machine.
+* The aEvent parameter describes the event.
+*
+* This function contains the main state machine for the packet service.  
+*
+* @param aEvent The Packet Service event to handle
+* @return value represents the error state caused by the attempted state machine jump.
+*/
+	{
+	TInt ret=KErrNone;
+
+	switch(aEvent)
+		{
+	case EPacketEventAttach:
+		LOGPACKET1(">>CSimPacketService::ActionEvent = [EPacketEventAttach]");
+		if(iState==RPacketService::EStatusUnattached)
+			{
+			iCurrentEvent=EPacketEventAttach;
+			iTimer->Start(iAttachPause,this);
+			}
+		else
+			ReqCompleted(iAttachRequestHandle, KErrNone);
+		break;
+
+	case EPacketEventDetach:
+		LOGPACKET1(">>CSimPacketService::ActionEvent = [EPacketEventDetach]");
+		if(iState !=RPacketService::EStatusUnattached)
+			{
+			iCurrentEvent=EPacketEventDetach;
+			iTimer->Start(iDetachPause,this);
+			}
+		else
+			{
+			ReqCompleted(iDetachRequestHandle, KErrNone);
+			}
+		break;
+
+	case EPacketEventTimeOut:
+		switch(iCurrentEvent)
+			{
+		case EPacketEventNone:
+			break;
+		case EPacketEventAttach:
+			if(iAttachFail != KErrNone)
+				{
+				ReqCompleted(iAttachRequestHandle,iAttachFail);
+				iCurrentEvent=EPacketEventNone;
+				iAttachFail = KErrNone;
+				break;
+				}
+			if(iState==RPacketService::EStatusUnattached)
+				{
+				ret=ChangeState(RPacketService::EStatusAttached);
+				ReqCompleted(iAttachRequestHandle,ret);
+				}
+			else if (iPcktTimerBool)
+				{	
+				ReqCompleted(iAttachRequestHandle,KErrNone);
+				iPcktTimerBool= EFalse;
+				}
+			iCurrentEvent=EPacketEventNone;
+			break;
+		case EPacketEventDetach:
+			if(iDetachFail != KErrNone)
+				{
+				ReqCompleted(iDetachRequestHandle,iDetachFail);
+				iCurrentEvent=EPacketEventNone;
+				iDetachFail = KErrNone;
+				break;
+				}
+			ret = DoDetach();
+			if (iPcktTimerBool)
+				{	
+				ReqCompleted(iDetachRequestHandle,KErrNone);
+				iPcktTimerBool= EFalse;
+				}
+			iCurrentEvent=EPacketEventNone;
+			break;
+		default:
+			break;
+			}
+		break;
+
+	default:
+		break;
+		}
+	return ret;
+	}
+
+const CTestConfigSection* CSimPacketService::CfgFile()
+/**
+*	Return a pointer to the Configuration File Section
+*
+* @return CTestConfigSection	pointer to the configuration file section
+*/
+	{
+	return iPhone->CfgFile();
+	}
+
+/**
+* check that there is a primary context and that opening a secondary
+* is a valid action
+**/
+TInt CSimPacketService::PrepareOpenSecondary(const TTsyReqHandle aTsyReqHandle, const TDesC* aOriginalContextName)
+	{
+	TInt i = 0;
+	TInt err = KErrNone;
+
+	for(i = 0; i<iNifWrappers.Count(); i++)
+		{
+		TNifWrapper& nifWrapper = iNifWrappers[i];
+		for (TInt j = 0; j < nifWrapper.NumberOfContexts(); j++)
+			{
+			if (nifWrapper.GetContext(j)->ContextName().Compare(*aOriginalContextName) == KErrNone)
+				{
+				iSecondaryContext = ETrue;
+				iCurrentPrimaryContextIndex = i;
+				break;
+				}
+			}
+		}
+	
+	if (iSecondaryContext == EFalse)
+		err = KErrNotSupported;
+	
+	ReqCompleted(aTsyReqHandle, err);
+	return err;
+	}
+
+TInt CSimPacketService::GetCurrentReleaseMode(const TTsyReqHandle aTsyReqHandle,RPacketService::TPacketReleaseMode* aReleaseMode)
+// return current release mode
+	{
+	LOGPACKET1("CSimPacketService::GetCurrentReleaseMode called");
+	*aReleaseMode = (RPacketService::TPacketReleaseMode)iCurrentPacketReleaseMode;
+	ReqCompleted(aTsyReqHandle, KErrNone);
+	return KErrNone;
+	}
+	
+TInt CSimPacketService::NotifyReleaseModeChange(const TTsyReqHandle aTsyReqHandle, RPacketService::TPacketReleaseMode* aReleaseMode)
+	{
+	// if release mode has changed
+	if(iPacketReleaseModeArray->Count()==0)
+		{
+		ReqCompleted(aTsyReqHandle,KErrNotSupported);
+		return KErrNotSupported;
+		}
+
+	__ASSERT_ALWAYS(!iNotifyChangeOfReleaseMode.iNotifyPending,SimPanic(ENotificationReqAlreadyOutstanding));
+
+	iNotifyChangeOfReleaseMode.iNotifyPending=ETrue;
+	iNotifyChangeOfReleaseMode.iNotifyHandle=aTsyReqHandle;
+	iNotifyChangeOfReleaseMode.iNotifyData=&aReleaseMode;
+	return KErrNone;
+	}
+
+TInt CSimPacketService::EnumerateNifs(const TTsyReqHandle aTsyReqHandle, TInt& aCount) 
+	{
+// return number of nifs
+	aCount = iNifWrappers.Count();
+	ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CSimPacketService::GetNifInfo(const TTsyReqHandle aTsyReqHandle, TInt aIndex, TDes8* aNifInfoV2) 
+	{
+// get info for nif
+	TInt range = iNifWrappers.Count()-1;
+	if (aIndex < 0 || aIndex > range)
+		{
+		ReqCompleted(aTsyReqHandle,KErrArgument);
+		return KErrArgument;
+		}
+
+	RPacketService::TNifInfoV2Pckg* nifInfoV2Pckg = (RPacketService::TNifInfoV2Pckg*)aNifInfoV2;
+	RPacketService::TNifInfoV2& nifInfoV2 = (*nifInfoV2Pckg)();
+
+	// Check that the data structure is supported by the simulated TSY version
+	TInt err = iPhone->CheckSimTsyVersion(nifInfoV2);
+	if(err != KErrNone)
+		{
+		iPhone->ReqCompleted(aTsyReqHandle, err);
+		return KErrNone;
+		}
+
+	nifInfoV2.iContextName.Copy(iNifWrappers[aIndex].GetContext(0)->ContextName());
+	nifInfoV2.iContextType = STATIC_CAST(RPacketService::TContextType, iNifWrappers[aIndex].GetContext(0)->ContextType());
+
+	ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+/***
+* This function takes the name passed in the parameter aExistingContextName and 
+* returns the number of contexts sharing its Nif. 
+***/
+TInt CSimPacketService::EnumerateContextsInNif(const TTsyReqHandle aTsyReqHandle, const TDesC* aExistingContextName, TInt& aCount) 
+	{
+	// find contexts sharing name aExistingContextName, ie primary and secondary as well
+	TInt number = KErrNotFound;
+	TInt wrappersCount = iNifWrappers.Count();
+
+	for(TInt i = 0; i<wrappersCount; i++)
+		{
+		TInt contextsTotal = iNifWrappers[i].NumberOfContexts();
+		for(TInt j = 0; j<contextsTotal; j++)
+			{
+			if(iNifWrappers[i].GetContext(j)->ContextName().Compare(*aExistingContextName) == KErrNone)
+				{
+				number = iNifWrappers[i].NumberOfContexts();
+				break;
+				}
+			}
+		}
+
+	// ie couldn't find context of aExistingContextName
+	if (number == KErrNotFound)
+		{
+		ReqCompleted(aTsyReqHandle, KErrArgument);
+		return KErrArgument;
+		}
+
+	// count primary context as well!
+	aCount = number;
+	ReqCompleted(aTsyReqHandle, KErrNone);
+	return KErrNone;
+	}
+
+TInt CSimPacketService::GetContextNameInNif(const TTsyReqHandle aTsyReqHandle, const TDesC* aExistingContextName, TInt aIndex, TDes* aContextName) 
+	{
+// get for context name specified, find nif's context name at index given
+	// first, check aExistingContextName exists in contexts
+	TInt number = KErrNotFound;
+	TInt wrappersCount =  iNifWrappers.Count();
+
+	for(TInt i = 0; i<wrappersCount; i++)
+		{
+		TInt contextsTotal = iNifWrappers[i].NumberOfContexts();
+		for(TInt j = 0; j<contextsTotal; j++)
+			{
+			if (iNifWrappers[i].GetContext(j)->ContextName().Compare(*aExistingContextName) == KErrNone)
+				{
+				number = i;
+				break;
+				}
+			}
+		}
+
+	// total no. of contexts with name is number of secondary contexts plus primary, so
+	// number + 1
+	// so range should be within number+1-1 ie number.
+	if (number == KErrNotFound || aIndex < 0 || aIndex > number)
+		{
+		ReqCompleted(aTsyReqHandle, KErrArgument);
+		return KErrArgument;
+		}
+	
+	*aContextName = iNifWrappers[number].GetContext(aIndex)->ContextName();
+	ReqCompleted(aTsyReqHandle, KErrNone);
+	return KErrNone;
+	}
+
+/**
+* Cancel method, returns KErrNone
+*/
+TInt CSimPacketService::GetCurrentReleaseModeCancel(const TTsyReqHandle /*aTsyReqHandle*/)
+	{
+	return KErrNone;
+	}
+
+/**
+* Cancel method, returns KErrNone
+*/
+TInt CSimPacketService::NotifyReleaseModeChangeCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGPACKET1("CSimPacketService::NotifyChangeOfNtwkRegStatusCancel called");
+	if(iNotifyChangeOfReleaseMode.iNotifyPending)
+		{
+		iNotifyChangeOfReleaseMode.iNotifyPending=EFalse;
+		ReqCompleted(aTsyReqHandle,KErrCancel);
+		}
+	return KErrNone;
+	}
+
+/**
+* Cancel method, returns KErrNone
+*/
+TInt CSimPacketService::EnumerateNifsCancel(const TTsyReqHandle /*aTsyReqHandle*/)
+	{
+	return KErrNone;
+	}
+
+/**
+* Cancel method, returns KErrNone
+*/
+TInt CSimPacketService::GetNifInfoCancel(const TTsyReqHandle /*aTsyReqHandle*/)
+	{
+	return KErrNone;
+	}
+
+/**
+* Cancel method, returns KErrNone
+*/
+TInt CSimPacketService::EnumerateContextsInNifCancel(const TTsyReqHandle /*aTsyReqHandle*/)
+	{
+	return KErrNone;
+	}
+
+/**
+* Cancel method, returns KErrNone
+*/	
+TInt CSimPacketService::GetContextNameInNifCancel(const TTsyReqHandle /*aTsyReqHandle*/)
+	{
+	return KErrNone;
+	}
+	
+/**
+* Cancel method, returns KErrNone
+*/
+TInt CSimPacketService::NotifyAttachModeChangeCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGPACKET1("CSimPacketService::NotifyAttachModeChangeCancel called");
+	if(iNotifyChangeOfAttachMode.iNotifyPending)
+		{
+		iNotifyChangeOfAttachMode.iNotifyPending=EFalse;
+		ReqCompleted(aTsyReqHandle,KErrCancel);
+		}
+	return KErrNone;
+	}
+
+TInt CSimPacketService::GetMbmsNetworkServiceStatus(const TTsyReqHandle aTsyReqHandle, TBool aAttemptAttach,TMbmsNetworkServiceStatus* aStatus)
+/**
+* Retrieves and returns the status of the MBMS Packet service
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @param aStatus pointer to the status
+* @return TInt err KErrNone if ok
+*/
+	{
+	LOGPACKET1("CSimPacketService::GetMbmsNetworkServiceStatus called");
+	*aStatus = (iMbmsBroadcastParamsArray->At(iCurrentMbmsParamsIndex).iMbmsNetworkStatus);
+	if(aAttemptAttach)
+		{
+		if(*aStatus == EMbmsSupportUnknown)
+			{
+			*aStatus = EMbmsSupported;
+			}
+		}
+	iGetMbmsNetworkReqHandle = aTsyReqHandle;
+	iCurrentMbmsParamsIndex++;
+	TInt totCount = iMbmsBroadcastParamsArray->Count();
+	if(iCurrentMbmsParamsIndex == totCount)
+		{
+		iCurrentMbmsParamsIndex--;
+		}
+	return KErrNone;
+	}
+
+TInt CSimPacketService::GetMbmsNetworkServiceStatusCancel(const TTsyReqHandle aTsyReqHandle)
+/* 
+ * Cancels the GetMBMSNetworkServiceStatus request.
+ * In fact this is not needed- just to avoid Panic if called, this implementation is done.
+ */
+	{
+	if(iGetMbmsNetworkReqHandle == aTsyReqHandle)
+		{
+		ReqCompleted(iGetMbmsNetworkReqHandle,KErrCancel);
+		}
+	else
+		{
+		ReqCompleted(iGetMbmsNetworkReqHandle,KErrCorrupt);
+		}
+	return KErrNone;
+	}
+
+TInt CSimPacketService::NotifyMbmsNetworkServiceStatusChange(const TTsyReqHandle aTsyReqHandle, TMbmsNetworkServiceStatus* aStatus)
+/**
+* Record a client's interest in being notified of the state of the MBMS packet network and contexts.
+* First check that there isn't already a notification pending (the ETel Server should protect
+* against this) and then record the information necessary to complete the request later, when
+* the status does actually change.
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @param aStatus pointer to the mbms packet service status
+* @return KErrNone
+*/
+	{
+	LOGPACKET1("CSimPacketService::NotifyMbmsNetworkServiceStatusChange called");
+ 	__ASSERT_ALWAYS(!iNotifyMbmsNetworkStatusChange.iNotifyPending,SimPanic(ENotificationAlreadyPending));
+
+ 	iNotifyMbmsNetworkStatusChange.iNotifyPending = ETrue;
+	iNotifyMbmsNetworkStatusChange.iNotifyHandle = aTsyReqHandle;
+ 	iNotifyMbmsNetworkStatusChange.iNotifyData = aStatus;
+	return KErrNone;
+	}
+
+TInt CSimPacketService::NotifyMbmsNetworkServiceStatusChangeCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+* Cancel a client's interest in being notified when the mbms network status changes.
+* This is acheived simply by resetting the flag that indicates a notification is pending.
+* 
+* @param aTsyReqHandle Tsy Request handle for the client cancel request
+* @return KErrNone
+*/
+	{
+	LOGPACKET1("CSimPacketService::NotifyMbmsNetworkServiceStatusChangeCancel called");
+	if(iNotifyMbmsNetworkStatusChange.iNotifyPending)
+		{
+		iNotifyMbmsNetworkStatusChange.iNotifyPending=EFalse;
+		ReqCompleted(aTsyReqHandle,KErrCancel);
+		}
+	return KErrNone;
+	}
+
+TInt CSimPacketService::NotifyMbmsServiceAvailabilityChange(const TTsyReqHandle aTsyReqHandle)
+/**
+* Record a client's interest in being notified of the service availability of the MBMS packet network.
+* First check that there isn't already a notification pending (the ETel Server should protect
+* against this) and then record the information necessary to complete the request later, when
+* the status does actually change.
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @return KErrNone
+*/
+	{
+	LOGPACKET1("CSimPacketService::NotifyMbmsServiceAvailabilityChange called");
+ 	__ASSERT_ALWAYS(!iNotifyMbmsNetworkStatusChange.iNotifyPending,SimPanic(ENotificationAlreadyPending));
+
+ 	iNotifyMbmsServAvailChange.iNotifyPending = ETrue;
+ 	iNotifyMbmsServAvailChange.iNotifyHandle = aTsyReqHandle;
+ 	(void)iNotifyMbmsServAvailChange.iNotifyData;
+	return KErrNone;
+	}
+
+TInt CSimPacketService::NotifyMbmsServiceAvailabilityChangeCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+* Cancel a client's interest in being notified when the mbms service availability changes.
+* This is acheived simply by resetting the flag that indicates a notification is pending.
+* 
+* @param aTsyReqHandle Tsy Request handle for the client cancel request
+* @return KErrNone
+*/
+	{
+	LOGPACKET1("CSimPacketService::NotifyMbmsServiceAvailabilityChangeCancel called");
+	if(iNotifyMbmsServAvailChange.iNotifyPending)
+		{
+		iNotifyMbmsServAvailChange.iNotifyPending=EFalse;
+		ReqCompleted(aTsyReqHandle,KErrCancel);
+		}
+	return KErrNone;
+	}
+
+TInt CSimPacketService::UpdateMbmsMonitorServiceListL(const TTsyReqHandle aTsyReqHandle,TMbmsAction* aAction, TDes8* aBuffer)
+/**
+* client's interest in updating the MBMS Service Monitoring list.
+* The update action is also passed as the MBMS Action parameter.
+* This will update the MBMS Service Monitoring List in TSY.
+* 
+* @param aTsyReqHandle Tsy Request handle for the client cancel request
+* @param aAction TMbmsAction to be performed
+* @param aBuffer list of TMbmsServiceAvailabilityV1 class passed.
+* @return KErrNone
+*/
+	{
+	LOGPACKET1("CSimPacketService::UpdateMbmsMonitorServiceListL called");
+	CPcktMbmsMonitoredServiceList* monServList = CPcktMbmsMonitoredServiceList::NewL();
+	CleanupStack::PushL(monServList); 
+
+	TInt error=KErrNone;
+	TInt i=0;
+	TInt j=0;
+	TInt ii=0;
+	TInt countAdd=0;
+	TInt countRem=0;
+	RPacketService::TMbmsServiceAvailabilityV1 entry;
+	
+	switch(*aAction)
+		{
+		case SIMTSY_PACKET_MBMS_ADD_ENTRIES:
+			LOGPACKET1("CSimPacketService::UpdateMbmsMonitorServiceListL Action: ADD ");
+			monServList->RestoreL(*aBuffer);
+			countAdd = monServList->Enumerate();
+			if(countAdd != SIMTSY_PACKET_MBMS_ADD_ENTRIES_COUNT)
+				{
+				ReqCompleted(aTsyReqHandle,KErrCorrupt);
+				CleanupStack::PopAndDestroy(); // monServList
+				return KErrNone;
+				}
+			for(;i<SIMTSY_PACKET_MBMS_ADD_ENTRIES_COUNT;i++)
+				{
+				TRAPD(ret,entry=monServList->GetEntryL(i));
+				if (ret != KErrNone)
+					{
+					break;
+					}
+				TBool entryFound=EFalse;
+				
+				for(ii=0;ii<iMbmsMonitorListParamsArray->Count();ii++)
+					{
+					 if((entry.iMbmsServiceMode == iMbmsMonitorListParamsArray->At(ii).iServiceMode) &&
+						(entry.iMbmsAccessBearer == iMbmsMonitorListParamsArray->At(ii).iAccessBearer) &&
+						(entry.iTmgi.GetMCC() == iMbmsMonitorListParamsArray->At(ii).iMCC) &&
+						(entry.iTmgi.GetMNC() == iMbmsMonitorListParamsArray->At(ii).iMNC) &&
+						(entry.iTmgi.GetServiceId() == iMbmsMonitorListParamsArray->At(ii).iServiceId))		
+							{
+							entryFound =  ETrue;
+							break;
+							}
+					}
+					
+				if(!entryFound)
+					{
+					error = KErrMbmsImpreciseServiceEntries;
+					}
+					
+				else
+					{
+					entry.iMbmsAvailabilityStatus = iMbmsMonitorListParamsArray->At(ii).iAvailStatus ;
+					}
+				 	
+				}
+			iMbmsMonitorListCount += i;
+			if(iMbmsMonitorListCount > KMaxMbmsMonitorContexts)
+				{
+				error =KErrNoMemory;
+				iMbmsMonitorListCount -= i;
+				}
+			
+			ReqCompleted(aTsyReqHandle, error);
+			CleanupStack::PopAndDestroy(); // monServList
+			break;
+
+		case SIMTSY_PACKET_MBMS_REM_ENTRIES:
+			LOGPACKET1("CSimPacketService::UpdateMbmsMonitorServiceListL Action: REMOVE ");
+			monServList->RestoreL(*aBuffer);
+			countRem = monServList->Enumerate();
+			if(countRem != SIMTSY_PACKET_MBMS_REM_ENTRIES_COUNT)
+				{
+				ReqCompleted(aTsyReqHandle,KErrCorrupt);
+				CleanupStack::PopAndDestroy(); // monServList
+				return KErrNone;
+				}
+	
+			for(;i<SIMTSY_PACKET_MBMS_REM_ENTRIES_COUNT;i++)
+				{
+				TRAPD(ret,entry=monServList->GetEntryL(i));
+				
+				if (ret != KErrNone)
+					{
+					break;
+					}
+					
+				TBool entryFound=EFalse;
+				
+				for(ii=0;ii<iMbmsMonitorListParamsArray->Count();ii++)
+					{
+					 if((entry.iMbmsServiceMode == iMbmsMonitorListParamsArray->At(ii).iServiceMode) &&
+						(entry.iMbmsAccessBearer == iMbmsMonitorListParamsArray->At(ii).iAccessBearer) &&
+						(entry.iTmgi.GetMCC() == iMbmsMonitorListParamsArray->At(ii).iMCC) &&
+						(entry.iTmgi.GetMNC() == iMbmsMonitorListParamsArray->At(ii).iMNC) &&
+						(entry.iTmgi.GetServiceId() == iMbmsMonitorListParamsArray->At(ii).iServiceId))		
+					 		{
+					 		entryFound =  ETrue;
+					 		break;
+					 		}
+					}
+					
+				if(!entryFound)
+					{
+					j++;
+					error = KErrMbmsImpreciseServiceEntries;
+					}
+					
+				else
+					{
+					entry.iMbmsAvailabilityStatus = iMbmsMonitorListParamsArray->At(ii).iAvailStatus ;
+					iMbmsMonitorListParamsArray->Delete(ii);
+					}
+				 	
+				}
+				if(j == SIMTSY_PACKET_MBMS_REM_ENTRIES_COUNT)
+					{
+					error = KErrNotFound;					
+					}
+					
+			if(iMbmsMonitorListCount >=j)
+				{
+				iMbmsMonitorListCount -= j;
+				}
+				
+			iUpdateMbmsServiceError = error;
+			iUpdateMbmsServiceReqHandle = aTsyReqHandle;
+			
+			CleanupStack::PopAndDestroy(); // monServList
+			break;
+			
+		case SIMTSY_PACKET_MBMS_REM_ALL_ENTRIES:
+			iMbmsMonitorListCount = 0;
+			iMbmsMonitorListParamsArray->Delete(0,iMbmsMonitorListParamsArray->Count());
+			LOGPACKET1("CSimPacketService::UpdateMbmsMonitorServiceListL Action: REMOVE_ALL ");
+			iUpdateMbmsServiceError = KErrNone;
+			iUpdateMbmsServiceReqHandle = aTsyReqHandle;
+			CleanupStack::PopAndDestroy(); // monServList
+			break;
+			
+		default:
+			LOGPACKET1("CSimPacketService::UpdateMbmsMonitorServiceListL Action: Default ");
+			ReqCompleted(aTsyReqHandle,KErrNotFound);
+			CleanupStack::PopAndDestroy(); // monServList
+			break;
+		}
+	return KErrNone;
+	}
+
+TInt CSimPacketService::UpdateMbmsMonitorServiceListCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+* client's interest in cancelling the updation MBMS Service Monitoring list.
+* 
+* @param aTsyReqHandle Tsy Request handle for the client cancel request
+* @return KErrNone
+*/
+	{
+	LOGPACKET1("CSimPacketService::UpdateMbmsMonitorServiceListCancel Called ");
+	ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+
+// CHANGES FOR 2 Phase retrieval of MBMS Monitored Services list starts here.
+
+TInt CSimPacketService::GetMbmsMonitoredServicesListPhase1(const TTsyReqHandle aTsyReqHandle, TClientId* aClient, TInt* aBufSize)
+/**
+* client's interest in retrieving the MBMS Service Monitoring list.
+* This function is the call for the first phase of 2 phase retrieval.
+* 
+* @param aTsyReqHandle Tsy Request handle for the client cancel request
+* @param aAction TClientId to be used
+* @param aBufSize Size to be allocated for retrieving the actual list in second phase.
+* @return KErrNone
+*/
+	{
+	LOGPACKET1("CSimPacketService::GetMbmsMonitoredServicesListPhase1 called");
+	TInt ret=KErrNone;
+	TInt leaveCode=KErrNone;
+	TRAP(leaveCode, ret=ProcessGetMbmsMonitoredServicesListPhase1L(aTsyReqHandle, aClient, aBufSize););
+	if (leaveCode != KErrNone)
+		{
+		ReqCompleted(aTsyReqHandle,leaveCode);
+		}
+	return ret;
+	}	
+	
+TInt CSimPacketService::ProcessGetMbmsMonitoredServicesListPhase1L(const TTsyReqHandle aTsyReqHandle, 
+													 TClientId* aClient, 
+													 TInt* aBufSize)
+/**
+* Local function to perform the first phse of the 2 phase retrieval.
+* 
+* @param aTsyReqHandle Tsy Request handle for the client cancel request
+* @param aAction TClientId to be used
+* @param aBufSize Size to be allocated for retrieving the actual list in second phase.
+* @return KErrNone
+*/
+	{
+	
+	LOGPACKET1("CSimPacketService::ProcessGetMbmsMonitoredServicesListPhase1L called");
+	CPcktMbmsMonitoredServiceList* list=CPcktMbmsMonitoredServiceList::NewL();
+	CleanupStack::PushL(list);
+
+	RPacketService::TMbmsServiceAvailabilityV1 entry;
+	
+	for (TInt i=0; i <iMbmsMonitorListParamsArray->Count(); i++)
+		{
+			entry.iMbmsServiceMode = iMbmsMonitorListParamsArray->At(i).iServiceMode;
+			entry.iMbmsAccessBearer = iMbmsMonitorListParamsArray->At(i).iAccessBearer;
+			entry.iMbmsAvailabilityStatus = iMbmsMonitorListParamsArray->At(i).iAvailStatus;
+			entry.iTmgi.SetMCC(iMbmsMonitorListParamsArray->At(i).iMCC);
+			entry.iTmgi.SetMNC(iMbmsMonitorListParamsArray->At(i).iMNC);
+			entry.iTmgi.SetServiceId(iMbmsMonitorListParamsArray->At(i).iServiceId);
+			// Add the entry into the list, at the next empty location
+			LOGPACKET2("Adding the Entry no. %d to the List",i+1);
+			list->AddEntryL(entry);
+		}
+	
+	// Store the  streamed list and the client ID
+	CPcktListReadAllAttempt* read=CPcktListReadAllAttempt::NewL(*aClient,aTsyReqHandle);
+	CleanupStack::PushL(read);
+	
+	read->iListBuf = list->StoreLC();
+	CleanupStack::Pop(); // pop the CBufBase allocated by StoreLC
+	
+	iMbmsServicesList->AppendL(read);
+	CleanupStack::Pop(); // pop the CPcktListReadAllAttempt
+	
+	// return the CBufBase size to client
+	*aBufSize=(read->iListBuf)->Size();
+	
+	// Complete first phase of list retrieval
+	ReqCompleted(aTsyReqHandle,KErrNone);
+	CleanupStack::PopAndDestroy(); // pop&destroy list
+	
+	return KErrNone;
+	}
+
+TInt CSimPacketService::GetMbmsMonitoredServicesListPhase2(const TTsyReqHandle aTsyReqHandle,TClientId* aClient, TDes8* aBuf)
+/**
+* client's interest in retrieving the MBMS Service Monitoring list.
+* This function is the call for the second phase of 2 phase retrieval.
+* 
+* @param aTsyReqHandle Tsy Request handle for the client cancel request
+* @param aAction TClientId to be used
+* @param aBuf buffer for the actual list to be populated.
+* @return KErrNone
+*/
+	{
+	LOGPACKET1("CSimPacketService::GetMbmsMonitoredServicesListPhase2 called");
+	CPcktListReadAllAttempt* read=NULL;
+	// Find the get MBMS Monitor Service List from this client
+	for (TInt i=0; i<iMbmsServicesList->Count(); ++i)
+		{
+		read = iMbmsServicesList->At(i);
+		if ((read->iClient.iSessionHandle==aClient->iSessionHandle) &&
+		    (read->iClient.iSubSessionHandle==aClient->iSubSessionHandle))
+			{
+			TPtr8 bufPtr((read->iListBuf)->Ptr(0));
+			// Copy the streamed list to the client
+			aBuf->Copy(bufPtr);
+			delete read;
+			
+			iMbmsServicesList->Delete(i);
+			ReqCompleted(aTsyReqHandle,KErrNone);
+			return KErrNone;
+			}
+		}
+	// Should handle error case of not finding the matching client from read all phase 1
+	return KErrNotFound;
+	}
+	
+TInt CSimPacketService::GetMbmsMonitoredServicesListCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+* client's interest in canceling the retrieval of the MBMS Service Monitoring list.
+* 
+* @param aTsyReqHandle Tsy Request handle for the client cancel request
+* @return KErrNone
+*/
+	{
+	LOGPACKET1("CSimPacketService::GetMbmsMonitoredServicesListCancel called");
+	// Remove the read all attempt from iGetMbmsMonitoredServices
+
+	CPcktListReadAllAttempt* read=NULL;
+	for (TInt i=0; i<iMbmsServicesList->Count(); ++i)
+		{
+		read = iMbmsServicesList->At(i);
+		if (read->iReqHandle == aTsyReqHandle)
+			{
+			delete read;
+			iMbmsServicesList->Delete(i);
+			break;
+			}
+		}
+	ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+
+TInt CSimPacketService::EnumerateMbmsMonitorServiceList(const TTsyReqHandle aTsyReqHandle, TInt* aCount, TInt* aMaxAllowed)
+/**
+* client's interest in retrieving the information regarding the MBMS Monitoring Service list.
+* 
+* @param aTsyReqHandle Tsy Request handle for the client cancel request
+* @param aCount count of the MBMS monitoring services in the list
+* @param aMaxAllowed maximum MBMS monitoring services allowed
+* @return KErrNone
+*/
+	{
+	LOGPACKET1("CSimPacketService::EnumerateMbmsMonitorServiceList called");
+	*aCount = iMbmsMonitorListCount;
+	*aMaxAllowed = KMaxMbmsMonitorContexts;
+	iEnumerateMonitorListReqHandle = aTsyReqHandle;
+	return KErrNone;
+	}
+
+TInt CSimPacketService::EnumerateMbmsMonitorServiceListCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+* client's interest in canceling the enumeration the MBMS Service Monitoring list.
+* This function is just a dummy function.
+* 
+* @param aTsyReqHandle Tsy Request handle for the client cancel request
+* @return KErrNone
+*/
+	{
+	if(iEnumerateMonitorListReqHandle == aTsyReqHandle)
+		{
+		ReqCompleted(iEnumerateMonitorListReqHandle,KErrCancel);
+		}
+	else
+		{
+		ReqCompleted(iEnumerateMonitorListReqHandle,KErrCorrupt);
+		}
+	return KErrNone;
+	}
+	
+TInt CSimPacketService::EnumerateMbmsActiveServiceList(const TTsyReqHandle aTsyReqHandle, TInt* aCount, TInt* aMaxAllowed)
+/**
+* client's interest in retrieving the information regarding the MBMS Active Service list.
+* 
+* @param aTsyReqHandle Tsy Request handle for the client cancel request
+* @param aCount count of the MBMS active services in the list
+* @param aMaxAllowed maximum MBMS active services allowed
+* @return KErrNone
+*/
+	{
+	LOGPACKET1("CSimPacketService::EnumerateMbmsActiveServiceList called");
+	*aCount = iMbmsNifWrappers.Count(); // The NifWrapper contains the list of mbmsContexts that are activated.
+	*aMaxAllowed = KMaxMbmsActiveContexts;
+	iEnumerateActiveListReqHandle = aTsyReqHandle;
+	return KErrNone;
+	}
+
+TInt CSimPacketService::EnumerateMbmsActiveServiceListCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+* client's interest in canceling the enumeration the MBMS Service active list.
+* This function is just a dummy function.
+* 
+* @param aTsyReqHandle Tsy Request handle for the client cancel request
+* @return KErrNone
+*/
+	{
+	if(iEnumerateActiveListReqHandle == aTsyReqHandle)
+		{
+		ReqCompleted(iEnumerateActiveListReqHandle,KErrCancel);
+		}
+	else
+		{
+		ReqCompleted(iEnumerateActiveListReqHandle,KErrCorrupt);
+		}
+	return KErrNone;
+	}	
+		
+/**
+* A CSimPacketContext object has been destroyed - this method will be called in its 
+* destructor
+*/
+void CSimPacketService::DecrementContextCount()
+	{
+	iContextCount--;
+	}
+
+/**
+* A CSimPacketContext object has been destroyed - this method will be called in its 
+* destructor
+*/
+void CSimPacketService::DecrementMbmsContextCount()
+	{
+	iMbmsContextCount--;
+	}
+
+