//Editor-Info: -*- C++ -*-
//
//Subject: TOVE project/CC
//
//File: ccinadapter.cpp
//
//Version: $Revision: 1.11 $
//
//State: $State: Exp $
//
//Date: $Date: 1998/12/16 14:00:26 $
//
//Organisation:
//      University of Technology
// 
//Author:
//      Pasi Nummisalo
//
//Description:
//     
//
//Copyright:
//     University of Technology
//     Laboratory of Telecommunications and Multimedia 
//      
//Licence:
//     
//
//History:
//

#include <stdio.h>

#include "ccinadapter.h"
#include "iface/binapif/binappdus.h"
#include "pf/naming.h"
#include "cctypes.h"
#include "ccindications.h"

//ccINadapter *ccINadapter :: _only = 0;

ccINadapter::ccINadapter(const ccProtocol *protocol_)
    : toveinap_SSF_SCF_initiator_skel(),
      pfAdapter(),
      _protocol(protocol_)
{
    
/*    
    cout << "IN adapter" << endl;
    CosNaming_Name name;
    name.length(3);
    name[0].id = CORBA_string_dup("in");
    name[0].kind = CORBA_string_dup("");
    name[1].id = CORBA_string_dup("cc");
    name[1].kind = CORBA_string_dup("");
    name[2].id = CORBA_string_dup("inap");
    name[2].kind = CORBA_string_dup("");
    
    try
    {
        pfNaming::instance()->bind(
            name, (toveinap_SSF_SCF_initiator_skel*) this);
    }
    catch (pfMethodFailed &mf)
    {
        mf.printInfo();
        exit(1);
    }
*/    
    return;
}


ccINadapter :: ~ccINadapter()
{
/*
    CosNaming_Name name;
    name.length(3);
    name[0].id = CORBA_string_dup("in");
    name[0].kind = CORBA_string_dup("");
    name[1].id = CORBA_string_dup("cc");
    name[1].kind = CORBA_string_dup("");
    name[2].id = CORBA_string_dup("Inap");
    name[2].kind = CORBA_string_dup("");

    try
    {
        pfNaming::instance()->unbind(name);
    }
    catch (pfMethodFailed &mf)
    {
        mf.printInfo();
    }
*/      
    return;
}

/*
ccINadapter *ccINadapter :: instance(void)
{
    
    if (_only == 0)
    {
        _only = new ccINadapter();
    }

    return _only;
}
*/

//
//Function: noReference
//
//Description:
//   Over written because this is a singleton and
//   runtime deletions are not allowed
//

/*
int ccINadapter :: noReference(void) const
{
    int reference = 0; // allways references

    return reference;
}
*/

//
// Methods: from TcSignaling.idl
//
// Description:
// 
//
  
CosLifeCycle_LifeCycleObject_ptr ccINadapter :: copy(
    CosLifeCycle_FactoryFinder_ptr there,
    const CosLifeCycle_Criteria& the_criteria)
{
    throw CORBA_NO_IMPLEMENT();
}
 
void ccINadapter :: move(CosLifeCycle_FactoryFinder_ptr there,
                         const CosLifeCycle_Criteria& the_criteria)
{
    throw CORBA_NO_IMPLEMENT();
}

void ccINadapter :: remove()
{
    throw CORBA_NO_IMPLEMENT();
}

//
// Methods: from TcSignaling.idl
//
// Description:
//    See OMG Document telecom/98-10-03 for more info.
//
        
void ccINadapter :: setParameters(TcSignaling_TcPduProvider_ptr stack,
                                  TcSignaling_DialogId dialogId)
{
    throw CORBA_NO_IMPLEMENT();
}
        
void ccINadapter :: abort_association(const char* a_id)
{
    _protocol->resetDialog();
}
        
void ccINadapter :: abort_association_with_data(
    const TcSignaling_AbortValue& abort_value,
    const char* a_id)
{
    _protocol->resetDialog();
}
        
