//Editor-Info: -*- C++ -*-
//
//Subject: TOVE project / ILMI protocol
//
//File: ilmiarstate.cpp
//
//Version: $Revision: 1.8 $
//
//State: $State: Exp $
//
//Date: $Date: 1999/03/11 16:07:34 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications Software and Multimedia
//
//Author:
//      Timo Pärnänen
//
//Description:
//      See corresponding header file.
//
//Copyright:
//      Copyright 1999 Helsinki University of Technology
//      ALL RIGHTS RESERVED BETWEEN JANUARY 1996 AND JUNE 1999.
//
//Licence:
//
//
//History: 

#include "pf/debug.h"
#include "ilmiarstate.h"
#include "ilmiarstate_restart.h"
#include "ilmiarstate_null.h"
#include "mib/mibexception.h"

const string ilmiARState ::
firstNetworkPrefixTableEntry("1.3.6.1.4.1.353.2.7.1.1.3.0");

const string ilmiARState :: VALID("+1");
const string ilmiARState :: INVALID("+0");

ilmiARState :: ilmiARState(void)
    : pfState()
{
    return;
}

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

// Timeouts
void ilmiARState :: ilmiARresponseTimeoutAct(
    ilmiAddressRegistration *protocol_)
{
    debugUser("ilmiARState::ilmiARresponseTimeoutAct");
    return;
}

void ilmiARState :: ilmiARpollTimeoutAct(
    ilmiAddressRegistration *protocol_)
{
    debugUser("ilmiARState::ilmiARpollTimeoutAct");
    return;
}
   


// Inputs from switch
void ilmiARState :: start(ilmiAddressRegistration *protocol_)
{
    debugUser("ilmiARState::start");
    
    resetProtocolVariables(protocol_);
    try
    {
        protocol_->sendColdStartTrap();
        protocol_->sendGetNextRequest(firstNetworkPrefixTableEntry);
        protocol_->changeState(ilmiARState_Restart::instance());
    }
    catch (pfException &exception)
    {
        protocol_->changeState(ilmiARState_Null::instance());
    }
    return;
}

void ilmiARState :: stop(ilmiAddressRegistration *protocol_)
{
    debugUser("ilmiARState::stop");
    resetProtocolVariables(protocol_);
    protocol_->changeState(ilmiARState_Null::instance());
    return;
}

void ilmiARState :: listPrefixes(ilmiAddressRegistration *protocol_,
                                 mgmtCommand &command_)
{
    debugUser("ilmiARState::listPrefixes");
    protocol_->storeLocalPrefixes(command_);
    return;
}

// Inputs from network
void ilmiARState :: receiveColdStartTrap(ilmiAddressRegistration *protocol_,
                                         VarBindList &list_)
{
    debugUser("ilmiARState::receiveColdStartTrap");
    //++ TODO++ parse list_
    
    resetProtocolVariables(protocol_);
    try
    {
        protocol_->sendGetNextRequest(firstNetworkPrefixTableEntry);
        protocol_->changeState(ilmiARState_Restart::instance());
    }
    catch (pfException &exception)
    {
        protocol_->changeState(ilmiARState_Null::instance());
    }
    return;
}

void ilmiARState :: receiveGetResponse(ilmiAddressRegistration *protocol_,
                                       PDUInt &errorStatus_,
                                       AsnInt &errorIndex_,
                                       VarBindList &list_)
{
    debugUser("ilmiARState::receiveGetResponse");
    return;
}

// MibDestination interface

string ilmiARState :: getValue(ilmiAddressRegistration *protocol_,
                               const string &name_)
{
    debugUser("ilmiARState::getValue");
    string value = protocol_->getAddressStatus(name_);
    return value;
}

void ilmiARState :: setValue(ilmiAddressRegistration *protocol_,
                             const string &name_,
                             const string &value_)
{
    debugUser("ilmiARState::setValue");
    return;
}

// Private method

void ilmiARState :: resetProtocolVariables(ilmiAddressRegistration *protocol_)
{
    // Stop timers
    protocol_->stopResponseTimer();
    protocol_->stopPollTimer();
    // Responses for old requests will be discarded.
    protocol_->clearCommandMap();
    // Address / Netprefix tables are cleared
    protocol_->clearTables();

    return;
}
