//Editor-Info: -*- C++ -*-
//
//Subject: TOVE project / OVOPS++
//
//File: messenger.h
//
//Version: $Revision: 1.31 $
//
//State: $State: Exp $
//
//Date: $Date: 1999/03/08 11:05:15 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications Software and Multimedia
// 
//Authors:
//      Pasi Nummisalo
//      Timo Pärnänen
//      Juhana Räsänen
//      Timo Kokkonen
//
//Description:
//      A Messenger represents an event or an operation that is going
//      to be invoked on the FSM of Protocols that it encounters as
//      it is passed through the graph of conduits.
//
//      Command pattern encapsulates a request as an object, thereby letting
//      you parameterize clients with different request.
//
//Copyright:    
//      Copyright 1999 Helsinki University of Technology
//      ALL RIGHTS RESERVED BETWEEN JANUARY 1996 AND JUNE 1999.
//
//      
//Licence:
//     
//
//History:
//
//
 
#ifndef __PF_MESSENGER_H__
#define __PF_MESSENGER_H__

class pfAdapter;
class pfProtocol;
class pfState;

#include <typeinfo>
#include <string>
#include "types.h"
#include "storage.h"

class pfMessenger : public pfStorage
{
    public:
	typedef unsigned long SerialNumber;
        typedef unsigned long pfKey;

        virtual ~pfMessenger(void);
        virtual void apply(pfState *state_, pfProtocol *protocol_);
        virtual pfMessenger *clone(void);

        virtual pfUlong getSequenceNumber(void) const;
        virtual void setSequenceNumber(pfUlong sequenceNumber_);
        virtual pfKey getDispatchKey(string &keyName_) const;

        void incRefCount(void);
        void decRefCount(void);
        virtual bool isReference(void) const;

	virtual SerialNumber getSerialNumber(void) const;
	// SerialNumber for transporters and messengers
	static SerialNumber getNextSerialNumber(void);

    protected:
        pfMessenger(void);
        pfMessenger(const pfMessenger &other_); 
           
    private:
	typedef unsigned long MessengerReferenceCount;
	static SerialNumber _nextSerialNumber;
        SerialNumber _serialNumber;
	MessengerReferenceCount _refCount;
        pfUlong _sequenceNumber;
};

#endif // __PF_MESSENGER_H__

