diff -r 000000000000 -r 3553901f7fa8 telephonyprotocols/secondarypdpcontextumtsdriver/spudman/inc/spudman.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telephonyprotocols/secondarypdpcontextumtsdriver/spudman/inc/spudman.h Tue Feb 02 01:41:59 2010 +0200 @@ -0,0 +1,248 @@ +// Copyright (c) 2004-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: +// SPUD event manager +// +// + +/** + @file + @internalComponent +*/ + +#ifndef SPUDMAN_H +#define SPUDMAN_H + +#include +#include +#include +#include +#include + +#include "rpdpfsminterface.h" +#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#endif + +const TUint KSpudMajorVersionNumber=0; +const TUint KSpudMinorVersionNumber=0; +const TUint KSpudBuildVersionNumber=2; + +/** Longest protocol name supported */ +const TUint KMaxProtocolName = 20; + +#ifdef __FLOG_ACTIVE +// Logging tags +_LIT8(KSpudFirstTag,"spud"); +_LIT8(KSpudLog,"spudman.txt"); +#endif + +class CBinderSweeperNotifierCb; +class CBindMan; +class CSpudBinderRef; +class RPdpFsmInterface; + +/** +SPUD Event Manager. +It is responsible for routing events throughout the SPUD and between interface points. +*/ +NONSHARABLE_CLASS(CSpudMan) : public CNifIfLink, public MSpudManInterface + { +public: + __FLOG_DECLARATION_MEMBER_MUTABLE; + + CSpudMan(CNifIfFactory& aFactory, MNifIfNotify* aNotify); + ~CSpudMan(); + void ConstructL(CBindMan* aBindMan); + void Panic(TInt aReason=0) const; + + TBool AreQoSEventsEnabled() const; + + // Getters + CBindMan* BindMan() const; + MNifIfNotify* Notify() const; + + // Events from elsewhere + TInt GuqosInput(TUint aName, TDes8& aOption); + void LinkLayerUp(TContextId aContextId); + void LinkLayerDown(TContextId aContextId, TInt aReason, MNifIfNotify::TAction aAction); + void StopSending(TContextId aContextId); + void StartSending(TContextId aContextId); + + // from MSpudManInterface + void Input (TContextId aPdpId, TInt aEvent, TInt aParam); + void SetContextTerminationErrorAndStop(TContextId aContextId, TInt aErrorCode); + + // from CNifIfLink + void AuthenticateComplete(TInt aResult); + TInt Start(); + void Stop(TInt aReason, MNifIfNotify::TAction aAction); + CNifIfBase* GetBinderL(const TDesC& aName); + void Restart(CNifIfBase* aIf); + + // from CNifIfBase + TInt Send(RMBufChain& aPdu, TAny* aSource=0); + void Info(TNifIfInfo& aInfo) const; + TInt Notification(TAgentToNifEventType aEvent, void * aInfo); + + // SPUD methods + void IfProgress(TContextId aContextId, TInt aStage, TInt aError); + void IfProgress(TContextId aContextId, TSubConnectionUniqueId aSubConnectionUniqueId, TInt aStage, TInt aError); + TInt Notification(TContextId aContextId, TNifToAgentEventType aEvent, void * aInfo); + TInt ReadInt(TContextId aContextId, const TDesC& aField, TUint32& aValue); + TInt ReadDes(TContextId aContextId, const TDesC& aField, TDes8& aValue); + TInt ReadDes(TContextId aContextId, const TDesC& aField, TDes16& aValue); + + void DisposeOfBinder(CSpudBinderRef* aRef); + void SweepBindersAndNotify(); + +protected: + void ReadDefaultQoS(RPacketQoS::TQoSR99_R4Requested& aQos) const; + + +#ifdef SYMBIAN_NETWORKING_UMTSR5 + + // IM CN signalling flag, Setter and Getter methods + void SetIMCNSignallingFlagPcoL(RPacketContext::TProtocolConfigOptionV2& aPco); + TBool GetIMCNSignallingFlagPcoL(RPacketContext::TProtocolConfigOptionV2& aPco); + + void ReadDefaultR5QoS(RPacketQoS::TQoSR5Requested& aQos) const; +#endif +// SYMBIAN_NETWORKING_UMTSR5 + + void ReadTsyName(TName& aTsyName) const; + void SetTerminateError(TInt aError); + void SetTerminateError(TContextId aContextId, TInt aError); + void RetrieveGprsConfig(RPacketContext::TContextConfigGPRS& aConfigGprs) const; + void RetrieveGprsCompression(TUint& aCompression) const; + void RetrieveGprsAnonymousAccess(RPacketContext::TAnonymousAccess& aAnonymous) const; + + void FillInParameters(TContextParameters& aParams, TContextId aContextId, TInt aError=KErrNone) const; + void FillInContextConfig(TContextConfig& aConfig, TContextId aContextId) const; + void RaiseEvent(TUint aName, TDes8& aOption) const; + + virtual TInt Control(TUint aLevel,TUint aName,TDes8& aOption, TAny* aSource=0); + + // GUQoS event senders + void SendPrimaryContextCreated(TContextId aContextId, TInt aError); + void SendContextBlockedEvent(TContextId aContextId); + void SendContextUnblockedEvent(TContextId aContextId); + void SendSecondaryContextCreated(TContextId aContextId, TInt aError); + void SendContextQoSSetEvent(TContextId aContextId, TInt aError); + void SendContextTFTModifiedEvent(TContextId aContextId, TTFTOperationCode aTFTOperationCode, TInt aError); + void HandleGetNegQoSEvent(TContextId aContextId, TInt aError); + void SendContextModifyActiveEvent(TContextId aContextId, TContextConfig& aContextConfig, TInt aError); + void SendContextDeleteEvent(TContextId aContextId); + void SendNetworkStatusEvent(TNetworkEventCode aEventCode, RPacketService::TStatus aStatus); + void SendContextActivateEvent(TContextId aContextId, TContextConfig& aContextConfig, TInt aError); + void SendContextParametersChangeEvent(TContextId aContextId, TContextConfig& aContextConfig, TInt aError); + +private: + void InitPdpFsmInterfaceL(); + + void HandlePrimaryContextCreatedEvent(TContextId aContextId, TInt aError); + void HandleContextDeleteEvent(TContextId aContextId, TInt aError); + void HandleSecondaryContextCreatedEvent(TContextId aContextId, TInt aError); + void HandleContextActivateEvent(TContextId aContextId, TInt aError); + void HandleContextQoSSetEvent(TContextId aContextId, TInt aError); + void HandleContextTFTModifiedEvent(TContextId aContextId, TInt aError); + void HandleContextModifyActiveEvent(TContextId aContextId, TInt aError); + void HandleNetworkStatusEvent(); + void HandleContextParametersChangeEvent(TContextId aContextId, TInt aError); + void HandleContextBlockedEvent(TContextId aContextId); + void HandleContextUnblockedEvent(TContextId aContextId); + + void SetupSipServerAddrRetrievalL(RPacketContext::TProtocolConfigOptionV2& aPco); + void SetSipServerAddrL(const RPacketContext::TProtocolConfigOptionV2& aPco); + + void StopContext(TContextId aContextId, TInt aReason, MNifIfNotify::TAction aAction); + +private: + CBindMan* iBindMan; + + /** GUQoS event notifier */ + MNifEvent* iQosEventHandler; + + /** Protocol name */ + TBuf iName; + + /** Whether events should be sent to GUQoS or not */ + TBool iQosEventsEnabled; + + /** Interface to ETEL */ + RPdpFsmInterface iPdpFsmInterface; + + /** Temporary storage of context configuration, here to avoid stack overflow */ + TContextConfig iTempContextConfig; + + /** Temporary storage of TFT, here to avoid stack overflow */ + mutable TTFTInfo iTempTftInfo; + + /** Temporary storage of GPRS context configuration, here to avoid stack overflow */ + mutable RPacketContext::TContextConfigGPRS iTempGprsContext; + + /** Temporary storage of channel configuration, here to avoid stack overflow */ + RPacketContext::TDataChannelV2 iTempDataChannelV2; + + /** Error code which indicates the cause of the SPUD shutdown */ + TInt iTerminateError; + + /** First Error code from ETel */ + TInt iETelTerminateError; + + /** Asynchronous sweep of binders marked for deletion, with optional notification to Nifman */ + CBinderSweeperNotifierCb* iBinderSweeperNotifierCb; + + /** Default QoS sent from GuQoS before this Nif was ready */ + HBufC8* iParkedDefaultQoS; + + /** The address of the P-CSCF (Sip server) */ + RArray iSipServerAddr; + + + /** It may be necessary to report a context status to GUQoS, which is different to the formal + context status at the very moment of reporting. */ + RPacketContext::TContextStatus iContextStatusOverride; + + /** Store the Primary ContextId that might be changed over time */ + TContextId iPrimaryContextId; + + }; + + +/** Asynchronously calls into Nifman, to trigger sweeping of binders marked for deletion & + if necessary, Nifman notification. + + When the lower NIF signals LinkLayerDown on SPUD, SPUD has to delete it. + However, this deletion cannot be done from within CSpudMan::LinkLayerDown, because + the lower NIF's may still access its members after CSpudMan::LinkLayerDown returns. + That is, the lower NIF must be deleted asynchronousely. However, if this is the last + lower NIF, SPUD must signal MNifIfNotify::LinkLayerDown on Nifman. This triggers asynchronous deletion + of SPUD itself. So, there can be a race condition between asynchronous deletion of SPUD by Nifman, + and deletion of the lower NIF by SPUD. */ +NONSHARABLE_CLASS(CBinderSweeperNotifierCb): public CAsyncOneShot + { + public: + CBinderSweeperNotifierCb(CSpudMan& aSpudMan); + + // CAsyncOneShot virtuals + void Call(); + void RunL(); + + private: + /** We call into Spudman that actually performs the sweeping & notification */ + CSpudMan& iSpudMan; + }; + + +#endif