// Copyright (c) 2005-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:
// Header for etel driver context class
// 
//

/**
 @file 
 @internalComponent
*/

#ifndef CETELDRIVERCONTEXT_H
#define CETELDRIVERCONTEXT_H

#include <e32base.h>
#include <etelmm.h>
#include <etelqos.h>
#include <networking/umtsnifcontrolif.h>
#include <pcktretrieve.h>

#include "eteldrivernmspace.h"
#include "PDPFSM.h"
#include "meteldriverstrategy.h"
#include "pdpfsmnmspace.h"


class CEtelDriverFactory;

//using namespace EtelDriver;
/** 
 A data storage for pdp context 

 @internalComponent
*/
class CEtelDriverContext : public CActive
	{
public:
	static CEtelDriverContext* NewL(TContextId aId, SpudMan::TPdpContextType aContextType, CEtelDriverFactory& aFactory);
	virtual ~CEtelDriverContext();

	TInt Input (EtelDriver::TEtelInput aOperation);
	
	void StartNotifications() const;
	void StopNotifications() const;

	// CActive methods
	
	/** accessors, basic */
	inline TContextId Id() const;
	inline SpudMan::TPdpContextType ContextType() const;
	inline TName& Name();
	inline TRequestStatus& CompletionStatus();
	MEtelDriverStrategy::TSequenceStep StrategyStep() const;
	inline void SetStrategyStep (MEtelDriverStrategy::TSequenceStep aStep);

		
	/** accessors, eTel objects */
	inline RPacketQoS& PacketQoS();
	inline RPacketContext&	PacketContext();

    inline RPacketMbmsContext& MbmsPacketContext();


	RPhone& Phone() const;
	RPacketService& PacketService() const;
	CPdpFsmInterface& PdpFsmInterface() const;
	const TName& ExistingContextName() const;

	/** context data accessors */
	
	inline TRequestedProfileBuffer& QosRequested();
	inline TNegotiatedProfileBuffer& QosNegotiated();
	
	inline TPacketDataConfigBase& ContextPacketDataConfigBase();
	inline TDes8& ContextConfig();
	inline RPacketMbmsContext::TContextConfigMbmsV1& ContextConfigMbms();

	inline TRequestedProfileBufferPckg& QosRequestedPckg();
	inline TNegotiatedProfileBufferPckg& QosNegotiatedPckg();
	inline EtelDriver::TContextConfigGPRSPckg& ContextConfigGPRSPckg();
	inline EtelDriver::TContextConfigMbmsV1Pckg& ContextConfigMbmsPckg();
	inline TInt SessionId();
	inline RPacketContext::TDataChannelV2& DataChannelV2();
	inline RPacketContext::TDataChannelV2Pckg& DataChannelV2Pckg();
	inline TTFTInfo& TftInfo();
	inline RPacketContext::TPacketFilterV2& FilterV2();
	inline RPacketContext::TPacketFilterV2Pckg& FilterV2Pckg();
	inline TUint8 TftRequested() const;
	inline TInt FirstFilterV2();
	inline TInt NextFilterV2();
	inline TTFTOperationCode& TftOperationCode();
	inline TSessionOperatioInfo& GetSessionInfo() ;
	inline TInt GetSessionIndex() const;
	inline void SetSessionIndex(const TInt aSessionIndex);
	inline void SetRetrievePcktMbmsSessionList(CRetrievePcktMbmsSessionList* aPcktContextSessionList);
	inline CRetrievePcktMbmsSessionList* RetrievePcktMbmsSessionList();
	inline void SetMbmsSession(RPacketMbmsContext::CMbmsSession* aMbmsSesion);
	inline RPacketMbmsContext::CMbmsSession* MbmsSession();

    inline RPacketContext::TContextStatus& ContextStatus();	
	
#ifdef _DEBUG
    void DumpReqProfileParameters ();
    void DumpNegProfileParameters ();
#endif
		
protected:
	MEtelDriverStrategy& Strategy(EtelDriver::TEtelDriverStrategy aId) const;

	// CActive methods
	virtual void RunL();
	virtual void DoCancel();

private:
	CEtelDriverContext (TContextId aId, SpudMan::TPdpContextType aContextType, CEtelDriverFactory& aFactory);
	void ConstructL();

protected:
	/** ID */
	TContextId				iId;
	/* context type */
	SpudMan::TPdpContextType  	iContextType;
	/** tsy name of a context */
	TName					iName;
	/** request status */
	TRequestStatus			iCompletionStatus;
	/** active strategy step */
	MEtelDriverStrategy::TSequenceStep iStrategyStep;
	/** id of active strategy */
	EtelDriver::TEtelDriverStrategy 	iStrategyId;

	/** packet QoS */
	RPacketQoS				iPacketQoS;
	/** packet context */
	RPacketContext			iPacketContext;
	
	// factory data:
	/** etel driver factory */
	CEtelDriverFactory& 	iFactory;

	// data from pdp fsm
	// all members below contain valid data for limited time only, 
	//    i.e. for the duration of a strategy OR a duration of a single call to etel
	/** Requested QoS */
    TRequestedProfileBuffer iQosRequested;
    TRequestedProfileBufferPckg iQosRequestedPckg;

	/** Negotiated QoS */
    TNegotiatedProfileBuffer iQosNegotiated;
    TNegotiatedProfileBufferPckg iQosNegotiatedPckg;
    
	/** context config */
	RBuf8 iContextConfig;
	/** tft info */
	TTFTInfo							iTftInfo;
	/** data channel V2 */
	RPacketContext::TDataChannelV2		iDataChannelV2;
	/** packaged data channel V2 */
	RPacketContext::TDataChannelV2Pckg	iDataChannelV2Pckg;
	
	/*mbms packet context*/
    RPacketMbmsContext	iMbmsPacketContext;	
	CRetrievePcktMbmsSessionList* iPcktMbmsSessionList;
	RPacketMbmsContext::CMbmsSession* iMbmsSession;
	RPacketMbmsContext::TContextConfigMbmsV1 		iContextConfigMbms;
	RPacketMbmsContext::TContextConfigMbmsV1Pckg 	iContextConfigMbmsPckg;
	TSessionOperatioInfo iSessionInfo;
	TInt iSessionIndex;

	
private:
	// TFT data
	/** local var for tft count */
	TUint8								iTftRequested;
	/** local V2 filter */
	RPacketContext::TPacketFilterV2		iFilterV2;
	/** local packaged V2 filter */
	EtelDriver::TPacketFilterV2Pckg		iFilterV2Pckg;
	/** TFT Operation Code */
	TTFTOperationCode					iTftOperationCode;

	RPacketContext::TContextStatus      iContextStatus;
	};


