Free Web Hosting Provider - Web Hosting - E-commerce - High Speed Internet - Free Web Page
Search the Web


// =================================================================
//
//  Copyright (C) 2003 Alex Vinokur
//
//  For conditions of distribution and use, see
//  copyright notice in common.h
//
// =================================================================


// #################################################################
//
//  SOFTWARE : C++ Stream-Compatible TCP/IP Sockets Demo Application
//  FILE     : partner.cpp
//
//  DESCRIPTION :
//         Partner related class implementation 
//         (non-template methods)
//
// #################################################################


// ==================
#include "partner2.h"
// ==================


// ---------------------
// ---------------------
BasicCallAction::BasicCallAction ()
{
SET_CTOR_TRACE;
}

// ---------------------
BasicCallAction::~BasicCallAction ()
{
SET_DTOR_TRACE;
}


// ---------------------
// ---------------------
// Constructor-1
BasicPartner::BasicPartner (
      const string& partner_name_i,
      int ip_port_no_i
      )
      :
      call_action_ (call_action_s),
      partner_name_ (partner_name_i),
      pre_check_ (true),
      ip_port_no_ (ip_port_no_i),
      total_sent_packets_ (0),
      total_recv_packets_ (0),
      local_sent_packets_ (0),
      local_recv_packets_ (0),
      cur_request_id_ (0),
      prev_request_id_ (0)
{
SET_CTOR_TRACE;

time_t timer;
        timer   = time(NULL);

  assert (!call_action_.empty());

  assert ((get_partner_name() == CLIENT_NAME) || (get_partner_name() == SERVER_NAME));

ostringstream oss, oss2;
  oss << get_partner_name() << " ---> Start Of Session";


  oss2 << endl;
  oss2 << "\t" << string (oss.str().size(), '#') << endl;
  oss2 << "\t" << oss.str() << endl;
  oss2 << "\t" << asctime (localtime(&timer));
  oss2 << "\t" << string (oss.str().size(), '#') << endl;
  oss2 << endl;

  cout << oss2.str();

#ifdef SCREEN_LOG
#if (SCREEN_LOG)
  cerr << oss2.str();
#endif
#endif

  assert (pre_check_);
  pre_check_ = pre_check_ && check_ip_port_no ();
  assert (pre_check_);


}

// ---------------------
// Destructor
BasicPartner::~BasicPartner ()
{
SET_DTOR_TRACE;
ostringstream oss, oss2;

time_t timer;
        timer   = time(NULL);

  oss << get_partner_name() << " ---> End Of Session";

  oss2 << endl;
  oss2 << "\t" << string (oss.str().size(), '#') << endl;
  oss2 << "\t" << oss.str() << endl;
  oss2 << "\t" << asctime (localtime(&timer));
  oss2 << "\t" << string (oss.str().size(), '#') << endl;
  oss2 << endl;

  cout << oss2.str();

#ifdef SCREEN_LOG
#if (SCREEN_LOG)
  cerr << oss2.str();
#endif
#endif

}


// ---------------------
bool BasicPartner::check_ip_port_no () const
{
SET_TRACE;
  return true; // TBD
}



// ---------------------
int BasicPartner::get_ip_port_no () const
{
SET_TRACE;
  return ip_port_no_;
}

// ---------------------
string BasicPartner::get_partner_name () const
{
  return partner_name_;
}



// ----------------------------------
bool BasicPartner::recv_packet_head (
         ulong&  request_id_o,
         string& packet_typename_o,
         size_t& packet_size_o
         )
{
SET_TRACE;

bool ret_bool = true;


  // ----------------------
  ret_bool = ret_bool && read_via_broker_from_stream (request_id_o, "[Request-Id]");
  if (!ret_bool)
  {
    MOUT (  get_partner_name()
         << " * "
         << " Unable to get Request-Id"
         << endl
         );

    return ret_bool;
  }
  if (is_end_of_session (request_id_o)) return ret_bool;


  // ----------------------
  ret_bool = ret_bool && read_via_broker_from_stream (packet_typename_o, "[Packet Typename]");
  if (!ret_bool)
  {
    MOUT (  get_partner_name()
         << " * "
         << " Unable to get Packet Typename"
         << endl
         );

    return ret_bool;
  }


  // ----------------------
  ret_bool = ret_bool && read_via_broker_from_stream (packet_size_o, "[Packet Size]");
  if (!ret_bool)
  {
    MOUT (  get_partner_name()
         << " * "
         << " Unable to get Packet Size"
         << endl
         );

    return ret_bool;
  }

  return ret_bool;

}



