//Editor-Info: -*- C++ -*-
//
//Subject: TOVE project
//
//File: unilink.cpp
//
//Version: $Revision: 1.9 $
//
//State: $State: Exp $
//
//Date: $Date: 1998/11/19 12:34:46 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications Software and Multimedia
//
//Author:
//	Vesa-Matti Puro
//
//Description:
//      See corresponding header file
//
//Copyright:
//      Copyright 1999 Helsinki University of Technology
//      ALL RIGHTS RESERVED BETWEEN JANUARY 1996 AND JUNE 1999.
//
//Licence:
//
//
//History:
//

#include <autoptr.h>
#include "pf/debug.h"
#include "saalunilink.h"
#include "protocol/usscf/usscfprotocol.h"
#include "protocol/sscop/sscopprotocol.h"

//
//Function: constructors
//
//Description:
//     Initialises the class members. Note that the constructor is
//     protected; it is intended to be called only by the create methods.
//
//     See also comments in header file and destructor (below).
//
saalUNIlink :: saalUNIlink(void)
    : saalLink()
{   
    _usscf = new usscfProtocol(this);
    _usscfProxy = pfConduit(_usscf);
    return;
}

saalUNIlink :: saalUNIlink(const saalUNIlink &other_)
    : saalLink(other_)
{   
    _usscf = new usscfProtocol(*other_._usscf, this);
    _usscfProxy = pfConduit(_usscf);
    return;
}


//
//Function: destructor
//
//Description:
//    ++TODO++
//

saalUNIlink :: ~saalUNIlink(void)
{
    // usscf implementation is deleted automatically, when
    // destructor of usscfProxy is called.
    _usscfProxy.disconnect();
    return;
}


//
//Function: createUNIConnection
//
//Description:
//    Creates a SAAL connection for UNI by instantiating protocols
//    of SSCF for UNI and SSCOP and connects them together. The SSCOP
//    parameters are set to the UNI default values.
//

saalUNIlink *saalUNIlink :: createATMUNIlink(pfId linkNumber_,
                                             int port_,
                                             int vpi_,
                                             int vci_,
                                             int bufferSize_)
{
    auto_ptr<saalUNIlink> newSaal(new saalUNIlink());
    newSaal->setBufferSize(bufferSize_);
    newSaal->setLinkNumber(linkNumber_);
    newSaal->setUNIprotocols();
    newSaal->openATMConnection(port_, vpi_, vci_);
    newSaal->connectProtocols();
    return newSaal.release();
}

saalUNIlink *saalUNIlink :: createUDPUNIlink(pfId linkNumber_,
                                             const string &hostname_,
                                             int localPort_,
                                             int remotePort_,
                                             int bufferSize_)
{
    auto_ptr<saalUNIlink> newSaal(new saalUNIlink());
    newSaal->setBufferSize(bufferSize_);
    newSaal->setLinkNumber(linkNumber_);
    newSaal->setUNIprotocols();
    newSaal->openUDPConnection(hostname_, localPort_, remotePort_);
    newSaal->connectProtocols();
    return newSaal.release();
}


saalUNIlink *saalUNIlink :: createPrototype(void)
{
    saalUNIlink *newSaal = new saalUNIlink();
    return newSaal;
}

saalUNIlink *saalUNIlink :: clonePrototype(pfId linkNumber_,
                                           int port_,
                                           int vpi_,
                                           int vci_)
{
    auto_ptr<saalUNIlink> newSaal(new saalUNIlink(*this));
    newSaal->setLinkNumber(linkNumber_);
    newSaal->setUNIprotocols();
    newSaal->openATMConnection(port_, vpi_, vci_);
    newSaal->connectProtocols();
    return newSaal.release();
}

pfConduit saalUNIlink :: getConduit(void)
{
    return _usscfProxy;
}

void saalUNIlink :: setLinkNumber(pfId linkNumber_)
{
    saalLink::setLinkNumber(linkNumber_);
    _usscfProxy.setId(linkNumber_);
    return;
}

void saalUNIlink :: setUNIprotocols(void)
{
    setMaxSDUsize(UNI_SSCOP_MAX_SDU_SIZE);
    setMaxUUsize(UNI_SSCOP_MAX_UU_SIZE);
    setMaxCC(UNI_SSCOP_MAX_CC);
    setMaxPD(UNI_SSCOP_MAX_PD);
    setCCtimeout(UNI_SSCOP_TIMER_CC_TIMEOUT);
    setKEEP_ALIVEtimeout(UNI_SSCOP_TIMER_KEEP_ALIVE_TIMEOUT);
    setNO_RESPONSEtimeout(UNI_SSCOP_TIMER_NO_RESPONSE_TIMEOUT);
    setPOLLtimeout(UNI_SSCOP_TIMER_POLL_TIMEOUT);
    setIDLEtimeout(UNI_SSCOP_TIMER_IDLE_TIMEOUT);
    return;
}

void saalUNIlink :: connectProtocols(void)
{
    _usscfProxy.connectToA(_sscopProxy);
    _sscopProxy.connectToB(_usscfProxy);
    saalLink::connectProtocols();
    return;
}

