//Editor-Info: -*- C++ -*-
//
//Subject: TOVE project/CC
//
//File: ccdebug.cpp
//
//Version: $Revision: 1.10 $
//
//State: $State: Exp $
//
//Date: $Date: 1997/12/08 16:27:19 $
//
//Organisation:
//      University of Technology
// 
//Author:
//      Pasi Nummisalo
//
//Description:
//     
//
//Copyright:
//     University of Technology
//     Laboratory of Telecommunications and Multimedia 
//      
//Licence:
//     
//
//History:
//


#include "ccdebug.h"

ccDebug *ccDebug :: _only = 0;

ccDebug :: ccDebug(void)
{
    ccTraceLocation[ccVE] = 0;
    ccTraceLocation[ccDSS2] = 20;
    ccTraceLocation[ccCC] = 40;
    ccTraceLocation[ccCCT] = 60;
    ccTraceLocation[ccDSS2T] = 90;
    ccTraceLocation[ccINGW] = 100;
    
    ccTraceName[ccVE] = "VE";
    ccTraceName[ccDSS2] = "DSS2";
    ccTraceName[ccCC] = "CC";
    ccTraceName[ccCCT] = "CC-T";
    ccTraceName[ccDSS2T] = "DSS2-T";
    ccTraceName[ccINGW] = "INGW";
    

    _traceOutput = 0;
    _traceInput = 0;
    _traceTside = 0;
    _traceState = 0;
    _traceDp = 0;
    _traceVe = 0;
    
    return;
}

ccDebug :: ~ccDebug(void)
{
    //delete ccTraceName[];
    _only = 0;
    return;
}

ccDebug *ccDebug :: instance(void)
{
    if(_only == 0)
    {
        _only = new ccDebug;
        //assert(_only != 0);
    }
    return _only;
}

// Only for debuging ***********************************************


void ccDebug :: setTrace(int output_, int input_, int state_, int dp_,
                         int tSide_, int ve_)
{
    _traceOutput = output_;
    _traceInput = input_;
    _traceState = state_;
    _traceDp = dp_;
    _traceTside = tSide_;
    _traceVe = ve_;

    return;
}

void ccDebug :: sendInapMessage(ccDp &dp_, ccProtocol *protocol_,
                                string message_, string target_)
{
    int sender;
    
    if (protocol_->isSideO() != 0)
    {
        sender = ccCC;
    }
    else
    {
        sender = ccCCT;
    }

    // state------------------message(messageType)------->target
    // e.g.
    // analysedInformation----initialDp(request)----------->scp
    
    string state = dp_.getType();
    string messageType = dp_.getMessageType();
    string trace = state + "--------" + message_ + "(" + messageType + ")"; 
    
    send(sender, ccINGW, (char*) trace.c_str(), (char*) target_.c_str());

    return;
}

void ccDebug :: sendCrossConnector(pfUlong port_)
{
    char str[30];
    sprintf(str, "%li", port_);
    string text("CrossConnector port=");
    text+=str;
    
    send(ccCC, ccCCT, "Select Route", (char*) text.c_str());

    return;
}

void ccDebug :: sendHelper(ccProtocol *sender_,
                           int receiver_,
                           string state_,
                           string messenger_)
{

     int sender=ccCC;
     int receiver=ccDOWN;
 
     if (sender_->isSideO() != 0)
     {
          sender=ccCC;
          if (receiver_ == ccDOWN)
	  {
              receiver = ccDSS2;
          }
          else
	  {
              receiver = ccCCT;
          }   
     }
     else
     {
          sender=ccCCT;
          if (receiver_ == ccDOWN)
	  {
              receiver = ccDSS2T;
          }
          else
	  {
              receiver = ccCC;
          }   
     }
     

     send(sender, receiver,
          (char*) state_.c_str(), (char*) messenger_.c_str());

     return;
}

