diff -r 000000000000 -r 3553901f7fa8 telephonyprotocols/gprsumtsqosprt/inc/context.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telephonyprotocols/gprsumtsqosprt/inc/context.h Tue Feb 02 01:41:59 2010 +0200 @@ -0,0 +1,191 @@ +// Copyright (c) 2007-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: +// + +#ifndef __CONTEXT_H__ +#define __CONTEXT_H__ + +#include // ..for TContextConfig, etc.. +#include + +#include "parameters.h" // ..for TPacketFilter, etc.. + +class CRequestBase; +class TFTInfo; +class RExtensionData; +class CFlowData; +class CNif; + +/* + * The returned sblp sub error should be between 1-7 in the PCO buffer + * see TS 29.207, annex D for details + */ +enum TSblpSubErrorRange + { + ESblpSubErrorValueMinimum = 1, + ESblpSubErrorValueMaximum = 7 + }; + + +const TUint KMaxPacketFilters = 8; + +class RContextConfig : public TContextConfig + /** + * Add some access functions to the TContextConfig + */ + { +public: + // Allow access to TFTInfo without needing a copy + inline TTFTInfo& TFTInfo() { return iTFTInfo; } + }; + +class CPdpContext : public CBase + { + friend class CNif; + friend class CRequestBase; +public: + + static CPdpContext* NewL(CNif& aNifItem, const TContextType& aType, TUint8 aContextId); + + ~CPdpContext(); + + TInt Activate(); + void ActivateReply(CRequestBase* aRequest, const TContextParameters& aParams); + + TInt ModifyActive(); + void ModifyActiveReply(CRequestBase* aRequest, const TContextParameters& aParams); + + TInt SetQoS(); + TInt SetQoS(const TQoSParameters& aGeneric, const TQoSRequested& aUmts); + void SetQoSReply(CRequestBase* aRequest, const TContextParameters& aParams); + + TInt ModifyTft(const TTFTOperationCode& aTFTOperationCode, const TTFTInfo& aTft); + void ModifyTftReply(CRequestBase* aRequest, const TContextParameters& aParams); + + void ParametersChangedEvent(const TContextParameters& aParams); + void DeleteEvent(const TContextParameters& aParams); + + TInt Delete(); + TInt AddPacketFilter(CFlowData& aFlow, TTFTInfo& aTft); + TInt RemovePacketFilter(TTFTInfo& aTft, const CFlowData* aFlow = NULL); + + void Block(); + void UnBlock(); + inline TUint IsFlowBlocked() const; + + void FlowAttached(); + void FlowDetached(); + void SetContextStatus(const RPacketContext::TContextStatus& aStatus); + + TInt GetQoSRanking(); + TBool IsPrimary() const; + + inline TInt RefCount() const; + inline TInt ContextId() const; + inline TInt ChannelId() const; + inline void SetChannelId(TInt aChannelId); + inline CNif& Nif(); + inline const RExtensionData& Extension() const; + inline TBool ContextActive() const; + inline TBool ContextInactive() const; + inline RPacketContext::TContextStatus ContextStatus() const; + inline TInt TrafficClass() const; + inline TDblQue& Flows(); + inline TContextType ContextType() const; + +protected: + TSglQueLink iNext; + + CPdpContext(CNif& aNifItem, TContextType aType, TUint8 aContextId); + static TBool CheckSblpErrorInPcoBuffer(const TContextParameters& aParams, TUint8& parsedSblpErrorValue); + + void ConstructL(); + void GenerateEvent(TUint aEventType, const TContextParameters& aParams); + TBool MatchPacketFilter(const TPacketFilter& aFlow, const TPacketFilter& aFilter) const; + TInt FindPacketFilterId(); + void Update(const TContextParameters& aParams); + +private: + void NotifyBlockingState(TUint aOldBlocking); + + TInt iRefs; // count of attached flows (just for information) + + // Blocked/Unblocked status as indicated by NIF. If NIF reports + // "blocked", the context stays blocked until NIF reports "unblock" + // This is totally independent of context status and flow blocking: + // flows are blocked if context is "blocked" *OR* status is not active. + TUint8 iBlocked; + + TUint8 iContextId; + TInt iChannelId; + TContextType iContextType; + RPacketContext::TContextStatus iContextStatus; + + CNif& iNifItem; // Nif interface + TDblQue iFlows; // Flow list + + // Currently Active filters. + TInt iNumFilters; + TPacketFilter iFilters[KMaxPacketFilters]; + + // Current parameters/configuration + TQoSNegotiated iNegotiated; +public: + // Timeout handling + void Timeout(); + RTimeout iTimeout; + }; + +// inline methods +inline TContextType CPdpContext::ContextType() const + { return iContextType; } + +inline TInt CPdpContext::ContextId() const + { return iContextId; } + +inline TInt CPdpContext::ChannelId() const + { return iChannelId; } + +inline void CPdpContext::SetChannelId(TInt aChannelId) + { iChannelId = aChannelId; } + +inline CNif& CPdpContext::Nif() + { return iNifItem; } + +inline TInt CPdpContext::RefCount() const + { return iRefs; } + +inline TBool CPdpContext::ContextActive() const + { return (iContextStatus == RPacketContext::EStatusActive); } + +inline TBool CPdpContext::ContextInactive() const + { return (iContextStatus == RPacketContext::EStatusInactive); } + +inline RPacketContext::TContextStatus CPdpContext::ContextStatus() const + { return iContextStatus; } + +inline TInt CPdpContext::TrafficClass() const + { return iNegotiated.iTrafficClass; } + +inline TDblQue& CPdpContext::Flows() + { return iFlows; } + +inline TUint CPdpContext::IsFlowBlocked() const + // Flows are blocked if either explicit blocking from NIF is on, + // or the context is not active. + { return iBlocked || !ContextActive(); } + +typedef TDblQueIter TDblFlowIter; + +#endif