//Editor-Info: -*- C++ -*-
//
//Subject: TOVE-project / SCCP protocol
//
//File: sccpblock_scrc.cpp
//
//Version: $Revision: 1.12 $
//
//State: $State: Exp $
//
//Date: $Date: 1998/11/20 14:08:08 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications and Multimedia
//
//Author:
//      Timo Pärnänen
//
//Description:
//      See corresponding header file.
//
//Copyright:
//
//
//Licence:
//
//
//History:

#include "pf/debug.h"
#include "sccppdus.h"
#include "sccpprotocol.h"
#include "sccpstate_scrc_idle.h"
#include "sccpblock_scrc.h"


sccpBlockSCRC :: sccpBlockSCRC(sccpProtocol *protocol_,
                               ss7Configure &configure_)
    : sccpColleague(protocol_,configure_)
{
    // Increment block's reference counter, because there is no proxy
    // to block in main function
    incRefCount();
    changeState(sccp_SCRC_Idle::instance());
    return;
}

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

void sccpBlockSCRC :: toMTP(pfMessenger *messenger_)
{
    _protocol->toMTP(messenger_);
    return;
}

void sccpBlockSCRC :: toSCLC(pfMessenger *messenger_)
{
    _protocol->toSCLC(messenger_);
    return;
}

bool sccpBlockSCRC :: isDPCaccessible(pfUlong DPC_) const
{
    bool result = true;
    try
    {
        _configure.findAALid(DPC_);
    }
    catch (pfException &ex)
    {   
        result = false;
    }
    return result;
}

bool sccpBlockSCRC :: isDPCthisNode(pfUlong DPC_) const
{
    bool result = false;
    if (_configure.getPointCode() == DPC_)
    {
        result = true;
    }
    return result;
}

bool sccpBlockSCRC :: isSubSystemAvailable(pfUlong SSN_) const
{
    bool result = _configure.isSubSystemAvailable(SSN_);
    return result;
}

bool sccpBlockSCRC :: translateAddress(sccpPdu *pdu_, pfUlong &DPC_)
{
    bool result = false;
    pfStorage calledAddress = pdu_->getStorage("calledAddress");
    if (calledAddress.isValuePresent("globalTitle") != 0)
    {
        string GT = calledAddress.getString("globalTitle");
        pfUlong SSN = 0;
        if (calledAddress.isValuePresent("subSystemNumber") != 0)
        {
            SSN = calledAddress.getInteger("subSystemNumber");
        }
        if (SSN != 0)
        {
            result = _configure.translateAddress(GT, DPC_);
        }
        else
        {
            result = _configure.translateAddress(GT, SSN, DPC_);
        }
        calledAddress.setString("globalTitle", GT);
        calledAddress.setInteger("subSystemNumber", SSN);
    }
    pdu_->setStorage("calledAddress", calledAddress);
    return result;
}

void sccpBlockSCRC :: sendRoutingFailure(void)
{
    debugUser("--Routing Failure--");
    // Not supported because message return option is not supported in 
    // UNITDATApdu (optional field) and SCLC would discard RoutingFailure
    // signal upon receipt.
    return;
}

pfUlong sccpBlockSCRC :: getPointCode(void) const
{
    return _configure.getPointCode();
}
