diff -r 000000000000 -r af10295192d8 networkcontrol/qosfwconfig/qos/inc/negotiation.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/networkcontrol/qosfwconfig/qos/inc/negotiation.h Tue Jan 26 15:23:49 2010 +0200 @@ -0,0 +1,154 @@ +// Copyright (c) 2006-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: +// + + + +/** + @internalComponent +*/ +#ifndef __NEGOTIATION_H__ +#define __NEGOTIATION_H__ + +#include +#include + +#include "module_if.h" // ..MQoSNegotiateEvent is used as a base class of CNegotiateItem +#include "qosparameters.h" // ..TQoSParameters is a member variable! +#include "pfqoslib.h" // ..TPfqosMessage is a member variable! + +class CNegotiateItem; +class CInternalQoSChannel; +class RModule; +class MQoSNegotiateEvent; +class CFlowHook; +class TExtensionData; + +// Base class for QoS sessions +class CQoSSessionBase : public CBase + { +public: + CQoSSessionBase(CFlowHook& aHook, TInt aChannelId); + ~CQoSSessionBase(); + virtual void Run(); + virtual void SubRequestComplete(TInt aEvent, const TQoSParameters* aParams, const TExtensionData& aExtension, CNegotiateItem* aItem); + +protected: + void DeliverEvent(TUint16 aEvent); + void FatalError(TInt aErrorCode); + CInternalQoSChannel* Channel() const; + + virtual TInt DoCall(RModule &aModule, MQoSNegotiateEvent& aCallback) = 0; + virtual void RequestComplete() = 0; +private: + void Proceed(); + +protected: + CFlowHook& iHook; // Flow hook owner of this session + RPointerArray& iModuleList; // The modules to be run (from the flow hook) + const TInt iChannelId; // > 0, if session associates with a channel + + TInt iError; // Error code + TBool iFatalError; // If set, stop negotiation + TUint16 iValue; // Return value + TInt iCurrent; // The current module to be run (0..) + TInt iProceed; // Non-zero when control in Proceed() + TQoSParameters iNegotiated; // + TPfqosMessage iMsg; // PF_QOS reply msg + TSglQue iPending; // Pending request queue + }; + +// Negotiate session +class CNegotiateSession : public CQoSSessionBase + { +public: + CNegotiateSession(CFlowHook& aHook); + ~CNegotiateSession(); + +private: + TInt DoCall(RModule& aModule, MQoSNegotiateEvent& aCallback); + void RequestComplete(); + }; + + +// Create channel session +class CCreateChannelSession : public CQoSSessionBase + { +public: + CCreateChannelSession(CFlowHook& aHook, TInt aChannelId); + ~CCreateChannelSession(); + +private: + TInt DoCall(RModule &aModule, MQoSNegotiateEvent& aCallback); + void RequestComplete(); + }; + + +// Negotiate channel session +class CNegotiateChannelSession : public CQoSSessionBase + { +public: + CNegotiateChannelSession(CFlowHook& aHook, TInt aChannelId); + ~CNegotiateChannelSession(); + +private: + TInt DoCall(RModule& aModule, MQoSNegotiateEvent& aCallback); + void RequestComplete(); + }; + +// Join session +class CJoinSession : public CQoSSessionBase + { +public: + CJoinSession(CFlowHook& aHook, TInt aChannelId); + ~CJoinSession(); + +private: + TInt DoCall(RModule& aModule, MQoSNegotiateEvent& aCallback); + void RequestComplete(); + }; + +// Leave session +class CLeaveSession : public CQoSSessionBase + { +public: + CLeaveSession(CFlowHook& aHook, TInt aChannelId); + ~CLeaveSession(); + +private: + TInt DoCall(RModule& aModule, MQoSNegotiateEvent& aCallback); + void RequestComplete(); + }; + + +class CNegotiateItem : public CBase, public MQoSNegotiateEvent + // BEWARE: + // Once you start the negotiation and pass a reference of MQosNegotiateEvent + // to the module, there is no way to cancel this request. This object MUST exist + // until the RequestComplete is called! + { +public: + ~CNegotiateItem(); + CNegotiateItem(CQoSSessionBase* aSession, TUint aFlags); + void Kill(); + void RequestComplete(TInt aEvent, const TQoSParameters* aParams, const TExtensionData& aExtension); + inline TUint Flags() const { return iFlags; }; + + TSglQueLink iLink; +private: + TUint iFlags; // Module flags + CQoSSessionBase* iSession; // Session (or NULL, when ZOMBIE) + }; + +#endif