//Editor-Info: -*- C++ -*-
//
//Subject: TOVE-project / MTP protocol
//
//File: mtp3state_hmrt_idle.cpp
//
//Version: $Revision: 1.5 $
//
//Date: $Date: 1997/09/16 11:46:39 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications and Multimedia
//
//Author:
//      Timo Pärnänen
//
//Description:
//      See corresponding heder file.
//
//Copyright:
//
//
//Licence:
//
//
//History:

#include "pf/frame.h"
#include "mtp3defs.h"
#include "mtp3block_hmrt.h"
#include "mtp3state_hmrt_idle.h"

// implementations of constructors, destructor and singleton pattern

mtp3_HMRT_Idle *mtp3_HMRT_Idle::_only = 0;

mtp3_HMRT_Idle * mtp3_HMRT_Idle :: instance(void)
{
    if (_only == 0)
    {
        _only = new mtp3_HMRT_Idle;
    }
    return _only;
}

mtp3_HMRT_Idle :: mtp3_HMRT_Idle(void)
{
    return;
}

mtp3_HMRT_Idle :: ~mtp3_HMRT_Idle(void)
{
    _only = 0;
    return;
}

// inputs

void mtp3_HMRT_Idle :: mtpTRANSFERreqAct(
    mtpTRANSFERreq *messenger_,
    pfProtocol *protocol_)
{
    pfUlong DPC = messenger_->getDestinationPointCode();
    pfFrame frame;
    encodeMessage(messenger_, frame);
    ((mtp3BlockHMRT *)protocol_)->routeMessage(DPC, frame);
    return;
}

void mtp3_HMRT_Idle :: naalRECEIVED_MESSAGEindAct(
    naalRECEIVED_MESSAGEind *messenger_,
    pfProtocol *protocol_)
{
    pfFrame messageUnit = messenger_->getMessageUnit();
    assert(messageUnit.length() >= 5);
    
    pfUlong offSet = MTP3_DESTINATION_POINT_CODE_OFFSET;
    pfUlong LSB = messageUnit.read(offSet++);
    pfUlong MSB = (messageUnit.read(offSet) & MTP3_6_BITS) << 8;
    pfUlong DPC = MSB+LSB;

    ((mtp3BlockHMRT *)protocol_)->routeMessage(DPC, messageUnit);
    return;
}

void mtp3_HMRT_Idle :: encodeMessage(mtpTRANSFERreq *messenger_,
                                     pfFrame &frame_)
{
    frame_ = messenger_->getSignallingInformation();
    pfUlong OPC = messenger_->getOriginatingPointCode();
    pfUlong SLS = messenger_->getSignallingLinkSelection();
    pfUlong tmp = (OPC >> 10) + (SLS << 4);
    frame_.putFirst(tmp);
    tmp = (OPC >> 2) & MTP3_8_BITS;
    frame_.putFirst(tmp);
    tmp = (OPC & MTP3_2_BITS) << 6;
    pfUlong DPC = messenger_->getDestinationPointCode();
    tmp = tmp + (DPC >> 8);
    frame_.putFirst(tmp);
    frame_.putFirst(DPC & MTP3_8_BITS);
    frame_.putFirst(messenger_->getServiceInformationOctet());

    return;
}
