//Editor-Info: -*- C++ -*-
//
//Subject: SF + PF + OmniBroker test
//
//File: conduittest.cpp
//
//Version: $Revision: 1.2 $
//
//State: $State: Exp $
//
//Date: $Date: 1997/08/21 12:58:09 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications Software and Multimedia
//
//Author:
//      Juhana Räsänen
//
//Description:
//      Helper classes for conduits with CORBA demo
//
//Copyright:
//
//
//Licence:
//
//
//History: 

#include "pf/protocol.h"
#include "pf/state.h"
#include "pf/messenge.h"
#include "pf/timers.h"

static const int NUMBER_OF_TEST_ROUNDS = 1000;
static const int DEFAULT_TIMEOUT = 100;
static const char * const TIMERNAME = "TEST_TIMER";

class loopMessage;
class loopState;


class loopProtocol : public pfProtocol
{
    public:
        loopProtocol(int nTimeouts_, pfUlong timeout_);
        void decrementN(void) {_nTimeouts--;};
        int getN(void) {return _nTimeouts;};

    private:
        int _nTimeouts;
};

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

class loopState : public pfState
{
    public:
        virtual void loopMessageAct(loopMessage *messenger_,
                                    loopProtocol *protocol_);
        virtual void loopTimeoutAct(loopProtocol *protocol_);
};

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

class loopMessage : public pfMessenger
{
    public:
        loopMessage(int id_, int counter_ = NUMBER_OF_TEST_ROUNDS)
            {_id = id_; _counter = counter_;};
        loopMessage(const loopMessage &other_)
            {_id = other_._id; _counter = other_._counter;};
        virtual void apply(pfState *state_,
                           pfProtocol *protocol_);
        void decrementCounter(void) {_counter--;};
        int getId(void) {return _id;};
        int getCounter(void) {return _counter;};

    private:
        int _id;
        int _counter;
};

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

class loopTimeout : public pfTimerMessenger
{
    public:
        loopTimeout(void);
        loopTimeout(const loopTimeout &other_);
        ~loopTimeout(void);

        virtual void apply(pfState *state_,
                           pfProtocol *protocol_);
        virtual pfTimerMessenger *clone(void) const;
};