// ----------------------------------
bool BasicPartner::send_relevant_packet (const BasicDataType*& packet_i)
{
SET_TRACE;

  set_local_sent_packets ();
  prev_request_id_ = cur_request_id_;

  total_sent_packets_++;
  local_sent_packets_++;

  show_outcoming_packet (packet_i);

  assert (!call_action_.empty());
  assert (call_action_.count(packet_i->get_typeid_data_type()) == 1);

const map<string, BasicCallAction*>::const_iterator find_iter = call_action_.find (packet_i->get_typeid_data_type());
  assert (find_iter != call_action_.end());

bool ret_bool = find_iter->second->call_send_templated_packet(this, packet_i);

  return ret_bool;

}


// ----------------------------------
bool BasicPartner::recv_relevant_packet (BasicDataType*& packet_o)
{
SET_TRACE;

  total_recv_packets_++;

  assert (packet_o == NULL);

  assert (!call_action_.empty());

ulong  request_id;
string packet_typename;
size_t packet_size;

bool ret_bool = false;

  if (recv_packet_head (request_id, packet_typename, packet_size))
  {
    set_request_id (request_id);

    set_local_recv_packets ();

    local_recv_packets_++;

    if (!is_end_of_session ())
    {
      assert (packet_size != 0);
      assert (call_action_.count(packet_typename) == 1);

      const map<string, BasicCallAction*>::const_iterator find_iter = call_action_.find (packet_typename);
      assert (find_iter != call_action_.end());

      ret_bool = find_iter->second->call_recv_templated_packet(
               this,
               request_id,
               packet_typename,
               packet_size,
               packet_o
               );

      if (ret_bool)
      {
        const BasicDataType* ptr_packet = packet_o;
        show_incoming_packet (ptr_packet);
      }
    }
  }
  else
  {
    MOUT (  get_partner_name()
         << " * "
         << " Unable to get Packet header"
         << endl
         );
    // ret_bool == false  !!!
  }

  return ret_bool;

} // recv_relevant_packet



// ----------------------------------
ulong BasicPartner::get_total_sent_packets () const
{
SET_TRACE;
  return total_sent_packets_;
}


// ----------------------------------
ulong BasicPartner::get_total_recv_packets () const
{
SET_TRACE;
  return total_recv_packets_;
}


// ----------------------------------
ulong BasicPartner::get_request_id () const
{
SET_TRACE;
  return cur_request_id_;
}


// ----------------------------------
void BasicPartner::set_request_id (ulong request_id_i)
{
SET_TRACE;
  cur_request_id_ = request_id_i;
}

// ----------------------------------
bool BasicPartner::is_end_of_session (ulong request_id_i) const
{
SET_TRACE;
  return (request_id_i == END_OF_SESSION_ID);
}


// ----------------------------------
bool BasicPartner::is_end_of_session () const
{
SET_TRACE;
  return (cur_request_id_ == END_OF_SESSION_ID);
}


// ----------------------------------
void BasicPartner::show_outcoming_packet (const BasicDataType*& packet_i) const
{
SET_TRACE;
ostringstream oss;
vector<string> msg;

  oss << get_partner_name()
      << " : "
      << get_outcoming_packet_desr()
      << "Id-"
      << cur_request_id_
      << " ("
      << local_sent_packets_
      << ") ; SerialSentPacketNo = "
      << total_sent_packets_;

  msg.push_back (oss.str());
  oss.str("");

  oss << "peer   : "
      << get_peer_name()
      << " IP Address = "
      << get_peer_ip_address();
  msg.push_back (oss.str());

  packet_i->show_packet (msg, '=');

}



// ----------------------------------
void BasicPartner::show_incoming_packet (const BasicDataType*& packet_i) const
{
SET_TRACE;
ostringstream oss;
vector<string> msg;

  oss << get_partner_name()
      << " : "
      << get_incoming_packet_desr()
      << "Id-"
      << cur_request_id_
      << " ("
      << local_recv_packets_
      << ") ; SerialRecvPacketNo = "
      << total_recv_packets_;

  msg.push_back (oss.str());
  oss.str("");

  oss << "peer   : "
      << get_peer_name()
      << " IP Address = "
      << get_peer_ip_address();
  msg.push_back (oss.str());

  packet_i->show_packet (msg, '-');

}