//Editor-Info: -*- C++ -*-
//
//Subject: TOVE project
//
//File: gsmpmessage.h
//
//State: $State: Exp $
//
//Version: $Revision: 1.6 $
//
//Date: $Date: 1998/10/19 18:14:01 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications Software and Multimedia
// 
//Author:
//      Harri Sunila
//
//Description:
//      gsmpMessage is a base class for all different GSMP-messages.
//
//Copyright:
//      Copyright 1999 Helsinki University of Technology
//      ALL RIGHTS RESERVED BETWEEN JANUARY 1996 AND JUNE 1999.
//      
//Licence:
//     
//
//History:
//
//

#ifndef __GSMP_GSMPMESSAGE_H__
#define __GSMP_GSMPMESSAGE_H__

#include "pf/frame.h"
#include "pf/messenge.h"
#include "pf/storage.h"
#include "gsmpdefs.h"

//
// Class: gsmpMessage
//
// Description:
//        gsmpMessage is the base class for all different kinds of messages.
//

class gsmpMessage : public pfMessenger
{
    public:

        // Definitions for different kind of messages

        static const pfByte VC_ACTIVITY = 48;
        static const pfByte PORT_STATISTICS = 49;
        static const pfByte VC_STATISTICS = 50;

        static const pfByte SWITCH_CONFIGURATION = 64;
        static const pfByte PORT_CONFIGURATION = 65;
        static const pfByte ALL_PORTS_CONFIGURATION = 66;

        // Definition for max number of Port recods in one
        // All Ports Configuration response message

        static const pfUlong MAXIMUM_PORT_RECORD_NUMBER = 64;

        // Definition for the current length of a port record
        
        static const pfUlong PORT_RECORD_LENGTH = 24;
        
        // Definition for maximum number of VC Activity Records

        static const pfUlong MAXIMUM_ACTIVITY_RECORD_NUMBER = 120;

        // Definitions for different flags

        static const pfUlong GSMP_FLAG_BIT_0 = 0x8; // MSB bit of the field
        static const pfUlong GSMP_FLAG_BIT_1 = 0x4; 
        static const pfUlong GSMP_FLAG_BIT_2 = 0x2;
        static const pfUlong GSMP_FLAG_BIT_3 = 0x1;  // LSB bit of the field
        
        static const pfUlong GSMP_FLAG_MASK = 0xF000;
        static const pfUlong GSMP_VPI_MASK = 0xFFF;
        
        // Definitions for result field in gsmp messages

        static const pfByte GSMP_NO_SUCCESS_ACK = 0x01;
        static const pfByte GSMP_ACK_ALL = 0x02;
        static const pfByte GSMP_SUCCESS = 0x03;
        static const pfByte GSMP_FAILURE = 0x04;

        // Definition for the LLC/SNAP header

        static const pfByte LLC_SNAP_HEADER[8];

        // Definition of the GSMP switch name length
        
        static const pfUlong GSMP_SWITCH_NAME_LENGTH = 6;
        
        // Definitions for error codes.
        // Notation is from Ipsilon GSMP Generic Source Notes, April 26, 1996.

        static const pfByte GSMP_E_SUCCESS = 0;     // Success
        static const pfByte GSMP_E_UNSPECIFIED = 1; // Unspecified reason
        static const pfByte GSMP_E_INVALID_REQ = 2; // Invalid request messages
        static const pfByte GSMP_E_NOT_IMPL = 3;    // Request not implemented
        static const pfByte GSMP_E_INVAL_PORT_SESS = 4;
        static const pfByte GSMP_E_PORT_NOT_EXIST = 5;
        static const pfByte GSMP_E_PORT_DOWN = 6;
        static const pfByte GSMP_E_VPCI_RANGE = 7;
        static const pfByte GSMP_E_CONN_NO_EXIST = 8;
        static const pfByte GSMP_E_BRANCH_NO_EXIST = 9;
        static const pfByte GSMP_E_MULTI_PORT_USED = 10;
        static const pfByte GSMP_E_MC_MAX_CONN_LIM = 11;
        static const pfByte GSMP_E_MC_MAX_BRNCH_LIM = 12;
        static const pfByte GSMP_E_MC_VPCI_INVAL = 13;
        static const pfByte GSMP_E_MC_SUPPORT = 14;
        static const pfByte GSMP_E_NO_RESOURCE = 15;
        static const pfByte GSMP_E_MSG_SPECIFIC = 16;

        gsmpMessage(void);
        gsmpMessage(const gsmpMessage &other_);
        virtual ~gsmpMessage(void);
        static gsmpMessage *create(pfFrame &frame_);
        const gsmpMessage &operator=(const gsmpMessage &other_);
        virtual gsmpMessage *clone(void) = 0;
        
        // Methods common to all messages

        pfByte getMessageType(void) const;
        pfByte getResult(void) const;
        pfByte getCode(void) const;
        pfUlong getTransactionIdentifier(void) const;
        
        void setResult(pfByte result_);
        void setCode(pfByte code_);
        void setTransactionIdentifier(pfUlong transactionIdenifier_);
        
        void setFailureResponse(pfByte code_);

        bool isResponse(void);
        
        virtual void decodeFrame(pfFrame &frame_) = 0;
        virtual pfFrame encodeFrame(void) = 0;

    protected:
        // Definitions for constants

        static const pfByte GSMP_INVALID_MESSAGE = 0;
        static const pfUlong GSMP_MESSAGE_TYPE_LOCATION = 9;
        static const pfUlong GSMP_MESSAGE_CODE_LOCATION = 11;
        static const pfUlong GSMP_MESSAGE_FUNCTION_LOCATION = 30;

        static const pfUlong GSMP_COUNTER_LENGTH = 8;

        // Different kind of default settings

        static const pfByte GSMP_CURRENT_VERSION = 1;
        
        pfFrame _frame;
        
        pfByte _version;
        pfByte _messageType;
        pfByte _result;
        pfByte _code;
        pfUlong _transactionIdentifier;

};
 
#endif	// __GSMP_GSMPMESSAGE_H__









