ROOT logo
// $Id: SMessage.cxx 2715 2012-04-05 17:25:48Z matevz $

// Copyright (C) 1999-2008, Matevz Tadel. All rights reserved.
// This file is part of GLED, released under GNU General Public License version 2.
// For the licensing terms see $GLEDSYS/LICENSE or http://www.gnu.org/.

#include "SMessage.h"
#include "Glasses/ZLog.h"

#include "TSocket.h"

#include <cerrno>

// SMessage

//______________________________________________________________________________
//
// Wrapper around TMessage allowing somewhat more optimized use.

ClassImp(SMessage);

//==============================================================================

SMessage::SMessage(UInt_t what, Int_t bufsize) :
  TMessage(what, bufsize)
{}

SMessage::SMessage(void* buf, Int_t bufsize) :
  TMessage(buf, bufsize)
{}

SMessage::~SMessage()
{}

//------------------------------------------------------------------------------

void SMessage::Send(TSocket* sock, Bool_t set_length)
{
  if (set_length)
  {
    SetLength();
  }

  Int_t n = sock->SendRaw(Buffer(), Length());

  if (n != Length())
  {
    throw n;
  }
}

Bool_t SMessage::SendOrReport(TSocket* sock, Bool_t set_length, const Exc_t& eh,
                              Bool_t log_to_is, ZLog* log)
{
  if (set_length)
  {
    SetLength();
  }

  Int_t n = sock->SendRaw(Buffer(), Length());

  if (n != Length())
  {
    TString msg;
    if (n == 0)
    {
      msg.Form("Client %s closed connection.", sock->GetInetAddress().GetHostName());
      if (log_to_is) ISmess(eh + msg);
      if (log)       log->Put(ZLog::L_Message, eh, msg);
    }
    else
    {
      msg.Form("Error %d receiving from %s: %s.", n, sock->GetInetAddress().GetHostName(),
               strerror(errno));
      if (log_to_is) ISerr(eh + msg);
      if (log)       log->Put(ZLog::L_Error, eh, msg);
    }
    return false;
  }
  else
  {
    return true;
  }
}

//------------------------------------------------------------------------------

SMessage* SMessage::Receive(TSocket* sock)
{
  Int_t n, len_net;
  n = sock->RecvRaw(&len_net, sizeof(Int_t));
  if (n != sizeof(Int_t))
  {
    throw n;
  }

  Int_t len  = net2host(len_net);
  Int_t len2 = len + sizeof(Int_t);
  char  *buf = new char[len2];
  memcpy(buf, &len_net, sizeof(Int_t));
  n = sock->RecvRaw(buf + sizeof(Int_t), len);
  if (n != len)
  {
    delete [] buf;
    throw n;
  }
  return new SMessage(buf, len2);
}

SMessage* SMessage::ReceiveOrReport(TSocket* sock, const Exc_t& eh,
                                    Bool_t log_to_is, ZLog* log)
{
  SMessage *m = 0;
  try
  {
    m = Receive(sock);
  }
  catch (Int_t n)
  {
    TString msg;
    if (n == 0)
    {
      msg.Form("Client %s closed connection.", sock->GetInetAddress().GetHostName());
      if (log_to_is) ISmess(eh + msg);
      if (log)       log->Put(ZLog::L_Message, eh, msg);
    }
    else
    {
      msg.Form("Error %d receiving from %s: %s.", n, sock->GetInetAddress().GetHostName(),
               strerror(errno));
      if (log_to_is) ISerr(eh + msg);
      if (log)       log->Put(ZLog::L_Error, eh, msg);
    }
  }
  return m;
}
 SMessage.cxx:1
 SMessage.cxx:2
 SMessage.cxx:3
 SMessage.cxx:4
 SMessage.cxx:5
 SMessage.cxx:6
 SMessage.cxx:7
 SMessage.cxx:8
 SMessage.cxx:9
 SMessage.cxx:10
 SMessage.cxx:11
 SMessage.cxx:12
 SMessage.cxx:13
 SMessage.cxx:14
 SMessage.cxx:15
 SMessage.cxx:16
 SMessage.cxx:17
 SMessage.cxx:18
 SMessage.cxx:19
 SMessage.cxx:20
 SMessage.cxx:21
 SMessage.cxx:22
 SMessage.cxx:23
 SMessage.cxx:24
 SMessage.cxx:25
 SMessage.cxx:26
 SMessage.cxx:27
 SMessage.cxx:28
 SMessage.cxx:29
 SMessage.cxx:30
 SMessage.cxx:31
 SMessage.cxx:32
 SMessage.cxx:33
 SMessage.cxx:34
 SMessage.cxx:35
 SMessage.cxx:36
 SMessage.cxx:37
 SMessage.cxx:38
 SMessage.cxx:39
 SMessage.cxx:40
 SMessage.cxx:41
 SMessage.cxx:42
 SMessage.cxx:43
 SMessage.cxx:44
 SMessage.cxx:45
 SMessage.cxx:46
 SMessage.cxx:47
 SMessage.cxx:48
 SMessage.cxx:49
 SMessage.cxx:50
 SMessage.cxx:51
 SMessage.cxx:52
 SMessage.cxx:53
 SMessage.cxx:54
 SMessage.cxx:55
 SMessage.cxx:56
 SMessage.cxx:57
 SMessage.cxx:58
 SMessage.cxx:59
 SMessage.cxx:60
 SMessage.cxx:61
 SMessage.cxx:62
 SMessage.cxx:63
 SMessage.cxx:64
 SMessage.cxx:65
 SMessage.cxx:66
 SMessage.cxx:67
 SMessage.cxx:68
 SMessage.cxx:69
 SMessage.cxx:70
 SMessage.cxx:71
 SMessage.cxx:72
 SMessage.cxx:73
 SMessage.cxx:74
 SMessage.cxx:75
 SMessage.cxx:76
 SMessage.cxx:77
 SMessage.cxx:78
 SMessage.cxx:79
 SMessage.cxx:80
 SMessage.cxx:81
 SMessage.cxx:82
 SMessage.cxx:83
 SMessage.cxx:84
 SMessage.cxx:85
 SMessage.cxx:86
 SMessage.cxx:87
 SMessage.cxx:88
 SMessage.cxx:89
 SMessage.cxx:90
 SMessage.cxx:91
 SMessage.cxx:92
 SMessage.cxx:93
 SMessage.cxx:94
 SMessage.cxx:95
 SMessage.cxx:96
 SMessage.cxx:97
 SMessage.cxx:98
 SMessage.cxx:99
 SMessage.cxx:100
 SMessage.cxx:101
 SMessage.cxx:102
 SMessage.cxx:103
 SMessage.cxx:104
 SMessage.cxx:105
 SMessage.cxx:106
 SMessage.cxx:107
 SMessage.cxx:108
 SMessage.cxx:109
 SMessage.cxx:110
 SMessage.cxx:111
 SMessage.cxx:112
 SMessage.cxx:113
 SMessage.cxx:114
 SMessage.cxx:115
 SMessage.cxx:116
 SMessage.cxx:117
 SMessage.cxx:118
 SMessage.cxx:119
 SMessage.cxx:120
 SMessage.cxx:121
 SMessage.cxx:122
 SMessage.cxx:123
 SMessage.cxx:124
 SMessage.cxx:125
 SMessage.cxx:126
 SMessage.cxx:127
 SMessage.cxx:128
 SMessage.cxx:129
 SMessage.cxx:130
 SMessage.cxx:131
 SMessage.cxx:132
 SMessage.cxx:133
 SMessage.cxx:134
 SMessage.cxx:135
 SMessage.cxx:136