//Editor-Info: -*- C++ -*-
//
//Subject: TOVE project / gsmpswitch
//
//File: gsmpswitchprotocol.h
//
//Version: $Revision: 1.1 $
//
//State: $State: Exp $
//
//Date: $Date: 1998/08/03 11:40:43 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications Software and Multimedia
//
//Author:
//      Sami Raatikainen
//
//Description:
//
//
//Copyright:
//
//
//Licence:
//
//
//History: 

#ifndef __GSMPSWITCH_GSMPSWITCHPROTOCOL_H__
#define __GSMPSWITCH_GSMPSWITCHPROTOCOL_H__


#include "pf/conduit.h"
#include <typeinfo>
#include <map>

#include "pf/protocol.h"                       // Class pfProtocol

#include "protocol/gsmp/gsmpdefs.h"            // General definitions
#include "protocol/gsmp/gsmpexceptions.h"      // Exceptions
#include "protocol/gsmp/gsmptimeouts.h"


#include "protocol/gsmp/gsmppoint.h"


//#include "gsnprotocol.h"

//
//Class: gsmpSwitchProtocol
//

class gsmpSwitchProtocol : public pfProtocol
{
    public:        
        static pfConduit create(void) throw (pfMemoryAllocationException);

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

        virtual pfProtocol *cloneImplementation(void)
            throw (pfMemoryAllocationException);

        // Methods to change parameters

        void toGsmpSwitchIdleState(void);
        void toGsmpSwitchActiveState(void);
        void initializePorts(void);
        
        // Methods for incoming requests

        pfBoolean addBranch(gsmpAddBranchMessage *message_);
        pfBoolean deleteBranch(gsmpDeleteBranchMessage *message_);
        pfBoolean deleteAll(pfUlong port_);

        
        // Access methods
        
        void addGsnProxy(gsmpPoint &input_, pfConduit &proxy_);
        void removeGsnProxy(gsmpPoint &input_);

        pfBoolean portExists(pfUlong portNumber_) const;
        void makeConfigurationEntry(pfUlong portNumber_);
        
        pfUlong getPortSessionNumber(pfUlong portNumber_) const;
        void setPortSessionNumber(pfUlong portNumber_,
                                  pfUlong portSessionNumber);
        void setVPIRange(pfUlong portNumber_,
                         pfUlong minVPI_,
                         pfUlong maxVPI_);
        pfUlong getMinVPI(pfUlong portNumber_) const;
        pfUlong getMaxVPI(pfUlong portNumber_) const;
        void setVCIRange(pfUlong portNumber_,
                         pfUlong minVCI_,
                         pfUlong maxVCI_);
        pfUlong getMinVCI(pfUlong portNumber_) const;
        pfUlong getMaxVCI(pfUlong portNumber_) const;
        pfUlong getCellRate(pfUlong portNumber_) const;
        void setCellRate(pfUlong portNumber_,
                         pfUlong cellRate_);
        pfByte getPortStatus(pfUlong portNumber_) const;
        void setPortStatus(pfUlong portNumber_,
                           pfByte portStatus_);
        pfByte getPortType(pfUlong portNumber_) const;
        void setPortType(pfUlong portNumber_,
                         pfByte portType_);
        pfByte getLineStatus(pfUlong portNumber_) const;
        void setLineStatus(pfUlong portNumber_,
                           pfByte lineStatus_);
        pfByte getPriorities(pfUlong portNumber_) const;
        void setPriorities(pfUlong portNumber_,
                           pfByte priorities_);
                
        
    protected:
        gsmpSwitchProtocol(void);
        
    private:
//        typedef map<pfUlong, pfConduit, less<pfUlong> > conduitMap;
//        typedef conduitMap::iterator conduitIterator;
//        typedef conduitMap::value_type conduitValue;
                
        typedef map<gsmpPoint, pfConduit, less<gsmpPoint> > gsnMap;
        typedef gsnMap::iterator gsnIterator;
        typedef gsnMap::value_type gsnValue;

        typedef map<pfUlong, pfStorage, less<pfUlong> > configurationMap;
        typedef configurationMap::iterator configurationIterator;
        typedef configurationMap::const_iterator constConfigurationIterator;
        typedef configurationMap::value_type configurationValue;
        
        
        // Map for saving connections
        gsnMap _connectionMap;
        
        // Map for saving proxies to user modules (conduits)
//        conduitMap _proxyMap;

        // Map for event proxies
//        conduitMap _eventProxyMap;
        
        // Map for configuration information
        configurationMap _portDataMap;
};

#endif // __GSMPSWITCH_GSMPSWITCHPROTOCOL_H__











