//Editor-Info: -*- C++ -*-
//
//Subject: TOVE project
//
//File: gsmpprotocol.h
//
//Version: $Revision: 1.10 $
//
//State: $State: Exp $
//
//Date: $Date: 1998/12/10 10:27:00 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications Software and Multimedia
//
//Author:
//      Harri Sunila
//
//Description:
//      Declaration for GSMP Protocol. Implements the GSMP Protocol
//      functionality and messages. described in
//      RFC 1987.
//
//Copyright:
//      Copyright 1999 Helsinki University of Technology
//      ALL RIGHTS RESERVED BETWEEN JANUARY 1996 AND JUNE 1999.
//
//Licence:
//
//
//History: 

#ifndef __GSMP_GSMPPROTOCOL_H__
#define __GSMP_GSMPPROTOCOL_H__

#include "gsmpdefs.h"            // General definitions
#include "gsmptimeouts.h"
#include "gsmptimermapvalue.h"
#include "pf/protocol.h"         // Class pfProtocol  
#include "pf/conduit.h"
//#include "gsmpconfigure.h"
#include <typeinfo>
#include <map>

class gsmpProtocol : public pfProtocol
{
    public:
        typedef map<pfUlong, pfConduit, less<pfUlong> > conduitMap;
        typedef conduitMap::iterator conduitIterator;
        typedef conduitMap::value_type conduitValue;
        
        typedef map<pfUlong, gsmpTimerMapValue, less<pfUlong> > timerMap;
        typedef timerMap::iterator timerIterator;
        typedef timerMap::value_type timerValue;

        typedef map<pfUlong, pfUlong, less<pfUlong> > integerMap;
        typedef integerMap::iterator integerIterator;
        typedef integerMap::value_type integerValue;
        
        static pfConduit create(void);

        gsmpProtocol(const gsmpProtocol &other_);
        virtual ~gsmpProtocol(void);

        virtual pfProtocol *cloneImplementation(void);

        virtual void accept(pfTransporter *transporter_);
        
        // Methods to change parameters

        void gsmpResponseTimeoutOccured(pfUlong transactionIdentifier_);
        void toGsmpIdleState(void);
        void toGsmpActiveState(void);
        
        void acceptResponse(pfUlong transactionIdentifier_,
                            gsmpMessage *message_);
        void acceptEvent(gsmpMessage *message_);
        
        // Access methods
        
        void addProxy(pfUlong transactionIdentifier_,
                      pfConduit &proxy_);
        void removeProxy(pfUlong transactionIdentifier_);

        void addTimer(pfUlong transactionIdentifier_,
                      pfByte messageType_,
                      pfUlong function_ = 0);
        void removeTimer(pfUlong transactionIdentifier_);
        
        pfUlong getPortSessionNumber(pfUlong portNumber_) const;
        void setPortSessionNumber(pfUlong portNumber_,
                                  pfUlong portSessionNumber);
        void removePortSessionNumber(pfUlong portNumber_);
        
        void sendGsmpPortConfigurationRequestMessage(pfUlong port_);

        void sendGsmpAllPortsConfigurationRequestMessage(void);
        
        void registerEventListener(pfUlong transactionIdentifier_);

        void unRegisterEventListener(gsmpForgetEventsMessage *message_);

        void resetEventFlags(pfUlong port_,
                             pfByte eventFlags_);

        // Tools
        static pfUlong generateTransactionIdentifier(void);
        
    protected:
        gsmpProtocol(void);
        
    private:
        // Map for saving proxies to user modules (conduits)
        conduitMap _proxyMap;

        // Map for event proxies
        conduitMap _eventProxyMap;
        
        // Configuration information
//        gsmpConfigure _configuration; 

        // Map for timers.
        timerMap _timerMap;

        // Map for Port Session Numbers
        integerMap _portSessionNumberMap;
        
        // Timer expiration interval.
        pfUlong _responseTimeout;

        // Static member for generation of an unique transaction identifier.
        static pfUlong _transactionIdentifier;
};

#endif // __GSMP_GSMPPROTOCOL_H__
