--- a/telephonyserverplugins/simtsy/src/CSimPacketContext.cpp Mon May 03 13:37:20 2010 +0300
+++ b/telephonyserverplugins/simtsy/src/CSimPacketContext.cpp Thu May 06 15:10:38 2010 +0100
@@ -1,3682 +1,3682 @@
-// 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 implementation of the Similator TSY Packet Context functionality.
-//
-//
-
-/**
- @file
-*/
-
-#include "Simlog.h"
-#include "CSimPhone.h"
-#include "CSimPacketContext.h"
-#include "CSimPacketService.h"
-#include "CSimPacketQoS.h"
-#include "utils.h"
-
-#include "CSimContextHelper.h"
-
-const TInt KUnsetInteger = 0;
-
-CPcktListReadAllAttempt* CPcktListReadAllAttempt::NewL(TClientId& aId, TTsyReqHandle aReqHandle)
-/**
- * Standard two phase constructor.
- * @param aId The client ID (session and sub-session handles) that uniquely identifies a client performing a two phase read.
- * @param aReqHandle The TSY request handle of the client request associated with a two phase read.
- * @return CPcktListReadAllAttempt* The newly created object.
- */
- {
- CPcktListReadAllAttempt* read=new(ELeave) CPcktListReadAllAttempt(aId, aReqHandle);
- CleanupStack::PushL(read);
- read->ConstructL();
- CleanupStack::Pop();
- return read;
- }
-
-CPcktListReadAllAttempt::CPcktListReadAllAttempt(TClientId& aId, TTsyReqHandle aReqHandle)
- : iReqHandle(aReqHandle)
-/**
- * Trivial first phase constructor.
- * @param aId The client ID (session and sub-session handles) that uniquely identifies a client performing a two phase read.
- * @param aReqHandle The TSY request handle of the client request associated with a two phase read.
- */
- {
- iClient.iSessionHandle=aId.iSessionHandle;
- iClient.iSubSessionHandle=aId.iSubSessionHandle;
- }
-
-void CPcktListReadAllAttempt::ConstructL()
-/**
- * Trivial second phase constructor.
- */
- {
- User::LeaveIfError(iListBuf!=NULL);
- }
-
-CPcktListReadAllAttempt::~CPcktListReadAllAttempt()
-/**
- * Trivial destructor.
- */
- {
- delete iListBuf;
- }
-
-
-CSimPacketContext* CSimPacketContext::NewL(CSimPhone* aPhone, CSimPacketService* aPacketService, const TDesC& aContextName)
-/**
-* Standard two phase constructor
-*
-* @param aPacketService Pointer to the Packet Service object (CSimPacketService)
-* @param aContextName name for this packet context
-* @return CSimPacketContext pointer to the packet context object created.
-* @leave Leaves if no memory or object is not created for any reason.
-*/
- {
- CSimPacketContext* packetContext = new(ELeave) CSimPacketContext(aPhone, aPacketService, aContextName);
- CleanupStack::PushL(packetContext);
- packetContext->ConstructL();
- CleanupStack::Pop();
- return packetContext;
- }
-
-void CSimPacketContext::Init()
- {}
-
-CSimPacketContext::CSimPacketContext(CSimPhone* aPhone, CSimPacketService* aPacketService, const TName& aContextName)
- : iPhone(aPhone), iDeleted(EFalse),iIsActive(EFalse),iPacketService(aPacketService),iContextName(aContextName),
- iTFTCreated(EFalse), iNumTFTsCreated(-1), iNumFiltersAdded(0),
- iContextConfigParamsIndex(0), iCommPortLoaned(EFalse),iQoSObjectCount(0),
- iNotifyContextConfigChangeArray(NULL), iSetConfigData(NULL), iSetConfigCallCount(0), iTFTChangeBool(0),
- iNotifyContextStatusChangeIndex(0),iState(RPacketContext::EStatusInactive), iLastError(KErrNone), iErrorCodeForGetLastErrorCause(KErrNone)
-
-/**
-* Trivial Constructor. Initialises all the data members
-*
-* @param aPacketService Pointer to the Packet Service object (CSimPacketService)
-* @param aContextName name for this packet context
-*/
- {
- iNotifyStatusChange.iNotifyPending = EFalse;
- iNotifyConfigGPRS.iNotifyPending= EFalse;
- iNotifyConfigR99.iNotifyPending= EFalse;
- iNotifyConfigR5.iNotifyPending= EFalse;
- }
-
-void CSimPacketContext::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.
-*/
- {
- LOGPACKET1("CSimPacketContext: Entered constructor");
-
- iSetConfigData = new (ELeave) CArrayFixFlat<TSetConfigData>(1);
- iNotifyContextConfigChangeArray = new (ELeave) CArrayFixFlat<TNotifyContextConfigChangeData>(1);
- iContextConfigParams = new (ELeave) CArrayFixFlat<TContextConfigParam>(KNumberofConfigs);
- iAuthorizationTokenResponse = new (ELeave) CArrayFixFlat<TAuthorizationTokenResponse>(KNumberofConfigs);
- iMediaAuthorization = new (ELeave) CArrayFixFlat<RPacketContext::CTFTMediaAuthorizationV3>(KNumberofConfigs);
-
- iNtRas = CSimNtRas::NewL(iPhone);
- iTimer = CSimTimer::NewL(iPhone);
- iNotifyContextStatusChangeTimer = CSimTimer::NewL(iPhone);
- iSetConfigTimer = CSimTimer::NewL(iPhone);
- iInitContextTimer = CSimTimer::NewL(iPhone);
- iCreateTftTimer = CSimTimer::NewL(iPhone);
- iNotifyContextConfigChangeTimer= CSimTimer::NewL(iPhone);
- iContextStatusChange = CSimPubSubChange::NewL(this, CSimPubSub::TPubSubProperty(KUidPSSimTsyCategory, KPSSimtsyPacketContextStatusChange, KPSSimtsyPacketContextStatusChangeKeyType));
-
- LOGPACKET1("Starting to Load and Parse Packet Context the Config File");
-
- GetCommSetupSettingsL();
- GetContextConfigParamSettingsL(KSetContextConfigGPRS());
- GetContextConfigParamSettingsL(KSetContextConfigRel99());
- GetContextConfigParamSettingsL(KSetContextConfigRel5());
- GetActivateSettings();
- GetSetConfigSettings();
- GetPacketFilterSettings();
- GetContextConfigRel99SettingsL();
- ConstructPacketFiltersL();
- GetContextStatusChangeSettingsL();
- GetContextConfigChangeSettingsL();
-
- TInt nestedItemNumber; // used for nested loop
- const CTestConfigItem* item2; // used for nested items
-
- TUint count = CfgFile()->ItemCount(KAuthorizationToken);
-
- TUint itemPosition = 0;
- TUint itemOffSet = 0;
- for(TInt i=0;i<count;i++) // set up AuthorizationToken info
- {
- const CTestConfigItem *item = CfgFile()->Item(KAuthorizationToken,i);
- if(!item)
- break;
-
- RPacketContext::CTFTMediaAuthorizationV3* mediaAuthorization = RPacketContext::CTFTMediaAuthorizationV3::NewL();
- CleanupStack::PushL(mediaAuthorization);
- TAuthorizationTokenResponse authorizationTokenResponse;
- TPtrC8 authorizationToken;
- TInt desiredResponse;
- TInt numberOfFlowIds;
-
- TInt ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,authorizationToken);
-
- if(ret!=KErrNone)
- {
- LOGPARSERR("CTFTMediaAuthorizationV3::authorizationToken",ret,0,&KAuthorizationToken);
- CleanupStack::PopAndDestroy(mediaAuthorization);
- continue;
- }
- else
- {
- mediaAuthorization->iAuthorizationToken.Copy(authorizationToken); // Set up for media authorization
- authorizationTokenResponse.iAuthorizationToken.Copy(authorizationToken); // Set up for token response
- }
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,desiredResponse);
-
- if(ret!=KErrNone || desiredResponse > 0)
- {
- LOGPARSERR("desiredResponse",ret,1,&KAuthorizationToken);
- CleanupStack::PopAndDestroy(mediaAuthorization);
- continue;
- }
- else
- {
- authorizationTokenResponse.iResponse = desiredResponse;
- }
-
- iAuthorizationTokenResponse->AppendL(authorizationTokenResponse);
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,numberOfFlowIds);
-
- for(nestedItemNumber=itemPosition+itemOffSet;nestedItemNumber<itemOffSet+numberOfFlowIds;nestedItemNumber++)
- {
- item2 = CfgFile()->Item(KFlowIdentifier,nestedItemNumber);
-
- if(!item2)
- break;
-
- RPacketContext::CTFTMediaAuthorizationV3::TFlowIdentifier iFlowIdentifier;
- TInt mediaComponentNumber;
- TInt IPFlowNumber;
-
- ret=CTestConfig::GetElement(item2->Value(),KStdDelimiter,0,mediaComponentNumber);
-
- if(ret!=KErrNone || mediaComponentNumber < 0)
- {
- LOGPARSERR("CTFTMediaAuthorizationV3::mediaComponentNumber",ret,0,&KFlowIdentifier);
- continue;
- }
- else
- {
- iFlowIdentifier.iMediaComponentNumber = mediaComponentNumber;
- }
-
- ret=CTestConfig::GetElement(item2->Value(),KStdDelimiter,1,IPFlowNumber);
-
- if(ret!=KErrNone || IPFlowNumber < 0)
- {
- LOGPARSERR("CTFTMediaAuthorizationV3::IPFlowNumber",ret,1,&KFlowIdentifier);
- continue;
- }
- else
- {
- iFlowIdentifier.iIPFlowNumber = IPFlowNumber;
- }
-
- mediaAuthorization->iFlowIds.Append(iFlowIdentifier);
- }
- itemOffSet+=numberOfFlowIds;
- iMediaAuthorization->AppendL(*mediaAuthorization); // Add completed media authorization to array
- CleanupStack::Pop(mediaAuthorization);
- }
-
- LOGPACKET1("...Finished parsing Packet Context config parameters...");
- }
-
-void CSimPacketContext::GetCommSetupSettingsL()
- {
- iCommSetupArray = new (ELeave) CArrayFixFlat<TCommSetupItem>(KNumberofConfigs);
-
- TInt count = CfgFile()->ItemCount(KCommSetup);
- if(count==0)
- {
- TCommSetupItem comm;
-
- comm.iCsyName.Copy(KDefaultCsyName);
- comm.iPortName.Copy(KDefaultPortName);
- comm.iConfig.iRate=KDefaultCommPortRate;
- comm.iConfig.iHandshake=KDefaultHandshake;
- comm.iContextName=KDefaultSetting;
- comm.iCommReset = EFalse;
- comm.iNumInitializeFailures = 0;
- comm.iErrorCode = KErrNone;
- comm.iDelay = 0;
- iCommSetupArray->AppendL(comm);
- }
-
- for(TInt i=0;i<count;i++)
- {
- const CTestConfigItem* item = CfgFile()->Item(KCommSetup,i);
-
- if(item)
- {
- TCommSetupItem comm;
- TPtrC8 portName,csyName,contextName;
- TInt commReset, numInitializeFailures, errorCode, delay;
-
- TInt ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,csyName);
- if(ret!=KErrNone)
- {
- LOGPARSERR("CommSetUp::csyName",ret,0,&KCommSetup);
- comm.iCsyName.Copy(KDefaultCsyName);
- }
- else
- comm.iCsyName.Copy(csyName);
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,portName);
- if(ret!=KErrNone)
- {
- LOGPARSERR("CommSetUp::portName",ret,1,&KCommSetup);
- comm.iPortName.Copy(KDefaultPortName);
- }
- else
- comm.iPortName.Copy(portName);
-
- TInt dataRate,handshake;
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,dataRate);
- if(ret!=KErrNone)
- {
- LOGPARSERR("CommSetUp::dataRate",ret,2,&KCommSetup);
- comm.iConfig.iRate=KDefaultCommPortRate;
- }
- else
- comm.iConfig.iRate=(TBps)dataRate;
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,handshake);
- if(ret!=KErrNone)
- {
- LOGPARSERR("CommSetUp::handShake",ret,3,&KCommSetup);
- comm.iConfig.iHandshake=KDefaultHandshake;
- }
- else
- comm.iConfig.iHandshake=(TUint)handshake;
-
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,contextName);
- if(ret!=KErrNone)
- {
- LOGPARSERR("CommSetUp::contextName",ret,4,&KCommSetup);
- comm.iContextName=KDefaultSetting;
- }
- else
- comm.iContextName.Copy(contextName);
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,5,commReset);
- if(ret!=KErrNone)
- {
- LOGPARSERR("CommSetUp::commReset",ret,5,&KCommSetup);
- comm.iCommReset=EFalse;
- }
- else
- comm.iCommReset = commReset;
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,6,numInitializeFailures);
- if(ret!=KErrNone)
- {
- comm.iNumInitializeFailures = 0;
- }
- else
- comm.iNumInitializeFailures = numInitializeFailures;
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,7,errorCode);
- if(ret!=KErrNone)
- {
- comm.iErrorCode = KErrNone;
- }
- else
- comm.iErrorCode = errorCode;
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,8,delay);
- if(ret!=KErrNone)
- {
- comm.iDelay = 0;
- }
- else
- comm.iDelay = delay;
-
- iCommSetupArray->AppendL(comm);
- }
- }
- }
-
-
-
-void CSimPacketContext::GetContextConfigParamSettingsL(TPtrC8 aTag)
- {
- CSimContextHelper::GetContextConfigParamSettingsL( CfgFile(), aTag, iContextConfigParams );
- }
-
-
-void CSimPacketContext::GetActivateSettings()
- {
- TInt ret;
- const CTestConfigItem* item=CfgFile()->Item(KActivatePauseDuration); //< Find the Activate data item
- if(item)
- { //< then retrieve the activation pause
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,iActivatePause);
- if(ret!=KErrNone)
- iActivatePause = KDefaultPauseDuration;
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,iActivateFail);
- if(ret==KErrNotFound)
- iActivateFail = KErrNone;
- }
-
- item=CfgFile()->Item(KDeactivatePauseDuration); //< Find the Deactivate data item
- if(item)
- { //< then retrieve the deactivation pause
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,iDeactivatePause);
- if(ret!=KErrNone)
- iDeactivatePause = KDefaultPauseDuration;
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,iDeactivateFail);
- if(ret==KErrNotFound)
- iDeactivateFail = KErrNone;
- }
-
- item=CfgFile()->Item(KDeletePauseDuration); //< Find the Delete data item
- if(item)
- { //< then retrieve the delete pause
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,iDeletePause);
- if(ret!=KErrNone)
- iDeletePause = KDefaultPauseDuration;
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,iDeleteFail);
- if(ret==KErrNotFound)
- iDeleteFail = KErrNone;
- }
- }
-
-void CSimPacketContext::GetSetConfigSettings()
- {
- iSetConfigDelay = 0;
- const CTestConfigItem* item=iPacketService->CfgFile()->Item(KSetConfigDelay);
- if(item)
- {
- TInt delay = 0;
- TInt ret = CTestConfig::GetElement(item->Value(),KStdDelimiter,0,delay);
-
- if(ret != KErrNone || delay < 0)
- {
- LOGPARSERR("SetConfigDelay",ret,0,&KSetConfigDelay);
- }
- else
- {
- iSetConfigDelay = delay;
- }
- }
-
- item=iPacketService->CfgFile()->Item(KSetConfigFail); // Set the SetConfigFail struct
- if(item)
- {
- TPtrC8 contextName, numberOfTimes, failErrorCode;
- TInt32 digit = 0;
- TInt ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,contextName);
-
- if(ret!=KErrNone)
- {
- LOGPARSERR("SetConfigFail::contextName",ret,0,&KSetConfigFail);
- }
- else
- {
- iSetConfigFail.iContextName.Copy(contextName);
- }
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,numberOfTimes);
- if(ret!=KErrNone)
- {
- LOGPARSERR("SetConfigFail::numberOfTimes",ret,1,&KSetConfigFail);
- }
- else
- {
- if(AsciiToNum(numberOfTimes, digit)==KErrNone)
- iSetConfigFail.iNumberOfTimes = digit;
- }
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,failErrorCode);
- if(ret!=KErrNone)
- {
- LOGPARSERR("SetConfigFail::failErrorCode",ret,2,&KSetConfigFail);
- }
- else
- {
- if(AsciiToNum(failErrorCode, digit)==KErrNone)
- iSetConfigFail.iFailErrorCode = digit;
- }
- }
- }
-
-void CSimPacketContext::GetContextConfigChangeSettingsL()
- {
- TNotifyContextConfigChangeData configChangeData;
-
- TUint count = CfgFile()->ItemCount(KNotifyContextConfigChange);
- TInt index;
- for(index = 0; index < count; index++)
- {
- const CTestConfigItem *item =
- CfgFile()->Item(KNotifyContextConfigChange,index);
-
- if(!item)
- {
- break;
- }
-
- //Get the Notify Context Config Change Delay value
- TInt ret = CTestConfig::GetElement(item->Value(),KStdDelimiter,0,
- configChangeData.iDelay);
- if(ret!=KErrNone)
- {
- LOGPARSERR("NotifyContextConfigChange::delay",ret,0,&KNotifyContextConfigChange);
- continue;
- }
-
- //Get the Notify Context Config Change, config index value
- ret = CTestConfig::GetElement(item->Value(),KStdDelimiter,1,
- configChangeData.iNewContextConfigIndex);
- if(ret!=KErrNone)
- {
- LOGPARSERR("NotifyContextConfigChange::NewContextConfigIndex",
- ret,0,&KNotifyContextConfigChange);
- continue;
- }
-
- iNotifyContextConfigChangeArray->AppendL(configChangeData);
- }
- }
-
-void CSimPacketContext::GetPacketFilterSettings()
- {
- TInt ret;
- const CTestConfigItem* item=iPacketService->CfgFile()->Item(KDeleteTftFail);
- if(item)
- {
- TPtrC8 contextName, numberOfTimes, failErrorCode;
- TInt32 digit = 0;
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,contextName);
-
- if(ret!=KErrNone)
- {
- LOGPARSERR("SetConfigFail::contextName",ret,0,&KDeleteTftFail);
- }
- else
- {
- iDeleteTftFail.iContextName.Copy(contextName);
- }
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,numberOfTimes);
- if(ret!=KErrNone)
- {
- LOGPARSERR("SetConfigFail::numberOfTimes",ret,1,&KDeleteTftFail);
- }
- else
- {
- if(AsciiToNum(numberOfTimes, digit)==KErrNone)
- iDeleteTftFail.iNumberOfTimes = digit;
- }
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,failErrorCode);
- if(ret!=KErrNone)
- {
- LOGPARSERR("SetConfigFail::failErrorCode",ret,2,&KDeleteTftFail);
- }
- else
- {
- if(AsciiToNum(failErrorCode, digit)==KErrNone)
- iDeleteTftFail.iFailErrorCode = digit;
- }
- }
-
- item=iPacketService->CfgFile()->Item(KCreateTftConfig);
- if(item)
- {
- TPtrC8 contextName, numberOfTimes, failErrorCode;
- TInt32 digit = 0;
- TInt delay = 0;
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,contextName);
- if(ret!=KErrNone)
- {
- LOGPARSERR("SetConfigFail::contextName",ret,0,&KCreateTftConfig);
- }
- else
- {
- iCreateTftConfig.iContextName.Copy(contextName);
- }
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,numberOfTimes);
- if(ret!=KErrNone)
- {
- LOGPARSERR("SetConfigFail::numberOfTimes",ret,1,&KCreateTftConfig);
- }
- else
- {
- if(AsciiToNum(numberOfTimes, digit)==KErrNone)
- iCreateTftConfig.iNumberOfFailures = digit;
- }
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,failErrorCode);
- if(ret!=KErrNone)
- {
- LOGPARSERR("SetConfigFail::failErrorCode",ret,2,&KCreateTftConfig);
- }
- else
- {
- if(AsciiToNum(failErrorCode, digit)==KErrNone)
- iCreateTftConfig.iFailErrorCode = digit;
- }
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,delay);
- if(ret!=KErrNone)
- {
- LOGPARSERR("SetConfigFail::failErrorCode",ret,3,&KCreateTftConfig);
- }
- else
- {
- iCreateTftConfig.iDelay = delay;
- }
- }
-
- item=iPacketService->CfgFile()->Item(KAddPacketFilter);
- if(item)
- {
- TPtrC8 contextName, numberOfTimes, failErrorCode;
- TInt32 digit = 0;
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,contextName);
-
- if(ret!=KErrNone)
- {
- LOGPARSERR("SetConfigFail::contextName",ret,0,&KAddPacketFilter);
- }
- else
- {
- iAddPacketFilter.iContextName.Copy(contextName);
- }
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,numberOfTimes);
- if(ret!=KErrNone)
- {
- LOGPARSERR("SetConfigFail::numberOfTimes",ret,1,&KAddPacketFilter);
- }
- else
- {
- if(AsciiToNum(numberOfTimes, digit)==KErrNone)
- iAddPacketFilter.iNumberOfTimes = digit;
- }
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,failErrorCode);
- if(ret!=KErrNone)
- {
- LOGPARSERR("SetConfigFail::failErrorCode",ret,2,&KAddPacketFilter);
- }
- else
- {
- if(AsciiToNum(failErrorCode, digit)==KErrNone)
- iAddPacketFilter.iFailErrorCode = digit;
- }
-
- }
- }
-
-void CSimPacketContext::GetContextConfigRel99SettingsL()
- {
- iContextConfigsRel99 = new(ELeave) CArrayFixFlat<TRel99ContextConfig>(KNumberofConfigs);
-
- TInt count = CfgFile()->ItemCount(KContextConfigRel99); // set up the Rel 99 context configuration parameters
- for(TInt i=0;i<count;i++)
- {
- const CTestConfigItem* item = CfgFile()->Item(KContextConfigRel99,i);
- if(!item)
- break;
-
- TPtrC8 contextName;
- TInt activatePause, activateErrorCode, aDeactivatePause, deactivateErrorCode, deletionPause;
- TInt deletionErrorCode;
- TBool connectToNtRas;
- TRel99ContextConfig contextConfigRel99;
-
- TInt ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,contextName);
-
- if(ret!=KErrNone)
- {
- LOGPARSERR("ContextConfigRel99::contextName",ret,0,KContextConfigRel99);
- }
- else
- {
- contextConfigRel99.iContextName.Copy(contextName);
- }
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,activatePause);
- if(ret!=KErrNone)
- {
- LOGPARSERR("ContextConfigRel99::activatePause",ret,1,&KContextConfigRel99);
- continue;
- }
- else
- contextConfigRel99.iActivatePause = activatePause;
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,activateErrorCode);
- if(ret!=KErrNone)
- {
- LOGPARSERR("ContextConfigRel99::activateErrorCode",ret,2,&KContextConfigRel99);
- continue;
- }
- else
- contextConfigRel99.iActivateErrorCode = activateErrorCode;
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,aDeactivatePause);
- if(ret!=KErrNone)
- {
- LOGPARSERR("ContextConfigRel99::deactivatePause",ret,3,&KContextConfigRel99);
- continue;
- }
- else
- contextConfigRel99.iDeactivatePause = aDeactivatePause;
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,deactivateErrorCode);
- if(ret!=KErrNone)
- {
- LOGPARSERR("ContextConfigRel99::deactivateErrorCode",ret,4,&KContextConfigRel99);
- continue;
- }
- else
- contextConfigRel99.iDeactivateErrorCode = deactivateErrorCode;
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,5,deletionPause);
- if(ret!=KErrNone)
- {
- LOGPARSERR("ContextConfigRel99::deletetionPause",ret,5,&KContextConfigRel99);
- continue;
- }
- else
- contextConfigRel99.iDeletionPause = deletionPause;
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,6, deletionErrorCode);
- if(ret!=KErrNone)
- {
- LOGPARSERR("ContextConfigRel99::deletionErrorCode",ret,6,&KContextConfigRel99);
- continue;
- }
- else
- contextConfigRel99.iDeletionErrorCode = deletionErrorCode;
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,7, connectToNtRas);
- if(ret!=KErrNone)
- {
- contextConfigRel99.iConnectToNtRas = ETrue;
- }
- else
- contextConfigRel99.iConnectToNtRas = connectToNtRas;
-
- iContextConfigsRel99->AppendL(contextConfigRel99);
- }
- }
-
-/**
- Retrieves the (aIndex+1)th packet context status with the current context's context name
- ie. if aIndex is 0, the 1st context status entry is returned and if aIndex is 1, the 2nd is returned
- */
-TNotifyContextStatusChange& CSimPacketContext::GetContextStatusChangeAt(TInt aIndex)
- {
- TInt count = 0;
- for (TInt i = 0; i < iNotifyContextStatusChangeArray->Count(); i++)
- {
- if (iContextName.Compare(iNotifyContextStatusChangeArray->At(i).iContextName) == 0)
- {
- if (count == aIndex)
- {
- return iNotifyContextStatusChangeArray->At(i);
- }
- else
- {
- count++;
- }
- }
- }
- return iNotifyContextStatusChangeArray->At(0);
- }
-
-/**
- Retrieves the number of context status changes entries configured for the current packet context
- */
-TInt CSimPacketContext::GetContextStatusChangeCount()
- {
- TInt count = 0;
- for (TInt i = 0; i < iNotifyContextStatusChangeArray->Count(); i++)
- {
- if (iContextName.Compare(iNotifyContextStatusChangeArray->At(i).iContextName) == 0)
- {
- count++;
- }
- }
- return count;
- }
-
-void CSimPacketContext::GetContextStatusChangeSettingsL()
- {
- TPtrC8 contextStatusChangeType;
- TInt ret;
-
- iNotifyContextStatusChangeArray = new (ELeave) CArrayFixFlat<TNotifyContextStatusChange>(KNumberofConfigs);
-
- // default to using timer to drive context status changes
- iNotifyContextStatusChangeType = ETimer;
- const CTestConfigItem* item = CfgFile()->Item(KNotifyContextStatusChangeType);
- if (item)
- {
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,contextStatusChangeType);
- if(ret==KErrNone && contextStatusChangeType.Compare(KNotificationTypePublishSubscribe)==0)
- iNotifyContextStatusChangeType = EPublishAndSubscribe;
- }
-
- TInt count = CfgFile()->ItemCount(KNotifyContextStatusChange);
-
- for(TInt i=0;i<count;i++) // set up NotifyContextStatusChange info
- {
- item = CfgFile()->Item(KNotifyContextStatusChange,i);
- if(!item)
- break;
-
- TNotifyContextStatusChange notifyContextStatusChange;
- TPtrC8 contextName;
- TInt duration, contextStatus;
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,contextName);
-
- if(ret!=KErrNone)
- {
- LOGPARSERR("NotifyContextStatusChange::contextName",ret,0,&KNotifyContextStatusChange);
- continue;
- }
- else
- {
- notifyContextStatusChange.iContextName.Copy(contextName);
- }
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,duration);
- if(ret!=KErrNone)
- {
- LOGPARSERR("NotifyContextStatusChange::duration",ret,1,&KNotifyContextStatusChange);
- continue;
- }
- else
- notifyContextStatusChange.iDuration = duration;
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,contextStatus);
- if(ret!=KErrNone)
- {
- LOGPARSERR("NotifyContextStatusChange::duration",ret,2,&KNotifyContextStatusChange);
- continue;
- }
- else
- notifyContextStatusChange.iStatus = (RPacketContext::TContextStatus)contextStatus;
-
- iNotifyContextStatusChangeArray->AppendL(notifyContextStatusChange);
-
- if(GetContextStatusChangeCount() != 0)
- {
- iCurrentNotifyContextStatusChange=(RPacketContext::TContextStatus)GetContextStatusChangeAt(0).iStatus;
- if (iNotifyContextStatusChangeType == ETimer)
- {
- iNotifyContextStatusChangeIndex=0;
- iNotifyContextStatusChangeTimer->Start(GetContextStatusChangeAt(0).iDuration,this,ETimerIdPcktContextStatusChange);
- }
- }
- }
- }
-
-void CSimPacketContext::ConstructPacketFiltersL()
- {
- iPacketFilterInfoArray = new (ELeave) CArrayFixFlat<TPacketFilterV3>(KNumberofConfigs);
-
- const CTestConfigItem* item;
- TInt count, ret;
- count = CfgFile()->ItemCount(KPacketFilterInfo);
-
- for(TInt i=0;i<count;i++) // set up Packet filter info
- {
- item = CfgFile()->Item(KPacketFilterInfo,i);
- if(!item)
- break;
-
- TPtrC8 srcAddr, srcAddrSubnetMask;
- TInt id, evaluationPrecedenceIndex, protocolNumberOrNextHeader;
- TInt srcPortMin, srcPortMax, destPortMin, destPortMax, ipSecSPI, toSorTrafficClass;
- TInt flowLabel, filterType;
- TPacketFilterV3 packetFilter;
-
- // Check that the data structure is supported by the simulated TSY version
- if(iPhone->iSimTsyVersion < 3) // same version as TPacketFilterVx
- {
- (void)User::Leave(KErrNotSupported);
- }
-
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,id);
-
- if(ret!=KErrNone)
- {
- LOGPARSERR("PacketFilterInfo::id",ret,0,&KPacketFilterInfo);
- continue;
- }
- else
- {
- packetFilter.iId= id;
- }
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,evaluationPrecedenceIndex);
-
- if(ret!=KErrNone)
- {
- LOGPARSERR("PacketFilterInfo::evaluationPrecedenceIndex",ret,1,&KPacketFilterInfo);
- continue;
- }
- else
- {
- packetFilter.iEvaluationPrecedenceIndex= evaluationPrecedenceIndex;
- }
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,srcAddr);
-
- if(ret!=KErrNone)
- {
- LOGPARSERR("PacketFilterInfo::srcAddr",ret,2,&KPacketFilterInfo);
- continue;
- }
- else
- {
- TUint8 digit=0;
- TPtrC8 address;
-
- ret=CTestConfig::GetElement(srcAddr,'.',0, address);
- if((AsciiToNum(address, digit)==KErrNone)
- && (ret == KErrNone))
- packetFilter.iSrcAddr[0] = digit;
- else
- packetFilter.iSrcAddr[0] = 0;
- ret=CTestConfig::GetElement(srcAddr,'.',1, address);
- if((AsciiToNum(address, digit)==KErrNone)
- && (ret == KErrNone))
- packetFilter.iSrcAddr[1] = digit;
- else
- packetFilter.iSrcAddr[1] = 0;
- ret=CTestConfig::GetElement(srcAddr,'.',2, address);
- if((AsciiToNum(address, digit)==KErrNone)
- && (ret == KErrNone))
- packetFilter.iSrcAddr[2] = digit;
- else
- packetFilter.iSrcAddr[2] = 0;
- ret=CTestConfig::GetElement(srcAddr,'.',3, address);
- if((AsciiToNum(address, digit)==KErrNone)
- && (ret == KErrNone))
- packetFilter.iSrcAddr[3] = digit;
- else
- packetFilter.iSrcAddr[3] = 0;
- ret=CTestConfig::GetElement(srcAddr,'.',4, address);
- if((AsciiToNum(address, digit)==KErrNone)
- && (ret == KErrNone))
- packetFilter.iSrcAddr[4] = digit;
- else
- packetFilter.iSrcAddr[4] = 0;
- ret=CTestConfig::GetElement(srcAddr,'.',5, address);
- if((AsciiToNum(address, digit)==KErrNone)
- && (ret == KErrNone))
- packetFilter.iSrcAddr[5] = digit;
- else
- packetFilter.iSrcAddr[5] = 0;
- ret=CTestConfig::GetElement(srcAddr,'.',6, address);
- if((AsciiToNum(address, digit)==KErrNone)
- && (ret == KErrNone))
- packetFilter.iSrcAddr[6] = digit;
- else
- packetFilter.iSrcAddr[6] = 0;
- ret=CTestConfig::GetElement(srcAddr,'.',7, address);
- if((AsciiToNum(address, digit)==KErrNone)
- && (ret == KErrNone))
- packetFilter.iSrcAddr[7] = digit;
- else
- packetFilter.iSrcAddr[7] = 0;
- ret=CTestConfig::GetElement(srcAddr,'.',8, address);
- if((AsciiToNum(address, digit)==KErrNone)
- && (ret == KErrNone))
- packetFilter.iSrcAddr[8] = digit;
- else
- packetFilter.iSrcAddr[8] = 0;
- ret=CTestConfig::GetElement(srcAddr,'.',9, address);
- if((AsciiToNum(address, digit)==KErrNone)
- && (ret == KErrNone))
- packetFilter.iSrcAddr[9] = digit;
- else
- packetFilter.iSrcAddr[9] = 0;
- ret=CTestConfig::GetElement(srcAddr,'.',10, address);
- if((AsciiToNum(address, digit)==KErrNone)
- && (ret == KErrNone))
- packetFilter.iSrcAddr[10] = digit;
- else
- packetFilter.iSrcAddr[10] = 0;
- ret=CTestConfig::GetElement(srcAddr,'.',11, address);
- if((AsciiToNum(address, digit)==KErrNone)
- && (ret == KErrNone))
- packetFilter.iSrcAddr[11] = digit;
- else
- packetFilter.iSrcAddr[11] = 0;
- ret=CTestConfig::GetElement(srcAddr,'.',12, address);
- if((AsciiToNum(address, digit)==KErrNone)
- && (ret == KErrNone))
- packetFilter.iSrcAddr[12] = digit;
- else
- packetFilter.iSrcAddr[12] = 0;
- ret=CTestConfig::GetElement(srcAddr,'.',13, address);
- if((AsciiToNum(address, digit)==KErrNone)
- && (ret == KErrNone))
- packetFilter.iSrcAddr[13] = digit;
- else
- packetFilter.iSrcAddr[13] = 0;
- ret=CTestConfig::GetElement(srcAddr,'.',14, address);
- if((AsciiToNum(address, digit)==KErrNone)
- && (ret == KErrNone))
- packetFilter.iSrcAddr[14] = digit;
- else
- packetFilter.iSrcAddr[14] = 0;
- ret=CTestConfig::GetElement(srcAddr,'.',15, address);
- if((AsciiToNum(address, digit)==KErrNone)
- && (ret == KErrNone))
- packetFilter.iSrcAddr[15] = digit;
- else
- packetFilter.iSrcAddr[15] = 0;
-
- }
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,srcAddrSubnetMask);
-
- if(ret!=KErrNone)
- {
- LOGPARSERR("PacketFilterInfo::srcAddrSubnetMask",ret,3,&KPacketFilterInfo);
- continue;
- }
- else
- {
- TUint8 digit=0;
- TPtrC8 address;
-
- ret=CTestConfig::GetElement(srcAddrSubnetMask,'.',0, address);
- if((AsciiToNum(address, digit)==KErrNone)
- && (ret == KErrNone))
- packetFilter.iSrcAddrSubnetMask[0] = digit;
- else
- packetFilter.iSrcAddrSubnetMask[0] = 0;
- ret=CTestConfig::GetElement(srcAddrSubnetMask,'.',1, address);
- if((AsciiToNum(address, digit)==KErrNone)
- && (ret == KErrNone))
- packetFilter.iSrcAddrSubnetMask[1] = digit;
- else
- packetFilter.iSrcAddrSubnetMask[1] = 0;
- ret=CTestConfig::GetElement(srcAddrSubnetMask,'.',2, address);
- if((AsciiToNum(address, digit)==KErrNone)
- && (ret == KErrNone))
- packetFilter.iSrcAddrSubnetMask[2] = digit;
- else
- packetFilter.iSrcAddrSubnetMask[2] = 0;
- ret=CTestConfig::GetElement(srcAddrSubnetMask,'.',3, address);
- if((AsciiToNum(address, digit)==KErrNone)
- && (ret == KErrNone))
- packetFilter.iSrcAddrSubnetMask[3] = digit;
- else
- packetFilter.iSrcAddrSubnetMask[3] = 0;
- ret=CTestConfig::GetElement(srcAddrSubnetMask,'.',4, address);
- if((AsciiToNum(address, digit)==KErrNone)
- && (ret == KErrNone))
- packetFilter.iSrcAddrSubnetMask[4] = digit;
- else
- packetFilter.iSrcAddrSubnetMask[4] = 0;
- ret=CTestConfig::GetElement(srcAddrSubnetMask,'.',5, address);
- if((AsciiToNum(address, digit)==KErrNone)
- && (ret == KErrNone))
- packetFilter.iSrcAddrSubnetMask[5] = digit;
- else
- packetFilter.iSrcAddrSubnetMask[5] = 0;
- ret=CTestConfig::GetElement(srcAddrSubnetMask,'.',6, address);
- if((AsciiToNum(address, digit)==KErrNone)
- && (ret == KErrNone))
- packetFilter.iSrcAddrSubnetMask[6] = digit;
- else
- packetFilter.iSrcAddrSubnetMask[6] = 0;
- ret=CTestConfig::GetElement(srcAddrSubnetMask,'.',7, address);
- if((AsciiToNum(address, digit)==KErrNone)
- && (ret == KErrNone))
- packetFilter.iSrcAddrSubnetMask[7] = digit;
- else
- packetFilter.iSrcAddrSubnetMask[7] = 0;
- ret=CTestConfig::GetElement(srcAddrSubnetMask,'.',8, address);
- if((AsciiToNum(address, digit)==KErrNone)
- && (ret == KErrNone))
- packetFilter.iSrcAddrSubnetMask[8] = digit;
- else
- packetFilter.iSrcAddrSubnetMask[8] = 0;
- ret=CTestConfig::GetElement(srcAddrSubnetMask,'.',9, address);
- if((AsciiToNum(address, digit)==KErrNone)
- && (ret == KErrNone))
- packetFilter.iSrcAddrSubnetMask[9] = digit;
- else
- packetFilter.iSrcAddrSubnetMask[9] = 0;
- ret=CTestConfig::GetElement(srcAddrSubnetMask,'.',10, address);
- if((AsciiToNum(address, digit)==KErrNone)
- && (ret == KErrNone))
- packetFilter.iSrcAddrSubnetMask[10] = digit;
- else
- packetFilter.iSrcAddrSubnetMask[10] = 0;
- ret=CTestConfig::GetElement(srcAddrSubnetMask,'.',11, address);
- if((AsciiToNum(address, digit)==KErrNone)
- && (ret == KErrNone))
- packetFilter.iSrcAddrSubnetMask[11] = digit;
- else
- packetFilter.iSrcAddrSubnetMask[11] = 0;
- ret=CTestConfig::GetElement(srcAddrSubnetMask,'.',12, address);
- if((AsciiToNum(address, digit)==KErrNone)
- && (ret == KErrNone))
- packetFilter.iSrcAddrSubnetMask[12] = digit;
- else
- packetFilter.iSrcAddrSubnetMask[12] = 0;
- ret=CTestConfig::GetElement(srcAddrSubnetMask,'.',13, address);
- if((AsciiToNum(address, digit)==KErrNone)
- && (ret == KErrNone))
- packetFilter.iSrcAddrSubnetMask[13] = digit;
- else
- packetFilter.iSrcAddrSubnetMask[13] = 0;
- ret=CTestConfig::GetElement(srcAddrSubnetMask,'.',14, address);
- if((AsciiToNum(address, digit)==KErrNone)
- && (ret == KErrNone))
- packetFilter.iSrcAddrSubnetMask[14] = digit;
- else
- packetFilter.iSrcAddrSubnetMask[14] = 0;
- ret=CTestConfig::GetElement(srcAddrSubnetMask,'.',15, address);
- if((AsciiToNum(address, digit)==KErrNone)
- && (ret == KErrNone))
- packetFilter.iSrcAddrSubnetMask[15] = digit;
- else
- packetFilter.iSrcAddrSubnetMask[15] = 0;
- }
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,protocolNumberOrNextHeader);
-
- if(ret!=KErrNone)
- {
- LOGPARSERR("PacketFilterInfo::protocolNumberOrNextNumber",ret,4,&KPacketFilterInfo);
- packetFilter.iProtocolNumberOrNextHeader = KUnsetInteger;
- }
- else
- {
- packetFilter.iProtocolNumberOrNextHeader= protocolNumberOrNextHeader;
- }
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,5,srcPortMin);
-
- if(ret!=KErrNone)
- {
- LOGPARSERR("PacketFilterInfo::srcPortMin",ret,5,&KPacketFilterInfo);
- packetFilter.iSrcPortMin = KUnsetInteger;
- }
- else
- {
- packetFilter.iSrcPortMin= srcPortMin;
- }
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,6,srcPortMax);
-
- if(ret!=KErrNone)
- {
- LOGPARSERR("PacketFilterInfo::srcPortMax",ret,6,&KPacketFilterInfo);
- packetFilter.iSrcPortMax = KUnsetInteger;
- }
- else
- {
- packetFilter.iSrcPortMax= srcPortMax;
- }
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,7,destPortMin);
-
- if(ret!=KErrNone)
- {
- LOGPARSERR("PacketFilterInfo::destPortMin",ret,7,&KPacketFilterInfo);
- packetFilter.iDestPortMin = KUnsetInteger;
- }
- else
- {
- packetFilter.iDestPortMin= destPortMin;
- }
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,8,destPortMax);
-
- if(ret!=KErrNone)
- {
- LOGPARSERR("PacketFilterInfo::srcPortMax",ret,8,&KPacketFilterInfo);
- packetFilter.iDestPortMax = KUnsetInteger;
- }
- else
- {
- packetFilter.iDestPortMax= destPortMax;
- }
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,9,ipSecSPI);
-
- if(ret!=KErrNone)
- {
- LOGPARSERR("PacketFilterInfo::ipSecSPI",ret,9,&KPacketFilterInfo);
- packetFilter.iIPSecSPI = KUnsetInteger;
- }
- else
- {
- packetFilter.iIPSecSPI= ipSecSPI;
- }
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,10,toSorTrafficClass);
-
- if(ret!=KErrNone)
- {
- LOGPARSERR("PacketFilterInfo::toSorTrafficClass",ret,10,&KPacketFilterInfo);
- continue;
- }
- else
- {
- packetFilter.iTOSorTrafficClass = (TUint16)toSorTrafficClass;
- }
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,11,flowLabel);
-
- if(ret!=KErrNone)
- {
- LOGPARSERR("PacketFilterInfo::flowLabel",ret,11,&KPacketFilterInfo);
- packetFilter.iFlowLabel = KUnsetInteger;
- }
- else
- {
- packetFilter.iFlowLabel = flowLabel;
- }
-
- ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,12,filterType);
-
- if(ret!=KErrNone)
- {
- if(ret == KErrNotFound)
- {
- LOGCONFIG1("CONFIGURATION FILE PARSING - PacketFilterInfo::TPacketFilterV2 info encountered");
- packetFilter.iFilterType = RPacketContext::EPacketFilterTypeUnknown;
- }
- else
- {
- LOGPARSERR("PacketFilterInfo::filterType",ret,12,&KPacketFilterInfo);
- continue;
- }
- }
- else
- {
- packetFilter.iFilterType = static_cast<RPacketContext::TPacketFilterType>(filterType);
- }
-
- packetFilter.iAdded = EFalse;
- TRAP_IGNORE(iPacketFilterInfoArray->AppendL(packetFilter));
- }
- }
-
-CSimPacketContext::~CSimPacketContext()
-/**
-* Trivial Destructor
-* Closes all CObject type objects and destroys all other objects created in the ConstructL()
-*
-*/
- {
- LOGPACKET1("CSimPacketContext: Entered destructor");
-
- if (iContextConfigParams != NULL)
- {
- iContextConfigParams->Delete(0, iContextConfigParams->Count());
- delete iContextConfigParams;
- }
- if (iContextConfigsRel99 != NULL)
- {
- iContextConfigsRel99->Delete(0,iContextConfigsRel99->Count());
- delete iContextConfigsRel99;
- }
- if (iCommSetupArray != NULL)
- {
- iCommSetupArray->Delete(0, iCommSetupArray->Count());
- delete iCommSetupArray;
- }
- if (iNtRas != NULL)
- delete iNtRas;
-
- if (iTimer != NULL)
- delete iTimer;
-
- if (iSetConfigTimer != NULL)
- delete iSetConfigTimer;
-
- if (iInitContextTimer != NULL)
- delete iInitContextTimer;
-
- if (iCreateTftTimer != NULL)
- delete iCreateTftTimer;
-
- if (iNotifyContextStatusChangeTimer != NULL)
- delete iNotifyContextStatusChangeTimer;
-
- if (iNotifyContextConfigChangeTimer != NULL)
- delete iNotifyContextConfigChangeTimer;
-
- if (iPacketFilterInfoArray != NULL)
- {
- iPacketFilterInfoArray->Delete(0, iPacketFilterInfoArray->Count());
- delete iPacketFilterInfoArray;
- }
- if (iNotifyContextStatusChangeArray != NULL)
- {
- iNotifyContextStatusChangeArray->Delete(0, iNotifyContextStatusChangeArray->Count());
- delete iNotifyContextStatusChangeArray;
- }
- iPacketService->DecrementContextCount();
-
- if (iAuthorizationTokenResponse != NULL)
- {
- iAuthorizationTokenResponse->Delete(0, iAuthorizationTokenResponse->Count());
- delete iAuthorizationTokenResponse;
- }
-
- if (iMediaAuthorization != NULL)
- {
- for(TUint i=0; i<iMediaAuthorization->Count(); i++)
- {
- if (iMediaAuthorization->At(i).iFlowIds.Count() > 0)
- {
- iMediaAuthorization->At(i).iFlowIds.Reset();
- }
- }
- iMediaAuthorization->Delete(0, iMediaAuthorization->Count());
- delete iMediaAuthorization;
- }
-
- delete iContextStatusChange;
-
- if(iSetConfigData !=NULL )
- {
- iSetConfigData->Delete(0, iSetConfigData->Count());
- delete iSetConfigData;
- }
-
- if(iNotifyContextConfigChangeArray !=NULL)
- {
- iNotifyContextConfigChangeArray->Delete(0,iNotifyContextConfigChangeArray->Count());
- delete iNotifyContextConfigChangeArray;
- }
-}
-
-CTelObject* CSimPacketContext::OpenNewObjectByNameL(const TDesC& aName)
-/**
-* Returns a pointer to an existing QoS object identified by name.
-* This is not support and if called will leave.
-*
-* @param aName name of the QoS object to be opened
-* @return CTelObject will return null and leave
-* @leave Leaves with KErrNotSupported if the name is not as expected.
-*/
- {
- if (aName.Compare(iQoSName) == KErrNone)
- {
- return iPacketqos;
- }
-
- User::Leave(KErrNotSupported);
- return NULL;
- }
-
-
-CTelObject* CSimPacketContext::OpenNewObjectL(TDes& aNewName)
-/**
-* Creates a new CSimPacketQoS object and returns a pointer to it.
-*
-* @param aNewName new name of the object created
-* @return CTelObject pointer to the CSimPacketQos object created
-* @leave Leaves if out of memory.
-*/
- {
- aNewName.Append(KSimPacketQosName);
- aNewName.AppendNum(++iQoSObjectCount);
- iQoSName.Copy(aNewName);
- iPacketqos = CSimPacketQoS::NewL(iPhone, this);
- return iPacketqos;
- }
-
-CTelObject::TReqMode CSimPacketContext::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 EPacketContextSetConfig:
- case EPacketContextActivate:
- case EPacketContextDeactivate:
- case EPacketContextDelete:
- case EPacketContextLoanCommPort:
- case EPacketContextRecoverCommPort:
- case EPacketContextGetConfig:
- case EPacketContextGetStatus:
- case EPacketContextGetDataVolumeTransferred:
- case EPacketContextGetLastErrorCause:
- case EPacketContextInitialiseContext:
- case EPacketContextEnumeratePacketFilters:
- case EPacketContextGetPacketFilterInfo:
- case EPacketContextAddPacketFilter:
- case EPacketContextRemovePacketFilter:
- case EPacketContextModifyActiveContext:
- case EPacketContextGetProfileName:
- case EPacketContextGetDNSInfo:
- case EPacketAddMediaAuthorization:
- case EPacketRemoveMediaAuthorization:
- case EPacketContextCreateNewTFT:
- case EPacketContextDeleteTFT:
- break;
-
- case EPacketContextNotifyConfigChanged:
- case EPacketContextNotifyStatusChange:
- case EPacketContextNotifyDataTransferred:
- ret=KReqModeMultipleCompletionEnabled | KReqModeRePostImmediately;
- break;
-
- default:
- User::Leave(KErrNotSupported);
- break;
- }
-
- return ret;
- }
-
-TInt CSimPacketContext::GetProfileName(const TTsyReqHandle aTsyReqHandle, TName* aQoSProfile)
- {
-/**
-* This synchronous method allows a client to retrieve the name
-* of the QoS profile. The profile name is passed back in the aQoSProfile parameter
-*/
- aQoSProfile->Copy(iQoSName);
- ReqCompleted(aTsyReqHandle,KErrNone);
- return KErrNone;
- }
-
-TInt CSimPacketContext::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 EPacketContextNotifyConfigChanged:
- case EPacketContextNotifyStatusChange:
- case EPacketContextNotifyDataTransferred:
- return KErrNone;
- default:
- // Unknown or invalid IPC
- LOGPACKET1("CSimPacketContext: Register error, unknown IPC");
- return KErrNotSupported;
- }
- }
-
-TInt CSimPacketContext::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 EPacketContextNotifyConfigChanged:
- case EPacketContextNotifyStatusChange:
- case EPacketContextNotifyDataTransferred:
- LOGPACKET1("CSimPacketContext: DeregisterNotification");
- return KErrNone;
- default:
- // Unknown or invalid IPC
- LOGPACKET1("CSimPacketContext: Deregister error, unknown IPC");
- return KErrNotSupported;
- }
- }
-
-TInt CSimPacketContext::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 EPacketContextNotifyConfigChanged:
- case EPacketContextNotifyStatusChange:
- case EPacketContextNotifyDataTransferred:
- LOGPACKET1("CGprsDGprsTsy: Registered with 5 slots");
- numberOfSlots=5;
- break;
- default:
- // Unknown or invalid IPC
- LOGPACKET1("CSimPacketContext: Number of Slots error, unknown IPC");
- User::Leave(KErrNotSupported);
- break;
- }
- return numberOfSlots;
- }
-
-
-TInt CSimPacketContext::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
-*/
- {
- //< if this context has been deleted then the client can not do anything with it
- //< if the client wants to use this class, the client must open a new object by
- //< name with the name for this context and this will reactivate the context.
- if(iDeleted && (aIpc != EPacketContextGetStatus))
- {
- ReqCompleted(aTsyReqHandle,KErrNotReady);
- return KErrNone;
- }
-
- TAny* dataPtr=aPackage.Ptr1();
- TAny* dataPtr2=aPackage.Ptr2();
-
- switch (aIpc)
- {
- case EPacketContextSetConfig:
- {
- if (iSetConfigCallCount <= iSetConfigFail.iNumberOfTimes
- || iSetConfigFail.iNumberOfTimes==0)
- {
- if (iSetConfigDelay > 0)
- {
- TSetConfigData setConfigData;
- setConfigData.iTsyReqHandle = aTsyReqHandle;
- setConfigData.iData = aPackage.Des1n();
-
- TRAPD(ret, iSetConfigData->AppendL(setConfigData) );
- if (ret != KErrNone)
- {
- LOGPACKET1("CSimPacketContext::ExtFunc AppendL call fail");
- return ret;
- }
-
- iSetConfigTimer->Start(iSetConfigDelay,this,ETimerIdPcktContextSetConfig);
- }
- else
- {
- SetConfig(aTsyReqHandle, aPackage.Des1n());
- }
- iSetConfigCallCount++;
- return KErrNone;
- }
- else
- {
- iSetConfigCallCount=0;
- iSetConfigFail.iNumberOfTimes = 0;
-
- ReqCompleted(aTsyReqHandle, iSetConfigFail.iFailErrorCode);
- return KErrNone; // if SetConfig() has been called the number of times allowed in SetConfigFail, fail request
- }
- }
- case EPacketContextGetProfileName:
- return GetProfileName(aTsyReqHandle, REINTERPRET_CAST(TName*,dataPtr));
- case EPacketContextSetConfigCancel:
- return SetConfigCancel(aTsyReqHandle);
- case EPacketContextGetConfig:
- return GetConfig(aTsyReqHandle, aPackage.Des1n());
- case EPacketContextGetConfigCancel:
- return GetConfigCancel(aTsyReqHandle);
- case EPacketContextNotifyConfigChanged:
- return NotifyConfigChanged(aTsyReqHandle, aPackage.Des1n());
- case EPacketContextNotifyConfigChangedCancel:
- return NotifyConfigChangedCancel(aTsyReqHandle);
- case EPacketContextActivate:
- { //< Ensures that theres only one context active as only one active context is
- //<permitted at any one time
- if(iIsActive)
- {
- ReqCompleted(aTsyReqHandle,KErrEtelCallAlreadyActive);
- return KErrNone;
- }
- else
- return Activate(aTsyReqHandle);
- }
- case EPacketContextActivateCancel:
- return ActivateCancel(aTsyReqHandle);
- case EPacketContextDeactivate:
- return Deactivate(aTsyReqHandle);
- case EPacketContextDeactivateCancel:
- return DeactivateCancel(aTsyReqHandle);
- case EPacketContextDelete:
- return Delete(aTsyReqHandle);
- case EPacketContextDeleteCancel:
- return DeleteCancel(aTsyReqHandle);
- case EPacketContextLoanCommPort:
- return LoanCommPort(aTsyReqHandle,
- REINTERPRET_CAST(RCall::TCommPort*, dataPtr));
- case EPacketContextLoanCommPortCancel:
- return LoanCommPortCancel(aTsyReqHandle);
- case EPacketContextRecoverCommPort:
- return RecoverCommPort(aTsyReqHandle);
- case EPacketContextRecoverCommPortCancel:
- return RecoverCommPortCancel(aTsyReqHandle);
- case EPacketContextGetStatus:
- return GetStatus(aTsyReqHandle,
- REINTERPRET_CAST(RPacketContext::TContextStatus*, dataPtr));
- case EPacketContextNotifyStatusChange:
- return NotifyStatusChange(aTsyReqHandle,
- REINTERPRET_CAST(RPacketContext::TContextStatus*, dataPtr));
- case EPacketContextNotifyStatusChangeCancel:
- return NotifyStatusChangeCancel(aTsyReqHandle);
- case EPacketContextGetDataVolumeTransferred:
- return GetDataVolumeTransferred(aTsyReqHandle,
- REINTERPRET_CAST(RPacketContext::TDataVolume*, dataPtr));
- case EPacketContextNotifyDataTransferred:
- return NotifyDataTransferred(aTsyReqHandle,
- REINTERPRET_CAST(RPacketContext::TDataVolume*, dataPtr),
- REINTERPRET_CAST(RPacketContext::TNotifyDataTransferredRequest*, dataPtr2));
- case EPacketContextNotifyDataTransferredCancel:
- return NotifyDataTransferredCancel(aTsyReqHandle);
- case EPacketContextGetLastErrorCause:
- return GetLastErrorCause(aTsyReqHandle,
- REINTERPRET_CAST(TInt*, dataPtr));
- case EPacketContextInitialiseContextCancel:
- return InitialiseContextCancel(aTsyReqHandle);
- case EPacketContextEnumeratePacketFiltersCancel:
- return EnumeratePacketFiltersCancel(aTsyReqHandle);
- case EPacketContextGetPacketFilterInfoCancel:
- return GetPacketFilterInfoCancel(aTsyReqHandle);
- case EPacketContextAddPacketFilterCancel:
- return AddPacketFilterCancel(aTsyReqHandle);
- case EPacketContextRemovePacketFilterCancel:
- return RemovePacketFilterCancel(aTsyReqHandle);
- case EPacketContextModifyActiveContextCancel:
- return ModifyActiveContextCancel(aTsyReqHandle);
- case EPacketContextInitialiseContext:
- return InitialiseContext(aTsyReqHandle, aPackage.Des1n());
- case EPacketContextEnumeratePacketFilters:
- return EnumeratePacketFilters(aTsyReqHandle, *REINTERPRET_CAST(TInt*, dataPtr));
- case EPacketContextGetPacketFilterInfo:
- TInt retValue;
- TRAPD(err, retValue = GetPacketFilterInfoL(aTsyReqHandle, *REINTERPRET_CAST(TInt*, dataPtr), aPackage.Des2n()));
- if(err != KErrNone)
- {
- retValue = err;
- }
- return retValue;
- case EPacketContextAddPacketFilter:
- return AddPacketFilter(aTsyReqHandle, aPackage.Des1n());
- case EPacketContextRemovePacketFilter:
- return RemovePacketFilter(aTsyReqHandle, *REINTERPRET_CAST(TInt*, dataPtr));
- case EPacketContextModifyActiveContext:
- return ModifyActiveContext(aTsyReqHandle);
- case EPacketContextGetDNSInfo:
- return GetDnsInfo(aTsyReqHandle, aPackage.Des1n());
- case EPacketContextGetDNSInfoCancel:
- return GetDnsInfoCancel(aTsyReqHandle);
- case EPacketAddMediaAuthorization:
- return GetAddMediaAuthorization(aTsyReqHandle, aPackage.Des1n());
- case EPacketAddMediaAuthorizationCancel:
- return GetAddMediaAuthorizationCancel(aTsyReqHandle);
- case EPacketRemoveMediaAuthorization:
- return GetRemoveMediaAuthorization(aTsyReqHandle, reinterpret_cast<RPacketContext::TAuthorizationToken*>(dataPtr));
- case EPacketRemoveMediaAuthorizationCancel:
- return GetRemoveMediaAuthorizationCancel(aTsyReqHandle);
- case EPacketContextCreateNewTFT:
- return CreateNewTFT(aTsyReqHandle, REINTERPRET_CAST(TInt*, dataPtr));
- case EPacketContextCreateNewTFTCancel:
- return CreateNewTFTCancel(aTsyReqHandle);
- case EPacketContextDeleteTFT:
- return DeleteTFT(aTsyReqHandle);
- case EPacketContextDeleteTFTCancel:
- return DeleteTFTCancel(aTsyReqHandle);
- default:
- return KErrNotSupported;
- }
- }
-
-TInt CSimPacketContext::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.
-*
-* @param aTsyReqHandle The request handle for completing the request
-* @param aIpc Ipc representing the request
-* @return err KErrNone if request completes ok
-*/
- {
- LOGPACKET1("CSimPacketContext: - CancelService called");
- switch (aIpc)
- {
- case EPacketContextSetConfig:
- return SetConfigCancel(aTsyReqHandle);
- case EPacketContextGetConfig:
- return GetConfigCancel(aTsyReqHandle);
- case EPacketContextNotifyConfigChanged:
- return NotifyConfigChangedCancel(aTsyReqHandle);
- case EPacketContextActivate:
- return ActivateCancel(aTsyReqHandle);
- case EPacketContextDeactivate:
- return DeactivateCancel(aTsyReqHandle);
- case EPacketContextDelete:
- return DeleteCancel(aTsyReqHandle);
- case EPacketContextLoanCommPort:
- return LoanCommPortCancel(aTsyReqHandle);
- case EPacketContextRecoverCommPort:
- return RecoverCommPortCancel(aTsyReqHandle);
- case EPacketContextNotifyStatusChange:
- return NotifyStatusChangeCancel(aTsyReqHandle);
- case EPacketContextNotifyDataTransferred:
- return NotifyDataTransferredCancel(aTsyReqHandle);
- case EPacketContextInitialiseContext:
- return InitialiseContextCancel(aTsyReqHandle);
- case EPacketContextEnumeratePacketFilters:
- return EnumeratePacketFiltersCancel(aTsyReqHandle);
- case EPacketContextGetPacketFilterInfo:
- return GetPacketFilterInfoCancel(aTsyReqHandle);
- case EPacketContextAddPacketFilter:
- return AddPacketFilterCancel(aTsyReqHandle);
- case EPacketContextRemovePacketFilter:
- return RemovePacketFilterCancel(aTsyReqHandle);
- case EPacketContextModifyActiveContext:
- return ModifyActiveContextCancel(aTsyReqHandle);
- case EPacketContextGetDNSInfo:
- return GetDnsInfoCancel(aTsyReqHandle);
- case EPacketAddMediaAuthorization:
- return GetAddMediaAuthorizationCancel(aTsyReqHandle);
- case EPacketRemoveMediaAuthorization:
- return GetRemoveMediaAuthorizationCancel(aTsyReqHandle);
- case EPacketContextCreateNewTFT:
- return CreateNewTFTCancel(aTsyReqHandle);
- case EPacketContextDeleteTFT:
- return DeleteTFTCancel(aTsyReqHandle);
- default:
- return KErrGeneral;
- }
- }
-
-TInt CSimPacketContext::TSetConfigData::Find(CArrayFixFlat<TSetConfigData>* aSetConfigArray, TTsyReqHandle aTsyReqHandle, TInt& aIndex)
- {
- for (TInt i = 0; i < aSetConfigArray->Count(); i++)
- {
- if (aSetConfigArray->At(i).iTsyReqHandle == aTsyReqHandle)
- {
- aIndex = i;
- return KErrNone;
- }
- }
- aIndex = -1;
- return KErrNotFound;
- }
-
-TInt CSimPacketContext::SetConfig(const TTsyReqHandle aTsyReqHandle,const TDesC8* aConfig)
-/**
-* Sets the configuration
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @param aConfig pointer containing the parameters to set to.
-* @return KErrNone
-
-*/
- {
- LOGPACKET1("CSimPacketContext::SetConfig called");
-
- TPckg<TPacketDataConfigBase>* configBase = (TPckg<TPacketDataConfigBase>*)aConfig;
- TPacketDataConfigBase& configBaseV1 = (*configBase)();
-
- TInt err = KErrGeneral;
-
- //Extract the config params to be set
- TContextConfigParam contextConfigToSet;
-
- if(configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigGPRS)
- {
- TPckg<RPacketContext::TContextConfigGPRS>* configParam = (TPckg<RPacketContext::TContextConfigGPRS>*)aConfig;
- RPacketContext::TContextConfigGPRS& contextConfigV1 = (*configParam)();
-
- CSimContextHelper::SetTContextConfigParamFromTContextConfigGPRS( contextConfigToSet, contextConfigV1 );
- }
-
- if(configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigRel99Rel4)
- {
- TPckg<RPacketContext::TContextConfigR99_R4>* configParam = (TPckg<RPacketContext::TContextConfigR99_R4>*)aConfig;
- RPacketContext::TContextConfigR99_R4& contextConfigV1 = (*configParam)();
-
- CSimContextHelper::SetTContextConfigParamFromTContextConfigR99_R4( contextConfigToSet, contextConfigV1 );
- }
-
- if(configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigRel5)
- {
- TPckg<RPacketContext::TContextConfig_R5>* configParam = (TPckg<RPacketContext::TContextConfig_R5>*)aConfig;
- RPacketContext::TContextConfig_R5& contextConfigV1 = (*configParam)();
-
- CSimContextHelper::SetTContextConfigParamFromTContextConfig_R5( contextConfigToSet, contextConfigV1 );
- }
-
- // Check the context config params to be set with the pre-defined
- // list of allowed config params
- if((configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigGPRS)||
- configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigRel99Rel4||
- configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigRel5)
- {
-
- TInt index;
- for(index=0; index < iContextConfigParams->Count(); index++)
- {
- TContextConfigParam thisConfig = iContextConfigParams->At(index);
-
- if ( !CSimContextHelper::EqualTContextConfigParam(contextConfigToSet, thisConfig ) )
- {
- err = KErrCorrupt;
- }
- else
- {
- err = KErrNone;
- iContextConfigParamsIndex = index;
-
- //Check for and complete any pending notifications
- if(iNotifyConfigGPRS.iNotifyPending)
- {
- iNotifyConfigGPRS.iNotifyPending=EFalse;
- CSimContextHelper::ConvertConfigParams(thisConfig, *(RPacketContext::TContextConfigGPRS*)iNotifyConfigGPRS.iNotifyData);
- ReqCompleted(iNotifyConfigGPRS.iNotifyHandle,KErrNone);
- }
-
- if(iNotifyConfigR99.iNotifyPending)
- {
- iNotifyConfigR99.iNotifyPending=EFalse;
- CSimContextHelper::ConvertConfigParams(thisConfig, *(RPacketContext::TContextConfigR99_R4*)iNotifyConfigR99.iNotifyData);
- ReqCompleted(iNotifyConfigR99.iNotifyHandle,KErrNone);
- }
-
- if(iNotifyConfigR5.iNotifyPending)
- {
- iNotifyConfigR5.iNotifyPending=EFalse;
- CSimContextHelper::ConvertConfigParams(thisConfig, *(RPacketContext::TContextConfig_R5*)iNotifyConfigR5.iNotifyData);
- ReqCompleted(iNotifyConfigR5.iNotifyHandle,KErrNone);
- }
- break;
- }
- }//end for loop
- ReqCompleted(aTsyReqHandle,err);
- }//end if((configBaseV1....
-
- else
- {
- ReqCompleted(aTsyReqHandle,KErrCorrupt);
- }
-
- return KErrNone;
- }
-
-TInt CSimPacketContext::SetConfigCancel(const TTsyReqHandle aTsyReqHandle)
-/**
-* Cancels the Setconfig request.
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @return err KErrNone
-*/
- {
- TInt index = 0;
- if (TSetConfigData::Find(iSetConfigData, aTsyReqHandle, index) == KErrNone)
- {
- iSetConfigData->Delete(index);
- }
- if (iSetConfigData->Count() == 0)
- iSetConfigTimer->Cancel();
-
- ReqCompleted(aTsyReqHandle, KErrCancel);
-
- return KErrNone;
- }
-
-TInt CSimPacketContext::GetConfig(const TTsyReqHandle aTsyReqHandle,TDes8* aConfig)
-/**
-* Retrieves and returns the configuration
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @param aConfig pointer to the data to retrieve
-* @return KErrNone
-*/
- {
- LOGPACKET1("CSimPacketContext::GetConfig called");
- TPckg<TPacketDataConfigBase>* configBase = (TPckg<TPacketDataConfigBase>*)aConfig;
- TPacketDataConfigBase& configBaseV1 = (*configBase)();
-
- // GPRS configuration
- if(configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigGPRS)
- {
- TContextConfigParam config = iContextConfigParams->At(iContextConfigParamsIndex);
-
- TPckg<RPacketContext::TContextConfigGPRS>* contextConfigGPRSPckg = (TPckg<RPacketContext::TContextConfigGPRS>*)aConfig;
- RPacketContext::TContextConfigGPRS& contextConfigV1 = (*contextConfigGPRSPckg)();
-
- CSimContextHelper::ConvertConfigParams(config, contextConfigV1);
-
- ReqCompleted(aTsyReqHandle,KErrNone);
- }
-
- // R99/R4 configuration
- else if (configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigRel99Rel4)
- {
- TContextConfigParam config = iContextConfigParams->At(iContextConfigParamsIndex);
-
- TPckg<RPacketContext::TContextConfigR99_R4>* configRel99Pckg = (TPckg<RPacketContext::TContextConfigR99_R4>*)aConfig;
- RPacketContext::TContextConfigR99_R4& configRel99 = (*configRel99Pckg)();
-
- CSimContextHelper::ConvertConfigParams(config, configRel99);
-
- ReqCompleted(aTsyReqHandle,KErrNone);
- }
-
- // R5 configuration
- else if (configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigRel5)
- {
- TContextConfigParam config = iContextConfigParams->At(iContextConfigParamsIndex);
-
- TPckg<RPacketContext::TContextConfig_R5>* configRel5Pckg = (TPckg<RPacketContext::TContextConfig_R5>*)aConfig;
- RPacketContext::TContextConfig_R5& configRel5 = (*configRel5Pckg)();
-
- CSimContextHelper::ConvertConfigParams(config, configRel5);
-
- ReqCompleted(aTsyReqHandle,KErrNone);
- }
- return KErrNone;
- }
-
-TInt CSimPacketContext::GetConfigCancel(const TTsyReqHandle /*aTsyReqHandle*/)
-/**
-* Cancels the Getconfig request. This method will do nothing in this version of SimTSY.
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @return err KErrNone
-*/
- {
- return KErrNone;
- }
-
-TInt CSimPacketContext::NotifyConfigChanged(const TTsyReqHandle aTsyReqHandle, TDes8* aConfig)
-/**
-* Records a client interest in being notified of a change in the Context Configuration.
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @param aConfig pointer to the context config to store the config info when the config changes.
-* @return KErrNone
-*/
- {
- TPckg<TPacketDataConfigBase>* configBase = (TPckg<TPacketDataConfigBase>*)aConfig;
- TPacketDataConfigBase& configBaseV1 = (*configBase)();
-
- if(configBaseV1.ExtensionId() == TPacketDataConfigBase::KConfigGPRS)
- {
- __ASSERT_ALWAYS(!iNotifyConfigGPRS.iNotifyPending,SimPanic(ENotificationAlreadyPending));
-
- iNotifyConfigGPRS.iNotifyPending = ETrue;
- iNotifyConfigGPRS.iNotifyHandle = aTsyReqHandle;
- iNotifyConfigGPRS.iNotifyData = &configBaseV1;
- }
- else if(configBaseV1.ExtensionId() == TPacketDataConfigBase::KConfigRel99Rel4)
- {
- __ASSERT_ALWAYS(!iNotifyConfigR99.iNotifyPending,SimPanic(ENotificationAlreadyPending));
-
- iNotifyConfigR99.iNotifyPending = ETrue;
- iNotifyConfigR99.iNotifyHandle = aTsyReqHandle;
- iNotifyConfigR99.iNotifyData = &configBaseV1;
- }
- else if(configBaseV1.ExtensionId() == TPacketDataConfigBase::KConfigRel5)
- {
- __ASSERT_ALWAYS(!iNotifyConfigR5.iNotifyPending,SimPanic(ENotificationAlreadyPending));
-
- iNotifyConfigR5.iNotifyPending = ETrue;
- iNotifyConfigR5.iNotifyHandle = aTsyReqHandle;
- iNotifyConfigR5.iNotifyData = &configBaseV1;
- }
-
- return KErrNone;
- }
-
-TInt CSimPacketContext::NotifyConfigChangedCancel(const TTsyReqHandle aTsyReqHandle)
-/**
-* Cancel a client's interest in being notified when the context configuration 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("CSimPacketContext::NotifyConfigChangedCancel called");
- if(iNotifyConfigGPRS.iNotifyPending &&
- iNotifyConfigGPRS.iNotifyHandle == aTsyReqHandle)
- {
- iNotifyConfigGPRS.iNotifyPending=EFalse;
- ReqCompleted(aTsyReqHandle,KErrCancel);
- }
- else if(iNotifyConfigR99.iNotifyPending &&
- iNotifyConfigR99.iNotifyHandle == aTsyReqHandle)
- {
- iNotifyConfigR99.iNotifyPending=EFalse;
- ReqCompleted(aTsyReqHandle,KErrCancel);
- }
- else if(iNotifyConfigR5.iNotifyPending &&
- iNotifyConfigR5.iNotifyHandle == aTsyReqHandle)
- {
- iNotifyConfigR5.iNotifyPending=EFalse;
- ReqCompleted(aTsyReqHandle,KErrCancel);
- }
-
- return KErrNone;
- }
-
-TInt CSimPacketContext::AttemptDeactivateImmediately()
-/**
-* Called when client wishes to Detach when there is an active context.
-* This will deactivate the context immediately from the network.
-*
-* @return KErrNone if deactivated successfully.
-*/
- {
- if((iState==RPacketContext::EStatusActive) || (iState==RPacketContext::EStatusActivating))
- {
- iCurrentEvent=EContextEventDeactivate;
- TInt ret = ChangeState(RPacketContext::EStatusDeactivating);
- if(ret!=KErrNone)
- return ret;
- return ChangeState(RPacketContext::EStatusInactive);
- }
- return KErrNone;
- }
-
-TInt CSimPacketContext::ReActivate(CSimPacketService* aPacketService, const TName& aContextName)
-/**
-* This method is called by the packet Service to Re-Initialise a Deleted context.
-* If the context is deleted then the client cannot retrieve any
-* infomation or use the context in any way.
-* In order for the client to use the context again, the client must
-* open an object by name passing
-* the name of this context as a pararemter.
-*
-* @param aPacketService pointer to the parent class CSimPacketService.
-* @param aContextName Must be the same name as the name for this context.
-* @return KErrNone if no problem in re-initialising this context.
-*/
- {
- if(iContextName.Compare(aContextName) != KErrNone)
- {
- return KErrBadName;
- }
-
- iPacketService = aPacketService;
-
- if(iDeleted)
- {
-
- TInt ret = ChangeState(RPacketContext::EStatusInactive);
- if (ret != KErrNone)
- {
- return ret;
- }
-
- iDeleted = EFalse;
- iContextConfigParamsIndex = 0;
- iNotifyStatusChange.iNotifyPending = EFalse;
- iNotifyConfigGPRS.iNotifyPending = EFalse;
- iNotifyConfigR99.iNotifyPending = EFalse;
- iNotifyConfigR5.iNotifyPending = EFalse;
-
- }
- return KErrNone;
- }
-
-TInt CSimPacketContext::DoDeactivate()
-/**
-* This method is called when timer events for deactivate context has completed.
-* It will then try to terminate the NTRas Connection.
-*
-* @return KErrNone
-*/
- {
- iNotifyContextConfigChangeTimer->Cancel();
- iNtRas->Terminate();
- return KErrNone;
- }
-
-TInt CSimPacketContext::Deactivate(const TTsyReqHandle aTsyReqHandle)
-/**
-* Client calls this method to try to Deactivate an active context.
-* In this method, we'll store the TsyReqHandle for later completion then call ActionEvent
-* state machine to handle the event which will kick off a timer.
-* The Actual Deactivation will take place in the DoDeactivate method.
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @return KErrNone
-*/
- {
- LOGPACKET1("CSimPacketContext::Deactivate called");
- iDeactivateRequestHandle = aTsyReqHandle;
- TInt ret;
- ret = ActionEvent(EContextEventDeactivate,KErrNone);
- return ret;
- }
-
-TInt CSimPacketContext::DeactivateCancel(const TTsyReqHandle aTsyReqHandle)
-/**
-* Client calls this method to try and cancel a Deactivate request.
-* This will only complete successfully if and only if the Deactivate request has not completed.
-* i.e. if we haven't already deactivated the context.
-*
-* @param aTsyReqHandle Tsy Request handle for the client cancel request
-* @return KErrNone
-*/
- {
- LOGPACKET1("CSimPacketContext::DeactivateCancel called");
- if(((iState == RPacketContext::EStatusInactive) || (iState == RPacketContext::EStatusDeactivating)) &&
- (iCurrentEvent==EContextEventDeactivate))
- {
- iTimer->Cancel();
- iCurrentEvent= EContextEventNone;
- TInt ret = ChangeState(RPacketContext::EStatusActive);
- if(ret!= KErrNone)
- ReqCompleted(aTsyReqHandle,ret);
- ReqCompleted(aTsyReqHandle,KErrCancel);
- }
-
- return KErrNone;
- }
-
-TInt CSimPacketContext::DoActivate()
-/**
-* This method is called when timer events for Activate context has completed.
-* It will then try to Set up the NtRas Connection and open a port for client use.
-*
-* @return KErrNone
-*/
- {
- TCommConfigV01 commConfig;
- TCommSetupItem item = FindCommSettings();
-
- if (iPacketqos)
- {
- iPacketqos->ClearChangeQoSPending();
- }
- commConfig.iRate=item.iConfig.iRate;
- commConfig.iDataBits=EData8;
- commConfig.iStopBits=EStop1;
- commConfig.iHandshake=item.iConfig.iHandshake;
- iCommReset=item.iCommReset;
- TInt ras = iNtRas->Connect(item.iCsyName,item.iPortName,commConfig,this);
-
- TContextConfigParam thisConfig = iContextConfigParams->At(iContextConfigParamsIndex);
-
- // Check for and complete any pending notifications
- if(iNotifyConfigGPRS.iNotifyPending)
- {
- iNotifyConfigGPRS.iNotifyPending=EFalse;
- CSimContextHelper::ConvertConfigParams(thisConfig, *(RPacketContext::TContextConfigGPRS*)iNotifyConfigGPRS.iNotifyData);
- ReqCompleted(iNotifyConfigGPRS.iNotifyHandle,KErrNone);
- }
-
- if(iNotifyConfigR99.iNotifyPending)
- {
- iNotifyConfigR99.iNotifyPending=EFalse;
- CSimContextHelper::ConvertConfigParams(thisConfig, *(RPacketContext::TContextConfigR99_R4*)iNotifyConfigR99.iNotifyData);
- ReqCompleted(iNotifyConfigR99.iNotifyHandle,KErrNone);
- }
-
- if(iNotifyConfigR5.iNotifyPending)
- {
- iNotifyConfigR5.iNotifyPending=EFalse;
- CSimContextHelper::ConvertConfigParams(thisConfig, *(RPacketContext::TContextConfig_R5*)iNotifyConfigR5.iNotifyData);
- ReqCompleted(iNotifyConfigR5.iNotifyHandle,KErrNone);
- }
-
- // start the timer for the simulated network-side context parameter changes
- if(iNotifyContextConfigChangeArray->Count() > 0)
- {
- TInt delay = (iNotifyContextConfigChangeArray->At(0)).iDelay;
- iNotifyContextConfigChangeTimer->Start(delay,this,ETimerIdPcktContextConfigChange);
- }
-
- return ras;
- }
-
-
-TInt CSimPacketContext::Activate(const TTsyReqHandle aTsyReqHandle)
-/**
-* Client calls this method to try to Activate a context.
-* In this method, we'll store the TsyReqHandle for later completion then call ActionEvent
-* state machine to handle the event which will kick off a timer.
-* The Actual Activation will take place in the DoActivate method.
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @return KErrNone
-*/
- {
- iActivateRequestHandle = aTsyReqHandle;
- TInt ret;
- ret = ActionEvent(EContextEventActivate,KErrNone);
- return ret;
- }
-
-
-TInt CSimPacketContext::ActivateCancel(const TTsyReqHandle aTsyReqHandle)
-/**
-* Client calls this method to try and cancel an Activate request.
-* This will only complete successfully if and only if the Activate request has not completed.
-* i.e. if we haven't already activated the context.
-*
-* @param aTsyReqHandle Tsy Request handle for the client cancel request
-* @return KErrNone
-*/
- {
- LOGPACKET1("CSimPacketContext::ActivateCancel called");
- if(((iState == RPacketContext::EStatusInactive) || (iState == RPacketContext::EStatusActivating)) &&
- (iCurrentEvent==EContextEventActivate))
- {
- iTimer->Cancel();
- iCurrentEvent= EContextEventNone;
- TInt ret = ChangeState(RPacketContext::EStatusInactive);
- if(ret!= KErrNone)
- ReqCompleted(aTsyReqHandle,ret);
- else
- ReqCompleted(aTsyReqHandle,KErrCancel);
- }
- else if (iState == RPacketContext::EStatusDeleted)
- {
- ReqCompleted(aTsyReqHandle,KErrCancel);
- }
-
- return KErrNone;
- }
-
-TInt CSimPacketContext::DoDelete()
-/**
-* This method is called when timer events for Delete context has completed.
-* It will then try to Terminate the NtRas Connection and then set the context as deleted.
-* Once the context is deleted then the client cannot retrieve any information about the context
-* or use the context. calling ReActivateContext will reinstate this context.
-*
-* @return KErrNone
-*/
- {
- iDeleted = ETrue;
- iNtRas->Terminate();
- iQoSObjectCount--;
- return KErrNone;
- }
-
-
-TInt CSimPacketContext::Delete(const TTsyReqHandle aTsyReqHandle)
-/**
-* Client calls this method to try to Delete this context.
-* In this method, we'll store the TsyReqHandle for later completion then call ActionEvent
-* state machine to handle the event which will kick off a timer.
-* The Actual Delete will take place in the DoDelete method.
-*
-* This request will only succeed if the context already exist (had been created) and also not
-* previously deleted.
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @return KErrNone
-*/
- {
- LOGPACKET1("CSimPacketContext::Delete called");
- iDeleteRequestHandle = aTsyReqHandle;
- TInt ret;
- ret = ActionEvent(EContextEventDelete,KErrNone);
- return ret;
- }
-
-TInt CSimPacketContext::DeleteCancel(const TTsyReqHandle aTsyReqHandle)
-/**
-* Client calls this method to try and cancel a Delete context request.
-* This will only complete successfully if and only if the Delete request has not completed.
-* i.e. if we haven't already Deleted the context.
-*
-* @param aTsyReqHandle Tsy Request handle for the client cancel request
-* @return KErrNone
-*/
- {
- LOGPACKET1("CSimPacketContext::DeleteCancel called");
- if((iState == RPacketContext::EStatusInactive) && (iCurrentEvent==EContextEventDelete))
- {
- iTimer->Cancel();
- iCurrentEvent= EContextEventNone;
- ReqCompleted(aTsyReqHandle,KErrCancel);
- }
- return KErrNone;
- }
-
-TInt CSimPacketContext::LoanCommPort(const TTsyReqHandle aTsyReqHandle,RCall::TCommPort* aDataPort)
-/**
-* The method will return to the client the port it has opened previously in the Activate method
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @param aDataPort Pointer to the port and csy name for the opened port.
-* @return KErrNone
-*/
- {
- LOGPACKET1("CSimPacketContext::LoanCommPort called");
-
- if(iState != RPacketContext::EStatusActive)
- {
- ReqCompleted(aTsyReqHandle, KErrEtelCallNotActive);
- return KErrNone;
- }
- if (iCommPortLoaned)
- {
- ReqCompleted(aTsyReqHandle, KErrEtelPortAlreadyLoaned);
- return KErrNone;
- }
-
- TCommSetupItem item = FindCommSettings();
- aDataPort->iCsy.Copy(item.iCsyName);
- aDataPort->iPort.Copy(item.iPortName);
- iCommPortLoaned = ETrue;
- ReqCompleted(aTsyReqHandle,KErrNone);
-
- return KErrNone;
- }
-
-TInt CSimPacketContext::LoanCommPortCancel(const TTsyReqHandle /*aTsyReqHandle*/)
-/**
-* Cancels a client loan port request. This method will do nothing.
-*
-* @param aTsyReqHandle Tsy Request handle for the client cancel request
-* @return KErrNone
-*/
- {
- LOGPACKET1("CSimPacketContext::LoanCommPortCancel called");
- return KErrNone;
- }
-
-TInt CSimPacketContext::RecoverCommPort(const TTsyReqHandle aTsyReqHandle)
-/**
-* In this method we'll try and terminate the NtRas connection and reover the port.
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @return KErrNone
-*/
- {
- LOGPACKET1("CSimPacketContext::RecoverCommPort called");
- if (!iCommPortLoaned)
- {
- ReqCompleted(aTsyReqHandle, KErrEtelPortNotLoanedToClient);
- return KErrNone;
- }
- iNtRas->Terminate();
- iCommPortLoaned = EFalse;
- ReqCompleted(aTsyReqHandle,KErrNone);
- return KErrNone;
- }
-
-TInt CSimPacketContext::RecoverCommPortCancel(const TTsyReqHandle /*aTsyReqHandle*/)
-/**
-* Attempt to cancel a RecoverCommPort request. This method does nothing
-*
-* @param aTsyReqHandle Tsy Request handle for the client cancel request
-* @return KErrNone
-*/
- {
- LOGPACKET1("CSimPacketContext::RecoverCommPortCancel called");
- return KErrNone;
- }
-
-TInt CSimPacketContext::GetStatus(const TTsyReqHandle aTsyReqHandle,RPacketContext::TContextStatus* aContextStatus)
-/**
-* Retrieves and returns the current status of the Packet context in the aContextStatus parameter.
-*
-* @param aTsyReqHandle Tsy Request handle for the client cancel request
-* @param aContextStatus pointer to the status of the packet context.
-* @return KerrNone
-*/
- {
- LOGPACKET1("CSimPacketContext::GetStatus called");
- *aContextStatus = iState;
- ReqCompleted(aTsyReqHandle,KErrNone);
- return KErrNone;
- }
-
-TInt CSimPacketContext::NotifyStatusChange(const TTsyReqHandle aTsyReqHandle,RPacketContext::TContextStatus* aContextStatus)
-/**
-* Record a client's interest in being notified of the state of the packet 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 aContextStatus pointer to the packet context status
-* @return KErrNone
-*/
- {
- LOGPACKET1("CSimPacketContext::NotifyStatusChange called");
- __ASSERT_ALWAYS(!iNotifyStatusChange.iNotifyPending,SimPanic(ENotificationAlreadyPending));
- iNotifyStatusChange.iNotifyPending = ETrue;
- iNotifyStatusChange.iNotifyHandle = aTsyReqHandle;
- iNotifyStatusChange.iNotifyData = aContextStatus;
- return KErrNone;
- }
-
-
-
-TInt CSimPacketContext::NotifyStatusChangeCancel(const TTsyReqHandle aTsyReqHandle)
-/**
-* Cancel a client's interest in being notified when the packet context 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("CSimPacketContext::NotifyStatusChangeCancel called");
- if(iNotifyStatusChange.iNotifyPending)
- {
- iNotifyStatusChange.iNotifyPending=EFalse;
- ReqCompleted(aTsyReqHandle,KErrCancel);
- }
- return KErrNone;
- }
-
-TInt CSimPacketContext::GetDataVolumeTransferred(const TTsyReqHandle aTsyReqHandle,RPacketContext::TDataVolume* /*aVolume*/)
-/**
-* Retrieves and returns the to the client the amount of data sent over the serial port.
-* This method is not supported and will request complete with KErrNotSupported
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @param aVolume pointer to the volume of data trasferred so far.
-* @return KErrNone
-*/
- {
- LOGPACKET1("CSimPacketContext::GetDataVolumeTransferred called");
- ReqCompleted(aTsyReqHandle,KErrNotSupported);
- return KErrNone;
- }
-
-TInt CSimPacketContext::NotifyDataTransferred(const TTsyReqHandle aTsyReqHandle, RPacketContext::TDataVolume* /*aVolume*/, RPacketContext::TNotifyDataTransferredRequest* /*aData*/)
-/**
-* Notifies the client when data is sent or received over the comm port
-* This method is not supported in this version of the TSY.
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @param aVolume pointer to the volume of data trasferred so far.
-* @param aData indicates to the client whether the data was sent or received.
-* @return KErrNone
-*/
- {
- ReqCompleted(aTsyReqHandle,KErrNotSupported);
- return KErrNone;
- }
-
-TInt CSimPacketContext::NotifyDataTransferredCancel(const TTsyReqHandle /*aTsyReqHandle*/)
-/**
-* Cancels the NotifyDataTransferred request
-*
-* @param aTsyReqHandle Tsy Request handle for the client cancel request
-* @return KerrNone
-*/
- {
- LOGPACKET1("CSimPacketContext::NotifyDataTransferredCancel called");
- return KErrNone;
- }
-
-TInt CSimPacketContext::GetLastErrorCause(const TTsyReqHandle aTsyReqHandle, TInt* aError)
-/**
-* This method is not supported in this TSY
-*
-* @param aTsyReqHandle Tsy Request handle for the client request
-* @param aError pointer to the last error cause
-* @return KerrNone
-*/
- {
- LOGPACKET1("CSimPacketContext::GetLastErrorCause called");
- *aError = iLastError;
- ReqCompleted(aTsyReqHandle,iErrorCodeForGetLastErrorCause);
- iErrorCodeForGetLastErrorCause = KErrNone;
- return KErrNone;
- }
-
-void CSimPacketContext::TimerCallBack(TInt aId)
-/**
-* Timer callback function. When the timer goes off, it will call back into this
-* function for further processing.
-*/
- {
- TInt newIndex = KErrNotFound;
-
- switch(aId)
- {
- case ETimerIdPcktContextStatusChange:
- TimerCallBackNotifyContextStatusChange();
- break;
- case ETimerIdPcktContextSetConfig:
- SetConfig(iSetConfigData->At(0).iTsyReqHandle, iSetConfigData->At(0).iData);
- iSetConfigData->Delete(0);
- if (iSetConfigData->Count() != 0)
- iSetConfigTimer->Start(iSetConfigDelay,this,ETimerIdPcktContextSetConfig);
- break;
- case ETimerIdPcktContextConfigChange:
- //Check the validity of the new context config param index before applying it
- newIndex = (iNotifyContextConfigChangeArray->At(0)).iNewContextConfigIndex;
- if(newIndex <= iContextConfigParams->Count() - 1)
- {
- //Change the context config param index to point to the new context configuration
- iContextConfigParamsIndex = newIndex;
-
- // Check for and complete any pending notifications
- if(iNotifyConfigGPRS.iNotifyPending)
- {
- iNotifyConfigGPRS.iNotifyPending=EFalse;
- CSimContextHelper::ConvertConfigParams(iContextConfigParams->At(iContextConfigParamsIndex),
- *(RPacketContext::TContextConfigGPRS*)iNotifyConfigGPRS.iNotifyData);
- ReqCompleted(iNotifyConfigGPRS.iNotifyHandle,KErrNone);
- }
-
- if(iNotifyConfigR99.iNotifyPending)
- {
- iNotifyConfigR99.iNotifyPending=EFalse;
- CSimContextHelper::ConvertConfigParams(iContextConfigParams->At(iContextConfigParamsIndex),
- *(RPacketContext::TContextConfigR99_R4*)iNotifyConfigR99.iNotifyData);
- ReqCompleted(iNotifyConfigR99.iNotifyHandle,KErrNone);
- }
-
- if(iNotifyConfigR5.iNotifyPending)
- {
- iNotifyConfigR5.iNotifyPending=EFalse;
- CSimContextHelper::ConvertConfigParams(iContextConfigParams->At(iContextConfigParamsIndex),
- *(RPacketContext::TContextConfig_R5*)iNotifyConfigR5.iNotifyData);
- ReqCompleted(iNotifyConfigR5.iNotifyHandle,KErrNone);
- }
- }
-
- else
- {
- LOGMISC1(">>CSimPacketContext.cpp: Invalid new context config param index");
- }
-
- //Delete the current NotifyContextConfigChange item and set the next one if possible
- iNotifyContextConfigChangeArray->Delete(0);
-
- if(iNotifyContextConfigChangeArray->Count() > 0)
- {
- TInt delay = (iNotifyContextConfigChangeArray->At(0)).iDelay;
- iNotifyContextConfigChangeTimer->Start(delay,this, ETimerIdPcktContextConfigChange);
- }
- break;
-
- case ETimerIdPcktContextInitContext:
- DoInitialiseContext();
- break;
- case ETimerIdPcktContextCreateTft:
- DoCreateNewTFT();
- break;
- default:
- {
- LOGPACKET1(">>CSimPacketContext::TimerCallBack");
- TInt ret=ActionEvent(EContextEventTimeOut,KErrNone);
- __ASSERT_ALWAYS(ret==KErrNone,SimPanic(ETimeOutEventActionFailed)); // Note: this is very crude error handling and should be replaced by something rather more elegant.
- LOGPACKET1("<<CSimPacketContext::TimerCallBack");
- iTFTChangeBool = EFalse;
- break;
- }
- }
- }
-
-void CSimPacketContext::PubSubCallback(TInt aIndex)
- {
- TInt length = iNotifyContextStatusChangeArray->Count();
- if (aIndex < length)
- {
- TNotifyContextStatusChange& statusChange = iNotifyContextStatusChangeArray->At(aIndex);
- if (statusChange.iContextName.Compare(iContextName) == 0)
- {
- CompleteContextStatusChange(statusChange.iStatus);
- }
- }
- }
-
-/**
-* This is for the NotifyContextStatusChange timer callback
-*/
-void CSimPacketContext::TimerCallBackNotifyContextStatusChange()
- {
- if(GetContextStatusChangeCount() <= iNotifyContextStatusChangeIndex)
- {
- // the index is out of bounds
- return;
- }
- TNotifyContextStatusChange& statusChange = GetContextStatusChangeAt(iNotifyContextStatusChangeIndex);
-
- CompleteContextStatusChange(statusChange.iStatus);
-
- iNotifyContextStatusChangeIndex++;
- if (GetContextStatusChangeCount() > iNotifyContextStatusChangeIndex)
- {
- // start timer again
- iNotifyContextStatusChangeTimer->Start(GetContextStatusChangeAt(iNotifyContextStatusChangeIndex).iDuration,this,ETimerIdPcktContextStatusChange);
- }
- }
-
-void CSimPacketContext::CompleteContextStatusChange(RPacketContext::TContextStatus& aStatus)
- {
- iCurrentNotifyContextStatusChange = aStatus;
-
- ChangeState(iCurrentNotifyContextStatusChange);
- if (RPacketContext::EStatusDeleted == iCurrentNotifyContextStatusChange)
- {
- DoDelete();
- }
- }
-
-void CSimPacketContext::NTRasCallBack(TInt aStatus)
-/**
- * NTRas callback function. This function will be called when the NTRAS
- * Server has responded.
- *
- * @param aStatus Standard error value, indicating the success or failure of the NTRAS
- * connection.
- */
- {
- __ASSERT_ALWAYS(ActionEvent(EContextEventNtRas,aStatus) == KErrNone,SimPanic(EGeneral));
- if(iCommReset)
- iNtRas->Terminate();
- }
-
-RPacketService::TStatus CSimPacketContext::ConvertToPacketServiceStatus(RPacketContext::TContextStatus aNewState)
-/**
-* Converts Packet Context Status (RPacketContext::TContextStatus) to
-* Packet Service Status (RPacketService::TStatus)
-*
-* @param aNewState the Context status to convert to packet service status
-* @return RPacketService::TStatus The packet service status conversion
-*/
- {
- RPacketService::TStatus serviceStatus;
- switch (aNewState)
- {
- case RPacketContext::EStatusInactive:
- case RPacketContext::EStatusActivating:
- case RPacketContext::EStatusDeleted:
- serviceStatus = RPacketService::EStatusAttached;
- break;
- case RPacketContext::EStatusActive:
- case RPacketContext::EStatusDeactivating:
- serviceStatus = RPacketService::EStatusActive;
- break;
- case RPacketContext::EStatusSuspended:
- serviceStatus = RPacketService::EStatusSuspended;
- break;
- default:
- serviceStatus = RPacketService::EStatusUnattached;
- break;
- }
- return serviceStatus;
- }
-
-
-TInt CSimPacketContext::ChangeState(RPacketContext::TContextStatus 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 aNewState the new state to change to
-* @return Error indication if change of state is successful or not
-*/
- {
- LOGPACKET2(">>CSimPacketContext::ChangeState [newState=%d]", aNewState);
- __ASSERT_ALWAYS(aNewState!=RPacketContext::EStatusUnknown,SimPanic(ECallStatusUnknownIllegal));
-
- if(iState==aNewState)
- return KErrNone;
-
- TInt ret=KErrGeneral;
- const struct TContextStateChangeValidity* stateChangePnt=KContextStateChangeValidity;
- while(stateChangePnt->iOldState!=KContextStateTableTerminator)
- {
- 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 = iPacketService->ChangeState(ConvertToPacketServiceStatus(aNewState));
- if(ret!=KErrNone)
- return ret;
-
-// Actually change the state.
- iState=aNewState;
-
-// Check for a pending line state notification.
- if(iNotifyStatusChange.iNotifyPending)
- {
- iNotifyStatusChange.iNotifyPending=EFalse;
- *(RPacketContext::TContextStatus*)iNotifyStatusChange.iNotifyData=iState;
- ReqCompleted(iNotifyStatusChange.iNotifyHandle,KErrNone);
- }
-
-
- LOGPACKET1("<<CSimPacketContext::ChangeState");
- return KErrNone;
- }
-
-TInt CSimPacketContext::ActionEvent(TContextEvent aEvent,TInt aStatus)
-/**
-* 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 Context.
-*
-* @param aEvent The Packet Context event to handle
-* @return value represents the error state caused by the attempted state machine jump.
-*/
- {
- TInt ret=KErrNone;
- __ASSERT_ALWAYS(iState!=RPacketContext::EStatusUnknown,SimPanic(ECallStatusUnknownIllegal));
-
- TBool found = EFalse;
- TInt i = 0;
- TInt count = iContextConfigsRel99->Count();
- for(i = 0; i<count; i++)
- {
- if(iContextName.Compare(iContextConfigsRel99->At(i).iContextName)==0)
- {
- found = ETrue;
- break;
- }
- }
-
- switch(aEvent)
- {
- case EContextEventActivate:
- LOGPACKET1(">>CSimPacketContext::ActionEvent = [EContextEventActivate]");
- if(iState==RPacketContext::EStatusInactive)
- {
- iCurrentEvent=EContextEventActivate;
- ret = ChangeState(RPacketContext::EStatusActivating);
- if(ret!=KErrNone)
- ReqCompleted(iActivateRequestHandle,ret);
- else
- {
- if(!found)
- iTimer->Start(iActivatePause,this);
- else
- iTimer->Start(iContextConfigsRel99->At(i).iActivatePause,this);
- }
- }
- else
- ReqCompleted(iActivateRequestHandle, KErrGprsActivationRejected);
- break;
-
- case EContextEventDeactivate:
- LOGPACKET1(">>CSimPacketContext::ActionEvent = [EContextEventDeactivate]");
- if(iState==RPacketContext::EStatusActive)
- {
- iCurrentEvent=EContextEventDeactivate;
- ret = ChangeState(RPacketContext::EStatusDeactivating);
- if(ret!=KErrNone)
- ReqCompleted(iDeactivateRequestHandle,ret);
- else
- {
- if (!found)
- iTimer->Start(iDeactivatePause,this);
- else
- iTimer->Start(iContextConfigsRel99->At(i).iDeactivatePause,this);
- }
- }
- else
- ReqCompleted(iDeactivateRequestHandle, KErrNone);
- break;
-
- case EContextEventDelete:
- LOGPACKET1(">>CSimPacketContext::ActionEvent = [EContextEventDelete]");
- if(iState==RPacketContext::EStatusInactive)
- {
- iCurrentEvent=EContextEventDelete;
-
- if (!found)
- iTimer->Start(iDeletePause,this);
- else
- iTimer->Start(iContextConfigsRel99->At(i).iDeletionPause,this);
- }
- else
- ReqCompleted(iDeleteRequestHandle, KErrInUse);
- break;
-
- case EContextEventNtRas:
- if((iState==RPacketContext::EStatusActivating) && (iCurrentEvent==EContextEventNtRas))
- {
- if(aStatus!=KErrNone)
- {
- ReqCompleted(iActivateRequestHandle,aStatus);
- ret=ChangeState(RPacketContext::EStatusInactive);
- __ASSERT_ALWAYS(ret==KErrNone,SimPanic(EIllegalStateInconsistancy));
- return KErrNone;
- }
- else
- {
- ret=ChangeState(RPacketContext::EStatusActive);
- ReqCompleted(iActivateRequestHandle,ret);
- iIsActive = ETrue;
- return KErrNone;
- }
- }
- iCurrentEvent=EContextEventNone;
- break;
-
- case EContextEventTimeOut:
- LOGPACKET1(">>CSimPacketContext::ActionEvent = [EContextEventTimeOut]");
- switch(iCurrentEvent)
- {
- case EContextEventNone:
- break;
- case EContextEventActivate:
- if(iState==RPacketContext::EStatusActivating)
- {
- TInt activateValue;
- if (found)
- activateValue = iContextConfigsRel99->At(i).iActivateErrorCode;
- else
- activateValue = iActivateFail;
- if(activateValue == KContextGoToInactiveWithErrorWhenTryingToGetLastErrorCode)
- {
- //this will allow context activation move to the next state but with context being inactive
- ret=ChangeState(RPacketContext::EStatusInactive);
- iCurrentEvent=EContextEventNone;
- iLastError = activateValue;
- iErrorCodeForGetLastErrorCause=KErrGeneral;
-
- iContextConfigsRel99->At(i).iActivateErrorCode = iLastError;
- ReqCompleted(iActivateRequestHandle, KErrNone);
-
- break;
- }
- if(activateValue <= KContextGoToInactiveWithExtendedErrorCode && activateValue > KContextGoToInactiveWithNormalErrorCode)
- {
- //this will allow context activation move to the next state but with context being inactive
- //tsy extended error case
- ret=ChangeState(RPacketContext::EStatusInactive);
- iCurrentEvent=EContextEventNone;
- iLastError = activateValue - KContextGoToInactiveWithExtendedErrorCode;
- //move the error code to the higher 16 bit.
- iLastError<<=16;
-
- iContextConfigsRel99->At(i).iActivateErrorCode = iLastError;
- ReqCompleted(iActivateRequestHandle, KErrNone);
-
- break;
- }
- if(activateValue <= KContextGoToInactiveWithNormalErrorCode && activateValue > KLimitForErrorCodeForContextGoToInactive)
- {
- //this will allow context activation move to the next state but with context being inactive
- //normal error case
- ret=ChangeState(RPacketContext::EStatusInactive);
- iCurrentEvent=EContextEventNone;
- iLastError = activateValue - KContextGoToInactiveWithNormalErrorCode;
-
- iContextConfigsRel99->At(i).iActivateErrorCode = iLastError;
- ReqCompleted(iActivateRequestHandle, KErrNone);
-
- break;
- }
- else
- if(activateValue != KErrNone)
- {
- ReqCompleted(iActivateRequestHandle,activateValue);
- ret=ChangeState(RPacketContext::EStatusInactive);
- iCurrentEvent=EContextEventNone;
- activateValue = KErrNone;
-
- if (found)
- iContextConfigsRel99->At(i).iActivateErrorCode = activateValue;
- else
- iActivateFail = activateValue;
- break;
- }
- else
- {
- if (found)
- {
- if (iContextConfigsRel99->At(i).iConnectToNtRas)
- {
- ret = DoActivate();
- if (ret == KErrNone)
- iCurrentEvent=EContextEventNtRas;
- else
- iCurrentEvent=EContextEventNone;
- }
- else
- {
- iCurrentEvent=EContextEventNone;
- ReqCompleted(iActivateRequestHandle,activateValue);
- ret=ChangeState(RPacketContext::EStatusActive);
- iIsActive = ETrue;
- }
- }
- else
- {
- ret = DoActivate();
- if (ret == KErrNone)
- iCurrentEvent=EContextEventNtRas;
- else
- iCurrentEvent=EContextEventNone;
- }
- }
- }
- break;
- case EContextEventDeactivate:
- TInt deActivateValue;
- if (found)
- deActivateValue = iContextConfigsRel99->At(i).iDeactivateErrorCode;
- else
- deActivateValue = iDeactivateFail;
-
- if(iState==RPacketContext::EStatusDeactivating)
- {
- if(deActivateValue != KErrNone)
- {
- ReqCompleted(iDeactivateRequestHandle,deActivateValue);
- ret=ChangeState(RPacketContext::EStatusActive);
- deActivateValue = KErrNone;
-
- if (found)
- iContextConfigsRel99->At(i).iDeactivateErrorCode = deActivateValue;
- else
- iDeactivateFail = deActivateValue;
- break;
- }
- else {
- ret=ChangeState(RPacketContext::EStatusInactive);
- if(ret==KErrNone)
- {
- ret = DoDeactivate();
- if(ret==KErrNone)
- {
- ReqCompleted(iDeactivateRequestHandle,deActivateValue);
- iIsActive=EFalse;
- }
- else
- ReqCompleted(iDeactivateRequestHandle,ret);
- }
- else
- ReqCompleted(iDeactivateRequestHandle,ret);
- }
- }
- iCurrentEvent=EContextEventNone;
- break;
- case EContextEventDelete:
- TInt deleteValue;
- if (found)
- deleteValue = iContextConfigsRel99->At(i).iDeletionErrorCode;
- else
- deleteValue = iDeleteFail;
-
- if(iState==RPacketContext::EStatusInactive)
- {
- if(deleteValue != KErrNone)
- {
- ReqCompleted(iDeleteRequestHandle,deleteValue);
- deleteValue = KErrNone;
- if (found)
- iContextConfigsRel99->At(i).iDeletionErrorCode = deleteValue;
- else
- iDeleteFail = deleteValue;
- break;
- }
- else {
- ret=ChangeState(RPacketContext::EStatusDeleted);
- if(ret==KErrNone)
- {
- ret = DoDelete();
- if(ret==KErrNone)
- ReqCompleted(iDeleteRequestHandle,deleteValue);
- else
- ReqCompleted(iDeleteRequestHandle,ret);
- }
- else
- ReqCompleted(iDeleteRequestHandle,ret);
- }
- }
- iCurrentEvent=EContextEventNone;
- break;
- default: //in case of EContextEventTimeOut
- break;
- }
- break;
-
- default:
- break;
- }
- return ret;
- }
-
-const CTestConfigSection* CSimPacketContext::CfgFile()
-/**
-* Return a pointer to the Configuration File Section
-*
-* @return CTestConfigSection pointer to the configuration file section
-*/
- {
- return iPacketService->CfgFile();
- }
-
-TInt CSimPacketContext::ModifyActiveContext(const TTsyReqHandle aTsyReqHandle)
- {
- if (iState==RPacketContext::EStatusInactive)
- {
- ReqCompleted(aTsyReqHandle, KErrNotReady);
- return KErrNone;
- }
-
- // check if QoS profile has changed or TFTs have changed
- if (iPacketqos != NULL)
- {
- if (iPacketqos->PerformProfileChange() == KErrNone || iTFTChangeBool)
- {
- iTFTChangeBool = EFalse;
- ReqCompleted(aTsyReqHandle, KErrNone);
- return KErrNone;
- }
- else
- {
- ReqCompleted(aTsyReqHandle, KErrNotReady);
- return KErrNone;
- }
- }
- else if (iTFTChangeBool)
- {
- iTFTChangeBool = EFalse;
- ReqCompleted(aTsyReqHandle, KErrNone);
- return KErrNone;
- }
- else
- {
- ReqCompleted(aTsyReqHandle, KErrNotReady);
- return KErrNone;
- }
- }
-
-/**
-* This function enumerates the number of packet filters
-*/
-TInt CSimPacketContext::EnumeratePacketFilters(const TTsyReqHandle aTsyReqHandle, TInt& aCount)
- {
- aCount = iNumFiltersAdded;
- ReqCompleted(aTsyReqHandle, KErrNone);
- return KErrNone;
- }
-
-/**
-* This function returns info regarding the packet filter specified by the index passed -
-* used in conjunction with EnumeratePacketFilters()
-*/
-TInt CSimPacketContext::GetPacketFilterInfoL(const TTsyReqHandle aTsyReqHandle, TInt aIndex, TDes8* aPacketFilterInfo)
- {
- // if index is invalid, return error code
- if (aIndex < 0 || aIndex > (iNumFiltersAdded -1))
- {
- ReqCompleted(aTsyReqHandle, KErrArgument);
- return KErrNone;
- }
- else
- {
- TInt ii;
- TInt addedFilterCount = -1;
-
- //find the requested filter
- for(ii = 0; ii < iPacketFilterInfoArray->Count(); ii++)
- {
- if(iPacketFilterInfoArray->At(ii).iAdded)
- {
- addedFilterCount++;
-
- //when the filter is found write the data to the client
- if(addedFilterCount == aIndex)
- {
- TPacketFilterV3 theFilter = iPacketFilterInfoArray->At(ii);
-
- // Check that the data structure is supported by the simulated TSY version
- TInt err = KErrNone;
- if(iPhone->iSimTsyVersion < 3) // same version as TPacketFilterVx
- {
- (void)User::Leave(KErrNotSupported);
- }
-
- RPacketContext::TPacketFilterV2Pckg* clientFilterPckg =
- (RPacketContext::TPacketFilterV2Pckg*)aPacketFilterInfo;
- RPacketContext::TPacketFilterV2& clientFilter = (*clientFilterPckg)();
-
- // Check that the data structure is supported by the simulated TSY version
- err = iPhone->CheckSimTsyVersion(clientFilter);
- if(err != KErrNone)
- {
- iPhone->ReqCompleted(aTsyReqHandle, err);
- return KErrNone;
- }
-
- if(clientFilter.ExtensionId()==KETelExtPcktV2)
- {
- clientFilter.iDestPortMax = theFilter.iDestPortMax;
- clientFilter.iDestPortMin = theFilter.iDestPortMin;
- clientFilter.iEvaluationPrecedenceIndex = theFilter.iEvaluationPrecedenceIndex;
- clientFilter.iFlowLabel = theFilter.iFlowLabel;
- clientFilter.iId = theFilter.iId;
- clientFilter.iIPSecSPI = theFilter.iIPSecSPI;
- clientFilter.iProtocolNumberOrNextHeader = theFilter.iProtocolNumberOrNextHeader;
- clientFilter.iSrcPortMax = theFilter.iSrcPortMax;
- clientFilter.iSrcPortMin = theFilter.iSrcPortMin;
- clientFilter.iTOSorTrafficClass = theFilter.iTOSorTrafficClass;
-
- TInt xx;
- for(xx = 0; xx<RPacketContext::KIPAddressSize; xx++)
- {
- clientFilter.iSrcAddr[xx] = theFilter.iSrcAddr[xx];
- clientFilter.iSrcAddrSubnetMask[xx] = theFilter.iSrcAddrSubnetMask[xx];
- }
- ReqCompleted(aTsyReqHandle, KErrNone);
- return KErrNone;
- }
- else if((clientFilter.ExtensionId()==KETelExtPcktV3) &&
- theFilter.iFilterType != RPacketContext::EPacketFilterTypeUnknown)
- {
- RPacketContext::TPacketFilterV3Pckg* clientFilterV3Pckg =
- (RPacketContext::TPacketFilterV3Pckg*)aPacketFilterInfo;
- RPacketContext::TPacketFilterV3& clientFilterV3 = (*clientFilterV3Pckg)();
-
- // Check that the data structure is supported by the simulated TSY version
- TInt err = iPhone->CheckSimTsyVersion(clientFilterV3);
- if(err != KErrNone)
- {
- iPhone->ReqCompleted(aTsyReqHandle, err);
- return KErrNone;
- }
-
- RPacketContext::TPacketFilterV3 filterV3(theFilter.iFilterType);
-
- // Check that the data structure is supported by the simulated TSY version
- err = iPhone->CheckSimTsyVersion(filterV3);
- if(err != KErrNone)
- {
- iPhone->ReqCompleted(aTsyReqHandle, err);
- return KErrNone;
- }
-
- filterV3.iId = theFilter.iId;
- filterV3.iEvaluationPrecedenceIndex = theFilter.iEvaluationPrecedenceIndex;
- filterV3.SetTOSorTrafficClass(theFilter.iTOSorTrafficClass);
-
- TInt yy;
- for(yy = 0; yy<RPacketContext::KIPAddressSize; yy++)
- {
- filterV3.SetSrcAddr(theFilter.iSrcAddr);
- filterV3.SetSrcAddrSubnetMask(theFilter.iSrcAddrSubnetMask);
- }
- if((theFilter.iFilterType == RPacketContext::EPacketFilterTypeOne) ||
- (theFilter.iFilterType == RPacketContext::EPacketFilterTypeTwo))
- {
- filterV3.SetProtocolNumberOrNextHeader(theFilter.iProtocolNumberOrNextHeader);
- }
-
- if(theFilter.iFilterType == RPacketContext::EPacketFilterTypeOne)
- {
- filterV3.SetDestPortMin(theFilter.iDestPortMin);
- filterV3.SetDestPortMax(theFilter.iDestPortMax);
- filterV3.SetSrcPortMin(theFilter.iSrcPortMin);
- filterV3.SetSrcPortMax(theFilter.iSrcPortMax);
- }
-
- if((theFilter.iFilterType == RPacketContext::EPacketFilterTypeTwo))
- {
- filterV3.SetSPI(theFilter.iIPSecSPI);
- }
-
- if((theFilter.iFilterType == RPacketContext::EPacketFilterTypeThree))
- {
- filterV3.SetFlowLabel(theFilter.iFlowLabel);
- }
-
- clientFilterV3 = filterV3;
- ReqCompleted(aTsyReqHandle, KErrNone);
- return KErrNone;
- }
- else
- {
- //cannot convert a filterV2 in the TSY to the filterV3 data typed passed in by client
- ReqCompleted(aTsyReqHandle, KErrCorrupt);
- return KErrNone;
- }
- }//end if(addedFilterCount == aIndex)
- }//end if(iPacketFilterInfoArray->At(ii).iAdded)
- else
- {
- continue;
- }
-
- }//end for loop
- //filter was not found
- ReqCompleted(aTsyReqHandle, KErrCorrupt);
- return KErrNone;
- }//end else
- }
-
-/**
-* Create TFT
-*/
-TInt CSimPacketContext::CreateNewTFT(const TTsyReqHandle aTsyReqHandle, const TInt* aSize)
- {
- if (iCreateTftConfig.iNumberOfFailures > 0)
- {
- iCreateTftConfig.iNumberOfFailures--;
- ReqCompleted(aTsyReqHandle, iCreateTftConfig.iFailErrorCode);
- return KErrNone;
- }
- iCreateTftTimer->Start(iCreateTftConfig.iDelay, this, ETimerIdPcktContextCreateTft);
- iCreateTftData.iTsyReqHandle = aTsyReqHandle;
- iCreateTftData.iSize = *aSize;
- return KErrNone;
- }
-
-TInt CSimPacketContext::DoCreateNewTFT()
- {
- iTFTCreated = ETrue;
- iNumTFTsCreated = iCreateTftData.iSize;
- iTFTChangeBool = ETrue;
- for (TInt i = 0; i < iPacketFilterInfoArray->Count(); i++)
- {
- iPacketFilterInfoArray->At(i).iAdded = EFalse;
- }
- iNumFiltersAdded = 0;
- ReqCompleted(iCreateTftData.iTsyReqHandle, KErrNone);
- return KErrNone;
- }
-
-/**
-* Delete TFT
-*/
-TInt CSimPacketContext::DeleteTFT(const TTsyReqHandle aTsyReqHandle)
- {
- if (iDeleteTftFail.iNumberOfTimes > 0)
- {
- iDeleteTftFail.iNumberOfTimes--;
- ReqCompleted(aTsyReqHandle, iDeleteTftFail.iFailErrorCode);
- return KErrNone;
- }
- iTFTCreated = EFalse;
- iNumTFTsCreated = -1;
- iTFTChangeBool = ETrue;
- for (TInt i = 0; i < iPacketFilterInfoArray->Count(); i++)
- {
- iPacketFilterInfoArray->At(i).iAdded = EFalse;
- }
- iNumFiltersAdded = 0;
- ReqCompleted(aTsyReqHandle, KErrNone);
- return KErrNone;
- }
-
-/**
-* This method adds the packet filter to the array if it is not already there
-*/
-TInt CSimPacketContext::AddPacketFilter(const TTsyReqHandle aTsyReqHandle, const TDesC8* aPacketFilterInfo)
- {
- if (iAddPacketFilter.iNumberOfTimes > 0)
- {
- iAddPacketFilter.iNumberOfTimes--;
- ReqCompleted(aTsyReqHandle, iAddPacketFilter.iFailErrorCode);
- return KErrNone;
- }
-
- TPckg<RPacketContext::TPacketFilterV2>* packetFilter = (TPckg<RPacketContext::TPacketFilterV2>*)aPacketFilterInfo;
- RPacketContext::TPacketFilterV2& packetFilterBase = (*packetFilter)();
-
- // Check that the data structure is supported by the simulated TSY version
- TInt err = iPhone->CheckSimTsyVersion(packetFilterBase);
- if(err != KErrNone)
- {
- iPhone->ReqCompleted(aTsyReqHandle, err);
- return KErrNone;
- }
-
- TBool found = EFalse;
-
- TInt ii;
- for(ii = 0; ii<iPacketFilterInfoArray->Count(); ii++)
- {
- TPacketFilterV3& configFilter = iPacketFilterInfoArray->At(ii);
- const TInt KReservedPortZero = 0;
-
- if((configFilter.iId == packetFilterBase.iId) &&
- (configFilter.iEvaluationPrecedenceIndex == packetFilterBase.iEvaluationPrecedenceIndex) &&
- (configFilter.iProtocolNumberOrNextHeader == packetFilterBase.iProtocolNumberOrNextHeader) &&
- (configFilter.iSrcPortMin == packetFilterBase.iSrcPortMin) &&
- (configFilter.iSrcPortMax == packetFilterBase.iSrcPortMax) &&
- ((configFilter.iDestPortMin == KReservedPortZero) || (configFilter.iDestPortMin == packetFilterBase.iDestPortMin)) &&
- ((configFilter.iDestPortMax == KReservedPortZero) || (configFilter.iDestPortMax == packetFilterBase.iDestPortMax)) &&
- (configFilter.iIPSecSPI == packetFilterBase.iIPSecSPI) &&
- (configFilter.iTOSorTrafficClass == packetFilterBase.iTOSorTrafficClass) &&
- (configFilter.iFlowLabel == packetFilterBase.iFlowLabel))
- {
- TInt xx;
- for(xx = 0; xx<RPacketContext::KIPAddressSize; xx++)
- {
- if((configFilter.iSrcAddr[xx] == packetFilterBase.iSrcAddr[xx]) &&
- (configFilter.iSrcAddrSubnetMask[xx] == packetFilterBase.iSrcAddrSubnetMask[xx]))
- {
- found=ETrue;
- }
- else
- {
- found=EFalse;
- break;
- }
- }
-
- if(found)
- {
- // checking the maximum number of packet filter per a pdp context
- if(iNumFiltersAdded >= KMaxNumberOfTftFilters )
- {
- ReqCompleted(aTsyReqHandle, KErrOverflow);
- return KErrNone;
- }
- iTFTChangeBool = ETrue;
- configFilter.iAdded = ETrue;
- iNumFiltersAdded++ ;
- ReqCompleted(aTsyReqHandle, KErrNone);
- return KErrNone;
- }
- }
- }
- ReqCompleted(aTsyReqHandle, KErrGeneral);
- return KErrNone;
- }
-
-/**
-* This function removes the packet filter from the array if the packet filter is found in the array
-*/
-TInt CSimPacketContext::RemovePacketFilter(const TTsyReqHandle aTsyReqHandle, TInt aId)
- {
- TInt total= iPacketFilterInfoArray->Count();
- TBool found = EFalse;
-
- for (TInt i = 0; i<total; i++)
- {
- if ((iPacketFilterInfoArray->At(i).iId == aId) &&
- (iPacketFilterInfoArray->At(i).iAdded))
- {
- iPacketFilterInfoArray->At(i).iAdded = EFalse;
- iNumFiltersAdded-- ;
- ReqCompleted(aTsyReqHandle, KErrNone);
- found = ETrue;
- iTFTChangeBool = ETrue;
- break;
- }
- }
-
- if (!found)
- {
- ReqCompleted(aTsyReqHandle, KErrArgument);
- return KErrNone;
- }
- return KErrNone;
- }
-
-/**
-* This function initialises the context
-*/
-TInt CSimPacketContext::InitialiseContext(const TTsyReqHandle aTsyReqHandle, TDes8* aDataChannelV2Pckg)
- {
- TCommSetupItem item = FindCommSettings();
- if (item.iNumInitializeFailures != 0)
- {
- item.iNumInitializeFailures--;
- ReqCompleted(aTsyReqHandle, item.iErrorCode);
- }
- else
- {
- iInitContextData.iTsyReqHandle = aTsyReqHandle;
- iInitContextData.iChannel = aDataChannelV2Pckg;
- iInitContextTimer->Start(item.iDelay, this, ETimerIdPcktContextInitContext);
- }
- return KErrNone;
- }
-
-TInt CSimPacketContext::DoInitialiseContext()
- {
- RPacketContext::TDataChannelV2Pckg* channel = (RPacketContext::TDataChannelV2Pckg*)iInitContextData.iChannel;
- RPacketContext::TDataChannelV2& channelV2 = (*channel)();
-
- // Check that the data structure is supported by the simulated TSY version
- TInt err = iPhone->CheckSimTsyVersion(channelV2);
- if(err != KErrNone)
- {
- ReqCompleted(iInitContextData.iTsyReqHandle, err);
- return KErrNone;
- }
-
- TCommSetupItem item = FindCommSettings();
- channelV2.iPort = item.iPortName;
- channelV2.iCsy = item.iCsyName;
- channelV2.iChannelId = item.iPortName;
-
- ReqCompleted(iInitContextData.iTsyReqHandle, KErrNone);
-
- return KErrNone;
- }
-
-/**
-* Cancel method, returns KErrNone
-*/
-TInt CSimPacketContext::EnumeratePacketFiltersCancel(const TTsyReqHandle /*aTsyReqHandle*/)
- {
- return KErrNone;
- }
-
-/**
-* Cancel method, returns KErrNone
-*/
-TInt CSimPacketContext::GetPacketFilterInfoCancel(const TTsyReqHandle /*aTsyReqHandle*/)
- {
- return KErrNone;
- }
-
-/**
-* Cancel method, returns KErrNone
-*/
-TInt CSimPacketContext::AddPacketFilterCancel(const TTsyReqHandle /*aTsyReqHandle*/)
- {
- return KErrNone;
- }
-
-/**
-* Cancel method, returns KErrNone
-*/
-TInt CSimPacketContext::CreateNewTFTCancel(const TTsyReqHandle aTsyReqHandle)
- {
- iCreateTftTimer->Cancel();
-
- ReqCompleted(aTsyReqHandle, KErrCancel);
-
- return KErrNone;
- }
-
-/**
-* Cancel method, returns KErrNone
-*/
-TInt CSimPacketContext::DeleteTFTCancel(const TTsyReqHandle /*aTsyReqHandle*/)
- {
- return KErrNone;
- }
-
-/**
-* Cancel method, returns KErrNone
-*/
-TInt CSimPacketContext::RemovePacketFilterCancel(const TTsyReqHandle /*aTsyReqHandle*/)
- {
- return KErrNone;
- }
-
-/**
-* Cancel method, returns KErrNone
-*/
-TInt CSimPacketContext::ModifyActiveContextCancel(const TTsyReqHandle /*aTsyReqHandle*/)
- {
- return KErrNone;
- }
-
-/**
-* Cancel method, returns KErrNone
-*/
-TInt CSimPacketContext::InitialiseContextCancel(const TTsyReqHandle aTsyReqHandle)
- {
- iInitContextTimer->Cancel();
-
- ReqCompleted(aTsyReqHandle, KErrCancel);
-
- return KErrNone;
- }
-
-CSimPacketContext::TCommSetupItem CSimPacketContext::FindCommSettings()
- {
- TInt count=iCommSetupArray->Count();
- TCommSetupItem def;
-
- //Do a default initialization.
- def.iCsyName.Copy(KDefaultCsyName);
- def.iPortName.Copy(KDefaultPortName);
- def.iConfig.iRate=KDefaultCommPortRate;
- def.iConfig.iHandshake=KDefaultHandshake;
- def.iContextName=KDefaultSetting;
- def.iCommReset = EFalse;
- def.iNumInitializeFailures = 0;
- def.iErrorCode = KErrNone;
- def.iDelay = 0;
-
- for(TInt i=0; i<count; i++)
- {
- TCommSetupItem comm = iCommSetupArray->At(i);
- if(comm.iContextName.Compare(iContextName)==KErrNone)
- return comm;
- if(comm.iContextName.Compare(KDefaultSetting)==KErrNone)
- def=comm;
- }
- return def;
- }
-
-TName CSimPacketContext::ContextName() const
- {
- return iContextName;
- }
-
-TInt CSimPacketContext::GetDnsInfo(const TTsyReqHandle aTsyReqHandle, const TDesC8* aDnsInfo)
- {
-/**
- * GetDnsInfo method to extract DNS server names from context
- *
- * @param aStatus TRequestStatus object with which error code is returned
- * @param aDnsInfo packaged TDnsInfoV2 object passed as TDes8
- *
- * GetDNSInfo() is needed when the client uses dynamic IPv4 PDP addresses.
- * After the context is activated the client needs to know the actual primary
- * and secondary DNS addresses to use when sending packet data. As the network
- * may have supplied these addresses there is a need for an API method to get
- * these addresses from the TSY.
- */
- RPacketContext::TTDnsInfoV2Pckg* dnsInfoV2Pckg = (RPacketContext::TTDnsInfoV2Pckg*)aDnsInfo;
- RPacketContext::TDnsInfoV2& dnsInfoV2 = (*dnsInfoV2Pckg)();
-
- // Check that the data structure is supported by the simulated TSY version
- TInt err = iPhone->CheckSimTsyVersion(dnsInfoV2);
- if(err != KErrNone)
- {
- iPhone->ReqCompleted(aTsyReqHandle, err);
- return KErrNone;
- }
-
- TContextConfigParam config = iContextConfigParams->At(iContextConfigParamsIndex);
-
- dnsInfoV2.iPrimaryDns.Copy(config.iProtocolConfigOption.iPrimaryDNS);
- dnsInfoV2.iSecondaryDns.Copy(config.iProtocolConfigOption.iSecondaryDNS);
-
- ReqCompleted(aTsyReqHandle,KErrNone);
- return KErrNone;
- }
-
-TInt CSimPacketContext::GetDnsInfoCancel(const TTsyReqHandle /*aTsyReqHandle*/)
-/**
- * GetDnsInfoCancel - Cancels an asynchronous GetDnsInfo method.
- */
- {
- return KErrNone;
- }
-
-TInt CSimPacketContext::GetAddMediaAuthorization(const TTsyReqHandle aTsyReqHandle, TDes8* aBuffer)
-/**
- * GetAddMediaAuthorization method to verify provided media authorization and return desired result
- *
- * @param aTsyReqHandle The request handle for completing the request
- * @param aBuffer Packaged CTFTMediaAuthorizationV3 object passed as TDes8
- *
- * GetAddMediaAuthorization() checks the provided media authorization against a predefined authorization
- * set up from the configuration file. If the authorization is valid the function will return the desired
- * response, also set up from the configuration file. If there is a mismatch between authorizations, KErrCorrupt
- * returned.
- */
- {
- TBool validMediaAuthorization = TRUE;
- RPacketContext::CTFTMediaAuthorizationV3* mediaAuthV3 = NULL;
-
- // Check that the data structure is supported by the simulated TSY version
- TInt err = iPhone->CheckSimTsyVersion(*mediaAuthV3);
- if(err != KErrNone)
- {
- iPhone->ReqCompleted(aTsyReqHandle, err);
- return KErrNone;
- }
-
- TRAPD(ret, mediaAuthV3 = RPacketContext::CTFTMediaAuthorizationV3::NewL());
- if (ret != KErrNone)
- {
- LOGPACKET1("CSimPacketContext::GetAddMediaAuthorization NewL call fail");
- return ret;
- }
-
- TRAP(ret, mediaAuthV3->InternalizeL(*aBuffer) );
- if (ret != KErrNone)
- {
- delete mediaAuthV3;
- LOGPACKET1("CSimPacketContext::GetAddMediaAuthorization InternalizeL call fail");
- return ret;
- }
-
- for (TUint i=0; i<iAuthorizationTokenResponse->Count(); i++)
- {
- if (!(mediaAuthV3->iAuthorizationToken).Compare(iAuthorizationTokenResponse->At(i).iAuthorizationToken))
- {
- for (TUint j=0; j<iMediaAuthorization->At(i).iFlowIds.Count(); j++)
- {
- if ((mediaAuthV3->iFlowIds[j].iMediaComponentNumber != iMediaAuthorization->At(i).iFlowIds[j].iMediaComponentNumber) ||
- (mediaAuthV3->iFlowIds[j].iIPFlowNumber != iMediaAuthorization->At(i).iFlowIds[j].iIPFlowNumber))
- {
- validMediaAuthorization = FALSE;
- }
- }
- if (validMediaAuthorization)
- {
- ReqCompleted(aTsyReqHandle,iAuthorizationTokenResponse->At(i).iResponse);
- delete mediaAuthV3;
- return KErrNone;
- }
- }
- }
-
- // No match found, respond with corrupted
- ReqCompleted(aTsyReqHandle,KErrCorrupt);
- delete mediaAuthV3;
-
- return KErrNone;
- }
-
-TInt CSimPacketContext::GetRemoveMediaAuthorization(const TTsyReqHandle aTsyReqHandle, RPacketContext::TAuthorizationToken* aAuthorizationToken)
-/**
- * GetRemoveMediaAuthorization method to verify provided media authorization and return desired result
- *
- * @param aTsyReqHandle The request handle for completing the request
- * @param aAuthorizationToken Authorization token to be checked
- *
- * GetRemoveMediaAuthorization() checks the provided authorization token against predefined tokens and responses
- * from config file. If a match is found the associated desired response is returned, otherwise KErrCorrupt is reported.
- */
- {
- for (TUint i=0; i<iAuthorizationTokenResponse->Count(); i++)
- {
- if (!((*aAuthorizationToken).Compare(iAuthorizationTokenResponse->At(i).iAuthorizationToken)))
- {
- ReqCompleted(aTsyReqHandle,iAuthorizationTokenResponse->At(i).iResponse);
- return KErrNone;
- }
- }
-
- // No match found, respond with corrupted
- ReqCompleted(aTsyReqHandle,KErrCorrupt);
- return KErrNone;
- }
-
-TInt CSimPacketContext::GetAddMediaAuthorizationCancel(const TTsyReqHandle /*aTsyReqHandle*/)
-/**
-* Cancel method, returns KErrNone
-*/
- {
- return KErrNone;
- }
-
-TInt CSimPacketContext::GetRemoveMediaAuthorizationCancel(const TTsyReqHandle /*aTsyReqHandle*/)
-/**
-* Cancel method, returns KErrNone
-*/
- {
- return KErrNone;
- }
-
-
+// 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 implementation of the Similator TSY Packet Context functionality.
+//
+//
+
+/**
+ @file
+*/
+
+#include "Simlog.h"
+#include "CSimPhone.h"
+#include "CSimPacketContext.h"
+#include "CSimPacketService.h"
+#include "CSimPacketQoS.h"
+#include "utils.h"
+
+#include "CSimContextHelper.h"
+
+const TInt KUnsetInteger = 0;
+
+CPcktListReadAllAttempt* CPcktListReadAllAttempt::NewL(TClientId& aId, TTsyReqHandle aReqHandle)
+/**
+ * Standard two phase constructor.
+ * @param aId The client ID (session and sub-session handles) that uniquely identifies a client performing a two phase read.
+ * @param aReqHandle The TSY request handle of the client request associated with a two phase read.
+ * @return CPcktListReadAllAttempt* The newly created object.
+ */
+ {
+ CPcktListReadAllAttempt* read=new(ELeave) CPcktListReadAllAttempt(aId, aReqHandle);
+ CleanupStack::PushL(read);
+ read->ConstructL();
+ CleanupStack::Pop();
+ return read;
+ }
+
+CPcktListReadAllAttempt::CPcktListReadAllAttempt(TClientId& aId, TTsyReqHandle aReqHandle)
+ : iReqHandle(aReqHandle)
+/**
+ * Trivial first phase constructor.
+ * @param aId The client ID (session and sub-session handles) that uniquely identifies a client performing a two phase read.
+ * @param aReqHandle The TSY request handle of the client request associated with a two phase read.
+ */
+ {
+ iClient.iSessionHandle=aId.iSessionHandle;
+ iClient.iSubSessionHandle=aId.iSubSessionHandle;
+ }
+
+void CPcktListReadAllAttempt::ConstructL()
+/**
+ * Trivial second phase constructor.
+ */
+ {
+ User::LeaveIfError(iListBuf!=NULL);
+ }
+
+CPcktListReadAllAttempt::~CPcktListReadAllAttempt()
+/**
+ * Trivial destructor.
+ */
+ {
+ delete iListBuf;
+ }
+
+
+CSimPacketContext* CSimPacketContext::NewL(CSimPhone* aPhone, CSimPacketService* aPacketService, const TDesC& aContextName)
+/**
+* Standard two phase constructor
+*
+* @param aPacketService Pointer to the Packet Service object (CSimPacketService)
+* @param aContextName name for this packet context
+* @return CSimPacketContext pointer to the packet context object created.
+* @leave Leaves if no memory or object is not created for any reason.
+*/
+ {
+ CSimPacketContext* packetContext = new(ELeave) CSimPacketContext(aPhone, aPacketService, aContextName);
+ CleanupStack::PushL(packetContext);
+ packetContext->ConstructL();
+ CleanupStack::Pop();
+ return packetContext;
+ }
+
+void CSimPacketContext::Init()
+ {}
+
+CSimPacketContext::CSimPacketContext(CSimPhone* aPhone, CSimPacketService* aPacketService, const TName& aContextName)
+ : iPhone(aPhone), iDeleted(EFalse),iIsActive(EFalse),iPacketService(aPacketService),iContextName(aContextName),
+ iTFTCreated(EFalse), iNumTFTsCreated(-1), iNumFiltersAdded(0),
+ iContextConfigParamsIndex(0), iCommPortLoaned(EFalse),iQoSObjectCount(0),
+ iNotifyContextConfigChangeArray(NULL), iSetConfigData(NULL), iSetConfigCallCount(0), iTFTChangeBool(0),
+ iNotifyContextStatusChangeIndex(0),iState(RPacketContext::EStatusInactive), iLastError(KErrNone), iErrorCodeForGetLastErrorCause(KErrNone)
+
+/**
+* Trivial Constructor. Initialises all the data members
+*
+* @param aPacketService Pointer to the Packet Service object (CSimPacketService)
+* @param aContextName name for this packet context
+*/
+ {
+ iNotifyStatusChange.iNotifyPending = EFalse;
+ iNotifyConfigGPRS.iNotifyPending= EFalse;
+ iNotifyConfigR99.iNotifyPending= EFalse;
+ iNotifyConfigR5.iNotifyPending= EFalse;
+ }
+
+void CSimPacketContext::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.
+*/
+ {
+ LOGPACKET1("CSimPacketContext: Entered constructor");
+
+ iSetConfigData = new (ELeave) CArrayFixFlat<TSetConfigData>(1);
+ iNotifyContextConfigChangeArray = new (ELeave) CArrayFixFlat<TNotifyContextConfigChangeData>(1);
+ iContextConfigParams = new (ELeave) CArrayFixFlat<TContextConfigParam>(KNumberofConfigs);
+ iAuthorizationTokenResponse = new (ELeave) CArrayFixFlat<TAuthorizationTokenResponse>(KNumberofConfigs);
+ iMediaAuthorization = new (ELeave) CArrayFixFlat<RPacketContext::CTFTMediaAuthorizationV3>(KNumberofConfigs);
+
+ iNtRas = CSimNtRas::NewL(iPhone);
+ iTimer = CSimTimer::NewL(iPhone);
+ iNotifyContextStatusChangeTimer = CSimTimer::NewL(iPhone);
+ iSetConfigTimer = CSimTimer::NewL(iPhone);
+ iInitContextTimer = CSimTimer::NewL(iPhone);
+ iCreateTftTimer = CSimTimer::NewL(iPhone);
+ iNotifyContextConfigChangeTimer= CSimTimer::NewL(iPhone);
+ iContextStatusChange = CSimPubSubChange::NewL(this, CSimPubSub::TPubSubProperty(KUidPSSimTsyCategory, KPSSimtsyPacketContextStatusChange, KPSSimtsyPacketContextStatusChangeKeyType));
+
+ LOGPACKET1("Starting to Load and Parse Packet Context the Config File");
+
+ GetCommSetupSettingsL();
+ GetContextConfigParamSettingsL(KSetContextConfigGPRS());
+ GetContextConfigParamSettingsL(KSetContextConfigRel99());
+ GetContextConfigParamSettingsL(KSetContextConfigRel5());
+ GetActivateSettings();
+ GetSetConfigSettings();
+ GetPacketFilterSettings();
+ GetContextConfigRel99SettingsL();
+ ConstructPacketFiltersL();
+ GetContextStatusChangeSettingsL();
+ GetContextConfigChangeSettingsL();
+
+ TInt nestedItemNumber; // used for nested loop
+ const CTestConfigItem* item2; // used for nested items
+
+ TUint count = CfgFile()->ItemCount(KAuthorizationToken);
+
+ TUint itemPosition = 0;
+ TUint itemOffSet = 0;
+ for(TInt i=0;i<count;i++) // set up AuthorizationToken info
+ {
+ const CTestConfigItem *item = CfgFile()->Item(KAuthorizationToken,i);
+ if(!item)
+ break;
+
+ RPacketContext::CTFTMediaAuthorizationV3* mediaAuthorization = RPacketContext::CTFTMediaAuthorizationV3::NewL();
+ CleanupStack::PushL(mediaAuthorization);
+ TAuthorizationTokenResponse authorizationTokenResponse;
+ TPtrC8 authorizationToken;
+ TInt desiredResponse;
+ TInt numberOfFlowIds;
+
+ TInt ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,authorizationToken);
+
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("CTFTMediaAuthorizationV3::authorizationToken",ret,0,&KAuthorizationToken);
+ CleanupStack::PopAndDestroy(mediaAuthorization);
+ continue;
+ }
+ else
+ {
+ mediaAuthorization->iAuthorizationToken.Copy(authorizationToken); // Set up for media authorization
+ authorizationTokenResponse.iAuthorizationToken.Copy(authorizationToken); // Set up for token response
+ }
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,desiredResponse);
+
+ if(ret!=KErrNone || desiredResponse > 0)
+ {
+ LOGPARSERR("desiredResponse",ret,1,&KAuthorizationToken);
+ CleanupStack::PopAndDestroy(mediaAuthorization);
+ continue;
+ }
+ else
+ {
+ authorizationTokenResponse.iResponse = desiredResponse;
+ }
+
+ iAuthorizationTokenResponse->AppendL(authorizationTokenResponse);
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,numberOfFlowIds);
+
+ for(nestedItemNumber=itemPosition+itemOffSet;nestedItemNumber<itemOffSet+numberOfFlowIds;nestedItemNumber++)
+ {
+ item2 = CfgFile()->Item(KFlowIdentifier,nestedItemNumber);
+
+ if(!item2)
+ break;
+
+ RPacketContext::CTFTMediaAuthorizationV3::TFlowIdentifier iFlowIdentifier;
+ TInt mediaComponentNumber;
+ TInt IPFlowNumber;
+
+ ret=CTestConfig::GetElement(item2->Value(),KStdDelimiter,0,mediaComponentNumber);
+
+ if(ret!=KErrNone || mediaComponentNumber < 0)
+ {
+ LOGPARSERR("CTFTMediaAuthorizationV3::mediaComponentNumber",ret,0,&KFlowIdentifier);
+ continue;
+ }
+ else
+ {
+ iFlowIdentifier.iMediaComponentNumber = mediaComponentNumber;
+ }
+
+ ret=CTestConfig::GetElement(item2->Value(),KStdDelimiter,1,IPFlowNumber);
+
+ if(ret!=KErrNone || IPFlowNumber < 0)
+ {
+ LOGPARSERR("CTFTMediaAuthorizationV3::IPFlowNumber",ret,1,&KFlowIdentifier);
+ continue;
+ }
+ else
+ {
+ iFlowIdentifier.iIPFlowNumber = IPFlowNumber;
+ }
+
+ mediaAuthorization->iFlowIds.Append(iFlowIdentifier);
+ }
+ itemOffSet+=numberOfFlowIds;
+ iMediaAuthorization->AppendL(*mediaAuthorization); // Add completed media authorization to array
+ CleanupStack::Pop(mediaAuthorization);
+ }
+
+ LOGPACKET1("...Finished parsing Packet Context config parameters...");
+ }
+
+void CSimPacketContext::GetCommSetupSettingsL()
+ {
+ iCommSetupArray = new (ELeave) CArrayFixFlat<TCommSetupItem>(KNumberofConfigs);
+
+ TInt count = CfgFile()->ItemCount(KCommSetup);
+ if(count==0)
+ {
+ TCommSetupItem comm;
+
+ comm.iCsyName.Copy(KDefaultCsyName);
+ comm.iPortName.Copy(KDefaultPortName);
+ comm.iConfig.iRate=KDefaultCommPortRate;
+ comm.iConfig.iHandshake=KDefaultHandshake;
+ comm.iContextName=KDefaultSetting;
+ comm.iCommReset = EFalse;
+ comm.iNumInitializeFailures = 0;
+ comm.iErrorCode = KErrNone;
+ comm.iDelay = 0;
+ iCommSetupArray->AppendL(comm);
+ }
+
+ for(TInt i=0;i<count;i++)
+ {
+ const CTestConfigItem* item = CfgFile()->Item(KCommSetup,i);
+
+ if(item)
+ {
+ TCommSetupItem comm;
+ TPtrC8 portName,csyName,contextName;
+ TInt commReset, numInitializeFailures, errorCode, delay;
+
+ TInt ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,csyName);
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("CommSetUp::csyName",ret,0,&KCommSetup);
+ comm.iCsyName.Copy(KDefaultCsyName);
+ }
+ else
+ comm.iCsyName.Copy(csyName);
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,portName);
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("CommSetUp::portName",ret,1,&KCommSetup);
+ comm.iPortName.Copy(KDefaultPortName);
+ }
+ else
+ comm.iPortName.Copy(portName);
+
+ TInt dataRate,handshake;
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,dataRate);
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("CommSetUp::dataRate",ret,2,&KCommSetup);
+ comm.iConfig.iRate=KDefaultCommPortRate;
+ }
+ else
+ comm.iConfig.iRate=(TBps)dataRate;
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,handshake);
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("CommSetUp::handShake",ret,3,&KCommSetup);
+ comm.iConfig.iHandshake=KDefaultHandshake;
+ }
+ else
+ comm.iConfig.iHandshake=(TUint)handshake;
+
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,contextName);
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("CommSetUp::contextName",ret,4,&KCommSetup);
+ comm.iContextName=KDefaultSetting;
+ }
+ else
+ comm.iContextName.Copy(contextName);
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,5,commReset);
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("CommSetUp::commReset",ret,5,&KCommSetup);
+ comm.iCommReset=EFalse;
+ }
+ else
+ comm.iCommReset = commReset;
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,6,numInitializeFailures);
+ if(ret!=KErrNone)
+ {
+ comm.iNumInitializeFailures = 0;
+ }
+ else
+ comm.iNumInitializeFailures = numInitializeFailures;
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,7,errorCode);
+ if(ret!=KErrNone)
+ {
+ comm.iErrorCode = KErrNone;
+ }
+ else
+ comm.iErrorCode = errorCode;
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,8,delay);
+ if(ret!=KErrNone)
+ {
+ comm.iDelay = 0;
+ }
+ else
+ comm.iDelay = delay;
+
+ iCommSetupArray->AppendL(comm);
+ }
+ }
+ }
+
+
+
+void CSimPacketContext::GetContextConfigParamSettingsL(TPtrC8 aTag)
+ {
+ CSimContextHelper::GetContextConfigParamSettingsL( CfgFile(), aTag, iContextConfigParams );
+ }
+
+
+void CSimPacketContext::GetActivateSettings()
+ {
+ TInt ret;
+ const CTestConfigItem* item=CfgFile()->Item(KActivatePauseDuration); //< Find the Activate data item
+ if(item)
+ { //< then retrieve the activation pause
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,iActivatePause);
+ if(ret!=KErrNone)
+ iActivatePause = KDefaultPauseDuration;
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,iActivateFail);
+ if(ret==KErrNotFound)
+ iActivateFail = KErrNone;
+ }
+
+ item=CfgFile()->Item(KDeactivatePauseDuration); //< Find the Deactivate data item
+ if(item)
+ { //< then retrieve the deactivation pause
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,iDeactivatePause);
+ if(ret!=KErrNone)
+ iDeactivatePause = KDefaultPauseDuration;
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,iDeactivateFail);
+ if(ret==KErrNotFound)
+ iDeactivateFail = KErrNone;
+ }
+
+ item=CfgFile()->Item(KDeletePauseDuration); //< Find the Delete data item
+ if(item)
+ { //< then retrieve the delete pause
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,iDeletePause);
+ if(ret!=KErrNone)
+ iDeletePause = KDefaultPauseDuration;
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,iDeleteFail);
+ if(ret==KErrNotFound)
+ iDeleteFail = KErrNone;
+ }
+ }
+
+void CSimPacketContext::GetSetConfigSettings()
+ {
+ iSetConfigDelay = 0;
+ const CTestConfigItem* item=iPacketService->CfgFile()->Item(KSetConfigDelay);
+ if(item)
+ {
+ TInt delay = 0;
+ TInt ret = CTestConfig::GetElement(item->Value(),KStdDelimiter,0,delay);
+
+ if(ret != KErrNone || delay < 0)
+ {
+ LOGPARSERR("SetConfigDelay",ret,0,&KSetConfigDelay);
+ }
+ else
+ {
+ iSetConfigDelay = delay;
+ }
+ }
+
+ item=iPacketService->CfgFile()->Item(KSetConfigFail); // Set the SetConfigFail struct
+ if(item)
+ {
+ TPtrC8 contextName, numberOfTimes, failErrorCode;
+ TInt32 digit = 0;
+ TInt ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,contextName);
+
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("SetConfigFail::contextName",ret,0,&KSetConfigFail);
+ }
+ else
+ {
+ iSetConfigFail.iContextName.Copy(contextName);
+ }
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,numberOfTimes);
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("SetConfigFail::numberOfTimes",ret,1,&KSetConfigFail);
+ }
+ else
+ {
+ if(AsciiToNum(numberOfTimes, digit)==KErrNone)
+ iSetConfigFail.iNumberOfTimes = digit;
+ }
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,failErrorCode);
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("SetConfigFail::failErrorCode",ret,2,&KSetConfigFail);
+ }
+ else
+ {
+ if(AsciiToNum(failErrorCode, digit)==KErrNone)
+ iSetConfigFail.iFailErrorCode = digit;
+ }
+ }
+ }
+
+void CSimPacketContext::GetContextConfigChangeSettingsL()
+ {
+ TNotifyContextConfigChangeData configChangeData;
+
+ TUint count = CfgFile()->ItemCount(KNotifyContextConfigChange);
+ TInt index;
+ for(index = 0; index < count; index++)
+ {
+ const CTestConfigItem *item =
+ CfgFile()->Item(KNotifyContextConfigChange,index);
+
+ if(!item)
+ {
+ break;
+ }
+
+ //Get the Notify Context Config Change Delay value
+ TInt ret = CTestConfig::GetElement(item->Value(),KStdDelimiter,0,
+ configChangeData.iDelay);
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("NotifyContextConfigChange::delay",ret,0,&KNotifyContextConfigChange);
+ continue;
+ }
+
+ //Get the Notify Context Config Change, config index value
+ ret = CTestConfig::GetElement(item->Value(),KStdDelimiter,1,
+ configChangeData.iNewContextConfigIndex);
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("NotifyContextConfigChange::NewContextConfigIndex",
+ ret,0,&KNotifyContextConfigChange);
+ continue;
+ }
+
+ iNotifyContextConfigChangeArray->AppendL(configChangeData);
+ }
+ }
+
+void CSimPacketContext::GetPacketFilterSettings()
+ {
+ TInt ret;
+ const CTestConfigItem* item=iPacketService->CfgFile()->Item(KDeleteTftFail);
+ if(item)
+ {
+ TPtrC8 contextName, numberOfTimes, failErrorCode;
+ TInt32 digit = 0;
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,contextName);
+
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("SetConfigFail::contextName",ret,0,&KDeleteTftFail);
+ }
+ else
+ {
+ iDeleteTftFail.iContextName.Copy(contextName);
+ }
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,numberOfTimes);
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("SetConfigFail::numberOfTimes",ret,1,&KDeleteTftFail);
+ }
+ else
+ {
+ if(AsciiToNum(numberOfTimes, digit)==KErrNone)
+ iDeleteTftFail.iNumberOfTimes = digit;
+ }
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,failErrorCode);
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("SetConfigFail::failErrorCode",ret,2,&KDeleteTftFail);
+ }
+ else
+ {
+ if(AsciiToNum(failErrorCode, digit)==KErrNone)
+ iDeleteTftFail.iFailErrorCode = digit;
+ }
+ }
+
+ item=iPacketService->CfgFile()->Item(KCreateTftConfig);
+ if(item)
+ {
+ TPtrC8 contextName, numberOfTimes, failErrorCode;
+ TInt32 digit = 0;
+ TInt delay = 0;
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,contextName);
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("SetConfigFail::contextName",ret,0,&KCreateTftConfig);
+ }
+ else
+ {
+ iCreateTftConfig.iContextName.Copy(contextName);
+ }
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,numberOfTimes);
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("SetConfigFail::numberOfTimes",ret,1,&KCreateTftConfig);
+ }
+ else
+ {
+ if(AsciiToNum(numberOfTimes, digit)==KErrNone)
+ iCreateTftConfig.iNumberOfFailures = digit;
+ }
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,failErrorCode);
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("SetConfigFail::failErrorCode",ret,2,&KCreateTftConfig);
+ }
+ else
+ {
+ if(AsciiToNum(failErrorCode, digit)==KErrNone)
+ iCreateTftConfig.iFailErrorCode = digit;
+ }
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,delay);
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("SetConfigFail::failErrorCode",ret,3,&KCreateTftConfig);
+ }
+ else
+ {
+ iCreateTftConfig.iDelay = delay;
+ }
+ }
+
+ item=iPacketService->CfgFile()->Item(KAddPacketFilter);
+ if(item)
+ {
+ TPtrC8 contextName, numberOfTimes, failErrorCode;
+ TInt32 digit = 0;
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,contextName);
+
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("SetConfigFail::contextName",ret,0,&KAddPacketFilter);
+ }
+ else
+ {
+ iAddPacketFilter.iContextName.Copy(contextName);
+ }
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,numberOfTimes);
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("SetConfigFail::numberOfTimes",ret,1,&KAddPacketFilter);
+ }
+ else
+ {
+ if(AsciiToNum(numberOfTimes, digit)==KErrNone)
+ iAddPacketFilter.iNumberOfTimes = digit;
+ }
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,failErrorCode);
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("SetConfigFail::failErrorCode",ret,2,&KAddPacketFilter);
+ }
+ else
+ {
+ if(AsciiToNum(failErrorCode, digit)==KErrNone)
+ iAddPacketFilter.iFailErrorCode = digit;
+ }
+
+ }
+ }
+
+void CSimPacketContext::GetContextConfigRel99SettingsL()
+ {
+ iContextConfigsRel99 = new(ELeave) CArrayFixFlat<TRel99ContextConfig>(KNumberofConfigs);
+
+ TInt count = CfgFile()->ItemCount(KContextConfigRel99); // set up the Rel 99 context configuration parameters
+ for(TInt i=0;i<count;i++)
+ {
+ const CTestConfigItem* item = CfgFile()->Item(KContextConfigRel99,i);
+ if(!item)
+ break;
+
+ TPtrC8 contextName;
+ TInt activatePause, activateErrorCode, aDeactivatePause, deactivateErrorCode, deletionPause;
+ TInt deletionErrorCode;
+ TBool connectToNtRas;
+ TRel99ContextConfig contextConfigRel99;
+
+ TInt ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,contextName);
+
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("ContextConfigRel99::contextName",ret,0,KContextConfigRel99);
+ }
+ else
+ {
+ contextConfigRel99.iContextName.Copy(contextName);
+ }
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,activatePause);
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("ContextConfigRel99::activatePause",ret,1,&KContextConfigRel99);
+ continue;
+ }
+ else
+ contextConfigRel99.iActivatePause = activatePause;
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,activateErrorCode);
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("ContextConfigRel99::activateErrorCode",ret,2,&KContextConfigRel99);
+ continue;
+ }
+ else
+ contextConfigRel99.iActivateErrorCode = activateErrorCode;
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,aDeactivatePause);
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("ContextConfigRel99::deactivatePause",ret,3,&KContextConfigRel99);
+ continue;
+ }
+ else
+ contextConfigRel99.iDeactivatePause = aDeactivatePause;
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,deactivateErrorCode);
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("ContextConfigRel99::deactivateErrorCode",ret,4,&KContextConfigRel99);
+ continue;
+ }
+ else
+ contextConfigRel99.iDeactivateErrorCode = deactivateErrorCode;
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,5,deletionPause);
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("ContextConfigRel99::deletetionPause",ret,5,&KContextConfigRel99);
+ continue;
+ }
+ else
+ contextConfigRel99.iDeletionPause = deletionPause;
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,6, deletionErrorCode);
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("ContextConfigRel99::deletionErrorCode",ret,6,&KContextConfigRel99);
+ continue;
+ }
+ else
+ contextConfigRel99.iDeletionErrorCode = deletionErrorCode;
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,7, connectToNtRas);
+ if(ret!=KErrNone)
+ {
+ contextConfigRel99.iConnectToNtRas = ETrue;
+ }
+ else
+ contextConfigRel99.iConnectToNtRas = connectToNtRas;
+
+ iContextConfigsRel99->AppendL(contextConfigRel99);
+ }
+ }
+
+/**
+ Retrieves the (aIndex+1)th packet context status with the current context's context name
+ ie. if aIndex is 0, the 1st context status entry is returned and if aIndex is 1, the 2nd is returned
+ */
+TNotifyContextStatusChange& CSimPacketContext::GetContextStatusChangeAt(TInt aIndex)
+ {
+ TInt count = 0;
+ for (TInt i = 0; i < iNotifyContextStatusChangeArray->Count(); i++)
+ {
+ if (iContextName.Compare(iNotifyContextStatusChangeArray->At(i).iContextName) == 0)
+ {
+ if (count == aIndex)
+ {
+ return iNotifyContextStatusChangeArray->At(i);
+ }
+ else
+ {
+ count++;
+ }
+ }
+ }
+ return iNotifyContextStatusChangeArray->At(0);
+ }
+
+/**
+ Retrieves the number of context status changes entries configured for the current packet context
+ */
+TInt CSimPacketContext::GetContextStatusChangeCount()
+ {
+ TInt count = 0;
+ for (TInt i = 0; i < iNotifyContextStatusChangeArray->Count(); i++)
+ {
+ if (iContextName.Compare(iNotifyContextStatusChangeArray->At(i).iContextName) == 0)
+ {
+ count++;
+ }
+ }
+ return count;
+ }
+
+void CSimPacketContext::GetContextStatusChangeSettingsL()
+ {
+ TPtrC8 contextStatusChangeType;
+ TInt ret;
+
+ iNotifyContextStatusChangeArray = new (ELeave) CArrayFixFlat<TNotifyContextStatusChange>(KNumberofConfigs);
+
+ // default to using timer to drive context status changes
+ iNotifyContextStatusChangeType = ETimer;
+ const CTestConfigItem* item = CfgFile()->Item(KNotifyContextStatusChangeType);
+ if (item)
+ {
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,contextStatusChangeType);
+ if(ret==KErrNone && contextStatusChangeType.Compare(KNotificationTypePublishSubscribe)==0)
+ iNotifyContextStatusChangeType = EPublishAndSubscribe;
+ }
+
+ TInt count = CfgFile()->ItemCount(KNotifyContextStatusChange);
+
+ for(TInt i=0;i<count;i++) // set up NotifyContextStatusChange info
+ {
+ item = CfgFile()->Item(KNotifyContextStatusChange,i);
+ if(!item)
+ break;
+
+ TNotifyContextStatusChange notifyContextStatusChange;
+ TPtrC8 contextName;
+ TInt duration, contextStatus;
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,contextName);
+
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("NotifyContextStatusChange::contextName",ret,0,&KNotifyContextStatusChange);
+ continue;
+ }
+ else
+ {
+ notifyContextStatusChange.iContextName.Copy(contextName);
+ }
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,duration);
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("NotifyContextStatusChange::duration",ret,1,&KNotifyContextStatusChange);
+ continue;
+ }
+ else
+ notifyContextStatusChange.iDuration = duration;
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,contextStatus);
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("NotifyContextStatusChange::duration",ret,2,&KNotifyContextStatusChange);
+ continue;
+ }
+ else
+ notifyContextStatusChange.iStatus = (RPacketContext::TContextStatus)contextStatus;
+
+ iNotifyContextStatusChangeArray->AppendL(notifyContextStatusChange);
+
+ if(GetContextStatusChangeCount() != 0)
+ {
+ iCurrentNotifyContextStatusChange=(RPacketContext::TContextStatus)GetContextStatusChangeAt(0).iStatus;
+ if (iNotifyContextStatusChangeType == ETimer)
+ {
+ iNotifyContextStatusChangeIndex=0;
+ iNotifyContextStatusChangeTimer->Start(GetContextStatusChangeAt(0).iDuration,this,ETimerIdPcktContextStatusChange);
+ }
+ }
+ }
+ }
+
+void CSimPacketContext::ConstructPacketFiltersL()
+ {
+ iPacketFilterInfoArray = new (ELeave) CArrayFixFlat<TPacketFilterV3>(KNumberofConfigs);
+
+ const CTestConfigItem* item;
+ TInt count, ret;
+ count = CfgFile()->ItemCount(KPacketFilterInfo);
+
+ for(TInt i=0;i<count;i++) // set up Packet filter info
+ {
+ item = CfgFile()->Item(KPacketFilterInfo,i);
+ if(!item)
+ break;
+
+ TPtrC8 srcAddr, srcAddrSubnetMask;
+ TInt id, evaluationPrecedenceIndex, protocolNumberOrNextHeader;
+ TInt srcPortMin, srcPortMax, destPortMin, destPortMax, ipSecSPI, toSorTrafficClass;
+ TInt flowLabel, filterType;
+ TPacketFilterV3 packetFilter;
+
+ // Check that the data structure is supported by the simulated TSY version
+ if(iPhone->iSimTsyVersion < 3) // same version as TPacketFilterVx
+ {
+ (void)User::Leave(KErrNotSupported);
+ }
+
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,id);
+
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("PacketFilterInfo::id",ret,0,&KPacketFilterInfo);
+ continue;
+ }
+ else
+ {
+ packetFilter.iId= id;
+ }
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,evaluationPrecedenceIndex);
+
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("PacketFilterInfo::evaluationPrecedenceIndex",ret,1,&KPacketFilterInfo);
+ continue;
+ }
+ else
+ {
+ packetFilter.iEvaluationPrecedenceIndex= evaluationPrecedenceIndex;
+ }
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,srcAddr);
+
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("PacketFilterInfo::srcAddr",ret,2,&KPacketFilterInfo);
+ continue;
+ }
+ else
+ {
+ TUint8 digit=0;
+ TPtrC8 address;
+
+ ret=CTestConfig::GetElement(srcAddr,'.',0, address);
+ if((AsciiToNum(address, digit)==KErrNone)
+ && (ret == KErrNone))
+ packetFilter.iSrcAddr[0] = digit;
+ else
+ packetFilter.iSrcAddr[0] = 0;
+ ret=CTestConfig::GetElement(srcAddr,'.',1, address);
+ if((AsciiToNum(address, digit)==KErrNone)
+ && (ret == KErrNone))
+ packetFilter.iSrcAddr[1] = digit;
+ else
+ packetFilter.iSrcAddr[1] = 0;
+ ret=CTestConfig::GetElement(srcAddr,'.',2, address);
+ if((AsciiToNum(address, digit)==KErrNone)
+ && (ret == KErrNone))
+ packetFilter.iSrcAddr[2] = digit;
+ else
+ packetFilter.iSrcAddr[2] = 0;
+ ret=CTestConfig::GetElement(srcAddr,'.',3, address);
+ if((AsciiToNum(address, digit)==KErrNone)
+ && (ret == KErrNone))
+ packetFilter.iSrcAddr[3] = digit;
+ else
+ packetFilter.iSrcAddr[3] = 0;
+ ret=CTestConfig::GetElement(srcAddr,'.',4, address);
+ if((AsciiToNum(address, digit)==KErrNone)
+ && (ret == KErrNone))
+ packetFilter.iSrcAddr[4] = digit;
+ else
+ packetFilter.iSrcAddr[4] = 0;
+ ret=CTestConfig::GetElement(srcAddr,'.',5, address);
+ if((AsciiToNum(address, digit)==KErrNone)
+ && (ret == KErrNone))
+ packetFilter.iSrcAddr[5] = digit;
+ else
+ packetFilter.iSrcAddr[5] = 0;
+ ret=CTestConfig::GetElement(srcAddr,'.',6, address);
+ if((AsciiToNum(address, digit)==KErrNone)
+ && (ret == KErrNone))
+ packetFilter.iSrcAddr[6] = digit;
+ else
+ packetFilter.iSrcAddr[6] = 0;
+ ret=CTestConfig::GetElement(srcAddr,'.',7, address);
+ if((AsciiToNum(address, digit)==KErrNone)
+ && (ret == KErrNone))
+ packetFilter.iSrcAddr[7] = digit;
+ else
+ packetFilter.iSrcAddr[7] = 0;
+ ret=CTestConfig::GetElement(srcAddr,'.',8, address);
+ if((AsciiToNum(address, digit)==KErrNone)
+ && (ret == KErrNone))
+ packetFilter.iSrcAddr[8] = digit;
+ else
+ packetFilter.iSrcAddr[8] = 0;
+ ret=CTestConfig::GetElement(srcAddr,'.',9, address);
+ if((AsciiToNum(address, digit)==KErrNone)
+ && (ret == KErrNone))
+ packetFilter.iSrcAddr[9] = digit;
+ else
+ packetFilter.iSrcAddr[9] = 0;
+ ret=CTestConfig::GetElement(srcAddr,'.',10, address);
+ if((AsciiToNum(address, digit)==KErrNone)
+ && (ret == KErrNone))
+ packetFilter.iSrcAddr[10] = digit;
+ else
+ packetFilter.iSrcAddr[10] = 0;
+ ret=CTestConfig::GetElement(srcAddr,'.',11, address);
+ if((AsciiToNum(address, digit)==KErrNone)
+ && (ret == KErrNone))
+ packetFilter.iSrcAddr[11] = digit;
+ else
+ packetFilter.iSrcAddr[11] = 0;
+ ret=CTestConfig::GetElement(srcAddr,'.',12, address);
+ if((AsciiToNum(address, digit)==KErrNone)
+ && (ret == KErrNone))
+ packetFilter.iSrcAddr[12] = digit;
+ else
+ packetFilter.iSrcAddr[12] = 0;
+ ret=CTestConfig::GetElement(srcAddr,'.',13, address);
+ if((AsciiToNum(address, digit)==KErrNone)
+ && (ret == KErrNone))
+ packetFilter.iSrcAddr[13] = digit;
+ else
+ packetFilter.iSrcAddr[13] = 0;
+ ret=CTestConfig::GetElement(srcAddr,'.',14, address);
+ if((AsciiToNum(address, digit)==KErrNone)
+ && (ret == KErrNone))
+ packetFilter.iSrcAddr[14] = digit;
+ else
+ packetFilter.iSrcAddr[14] = 0;
+ ret=CTestConfig::GetElement(srcAddr,'.',15, address);
+ if((AsciiToNum(address, digit)==KErrNone)
+ && (ret == KErrNone))
+ packetFilter.iSrcAddr[15] = digit;
+ else
+ packetFilter.iSrcAddr[15] = 0;
+
+ }
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,srcAddrSubnetMask);
+
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("PacketFilterInfo::srcAddrSubnetMask",ret,3,&KPacketFilterInfo);
+ continue;
+ }
+ else
+ {
+ TUint8 digit=0;
+ TPtrC8 address;
+
+ ret=CTestConfig::GetElement(srcAddrSubnetMask,'.',0, address);
+ if((AsciiToNum(address, digit)==KErrNone)
+ && (ret == KErrNone))
+ packetFilter.iSrcAddrSubnetMask[0] = digit;
+ else
+ packetFilter.iSrcAddrSubnetMask[0] = 0;
+ ret=CTestConfig::GetElement(srcAddrSubnetMask,'.',1, address);
+ if((AsciiToNum(address, digit)==KErrNone)
+ && (ret == KErrNone))
+ packetFilter.iSrcAddrSubnetMask[1] = digit;
+ else
+ packetFilter.iSrcAddrSubnetMask[1] = 0;
+ ret=CTestConfig::GetElement(srcAddrSubnetMask,'.',2, address);
+ if((AsciiToNum(address, digit)==KErrNone)
+ && (ret == KErrNone))
+ packetFilter.iSrcAddrSubnetMask[2] = digit;
+ else
+ packetFilter.iSrcAddrSubnetMask[2] = 0;
+ ret=CTestConfig::GetElement(srcAddrSubnetMask,'.',3, address);
+ if((AsciiToNum(address, digit)==KErrNone)
+ && (ret == KErrNone))
+ packetFilter.iSrcAddrSubnetMask[3] = digit;
+ else
+ packetFilter.iSrcAddrSubnetMask[3] = 0;
+ ret=CTestConfig::GetElement(srcAddrSubnetMask,'.',4, address);
+ if((AsciiToNum(address, digit)==KErrNone)
+ && (ret == KErrNone))
+ packetFilter.iSrcAddrSubnetMask[4] = digit;
+ else
+ packetFilter.iSrcAddrSubnetMask[4] = 0;
+ ret=CTestConfig::GetElement(srcAddrSubnetMask,'.',5, address);
+ if((AsciiToNum(address, digit)==KErrNone)
+ && (ret == KErrNone))
+ packetFilter.iSrcAddrSubnetMask[5] = digit;
+ else
+ packetFilter.iSrcAddrSubnetMask[5] = 0;
+ ret=CTestConfig::GetElement(srcAddrSubnetMask,'.',6, address);
+ if((AsciiToNum(address, digit)==KErrNone)
+ && (ret == KErrNone))
+ packetFilter.iSrcAddrSubnetMask[6] = digit;
+ else
+ packetFilter.iSrcAddrSubnetMask[6] = 0;
+ ret=CTestConfig::GetElement(srcAddrSubnetMask,'.',7, address);
+ if((AsciiToNum(address, digit)==KErrNone)
+ && (ret == KErrNone))
+ packetFilter.iSrcAddrSubnetMask[7] = digit;
+ else
+ packetFilter.iSrcAddrSubnetMask[7] = 0;
+ ret=CTestConfig::GetElement(srcAddrSubnetMask,'.',8, address);
+ if((AsciiToNum(address, digit)==KErrNone)
+ && (ret == KErrNone))
+ packetFilter.iSrcAddrSubnetMask[8] = digit;
+ else
+ packetFilter.iSrcAddrSubnetMask[8] = 0;
+ ret=CTestConfig::GetElement(srcAddrSubnetMask,'.',9, address);
+ if((AsciiToNum(address, digit)==KErrNone)
+ && (ret == KErrNone))
+ packetFilter.iSrcAddrSubnetMask[9] = digit;
+ else
+ packetFilter.iSrcAddrSubnetMask[9] = 0;
+ ret=CTestConfig::GetElement(srcAddrSubnetMask,'.',10, address);
+ if((AsciiToNum(address, digit)==KErrNone)
+ && (ret == KErrNone))
+ packetFilter.iSrcAddrSubnetMask[10] = digit;
+ else
+ packetFilter.iSrcAddrSubnetMask[10] = 0;
+ ret=CTestConfig::GetElement(srcAddrSubnetMask,'.',11, address);
+ if((AsciiToNum(address, digit)==KErrNone)
+ && (ret == KErrNone))
+ packetFilter.iSrcAddrSubnetMask[11] = digit;
+ else
+ packetFilter.iSrcAddrSubnetMask[11] = 0;
+ ret=CTestConfig::GetElement(srcAddrSubnetMask,'.',12, address);
+ if((AsciiToNum(address, digit)==KErrNone)
+ && (ret == KErrNone))
+ packetFilter.iSrcAddrSubnetMask[12] = digit;
+ else
+ packetFilter.iSrcAddrSubnetMask[12] = 0;
+ ret=CTestConfig::GetElement(srcAddrSubnetMask,'.',13, address);
+ if((AsciiToNum(address, digit)==KErrNone)
+ && (ret == KErrNone))
+ packetFilter.iSrcAddrSubnetMask[13] = digit;
+ else
+ packetFilter.iSrcAddrSubnetMask[13] = 0;
+ ret=CTestConfig::GetElement(srcAddrSubnetMask,'.',14, address);
+ if((AsciiToNum(address, digit)==KErrNone)
+ && (ret == KErrNone))
+ packetFilter.iSrcAddrSubnetMask[14] = digit;
+ else
+ packetFilter.iSrcAddrSubnetMask[14] = 0;
+ ret=CTestConfig::GetElement(srcAddrSubnetMask,'.',15, address);
+ if((AsciiToNum(address, digit)==KErrNone)
+ && (ret == KErrNone))
+ packetFilter.iSrcAddrSubnetMask[15] = digit;
+ else
+ packetFilter.iSrcAddrSubnetMask[15] = 0;
+ }
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,protocolNumberOrNextHeader);
+
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("PacketFilterInfo::protocolNumberOrNextNumber",ret,4,&KPacketFilterInfo);
+ packetFilter.iProtocolNumberOrNextHeader = KUnsetInteger;
+ }
+ else
+ {
+ packetFilter.iProtocolNumberOrNextHeader= protocolNumberOrNextHeader;
+ }
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,5,srcPortMin);
+
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("PacketFilterInfo::srcPortMin",ret,5,&KPacketFilterInfo);
+ packetFilter.iSrcPortMin = KUnsetInteger;
+ }
+ else
+ {
+ packetFilter.iSrcPortMin= srcPortMin;
+ }
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,6,srcPortMax);
+
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("PacketFilterInfo::srcPortMax",ret,6,&KPacketFilterInfo);
+ packetFilter.iSrcPortMax = KUnsetInteger;
+ }
+ else
+ {
+ packetFilter.iSrcPortMax= srcPortMax;
+ }
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,7,destPortMin);
+
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("PacketFilterInfo::destPortMin",ret,7,&KPacketFilterInfo);
+ packetFilter.iDestPortMin = KUnsetInteger;
+ }
+ else
+ {
+ packetFilter.iDestPortMin= destPortMin;
+ }
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,8,destPortMax);
+
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("PacketFilterInfo::srcPortMax",ret,8,&KPacketFilterInfo);
+ packetFilter.iDestPortMax = KUnsetInteger;
+ }
+ else
+ {
+ packetFilter.iDestPortMax= destPortMax;
+ }
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,9,ipSecSPI);
+
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("PacketFilterInfo::ipSecSPI",ret,9,&KPacketFilterInfo);
+ packetFilter.iIPSecSPI = KUnsetInteger;
+ }
+ else
+ {
+ packetFilter.iIPSecSPI= ipSecSPI;
+ }
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,10,toSorTrafficClass);
+
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("PacketFilterInfo::toSorTrafficClass",ret,10,&KPacketFilterInfo);
+ continue;
+ }
+ else
+ {
+ packetFilter.iTOSorTrafficClass = (TUint16)toSorTrafficClass;
+ }
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,11,flowLabel);
+
+ if(ret!=KErrNone)
+ {
+ LOGPARSERR("PacketFilterInfo::flowLabel",ret,11,&KPacketFilterInfo);
+ packetFilter.iFlowLabel = KUnsetInteger;
+ }
+ else
+ {
+ packetFilter.iFlowLabel = flowLabel;
+ }
+
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,12,filterType);
+
+ if(ret!=KErrNone)
+ {
+ if(ret == KErrNotFound)
+ {
+ LOGCONFIG1("CONFIGURATION FILE PARSING - PacketFilterInfo::TPacketFilterV2 info encountered");
+ packetFilter.iFilterType = RPacketContext::EPacketFilterTypeUnknown;
+ }
+ else
+ {
+ LOGPARSERR("PacketFilterInfo::filterType",ret,12,&KPacketFilterInfo);
+ continue;
+ }
+ }
+ else
+ {
+ packetFilter.iFilterType = static_cast<RPacketContext::TPacketFilterType>(filterType);
+ }
+
+ packetFilter.iAdded = EFalse;
+ TRAP_IGNORE(iPacketFilterInfoArray->AppendL(packetFilter));
+ }
+ }
+
+CSimPacketContext::~CSimPacketContext()
+/**
+* Trivial Destructor
+* Closes all CObject type objects and destroys all other objects created in the ConstructL()
+*
+*/
+ {
+ LOGPACKET1("CSimPacketContext: Entered destructor");
+
+ if (iContextConfigParams != NULL)
+ {
+ iContextConfigParams->Delete(0, iContextConfigParams->Count());
+ delete iContextConfigParams;
+ }
+ if (iContextConfigsRel99 != NULL)
+ {
+ iContextConfigsRel99->Delete(0,iContextConfigsRel99->Count());
+ delete iContextConfigsRel99;
+ }
+ if (iCommSetupArray != NULL)
+ {
+ iCommSetupArray->Delete(0, iCommSetupArray->Count());
+ delete iCommSetupArray;
+ }
+ if (iNtRas != NULL)
+ delete iNtRas;
+
+ if (iTimer != NULL)
+ delete iTimer;
+
+ if (iSetConfigTimer != NULL)
+ delete iSetConfigTimer;
+
+ if (iInitContextTimer != NULL)
+ delete iInitContextTimer;
+
+ if (iCreateTftTimer != NULL)
+ delete iCreateTftTimer;
+
+ if (iNotifyContextStatusChangeTimer != NULL)
+ delete iNotifyContextStatusChangeTimer;
+
+ if (iNotifyContextConfigChangeTimer != NULL)
+ delete iNotifyContextConfigChangeTimer;
+
+ if (iPacketFilterInfoArray != NULL)
+ {
+ iPacketFilterInfoArray->Delete(0, iPacketFilterInfoArray->Count());
+ delete iPacketFilterInfoArray;
+ }
+ if (iNotifyContextStatusChangeArray != NULL)
+ {
+ iNotifyContextStatusChangeArray->Delete(0, iNotifyContextStatusChangeArray->Count());
+ delete iNotifyContextStatusChangeArray;
+ }
+ iPacketService->DecrementContextCount();
+
+ if (iAuthorizationTokenResponse != NULL)
+ {
+ iAuthorizationTokenResponse->Delete(0, iAuthorizationTokenResponse->Count());
+ delete iAuthorizationTokenResponse;
+ }
+
+ if (iMediaAuthorization != NULL)
+ {
+ for(TUint i=0; i<iMediaAuthorization->Count(); i++)
+ {
+ if (iMediaAuthorization->At(i).iFlowIds.Count() > 0)
+ {
+ iMediaAuthorization->At(i).iFlowIds.Reset();
+ }
+ }
+ iMediaAuthorization->Delete(0, iMediaAuthorization->Count());
+ delete iMediaAuthorization;
+ }
+
+ delete iContextStatusChange;
+
+ if(iSetConfigData !=NULL )
+ {
+ iSetConfigData->Delete(0, iSetConfigData->Count());
+ delete iSetConfigData;
+ }
+
+ if(iNotifyContextConfigChangeArray !=NULL)
+ {
+ iNotifyContextConfigChangeArray->Delete(0,iNotifyContextConfigChangeArray->Count());
+ delete iNotifyContextConfigChangeArray;
+ }
+}
+
+CTelObject* CSimPacketContext::OpenNewObjectByNameL(const TDesC& aName)
+/**
+* Returns a pointer to an existing QoS object identified by name.
+* This is not support and if called will leave.
+*
+* @param aName name of the QoS object to be opened
+* @return CTelObject will return null and leave
+* @leave Leaves with KErrNotSupported if the name is not as expected.
+*/
+ {
+ if (aName.Compare(iQoSName) == KErrNone)
+ {
+ return iPacketqos;
+ }
+
+ User::Leave(KErrNotSupported);
+ return NULL;
+ }
+
+
+CTelObject* CSimPacketContext::OpenNewObjectL(TDes& aNewName)
+/**
+* Creates a new CSimPacketQoS object and returns a pointer to it.
+*
+* @param aNewName new name of the object created
+* @return CTelObject pointer to the CSimPacketQos object created
+* @leave Leaves if out of memory.
+*/
+ {
+ aNewName.Append(KSimPacketQosName);
+ aNewName.AppendNum(++iQoSObjectCount);
+ iQoSName.Copy(aNewName);
+ iPacketqos = CSimPacketQoS::NewL(iPhone, this);
+ return iPacketqos;
+ }
+
+CTelObject::TReqMode CSimPacketContext::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 EPacketContextSetConfig:
+ case EPacketContextActivate:
+ case EPacketContextDeactivate:
+ case EPacketContextDelete:
+ case EPacketContextLoanCommPort:
+ case EPacketContextRecoverCommPort:
+ case EPacketContextGetConfig:
+ case EPacketContextGetStatus:
+ case EPacketContextGetDataVolumeTransferred:
+ case EPacketContextGetLastErrorCause:
+ case EPacketContextInitialiseContext:
+ case EPacketContextEnumeratePacketFilters:
+ case EPacketContextGetPacketFilterInfo:
+ case EPacketContextAddPacketFilter:
+ case EPacketContextRemovePacketFilter:
+ case EPacketContextModifyActiveContext:
+ case EPacketContextGetProfileName:
+ case EPacketContextGetDNSInfo:
+ case EPacketAddMediaAuthorization:
+ case EPacketRemoveMediaAuthorization:
+ case EPacketContextCreateNewTFT:
+ case EPacketContextDeleteTFT:
+ break;
+
+ case EPacketContextNotifyConfigChanged:
+ case EPacketContextNotifyStatusChange:
+ case EPacketContextNotifyDataTransferred:
+ ret=KReqModeMultipleCompletionEnabled | KReqModeRePostImmediately;
+ break;
+
+ default:
+ User::Leave(KErrNotSupported);
+ break;
+ }
+
+ return ret;
+ }
+
+TInt CSimPacketContext::GetProfileName(const TTsyReqHandle aTsyReqHandle, TName* aQoSProfile)
+ {
+/**
+* This synchronous method allows a client to retrieve the name
+* of the QoS profile. The profile name is passed back in the aQoSProfile parameter
+*/
+ aQoSProfile->Copy(iQoSName);
+ ReqCompleted(aTsyReqHandle,KErrNone);
+ return KErrNone;
+ }
+
+TInt CSimPacketContext::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 EPacketContextNotifyConfigChanged:
+ case EPacketContextNotifyStatusChange:
+ case EPacketContextNotifyDataTransferred:
+ return KErrNone;
+ default:
+ // Unknown or invalid IPC
+ LOGPACKET1("CSimPacketContext: Register error, unknown IPC");
+ return KErrNotSupported;
+ }
+ }
+
+TInt CSimPacketContext::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 EPacketContextNotifyConfigChanged:
+ case EPacketContextNotifyStatusChange:
+ case EPacketContextNotifyDataTransferred:
+ LOGPACKET1("CSimPacketContext: DeregisterNotification");
+ return KErrNone;
+ default:
+ // Unknown or invalid IPC
+ LOGPACKET1("CSimPacketContext: Deregister error, unknown IPC");
+ return KErrNotSupported;
+ }
+ }
+
+TInt CSimPacketContext::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 EPacketContextNotifyConfigChanged:
+ case EPacketContextNotifyStatusChange:
+ case EPacketContextNotifyDataTransferred:
+ LOGPACKET1("CGprsDGprsTsy: Registered with 5 slots");
+ numberOfSlots=5;
+ break;
+ default:
+ // Unknown or invalid IPC
+ LOGPACKET1("CSimPacketContext: Number of Slots error, unknown IPC");
+ User::Leave(KErrNotSupported);
+ break;
+ }
+ return numberOfSlots;
+ }
+
+
+TInt CSimPacketContext::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
+*/
+ {
+ //< if this context has been deleted then the client can not do anything with it
+ //< if the client wants to use this class, the client must open a new object by
+ //< name with the name for this context and this will reactivate the context.
+ if(iDeleted && (aIpc != EPacketContextGetStatus))
+ {
+ ReqCompleted(aTsyReqHandle,KErrNotReady);
+ return KErrNone;
+ }
+
+ TAny* dataPtr=aPackage.Ptr1();
+ TAny* dataPtr2=aPackage.Ptr2();
+
+ switch (aIpc)
+ {
+ case EPacketContextSetConfig:
+ {
+ if (iSetConfigCallCount <= iSetConfigFail.iNumberOfTimes
+ || iSetConfigFail.iNumberOfTimes==0)
+ {
+ if (iSetConfigDelay > 0)
+ {
+ TSetConfigData setConfigData;
+ setConfigData.iTsyReqHandle = aTsyReqHandle;
+ setConfigData.iData = aPackage.Des1n();
+
+ TRAPD(ret, iSetConfigData->AppendL(setConfigData) );
+ if (ret != KErrNone)
+ {
+ LOGPACKET1("CSimPacketContext::ExtFunc AppendL call fail");
+ return ret;
+ }
+
+ iSetConfigTimer->Start(iSetConfigDelay,this,ETimerIdPcktContextSetConfig);
+ }
+ else
+ {
+ SetConfig(aTsyReqHandle, aPackage.Des1n());
+ }
+ iSetConfigCallCount++;
+ return KErrNone;
+ }
+ else
+ {
+ iSetConfigCallCount=0;
+ iSetConfigFail.iNumberOfTimes = 0;
+
+ ReqCompleted(aTsyReqHandle, iSetConfigFail.iFailErrorCode);
+ return KErrNone; // if SetConfig() has been called the number of times allowed in SetConfigFail, fail request
+ }
+ }
+ case EPacketContextGetProfileName:
+ return GetProfileName(aTsyReqHandle, REINTERPRET_CAST(TName*,dataPtr));
+ case EPacketContextSetConfigCancel:
+ return SetConfigCancel(aTsyReqHandle);
+ case EPacketContextGetConfig:
+ return GetConfig(aTsyReqHandle, aPackage.Des1n());
+ case EPacketContextGetConfigCancel:
+ return GetConfigCancel(aTsyReqHandle);
+ case EPacketContextNotifyConfigChanged:
+ return NotifyConfigChanged(aTsyReqHandle, aPackage.Des1n());
+ case EPacketContextNotifyConfigChangedCancel:
+ return NotifyConfigChangedCancel(aTsyReqHandle);
+ case EPacketContextActivate:
+ { //< Ensures that theres only one context active as only one active context is
+ //<permitted at any one time
+ if(iIsActive)
+ {
+ ReqCompleted(aTsyReqHandle,KErrEtelCallAlreadyActive);
+ return KErrNone;
+ }
+ else
+ return Activate(aTsyReqHandle);
+ }
+ case EPacketContextActivateCancel:
+ return ActivateCancel(aTsyReqHandle);
+ case EPacketContextDeactivate:
+ return Deactivate(aTsyReqHandle);
+ case EPacketContextDeactivateCancel:
+ return DeactivateCancel(aTsyReqHandle);
+ case EPacketContextDelete:
+ return Delete(aTsyReqHandle);
+ case EPacketContextDeleteCancel:
+ return DeleteCancel(aTsyReqHandle);
+ case EPacketContextLoanCommPort:
+ return LoanCommPort(aTsyReqHandle,
+ REINTERPRET_CAST(RCall::TCommPort*, dataPtr));
+ case EPacketContextLoanCommPortCancel:
+ return LoanCommPortCancel(aTsyReqHandle);
+ case EPacketContextRecoverCommPort:
+ return RecoverCommPort(aTsyReqHandle);
+ case EPacketContextRecoverCommPortCancel:
+ return RecoverCommPortCancel(aTsyReqHandle);
+ case EPacketContextGetStatus:
+ return GetStatus(aTsyReqHandle,
+ REINTERPRET_CAST(RPacketContext::TContextStatus*, dataPtr));
+ case EPacketContextNotifyStatusChange:
+ return NotifyStatusChange(aTsyReqHandle,
+ REINTERPRET_CAST(RPacketContext::TContextStatus*, dataPtr));
+ case EPacketContextNotifyStatusChangeCancel:
+ return NotifyStatusChangeCancel(aTsyReqHandle);
+ case EPacketContextGetDataVolumeTransferred:
+ return GetDataVolumeTransferred(aTsyReqHandle,
+ REINTERPRET_CAST(RPacketContext::TDataVolume*, dataPtr));
+ case EPacketContextNotifyDataTransferred:
+ return NotifyDataTransferred(aTsyReqHandle,
+ REINTERPRET_CAST(RPacketContext::TDataVolume*, dataPtr),
+ REINTERPRET_CAST(RPacketContext::TNotifyDataTransferredRequest*, dataPtr2));
+ case EPacketContextNotifyDataTransferredCancel:
+ return NotifyDataTransferredCancel(aTsyReqHandle);
+ case EPacketContextGetLastErrorCause:
+ return GetLastErrorCause(aTsyReqHandle,
+ REINTERPRET_CAST(TInt*, dataPtr));
+ case EPacketContextInitialiseContextCancel:
+ return InitialiseContextCancel(aTsyReqHandle);
+ case EPacketContextEnumeratePacketFiltersCancel:
+ return EnumeratePacketFiltersCancel(aTsyReqHandle);
+ case EPacketContextGetPacketFilterInfoCancel:
+ return GetPacketFilterInfoCancel(aTsyReqHandle);
+ case EPacketContextAddPacketFilterCancel:
+ return AddPacketFilterCancel(aTsyReqHandle);
+ case EPacketContextRemovePacketFilterCancel:
+ return RemovePacketFilterCancel(aTsyReqHandle);
+ case EPacketContextModifyActiveContextCancel:
+ return ModifyActiveContextCancel(aTsyReqHandle);
+ case EPacketContextInitialiseContext:
+ return InitialiseContext(aTsyReqHandle, aPackage.Des1n());
+ case EPacketContextEnumeratePacketFilters:
+ return EnumeratePacketFilters(aTsyReqHandle, *REINTERPRET_CAST(TInt*, dataPtr));
+ case EPacketContextGetPacketFilterInfo:
+ TInt retValue;
+ TRAPD(err, retValue = GetPacketFilterInfoL(aTsyReqHandle, *REINTERPRET_CAST(TInt*, dataPtr), aPackage.Des2n()));
+ if(err != KErrNone)
+ {
+ retValue = err;
+ }
+ return retValue;
+ case EPacketContextAddPacketFilter:
+ return AddPacketFilter(aTsyReqHandle, aPackage.Des1n());
+ case EPacketContextRemovePacketFilter:
+ return RemovePacketFilter(aTsyReqHandle, *REINTERPRET_CAST(TInt*, dataPtr));
+ case EPacketContextModifyActiveContext:
+ return ModifyActiveContext(aTsyReqHandle);
+ case EPacketContextGetDNSInfo:
+ return GetDnsInfo(aTsyReqHandle, aPackage.Des1n());
+ case EPacketContextGetDNSInfoCancel:
+ return GetDnsInfoCancel(aTsyReqHandle);
+ case EPacketAddMediaAuthorization:
+ return GetAddMediaAuthorization(aTsyReqHandle, aPackage.Des1n());
+ case EPacketAddMediaAuthorizationCancel:
+ return GetAddMediaAuthorizationCancel(aTsyReqHandle);
+ case EPacketRemoveMediaAuthorization:
+ return GetRemoveMediaAuthorization(aTsyReqHandle, reinterpret_cast<RPacketContext::TAuthorizationToken*>(dataPtr));
+ case EPacketRemoveMediaAuthorizationCancel:
+ return GetRemoveMediaAuthorizationCancel(aTsyReqHandle);
+ case EPacketContextCreateNewTFT:
+ return CreateNewTFT(aTsyReqHandle, REINTERPRET_CAST(TInt*, dataPtr));
+ case EPacketContextCreateNewTFTCancel:
+ return CreateNewTFTCancel(aTsyReqHandle);
+ case EPacketContextDeleteTFT:
+ return DeleteTFT(aTsyReqHandle);
+ case EPacketContextDeleteTFTCancel:
+ return DeleteTFTCancel(aTsyReqHandle);
+ default:
+ return KErrNotSupported;
+ }
+ }
+
+TInt CSimPacketContext::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.
+*
+* @param aTsyReqHandle The request handle for completing the request
+* @param aIpc Ipc representing the request
+* @return err KErrNone if request completes ok
+*/
+ {
+ LOGPACKET1("CSimPacketContext: - CancelService called");
+ switch (aIpc)
+ {
+ case EPacketContextSetConfig:
+ return SetConfigCancel(aTsyReqHandle);
+ case EPacketContextGetConfig:
+ return GetConfigCancel(aTsyReqHandle);
+ case EPacketContextNotifyConfigChanged:
+ return NotifyConfigChangedCancel(aTsyReqHandle);
+ case EPacketContextActivate:
+ return ActivateCancel(aTsyReqHandle);
+ case EPacketContextDeactivate:
+ return DeactivateCancel(aTsyReqHandle);
+ case EPacketContextDelete:
+ return DeleteCancel(aTsyReqHandle);
+ case EPacketContextLoanCommPort:
+ return LoanCommPortCancel(aTsyReqHandle);
+ case EPacketContextRecoverCommPort:
+ return RecoverCommPortCancel(aTsyReqHandle);
+ case EPacketContextNotifyStatusChange:
+ return NotifyStatusChangeCancel(aTsyReqHandle);
+ case EPacketContextNotifyDataTransferred:
+ return NotifyDataTransferredCancel(aTsyReqHandle);
+ case EPacketContextInitialiseContext:
+ return InitialiseContextCancel(aTsyReqHandle);
+ case EPacketContextEnumeratePacketFilters:
+ return EnumeratePacketFiltersCancel(aTsyReqHandle);
+ case EPacketContextGetPacketFilterInfo:
+ return GetPacketFilterInfoCancel(aTsyReqHandle);
+ case EPacketContextAddPacketFilter:
+ return AddPacketFilterCancel(aTsyReqHandle);
+ case EPacketContextRemovePacketFilter:
+ return RemovePacketFilterCancel(aTsyReqHandle);
+ case EPacketContextModifyActiveContext:
+ return ModifyActiveContextCancel(aTsyReqHandle);
+ case EPacketContextGetDNSInfo:
+ return GetDnsInfoCancel(aTsyReqHandle);
+ case EPacketAddMediaAuthorization:
+ return GetAddMediaAuthorizationCancel(aTsyReqHandle);
+ case EPacketRemoveMediaAuthorization:
+ return GetRemoveMediaAuthorizationCancel(aTsyReqHandle);
+ case EPacketContextCreateNewTFT:
+ return CreateNewTFTCancel(aTsyReqHandle);
+ case EPacketContextDeleteTFT:
+ return DeleteTFTCancel(aTsyReqHandle);
+ default:
+ return KErrGeneral;
+ }
+ }
+
+TInt CSimPacketContext::TSetConfigData::Find(CArrayFixFlat<TSetConfigData>* aSetConfigArray, TTsyReqHandle aTsyReqHandle, TInt& aIndex)
+ {
+ for (TInt i = 0; i < aSetConfigArray->Count(); i++)
+ {
+ if (aSetConfigArray->At(i).iTsyReqHandle == aTsyReqHandle)
+ {
+ aIndex = i;
+ return KErrNone;
+ }
+ }
+ aIndex = -1;
+ return KErrNotFound;
+ }
+
+TInt CSimPacketContext::SetConfig(const TTsyReqHandle aTsyReqHandle,const TDesC8* aConfig)
+/**
+* Sets the configuration
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @param aConfig pointer containing the parameters to set to.
+* @return KErrNone
+
+*/
+ {
+ LOGPACKET1("CSimPacketContext::SetConfig called");
+
+ TPckg<TPacketDataConfigBase>* configBase = (TPckg<TPacketDataConfigBase>*)aConfig;
+ TPacketDataConfigBase& configBaseV1 = (*configBase)();
+
+ TInt err = KErrGeneral;
+
+ //Extract the config params to be set
+ TContextConfigParam contextConfigToSet;
+
+ if(configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigGPRS)
+ {
+ TPckg<RPacketContext::TContextConfigGPRS>* configParam = (TPckg<RPacketContext::TContextConfigGPRS>*)aConfig;
+ RPacketContext::TContextConfigGPRS& contextConfigV1 = (*configParam)();
+
+ CSimContextHelper::SetTContextConfigParamFromTContextConfigGPRS( contextConfigToSet, contextConfigV1 );
+ }
+
+ if(configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigRel99Rel4)
+ {
+ TPckg<RPacketContext::TContextConfigR99_R4>* configParam = (TPckg<RPacketContext::TContextConfigR99_R4>*)aConfig;
+ RPacketContext::TContextConfigR99_R4& contextConfigV1 = (*configParam)();
+
+ CSimContextHelper::SetTContextConfigParamFromTContextConfigR99_R4( contextConfigToSet, contextConfigV1 );
+ }
+
+ if(configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigRel5)
+ {
+ TPckg<RPacketContext::TContextConfig_R5>* configParam = (TPckg<RPacketContext::TContextConfig_R5>*)aConfig;
+ RPacketContext::TContextConfig_R5& contextConfigV1 = (*configParam)();
+
+ CSimContextHelper::SetTContextConfigParamFromTContextConfig_R5( contextConfigToSet, contextConfigV1 );
+ }
+
+ // Check the context config params to be set with the pre-defined
+ // list of allowed config params
+ if((configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigGPRS)||
+ configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigRel99Rel4||
+ configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigRel5)
+ {
+
+ TInt index;
+ for(index=0; index < iContextConfigParams->Count(); index++)
+ {
+ TContextConfigParam thisConfig = iContextConfigParams->At(index);
+
+ if ( !CSimContextHelper::EqualTContextConfigParam(contextConfigToSet, thisConfig ) )
+ {
+ err = KErrCorrupt;
+ }
+ else
+ {
+ err = KErrNone;
+ iContextConfigParamsIndex = index;
+
+ //Check for and complete any pending notifications
+ if(iNotifyConfigGPRS.iNotifyPending)
+ {
+ iNotifyConfigGPRS.iNotifyPending=EFalse;
+ CSimContextHelper::ConvertConfigParams(thisConfig, *(RPacketContext::TContextConfigGPRS*)iNotifyConfigGPRS.iNotifyData);
+ ReqCompleted(iNotifyConfigGPRS.iNotifyHandle,KErrNone);
+ }
+
+ if(iNotifyConfigR99.iNotifyPending)
+ {
+ iNotifyConfigR99.iNotifyPending=EFalse;
+ CSimContextHelper::ConvertConfigParams(thisConfig, *(RPacketContext::TContextConfigR99_R4*)iNotifyConfigR99.iNotifyData);
+ ReqCompleted(iNotifyConfigR99.iNotifyHandle,KErrNone);
+ }
+
+ if(iNotifyConfigR5.iNotifyPending)
+ {
+ iNotifyConfigR5.iNotifyPending=EFalse;
+ CSimContextHelper::ConvertConfigParams(thisConfig, *(RPacketContext::TContextConfig_R5*)iNotifyConfigR5.iNotifyData);
+ ReqCompleted(iNotifyConfigR5.iNotifyHandle,KErrNone);
+ }
+ break;
+ }
+ }//end for loop
+ ReqCompleted(aTsyReqHandle,err);
+ }//end if((configBaseV1....
+
+ else
+ {
+ ReqCompleted(aTsyReqHandle,KErrCorrupt);
+ }
+
+ return KErrNone;
+ }
+
+TInt CSimPacketContext::SetConfigCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+* Cancels the Setconfig request.
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @return err KErrNone
+*/
+ {
+ TInt index = 0;
+ if (TSetConfigData::Find(iSetConfigData, aTsyReqHandle, index) == KErrNone)
+ {
+ iSetConfigData->Delete(index);
+ }
+ if (iSetConfigData->Count() == 0)
+ iSetConfigTimer->Cancel();
+
+ ReqCompleted(aTsyReqHandle, KErrCancel);
+
+ return KErrNone;
+ }
+
+TInt CSimPacketContext::GetConfig(const TTsyReqHandle aTsyReqHandle,TDes8* aConfig)
+/**
+* Retrieves and returns the configuration
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @param aConfig pointer to the data to retrieve
+* @return KErrNone
+*/
+ {
+ LOGPACKET1("CSimPacketContext::GetConfig called");
+ TPckg<TPacketDataConfigBase>* configBase = (TPckg<TPacketDataConfigBase>*)aConfig;
+ TPacketDataConfigBase& configBaseV1 = (*configBase)();
+
+ // GPRS configuration
+ if(configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigGPRS)
+ {
+ TContextConfigParam config = iContextConfigParams->At(iContextConfigParamsIndex);
+
+ TPckg<RPacketContext::TContextConfigGPRS>* contextConfigGPRSPckg = (TPckg<RPacketContext::TContextConfigGPRS>*)aConfig;
+ RPacketContext::TContextConfigGPRS& contextConfigV1 = (*contextConfigGPRSPckg)();
+
+ CSimContextHelper::ConvertConfigParams(config, contextConfigV1);
+
+ ReqCompleted(aTsyReqHandle,KErrNone);
+ }
+
+ // R99/R4 configuration
+ else if (configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigRel99Rel4)
+ {
+ TContextConfigParam config = iContextConfigParams->At(iContextConfigParamsIndex);
+
+ TPckg<RPacketContext::TContextConfigR99_R4>* configRel99Pckg = (TPckg<RPacketContext::TContextConfigR99_R4>*)aConfig;
+ RPacketContext::TContextConfigR99_R4& configRel99 = (*configRel99Pckg)();
+
+ CSimContextHelper::ConvertConfigParams(config, configRel99);
+
+ ReqCompleted(aTsyReqHandle,KErrNone);
+ }
+
+ // R5 configuration
+ else if (configBaseV1.ExtensionId()==TPacketDataConfigBase::KConfigRel5)
+ {
+ TContextConfigParam config = iContextConfigParams->At(iContextConfigParamsIndex);
+
+ TPckg<RPacketContext::TContextConfig_R5>* configRel5Pckg = (TPckg<RPacketContext::TContextConfig_R5>*)aConfig;
+ RPacketContext::TContextConfig_R5& configRel5 = (*configRel5Pckg)();
+
+ CSimContextHelper::ConvertConfigParams(config, configRel5);
+
+ ReqCompleted(aTsyReqHandle,KErrNone);
+ }
+ return KErrNone;
+ }
+
+TInt CSimPacketContext::GetConfigCancel(const TTsyReqHandle /*aTsyReqHandle*/)
+/**
+* Cancels the Getconfig request. This method will do nothing in this version of SimTSY.
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @return err KErrNone
+*/
+ {
+ return KErrNone;
+ }
+
+TInt CSimPacketContext::NotifyConfigChanged(const TTsyReqHandle aTsyReqHandle, TDes8* aConfig)
+/**
+* Records a client interest in being notified of a change in the Context Configuration.
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @param aConfig pointer to the context config to store the config info when the config changes.
+* @return KErrNone
+*/
+ {
+ TPckg<TPacketDataConfigBase>* configBase = (TPckg<TPacketDataConfigBase>*)aConfig;
+ TPacketDataConfigBase& configBaseV1 = (*configBase)();
+
+ if(configBaseV1.ExtensionId() == TPacketDataConfigBase::KConfigGPRS)
+ {
+ __ASSERT_ALWAYS(!iNotifyConfigGPRS.iNotifyPending,SimPanic(ENotificationAlreadyPending));
+
+ iNotifyConfigGPRS.iNotifyPending = ETrue;
+ iNotifyConfigGPRS.iNotifyHandle = aTsyReqHandle;
+ iNotifyConfigGPRS.iNotifyData = &configBaseV1;
+ }
+ else if(configBaseV1.ExtensionId() == TPacketDataConfigBase::KConfigRel99Rel4)
+ {
+ __ASSERT_ALWAYS(!iNotifyConfigR99.iNotifyPending,SimPanic(ENotificationAlreadyPending));
+
+ iNotifyConfigR99.iNotifyPending = ETrue;
+ iNotifyConfigR99.iNotifyHandle = aTsyReqHandle;
+ iNotifyConfigR99.iNotifyData = &configBaseV1;
+ }
+ else if(configBaseV1.ExtensionId() == TPacketDataConfigBase::KConfigRel5)
+ {
+ __ASSERT_ALWAYS(!iNotifyConfigR5.iNotifyPending,SimPanic(ENotificationAlreadyPending));
+
+ iNotifyConfigR5.iNotifyPending = ETrue;
+ iNotifyConfigR5.iNotifyHandle = aTsyReqHandle;
+ iNotifyConfigR5.iNotifyData = &configBaseV1;
+ }
+
+ return KErrNone;
+ }
+
+TInt CSimPacketContext::NotifyConfigChangedCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+* Cancel a client's interest in being notified when the context configuration 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("CSimPacketContext::NotifyConfigChangedCancel called");
+ if(iNotifyConfigGPRS.iNotifyPending &&
+ iNotifyConfigGPRS.iNotifyHandle == aTsyReqHandle)
+ {
+ iNotifyConfigGPRS.iNotifyPending=EFalse;
+ ReqCompleted(aTsyReqHandle,KErrCancel);
+ }
+ else if(iNotifyConfigR99.iNotifyPending &&
+ iNotifyConfigR99.iNotifyHandle == aTsyReqHandle)
+ {
+ iNotifyConfigR99.iNotifyPending=EFalse;
+ ReqCompleted(aTsyReqHandle,KErrCancel);
+ }
+ else if(iNotifyConfigR5.iNotifyPending &&
+ iNotifyConfigR5.iNotifyHandle == aTsyReqHandle)
+ {
+ iNotifyConfigR5.iNotifyPending=EFalse;
+ ReqCompleted(aTsyReqHandle,KErrCancel);
+ }
+
+ return KErrNone;
+ }
+
+TInt CSimPacketContext::AttemptDeactivateImmediately()
+/**
+* Called when client wishes to Detach when there is an active context.
+* This will deactivate the context immediately from the network.
+*
+* @return KErrNone if deactivated successfully.
+*/
+ {
+ if((iState==RPacketContext::EStatusActive) || (iState==RPacketContext::EStatusActivating))
+ {
+ iCurrentEvent=EContextEventDeactivate;
+ TInt ret = ChangeState(RPacketContext::EStatusDeactivating);
+ if(ret!=KErrNone)
+ return ret;
+ return ChangeState(RPacketContext::EStatusInactive);
+ }
+ return KErrNone;
+ }
+
+TInt CSimPacketContext::ReActivate(CSimPacketService* aPacketService, const TName& aContextName)
+/**
+* This method is called by the packet Service to Re-Initialise a Deleted context.
+* If the context is deleted then the client cannot retrieve any
+* infomation or use the context in any way.
+* In order for the client to use the context again, the client must
+* open an object by name passing
+* the name of this context as a pararemter.
+*
+* @param aPacketService pointer to the parent class CSimPacketService.
+* @param aContextName Must be the same name as the name for this context.
+* @return KErrNone if no problem in re-initialising this context.
+*/
+ {
+ if(iContextName.Compare(aContextName) != KErrNone)
+ {
+ return KErrBadName;
+ }
+
+ iPacketService = aPacketService;
+
+ if(iDeleted)
+ {
+
+ TInt ret = ChangeState(RPacketContext::EStatusInactive);
+ if (ret != KErrNone)
+ {
+ return ret;
+ }
+
+ iDeleted = EFalse;
+ iContextConfigParamsIndex = 0;
+ iNotifyStatusChange.iNotifyPending = EFalse;
+ iNotifyConfigGPRS.iNotifyPending = EFalse;
+ iNotifyConfigR99.iNotifyPending = EFalse;
+ iNotifyConfigR5.iNotifyPending = EFalse;
+
+ }
+ return KErrNone;
+ }
+
+TInt CSimPacketContext::DoDeactivate()
+/**
+* This method is called when timer events for deactivate context has completed.
+* It will then try to terminate the NTRas Connection.
+*
+* @return KErrNone
+*/
+ {
+ iNotifyContextConfigChangeTimer->Cancel();
+ iNtRas->Terminate();
+ return KErrNone;
+ }
+
+TInt CSimPacketContext::Deactivate(const TTsyReqHandle aTsyReqHandle)
+/**
+* Client calls this method to try to Deactivate an active context.
+* In this method, we'll store the TsyReqHandle for later completion then call ActionEvent
+* state machine to handle the event which will kick off a timer.
+* The Actual Deactivation will take place in the DoDeactivate method.
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @return KErrNone
+*/
+ {
+ LOGPACKET1("CSimPacketContext::Deactivate called");
+ iDeactivateRequestHandle = aTsyReqHandle;
+ TInt ret;
+ ret = ActionEvent(EContextEventDeactivate,KErrNone);
+ return ret;
+ }
+
+TInt CSimPacketContext::DeactivateCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+* Client calls this method to try and cancel a Deactivate request.
+* This will only complete successfully if and only if the Deactivate request has not completed.
+* i.e. if we haven't already deactivated the context.
+*
+* @param aTsyReqHandle Tsy Request handle for the client cancel request
+* @return KErrNone
+*/
+ {
+ LOGPACKET1("CSimPacketContext::DeactivateCancel called");
+ if(((iState == RPacketContext::EStatusInactive) || (iState == RPacketContext::EStatusDeactivating)) &&
+ (iCurrentEvent==EContextEventDeactivate))
+ {
+ iTimer->Cancel();
+ iCurrentEvent= EContextEventNone;
+ TInt ret = ChangeState(RPacketContext::EStatusActive);
+ if(ret!= KErrNone)
+ ReqCompleted(aTsyReqHandle,ret);
+ ReqCompleted(aTsyReqHandle,KErrCancel);
+ }
+
+ return KErrNone;
+ }
+
+TInt CSimPacketContext::DoActivate()
+/**
+* This method is called when timer events for Activate context has completed.
+* It will then try to Set up the NtRas Connection and open a port for client use.
+*
+* @return KErrNone
+*/
+ {
+ TCommConfigV01 commConfig;
+ TCommSetupItem item = FindCommSettings();
+
+ if (iPacketqos)
+ {
+ iPacketqos->ClearChangeQoSPending();
+ }
+ commConfig.iRate=item.iConfig.iRate;
+ commConfig.iDataBits=EData8;
+ commConfig.iStopBits=EStop1;
+ commConfig.iHandshake=item.iConfig.iHandshake;
+ iCommReset=item.iCommReset;
+ TInt ras = iNtRas->Connect(item.iCsyName,item.iPortName,commConfig,this);
+
+ TContextConfigParam thisConfig = iContextConfigParams->At(iContextConfigParamsIndex);
+
+ // Check for and complete any pending notifications
+ if(iNotifyConfigGPRS.iNotifyPending)
+ {
+ iNotifyConfigGPRS.iNotifyPending=EFalse;
+ CSimContextHelper::ConvertConfigParams(thisConfig, *(RPacketContext::TContextConfigGPRS*)iNotifyConfigGPRS.iNotifyData);
+ ReqCompleted(iNotifyConfigGPRS.iNotifyHandle,KErrNone);
+ }
+
+ if(iNotifyConfigR99.iNotifyPending)
+ {
+ iNotifyConfigR99.iNotifyPending=EFalse;
+ CSimContextHelper::ConvertConfigParams(thisConfig, *(RPacketContext::TContextConfigR99_R4*)iNotifyConfigR99.iNotifyData);
+ ReqCompleted(iNotifyConfigR99.iNotifyHandle,KErrNone);
+ }
+
+ if(iNotifyConfigR5.iNotifyPending)
+ {
+ iNotifyConfigR5.iNotifyPending=EFalse;
+ CSimContextHelper::ConvertConfigParams(thisConfig, *(RPacketContext::TContextConfig_R5*)iNotifyConfigR5.iNotifyData);
+ ReqCompleted(iNotifyConfigR5.iNotifyHandle,KErrNone);
+ }
+
+ // start the timer for the simulated network-side context parameter changes
+ if(iNotifyContextConfigChangeArray->Count() > 0)
+ {
+ TInt delay = (iNotifyContextConfigChangeArray->At(0)).iDelay;
+ iNotifyContextConfigChangeTimer->Start(delay,this,ETimerIdPcktContextConfigChange);
+ }
+
+ return ras;
+ }
+
+
+TInt CSimPacketContext::Activate(const TTsyReqHandle aTsyReqHandle)
+/**
+* Client calls this method to try to Activate a context.
+* In this method, we'll store the TsyReqHandle for later completion then call ActionEvent
+* state machine to handle the event which will kick off a timer.
+* The Actual Activation will take place in the DoActivate method.
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @return KErrNone
+*/
+ {
+ iActivateRequestHandle = aTsyReqHandle;
+ TInt ret;
+ ret = ActionEvent(EContextEventActivate,KErrNone);
+ return ret;
+ }
+
+
+TInt CSimPacketContext::ActivateCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+* Client calls this method to try and cancel an Activate request.
+* This will only complete successfully if and only if the Activate request has not completed.
+* i.e. if we haven't already activated the context.
+*
+* @param aTsyReqHandle Tsy Request handle for the client cancel request
+* @return KErrNone
+*/
+ {
+ LOGPACKET1("CSimPacketContext::ActivateCancel called");
+ if(((iState == RPacketContext::EStatusInactive) || (iState == RPacketContext::EStatusActivating)) &&
+ (iCurrentEvent==EContextEventActivate))
+ {
+ iTimer->Cancel();
+ iCurrentEvent= EContextEventNone;
+ TInt ret = ChangeState(RPacketContext::EStatusInactive);
+ if(ret!= KErrNone)
+ ReqCompleted(aTsyReqHandle,ret);
+ else
+ ReqCompleted(aTsyReqHandle,KErrCancel);
+ }
+ else if (iState == RPacketContext::EStatusDeleted)
+ {
+ ReqCompleted(aTsyReqHandle,KErrCancel);
+ }
+
+ return KErrNone;
+ }
+
+TInt CSimPacketContext::DoDelete()
+/**
+* This method is called when timer events for Delete context has completed.
+* It will then try to Terminate the NtRas Connection and then set the context as deleted.
+* Once the context is deleted then the client cannot retrieve any information about the context
+* or use the context. calling ReActivateContext will reinstate this context.
+*
+* @return KErrNone
+*/
+ {
+ iDeleted = ETrue;
+ iNtRas->Terminate();
+ iQoSObjectCount--;
+ return KErrNone;
+ }
+
+
+TInt CSimPacketContext::Delete(const TTsyReqHandle aTsyReqHandle)
+/**
+* Client calls this method to try to Delete this context.
+* In this method, we'll store the TsyReqHandle for later completion then call ActionEvent
+* state machine to handle the event which will kick off a timer.
+* The Actual Delete will take place in the DoDelete method.
+*
+* This request will only succeed if the context already exist (had been created) and also not
+* previously deleted.
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @return KErrNone
+*/
+ {
+ LOGPACKET1("CSimPacketContext::Delete called");
+ iDeleteRequestHandle = aTsyReqHandle;
+ TInt ret;
+ ret = ActionEvent(EContextEventDelete,KErrNone);
+ return ret;
+ }
+
+TInt CSimPacketContext::DeleteCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+* Client calls this method to try and cancel a Delete context request.
+* This will only complete successfully if and only if the Delete request has not completed.
+* i.e. if we haven't already Deleted the context.
+*
+* @param aTsyReqHandle Tsy Request handle for the client cancel request
+* @return KErrNone
+*/
+ {
+ LOGPACKET1("CSimPacketContext::DeleteCancel called");
+ if((iState == RPacketContext::EStatusInactive) && (iCurrentEvent==EContextEventDelete))
+ {
+ iTimer->Cancel();
+ iCurrentEvent= EContextEventNone;
+ ReqCompleted(aTsyReqHandle,KErrCancel);
+ }
+ return KErrNone;
+ }
+
+TInt CSimPacketContext::LoanCommPort(const TTsyReqHandle aTsyReqHandle,RCall::TCommPort* aDataPort)
+/**
+* The method will return to the client the port it has opened previously in the Activate method
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @param aDataPort Pointer to the port and csy name for the opened port.
+* @return KErrNone
+*/
+ {
+ LOGPACKET1("CSimPacketContext::LoanCommPort called");
+
+ if(iState != RPacketContext::EStatusActive)
+ {
+ ReqCompleted(aTsyReqHandle, KErrEtelCallNotActive);
+ return KErrNone;
+ }
+ if (iCommPortLoaned)
+ {
+ ReqCompleted(aTsyReqHandle, KErrEtelPortAlreadyLoaned);
+ return KErrNone;
+ }
+
+ TCommSetupItem item = FindCommSettings();
+ aDataPort->iCsy.Copy(item.iCsyName);
+ aDataPort->iPort.Copy(item.iPortName);
+ iCommPortLoaned = ETrue;
+ ReqCompleted(aTsyReqHandle,KErrNone);
+
+ return KErrNone;
+ }
+
+TInt CSimPacketContext::LoanCommPortCancel(const TTsyReqHandle /*aTsyReqHandle*/)
+/**
+* Cancels a client loan port request. This method will do nothing.
+*
+* @param aTsyReqHandle Tsy Request handle for the client cancel request
+* @return KErrNone
+*/
+ {
+ LOGPACKET1("CSimPacketContext::LoanCommPortCancel called");
+ return KErrNone;
+ }
+
+TInt CSimPacketContext::RecoverCommPort(const TTsyReqHandle aTsyReqHandle)
+/**
+* In this method we'll try and terminate the NtRas connection and reover the port.
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @return KErrNone
+*/
+ {
+ LOGPACKET1("CSimPacketContext::RecoverCommPort called");
+ if (!iCommPortLoaned)
+ {
+ ReqCompleted(aTsyReqHandle, KErrEtelPortNotLoanedToClient);
+ return KErrNone;
+ }
+ iNtRas->Terminate();
+ iCommPortLoaned = EFalse;
+ ReqCompleted(aTsyReqHandle,KErrNone);
+ return KErrNone;
+ }
+
+TInt CSimPacketContext::RecoverCommPortCancel(const TTsyReqHandle /*aTsyReqHandle*/)
+/**
+* Attempt to cancel a RecoverCommPort request. This method does nothing
+*
+* @param aTsyReqHandle Tsy Request handle for the client cancel request
+* @return KErrNone
+*/
+ {
+ LOGPACKET1("CSimPacketContext::RecoverCommPortCancel called");
+ return KErrNone;
+ }
+
+TInt CSimPacketContext::GetStatus(const TTsyReqHandle aTsyReqHandle,RPacketContext::TContextStatus* aContextStatus)
+/**
+* Retrieves and returns the current status of the Packet context in the aContextStatus parameter.
+*
+* @param aTsyReqHandle Tsy Request handle for the client cancel request
+* @param aContextStatus pointer to the status of the packet context.
+* @return KerrNone
+*/
+ {
+ LOGPACKET1("CSimPacketContext::GetStatus called");
+ *aContextStatus = iState;
+ ReqCompleted(aTsyReqHandle,KErrNone);
+ return KErrNone;
+ }
+
+TInt CSimPacketContext::NotifyStatusChange(const TTsyReqHandle aTsyReqHandle,RPacketContext::TContextStatus* aContextStatus)
+/**
+* Record a client's interest in being notified of the state of the packet 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 aContextStatus pointer to the packet context status
+* @return KErrNone
+*/
+ {
+ LOGPACKET1("CSimPacketContext::NotifyStatusChange called");
+ __ASSERT_ALWAYS(!iNotifyStatusChange.iNotifyPending,SimPanic(ENotificationAlreadyPending));
+ iNotifyStatusChange.iNotifyPending = ETrue;
+ iNotifyStatusChange.iNotifyHandle = aTsyReqHandle;
+ iNotifyStatusChange.iNotifyData = aContextStatus;
+ return KErrNone;
+ }
+
+
+
+TInt CSimPacketContext::NotifyStatusChangeCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+* Cancel a client's interest in being notified when the packet context 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("CSimPacketContext::NotifyStatusChangeCancel called");
+ if(iNotifyStatusChange.iNotifyPending)
+ {
+ iNotifyStatusChange.iNotifyPending=EFalse;
+ ReqCompleted(aTsyReqHandle,KErrCancel);
+ }
+ return KErrNone;
+ }
+
+TInt CSimPacketContext::GetDataVolumeTransferred(const TTsyReqHandle aTsyReqHandle,RPacketContext::TDataVolume* /*aVolume*/)
+/**
+* Retrieves and returns the to the client the amount of data sent over the serial port.
+* This method is not supported and will request complete with KErrNotSupported
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @param aVolume pointer to the volume of data trasferred so far.
+* @return KErrNone
+*/
+ {
+ LOGPACKET1("CSimPacketContext::GetDataVolumeTransferred called");
+ ReqCompleted(aTsyReqHandle,KErrNotSupported);
+ return KErrNone;
+ }
+
+TInt CSimPacketContext::NotifyDataTransferred(const TTsyReqHandle aTsyReqHandle, RPacketContext::TDataVolume* /*aVolume*/, RPacketContext::TNotifyDataTransferredRequest* /*aData*/)
+/**
+* Notifies the client when data is sent or received over the comm port
+* This method is not supported in this version of the TSY.
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @param aVolume pointer to the volume of data trasferred so far.
+* @param aData indicates to the client whether the data was sent or received.
+* @return KErrNone
+*/
+ {
+ ReqCompleted(aTsyReqHandle,KErrNotSupported);
+ return KErrNone;
+ }
+
+TInt CSimPacketContext::NotifyDataTransferredCancel(const TTsyReqHandle /*aTsyReqHandle*/)
+/**
+* Cancels the NotifyDataTransferred request
+*
+* @param aTsyReqHandle Tsy Request handle for the client cancel request
+* @return KerrNone
+*/
+ {
+ LOGPACKET1("CSimPacketContext::NotifyDataTransferredCancel called");
+ return KErrNone;
+ }
+
+TInt CSimPacketContext::GetLastErrorCause(const TTsyReqHandle aTsyReqHandle, TInt* aError)
+/**
+* This method is not supported in this TSY
+*
+* @param aTsyReqHandle Tsy Request handle for the client request
+* @param aError pointer to the last error cause
+* @return KerrNone
+*/
+ {
+ LOGPACKET1("CSimPacketContext::GetLastErrorCause called");
+ *aError = iLastError;
+ ReqCompleted(aTsyReqHandle,iErrorCodeForGetLastErrorCause);
+ iErrorCodeForGetLastErrorCause = KErrNone;
+ return KErrNone;
+ }
+
+void CSimPacketContext::TimerCallBack(TInt aId)
+/**
+* Timer callback function. When the timer goes off, it will call back into this
+* function for further processing.
+*/
+ {
+ TInt newIndex = KErrNotFound;
+
+ switch(aId)
+ {
+ case ETimerIdPcktContextStatusChange:
+ TimerCallBackNotifyContextStatusChange();
+ break;
+ case ETimerIdPcktContextSetConfig:
+ SetConfig(iSetConfigData->At(0).iTsyReqHandle, iSetConfigData->At(0).iData);
+ iSetConfigData->Delete(0);
+ if (iSetConfigData->Count() != 0)
+ iSetConfigTimer->Start(iSetConfigDelay,this,ETimerIdPcktContextSetConfig);
+ break;
+ case ETimerIdPcktContextConfigChange:
+ //Check the validity of the new context config param index before applying it
+ newIndex = (iNotifyContextConfigChangeArray->At(0)).iNewContextConfigIndex;
+ if(newIndex <= iContextConfigParams->Count() - 1)
+ {
+ //Change the context config param index to point to the new context configuration
+ iContextConfigParamsIndex = newIndex;
+
+ // Check for and complete any pending notifications
+ if(iNotifyConfigGPRS.iNotifyPending)
+ {
+ iNotifyConfigGPRS.iNotifyPending=EFalse;
+ CSimContextHelper::ConvertConfigParams(iContextConfigParams->At(iContextConfigParamsIndex),
+ *(RPacketContext::TContextConfigGPRS*)iNotifyConfigGPRS.iNotifyData);
+ ReqCompleted(iNotifyConfigGPRS.iNotifyHandle,KErrNone);
+ }
+
+ if(iNotifyConfigR99.iNotifyPending)
+ {
+ iNotifyConfigR99.iNotifyPending=EFalse;
+ CSimContextHelper::ConvertConfigParams(iContextConfigParams->At(iContextConfigParamsIndex),
+ *(RPacketContext::TContextConfigR99_R4*)iNotifyConfigR99.iNotifyData);
+ ReqCompleted(iNotifyConfigR99.iNotifyHandle,KErrNone);
+ }
+
+ if(iNotifyConfigR5.iNotifyPending)
+ {
+ iNotifyConfigR5.iNotifyPending=EFalse;
+ CSimContextHelper::ConvertConfigParams(iContextConfigParams->At(iContextConfigParamsIndex),
+ *(RPacketContext::TContextConfig_R5*)iNotifyConfigR5.iNotifyData);
+ ReqCompleted(iNotifyConfigR5.iNotifyHandle,KErrNone);
+ }
+ }
+
+ else
+ {
+ LOGMISC1(">>CSimPacketContext.cpp: Invalid new context config param index");
+ }
+
+ //Delete the current NotifyContextConfigChange item and set the next one if possible
+ iNotifyContextConfigChangeArray->Delete(0);
+
+ if(iNotifyContextConfigChangeArray->Count() > 0)
+ {
+ TInt delay = (iNotifyContextConfigChangeArray->At(0)).iDelay;
+ iNotifyContextConfigChangeTimer->Start(delay,this, ETimerIdPcktContextConfigChange);
+ }
+ break;
+
+ case ETimerIdPcktContextInitContext:
+ DoInitialiseContext();
+ break;
+ case ETimerIdPcktContextCreateTft:
+ DoCreateNewTFT();
+ break;
+ default:
+ {
+ LOGPACKET1(">>CSimPacketContext::TimerCallBack");
+ TInt ret=ActionEvent(EContextEventTimeOut,KErrNone);
+ __ASSERT_ALWAYS(ret==KErrNone,SimPanic(ETimeOutEventActionFailed)); // Note: this is very crude error handling and should be replaced by something rather more elegant.
+ LOGPACKET1("<<CSimPacketContext::TimerCallBack");
+ iTFTChangeBool = EFalse;
+ break;
+ }
+ }
+ }
+
+void CSimPacketContext::PubSubCallback(TInt aIndex)
+ {
+ TInt length = iNotifyContextStatusChangeArray->Count();
+ if (aIndex < length)
+ {
+ TNotifyContextStatusChange& statusChange = iNotifyContextStatusChangeArray->At(aIndex);
+ if (statusChange.iContextName.Compare(iContextName) == 0)
+ {
+ CompleteContextStatusChange(statusChange.iStatus);
+ }
+ }
+ }
+
+/**
+* This is for the NotifyContextStatusChange timer callback
+*/
+void CSimPacketContext::TimerCallBackNotifyContextStatusChange()
+ {
+ if(GetContextStatusChangeCount() <= iNotifyContextStatusChangeIndex)
+ {
+ // the index is out of bounds
+ return;
+ }
+ TNotifyContextStatusChange& statusChange = GetContextStatusChangeAt(iNotifyContextStatusChangeIndex);
+
+ CompleteContextStatusChange(statusChange.iStatus);
+
+ iNotifyContextStatusChangeIndex++;
+ if (GetContextStatusChangeCount() > iNotifyContextStatusChangeIndex)
+ {
+ // start timer again
+ iNotifyContextStatusChangeTimer->Start(GetContextStatusChangeAt(iNotifyContextStatusChangeIndex).iDuration,this,ETimerIdPcktContextStatusChange);
+ }
+ }
+
+void CSimPacketContext::CompleteContextStatusChange(RPacketContext::TContextStatus& aStatus)
+ {
+ iCurrentNotifyContextStatusChange = aStatus;
+
+ ChangeState(iCurrentNotifyContextStatusChange);
+ if (RPacketContext::EStatusDeleted == iCurrentNotifyContextStatusChange)
+ {
+ DoDelete();
+ }
+ }
+
+void CSimPacketContext::NTRasCallBack(TInt aStatus)
+/**
+ * NTRas callback function. This function will be called when the NTRAS
+ * Server has responded.
+ *
+ * @param aStatus Standard error value, indicating the success or failure of the NTRAS
+ * connection.
+ */
+ {
+ __ASSERT_ALWAYS(ActionEvent(EContextEventNtRas,aStatus) == KErrNone,SimPanic(EGeneral));
+ if(iCommReset)
+ iNtRas->Terminate();
+ }
+
+RPacketService::TStatus CSimPacketContext::ConvertToPacketServiceStatus(RPacketContext::TContextStatus aNewState)
+/**
+* Converts Packet Context Status (RPacketContext::TContextStatus) to
+* Packet Service Status (RPacketService::TStatus)
+*
+* @param aNewState the Context status to convert to packet service status
+* @return RPacketService::TStatus The packet service status conversion
+*/
+ {
+ RPacketService::TStatus serviceStatus;
+ switch (aNewState)
+ {
+ case RPacketContext::EStatusInactive:
+ case RPacketContext::EStatusActivating:
+ case RPacketContext::EStatusDeleted:
+ serviceStatus = RPacketService::EStatusAttached;
+ break;
+ case RPacketContext::EStatusActive:
+ case RPacketContext::EStatusDeactivating:
+ serviceStatus = RPacketService::EStatusActive;
+ break;
+ case RPacketContext::EStatusSuspended:
+ serviceStatus = RPacketService::EStatusSuspended;
+ break;
+ default:
+ serviceStatus = RPacketService::EStatusUnattached;
+ break;
+ }
+ return serviceStatus;
+ }
+
+
+TInt CSimPacketContext::ChangeState(RPacketContext::TContextStatus 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 aNewState the new state to change to
+* @return Error indication if change of state is successful or not
+*/
+ {
+ LOGPACKET2(">>CSimPacketContext::ChangeState [newState=%d]", aNewState);
+ __ASSERT_ALWAYS(aNewState!=RPacketContext::EStatusUnknown,SimPanic(ECallStatusUnknownIllegal));
+
+ if(iState==aNewState)
+ return KErrNone;
+
+ TInt ret=KErrGeneral;
+ const struct TContextStateChangeValidity* stateChangePnt=KContextStateChangeValidity;
+ while(stateChangePnt->iOldState!=KContextStateTableTerminator)
+ {
+ 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 = iPacketService->ChangeState(ConvertToPacketServiceStatus(aNewState));
+ if(ret!=KErrNone)
+ return ret;
+
+// Actually change the state.
+ iState=aNewState;
+
+// Check for a pending line state notification.
+ if(iNotifyStatusChange.iNotifyPending)
+ {
+ iNotifyStatusChange.iNotifyPending=EFalse;
+ *(RPacketContext::TContextStatus*)iNotifyStatusChange.iNotifyData=iState;
+ ReqCompleted(iNotifyStatusChange.iNotifyHandle,KErrNone);
+ }
+
+
+ LOGPACKET1("<<CSimPacketContext::ChangeState");
+ return KErrNone;
+ }
+
+TInt CSimPacketContext::ActionEvent(TContextEvent aEvent,TInt aStatus)
+/**
+* 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 Context.
+*
+* @param aEvent The Packet Context event to handle
+* @return value represents the error state caused by the attempted state machine jump.
+*/
+ {
+ TInt ret=KErrNone;
+ __ASSERT_ALWAYS(iState!=RPacketContext::EStatusUnknown,SimPanic(ECallStatusUnknownIllegal));
+
+ TBool found = EFalse;
+ TInt i = 0;
+ TInt count = iContextConfigsRel99->Count();
+ for(i = 0; i<count; i++)
+ {
+ if(iContextName.Compare(iContextConfigsRel99->At(i).iContextName)==0)
+ {
+ found = ETrue;
+ break;
+ }
+ }
+
+ switch(aEvent)
+ {
+ case EContextEventActivate:
+ LOGPACKET1(">>CSimPacketContext::ActionEvent = [EContextEventActivate]");
+ if(iState==RPacketContext::EStatusInactive)
+ {
+ iCurrentEvent=EContextEventActivate;
+ ret = ChangeState(RPacketContext::EStatusActivating);
+ if(ret!=KErrNone)
+ ReqCompleted(iActivateRequestHandle,ret);
+ else
+ {
+ if(!found)
+ iTimer->Start(iActivatePause,this);
+ else
+ iTimer->Start(iContextConfigsRel99->At(i).iActivatePause,this);
+ }
+ }
+ else
+ ReqCompleted(iActivateRequestHandle, KErrGprsActivationRejected);
+ break;
+
+ case EContextEventDeactivate:
+ LOGPACKET1(">>CSimPacketContext::ActionEvent = [EContextEventDeactivate]");
+ if(iState==RPacketContext::EStatusActive)
+ {
+ iCurrentEvent=EContextEventDeactivate;
+ ret = ChangeState(RPacketContext::EStatusDeactivating);
+ if(ret!=KErrNone)
+ ReqCompleted(iDeactivateRequestHandle,ret);
+ else
+ {
+ if (!found)
+ iTimer->Start(iDeactivatePause,this);
+ else
+ iTimer->Start(iContextConfigsRel99->At(i).iDeactivatePause,this);
+ }
+ }
+ else
+ ReqCompleted(iDeactivateRequestHandle, KErrNone);
+ break;
+
+ case EContextEventDelete:
+ LOGPACKET1(">>CSimPacketContext::ActionEvent = [EContextEventDelete]");
+ if(iState==RPacketContext::EStatusInactive)
+ {
+ iCurrentEvent=EContextEventDelete;
+
+ if (!found)
+ iTimer->Start(iDeletePause,this);
+ else
+ iTimer->Start(iContextConfigsRel99->At(i).iDeletionPause,this);
+ }
+ else
+ ReqCompleted(iDeleteRequestHandle, KErrInUse);
+ break;
+
+ case EContextEventNtRas:
+ if((iState==RPacketContext::EStatusActivating) && (iCurrentEvent==EContextEventNtRas))
+ {
+ if(aStatus!=KErrNone)
+ {
+ ReqCompleted(iActivateRequestHandle,aStatus);
+ ret=ChangeState(RPacketContext::EStatusInactive);
+ __ASSERT_ALWAYS(ret==KErrNone,SimPanic(EIllegalStateInconsistancy));
+ return KErrNone;
+ }
+ else
+ {
+ ret=ChangeState(RPacketContext::EStatusActive);
+ ReqCompleted(iActivateRequestHandle,ret);
+ iIsActive = ETrue;
+ return KErrNone;
+ }
+ }
+ iCurrentEvent=EContextEventNone;
+ break;
+
+ case EContextEventTimeOut:
+ LOGPACKET1(">>CSimPacketContext::ActionEvent = [EContextEventTimeOut]");
+ switch(iCurrentEvent)
+ {
+ case EContextEventNone:
+ break;
+ case EContextEventActivate:
+ if(iState==RPacketContext::EStatusActivating)
+ {
+ TInt activateValue;
+ if (found)
+ activateValue = iContextConfigsRel99->At(i).iActivateErrorCode;
+ else
+ activateValue = iActivateFail;
+ if(activateValue == KContextGoToInactiveWithErrorWhenTryingToGetLastErrorCode)
+ {
+ //this will allow context activation move to the next state but with context being inactive
+ ret=ChangeState(RPacketContext::EStatusInactive);
+ iCurrentEvent=EContextEventNone;
+ iLastError = activateValue;
+ iErrorCodeForGetLastErrorCause=KErrGeneral;
+
+ iContextConfigsRel99->At(i).iActivateErrorCode = iLastError;
+ ReqCompleted(iActivateRequestHandle, KErrNone);
+
+ break;
+ }
+ if(activateValue <= KContextGoToInactiveWithExtendedErrorCode && activateValue > KContextGoToInactiveWithNormalErrorCode)
+ {
+ //this will allow context activation move to the next state but with context being inactive
+ //tsy extended error case
+ ret=ChangeState(RPacketContext::EStatusInactive);
+ iCurrentEvent=EContextEventNone;
+ iLastError = activateValue - KContextGoToInactiveWithExtendedErrorCode;
+ //move the error code to the higher 16 bit.
+ iLastError<<=16;
+
+ iContextConfigsRel99->At(i).iActivateErrorCode = iLastError;
+ ReqCompleted(iActivateRequestHandle, KErrNone);
+
+ break;
+ }
+ if(activateValue <= KContextGoToInactiveWithNormalErrorCode && activateValue > KLimitForErrorCodeForContextGoToInactive)
+ {
+ //this will allow context activation move to the next state but with context being inactive
+ //normal error case
+ ret=ChangeState(RPacketContext::EStatusInactive);
+ iCurrentEvent=EContextEventNone;
+ iLastError = activateValue - KContextGoToInactiveWithNormalErrorCode;
+
+ iContextConfigsRel99->At(i).iActivateErrorCode = iLastError;
+ ReqCompleted(iActivateRequestHandle, KErrNone);
+
+ break;
+ }
+ else
+ if(activateValue != KErrNone)
+ {
+ ReqCompleted(iActivateRequestHandle,activateValue);
+ ret=ChangeState(RPacketContext::EStatusInactive);
+ iCurrentEvent=EContextEventNone;
+ activateValue = KErrNone;
+
+ if (found)
+ iContextConfigsRel99->At(i).iActivateErrorCode = activateValue;
+ else
+ iActivateFail = activateValue;
+ break;
+ }
+ else
+ {
+ if (found)
+ {
+ if (iContextConfigsRel99->At(i).iConnectToNtRas)
+ {
+ ret = DoActivate();
+ if (ret == KErrNone)
+ iCurrentEvent=EContextEventNtRas;
+ else
+ iCurrentEvent=EContextEventNone;
+ }
+ else
+ {
+ iCurrentEvent=EContextEventNone;
+ ReqCompleted(iActivateRequestHandle,activateValue);
+ ret=ChangeState(RPacketContext::EStatusActive);
+ iIsActive = ETrue;
+ }
+ }
+ else
+ {
+ ret = DoActivate();
+ if (ret == KErrNone)
+ iCurrentEvent=EContextEventNtRas;
+ else
+ iCurrentEvent=EContextEventNone;
+ }
+ }
+ }
+ break;
+ case EContextEventDeactivate:
+ TInt deActivateValue;
+ if (found)
+ deActivateValue = iContextConfigsRel99->At(i).iDeactivateErrorCode;
+ else
+ deActivateValue = iDeactivateFail;
+
+ if(iState==RPacketContext::EStatusDeactivating)
+ {
+ if(deActivateValue != KErrNone)
+ {
+ ReqCompleted(iDeactivateRequestHandle,deActivateValue);
+ ret=ChangeState(RPacketContext::EStatusActive);
+ deActivateValue = KErrNone;
+
+ if (found)
+ iContextConfigsRel99->At(i).iDeactivateErrorCode = deActivateValue;
+ else
+ iDeactivateFail = deActivateValue;
+ break;
+ }
+ else {
+ ret=ChangeState(RPacketContext::EStatusInactive);
+ if(ret==KErrNone)
+ {
+ ret = DoDeactivate();
+ if(ret==KErrNone)
+ {
+ ReqCompleted(iDeactivateRequestHandle,deActivateValue);
+ iIsActive=EFalse;
+ }
+ else
+ ReqCompleted(iDeactivateRequestHandle,ret);
+ }
+ else
+ ReqCompleted(iDeactivateRequestHandle,ret);
+ }
+ }
+ iCurrentEvent=EContextEventNone;
+ break;
+ case EContextEventDelete:
+ TInt deleteValue;
+ if (found)
+ deleteValue = iContextConfigsRel99->At(i).iDeletionErrorCode;
+ else
+ deleteValue = iDeleteFail;
+
+ if(iState==RPacketContext::EStatusInactive)
+ {
+ if(deleteValue != KErrNone)
+ {
+ ReqCompleted(iDeleteRequestHandle,deleteValue);
+ deleteValue = KErrNone;
+ if (found)
+ iContextConfigsRel99->At(i).iDeletionErrorCode = deleteValue;
+ else
+ iDeleteFail = deleteValue;
+ break;
+ }
+ else {
+ ret=ChangeState(RPacketContext::EStatusDeleted);
+ if(ret==KErrNone)
+ {
+ ret = DoDelete();
+ if(ret==KErrNone)
+ ReqCompleted(iDeleteRequestHandle,deleteValue);
+ else
+ ReqCompleted(iDeleteRequestHandle,ret);
+ }
+ else
+ ReqCompleted(iDeleteRequestHandle,ret);
+ }
+ }
+ iCurrentEvent=EContextEventNone;
+ break;
+ default: //in case of EContextEventTimeOut
+ break;
+ }
+ break;
+
+ default:
+ break;
+ }
+ return ret;
+ }
+
+const CTestConfigSection* CSimPacketContext::CfgFile()
+/**
+* Return a pointer to the Configuration File Section
+*
+* @return CTestConfigSection pointer to the configuration file section
+*/
+ {
+ return iPacketService->CfgFile();
+ }
+
+TInt CSimPacketContext::ModifyActiveContext(const TTsyReqHandle aTsyReqHandle)
+ {
+ if (iState==RPacketContext::EStatusInactive)
+ {
+ ReqCompleted(aTsyReqHandle, KErrNotReady);
+ return KErrNone;
+ }
+
+ // check if QoS profile has changed or TFTs have changed
+ if (iPacketqos != NULL)
+ {
+ if (iPacketqos->PerformProfileChange() == KErrNone || iTFTChangeBool)
+ {
+ iTFTChangeBool = EFalse;
+ ReqCompleted(aTsyReqHandle, KErrNone);
+ return KErrNone;
+ }
+ else
+ {
+ ReqCompleted(aTsyReqHandle, KErrNotReady);
+ return KErrNone;
+ }
+ }
+ else if (iTFTChangeBool)
+ {
+ iTFTChangeBool = EFalse;
+ ReqCompleted(aTsyReqHandle, KErrNone);
+ return KErrNone;
+ }
+ else
+ {
+ ReqCompleted(aTsyReqHandle, KErrNotReady);
+ return KErrNone;
+ }
+ }
+
+/**
+* This function enumerates the number of packet filters
+*/
+TInt CSimPacketContext::EnumeratePacketFilters(const TTsyReqHandle aTsyReqHandle, TInt& aCount)
+ {
+ aCount = iNumFiltersAdded;
+ ReqCompleted(aTsyReqHandle, KErrNone);
+ return KErrNone;
+ }
+
+/**
+* This function returns info regarding the packet filter specified by the index passed -
+* used in conjunction with EnumeratePacketFilters()
+*/
+TInt CSimPacketContext::GetPacketFilterInfoL(const TTsyReqHandle aTsyReqHandle, TInt aIndex, TDes8* aPacketFilterInfo)
+ {
+ // if index is invalid, return error code
+ if (aIndex < 0 || aIndex > (iNumFiltersAdded -1))
+ {
+ ReqCompleted(aTsyReqHandle, KErrArgument);
+ return KErrNone;
+ }
+ else
+ {
+ TInt ii;
+ TInt addedFilterCount = -1;
+
+ //find the requested filter
+ for(ii = 0; ii < iPacketFilterInfoArray->Count(); ii++)
+ {
+ if(iPacketFilterInfoArray->At(ii).iAdded)
+ {
+ addedFilterCount++;
+
+ //when the filter is found write the data to the client
+ if(addedFilterCount == aIndex)
+ {
+ TPacketFilterV3 theFilter = iPacketFilterInfoArray->At(ii);
+
+ // Check that the data structure is supported by the simulated TSY version
+ TInt err = KErrNone;
+ if(iPhone->iSimTsyVersion < 3) // same version as TPacketFilterVx
+ {
+ (void)User::Leave(KErrNotSupported);
+ }
+
+ RPacketContext::TPacketFilterV2Pckg* clientFilterPckg =
+ (RPacketContext::TPacketFilterV2Pckg*)aPacketFilterInfo;
+ RPacketContext::TPacketFilterV2& clientFilter = (*clientFilterPckg)();
+
+ // Check that the data structure is supported by the simulated TSY version
+ err = iPhone->CheckSimTsyVersion(clientFilter);
+ if(err != KErrNone)
+ {
+ iPhone->ReqCompleted(aTsyReqHandle, err);
+ return KErrNone;
+ }
+
+ if(clientFilter.ExtensionId()==KETelExtPcktV2)
+ {
+ clientFilter.iDestPortMax = theFilter.iDestPortMax;
+ clientFilter.iDestPortMin = theFilter.iDestPortMin;
+ clientFilter.iEvaluationPrecedenceIndex = theFilter.iEvaluationPrecedenceIndex;
+ clientFilter.iFlowLabel = theFilter.iFlowLabel;
+ clientFilter.iId = theFilter.iId;
+ clientFilter.iIPSecSPI = theFilter.iIPSecSPI;
+ clientFilter.iProtocolNumberOrNextHeader = theFilter.iProtocolNumberOrNextHeader;
+ clientFilter.iSrcPortMax = theFilter.iSrcPortMax;
+ clientFilter.iSrcPortMin = theFilter.iSrcPortMin;
+ clientFilter.iTOSorTrafficClass = theFilter.iTOSorTrafficClass;
+
+ TInt xx;
+ for(xx = 0; xx<RPacketContext::KIPAddressSize; xx++)
+ {
+ clientFilter.iSrcAddr[xx] = theFilter.iSrcAddr[xx];
+ clientFilter.iSrcAddrSubnetMask[xx] = theFilter.iSrcAddrSubnetMask[xx];
+ }
+ ReqCompleted(aTsyReqHandle, KErrNone);
+ return KErrNone;
+ }
+ else if((clientFilter.ExtensionId()==KETelExtPcktV3) &&
+ theFilter.iFilterType != RPacketContext::EPacketFilterTypeUnknown)
+ {
+ RPacketContext::TPacketFilterV3Pckg* clientFilterV3Pckg =
+ (RPacketContext::TPacketFilterV3Pckg*)aPacketFilterInfo;
+ RPacketContext::TPacketFilterV3& clientFilterV3 = (*clientFilterV3Pckg)();
+
+ // Check that the data structure is supported by the simulated TSY version
+ TInt err = iPhone->CheckSimTsyVersion(clientFilterV3);
+ if(err != KErrNone)
+ {
+ iPhone->ReqCompleted(aTsyReqHandle, err);
+ return KErrNone;
+ }
+
+ RPacketContext::TPacketFilterV3 filterV3(theFilter.iFilterType);
+
+ // Check that the data structure is supported by the simulated TSY version
+ err = iPhone->CheckSimTsyVersion(filterV3);
+ if(err != KErrNone)
+ {
+ iPhone->ReqCompleted(aTsyReqHandle, err);
+ return KErrNone;
+ }
+
+ filterV3.iId = theFilter.iId;
+ filterV3.iEvaluationPrecedenceIndex = theFilter.iEvaluationPrecedenceIndex;
+ filterV3.SetTOSorTrafficClass(theFilter.iTOSorTrafficClass);
+
+ TInt yy;
+ for(yy = 0; yy<RPacketContext::KIPAddressSize; yy++)
+ {
+ filterV3.SetSrcAddr(theFilter.iSrcAddr);
+ filterV3.SetSrcAddrSubnetMask(theFilter.iSrcAddrSubnetMask);
+ }
+ if((theFilter.iFilterType == RPacketContext::EPacketFilterTypeOne) ||
+ (theFilter.iFilterType == RPacketContext::EPacketFilterTypeTwo))
+ {
+ filterV3.SetProtocolNumberOrNextHeader(theFilter.iProtocolNumberOrNextHeader);
+ }
+
+ if(theFilter.iFilterType == RPacketContext::EPacketFilterTypeOne)
+ {
+ filterV3.SetDestPortMin(theFilter.iDestPortMin);
+ filterV3.SetDestPortMax(theFilter.iDestPortMax);
+ filterV3.SetSrcPortMin(theFilter.iSrcPortMin);
+ filterV3.SetSrcPortMax(theFilter.iSrcPortMax);
+ }
+
+ if((theFilter.iFilterType == RPacketContext::EPacketFilterTypeTwo))
+ {
+ filterV3.SetSPI(theFilter.iIPSecSPI);
+ }
+
+ if((theFilter.iFilterType == RPacketContext::EPacketFilterTypeThree))
+ {
+ filterV3.SetFlowLabel(theFilter.iFlowLabel);
+ }
+
+ clientFilterV3 = filterV3;
+ ReqCompleted(aTsyReqHandle, KErrNone);
+ return KErrNone;
+ }
+ else
+ {
+ //cannot convert a filterV2 in the TSY to the filterV3 data typed passed in by client
+ ReqCompleted(aTsyReqHandle, KErrCorrupt);
+ return KErrNone;
+ }
+ }//end if(addedFilterCount == aIndex)
+ }//end if(iPacketFilterInfoArray->At(ii).iAdded)
+ else
+ {
+ continue;
+ }
+
+ }//end for loop
+ //filter was not found
+ ReqCompleted(aTsyReqHandle, KErrCorrupt);
+ return KErrNone;
+ }//end else
+ }
+
+/**
+* Create TFT
+*/
+TInt CSimPacketContext::CreateNewTFT(const TTsyReqHandle aTsyReqHandle, const TInt* aSize)
+ {
+ if (iCreateTftConfig.iNumberOfFailures > 0)
+ {
+ iCreateTftConfig.iNumberOfFailures--;
+ ReqCompleted(aTsyReqHandle, iCreateTftConfig.iFailErrorCode);
+ return KErrNone;
+ }
+ iCreateTftTimer->Start(iCreateTftConfig.iDelay, this, ETimerIdPcktContextCreateTft);
+ iCreateTftData.iTsyReqHandle = aTsyReqHandle;
+ iCreateTftData.iSize = *aSize;
+ return KErrNone;
+ }
+
+TInt CSimPacketContext::DoCreateNewTFT()
+ {
+ iTFTCreated = ETrue;
+ iNumTFTsCreated = iCreateTftData.iSize;
+ iTFTChangeBool = ETrue;
+ for (TInt i = 0; i < iPacketFilterInfoArray->Count(); i++)
+ {
+ iPacketFilterInfoArray->At(i).iAdded = EFalse;
+ }
+ iNumFiltersAdded = 0;
+ ReqCompleted(iCreateTftData.iTsyReqHandle, KErrNone);
+ return KErrNone;
+ }
+
+/**
+* Delete TFT
+*/
+TInt CSimPacketContext::DeleteTFT(const TTsyReqHandle aTsyReqHandle)
+ {
+ if (iDeleteTftFail.iNumberOfTimes > 0)
+ {
+ iDeleteTftFail.iNumberOfTimes--;
+ ReqCompleted(aTsyReqHandle, iDeleteTftFail.iFailErrorCode);
+ return KErrNone;
+ }
+ iTFTCreated = EFalse;
+ iNumTFTsCreated = -1;
+ iTFTChangeBool = ETrue;
+ for (TInt i = 0; i < iPacketFilterInfoArray->Count(); i++)
+ {
+ iPacketFilterInfoArray->At(i).iAdded = EFalse;
+ }
+ iNumFiltersAdded = 0;
+ ReqCompleted(aTsyReqHandle, KErrNone);
+ return KErrNone;
+ }
+
+/**
+* This method adds the packet filter to the array if it is not already there
+*/
+TInt CSimPacketContext::AddPacketFilter(const TTsyReqHandle aTsyReqHandle, const TDesC8* aPacketFilterInfo)
+ {
+ if (iAddPacketFilter.iNumberOfTimes > 0)
+ {
+ iAddPacketFilter.iNumberOfTimes--;
+ ReqCompleted(aTsyReqHandle, iAddPacketFilter.iFailErrorCode);
+ return KErrNone;
+ }
+
+ TPckg<RPacketContext::TPacketFilterV2>* packetFilter = (TPckg<RPacketContext::TPacketFilterV2>*)aPacketFilterInfo;
+ RPacketContext::TPacketFilterV2& packetFilterBase = (*packetFilter)();
+
+ // Check that the data structure is supported by the simulated TSY version
+ TInt err = iPhone->CheckSimTsyVersion(packetFilterBase);
+ if(err != KErrNone)
+ {
+ iPhone->ReqCompleted(aTsyReqHandle, err);
+ return KErrNone;
+ }
+
+ TBool found = EFalse;
+
+ TInt ii;
+ for(ii = 0; ii<iPacketFilterInfoArray->Count(); ii++)
+ {
+ TPacketFilterV3& configFilter = iPacketFilterInfoArray->At(ii);
+ const TInt KReservedPortZero = 0;
+
+ if((configFilter.iId == packetFilterBase.iId) &&
+ (configFilter.iEvaluationPrecedenceIndex == packetFilterBase.iEvaluationPrecedenceIndex) &&
+ (configFilter.iProtocolNumberOrNextHeader == packetFilterBase.iProtocolNumberOrNextHeader) &&
+ (configFilter.iSrcPortMin == packetFilterBase.iSrcPortMin) &&
+ (configFilter.iSrcPortMax == packetFilterBase.iSrcPortMax) &&
+ ((configFilter.iDestPortMin == KReservedPortZero) || (configFilter.iDestPortMin == packetFilterBase.iDestPortMin)) &&
+ ((configFilter.iDestPortMax == KReservedPortZero) || (configFilter.iDestPortMax == packetFilterBase.iDestPortMax)) &&
+ (configFilter.iIPSecSPI == packetFilterBase.iIPSecSPI) &&
+ (configFilter.iTOSorTrafficClass == packetFilterBase.iTOSorTrafficClass) &&
+ (configFilter.iFlowLabel == packetFilterBase.iFlowLabel))
+ {
+ TInt xx;
+ for(xx = 0; xx<RPacketContext::KIPAddressSize; xx++)
+ {
+ if((configFilter.iSrcAddr[xx] == packetFilterBase.iSrcAddr[xx]) &&
+ (configFilter.iSrcAddrSubnetMask[xx] == packetFilterBase.iSrcAddrSubnetMask[xx]))
+ {
+ found=ETrue;
+ }
+ else
+ {
+ found=EFalse;
+ break;
+ }
+ }
+
+ if(found)
+ {
+ // checking the maximum number of packet filter per a pdp context
+ if(iNumFiltersAdded >= KMaxNumberOfTftFilters )
+ {
+ ReqCompleted(aTsyReqHandle, KErrOverflow);
+ return KErrNone;
+ }
+ iTFTChangeBool = ETrue;
+ configFilter.iAdded = ETrue;
+ iNumFiltersAdded++ ;
+ ReqCompleted(aTsyReqHandle, KErrNone);
+ return KErrNone;
+ }
+ }
+ }
+ ReqCompleted(aTsyReqHandle, KErrGeneral);
+ return KErrNone;
+ }
+
+/**
+* This function removes the packet filter from the array if the packet filter is found in the array
+*/
+TInt CSimPacketContext::RemovePacketFilter(const TTsyReqHandle aTsyReqHandle, TInt aId)
+ {
+ TInt total= iPacketFilterInfoArray->Count();
+ TBool found = EFalse;
+
+ for (TInt i = 0; i<total; i++)
+ {
+ if ((iPacketFilterInfoArray->At(i).iId == aId) &&
+ (iPacketFilterInfoArray->At(i).iAdded))
+ {
+ iPacketFilterInfoArray->At(i).iAdded = EFalse;
+ iNumFiltersAdded-- ;
+ ReqCompleted(aTsyReqHandle, KErrNone);
+ found = ETrue;
+ iTFTChangeBool = ETrue;
+ break;
+ }
+ }
+
+ if (!found)
+ {
+ ReqCompleted(aTsyReqHandle, KErrArgument);
+ return KErrNone;
+ }
+ return KErrNone;
+ }
+
+/**
+* This function initialises the context
+*/
+TInt CSimPacketContext::InitialiseContext(const TTsyReqHandle aTsyReqHandle, TDes8* aDataChannelV2Pckg)
+ {
+ TCommSetupItem item = FindCommSettings();
+ if (item.iNumInitializeFailures != 0)
+ {
+ item.iNumInitializeFailures--;
+ ReqCompleted(aTsyReqHandle, item.iErrorCode);
+ }
+ else
+ {
+ iInitContextData.iTsyReqHandle = aTsyReqHandle;
+ iInitContextData.iChannel = aDataChannelV2Pckg;
+ iInitContextTimer->Start(item.iDelay, this, ETimerIdPcktContextInitContext);
+ }
+ return KErrNone;
+ }
+
+TInt CSimPacketContext::DoInitialiseContext()
+ {
+ RPacketContext::TDataChannelV2Pckg* channel = (RPacketContext::TDataChannelV2Pckg*)iInitContextData.iChannel;
+ RPacketContext::TDataChannelV2& channelV2 = (*channel)();
+
+ // Check that the data structure is supported by the simulated TSY version
+ TInt err = iPhone->CheckSimTsyVersion(channelV2);
+ if(err != KErrNone)
+ {
+ ReqCompleted(iInitContextData.iTsyReqHandle, err);
+ return KErrNone;
+ }
+
+ TCommSetupItem item = FindCommSettings();
+ channelV2.iPort = item.iPortName;
+ channelV2.iCsy = item.iCsyName;
+ channelV2.iChannelId = item.iPortName;
+
+ ReqCompleted(iInitContextData.iTsyReqHandle, KErrNone);
+
+ return KErrNone;
+ }
+
+/**
+* Cancel method, returns KErrNone
+*/
+TInt CSimPacketContext::EnumeratePacketFiltersCancel(const TTsyReqHandle /*aTsyReqHandle*/)
+ {
+ return KErrNone;
+ }
+
+/**
+* Cancel method, returns KErrNone
+*/
+TInt CSimPacketContext::GetPacketFilterInfoCancel(const TTsyReqHandle /*aTsyReqHandle*/)
+ {
+ return KErrNone;
+ }
+
+/**
+* Cancel method, returns KErrNone
+*/
+TInt CSimPacketContext::AddPacketFilterCancel(const TTsyReqHandle /*aTsyReqHandle*/)
+ {
+ return KErrNone;
+ }
+
+/**
+* Cancel method, returns KErrNone
+*/
+TInt CSimPacketContext::CreateNewTFTCancel(const TTsyReqHandle aTsyReqHandle)
+ {
+ iCreateTftTimer->Cancel();
+
+ ReqCompleted(aTsyReqHandle, KErrCancel);
+
+ return KErrNone;
+ }
+
+/**
+* Cancel method, returns KErrNone
+*/
+TInt CSimPacketContext::DeleteTFTCancel(const TTsyReqHandle /*aTsyReqHandle*/)
+ {
+ return KErrNone;
+ }
+
+/**
+* Cancel method, returns KErrNone
+*/
+TInt CSimPacketContext::RemovePacketFilterCancel(const TTsyReqHandle /*aTsyReqHandle*/)
+ {
+ return KErrNone;
+ }
+
+/**
+* Cancel method, returns KErrNone
+*/
+TInt CSimPacketContext::ModifyActiveContextCancel(const TTsyReqHandle /*aTsyReqHandle*/)
+ {
+ return KErrNone;
+ }
+
+/**
+* Cancel method, returns KErrNone
+*/
+TInt CSimPacketContext::InitialiseContextCancel(const TTsyReqHandle aTsyReqHandle)
+ {
+ iInitContextTimer->Cancel();
+
+ ReqCompleted(aTsyReqHandle, KErrCancel);
+
+ return KErrNone;
+ }
+
+CSimPacketContext::TCommSetupItem CSimPacketContext::FindCommSettings()
+ {
+ TInt count=iCommSetupArray->Count();
+ TCommSetupItem def;
+
+ //Do a default initialization.
+ def.iCsyName.Copy(KDefaultCsyName);
+ def.iPortName.Copy(KDefaultPortName);
+ def.iConfig.iRate=KDefaultCommPortRate;
+ def.iConfig.iHandshake=KDefaultHandshake;
+ def.iContextName=KDefaultSetting;
+ def.iCommReset = EFalse;
+ def.iNumInitializeFailures = 0;
+ def.iErrorCode = KErrNone;
+ def.iDelay = 0;
+
+ for(TInt i=0; i<count; i++)
+ {
+ TCommSetupItem comm = iCommSetupArray->At(i);
+ if(comm.iContextName.Compare(iContextName)==KErrNone)
+ return comm;
+ if(comm.iContextName.Compare(KDefaultSetting)==KErrNone)
+ def=comm;
+ }
+ return def;
+ }
+
+TName CSimPacketContext::ContextName() const
+ {
+ return iContextName;
+ }
+
+TInt CSimPacketContext::GetDnsInfo(const TTsyReqHandle aTsyReqHandle, const TDesC8* aDnsInfo)
+ {
+/**
+ * GetDnsInfo method to extract DNS server names from context
+ *
+ * @param aStatus TRequestStatus object with which error code is returned
+ * @param aDnsInfo packaged TDnsInfoV2 object passed as TDes8
+ *
+ * GetDNSInfo() is needed when the client uses dynamic IPv4 PDP addresses.
+ * After the context is activated the client needs to know the actual primary
+ * and secondary DNS addresses to use when sending packet data. As the network
+ * may have supplied these addresses there is a need for an API method to get
+ * these addresses from the TSY.
+ */
+ RPacketContext::TTDnsInfoV2Pckg* dnsInfoV2Pckg = (RPacketContext::TTDnsInfoV2Pckg*)aDnsInfo;
+ RPacketContext::TDnsInfoV2& dnsInfoV2 = (*dnsInfoV2Pckg)();
+
+ // Check that the data structure is supported by the simulated TSY version
+ TInt err = iPhone->CheckSimTsyVersion(dnsInfoV2);
+ if(err != KErrNone)
+ {
+ iPhone->ReqCompleted(aTsyReqHandle, err);
+ return KErrNone;
+ }
+
+ TContextConfigParam config = iContextConfigParams->At(iContextConfigParamsIndex);
+
+ dnsInfoV2.iPrimaryDns.Copy(config.iProtocolConfigOption.iPrimaryDNS);
+ dnsInfoV2.iSecondaryDns.Copy(config.iProtocolConfigOption.iSecondaryDNS);
+
+ ReqCompleted(aTsyReqHandle,KErrNone);
+ return KErrNone;
+ }
+
+TInt CSimPacketContext::GetDnsInfoCancel(const TTsyReqHandle /*aTsyReqHandle*/)
+/**
+ * GetDnsInfoCancel - Cancels an asynchronous GetDnsInfo method.
+ */
+ {
+ return KErrNone;
+ }
+
+TInt CSimPacketContext::GetAddMediaAuthorization(const TTsyReqHandle aTsyReqHandle, TDes8* aBuffer)
+/**
+ * GetAddMediaAuthorization method to verify provided media authorization and return desired result
+ *
+ * @param aTsyReqHandle The request handle for completing the request
+ * @param aBuffer Packaged CTFTMediaAuthorizationV3 object passed as TDes8
+ *
+ * GetAddMediaAuthorization() checks the provided media authorization against a predefined authorization
+ * set up from the configuration file. If the authorization is valid the function will return the desired
+ * response, also set up from the configuration file. If there is a mismatch between authorizations, KErrCorrupt
+ * returned.
+ */
+ {
+ TBool validMediaAuthorization = TRUE;
+ RPacketContext::CTFTMediaAuthorizationV3* mediaAuthV3 = NULL;
+
+ // Check that the data structure is supported by the simulated TSY version
+ TInt err = iPhone->CheckSimTsyVersion(*mediaAuthV3);
+ if(err != KErrNone)
+ {
+ iPhone->ReqCompleted(aTsyReqHandle, err);
+ return KErrNone;
+ }
+
+ TRAPD(ret, mediaAuthV3 = RPacketContext::CTFTMediaAuthorizationV3::NewL());
+ if (ret != KErrNone)
+ {
+ LOGPACKET1("CSimPacketContext::GetAddMediaAuthorization NewL call fail");
+ return ret;
+ }
+
+ TRAP(ret, mediaAuthV3->InternalizeL(*aBuffer) );
+ if (ret != KErrNone)
+ {
+ delete mediaAuthV3;
+ LOGPACKET1("CSimPacketContext::GetAddMediaAuthorization InternalizeL call fail");
+ return ret;
+ }
+
+ for (TUint i=0; i<iAuthorizationTokenResponse->Count(); i++)
+ {
+ if (!(mediaAuthV3->iAuthorizationToken).Compare(iAuthorizationTokenResponse->At(i).iAuthorizationToken))
+ {
+ for (TUint j=0; j<iMediaAuthorization->At(i).iFlowIds.Count(); j++)
+ {
+ if ((mediaAuthV3->iFlowIds[j].iMediaComponentNumber != iMediaAuthorization->At(i).iFlowIds[j].iMediaComponentNumber) ||
+ (mediaAuthV3->iFlowIds[j].iIPFlowNumber != iMediaAuthorization->At(i).iFlowIds[j].iIPFlowNumber))
+ {
+ validMediaAuthorization = FALSE;
+ }
+ }
+ if (validMediaAuthorization)
+ {
+ ReqCompleted(aTsyReqHandle,iAuthorizationTokenResponse->At(i).iResponse);
+ delete mediaAuthV3;
+ return KErrNone;
+ }
+ }
+ }
+
+ // No match found, respond with corrupted
+ ReqCompleted(aTsyReqHandle,KErrCorrupt);
+ delete mediaAuthV3;
+
+ return KErrNone;
+ }
+
+TInt CSimPacketContext::GetRemoveMediaAuthorization(const TTsyReqHandle aTsyReqHandle, RPacketContext::TAuthorizationToken* aAuthorizationToken)
+/**
+ * GetRemoveMediaAuthorization method to verify provided media authorization and return desired result
+ *
+ * @param aTsyReqHandle The request handle for completing the request
+ * @param aAuthorizationToken Authorization token to be checked
+ *
+ * GetRemoveMediaAuthorization() checks the provided authorization token against predefined tokens and responses
+ * from config file. If a match is found the associated desired response is returned, otherwise KErrCorrupt is reported.
+ */
+ {
+ for (TUint i=0; i<iAuthorizationTokenResponse->Count(); i++)
+ {
+ if (!((*aAuthorizationToken).Compare(iAuthorizationTokenResponse->At(i).iAuthorizationToken)))
+ {
+ ReqCompleted(aTsyReqHandle,iAuthorizationTokenResponse->At(i).iResponse);
+ return KErrNone;
+ }
+ }
+
+ // No match found, respond with corrupted
+ ReqCompleted(aTsyReqHandle,KErrCorrupt);
+ return KErrNone;
+ }
+
+TInt CSimPacketContext::GetAddMediaAuthorizationCancel(const TTsyReqHandle /*aTsyReqHandle*/)
+/**
+* Cancel method, returns KErrNone
+*/
+ {
+ return KErrNone;
+ }
+
+TInt CSimPacketContext::GetRemoveMediaAuthorizationCancel(const TTsyReqHandle /*aTsyReqHandle*/)
+/**
+* Cancel method, returns KErrNone
+*/
+ {
+ return KErrNone;
+ }
+
+