// inlines
/** accessor 

@return id of first V2 filter 
*/
inline TInt CEtelDriverContext::FirstFilterV2()
	{ 
	iTftInfo.SetToFirst();
	iTftRequested = 0;
	return iTftInfo.NextPacketFilter(iFilterV2);
	}

/** accessor 

@return id of next V2 filter
*/
inline TInt CEtelDriverContext::NextFilterV2()
	{
	TInt err = iTftInfo.NextPacketFilter(iFilterV2);
	if (err == KErrNone)
		{
		++iTftRequested;
		}
	return err;
	}

/** accessor 

@return context id 
*/
inline TContextId CEtelDriverContext::Id() const
	{ 
	return iId; 
	}


/** accessor 

@return context id 
*/
inline SpudMan::TPdpContextType CEtelDriverContext::ContextType() const
	{ 
	return iContextType; 
	}




/** accessor 

@return reference to name of pdp context
*/
inline TName& CEtelDriverContext::Name()
	{ 
	return iName; 
	}

/** accessor 

@return reference to request status
*/
inline TRequestStatus& CEtelDriverContext::CompletionStatus()
	{ 
	return iCompletionStatus; 
	}

/** accessor 

@return strategy sequence step 
*/
inline MEtelDriverStrategy::TSequenceStep CEtelDriverContext::StrategyStep() const
	{ 
	return iStrategyStep; 
	}

/** sets strategy sequence step 

@param aStep - strategy sequence step 
*/
inline void CEtelDriverContext::SetStrategyStep(MEtelDriverStrategy::TSequenceStep aStep)
	{ 
	iStrategyStep = aStep; 
	}
	
/** accessor

@return reference to etel packet QoS
*/
inline RPacketQoS& CEtelDriverContext::PacketQoS() 
	{ 
	return iPacketQoS; 
	}

/** accessor 

@return reference to etel packet context
*/
inline RPacketContext&	CEtelDriverContext::PacketContext()
	{ 
	return iPacketContext; 
	}

/** accessor 

@return reference to mbms etel packet context
*/
inline RPacketMbmsContext&	CEtelDriverContext::MbmsPacketContext()
	{ 
	return iMbmsPacketContext; 
	}


inline TSessionOperatioInfo& CEtelDriverContext::GetSessionInfo() 
	{
	return iSessionInfo;
	}
