//Editor-Info: -*- C++ -*-
//
//Subject: TOVE project / SIG
//
//File: sigprotocol.h
//
//Version: $Revision: 1.13 $
//
//State: $State: Exp $
//
//Date: $Date: 1999/03/10 09:34:05 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications Software and Multimedia
//
//Author:
//      Sami Raatikainen
//
//Description:
//      Sig protocol conduit implementation. This conduit is connection-
//      oriented so instances are created dynamically above a mux. It
//      implements the main functionality of a signaling protocol.
//
//Copyright:
//      Copyright 1999 Helsinki University of Technology
//      ALL RIGHTS RESERVED BETWEEN JANUARY 1996 AND JUNE 1999.
//
//Licence:
//
//
//History: 

#ifndef __SIG_SIGPROTOCOL_H__
#define __SIG_SIGPROTOCOL_H__

class sigPrimitive;
class sigSETUPreq;
class sigSETUPresp;
class sigPROCEEDINGreq;
class sigALERTINGreq;
class sigRELEASEreq;
class sigRELEASEresp;
class sigRESETreq;
class sigRESETresp;
class sigRESET_ERRORresp;
class sigSETUPind;
class sigSETUPconf;
class sigSETUP_COMPLETEind;
class sigPROCEEDINGind;
class sigALERTINGind;
class sigRELEASEind;
class sigRELEASEconf;
class sigRESETind;
class sigRESETconf;
class sigRESET_ERRORind;

#include "sigmode.h"
#include "sigdefs.h"
#include "pf/protocol.h"
#include "pf/messenge.h"
#include "pf/bytes.h"

class sigProtocol : public pfProtocol
{
    public:
        sigProtocol(const sigProtocol &other_);
        virtual ~sigProtocol(void);
        
        virtual void setMode(sigMode *mode_);
        virtual bool isNetworkMode(void);
        

        // To CC (Application Process)
        virtual void toCC(pfMessenger *receivedMsg_,
                          sigPrimitive *sendMsg_);
        
        virtual void sendSETUPindToCC(pfMessenger *primitive_);
        virtual void sendPROCEEDINGindToCC(pfMessenger *primitive_);
        virtual void sendALERTINGindToCC(pfMessenger *primitive_);
        virtual void sendPROGRESSindToCC(pfMessenger *primitive_);
        virtual void sendSETUPconfToCC(pfMessenger *primitive_);
        virtual void sendSETUP_COMPLETEindToCC(pfMessenger *primitive_);
        virtual void sendRELEASEindToCC(pfMessenger *primitive_);
        virtual void sendRELEASEindToCC(pfUlong cause_);        
        virtual void sendRELEASEconfToCC(pfMessenger *primitive_);
        virtual void sendRELEASEconfToCC(pfUlong cause_);
        
        virtual void sendRESET_ERRORindToCC(pfMessenger *primitive_);
        virtual void sendRESETconfToCC(pfMessenger *primitive_);
        virtual void sendRESETindToCC(pfMessenger *primitive_);
        
        
        // To Down (Coordination functions)
        virtual void toDown(sigPrimitive *primitive_,
                            pfMessenger *sendMsg_);
        

        // UNI State changes (for DSS1, etc)
        virtual void changeToNullState(void);
        virtual void changeToCallInitiatedState(void);
        virtual void changeToOutgoingCallProceedingState(void);
        virtual void changeToCallDeliveredState(void);
        virtual void changeToCallPresentState(void);
        virtual void changeToCallReceivedState(void);
        virtual void changeToUserConnectRequestState(void);
        virtual void changeToNetworkConnectRequestState(void);
        virtual void changeToIncomingCallProceedingState(void);
        virtual void changeToActiveState(void);
        virtual void changeToReleaseRequestState(void);
        virtual void changeToReleaseIndicationState(void);


        // NNI State changes (for ISUP and BISUP)
        virtual void changeToIdleState(void);
        virtual void changeToAwaitIAAState(void);
        virtual void changeToAwaitACMState(void);
        virtual void changeToAwaitANMState(void);
        virtual void changeToAwaitAcceptedReqState(void);
        virtual void changeToAwaitAnswerState(void);
        virtual void changeToAwaitAddressCompReqState(void);
        virtual void changeToCallAnsweredState(void);
        virtual void changeToAwaitRLCState(void);
        virtual void changeToAwaitReleaseRespState(void);
        virtual void changeToRELCollisionState(void);

        
        // Miscellaneous pure virtual methods
        virtual void stopAllTimers(void) = 0;
        virtual void reportIncompatibleMessage(pfMessenger *message_) = 0;
        virtual void setCallReference(pfMessenger *message_) = 0;
        
        
        // Clearing instances
        virtual void finalClearing(void);
        

        // Multipoint features enable possible pmp implementations
        virtual void setZeroEndpointReferenceAtOSide(pfMessenger *message_);
        virtual void setZeroEndpointReferenceAtTSide(pfMessenger *message_);
        virtual void setZeroEndpointReference(pfMessenger *message_);

        virtual void setMultipointConnection(void);
        virtual bool isMultipointConnection(void);

    protected:
        sigProtocol(void);
        sigMode *_mode;
        
        virtual void saveMessage(pfMessenger *msg_);
        virtual pfMessenger *getSavedMessage(void);
        virtual void clearSavedMessage(void);
        
        virtual void setCause(pfMessenger *primitive_, pfUlong cause_);
        
        enum sigLocation
        {
            sigLocation_User                       = B0000_0000,
            sigLocation_PrivateNWServingLocalUser  = B0000_0001,
            sigLocation_PublicNWServingLocalUser   = B0000_0010,
            sigLocation_TransitNW                  = B0000_0011,
            sigLocation_PublicNWServingRemoteUser  = B0000_0100,
            sigLocation_PrivateNWServingRemoteUser = B0000_0101,
            sigLocation_InternationalNW            = B0000_0111,
            sigLocation_NWBeyondIWPoint            = B0000_1010
        };
        void setLocation(sigLocation location_);
        pfUlong getLocation(void);
        
    private:
        bool _multipoint;
        sigLocation _location;
        pfMessenger *_savedMsg;
};

#endif // __SIG_SIGPROTOCOL_H__
