//Editor-Info: -*- C++ -*-
//
//Subject: TOVE project / 
//
//File: bisupprotocol.h
//
//Version: $Revision: 1.20 $
//
//State: $State: Exp $
//
//Date: $Date: 1999/03/10 09:34:16 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications Software and Multimedia
//
//Author:
//      Sami Raatikainen
//
//Description:
//      B-ISDN User Part protocol implementation. (Q.2761 - Q.2764)
//
//Copyright:
//      Copyright 1999 Helsinki University of Technology
//      ALL RIGHTS RESERVED BETWEEN JANUARY 1996 AND JUNE 1999.
//
//Licence:
//
//
//History: 

#ifndef __BISUP_BISUPPROTOCOL_H__
#define __BISUP_BISUPPROTOCOL_H__

#include <typeinfo>
#include "pf/types.h"
#include "protocol/sig/sigprotocol.h"
#include "nnimessages.h"

class bisupProtocol : public sigProtocol
{
    public:
        static bisupProtocol *create(void);
        
        bisupProtocol(const bisupProtocol &other_);
        virtual ~bisupProtocol(void);
        pfProtocol *cloneImplementation(void) const;
        
        void createConduitsConnection(void);       
        
        
        // Methods to send pdus to NI
        virtual void sendIAMpduToDown(sigSETUPreq *primitive_);
        virtual void sendIAApduToDown(sigPROCEEDINGreq *primitive_);
        virtual void sendIARpduToDown(sigRELEASEresp *primitive_);
        virtual void sendACMpduToDown(sigALERTINGreq *primitive_);
        //virtual void sendCPGpduToDown(sigPROGRESSreq *primitive_);
        virtual void sendANMpduToDown(sigSETUPresp *primitive_);
        virtual void sendRELpduToDown(sigRELEASEreq *primitive_);
        virtual void sendRELpduToDown(pfUlong cause_);
        virtual void sendRLCpduToDown(sigRELEASEresp *primitive_);
        
        void saveDSID(pfMessenger *msg_);

        // Methods called from FSMs
        void startIAAtimer(void);
        void stopIAAtimer(void);
        void startACMtimer(void);
        void stopACMtimer(void);
        void startANMtimer(void);
        void stopANMtimer(void);
        void startRLCtimer(void);
        void stopRLCtimer(void);

        void incomingResourcesRejectedAct(sigRELEASEresp *primitive_);
        void releaseCollisionAct(nniRELpdu *primitive_);
        
        void stopAllTimers(void);
        void reportIncompatibleMessage(pfMessenger *message_);
        void setCallReference(pfMessenger *message_);
        
        virtual void clearCall(pfUlong cause_);
        virtual void startReleaseProcess(pfUlong cause_);

        
    private:
        bisupProtocol(void);
        pfIE *_DSID;
        
        // Timeout values
        typedef unsigned long timeoutValue;
        timeoutValue _T1bvalue;
        timeoutValue _T7bvalue;
        timeoutValue _T9bvalue;
        timeoutValue _T40bvalue;
        
        void initTimers(void);
};

#endif //__BISUP_BISUPPROTOCOL_H__
