//Editor-Info: -*- C++ -*-
//
//Subject: TOVE project
//
//File: gsmpadjacencyprotocolmessage.h 
//
//State: $State: Exp $
//
//Version: $Revision: 1.5 $
//
//Date: $Date: 1998/06/18 05:21:56 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications Software and Multimedia
// 
//Author:
//      Harri Sunila
//
//Description:
//      Classes for GSMP Adjacency Protocol messengers
//
//Copyright:    
//      Copyright 1999 Helsinki University of Technology
//      ALL RIGHTS RESERVED BETWEEN JANUARY 1996 AND JUNE 1999.
//      
//Licence:
//     
//
//History:
//
//

#ifndef __GSMP_GSMPADJACENCYPROTOCOLMESSAGE_H__
#define __GSMP_GSMPADJACENCYPROTOCOLMESSAGE_H__

#include <string>
#include "gsmpmessage.h"
#include "gsmpdefs.h"
#include "gsmpstate.h"
#include "gsmpadjacencystate.h"

//
// Class: gsmpAdjacencyProtocolMessage
//
// Description:
//     Base class for GSMP Adjacency Protocol messages  
//

class gsmpAdjacencyProtocolMessage : public gsmpMessage
{
    public:
        // Definitions for Adjacency Protocol Messages

        static const pfByte GSMP_ADJACENCY_MESSAGE = 10;
        static const pfByte GSMP_ADJACENCY_RESULT = 0;

        // Codes for Adjacency Protocol Messages
        static const pfByte SYN = 1;
        static const pfByte SYNACK = 2;
        static const pfByte ACK = 3;
        static const pfByte RSTACK = 4;

        gsmpAdjacencyProtocolMessage(
	    const gsmpAdjacencyProtocolMessage &other_);
        virtual ~gsmpAdjacencyProtocolMessage(void);
        virtual gsmpAdjacencyProtocolMessage *clone(void);

        virtual pfFrame encodeFrame(void);
        virtual void decodeFrame(pfFrame &other_);

        string getSenderName(void) const;
        string getReceiverName(void) const;
        pfUlong getSenderPort(void) const;
        pfUlong getReceiverPort(void) const;
        pfUlong getSenderInstance(void) const;
        pfUlong getReceiverInstance(void) const;
        
    protected:
        gsmpAdjacencyProtocolMessage(void);
        gsmpAdjacencyProtocolMessage(string &senderName_,
                                     string &receiverName_,
                                     pfUlong senderPort_,
                                     pfUlong receiverPort_,
                                     pfUlong senderInstance_,
                                     pfUlong receiverInstance_);
        string _senderName;
        string _receiverName;
        pfUlong _senderPort;
        pfUlong _receiverPort;
        pfUlong _senderInstance;
        pfUlong _receiverInstance;
};

//
// Class: gsmpAdjacencyProtocolSYNmessage
//
// Description:
//     Class for GSMP Adjacency Protocol SYN messages  
//

class gsmpAdjacencyProtocolSYNmessage : public gsmpAdjacencyProtocolMessage
{
    public:
        gsmpAdjacencyProtocolSYNmessage(void);
        gsmpAdjacencyProtocolSYNmessage(string &senderName_,
					string &receiverName_,
					pfUlong senderPort_,
					pfUlong receiverPort_,
					pfUlong senderInstance_,
					pfUlong receiverInstance_);
        gsmpAdjacencyProtocolSYNmessage(
	    const gsmpAdjacencyProtocolSYNmessage &other_);
        virtual ~gsmpAdjacencyProtocolSYNmessage(void);
        virtual gsmpAdjacencyProtocolSYNmessage *clone(void);
        void apply(pfState *state_, pfProtocol *protocol_);
};

//
// Class: gsmpAdjacencyProtocolSYNACKmessage
//
// Description:
//     Class for GSMP Adjacency Protocol SYNACK messages  
//

class gsmpAdjacencyProtocolSYNACKmessage : public gsmpAdjacencyProtocolMessage
{
    public:
        gsmpAdjacencyProtocolSYNACKmessage(void);
        gsmpAdjacencyProtocolSYNACKmessage(string &senderName_,
					   string &receiverName_,
					   pfUlong senderPort_,
					   pfUlong receiverPort_,
					   pfUlong senderInstance_,
					   pfUlong receiverInstance_);
        gsmpAdjacencyProtocolSYNACKmessage(
	    const gsmpAdjacencyProtocolSYNACKmessage &other_);
        virtual ~gsmpAdjacencyProtocolSYNACKmessage(void);
        virtual gsmpAdjacencyProtocolSYNACKmessage *clone(void);
        void apply(pfState *state_, pfProtocol *protocol_);
};

//
// Class: gsmpAdjacencyProtocolACKmessage
//
// Description:
//     Class for GSMP Adjacency Protocol ACK messages  
//

class gsmpAdjacencyProtocolACKmessage : public gsmpAdjacencyProtocolMessage
{
    public:
        gsmpAdjacencyProtocolACKmessage(void);
        gsmpAdjacencyProtocolACKmessage(string &senderName_,
					string &receiverName_,
					pfUlong senderPort_,
					pfUlong receiverPort_,
					pfUlong senderInstance_,
					pfUlong receiverInstance_);
        gsmpAdjacencyProtocolACKmessage(
	    const gsmpAdjacencyProtocolACKmessage &other_);
        virtual ~gsmpAdjacencyProtocolACKmessage(void);
        virtual gsmpAdjacencyProtocolACKmessage *clone(void);
        void apply(pfState *state_, pfProtocol *protocol_);
};

//
// Class: gsmpAdjacencyProtocolRSTACKmessage
//
// Description:
//     Class for GSMP Adjacency Protocol RSTACK messages  
//

class gsmpAdjacencyProtocolRSTACKmessage : public gsmpAdjacencyProtocolMessage
{
    public:
        gsmpAdjacencyProtocolRSTACKmessage(void);
        gsmpAdjacencyProtocolRSTACKmessage(string &senderName_,
					   string &receiverName_,
					   pfUlong senderPort_,
					   pfUlong receiverPort_,
					   pfUlong senderInstance_,
					   pfUlong receiverInstance_);
        gsmpAdjacencyProtocolRSTACKmessage(
	    const gsmpAdjacencyProtocolRSTACKmessage &other_);
        virtual gsmpAdjacencyProtocolRSTACKmessage *clone(void);
        virtual ~gsmpAdjacencyProtocolRSTACKmessage(void);
        void apply(pfState *state_, pfProtocol *protocol_);
};

#endif // __GSMP_GSMPADJACENCYPROTOCOLMESSAGE_H__
