//Editor-Info: -*- C++ -*-
//
//Subject: TOVE project / OVOPS++
//
//File: pftest.h
//
//Version: $Revision: 1.3 $
//
//State: $State: Exp $
//
//Date: $Date: 1998/06/10 00:14:21 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications Software and Multimedia
//
//Author:
//      Timo Pärnänen
//
//Description:
//      Header file for classes of test conduits
//
//Copyright:
//
//
//Licence:
//
//
//History: 

#include <typeinfo>
#include "pf/types.h"
#include "pf/protocol.h"
//#include "pf/mux.h"
#include "pf/adapter.h"
#include "pf/state.h"
#include "pf/messenge.h"
#include "pf/transp.h"

class pfTestSETUPind;
class pfTestDATAind;
class pfTestRELEASEind;

class pfTestSETUPreq;
class pfTestDATAreq;
class pfTestRELEASEreq;

class pfTestAdapterState;
class pfTestUpProtocolState;
class pfTestDownProtocolState;
//class pfTestUpMuxState;
//class pfTestDownMuxState;

//----------------------------------------------------------------------

class pfTestUpAdapter : public pfAdapter
{
    public:
        pfTestUpAdapter(int counter_ = 0);
        int decrementCounter(void);
        int getCounter(void) const;

    private:
        int _counter;
};

//----------------------------------------------------------------------

class pfTestDownAdapter : public pfAdapter
{
    public:
        pfTestDownAdapter(void);
};

//----------------------------------------------------------------------
/*
class pfTestUpMux : public pfMux
{
    public:
        pfTestUpMux(void);
};
*/
//----------------------------------------------------------------------
/*
class pfTestDownMux : public pfMux
{
    public:
        pfTestDownMux(void);
};
*/
//----------------------------------------------------------------------

class pfTestUpProtocol : public pfProtocol
{
    public:
        pfTestUpProtocol(void);
};

//----------------------------------------------------------------------

class pfTestDownProtocol : public pfProtocol
{
    public:
        pfTestDownProtocol(void);
};

//----------------------------------------------------------------------

class pfTestState : public pfState
{
    public:
        // Up
        virtual void testSETUPindAct(pfTestSETUPind *messenger_,
                                     pfProtocol *protocol_);
        virtual void testDATAindAct(pfTestDATAind *messenger_,
                                    pfProtocol *protocol_);
        virtual void testRELEASEindAct(pfTestRELEASEind *messenger_,
                                       pfProtocol *protocol_);

        // Down
        virtual void testSETUPreqAct(pfTestSETUPreq *messenger_,
                                     pfProtocol *protocol_);
        virtual void testDATAreqAct(pfTestDATAreq *messenger_,
                                    pfProtocol *protocol_);
        virtual void testRELEASEreqAct(pfTestRELEASEreq *messenger_,
                                       pfProtocol *protocol_);
};

//----------------------------------------------------------------------

class pfTestUpProtocolState : public pfTestState
{
    public:
        static pfTestUpProtocolState *instance(void);

        // From down
        virtual void testDATAindAct(pfTestDATAind *messenger_,
                                    pfProtocol *protocol_);
        virtual void testRELEASEindAct(pfTestRELEASEind *messenger_,
                                       pfProtocol *protocol_);

        // From up
        virtual void testSETUPreqAct(pfTestSETUPreq *messenger_,
                                     pfProtocol *protocol_);
        virtual void testDATAreqAct(pfTestDATAreq *messenger_,
                                    pfProtocol *protocol_);
        virtual void testRELEASEreqAct(pfTestRELEASEreq *messenger_,
                                       pfProtocol *protocol_);

    protected:
        pfTestUpProtocolState(void);
        virtual ~pfTestUpProtocolState(void);

    private:
        static pfTestUpProtocolState *_only;
};

//----------------------------------------------------------------------

class pfTestDownProtocolState : public pfTestState
{
    public:
        static pfTestDownProtocolState *instance(void);

        // From down
        virtual void testSETUPindAct(pfTestSETUPind *messenger_,
                                     pfProtocol *protocol_);
        virtual void testDATAindAct(pfTestDATAind *messenger_,
                                    pfProtocol *protocol_);
        virtual void testRELEASEindAct(pfTestRELEASEind *messenger_,
                                       pfProtocol *protocol_);
        // From up
        virtual void testDATAreqAct(pfTestDATAreq *messenger_,
                                    pfProtocol *protocol_);
        
        virtual void testRELEASEreqAct(pfTestRELEASEreq *messenger_,
                                       pfProtocol *protocol_);
        
    protected:
        pfTestDownProtocolState(void);
        virtual ~pfTestDownProtocolState(void);

    private:
        static pfTestDownProtocolState *_only;
};

//----------------------------------------------------------------------

class pfTestAdapterState : public pfTestState
{
    public:
        static pfTestAdapterState *instance(void);

        // From down
        virtual void testDATAindAct(pfTestDATAind *messenger_,
                                    pfProtocol *protocol_);

        // From up
        virtual void testDATAreqAct(pfTestDATAreq *messenger_,
                                    pfProtocol *protocol_);

    protected:
        pfTestAdapterState(void);
        virtual ~pfTestAdapterState(void);

    private:
        static pfTestAdapterState *_only;
};

//----------------------------------------------------------------------

class pfTestVisitor : public pfTransporter
{
    public:
        pfTestVisitor(pfMessenger *messenger_);
        virtual void atAdapter(pfAdapter *const adapter_);
        
    private:
        pfMessenger *_messenger;
};

//----------------------------------------------------------------------

class pfTestBaseMessage : public pfMessenger
{
    public:
        pfTestBaseMessage(void);

        void setKey(pfKey key_);
        pfKey getKey(void) const;        
};

//----------------------------------------------------------------------

class pfTestSETUPind : public pfTestBaseMessage
{
    public:
        virtual void apply(pfState *state_,
                           pfProtocol *protocol_);
};

//----------------------------------------------------------------------

class pfTestDATAind : public pfTestBaseMessage
{
    public:
        virtual void apply(pfState *state_,
                           pfProtocol *protocol_);
};

//----------------------------------------------------------------------

class pfTestRELEASEind : public pfTestBaseMessage
{
    public:
        virtual void apply(pfState *state_,
                           pfProtocol *protocol_);
};

//----------------------------------------------------------------------

class pfTestSETUPreq : public pfTestBaseMessage
{
    public:
        virtual void apply(pfState *state_,
                           pfProtocol *protocol_);
};

//----------------------------------------------------------------------

class pfTestDATAreq : public pfTestBaseMessage
{
    public:
        virtual void apply(pfState *state_,
                           pfProtocol *protocol_);
};

//----------------------------------------------------------------------

class pfTestRELEASEreq : public pfTestBaseMessage
{
    public:
        virtual void apply(pfState *state_,
                           pfProtocol *protocol_);
};

// END OF FILE



