//Editor-Info: -*- C++ -*-
//
//Subject: TOVE-project / NNI-AAL interface
//
//File: naaldownprimitives.h
//
//Version: $Revision: 1.11 $
//
//State: $State: Exp $
//
//Date: $Date: 1998/06/12 10:46:49 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications and Multimedia
//
//Author:
//      Juhana Räsänen
//      Timo Pärnänen
//
//Description:
//      NAAL-xx.{request,response} primitive (from Layer 3 to NNI-SSCF)
//      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 __NAALDOWNPRIMITIVES_H__
#define __NAALDOWNPRIMITIVES_H__

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

class pfProtocol;
class pfState;


///////////////////////////////////////////////////////////////////
// class naalDownPrimitives
//
// class naalMESSAGE_FOR_TRANSMISSIONreq
// class naalEMERGENCYreq
// class naalEMERGENCY_CEASESreq
// class naalSTOPreq
// class naalSTARTreq
// class naalRETRIEVE_BSNTreq
// class naalRETRIEVAL_REQUEST_AND_FSNCreq
// class naalFLUSH_BUFFERSreq
// class naalCONTINUEreq
//
// Primitive messenger classes: each class below represents one
// (N)AAL downward (request, response) primitive and its parameters
// as a OVOPS++ messenger. If primitive has parameters, get- and set
// methods for those are defined.

//
//Class: naalDownPrimitives
//
//Description:
//    Base class for all down primitives of naal interface. This
//    class give to AAL connection mux a mechanism to find a key
//    for AAL connection selection.
//

class naalDownPrimitives : public pfMessenger
{
    public:
        naalDownPrimitives(void);
        virtual ~naalDownPrimitives(void);
        void setAALidentifier(pfKey AALid_);
};

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

class naalMESSAGE_FOR_TRANSMISSIONreq : public naalDownPrimitives
{
    public:
        naalMESSAGE_FOR_TRANSMISSIONreq(void);
        virtual ~naalMESSAGE_FOR_TRANSMISSIONreq(void);

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

    private:
        pfFrame _messageUnit;
};

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

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

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

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

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

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

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

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

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

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

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

class naalRETRIEVAL_REQUEST_AND_FSNCreq : public naalDownPrimitives
{
    public:
        naalRETRIEVAL_REQUEST_AND_FSNCreq(void);
        virtual ~naalRETRIEVAL_REQUEST_AND_FSNCreq(void);
        
        virtual void apply(pfState *state_, pfProtocol *protocol_);
        void setFSNC(pfUlong fsnc_);
        pfUlong getFSNC(void) const;

    private:
        pfUlong _FSNC;
};

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

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

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

class naalCONTINUEreq : public naalDownPrimitives
{
    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)
// downward primitive messengers (requests and responses from Layer 3)
// defined above

class naalDownInputs
{
    public:
        virtual void naalMESSAGE_FOR_TRANSMISSIONreqAct(
            naalMESSAGE_FOR_TRANSMISSIONreq *messenger_,
            pfProtocol *protocol_) = 0;
        virtual void naalEMERGENCYreqAct(
            naalEMERGENCYreq *messenger_,
            pfProtocol *protocol_) = 0;
        virtual void naalEMERGENCY_CEASESreqAct(
            naalEMERGENCY_CEASESreq *messenger_,
            pfProtocol *protocol_) = 0;
        virtual void naalSTOPreqAct(
            naalSTOPreq *messenger_,
            pfProtocol *protocol_) = 0;
        virtual void naalSTARTreqAct(
            naalSTARTreq *messenger_,
            pfProtocol *protocol_) = 0;
        virtual void naalRETRIEVE_BSNTreqAct(
            naalRETRIEVE_BSNTreq *messenger_,
            pfProtocol *protocol_) = 0;
        virtual void naalRETRIEVAL_REQUEST_AND_FSNCreqAct(
            naalRETRIEVAL_REQUEST_AND_FSNCreq *messenger_,
            pfProtocol *protocol_) = 0;
        virtual void naalFLUSH_BUFFERSreqAct(
            naalFLUSH_BUFFERSreq *messenger_,
            pfProtocol *protocol_) = 0;
        virtual void naalCONTINUEreqAct(
            naalCONTINUEreq *messenger_,
            pfProtocol *protocol_) = 0;
};

#endif // __NAALDOWNPRIMITIVES_H__
