//Editor-Info: -*- C++ -*-
//
//Subject: TOVE project / UNI
//
//File: unimode.h
//
//Version: $Revision: 1.9 $
//
//State: $State: Exp $
//
//Date: $Date: 1998/12/08 14:53:48 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications Software and Multimedia
//
//Author:
//      Jari Katajavuori
//      Sami Raatikainen (based on Revision: 1.14)
//
//Description:
//      UNI needs to operate in two distinct modes: user and network
//      modes. These classes implements both modes. Their instances can
//      be given as a parameter for uniProtocol class.
//
//Copyright:
//      Copyright 1999 Helsinki University of Technology
//      ALL RIGHTS RESERVED BETWEEN JANUARY 1996 AND JUNE 1999.
//
//Licence:
//
//
//History: 

#ifndef __UNI_UNIMODE_H__
#define __UNI_UNIMODE_H__

#include "protocol/sig/sigmode.h"

class uniUserMode : public sigMode
{
    public:
        static uniUserMode *instance(void);
        virtual ~uniUserMode(void);
        
        bool isNetworkMode(void);
        void setZeroEndpointReference(
            pfMessenger *message_,
            sigProtocol *protocol_);
        
        pfState *createNullState(void);
        pfState *createCallInitiatedState(void);
        pfState *createOutgoingCallProceedingState(void);
        pfState *createCallDeliveredState(void);
        pfState *createCallPresentState(void);
        pfState *createCallReceivedState(void);
        pfState *createUserConnectRequestState(void);
        pfState *createNetworkConnectRequestState(void);
        pfState *createIncomingCallProceedingState(void);
        pfState *createActiveState(void);
        pfState *createReleaseRequestState(void);
        pfState *createReleaseIndicationState(void);
        
    private:
        uniUserMode(void);
        static uniUserMode *_only;
};

class uniNetworkMode : public sigMode
{
    public:
        static uniNetworkMode *instance(void);
        virtual ~uniNetworkMode(void);
        
        bool isNetworkMode(void);
        void setZeroEndpointReference(
            pfMessenger *message_,
            sigProtocol *protocol_);
        
        pfState *createNullState(void);
        pfState *createCallInitiatedState(void);
        pfState *createOutgoingCallProceedingState(void);
        pfState *createCallDeliveredState(void);
        pfState *createCallPresentState(void);
        pfState *createCallReceivedState(void);
        pfState *createUserConnectRequestState(void);
        pfState *createNetworkConnectRequestState(void);
        pfState *createIncomingCallProceedingState(void);
        pfState *createActiveState(void);
        pfState *createReleaseRequestState(void);
        pfState *createReleaseIndicationState(void);
        
    private:
        uniNetworkMode(void);
        static uniNetworkMode *_only;
};

#endif // __UNI_UNIMODE_H__
