telephonyprotocols/secondarypdpcontextumtsdriver/spudman/inc/spudman.h
changeset 0 3553901f7fa8
child 24 6638e7f4bd8f
--- /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 <e32base.h>
+#include <comms-infras/nifif.h>
+#include <networking/umtsnifcontrolif.h>
+#include <comms-infras/commsdebugutility.h>
+#include <networking/mspudmaninterface.h>
+
+#include "rpdpfsminterface.h"
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <comms-infras/nifprvar_internal.h>
+#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<KMaxProtocolName> 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<TInetAddr> 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