--- /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 <networking/umtsnifcontrolif.h> // ..for TContextConfig, etc..
+#include <timeout.h>
+
+#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<CFlowData>& 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<CFlowData> 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<CFlowData>& 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<CFlowData> TDblFlowIter;
+
+#endif