//Editor-Info: -*- C++ -*-
//
//Subject: TOVE project
//
//File: gsmpconfigurationmanagement.cpp
//
//Version: $Revision: 1.13 $
//
//State: $State: Exp $
//
//Date: $Date: 1998/12/10 12:32:37 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications Software and Multimedia
//
//Author:
//      Harri Sunila
//
//Description:
//      See corresponding header file
//
//Copyright:
//      Copyright 1999 Helsinki University of Technology
//      ALL RIGHTS RESERVED BETWEEN JANUARY 1996 AND JUNE 1999.
//
//Licence:
//
//
//History: 

#include "gsmpconfigurationmanagement.h"
#include "gsmpconfigurationmessages.h"
#include "iface/swif/swconfigcontrol.h"
#include "iface/swif/swportconfig.h"
#include "gsmpprotocol.h"

//
// Function: gsmpConfigurationManagement
//
// Description:  
//

gsmpConfigurationManagement :: gsmpConfigurationManagement(void)
    : pfAdapter(),
      gsmpState(),
      _configControl(0)
{
    incRefCount();
    return;
}

//
// Function: gsmpConfigurationManagement
//
// Description:  
//

gsmpConfigurationManagement :: gsmpConfigurationManagement(
    swConfigControl *configControl_)
    : pfAdapter(),
      gsmpState(),
      _configControl(configControl_)
{
    incRefCount();
    return;
}

//
// Function: gsmpConfigurationManagement
//
// Description:  
//

gsmpConfigurationManagement :: gsmpConfigurationManagement(
    const gsmpConfigurationManagement &other_)
    : pfAdapter(other_),
      gsmpState(),
      _configControl(other_._configControl)
{
    return;
}

//
// Function: ~gsmpConfigurationManagement
//
// Description:  
//

gsmpConfigurationManagement :: ~gsmpConfigurationManagement(void)
{
    return;
}

//
// Function: operator=
//
// Description:  
//

gsmpConfigurationManagement &gsmpConfigurationManagement :: operator=(
    const gsmpConfigurationManagement &other_)
{
    if (this != &other_)
    {
        _configControl = other_._configControl;
    }
    return *this;
}

//
// Function: sendSwitchConfigurationRequest
//
//

pfUlong gsmpConfigurationManagement :: sendSwitchConfigurationRequest(void)
{
    pfUlong transactionIdentifier =
        gsmpProtocol::generateTransactionIdentifier();
    gsmpSwitchConfigurationRequestMessage *message =
        new gsmpSwitchConfigurationRequestMessage(transactionIdentifier);
    sendRequest(message);
    return transactionIdentifier;
}

//
// Function: sendPortConfigurationRequest
//
// Description:
//     Send a request to get the port configuration.
//

pfUlong gsmpConfigurationManagement :: sendPortConfigurationRequest(
    pfUlong port_)
{
    pfUlong transactionIdentifier =
        gsmpProtocol::generateTransactionIdentifier();
    gsmpPortConfigurationRequestMessage *message =
        new gsmpPortConfigurationRequestMessage(transactionIdentifier,
                                                port_);
    sendRequest(message);
    return transactionIdentifier;
}

//
// Function: sendAllPortsConfigurationRequest
//
// Description:
//     Send a request to get the configuration of all ports.
//

pfUlong gsmpConfigurationManagement :: sendAllPortsConfigurationRequest(void)
{
    pfUlong transactionIdentifier =
        gsmpProtocol::generateTransactionIdentifier();
    gsmpAllPortsConfigurationRequestMessage *message =
        new gsmpAllPortsConfigurationRequestMessage(transactionIdentifier);
    sendRequest(message);
    return transactionIdentifier;
}

//
// Function: gsmpXXMessageAct
//
// Description:
//

void gsmpConfigurationManagement :: gsmpSwitchConfigurationResponseMessageAct(
    gsmpSwitchConfigurationResponseMessage *message_,
    pfProtocol *protocol_)
{
    if (_configControl != 0)
    {
        string switchName = message_->getSwitchName();
        pfUlong switchType = message_->getSwitchType();
        pfUlong firmwareVersionNumber = message_->getFirmwareVersionNumber();
        _configControl->setSwitchName(switchName);
        _configControl->setSwitchType(switchType);
        _configControl->setFirmwareVersionNumber(firmwareVersionNumber);
    }
    return;
}

void gsmpConfigurationManagement :: gsmpPortConfigurationResponseMessageAct(
    gsmpPortConfigurationResponseMessage *message_,
    pfProtocol *protocol_)
{
    if (_configControl != 0)
    {
        pfUlong port = message_->getPort();
        pfUlong minVPI = message_->getMinVPI();
        pfUlong maxVPI = message_->getMaxVPI();
        pfUlong minVCI = message_->getMinVCI();
        pfUlong maxVCI = message_->getMaxVCI();

        swPortConfig *portConfig = _configControl->getPortConfig(port);
        if (portConfig != 0)
        {
            portConfig->setMinVPI(minVPI);
            portConfig->setMaxVPI(maxVPI);
            portConfig->setMinVCI(minVCI);
            portConfig->setMaxVCI(maxVCI);
        }
    }
    return;
}

void gsmpConfigurationManagement ::
gsmpAllPortsConfigurationResponseMessageAct(
    gsmpAllPortsConfigurationResponseMessage *message_,
    pfProtocol *protocol_)
{
    if (_configControl != 0)
    {
        vector<gsmpPortRecord> portRecords = message_->getPortRecords();
        swPortConfig *portConfig;
        
        pfUlong port, minVPI, maxVPI, minVCI, maxVCI;

        vector<gsmpPortRecord>::iterator i = portRecords.begin();
        vector<gsmpPortRecord>::iterator end = portRecords.end();
        
        while(i != end)
        {
            port = (*i).getPort();
            minVPI = (*i).getMinVPI();
            maxVPI = (*i).getMaxVPI();
            minVCI = (*i).getMinVCI();
            maxVCI = (*i).getMaxVCI();

            portConfig = _configControl->getPortConfig(port);

            if (portConfig != 0)
            {
                portConfig->setMinVPI(minVPI);
                portConfig->setMaxVPI(maxVPI);
                portConfig->setMinVCI(minVCI);
                portConfig->setMaxVCI(maxVCI);
            }
            i++;
        }
    }
    return;
}

//
// Function: sendRequest
//
// Description:  
//     Send a request to the switch
//

void gsmpConfigurationManagement :: sendRequest(gsmpMessage *message_)
{
    pfConduit sender(this);
    pfMsgTransporter *transporter =
        pfMsgTransporter::createMsgTransporter(message_);
    transporter->setSender(sender);
    toA(transporter);
    return;
}
