//Editor-Info: -*- C++ -*-
//
//Subject: TOVE project
//
//File: gsmpconnectionmanagement.h
//
//State: $State: Exp $
//
//Version: $Revision: 1.15 $
//
//Date: $Date: 1998/12/10 10:26:59 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications Software and Multimedia
// 
//Author:
//	Vesa-Matti Puro
//      Harri Sunila
//
//Description:
//     gsmpConnectionManagement represents a virtual connection, which may be
//     modified.
//
//Copyright:    
//      Copyright 1999 Helsinki University of Technology
//      ALL RIGHTS RESERVED BETWEEN JANUARY 1996 AND JUNE 1999.
//      
//Licence:
//     
//
//History:
//
//

#ifndef __GSMP_GSMPCONNECTIONMANAGEMENT_H__
#define __GSMP_GSMPCONNECTIONMANAGEMENT_H__

class gsmpConnectionManagementMessage;

class gsmpAddBranchMessage;
class gsmpDeleteBranchMessage;
class gsmpDeleteTreeMessage;
class gsmpVerifyTreeMessage;
class gsmpDeleteAllMessage;
class gsmpMoveBranchMessage;

class swFabricCallback;

#include "pf/adapter.h"
#include "gsmpstate.h"

//
// Class: gsmpConnectionManagement
//
// Description:
//	Connection management messages are used by the controller to establish,
//	delete, modify and verify connections across the switch.
//	

class gsmpConnectionManagement : public pfAdapter, public gsmpState
{
    public:
        gsmpConnectionManagement(void);
        explicit gsmpConnectionManagement(swFabricCallback *callback_);
        gsmpConnectionManagement(const gsmpConnectionManagement &other_);
        virtual ~gsmpConnectionManagement(void);

        pfUlong addBranch(pfUlong inputPort_,
                          pfUlong inputVPI_,
                          pfUlong inputVCI_,
                          pfUlong outputPort_,
                          pfUlong outputVPI_,
                          pfUlong outputVCI_,
                          pfByte priority_ = 0);
        pfUlong deleteBranch(pfUlong inputPort_,
                             pfUlong inputVPI_,
                             pfUlong inputVCI_,
                             pfUlong outputPort_,
                             pfUlong outputVPI_,
                             pfUlong outputVCI_);
        pfUlong deleteTree(pfUlong inputPort_,
                           pfUlong inputVPI_,
                           pfUlong inputVCI_);
        pfUlong verifyTree(pfUlong inputPort_,
                           pfUlong inputVPI_,
                           pfUlong inputVCI_,
                           pfUlong numberOfBranches_);
        pfUlong deleteAll(pfUlong inputPort_);
        pfUlong moveBranch(pfUlong inputPort_,
                           pfUlong inputVPI_,
                           pfUlong inputVCI_,
                           pfUlong oldOutputPort_,
                           pfUlong oldOutputVPI_,
                           pfUlong oldOutputVCI_,
                           pfUlong newOutputPort_,
                           pfUlong newOutputVPI_,
                           pfUlong newOutputVCI_,
                           pfByte priority_ = 0);

        // Act methods for the single state EFSA

        virtual void gsmpAddBranchMessageAct(gsmpAddBranchMessage *message_,
                                             pfProtocol *protocol_);
        
        virtual void gsmpDeleteBranchMessageAct(
            gsmpDeleteBranchMessage *message_,
            pfProtocol *protocol_);

        virtual void gsmpDeleteTreeMessageAct(gsmpDeleteTreeMessage *message_,
                                              pfProtocol *protocol_);

        virtual void gsmpVerifyTreeMessageAct(gsmpVerifyTreeMessage *message_,
                                              pfProtocol *protocol_);

        virtual void gsmpDeleteAllMessageAct(gsmpDeleteAllMessage *message_,
                                             pfProtocol *protocol_);

        virtual void gsmpMoveBranchMessageAct(gsmpMoveBranchMessage *message_,
                                              pfProtocol *protocol_);

    private:
        void sendRequest(gsmpConnectionManagementMessage *message_);
        void processResponse(gsmpConnectionManagementMessage *message_);

        swFabricCallback *_callback;
};

#endif  // __GSMP_GSMPCONNECTIONMANAGEMENT_H__