inline TInt CEtelDriverContext::GetSessionIndex() const
	{
	return iSessionIndex;
	}
inline void  CEtelDriverContext::SetSessionIndex(const TInt aSessionIndex)
	{
	iSessionIndex=aSessionIndex;
	}
	
	
inline void CEtelDriverContext::SetRetrievePcktMbmsSessionList(CRetrievePcktMbmsSessionList* aPcktContextSessionList)
	{
	iPcktMbmsSessionList= aPcktContextSessionList;
	}
	
inline CRetrievePcktMbmsSessionList* CEtelDriverContext::RetrievePcktMbmsSessionList()
	{
	return 	iPcktMbmsSessionList;
	}	

inline void CEtelDriverContext::SetMbmsSession(RPacketMbmsContext::CMbmsSession* aMbmsSession)
	{
	iMbmsSession=aMbmsSession;
	}

inline RPacketMbmsContext::CMbmsSession* CEtelDriverContext::MbmsSession()
	{
	return iMbmsSession;
	}
	
	
// context data accessors
/**
accessor 
@return reference to QoSR5Requested
*/

inline TRequestedProfileBuffer& CEtelDriverContext::QosRequested()
	{ 
	return iQosRequested; 
	}


inline TNegotiatedProfileBuffer& CEtelDriverContext::QosNegotiated()
	{ 
	return iQosNegotiated;
	}




	

/** accessor 

@return reference to TRequestedProfileBufferPckg
*/
inline TRequestedProfileBufferPckg& CEtelDriverContext::QosRequestedPckg()
	{ 
	return iQosRequestedPckg; 
	}

/**
accessor 
@return reference to TNegotiatedProfileBufferPckg
*/
inline TNegotiatedProfileBufferPckg& CEtelDriverContext::QosNegotiatedPckg()
	{ 
	return iQosNegotiatedPckg; 
	}


/**
accessor 
@return reference to ContextConfig as PacketDataConfigBase
*/
inline TPacketDataConfigBase& CEtelDriverContext::ContextPacketDataConfigBase()
	{ 
	return *const_cast<TPacketDataConfigBase*>(reinterpret_cast<const TPacketDataConfigBase*>(iContextConfig.Ptr())); 
	}
/** accessor 

@return reference to ContextConfigMbmsPckg
*/
	
inline RPacketMbmsContext::TContextConfigMbmsV1& CEtelDriverContext::ContextConfigMbms()
	{
	return iContextConfigMbms;
	}
	
	

/** accessor 

@return reference to ContextConfig
*/
inline TDes8& CEtelDriverContext::ContextConfig()
	{ 
	return iContextConfig; 
	}



inline EtelDriver::TContextConfigMbmsV1Pckg& CEtelDriverContext::ContextConfigMbmsPckg()	
	{
	return iContextConfigMbmsPckg;
	}




/** accessor 

@return reference to packet context' DataChannelV2
*/
inline RPacketContext::TDataChannelV2& CEtelDriverContext::DataChannelV2()
	{ 
	return iDataChannelV2; 
	}

/** accessor 

@return reference to packet context' DataChannelV2Pckg
*/
inline RPacketContext::TDataChannelV2Pckg& CEtelDriverContext::DataChannelV2Pckg()
	{ 
	return iDataChannelV2Pckg; 
	}

/** accessor 

@return reference to TFT info
*/
inline TTFTInfo& CEtelDriverContext::TftInfo()
	{ 
	return iTftInfo; 
	}

/** accessor 

@return reference to packet context' PacketFilterV2
*/
inline RPacketContext::TPacketFilterV2& CEtelDriverContext::FilterV2()
	{ 
	return iFilterV2; 
	}

/** accessor 

@return reference to packet context' PacketFilterV2Pckg
*/
inline RPacketContext::TPacketFilterV2Pckg& CEtelDriverContext::FilterV2Pckg()
	{ 
	return iFilterV2Pckg; 
	}

/** accessor 

@return requested TFT
*/
inline TUint8 CEtelDriverContext::TftRequested() const
	{ 
	return iTftRequested; 
	}

/** accessor 

@return reference to TFT operation code
*/
inline TTFTOperationCode& CEtelDriverContext::TftOperationCode()
	{
	return iTftOperationCode;
	}


/** accessor 

@return reference to ContextStatus
*/
inline RPacketContext::TContextStatus& CEtelDriverContext::ContextStatus()
	{
	return iContextStatus;
	}

#endif
// CETELDRIVERCONTEXT_H
