//Editor-Info: -*- C++ -*-
//
//Subject: TOVE project / SW
//
//File: swatmport.h
//
//Version: $Revision: 1.5 $
//
//State: $State: Exp $
//
//Date: $Date: 1999/02/24 16:41:18 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications Software and Multimedia
//
//Author:
//      Timo Pärnänen
//
//Description:
//
//
//Copyright:
//      Copyright 1999 Helsinki University of Technology
//      ALL RIGHTS RESERVED BETWEEN JANUARY 1996 AND JUNE 1999.
//
//Licence:
//
//
//History: 

#ifndef __SW_ATMPORT_H__
#define __SW_ATMPORT_H__

#include <typeinfo>
#include <string>
#include "protocol/saal/saallink.h"
#include <map>
#include <set>
#include "swport.h"
#include "iface/swif/swportconfig.h"

class swIlmiImpl;

//
//Class: swAtmPort
//

class swAtmPort : public swPort,
                  public swPortConfig
{
    public:
        explicit swAtmPort(const string &portType_);
        swAtmPort(const swAtmPort &other_);

        virtual ~swAtmPort(void);
        virtual swPort *clone(pfUlong portNumber_);

        virtual void addUNIlink(pfUlong linkNumber_);
        virtual void addNNIlink(pfUlong linkNumber_,
                                pfUlong destinationPointCode_);

        void addNNISAALlink(pfUlong linkNumber_,
                            pfUlong vpi_,
                            pfUlong vci_);

        void removeSaalLink(pfUlong linkNumber_);

        // Callback
        virtual void success(pfUlong identifier_);
        virtual void failure(pfUlong identifier_, pfUlong cause_);

        // swPortConfig interface
        virtual void setMinVPI(pfUlong VPI_);
        virtual void setMaxVPI(pfUlong VPI_);
        virtual void setMinVCI(pfUlong VCI_);
        virtual void setMaxVCI(pfUlong VCI_);

        virtual ieConnectionInfo *reserveResources(void);
        virtual ieConnectionInfo *reserveResources(
            ieConnectionInfo *suggestedInfo_);
        virtual void freeResources(ieConnectionInfo *info_);
        
    private:
        void makeFabricConnection(pfUlong vpi_, 
                                  pfUlong vci_, 
                                  pfUlong linkNumber_);

    private:
        swIlmiImpl *_ilmi;

        // typedefs
        typedef map<pfUlong, saalLink*, less<pfUlong> > saalMapType;
        typedef saalMapType::iterator saalMapIterType;
        typedef saalMapType::const_iterator saalMapConstIterType;

        typedef map<pfUlong, pfUlong, less<pfUlong> > idMapType;
        typedef idMapType::iterator idMapIterType;
        typedef idMapType::const_iterator idMapConstIterType;

        typedef set<pfUlong, less<pfUlong> > vciSetType;
        typedef vciSetType::iterator vciIterator;

        saalMapType _saalMap;
        idMapType _idMap;
        vciSetType _vciSet;

        pfUlong _nextVCI;

        pfUlong _minVPI;
        pfUlong _maxVPI;
        pfUlong _minVCI;
        pfUlong _maxVCI;
};

#endif // __SW_ATMPORT_H__

