diff -r 000000000000 -r 3553901f7fa8 telephonyserverplugins/simtsy/inc/CSimPacketService.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telephonyserverplugins/simtsy/inc/CSimPacketService.h Tue Feb 02 01:41:59 2010 +0200 @@ -0,0 +1,486 @@ +// Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This file contains the definitions of the Simulator TSY Packet Service class. +// It defines a Simulated packet-switched connection to a packet (GPRS and CDMA) network. +// +// + +/** + @file + @internalAll +*/ + +#ifndef __CSIMPACKETSERVICE_H__ +#define __CSIMPACKETSERVICE_H__ + +#include +#include +#include +#include "csimtimer.h" +#include "utils.h" +#include "CSimPubSubChange.h" + +#include "CSimPacketContext.h" +#include "CSimMbmsPacketContext.h" +#include "mbmstypes.h" +#include "pcktlist.h" + +const TInt KMaxContextPoolSize = 11; +const TInt KGranularity = 2; +const TInt KMaxMbmsContextSupportedByPhone = 7; +const TInt KMaxMbmsContextSupportedByNetwork = 5; +const TInt KMaxMbmsActiveContexts =10; +const TInt KMaxMbmsMonitorContexts =15; + +enum TPacketEvent //< Emum for the state machine + { + EPacketEventNone, + EPacketEventAttach, + EPacketEventDetach, + EPacketEventTimeOut + }; + + +const RPacketService::TStatus KPacketStateTableTerminator=(RPacketService::TStatus)999; + +struct TPacketStateChangeValidity // Enum for packet state + { + RPacketService::TStatus iOldState; + RPacketService::TStatus iNewState; + TInt iError; + }; + +//< This table is used to ensure that the TSY state changes are as accurate as possibly +//< It makes sure that there is no state irregularities and the TSY does not skip any state. +//< Returns KErrNone for a valid change state request (3rd column). +const struct TPacketStateChangeValidity KPacketStateChangeValidity[]= { + { RPacketService::EStatusUnattached, RPacketService::EStatusAttached, KErrNone }, + + { RPacketService::EStatusAttached, RPacketService::EStatusActive, KErrNone }, + { RPacketService::EStatusAttached, RPacketService::EStatusUnattached, KErrNone }, + + { RPacketService::EStatusActive, RPacketService::EStatusSuspended, KErrNone }, + { RPacketService::EStatusActive, RPacketService::EStatusAttached, KErrNone }, + { RPacketService::EStatusActive, RPacketService::EStatusUnattached, KErrNone }, + + { RPacketService::EStatusSuspended, RPacketService::EStatusUnattached, KErrNone }, + { RPacketService::EStatusSuspended, RPacketService::EStatusAttached, KErrNone }, + { RPacketService::EStatusSuspended, RPacketService::EStatusActive, KErrNone }, + + { KPacketStateTableTerminator, KPacketStateTableTerminator, KPacketStateTableTerminator} + }; + +struct TDefaultGPRSConfigParam //< Used for holding the default GPRS configuration parameters + { + TInt iProtocolType; + TPtrC8 iGsnAddress; + TPtrC8 iProtocolAddress; + TUint iPdpCompression; + TInt iAnonymousAccess; + TBool iUseEdge; + TProtocolConfigOption iProtocolConfigOption; + }; + +struct TDefaultR99_R4ConfigParam //< Used for holding the default Release99/4 configuration parameters + { + TInt iProtocolType; + TPtrC8 iGsnAddress; + TPtrC8 iProtocolAddress; + TBool iUseEdge; + TProtocolConfigOption iProtocolConfigOption; + }; + +struct TDefaultR5ConfigParam //< Used for holding the default Release 5 configuration parameters + { + TInt iProtocolType; + TPtrC8 iGsnAddress; + TPtrC8 iProtocolAddress; + TInt iAnonymousAccess; + TBool iUseEdge; + TProtocolConfigOption iProtocolConfigOption; + TUint iPdpHeaderCompression; + TUint iPdpDataCompression; + }; + + +class TConfigData + { +public: + static TInt Find(CArrayFixFlat* aConfigArray, + TTsyReqHandle aTsyReqHandle, + TInt& aIndex); + TTsyReqHandle iTsyReqHandle; + TDes8* iData; + }; + + +class CSimPhone; +class CSimIncomingContextManager; + +class CSimPacketService : public CSubSessionExtBase, public MTimerCallBack, public MPSSimObserver, public MPubSubChangeCallback + { + friend CSimPacketContext::~CSimPacketContext(); + friend CSimMbmsPacketContext::~CSimMbmsPacketContext(); + +public: + static CSimPacketService* NewL(CSimPhone* aPhone); + CSimPacketService(CSimPhone* aPhone); + void ConstructL(); + ~CSimPacketService(); + + virtual TInt ExtFunc(const TTsyReqHandle aTsyReqHandle,const TInt aIpc,const TDataPackage& aPackage); + virtual TReqMode ReqModeL(const TInt aIpc); + virtual CTelObject* OpenNewObjectByNameL(const TDesC& aName); + virtual CTelObject* OpenNewObjectL(TDes& aNewName); + virtual TInt CancelService(const TInt aIpc, const TTsyReqHandle aTsyReqHandle); + virtual void Init(); + virtual TInt RegisterNotification(const TInt aIpc); + virtual TInt DeregisterNotification(const TInt aIpc); + virtual TInt NumberOfSlotsL(const TInt aIpc); + virtual RHandleBase* GlobalKernelObjectHandle(); + + CSimPhone* PhonePtr() const; //< Returns a pointer to the phone object (iPhone) + TInt ChangeState(RPacketService::TStatus aNewState); //< Changes the state of the packetservice + const CTestConfigSection* CfgFile(); //< Returns a pointer to a section of the configuration file + + TInt GetCurrentReleaseMode(const TTsyReqHandle aTsyReqHandle, RPacketService::TPacketReleaseMode* aReleaseMode); + TInt NotifyReleaseModeChange(const TTsyReqHandle aTsyReqHandle, RPacketService::TPacketReleaseMode* aReleaseMode); + + TInt EnumerateNifs(const TTsyReqHandle aTsyReqHandle, TInt& aCount); + TInt GetNifInfo(const TTsyReqHandle aTsyReqHandle, TInt aIndex, TDes8* aNifInfoV01); + TInt EnumerateContextsInNif(const TTsyReqHandle aTsyReqHandle, const TDesC* aExistingContextName, TInt& aCount); + TInt GetContextNameInNif(const TTsyReqHandle aTsyReqHandle, const TDesC* aExistingContextName, TInt aIndex, TDes* aContextName); + + TInt GetCurrentReleaseModeCancel(const TTsyReqHandle aTsyReqHandle); + TInt NotifyReleaseModeChangeCancel(const TTsyReqHandle aTsyReqHandle); + + TInt EnumerateNifsCancel(const TTsyReqHandle aTsyReqHandle); + TInt GetNifInfoCancel(const TTsyReqHandle aTsyReqHandle); + TInt EnumerateContextsInNifCancel(const TTsyReqHandle aTsyReqHandle); + TInt GetContextNameInNifCancel(const TTsyReqHandle aTsyReqHandle); + + void DecrementContextCount(); + void DecrementMbmsContextCount(); + + virtual void SimPSEvent(const CSimPubSub::TPubSubProperty aProperty, TInt aStatus); + virtual void PubSubCallback(TInt aIndex); +private: + //< The Packet API methods implemented by the TSY + //< These will be called from the ExtFunc method above + TInt NotifyContextAdded(const TTsyReqHandle aTsyReqHandle, TDes* aContextId); + TInt NotifyContextAddedCancel(const TTsyReqHandle aTsyReqHandle); + + TInt Attach(const TTsyReqHandle aTsyReqHandle); + TInt AttachCancel(const TTsyReqHandle aTsyReqHandle); + + TInt Detach(const TTsyReqHandle aTsyReqHandle); + TInt DetachCancel(const TTsyReqHandle aTsyReqHandle); + + TInt DoDetach(); + + TInt GetStatus(const TTsyReqHandle aTsyReqHandle,RPacketService::TStatus* aStatus); + TInt NotifyStatusChange(const TTsyReqHandle aTsyReqHandle,RPacketService::TStatus* aStatus); + TInt NotifyStatusChangeCancel(const TTsyReqHandle aTsyReqHandle); + + TInt NotifyContextActivationRequested(const TTsyReqHandle aTsyReqHandle, TDes8* aContextParameters); + TInt NotifyContextActivationRequestedCancel(const TTsyReqHandle aTsyReqHandle); + + TInt RejectActivationRequest(const TTsyReqHandle aTsyReqHandle); + TInt RejectActivationRequestCancel(const TTsyReqHandle aTsyReqHandle); + + TInt EnumerateContexts(const TTsyReqHandle aTsyReqHandle,TInt* aCount, TInt* aMaxAllowed); + TInt EnumerateContextsCancel(const TTsyReqHandle aTsyReqHandle); + + TInt GetContextInfo(const TTsyReqHandle aTsyReqHandle,TInt* aIndex,RPacketService::TContextInfo* aInfo); + TInt GetContextInfoCancel(const TTsyReqHandle aTsyReqHandle); + + TInt GetNtwkRegStatus(const TTsyReqHandle aTsyReqHandle,RPacketService::TRegistrationStatus* aRegistrationStatus); + TInt NotifyChangeOfNtwkRegStatus(const TTsyReqHandle aTsyReqHandle,RPacketService::TRegistrationStatus* aRegistrationStatus); + TInt NotifyChangeOfNtwkRegStatusCancel(const TTsyReqHandle aTsyReqHandle); + + TInt GetMSClass(const TTsyReqHandle aTsyReqHandle, RPacketService::TMSClass* aCurrentClass, RPacketService::TMSClass* aMaxClass); + TInt GetMSClassCancel(const TTsyReqHandle aTsyReqHandle); + + TInt SetMSClass(const TTsyReqHandle aTsyReqHandle, RPacketService::TMSClass* aClass); + TInt SetMSClassCancel(const TTsyReqHandle aTsyReqHandle); + + TInt NotifyMSClassChange(const TTsyReqHandle aTsyReqHandle, RPacketService::TMSClass* aNewClass); + TInt NotifyMSClassChangeCancel(const TTsyReqHandle aTsyReqHandle); + + TInt GetStaticCaps(const TTsyReqHandle aTsyReqHandle, TUint* aCaps, RPacketContext::TProtocolType* aPdpType); + + TInt GetDynamicCaps(const TTsyReqHandle aTsyReqHandle, RPacketService::TDynamicCapsFlags* aCaps); + TInt NotifyDynamicCapsChange(const TTsyReqHandle aTsyReqHandle, RPacketService::TDynamicCapsFlags* aCaps); + TInt NotifyDynamicCapsChangeCancel(const TTsyReqHandle aTsyReqHandle); + + TInt SetAttachMode(const TTsyReqHandle aTsyReqHandle, RPacketService::TAttachMode* aMode); + TInt GetAttachMode(const TTsyReqHandle aTsyReqHandle, RPacketService::TAttachMode* aMode); + TInt NotifyAttachModeChange(const TTsyReqHandle aTsyReqHandle, RPacketService::TAttachMode* aMode); + TInt NotifyAttachModeChangeCancel(const TTsyReqHandle aTsyReqHandle); + + TInt SetDefaultContextParams(const TTsyReqHandle aTsyReqHandle, const TDesC8* aPckg); + TInt GetDefaultContextParams(const TTsyReqHandle aTsyReqHandle, TDes8* aPckg); + TInt GetGPRSDefaultContextParams(const TTsyReqHandle aTsyReqHandle, TDes8* aPckg); + + /* MBMS related APIs starts here*/ + + TInt GetMbmsNetworkServiceStatus(const TTsyReqHandle aTsyReqHandle, TBool aAttemptAttach,TMbmsNetworkServiceStatus* aStatus); + TInt GetMbmsNetworkServiceStatusCancel(const TTsyReqHandle aTsyReqHandle); + + TInt NotifyMbmsNetworkServiceStatusChange(const TTsyReqHandle aTsyReqHandle, TMbmsNetworkServiceStatus* aStatus); + TInt NotifyMbmsNetworkServiceStatusChangeCancel(const TTsyReqHandle aTsyReqHandle); + + TInt NotifyMbmsServiceAvailabilityChange(const TTsyReqHandle aTsyReqHandle); + TInt NotifyMbmsServiceAvailabilityChangeCancel(const TTsyReqHandle aTsyReqHandle); + + TInt UpdateMbmsMonitorServiceListL(const TTsyReqHandle aTsyReqHandle,TMbmsAction* aAction, TDes8* aBuffer=NULL); + TInt UpdateMbmsMonitorServiceListCancel(const TTsyReqHandle aTsyReqHandle); + + TInt EnumerateMbmsActiveServiceList(const TTsyReqHandle aTsyReqHandle, TInt* aCount, TInt* aMaxAllowed); + TInt EnumerateMbmsActiveServiceListCancel(const TTsyReqHandle aTsyReqHandle); + + TInt EnumerateMbmsMonitorServiceList(const TTsyReqHandle aTsyReqHandle, TInt* aCount, TInt* aMaxAllowed); + TInt EnumerateMbmsMonitorServiceListCancel(const TTsyReqHandle aTsyReqHandle); + + /* MBMS related APIs ends here*/ + + TInt ActionEvent(TPacketEvent aEvent); //< The state machine for this class + virtual void TimerCallBack(TInt aId); //< Timer Callback for the timeout events + void TimerCallBackPcktRegStatus(); + void TimerCallBackReleaseMode(); + void TimerCallBackNtwkRegStatus(); + void TimerCallBackDeactivate(); + void TimerCallBackDynamicCaps(); + + void CompleteNtwkRegStatus(RPacketService::TRegistrationStatus aRegistrationStatus); + + TInt GetMbmsMonitoredServicesListPhase1(const TTsyReqHandle aTsyReqHandle, TClientId* aClient, TInt* aBufSize); + TInt ProcessGetMbmsMonitoredServicesListPhase1L(const TTsyReqHandle aTsyReqHandle, TClientId* aClient, TInt* aBufSize); + TInt GetMbmsMonitoredServicesListPhase2(const TTsyReqHandle aTsyReqHandle, TClientId* aClient, TDes8* aBufSize); + TInt GetMbmsMonitoredServicesListCancel(const TTsyReqHandle aTsyReqHandle); + + +private: // Data + CSimPhone* iPhone; //< Pointer to the phone object (The parent of this class) + TInt iContextCount; //< Number of contexts currently opened + TInt iMbmsContextCount; //< Number of MBMS contexts currently opened + TInt iMbmsContextNameInc; //< Used for Appending a number to the mbms context name "MBMS_CONTEXT" + TInt iPrimaryContextNameInc; //< Used for Appending a number to the packet name "PRIMARY_PACKET_CONTEXT" + //< to give each packet object opened a unique name + TInt iSecondaryContextNameInc; //< Used for Appending a number to the packet name "SECONDARY_PACKET_CONTEXT" + //< to give each packet object opened a unique name + + RPacketService::TStatus iState; //< Holds the current state of the packet service + RPacketService::TAttachMode iAttachMode; //< Attach mode for the packet service + RPacketService::TMSClass iMSClass; //< We only support class B + + TTsyReqHandle iAttachRequestHandle; //< The request handle for the attach request + TInt iAttachPause; //< duration spent in attaching to network state + TInt iAttachFail; //< Fail the attach request with this error + + TTsyReqHandle iDetachRequestHandle; //< The request handle for the detach request + TInt iDetachPause; //< duration spent in detaching from the network + TInt iDetachFail; //< Fail the detach request with this error + + TPacketEvent iCurrentEvent; //< Holds the current event being processed (allows the tsy to cancel the request) + TNotifyData iNotifyStatusChange; //< Holds the notification data (a flag, TsyReqHandle and any raw data) + TNotifyData iNotifyContextAdded; //< Registers a client interest in being notified of a context being added to the network + + TNotifyData iNotifyChangeOfNtwk; //< Registers a client interest in a change of network notification + TNotifyData iNotifyMSClassChange; //< Registers a client interest in a change of MSClass + + TNotifyData iNotifyChangeOfReleaseMode; + TNotifyData iNotifyChangeOfAttachMode; //< Registers client interest in change of attach mode + + TNotifyData iNotifyMbmsNetworkStatusChange; //* iPcktRegStatusInfo; //< List of packet registration changes. + TNotificationType iNtwkRegStatusNotificationType; + CArrayFixFlat* iNtwkRegStatusInfo; // list of ntwk registration changes. + CArrayFixFlat* iPacketReleaseModeArray; + CArrayFixFlat* iDynamicCapsArray; //< List of dynamic capabilities changes + CArrayFixFlat* iSecondaryContextCountArray; + CArrayFixFlat* iMbmsBroadcastParamsArray; //List of MBMS Broadcast Service related information + CArrayFixFlat* iMbmsMonitorListParamsArray; // List of MBMS Broadcast Monitoring list parameters + CArrayPtrFlat* iMbmsServicesList; // List containing the MBMS services for 2P retrieval + + TInt iCurrentMbmsParamsIndex; + TInt iCurrentMbmsMonitorListIndex; + TInt iCurrentPacketReleaseMode; + TInt iPacketReleaseModeIndex; + TInt iCurrentDynamicCaps; + TInt iDynamicCapsIndex; + TInt iPcktRegStatIndex; //< Current index from the iPcktRegStatInfo array + TInt iCurrentRegStatus; + TInt iNtwkRegStatIndex; //< Current index from the iNtwkRegStatInfo array + TInt iUpdateMbmsServiceError; + TBool iPcktTimerBool; + + TTsyReqHandle iGetMbmsNetworkReqHandle; + TTsyReqHandle iEnumerateActiveListReqHandle; + TTsyReqHandle iEnumerateMonitorListReqHandle; + TTsyReqHandle iUpdateMbmsServiceReqHandle; + + TDefaultGPRSConfigParam iGPRSDefaultConfig; + TDefaultR99_R4ConfigParam iR99_R4DefaultConfig; + TDefaultR5ConfigParam iR5DefaultConfig; + + TBool iSecondaryContext; + TInt PrepareOpenSecondary(const TTsyReqHandle aTsyReqHandle, const TDesC* aOriginalContextName); + TInt iCurrentPrimaryContextIndex; + + // this class is to enable a Nif to hold and access its contexts and its primary context's name + + // The above statement appears to be totally wrong and misleading. + // It has nothing to do with NIF's, it is just a way of partitioning PDP. + // The 1st in the context is the primary context, the next contexts are the secondary contexts. + class TNifWrapper + { + private: + RPointerArray iContexts; // this contains an array of CSimPacketContexts + TName iPrimaryContextName; // the primary context name + + public: + CSimPacketContext* GetContext(TInt aIndex) + { + return iContexts[aIndex]; // returns context at specified context + }; // returns the context at the specified index + //TArray Array(){ return iContexts.Array();}; // returns the array of contexts + inline TInt NumberOfContexts() {return iContexts.Count();}; // returns number of contexts + inline void AddContext(CSimPacketContext* aContext) {iContexts.Append(aContext);}; // adds a context to the array + inline void Close() + { + // deletes contexts of nif + TInt count = iContexts.Count(); + for(TInt i = 0; iClose(); + } + iContexts.Close(); + }; + }; + + class TMbmsNifWrapper + { + private: + RPointerArray iContexts; // this contains an array of CSimMbmsPacketContexts + TName iContextName; // the MBMS packet context name + + public: + inline CSimMbmsPacketContext* GetContext(TInt aIndex); + inline TInt NumberOfContexts(); + inline void AddContext(CSimMbmsPacketContext* aContext); + inline void Close(); + }; + + RArray iNifWrappers; // array of nifs; each nif holds a primary context and a number of secondary contexts + RArray iMbmsNifWrappers; //array of MBMS nifs; each nif holds a MBMS broadcast contexts; + // shall be used for multicast contexts in future. + TConfigData iConfigData; + TInt iMbmsMonitorListCount; //count of number of Monitor list + + CSimIncomingContextManager* iIncomingContextManager; + // Holds data to do with the incoming contexts. + // Note all messages come through RPacketService via SimPSEvent + // This applies to incoming, and network registration. + +public: + inline RPacketService::TMSClass MSClass() const {return iMSClass; } //< Returns the Current MSClass object supported + }; + +CSimMbmsPacketContext* CSimPacketService::TMbmsNifWrapper::GetContext(TInt aIndex) + { + return iContexts[aIndex]; // returns context at specified index + }; + +TInt CSimPacketService::TMbmsNifWrapper::NumberOfContexts() + {// returns number of contexts + return iContexts.Count(); + } + +void CSimPacketService::TMbmsNifWrapper::AddContext(CSimMbmsPacketContext* aContext) + {// adds a context to the array + iContexts.Append(aContext); + } + +void CSimPacketService::TMbmsNifWrapper::Close() + { + // deletes contexts of nif + TInt count = iContexts.Count(); + for(TInt i = 0; iClose(); + } + iContexts.Close(); + } + +#endif //__CSIMPACKETSERVICE_H__