void ccINadapter :: end_association(const char* a_id)
{
    _protocol->resetDialog();
}
        
void ccINadapter :: new_association(TcSignaling_TcUser_ptr initiator,
                                    const char* a_id)
{
    throw CORBA_NO_IMPLEMENT();
}
        
void ccINadapter :: new_association_with_dialogdata(
    TcSignaling_TcUser_ptr initiator,
    const char* a_id,
    const char* protocol_version,
    const TcSignaling_DialogUserData& d_u_d)
{
    throw CORBA_NO_IMPLEMENT();
}

TcSignaling_TcContextSetting ccINadapter :: tc_context_setting()
{
    throw CORBA_NO_IMPLEMENT();
}


//
// Functions: from toveinap.idl
//
// Description:
//    See idl file for more information.
//

void ccINadapter :: connect(const toveinap_ConnectArgType& connectArg_,
                            TcSignaling_TcContext& ctext_)
{
#if CC_DEBUG
    cout << "connect" << endl;
#endif

    binapSELECT_ROUTEpdu *pdu =
        new binapSELECT_ROUTEpdu();
    pdu->setArguments(connectArg_.destinationRoutingAddress);
    _protocol->toSelf(pdu);
    
    return;
}

void ccINadapter :: releaseCall(const toveinap_ReleaseCallArgType& 
                                releaseCallArg_,
                                TcSignaling_TcContext& ctext_)
{
#if CC_DEBUG
    cout << "releaseCall" << endl;
#endif

    _protocol->releaseCall();
}
       
void ccINadapter :: selectRoute(const toveinap_SelectRouteArgType& 
                                selectRouteArg_,
                                TcSignaling_TcContext& ctext_)
{
#if CC_DEBUG
    cout << "selectRoute called" << endl;
#endif    

    binapSELECT_ROUTEpdu *pdu =
        new binapSELECT_ROUTEpdu();
    pdu->setArguments(selectRouteArg_.destinationRoutingAddress);
    _protocol->toSelf(pdu);
    
    return;
}

void ccINadapter :: requestReportBCSMEvent(
    const toveinap_RequestReportBCSMEventArgType& 
    arg_ , TcSignaling_TcContext& ctext_)
{
#if CC_DEBUG
    cout << "requestReportBCSMEvent called" << endl;
#endif      

   // Reset the SSF timer to a shorter value.
   _protocol->stopTimer(ccTimerSSFtimeout::timerName);
   _protocol->startTimer(ccTimerSSFtimeout::timerName);
   
   /*
   Why getTimer is private? Can't set new timeout value!
   pfTimer timer = protocol_->getTimer(ccTimerSSFtimeout::timerName);
   timer.stop();
   timer.setTimeout(ccTimerSSFtimeout::value2);
   timer.start();
   */


    // BCSM Event List can contain many Events
    unsigned int length = arg_.bcsmEvents.length();
    toveinap_MonitorModeType monitorMode;
    
    for (unsigned int i=0; i < length; i++)
    {
        ccDp &dp = _protocol->getDp(arg_.bcsmEvents[i].eventTypeBCSM);
        monitorMode = arg_.bcsmEvents[i].monitorMode;
        dp.setMonitorMode(monitorMode);
        // If type = EDP_R then SCF and SSF has control relationship
        // else monitor relationship (default)
        if (monitorMode == toveinap_interrupted)
        {
            _protocol->setControlRelationship();
        }

#if CC_DEBUG        
        cout << "Armed " <<  dp.getType() << endl;
#endif     
    }

    _protocol->setArmedEDPcount(length);
   
    return;    
}

void ccINadapter :: _continue(TcSignaling_TcContext& ctext_)
{
#if CC_DEBUG
    cout << "continue called" << endl;
#endif
   
    binapCONTINUEpdu *pdu = new binapCONTINUEpdu;
    _protocol->toSelf(pdu);
    
    return;
}











