//Editor-Info: -*- C++ -*-
//
//Subject: TOVE project / COMMON
//
//File: ss7configure.h
//
//Version: $Revision: 1.17 $
//
//State: $State: Exp $
//
//Date: $Date: 1998/12/17 14:53:23 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications Software and Multimedia
//
//Author:
//      Timo Pärnänen
// 
//Description:
//      Class definitons for SS#7 network configure object.
//    Pure virtual interface for SS#7 configure implementation
//    and proxy.
//
//Copyright:
//      Copyright 1999 Helsinki University of Technology
//      ALL RIGHTS RESERVED BETWEEN JANUARY 1996 AND JUNE 1999.
//
//Licence:
//
//
//History: 
//
//

#ifndef __COMMON_SS7CONFIGURE_H__
#define __COMMON_SS7CONFIGURE_H__

#include <typeinfo>
#include <string>
#include <map>
#include "pf/types.h"
#include "ss7defs.h"

class ss7Configure;

class ss7ConfigureInterface
{
    public:
        // Point code value of this signalling point
        virtual void setPointCode(pfUlong pointCode_) = 0;
        virtual pfUlong getPointCode(void) const = 0;

        // Routing table
        virtual pfUlong findAALid(pfUlong DPC_) const = 0;
        virtual void configureRoutingTable(pfUlong start_,
                                           pfUlong stop_,
                                           pfUlong AALid_) = 0;

        // Mapping table (for address translation)
        virtual bool translateAddress(string &GT_,
                                           pfUlong &SSN_,
                                           pfUlong &DPC_) const = 0;
        virtual bool translateAddress(string &GT_,
                                           pfUlong &DPC_) const = 0;
        virtual void addGTtoPCandSSN(string GT_,
                                     pfUlong DPC_,
                                     pfUlong SSN_) = 0;
        virtual void addGTtoPC(string GT_,
			       pfUlong DPC_) = 0;
        virtual void addGTtoPCandGT(string GT_,
                                    pfUlong DPC_,
                                    string newGT_) = 0;
        virtual void addGTtoSSN(string GT_, pfUlong SSN_) = 0;
        
        // User parts (above MTP3)
        virtual void setSCCP(void) = 0;
        virtual void setBISUP(void) = 0;
        virtual bool isUserPartAvailable(
            pfUlong serviceIndicator_) const = 0;

        // Subsystems (above SCCP)
        virtual void setTCAP(void) = 0;
        virtual void setINAP(void) = 0;
        virtual bool isSubSystemAvailable(
            pfUlong subSystemNumber_) const = 0;

        // Print current configure
        virtual void printConfigure(ostream &stream_) const = 0;
};

//
//Class: ss7ConfigureImplementation
//
//Description:
//    Defines actual ss7ConfigureImplementation class. This class
//    controls configurable variables of the SS#7 network. It includes
//    point code and routing table. It also knows user parts and
//    sub system availability statuses.
//

class ss7ConfigureImplementation : public ss7ConfigureInterface
{
    public:
        static ss7Configure createSS7Configure(void);
        virtual ~ss7ConfigureImplementation(void);

        // Point code value of this signalling point
        virtual void setPointCode(pfUlong pointCode_);
        virtual pfUlong getPointCode(void) const;

        // Routing table
        virtual pfUlong findAALid(pfUlong DPC_) const;
        virtual void configureRoutingTable(pfUlong start_,
                                           pfUlong stop_,
                                           pfUlong AALid_);
        
        // Mapping table (for address translation)
        virtual bool translateAddress(string &GT_,
                                           pfUlong &SSN_,
                                           pfUlong &DPC_) const;
        virtual bool translateAddress(string &GT_,
                                           pfUlong &DPC_) const;
        virtual void addGTtoPCandSSN(string GT_,
                                     pfUlong DPC_,
                                     pfUlong SSN_);
        virtual void addGTtoPC(string GT_,
			       pfUlong DPC_);
        virtual void addGTtoPCandGT(string GT_,
                                    pfUlong DPC_,
                                    string newGT_);
        virtual void addGTtoSSN(string GT_, pfUlong SSN_);
        
        // User parts (above MTP3)
        virtual void setSCCP(void);
        virtual void setBISUP(void);
        virtual bool isUserPartAvailable(
            pfUlong serviceIndicator_) const;

        // Subsystems (above SCCP)
        virtual void setTCAP(void);
        virtual void setINAP(void);
        virtual bool isSubSystemAvailable(
            pfUlong subSystemNumber_) const;

        // Print current configure
        virtual void printConfigure(ostream &stream_) const;

    private:
        ss7ConfigureImplementation(void);
        void printAvailableStatus(bool present_, ostream &stream_) const;
        
        pfUlong _pointCode;
        bool _sccpPresent;
        bool _bisupPresent;
        bool _tcapPresent;
        bool _inapPresent;
        
        typedef map<string, string, less<string> > stringMapType;
        typedef map<string, pfUlong, less<string> > integerMapType;
        typedef map<pfUlong, pfUlong, less<pfUlong> > routingMapType;
        
        typedef stringMapType::iterator stringMapIterType;
        typedef integerMapType::iterator integerMapIterType;
        typedef routingMapType::iterator routingMapIterType;
        typedef stringMapType::const_iterator stringMapConstIterType;
        typedef integerMapType::const_iterator integerMapConstIterType;
        typedef routingMapType::const_iterator routingMapConstIterType;

        stringMapType _gtMap;
        integerMapType _pcMap;
        integerMapType _ssnMap;
        routingMapType _routingMap;
};

//
//Class: ss7Configure
//
//Description:
//    Class implements proxy for actual ss7ConfigureImplementation.
//

class ss7Configure : public ss7ConfigureInterface
{
    public:
        ss7Configure(ss7ConfigureImplementation *implementation_);
        ss7Configure(const ss7Configure &other_);
        virtual ~ss7Configure(void);
        
        const ss7Configure& operator = (const ss7Configure &other_);

        // Point code value of this signalling point
        virtual void setPointCode(pfUlong pointCode_);
        virtual pfUlong getPointCode(void) const;

        // Routing table
        virtual pfUlong findAALid(pfUlong DPC_) const;
        virtual void configureRoutingTable(pfUlong start_,
                                           pfUlong stop_,
                                           pfUlong AALid_);

        // Mapping table (for address translation)
        virtual bool translateAddress(string &GT_,
                                           pfUlong &SSN_,
                                           pfUlong &DPC_) const;
        virtual bool translateAddress(string &GT_,
                                           pfUlong &DPC_) const;
        virtual void addGTtoPCandSSN(string GT_,
                                     pfUlong DPC_,
                                     pfUlong SSN_);
        virtual void addGTtoPC(string GT_,
			       pfUlong DPC_);
        virtual void addGTtoPCandGT(string GT_,
                                    pfUlong DPC_,
                                    string newGT_);
        virtual void addGTtoSSN(string GT_, pfUlong SSN_);

        // User parts (above MTP3)
        virtual void setSCCP(void);
        virtual void setBISUP(void);
        virtual bool isUserPartAvailable(
            pfUlong serviceIndicator_) const;

        // Subsystems (above SCCP)
        virtual void setTCAP(void);
        virtual void setINAP(void);
        virtual bool isSubSystemAvailable(
            pfUlong subSystemNumber_) const;

        // Print current configure
        virtual void printConfigure(ostream &stream_) const;

    private:
        ss7ConfigureImplementation* _implementation;
};

#endif // __COMMON_SS7CONFIGURE_H__

