telephonyserverplugins/simtsy/inc/CSimPacketContext.h
branchopencode
changeset 24 6638e7f4bd8f
parent 19 1f776524b15c
--- a/telephonyserverplugins/simtsy/inc/CSimPacketContext.h	Mon May 03 13:37:20 2010 +0300
+++ b/telephonyserverplugins/simtsy/inc/CSimPacketContext.h	Thu May 06 15:10:38 2010 +0100
@@ -1,466 +1,466 @@
-// Copyright (c) 2002-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:
-// This file contains the definitions of the Simulator TSY Packet Context class.
-// 
-//
-
-/**
- @file
- @internalAll
-*/
-
-#ifndef __CSIMPACKETCONTEXT_H__
-#define __CSIMPACKETCONTEXT_H__
-
-#include <et_phone.h>
-#include <etelpckt.h>
-#include <testconfigfileparser.h>
-#include "csimtimer.h"
-#include "utils.h"
-#include "CSimNtras.h"
-#include "CSimPubSubChange.h"
-#include "CSimPhone.h"
-#include <ctsy/serviceapi/cmmutility.h>
-
-const TUint KNotFound=0xfffffff;
-const TInt KLimitForErrorCodeForContextGoToInactive=-700;
-const TInt KContextGoToInactiveWithNormalErrorCode=-600;
-const TInt KContextGoToInactiveWithExtendedErrorCode=-400;
-const TInt KContextGoToInactiveWithErrorWhenTryingToGetLastErrorCode = -300;
-
-enum TContextEvent //< Enum for the state machine
-	{
-	EContextEventNone,
-	EContextEventActivate,
-	EContextEventDeactivate,
-	EContextEventDoDeactivate,
-	EContextEventSuspend,
-	EContextEventDelete,
-	EContextEventNtRas,
-	EContextEventTimeOut
-	};	
-
-const RPacketContext::TContextStatus KContextStateTableTerminator=(RPacketContext::TContextStatus)999;
-
-struct TContextStateChangeValidity
-	{
-	RPacketContext::TContextStatus iOldState;
-	RPacketContext::TContextStatus iNewState;
-	TInt iError;
-	};
-
-//< This table is used to ensure that the TSY state changes are as accurate as possibly
-//< It makes sure that there is no state irregularities and the TSY does not skip any state.
-//< Returns KErrNone for a valid change state request (3rd column).
-const struct TContextStateChangeValidity	KContextStateChangeValidity[]= {
-	{ RPacketContext::EStatusInactive,		RPacketContext::EStatusActivating,	KErrNone },
-	{ RPacketContext::EStatusInactive,		RPacketContext::EStatusDeleted,	KErrNone },
-
-	{ RPacketContext::EStatusActivating,	RPacketContext::EStatusActive,		KErrNone },
-	{ RPacketContext::EStatusActivating,	RPacketContext::EStatusInactive,	KErrNone },
-	{ RPacketContext::EStatusActivating,	RPacketContext::EStatusDeleted,	KErrNone },
-	
-	{ RPacketContext::EStatusActive,		RPacketContext::EStatusDeactivating, KErrNone },
-	{ RPacketContext::EStatusActive,		RPacketContext::EStatusSuspended,	KErrNone },
-	{ RPacketContext::EStatusActive,		RPacketContext::EStatusDeleted,	KErrNone },
-
-	{ RPacketContext::EStatusDeactivating,	RPacketContext::EStatusInactive,	KErrNone },
-	{ RPacketContext::EStatusDeactivating,	RPacketContext::EStatusActive,		KErrNone },
-	{ RPacketContext::EStatusDeactivating,	RPacketContext::EStatusDeleted,	KErrNone },
-
-	{ RPacketContext::EStatusSuspended,		RPacketContext::EStatusDeactivating, KErrNone },
-	{ RPacketContext::EStatusSuspended,		RPacketContext::EStatusActive,		KErrNone },
-	{ RPacketContext::EStatusSuspended,		RPacketContext::EStatusDeleted,	KErrNone },
-
-	{ RPacketContext::EStatusDeleted,		RPacketContext::EStatusInactive,	KErrNone },
-
-
-	{ KContextStateTableTerminator,			KContextStateTableTerminator,		KContextStateTableTerminator}
-	};
-
-
-struct TProtocolConfigOption	// used for authentication parameters 
-	{
-	TInt	iAuthProtocol;
-	TPtrC8	iUsername;
-	TPtrC8	iPassword;
-	TPtrC8	iChallenge;
-	TPtrC8	iResponse;
-	TPtrC8	iPrimaryDNS;
-	TPtrC8	iSecondaryDNS;
-	TUint	iId;
-	RPacketContext::TMiscProtocolBuffer iMiscBuffer;
-	};
-
-/**
-Used for holding valid GPRS/R99/R4/R99/R5 context configuration parameters
-*/
-struct TContextConfigParam
-	{
-	TInt	iProtocolType;
-	TPtrC8	iGsnAddress;
-	TPtrC8	iProtocolAddress;
-	TInt	iAnonymousAccess;
-	TBool	iUseEdge;
-	TProtocolConfigOption iProtocolConfigOption;
-	TUint	iPdpHeaderCompression;
-	TUint	iPdpDataCompression;
-	};
-
-struct TConfigFail		// Used for failing SetConfig, DeleteTFT, CreateTFT, AddPacketFilter call
-	{
-	TName iContextName;
-	TInt32 iNumberOfTimes;
-	TInt32 iFailErrorCode;
-	};
-	
-struct TTftConfig
-	{
-	TName iContextName;
-	TInt32 iNumberOfFailures;
-	TInt32 iFailErrorCode;
-	TInt32 iDelay;
-	};
-
-struct TRel99ContextConfig		// Used holding the Rel99 configuration parameters
-	{
-		TName iContextName;
-		TUint iActivatePause;
-		TInt iActivateErrorCode;
-		TUint iDeactivatePause;
-		TUint iDeactivateErrorCode;
-		TUint iDeletionPause;
-		TUint iDeletionErrorCode;
-		TBool iConnectToNtRas;
-	};
-
-struct TNetworkRegStatus			// Used for holding the network registration
-	{
-		TInt iDuration;				
-		RPacketService::TRegistrationStatus iRegStatus;
-	};
-
-struct TNotifyContextStatusChange		// Used for notifying context status
-	{
-		TName iContextName;
-		TInt  iDuration;
-		RPacketContext::TContextStatus iStatus;
-	};
-
-struct TPacketFilterV3					// Used for holding packet filter configuration
-	{
-		TInt iId;							//< Packet filter identifier. Value range: 1 - 8
-		TInt iEvaluationPrecedenceIndex;	//< Evaluation Precedence Index. Value range: 255 (lowest) - 0 (highest)
-		TUint8 iSrcAddr[RPacketContext::KIPAddressSize];				//< Domain Source address
-		TUint8 iSrcAddrSubnetMask[RPacketContext::KIPAddressSize];		//< Domain Subnet mask
-		TInt iProtocolNumberOrNextHeader;	//< Protocol number (IPv4) or Next Header (IPv6) field of incoming packets. Value range 0 - 255
-		TInt iSrcPortMin;					//< Minimum source port number of incoming packets. Value range 0 - 65 535
-		TInt iSrcPortMax;					//< Maximum source port number of incoming packets. Value range 0 - 65 535
-		TInt iDestPortMin;					//< Lowest destination port number of incoming packets. Value range 0 - 65 535
-		TInt iDestPortMax;					//< Maximum destination port number of incoming packets. Value range 0 - 65 535
-		TUint32 iIPSecSPI;					//< Security Parameter Index, 32-bit field.
-		TUint16 iTOSorTrafficClass;			//< Type of Service (IPv4) or Traffic Class (IPv6). 1 octet TOS/Traffic class + 1 octet TOS/Traffic class Mask.
-		TUint32 iFlowLabel;		
-		TBool iAdded;
-		RPacketContext::TPacketFilterType iFilterType;
-	};
-
-struct TAuthorizationTokenResponse  //< Used for SIMTSY responses for authorization tokens
-	{
-	RPacketContext::TAuthorizationToken iAuthorizationToken;
-	TInt iResponse;
-	};
-
-/**
- * This class is used to hold the details of batch read requests between the first and
- * second phases of a "two phase read".  During the first phase, an instance of this class
- * is created containing a unique identifier to the request and the resulting information.
- * Once the second phase operation has identified this instance from a list and completed
- * the client request, this instance will be deleted.
- */
-class CPcktListReadAllAttempt : public CBase
-	{
-public:
-	static CPcktListReadAllAttempt* NewL(TClientId& aId, TTsyReqHandle aReqHandle);
-	~CPcktListReadAllAttempt();
-
-protected:
-	CPcktListReadAllAttempt(TClientId& aId, TTsyReqHandle aReqHandle);
-
-private:
-	void ConstructL();
-
-public:
-	CBufBase* iListBuf;					// < The result of the read operation.
-	TClientId iClient;					// < A unique identifier of the read request.
-	TTsyReqHandle iReqHandle;			// < The first phase request handle.
-	};
-
-
-class CSimPacketService;
-class CSimPacketQoS;
-class CATDialGPRSData;
-class CSimPacketContext : public CSubSessionExtBase, public MTimerCallBack, public MNTRasCallBack, public MPubSubChangeCallback
-	{
-public:
-	static CSimPacketContext* NewL(CSimPhone* aPhone, CSimPacketService* aPacketService, const TDesC& aContextName);
-	CSimPacketContext(CSimPhone* aPhone, CSimPacketService* aPacketService, const TName& aContextName);
-	void ConstructL();
-	~CSimPacketContext();
-
-	virtual TInt ExtFunc(const TTsyReqHandle aTsyReqHandle,const TInt aIpc,const TDataPackage& aPackage);
-	virtual TReqMode ReqModeL(const TInt aIpc);
-	virtual CTelObject* OpenNewObjectByNameL(const TDesC& aName);
-	virtual CTelObject* OpenNewObjectL(TDes& aNewName);
-	virtual TInt CancelService(const TInt aIpc, const TTsyReqHandle aTsyReqHandle);
-	virtual void Init();
-	virtual TInt RegisterNotification(const TInt aIpc);
-	virtual TInt DeregisterNotification(const TInt aIpc);
-	virtual TInt NumberOfSlotsL(const TInt aIpc);
-
-	TInt AttemptDeactivateImmediately();
-	
-	TInt ChangeState(RPacketContext::TContextStatus aNewState); //< Changes the state of the packetcontext
-	const CTestConfigSection* CfgFile();
-	TInt ReActivate(CSimPacketService* aPacketService, const TName& aContextName);
-
-	void ConstructPacketFiltersL();
-
-	void PubSubCallback(TInt aId);
-
-private:
-	TInt GetProfileName(const TTsyReqHandle aTsyReqHandle, TName* aQoSProfile);
-
-	TInt SetConfig(const TTsyReqHandle aTsyReqHandle,const TDesC8* aConfig);
-	TInt SetConfigCancel(const TTsyReqHandle aTsyReqHandle);
-
-	TInt GetConfig(const TTsyReqHandle aTsyReqHandle,TDes8* aConfig);
-	TInt GetConfigCancel(const TTsyReqHandle aTsyReqHandle);
-
-	TInt NotifyConfigChanged(const TTsyReqHandle aTsyReqHandle, TDes8* aConfig);
-	TInt NotifyConfigChangedCancel(const TTsyReqHandle aTsyReqHandle);
-
-	TInt Activate(const TTsyReqHandle aTsyReqHandle);
-	TInt ActivateCancel(const TTsyReqHandle aTsyReqHandle);
-
-	TInt Deactivate(const TTsyReqHandle aTsyReqHandle);
-	TInt DeactivateCancel(const TTsyReqHandle aTsyReqHandle);
-
-	TInt Delete(const TTsyReqHandle aTsyReqHandle);
-	TInt DeleteCancel(const TTsyReqHandle aTsyReqHandle);
-
-	TInt LoanCommPort(const TTsyReqHandle aTsyReqHandle,RCall::TCommPort* aDataPort);
-	TInt LoanCommPortCancel(const TTsyReqHandle aTsyReqHandle);
-	TInt RecoverCommPort(const TTsyReqHandle aTsyReqHandle);
-	TInt RecoverCommPortCancel(const TTsyReqHandle aTsyReqHandle);
-
-	TInt GetStatus(const TTsyReqHandle aTsyReqHandle,RPacketContext::TContextStatus* aContextStatus);
-	TInt NotifyStatusChange(const TTsyReqHandle aTsyReqHandle,RPacketContext::TContextStatus* aContextStatus);
-	TInt NotifyStatusChangeCancel(const TTsyReqHandle aTsyReqHandle);
-
-	TInt GetDataVolumeTransferred(const TTsyReqHandle aTsyReqHandle,RPacketContext::TDataVolume* aVolume); 
-	TInt NotifyDataTransferred(const TTsyReqHandle aTsyReqHandle, RPacketContext::TDataVolume* aVolume, RPacketContext::TNotifyDataTransferredRequest* aData); 
-	TInt NotifyDataTransferredCancel(const TTsyReqHandle aTsyReqHandle); 
-
-	TInt GetLastErrorCause(const TTsyReqHandle aTsyReqHandle,TInt* aError);
-
-	IMPORT_C static TInt OpenNewSecondaryContext(CSimPacketService& aPacketService, 
-												const TDesC& anExistingContextName,
-												TDes& aNewContextName);
-
-	TInt CreateNewTFT(const TTsyReqHandle aTsyReqHandle, const TInt* aSize);
-	TInt DoCreateNewTFT();
-	TInt DeleteTFT(const TTsyReqHandle aTsyReqHandle);
-	TInt EnumeratePacketFilters(const TTsyReqHandle aTsyReqHandle, TInt& aCount);
-	TInt GetPacketFilterInfoL(const TTsyReqHandle aTsyReqHandle, TInt aIndex, TDes8* aPacketFilterInfo);
-	TInt AddPacketFilter(const TTsyReqHandle aTsyReqHandle, const TDesC8* aPacketFilterInfo);
-	TInt RemovePacketFilter(const TTsyReqHandle aTsyReqHandle, TInt aId);
-	TInt ModifyActiveContext(const TTsyReqHandle aTsyReqHandle);
-	TInt InitialiseContext(const TTsyReqHandle aTsyReqHandle, TDes8* aDataChannelV2Pckg); // This method supersedes the LoanCommPort() and RecoverCommPort() methods.
-	TInt DoInitialiseContext();
-	TInt GetDnsInfo(const TTsyReqHandle aTsyReqHandle, const TDesC8* aDnsInfo);			// retrieves primary and secondary DNS server names
-	TInt GetAddMediaAuthorization(const TTsyReqHandle aTsyReqHandle, TDes8* aBuffer);
-	TInt GetRemoveMediaAuthorization(const TTsyReqHandle aTsyReqHandle, RPacketContext::TAuthorizationToken* aAuthorizationToken);
-	TInt GetAddMediaAuthorizationCancel(const TTsyReqHandle aTsyReqHandle);
-	TInt GetRemoveMediaAuthorizationCancel(const TTsyReqHandle aTsyReqHandle);
-
-	TInt CreateNewTFTCancel(const TTsyReqHandle aTsyReqHandle);
-	TInt DeleteTFTCancel(const TTsyReqHandle aTsyReqHandle);
-	TInt EnumeratePacketFiltersCancel(const TTsyReqHandle aTsyReqHandle);
-	TInt GetPacketFilterInfoCancel(const TTsyReqHandle aTsyReqHandle);
-	TInt AddPacketFilterCancel(const TTsyReqHandle aTsyReqHandle);
-	TInt RemovePacketFilterCancel(const TTsyReqHandle aTsyReqHandle);
-	TInt ModifyActiveContextCancel(const TTsyReqHandle aTsyReqHandle);
-	TInt InitialiseContextCancel(const TTsyReqHandle aTsyReqHandle); // This method supersedes the LoanCommPort() and RecoverCommPort() methods.
-	TInt GetDnsInfoCancel(const TTsyReqHandle aTsyReqHandle);
-	
-	void TimerCallBackNotifyContextStatusChange();
-
-	void CompleteContextStatusChange(RPacketContext::TContextStatus& aStatus);
-	CSimPubSubChange *iContextStatusChange;
-
-private:
-
-	CSimPhone* iPhone;
-
-	TBool iDeleted;		//< Used to indicate whether this context is deleted or not
-	TBool iIsActive;	//< Used to indicate whether this context is active as only one 
-						//< context can be active at any one time.
-
-	CSimPacketService* iPacketService;	//< Pointer to the parent class
-	CSimPacketQoS* iPacketqos;			//< Pointer to the qos associated with this context
-	CSimNtRas* iNtRas;					//< pointer to the NtRas class that uses ntras to connect to network
-	TName iContextName;					//< Current Packet context name
-	TName iQoSName;
-	CSimTimer* iTimer;					//< pointer to the timer object
-	CSimTimer* iNotifyContextStatusChangeTimer;
-	CSimTimer* iNotifyContextConfigChangeTimer;
-	CSimTimer* iSetConfigTimer;
-	CSimTimer* iInitContextTimer;
-	CSimTimer* iCreateTftTimer;
-
-	TNotifyData	iNotifyStatusChange;					//< Holds the notification data (a flag, TsyReqHandle and any raw data) 
-	CArrayFixFlat<TContextConfigParam>* iContextConfigParams;	//< Pointer to a list of valid Context (GPRS/R99/R5) config parameters
-
-	CArrayFixFlat<TRel99ContextConfig>* iContextConfigsRel99;
-	TBool iTFTCreated;
-	TInt iNumTFTsCreated;
-	TInt iNumFiltersAdded;
-	CArrayFixFlat<TPacketFilterV3>* iPacketFilterInfoArray;
-	TInt GetContextStatusChangeCount();
-	TNotifyContextStatusChange& GetContextStatusChangeAt(TInt aIndex);
-	CArrayFixFlat<TNotifyContextStatusChange>* iNotifyContextStatusChangeArray;
-	CArrayFixFlat<TAuthorizationTokenResponse>* iAuthorizationTokenResponse; //< Holds tokens and desired responses for SIMTSY to report
-	CArrayFixFlat<RPacketContext::CTFTMediaAuthorizationV3>* iMediaAuthorization; //< Contains authorization token and flow Ids for verification
-
-	TInt iContextConfigParamsIndex;						//< index in iContextConfigParams
-
-
-	TNotifyData	iNotifyConfigGPRS;		//< Holds the GPRS context config change notification data (a flag, TsyReqHandle and any raw data) 
-	TNotifyData	iNotifyConfigR99;		//< Holds the R99 context config changenotification data (a flag, TsyReqHandle and any raw data)
-	TNotifyData	iNotifyConfigR5;		//< Holds the R5 context config changenotification data (a flag, TsyReqHandle and any raw data)
-	
-	TTsyReqHandle iActivateRequestHandle;	//< Request handle used for activating a context
-	TTsyReqHandle iDeactivateRequestHandle;	//< Request handle used for deactivating a context
-	TTsyReqHandle iDeleteRequestHandle;		//< Request handle used to complete a delete request
-	TBool iCommPortLoaned;		//< A flag indicating whether the CommPort is loaned.
-	TContextEvent iCurrentEvent;			//< holds the current event taking place. 
-
-	TInt iActivatePause;		//< duration spent in activating the context
-	TInt iActivateFail;			//< Fail the activate request with this error
-	TInt iDeactivatePause;		//< duration spent in deactivating the context
-	TInt iDeactivateFail;		//< Fail the deactivate request with this error
-	TInt iDeletePause;			//< duration spent in deleting the context
-	TInt iDeleteFail;			//< Fail the delete request with this error
-
-	TInt iQoSObjectCount;		//< used to append a number to the QoS object created
-
-	TConfigFail iSetConfigFail;
-	TConfigFail iDeleteTftFail;
-	TTftConfig iCreateTftConfig;
-	TConfigFail iAddPacketFilter;
-	
-	TInt iSetConfigDelay;
-	
-	class TNotifyContextConfigChangeData
-		{
-		public:
-		TInt iDelay;
-		TInt iNewContextConfigIndex;
-		};
-	CArrayFixFlat<TNotifyContextConfigChangeData> *iNotifyContextConfigChangeArray;
-	
-	class TSetConfigData
-		{
-		public:
-		static TInt Find(CArrayFixFlat<TSetConfigData>* aSetConfigArray, TTsyReqHandle aTsyReqHandle, TInt& aIndex);
-		TTsyReqHandle iTsyReqHandle;
-		TDesC8* iData;
-		};
-	CArrayFixFlat<TSetConfigData> *iSetConfigData;
-
-	class TCreateTftData
-		{
-		public:
-		TTsyReqHandle iTsyReqHandle;
-		TInt iSize;
-		};
-	TCreateTftData iCreateTftData;
-
-	TInt iSetConfigCallCount;
-	TInt iContextType;
-	TBool iTFTChangeBool;
-	TBool iCommReset;
-	TInt iNotifyContextStatusChangeIndex;
-	RPacketContext::TContextStatus iCurrentNotifyContextStatusChange;
-	TNotificationType iNotifyContextStatusChangeType;
-
-private:
-	virtual void NTRasCallBack(TInt aStatus);
-	TInt ActionEvent(TContextEvent aEvent,TInt aStatus);
-	RPacketService::TStatus ConvertToPacketServiceStatus(RPacketContext::TContextStatus aNewState);
-
-	TInt DoActivate();		//< this is where we try to connect to a network using ntras
-	TInt DoDeactivate();	//< deactivates the context by clossing the comm port
-	TInt DoDelete();		//< deletes the context
-
-	void GetCommSetupSettingsL();
-	void GetContextConfigParamSettingsL(TPtrC8 aTag);
-	void GetActivateSettings();
-	void GetSetConfigSettings();
-	void GetPacketFilterSettings();
-	void GetContextConfigRel99SettingsL();
-	void GetContextStatusChangeSettingsL();
-	void GetContextConfigChangeSettingsL();
-
-public:
-	TName ContextName() const;
-	inline TInt ContextType() const {return iContextType;  }
-	inline RPacketContext::TContextStatus ContextStatus() const {return iState; }
-	
-protected:
-	
-	RPacketContext::TContextStatus iState;				//< Holds the current state of the packet context
-
-	class TCommSetupItem
-		{
-		public:
-			TFileName iCsyName;					//< The CSY name used for comm communication
-			TCommConfigV01 iConfig;				//< The configuration to be used with the NTRas port.
-			TName iPortName;					//< The port to be used for read / write data read from the config file.
-			TName iContextName;
-			TBool iCommReset;
-			TInt iNumInitializeFailures;
-			TInt iErrorCode;
-			TInt iDelay;
-		};
-
-	class TInitContextData
-		{
-		public:
-		TTsyReqHandle iTsyReqHandle;
-		TDesC8* iChannel;
-		};
-	TInitContextData iInitContextData;
-	
-	CArrayFixFlat<TCommSetupItem>* iCommSetupArray;
-	virtual void TimerCallBack(TInt aId);
-	TCommSetupItem FindCommSettings();
-
-private:
-    TInt iLastError;
-    TInt iErrorCodeForGetLastErrorCause;
-	};
-
-#endif
+// Copyright (c) 2002-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:
+// This file contains the definitions of the Simulator TSY Packet Context class.
+// 
+//
+
+/**
+ @file
+ @internalAll
+*/
+
+#ifndef __CSIMPACKETCONTEXT_H__
+#define __CSIMPACKETCONTEXT_H__
+
+#include <et_phone.h>
+#include <etelpckt.h>
+#include <testconfigfileparser.h>
+#include "csimtimer.h"
+#include "utils.h"
+#include "CSimNtras.h"
+#include "CSimPubSubChange.h"
+#include "CSimPhone.h"
+#include <ctsy/serviceapi/cmmutility.h>
+
+const TUint KNotFound=0xfffffff;
+const TInt KLimitForErrorCodeForContextGoToInactive=-700;
+const TInt KContextGoToInactiveWithNormalErrorCode=-600;
+const TInt KContextGoToInactiveWithExtendedErrorCode=-400;
+const TInt KContextGoToInactiveWithErrorWhenTryingToGetLastErrorCode = -300;
+
+enum TContextEvent //< Enum for the state machine
+	{
+	EContextEventNone,
+	EContextEventActivate,
+	EContextEventDeactivate,
+	EContextEventDoDeactivate,
+	EContextEventSuspend,
+	EContextEventDelete,
+	EContextEventNtRas,
+	EContextEventTimeOut
+	};	
+
+const RPacketContext::TContextStatus KContextStateTableTerminator=(RPacketContext::TContextStatus)999;
+
+struct TContextStateChangeValidity
+	{
+	RPacketContext::TContextStatus iOldState;
+	RPacketContext::TContextStatus iNewState;
+	TInt iError;
+	};
+
+//< This table is used to ensure that the TSY state changes are as accurate as possibly
+//< It makes sure that there is no state irregularities and the TSY does not skip any state.
+//< Returns KErrNone for a valid change state request (3rd column).
+const struct TContextStateChangeValidity	KContextStateChangeValidity[]= {
+	{ RPacketContext::EStatusInactive,		RPacketContext::EStatusActivating,	KErrNone },
+	{ RPacketContext::EStatusInactive,		RPacketContext::EStatusDeleted,	KErrNone },
+
+	{ RPacketContext::EStatusActivating,	RPacketContext::EStatusActive,		KErrNone },
+	{ RPacketContext::EStatusActivating,	RPacketContext::EStatusInactive,	KErrNone },
+	{ RPacketContext::EStatusActivating,	RPacketContext::EStatusDeleted,	KErrNone },
+	
+	{ RPacketContext::EStatusActive,		RPacketContext::EStatusDeactivating, KErrNone },
+	{ RPacketContext::EStatusActive,		RPacketContext::EStatusSuspended,	KErrNone },
+	{ RPacketContext::EStatusActive,		RPacketContext::EStatusDeleted,	KErrNone },
+
+	{ RPacketContext::EStatusDeactivating,	RPacketContext::EStatusInactive,	KErrNone },
+	{ RPacketContext::EStatusDeactivating,	RPacketContext::EStatusActive,		KErrNone },
+	{ RPacketContext::EStatusDeactivating,	RPacketContext::EStatusDeleted,	KErrNone },
+
+	{ RPacketContext::EStatusSuspended,		RPacketContext::EStatusDeactivating, KErrNone },
+	{ RPacketContext::EStatusSuspended,		RPacketContext::EStatusActive,		KErrNone },
+	{ RPacketContext::EStatusSuspended,		RPacketContext::EStatusDeleted,	KErrNone },
+
+	{ RPacketContext::EStatusDeleted,		RPacketContext::EStatusInactive,	KErrNone },
+
+
+	{ KContextStateTableTerminator,			KContextStateTableTerminator,		KContextStateTableTerminator}
+	};
+
+
+struct TProtocolConfigOption	// used for authentication parameters 
+	{
+	TInt	iAuthProtocol;
+	TPtrC8	iUsername;
+	TPtrC8	iPassword;
+	TPtrC8	iChallenge;
+	TPtrC8	iResponse;
+	TPtrC8	iPrimaryDNS;
+	TPtrC8	iSecondaryDNS;
+	TUint	iId;
+	RPacketContext::TMiscProtocolBuffer iMiscBuffer;
+	};
+
+/**
+Used for holding valid GPRS/R99/R4/R99/R5 context configuration parameters
+*/
+struct TContextConfigParam
+	{
+	TInt	iProtocolType;
+	TPtrC8	iGsnAddress;
+	TPtrC8	iProtocolAddress;
+	TInt	iAnonymousAccess;
+	TBool	iUseEdge;
+	TProtocolConfigOption iProtocolConfigOption;
+	TUint	iPdpHeaderCompression;
+	TUint	iPdpDataCompression;
+	};
+
+struct TConfigFail		// Used for failing SetConfig, DeleteTFT, CreateTFT, AddPacketFilter call
+	{
+	TName iContextName;
+	TInt32 iNumberOfTimes;
+	TInt32 iFailErrorCode;
+	};
+	
+struct TTftConfig
+	{
+	TName iContextName;
+	TInt32 iNumberOfFailures;
+	TInt32 iFailErrorCode;
+	TInt32 iDelay;
+	};
+
+struct TRel99ContextConfig		// Used holding the Rel99 configuration parameters
+	{
+		TName iContextName;
+		TUint iActivatePause;
+		TInt iActivateErrorCode;
+		TUint iDeactivatePause;
+		TUint iDeactivateErrorCode;
+		TUint iDeletionPause;
+		TUint iDeletionErrorCode;
+		TBool iConnectToNtRas;
+	};
+
+struct TNetworkRegStatus			// Used for holding the network registration
+	{
+		TInt iDuration;				
+		RPacketService::TRegistrationStatus iRegStatus;
+	};
+
+struct TNotifyContextStatusChange		// Used for notifying context status
+	{
+		TName iContextName;
+		TInt  iDuration;
+		RPacketContext::TContextStatus iStatus;
+	};
+
+struct TPacketFilterV3					// Used for holding packet filter configuration
+	{
+		TInt iId;							//< Packet filter identifier. Value range: 1 - 8
+		TInt iEvaluationPrecedenceIndex;	//< Evaluation Precedence Index. Value range: 255 (lowest) - 0 (highest)
+		TUint8 iSrcAddr[RPacketContext::KIPAddressSize];				//< Domain Source address
+		TUint8 iSrcAddrSubnetMask[RPacketContext::KIPAddressSize];		//< Domain Subnet mask
+		TInt iProtocolNumberOrNextHeader;	//< Protocol number (IPv4) or Next Header (IPv6) field of incoming packets. Value range 0 - 255
+		TInt iSrcPortMin;					//< Minimum source port number of incoming packets. Value range 0 - 65 535
+		TInt iSrcPortMax;					//< Maximum source port number of incoming packets. Value range 0 - 65 535
+		TInt iDestPortMin;					//< Lowest destination port number of incoming packets. Value range 0 - 65 535
+		TInt iDestPortMax;					//< Maximum destination port number of incoming packets. Value range 0 - 65 535
+		TUint32 iIPSecSPI;					//< Security Parameter Index, 32-bit field.
+		TUint16 iTOSorTrafficClass;			//< Type of Service (IPv4) or Traffic Class (IPv6). 1 octet TOS/Traffic class + 1 octet TOS/Traffic class Mask.
+		TUint32 iFlowLabel;		
+		TBool iAdded;
+		RPacketContext::TPacketFilterType iFilterType;
+	};
+
+struct TAuthorizationTokenResponse  //< Used for SIMTSY responses for authorization tokens
+	{
+	RPacketContext::TAuthorizationToken iAuthorizationToken;
+	TInt iResponse;
+	};
+
+/**
+ * This class is used to hold the details of batch read requests between the first and
+ * second phases of a "two phase read".  During the first phase, an instance of this class
+ * is created containing a unique identifier to the request and the resulting information.
+ * Once the second phase operation has identified this instance from a list and completed
+ * the client request, this instance will be deleted.
+ */
+class CPcktListReadAllAttempt : public CBase
+	{
+public:
+	static CPcktListReadAllAttempt* NewL(TClientId& aId, TTsyReqHandle aReqHandle);
+	~CPcktListReadAllAttempt();
+
+protected:
+	CPcktListReadAllAttempt(TClientId& aId, TTsyReqHandle aReqHandle);
+
+private:
+	void ConstructL();
+
+public:
+	CBufBase* iListBuf;					// < The result of the read operation.
+	TClientId iClient;					// < A unique identifier of the read request.
+	TTsyReqHandle iReqHandle;			// < The first phase request handle.
+	};
+
+
+class CSimPacketService;
+class CSimPacketQoS;
+class CATDialGPRSData;
+class CSimPacketContext : public CSubSessionExtBase, public MTimerCallBack, public MNTRasCallBack, public MPubSubChangeCallback
+	{
+public:
+	static CSimPacketContext* NewL(CSimPhone* aPhone, CSimPacketService* aPacketService, const TDesC& aContextName);
+	CSimPacketContext(CSimPhone* aPhone, CSimPacketService* aPacketService, const TName& aContextName);
+	void ConstructL();
+	~CSimPacketContext();
+
+	virtual TInt ExtFunc(const TTsyReqHandle aTsyReqHandle,const TInt aIpc,const TDataPackage& aPackage);
+	virtual TReqMode ReqModeL(const TInt aIpc);
+	virtual CTelObject* OpenNewObjectByNameL(const TDesC& aName);
+	virtual CTelObject* OpenNewObjectL(TDes& aNewName);
+	virtual TInt CancelService(const TInt aIpc, const TTsyReqHandle aTsyReqHandle);
+	virtual void Init();
+	virtual TInt RegisterNotification(const TInt aIpc);
+	virtual TInt DeregisterNotification(const TInt aIpc);
+	virtual TInt NumberOfSlotsL(const TInt aIpc);
+
+	TInt AttemptDeactivateImmediately();
+	
+	TInt ChangeState(RPacketContext::TContextStatus aNewState); //< Changes the state of the packetcontext
+	const CTestConfigSection* CfgFile();
+	TInt ReActivate(CSimPacketService* aPacketService, const TName& aContextName);
+
+	void ConstructPacketFiltersL();
+
+	void PubSubCallback(TInt aId);
+
+private:
+	TInt GetProfileName(const TTsyReqHandle aTsyReqHandle, TName* aQoSProfile);
+
+	TInt SetConfig(const TTsyReqHandle aTsyReqHandle,const TDesC8* aConfig);
+	TInt SetConfigCancel(const TTsyReqHandle aTsyReqHandle);
+
+	TInt GetConfig(const TTsyReqHandle aTsyReqHandle,TDes8* aConfig);
+	TInt GetConfigCancel(const TTsyReqHandle aTsyReqHandle);
+
+	TInt NotifyConfigChanged(const TTsyReqHandle aTsyReqHandle, TDes8* aConfig);
+	TInt NotifyConfigChangedCancel(const TTsyReqHandle aTsyReqHandle);
+
+	TInt Activate(const TTsyReqHandle aTsyReqHandle);
+	TInt ActivateCancel(const TTsyReqHandle aTsyReqHandle);
+
+	TInt Deactivate(const TTsyReqHandle aTsyReqHandle);
+	TInt DeactivateCancel(const TTsyReqHandle aTsyReqHandle);
+
+	TInt Delete(const TTsyReqHandle aTsyReqHandle);
+	TInt DeleteCancel(const TTsyReqHandle aTsyReqHandle);
+
+	TInt LoanCommPort(const TTsyReqHandle aTsyReqHandle,RCall::TCommPort* aDataPort);
+	TInt LoanCommPortCancel(const TTsyReqHandle aTsyReqHandle);
+	TInt RecoverCommPort(const TTsyReqHandle aTsyReqHandle);
+	TInt RecoverCommPortCancel(const TTsyReqHandle aTsyReqHandle);
+
+	TInt GetStatus(const TTsyReqHandle aTsyReqHandle,RPacketContext::TContextStatus* aContextStatus);
+	TInt NotifyStatusChange(const TTsyReqHandle aTsyReqHandle,RPacketContext::TContextStatus* aContextStatus);
+	TInt NotifyStatusChangeCancel(const TTsyReqHandle aTsyReqHandle);
+
+	TInt GetDataVolumeTransferred(const TTsyReqHandle aTsyReqHandle,RPacketContext::TDataVolume* aVolume); 
+	TInt NotifyDataTransferred(const TTsyReqHandle aTsyReqHandle, RPacketContext::TDataVolume* aVolume, RPacketContext::TNotifyDataTransferredRequest* aData); 
+	TInt NotifyDataTransferredCancel(const TTsyReqHandle aTsyReqHandle); 
+
+	TInt GetLastErrorCause(const TTsyReqHandle aTsyReqHandle,TInt* aError);
+
+	IMPORT_C static TInt OpenNewSecondaryContext(CSimPacketService& aPacketService, 
+												const TDesC& anExistingContextName,
+												TDes& aNewContextName);
+
+	TInt CreateNewTFT(const TTsyReqHandle aTsyReqHandle, const TInt* aSize);
+	TInt DoCreateNewTFT();
+	TInt DeleteTFT(const TTsyReqHandle aTsyReqHandle);
+	TInt EnumeratePacketFilters(const TTsyReqHandle aTsyReqHandle, TInt& aCount);
+	TInt GetPacketFilterInfoL(const TTsyReqHandle aTsyReqHandle, TInt aIndex, TDes8* aPacketFilterInfo);
+	TInt AddPacketFilter(const TTsyReqHandle aTsyReqHandle, const TDesC8* aPacketFilterInfo);
+	TInt RemovePacketFilter(const TTsyReqHandle aTsyReqHandle, TInt aId);
+	TInt ModifyActiveContext(const TTsyReqHandle aTsyReqHandle);
+	TInt InitialiseContext(const TTsyReqHandle aTsyReqHandle, TDes8* aDataChannelV2Pckg); // This method supersedes the LoanCommPort() and RecoverCommPort() methods.
+	TInt DoInitialiseContext();
+	TInt GetDnsInfo(const TTsyReqHandle aTsyReqHandle, const TDesC8* aDnsInfo);			// retrieves primary and secondary DNS server names
+	TInt GetAddMediaAuthorization(const TTsyReqHandle aTsyReqHandle, TDes8* aBuffer);
+	TInt GetRemoveMediaAuthorization(const TTsyReqHandle aTsyReqHandle, RPacketContext::TAuthorizationToken* aAuthorizationToken);
+	TInt GetAddMediaAuthorizationCancel(const TTsyReqHandle aTsyReqHandle);
+	TInt GetRemoveMediaAuthorizationCancel(const TTsyReqHandle aTsyReqHandle);
+
+	TInt CreateNewTFTCancel(const TTsyReqHandle aTsyReqHandle);
+	TInt DeleteTFTCancel(const TTsyReqHandle aTsyReqHandle);
+	TInt EnumeratePacketFiltersCancel(const TTsyReqHandle aTsyReqHandle);
+	TInt GetPacketFilterInfoCancel(const TTsyReqHandle aTsyReqHandle);
+	TInt AddPacketFilterCancel(const TTsyReqHandle aTsyReqHandle);
+	TInt RemovePacketFilterCancel(const TTsyReqHandle aTsyReqHandle);
+	TInt ModifyActiveContextCancel(const TTsyReqHandle aTsyReqHandle);
+	TInt InitialiseContextCancel(const TTsyReqHandle aTsyReqHandle); // This method supersedes the LoanCommPort() and RecoverCommPort() methods.
+	TInt GetDnsInfoCancel(const TTsyReqHandle aTsyReqHandle);
+	
+	void TimerCallBackNotifyContextStatusChange();
+
+	void CompleteContextStatusChange(RPacketContext::TContextStatus& aStatus);
+	CSimPubSubChange *iContextStatusChange;
+
+private:
+
+	CSimPhone* iPhone;
+
+	TBool iDeleted;		//< Used to indicate whether this context is deleted or not
+	TBool iIsActive;	//< Used to indicate whether this context is active as only one 
+						//< context can be active at any one time.
+
+	CSimPacketService* iPacketService;	//< Pointer to the parent class
+	CSimPacketQoS* iPacketqos;			//< Pointer to the qos associated with this context
+	CSimNtRas* iNtRas;					//< pointer to the NtRas class that uses ntras to connect to network
+	TName iContextName;					//< Current Packet context name
+	TName iQoSName;
+	CSimTimer* iTimer;					//< pointer to the timer object
+	CSimTimer* iNotifyContextStatusChangeTimer;
+	CSimTimer* iNotifyContextConfigChangeTimer;
+	CSimTimer* iSetConfigTimer;
+	CSimTimer* iInitContextTimer;
+	CSimTimer* iCreateTftTimer;
+
+	TNotifyData	iNotifyStatusChange;					//< Holds the notification data (a flag, TsyReqHandle and any raw data) 
+	CArrayFixFlat<TContextConfigParam>* iContextConfigParams;	//< Pointer to a list of valid Context (GPRS/R99/R5) config parameters
+
+	CArrayFixFlat<TRel99ContextConfig>* iContextConfigsRel99;
+	TBool iTFTCreated;
+	TInt iNumTFTsCreated;
+	TInt iNumFiltersAdded;
+	CArrayFixFlat<TPacketFilterV3>* iPacketFilterInfoArray;
+	TInt GetContextStatusChangeCount();
+	TNotifyContextStatusChange& GetContextStatusChangeAt(TInt aIndex);
+	CArrayFixFlat<TNotifyContextStatusChange>* iNotifyContextStatusChangeArray;
+	CArrayFixFlat<TAuthorizationTokenResponse>* iAuthorizationTokenResponse; //< Holds tokens and desired responses for SIMTSY to report
+	CArrayFixFlat<RPacketContext::CTFTMediaAuthorizationV3>* iMediaAuthorization; //< Contains authorization token and flow Ids for verification
+
+	TInt iContextConfigParamsIndex;						//< index in iContextConfigParams
+
+
+	TNotifyData	iNotifyConfigGPRS;		//< Holds the GPRS context config change notification data (a flag, TsyReqHandle and any raw data) 
+	TNotifyData	iNotifyConfigR99;		//< Holds the R99 context config changenotification data (a flag, TsyReqHandle and any raw data)
+	TNotifyData	iNotifyConfigR5;		//< Holds the R5 context config changenotification data (a flag, TsyReqHandle and any raw data)
+	
+	TTsyReqHandle iActivateRequestHandle;	//< Request handle used for activating a context
+	TTsyReqHandle iDeactivateRequestHandle;	//< Request handle used for deactivating a context
+	TTsyReqHandle iDeleteRequestHandle;		//< Request handle used to complete a delete request
+	TBool iCommPortLoaned;		//< A flag indicating whether the CommPort is loaned.
+	TContextEvent iCurrentEvent;			//< holds the current event taking place. 
+
+	TInt iActivatePause;		//< duration spent in activating the context
+	TInt iActivateFail;			//< Fail the activate request with this error
+	TInt iDeactivatePause;		//< duration spent in deactivating the context
+	TInt iDeactivateFail;		//< Fail the deactivate request with this error
+	TInt iDeletePause;			//< duration spent in deleting the context
+	TInt iDeleteFail;			//< Fail the delete request with this error
+
+	TInt iQoSObjectCount;		//< used to append a number to the QoS object created
+
+	TConfigFail iSetConfigFail;
+	TConfigFail iDeleteTftFail;
+	TTftConfig iCreateTftConfig;
+	TConfigFail iAddPacketFilter;
+	
+	TInt iSetConfigDelay;
+	
+	class TNotifyContextConfigChangeData
+		{
+		public:
+		TInt iDelay;
+		TInt iNewContextConfigIndex;
+		};
+	CArrayFixFlat<TNotifyContextConfigChangeData> *iNotifyContextConfigChangeArray;
+	
+	class TSetConfigData
+		{
+		public:
+		static TInt Find(CArrayFixFlat<TSetConfigData>* aSetConfigArray, TTsyReqHandle aTsyReqHandle, TInt& aIndex);
+		TTsyReqHandle iTsyReqHandle;
+		TDesC8* iData;
+		};
+	CArrayFixFlat<TSetConfigData> *iSetConfigData;
+
+	class TCreateTftData
+		{
+		public:
+		TTsyReqHandle iTsyReqHandle;
+		TInt iSize;
+		};
+	TCreateTftData iCreateTftData;
+
+	TInt iSetConfigCallCount;
+	TInt iContextType;
+	TBool iTFTChangeBool;
+	TBool iCommReset;
+	TInt iNotifyContextStatusChangeIndex;
+	RPacketContext::TContextStatus iCurrentNotifyContextStatusChange;
+	TNotificationType iNotifyContextStatusChangeType;
+
+private:
+	virtual void NTRasCallBack(TInt aStatus);
+	TInt ActionEvent(TContextEvent aEvent,TInt aStatus);
+	RPacketService::TStatus ConvertToPacketServiceStatus(RPacketContext::TContextStatus aNewState);
+
+	TInt DoActivate();		//< this is where we try to connect to a network using ntras
+	TInt DoDeactivate();	//< deactivates the context by clossing the comm port
+	TInt DoDelete();		//< deletes the context
+
+	void GetCommSetupSettingsL();
+	void GetContextConfigParamSettingsL(TPtrC8 aTag);
+	void GetActivateSettings();
+	void GetSetConfigSettings();
+	void GetPacketFilterSettings();
+	void GetContextConfigRel99SettingsL();
+	void GetContextStatusChangeSettingsL();
+	void GetContextConfigChangeSettingsL();
+
+public:
+	TName ContextName() const;
+	inline TInt ContextType() const {return iContextType;  }
+	inline RPacketContext::TContextStatus ContextStatus() const {return iState; }
+	
+protected:
+	
+	RPacketContext::TContextStatus iState;				//< Holds the current state of the packet context
+
+	class TCommSetupItem
+		{
+		public:
+			TFileName iCsyName;					//< The CSY name used for comm communication
+			TCommConfigV01 iConfig;				//< The configuration to be used with the NTRas port.
+			TName iPortName;					//< The port to be used for read / write data read from the config file.
+			TName iContextName;
+			TBool iCommReset;
+			TInt iNumInitializeFailures;
+			TInt iErrorCode;
+			TInt iDelay;
+		};
+
+	class TInitContextData
+		{
+		public:
+		TTsyReqHandle iTsyReqHandle;
+		TDesC8* iChannel;
+		};
+	TInitContextData iInitContextData;
+	
+	CArrayFixFlat<TCommSetupItem>* iCommSetupArray;
+	virtual void TimerCallBack(TInt aId);
+	TCommSetupItem FindCommSettings();
+
+private:
+    TInt iLastError;
+    TInt iErrorCodeForGetLastErrorCause;
+	};
+
+#endif