//Editor-Info: -*- C++ -*-
//
//Subject: TOVE-project / NNI-AAL interface
//
//File: naalupprimitives.h
//
//Version: $Revision: 1.11 $
//
//State: $State: Exp $
//
//Date: $Date: 1998/09/01 08:35:55 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications and Multimedia
//
//Author:
//      Juhana Räsänen
//
//Description:
//      NAAL-xx.{indication,confirm} primitive (from NNI-SSCF to Layer 3)
//      definitions as a OVOPS++ messenger classes.
//      Get/set methods for primitive parametes are defined; names of
//      the parameters correspond to those of Q.2140
//
//Copyright:
//
//
//Licence:
//
//
//History:
 

#ifndef __NAALUPPRIMITIVES_H__
#define __NAALUPPRIMITIVES_H__

#include "pf/messenge.h"
#include "pf/types.h"
#include "pf/frame.h"
#include "pf/state.h"

class pfProtocol;


///////////////////////////////////////////////////////////////////
// class naalRECEIVED_MESSAGEind
// class naalLINK_CONGESTEDind
// class naalLINK_CONGESTION_CEASEDind
// class naalIN_SERVICEind
// class naalOUT_OF_SERVICEind
// class naalRETRIEVED_MESSAGESind
// class naalRETRIEVAL_COMPLETEind
// class naalBSNTconf
// class naalBSNT_NOT_RETRIEVABLEconf
//
// Primitive messenger classes: each class below represents one
// (N)AAL upward (indication, confirm) primitive and its parameters
// as a OVOPS++ messenger. If primitive has parameters, get- and set
// methods for those are defined.

//
//Class: naalUpPrimitives
//
//Description:
//    Base class for all up primitives of naal interface.
//    This class provides AAL link identifier for upper protocols.
//

class naalUpPrimitives : public pfMessenger
{
    public:
        naalUpPrimitives(void);
        virtual ~naalUpPrimitives(void);
        void setAALidentifier(pfKey AALid_);
        pfKey getAALidentifier(void) const;
};
 
class naalRECEIVED_MESSAGEind : public naalUpPrimitives
{
    public:
        naalRECEIVED_MESSAGEind(void);
        virtual ~naalRECEIVED_MESSAGEind(void);

        virtual void apply(pfState *state_, pfProtocol *protocol_);
        void setMessageUnit(const pfFrame &frame_);
        pfFrame getMessageUnit(void) const;

    private:
        pfFrame _messageUnit;
};

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

class naalLINK_CONGESTEDind : public naalUpPrimitives
{
    public:
        naalLINK_CONGESTEDind(void);
        virtual ~naalLINK_CONGESTEDind(void);
        
        virtual void apply(pfState *state_, pfProtocol *protocol_);
        void setCongestion(pfUlong congestion_);
        pfUlong getCongestion(void) const;

    private:
        pfUlong _congestion;
};

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

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

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

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

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

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

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

class naalRETRIEVED_MESSAGESind : public naalUpPrimitives
{
    public:
        naalRETRIEVED_MESSAGESind(void);
        virtual ~naalRETRIEVED_MESSAGESind(void);

        virtual void apply(pfState *state_, pfProtocol *protocol_);
        void setMessageUnit(const pfFrame &frame_);
        pfFrame getMessageUnit(void) const;

    private:
        pfFrame _messageUnit;
};

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

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

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

class naalBSNTconf : public naalUpPrimitives
{
    public:
        naalBSNTconf(void);
        virtual ~naalBSNTconf(void);
        
        virtual void apply(pfState *state_, pfProtocol *protocol_);
        void setBSNT(pfUlong bsnt_);
        pfUlong getBSNT(void) const;

    private:
        pfUlong _BSNT;
};

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

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


/////////////////////////////////////////////////////////////////////
// Class naalUpInputs
//
// Pure virtual interface class for all protocol states using
// Network AAL-interface (between Layer 3 protocols and NNI-SSCF)
// upward primitive messengers (indications and confirms to Layer 3)
// defined above

class naalUpInputs
{
    public:
        virtual void naalRECEIVED_MESSAGEindAct(
            naalRECEIVED_MESSAGEind *messenger_,
            pfProtocol *protocol_) = 0;
        virtual void naalLINK_CONGESTEDindAct(
            naalLINK_CONGESTEDind *messenger_,
            pfProtocol *protocol_) = 0;
        virtual void naalLINK_CONGESTION_CEASEDindAct(
            naalLINK_CONGESTION_CEASEDind *messenger_,
            pfProtocol *protocol_) = 0;
        virtual void naalIN_SERVICEindAct(
            naalIN_SERVICEind *messenger_,
            pfProtocol *protocol_) = 0;
        virtual void naalOUT_OF_SERVICEindAct(
            naalOUT_OF_SERVICEind *messenger_,
            pfProtocol *protocol_) = 0;
        virtual void naalRETRIEVED_MESSAGESindAct(
            naalRETRIEVED_MESSAGESind *messenger_,
            pfProtocol *protocol_) = 0;
        virtual void naalRETRIEVAL_COMPLETEindAct(
            naalRETRIEVAL_COMPLETEind *messenger_,
            pfProtocol *protocol_) = 0;
        virtual void naalBSNTconfAct(
            naalBSNTconf *messenger_,
            pfProtocol *protocol_) = 0;
        virtual void naalBSNT_NOT_RETRIEVABLEconfAct(
            naalBSNT_NOT_RETRIEVABLEconf *messenger_,
            pfProtocol *protocol_) = 0;
};


#endif // __NAALUPPRIMITIVES_H__