void ccDebug :: send(int sender_,
                     int receiver_,
                     char *state_,
                     char *messenger_)
{

  if (_traceOutput != 0)
  {
      
  int i = 0;
  int len = 0;
  if (sender_ == receiver_)
  {
      i = 0;
      len = 0;
      for (i=0; i < ccTraceLocation[sender_]; i++) cout << " ";
      len = strlen(ccTraceName[sender_])+1;
      cout << ccTraceName[sender_];
      cout << " ";
      len = len + strlen(state_)+1;
      cout << state_;
      cout << " ";
      for (i=len; i < 24/2; i++) cout << "-";
      cout << "\\\n";

      len = 0;
      for (i=0; i < ccTraceLocation[receiver_]+1; i++) cout << " ";
      len = strlen(messenger_)+3;
      cout << messenger_;
      cout << " <";
      for (i=len; i < 24/2; i++) cout << "-";
      cout << "/\n";
      
  }
  else
  {
      if (sender_ < receiver_) // ----->
      {
          i = 0;
          len = 0;
          for (i=0; i < ccTraceLocation[sender_]; i++) cout << " ";
          len = strlen(ccTraceName[sender_])+1;
          cout << ccTraceName[sender_];
          cout << " ";
          len = len + strlen(state_)+1;
          cout << state_;
          cout << " ";
          for (i= 0;
               i < (ccTraceLocation[receiver_]-ccTraceLocation[sender_])-(len+2);
               i++)
              cout << "-";
          cout << "> ";
          cout << messenger_;
          cout << endl;
      }
      else // <-------
      {
          i = 0;
          len = 0;
          for (i=0; i < ccTraceLocation[receiver_]+1; i++) cout << " ";
          len = strlen(messenger_)+3;
          cout << messenger_;
          cout << " <";
          for (i=0;
               i < (ccTraceLocation[sender_]-ccTraceLocation[receiver_])-(len+1);
               i++)
              cout << "-";
          cout << " ";
          cout << ccTraceName[sender_];
          cout << " ";
          cout << state_;
          cout << endl;
        
      }
  }
  }
  return;
} 


void ccDebug :: input(int sender_,
                           int receiver_,
                           char *state_,
                           char* messenger_)
{
    if (_traceInput != 0)
    {
        if (sender_ == receiver_)
        {
            int i = 0;
            int len = 0;
            for (i=0; i < ccTraceLocation[sender_]+1; i++) cout << " ";
            len = strlen(messenger_)+2;
            cout << messenger_;
            cout << " ";
            for (i=len; i < 24/2; i++) cout << "-";
            cout << "\\\n";
            
            len = 0;
            for (i=0; i < ccTraceLocation[receiver_]; i++) cout << " ";
            len = strlen(ccTraceName[receiver_])+1;
            cout << ccTraceName[receiver_];
            cout << " ";
            len = len + strlen(state_)+2;
            cout << state_;
            cout << " <";
            for (i=len; i < 24/2; i++) cout << "-";
            cout << "/\n";
        
        }
        else
        {
            if (sender_ < receiver_) // ----->
            {
                int i = 0;
                int len = 0;
                for (i=0; i < ccTraceLocation[sender_]+1; i++) cout << " ";
                len = strlen(messenger_)+2;
                cout << messenger_;
                cout << " ";
                for (i=0;
                     i < (ccTraceLocation[receiver_]-ccTraceLocation[sender_])-(len+2);
                     i++)
                    cout << "-";
                cout << "> ";
                cout << ccTraceName[receiver_];
                cout << " ";
                cout << state_;
                cout << endl;
            }
            else // <-------
            {
                int i = 0;
                int len = 0;
                for (i=0; i < ccTraceLocation[receiver_]; i++) cout << " ";
                len = strlen(ccTraceName[receiver_])+1;
                cout << ccTraceName[receiver_];
                cout << " ";
                len = len + strlen(state_)+2;
                cout << state_;
                cout << " <";
                for (i=0;
                     i < (ccTraceLocation[sender_]-ccTraceLocation[receiver_])-(len+1);
                     i++)
                    cout << "-";
                cout << " ";
                cout << messenger_;
                cout << endl;
            }
        }
    }
    
    return;
}

void ccDebug :: state(int protocol_, char *state_)
{
    if (_traceState != 0)
    {
        int i=0;
        for (i=0; i < ccTraceLocation[protocol_]; i++) cout << " ";
        cout << state_;
        cout << endl;
    }
}

void ccDebug :: dp(int protocol_, char *state_)
{
    if (_traceDp != 0)
    {
        int i=0;
        for (i=0; i < ccTraceLocation[protocol_]; i++) cout << " ";
        cout << "-";
        cout << state_;
        cout << "-";
        cout << endl;
    }
}

