// @(#)root/net:$Id$
// Author: Fons Rademakers   19/12/96

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TMessage                                                             //
//                                                                      //
// Message buffer class used for serializing objects and sending them   //
// over a network. This class inherits from TBuffer the basic I/O       //
// serializer.                                                          //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TMessage.h"
#include "Compression.h"
#include "TVirtualStreamerInfo.h"
#include "Bytes.h"
#include "TFile.h"
#include "TProcessID.h"
#include "RZip.h"

Bool_t TMessage::fgEvolution = kFALSE;


ClassImp(TMessage)

//______________________________________________________________________________
TMessage::TMessage(UInt_t what, Int_t bufsiz) :
   TBufferFile(TBuffer::kWrite, bufsiz + 2*sizeof(UInt_t))
{
   // Create a TMessage object for storing objects. The "what" integer
   // describes the type of message. Predifined ROOT system message types
   // can be found in MessageTypes.h. Make sure your own message types are
   // unique from the ROOT defined message types (i.e. 0 - 10000 are
   // reserved by ROOT). In case you OR "what" with kMESS_ACK, the message
   // will wait for an acknowledgement from the remote side. This makes
   // the sending process synchronous. In case you OR "what" with kMESS_ZIP,
   // the message will be compressed in TSocket using the zip algorithm
   // (only if message is > 256 bytes).

   // space at the beginning of the message reserved for the message length
   UInt_t   reserved = 0;
   *this << reserved;

   fWhat  = what;
   *this << what;

   fClass      = 0;
   fCompress   = 0;
   fBufComp    = 0;
   fBufCompCur = 0;
   fCompPos    = 0;
   fInfos      = 0;
   fEvolution  = kFALSE;

   SetBit(kCannotHandleMemberWiseStreaming);
}

//______________________________________________________________________________
TMessage::TMessage(void *buf, Int_t bufsize) : TBufferFile(TBuffer::kRead, bufsize, buf)
{
   // Create a TMessage object for reading objects. The objects will be
   // read from buf. Use the What() method to get the message type.

   // skip space at the beginning of the message reserved for the message length
   fBufCur += sizeof(UInt_t);

   *this >> fWhat;

   fCompress   = 0;
   fBufComp    = 0;
   fBufCompCur = 0;
   fCompPos    = 0;
   fInfos      = 0;
   fEvolution  = kFALSE;

   if (fWhat & kMESS_ZIP) {
      // if buffer has kMESS_ZIP set, move it to fBufComp and uncompress
      fBufComp    = fBuffer;
      fBufCompCur = fBuffer + bufsize;
      fBuffer     = 0;
      Uncompress();
   }

   if (fWhat == kMESS_OBJECT) {
      InitMap();
      fClass = ReadClass();     // get first the class stored in message
      SetBufferOffset(sizeof(UInt_t) + sizeof(fWhat));
      ResetMap();
   } else {
      fClass = 0;
   }
}

//______________________________________________________________________________
TMessage::~TMessage()
{
   // Clean up compression buffer.

   delete [] fBufComp;
   delete fInfos;
}

//______________________________________________________________________________
void TMessage::EnableSchemaEvolutionForAll(Bool_t enable)
{
   // Static function enabling or disabling the automatic schema evolution.
   // By default schema evolution support is off.

   fgEvolution = enable;
}

//______________________________________________________________________________
Bool_t TMessage::UsesSchemaEvolutionForAll()
{
   // Static function returning status of global schema evolution.

   return fgEvolution;
}

//______________________________________________________________________________
void TMessage::ForceWriteInfo(TVirtualStreamerInfo *info, Bool_t /* force */)
{
   // Force writing the TStreamerInfo to the message.

   if (fgEvolution || fEvolution) {
      if (!fInfos) fInfos = new TList();
      fInfos->Add(info);
   }
}

//______________________________________________________________________________
void TMessage::Forward()
{
   // Change a buffer that was received into one that can be send, i.e.
   // forward a just received message.

   if (IsReading()) {
      SetWriteMode();
      SetBufferOffset(fBufSize);
      SetBit(kCannotHandleMemberWiseStreaming);

      if (fBufComp) {
         fCompPos = fBufCur;
      }
   }
}

//______________________________________________________________________________
void TMessage::TagStreamerInfo(TVirtualStreamerInfo *info)
{
   // Remember that the StreamerInfo is being used in writing.

   if (fgEvolution || fEvolution) {
      if (!fInfos) fInfos = new TList();
      fInfos->Add(info);
   }
}

//______________________________________________________________________________
void TMessage::Reset()
{
   // Reset the message buffer so we can use (i.e. fill) it again.

   SetBufferOffset(sizeof(UInt_t) + sizeof(fWhat));
   ResetMap();

   if (fBufComp) {
      delete [] fBufComp;
      fBufComp    = 0;
      fBufCompCur = 0;
      fCompPos    = 0;
   }
}

//______________________________________________________________________________
void TMessage::SetLength() const
{
   // Set the message length at the beginning of the message buffer.
   // This method is only called by TSocket::Send().

   if (IsWriting()) {
      char *buf = Buffer();
      tobuf(buf, (UInt_t)(Length() - sizeof(UInt_t)));

      if (fBufComp) {
         buf = fBufComp;
         tobuf(buf, (UInt_t)(CompLength() - sizeof(UInt_t)));
      }
   }
}

//______________________________________________________________________________
void TMessage::SetWhat(UInt_t what)
{
   // Using this method one can change the message type a-posteriory.
   // In case you OR "what" with kMESS_ACK, the message will wait for
   // an acknowledgement from the remote side. This makes the sending
   // process synchronous.

   fWhat = what;

   char *buf = Buffer();
   buf += sizeof(UInt_t);   // skip reserved length space
   tobuf(buf, what);

   if (fBufComp) {
      buf = fBufComp;
      buf += sizeof(UInt_t);   // skip reserved length space
      tobuf(buf, what | kMESS_ZIP);
   }
}

//______________________________________________________________________________
void TMessage::SetCompressionAlgorithm(Int_t algorithm)
{
   if (algorithm < 0 || algorithm >= ROOT::kUndefinedCompressionAlgorithm) algorithm = 0;
   Int_t newCompress;
   if (fCompress < 0) {
      newCompress = 100 * algorithm + 1;
   } else {
      int level = fCompress % 100;
      newCompress = 100 * algorithm + level;
   }
   if (newCompress != fCompress && fBufComp) {
      delete [] fBufComp;
      fBufComp    = 0;
      fBufCompCur = 0;
      fCompPos    = 0;
   }
   fCompress = newCompress;
}

//______________________________________________________________________________
void TMessage::SetCompressionLevel(Int_t level)
{
   if (level < 0) level = 0;
   if (level > 99) level = 99;
   Int_t newCompress;
   if (fCompress < 0) {
      newCompress = level;
   } else {
      int algorithm = fCompress / 100;
      if (algorithm >= ROOT::kUndefinedCompressionAlgorithm) algorithm = 0;
      newCompress = 100 * algorithm + level;
   }
   if (newCompress != fCompress && fBufComp) {
      delete [] fBufComp;
      fBufComp    = 0;
      fBufCompCur = 0;
      fCompPos    = 0;
   }
   fCompress = newCompress;
}

//______________________________________________________________________________
void TMessage::SetCompressionSettings(Int_t settings)
{
   if (settings != fCompress && fBufComp) {
      delete [] fBufComp;
      fBufComp    = 0;
      fBufCompCur = 0;
      fCompPos    = 0;
   }
   fCompress = settings;
}

//______________________________________________________________________________
Int_t TMessage::Compress()
{
   // Compress the message. The message will only be compressed if the
   // compression level > 0 and the if the message is > 256 bytes.
   // Returns -1 in case of error (when compression fails or
   // when the message increases in size in some pathological cases),
   // otherwise returns 0.

   Int_t compressionLevel = GetCompressionLevel();
   Int_t compressionAlgorithm = GetCompressionAlgorithm();
   if (compressionLevel <= 0) {
      // no compression specified
      if (fBufComp) {
         delete [] fBufComp;
         fBufComp    = 0;
         fBufCompCur = 0;
         fCompPos    = 0;
      }
      return 0;
   }

   if (fBufComp && fCompPos == fBufCur) {
      // the message was already compressed
      return 0;
   }

   // remove any existing compressed buffer before compressing modified message
   if (fBufComp) {
      delete [] fBufComp;
      fBufComp    = 0;
      fBufCompCur = 0;
      fCompPos    = 0;
   }

   if (Length() <= (Int_t)(256 + 2*sizeof(UInt_t))) {
      // this message is too small to be compressed
      return 0;
   }

   Int_t hdrlen   = 2*sizeof(UInt_t);
   Int_t messlen  = Length() - hdrlen;
   Int_t nbuffers = 1 + (messlen - 1) / kMAXZIPBUF;
   Int_t chdrlen  = 3*sizeof(UInt_t);   // compressed buffer header length
   Int_t buflen   = TMath::Max(512, chdrlen + messlen + 9*nbuffers);
   fBufComp       = new char[buflen];
   char *messbuf  = Buffer() + hdrlen;
   char *bufcur   = fBufComp + chdrlen;
   Int_t noutot   = 0;
   Int_t nzip     = 0;
   Int_t nout, bufmax;
   for (Int_t i = 0; i < nbuffers; ++i) {
      if (i == nbuffers - 1)
         bufmax = messlen - nzip;
      else
         bufmax = kMAXZIPBUF;
      R__zipMultipleAlgorithm(compressionLevel, &bufmax, messbuf, &bufmax, bufcur, &nout, compressionAlgorithm);
      if (nout == 0 || nout >= messlen) {
         //this happens when the buffer cannot be compressed
         delete [] fBufComp;
         fBufComp    = 0;
         fBufCompCur = 0;
         fCompPos    = 0;
         return -1;
      }
      bufcur  += nout;
      noutot  += nout;
      messbuf += kMAXZIPBUF;
      nzip    += kMAXZIPBUF;
   }
   fBufCompCur = bufcur;
   fCompPos    = fBufCur;

   bufcur = fBufComp;
   tobuf(bufcur, (UInt_t)(CompLength() - sizeof(UInt_t)));
   Int_t what = fWhat | kMESS_ZIP;
   tobuf(bufcur, what);
   tobuf(bufcur, Length());    // original uncompressed buffer length

   return 0;
}

//______________________________________________________________________________
Int_t TMessage::Uncompress()
{
   // Uncompress the message. The message will only be uncompressed when
   // kMESS_ZIP is set. Returns -1 in case of error, 0 otherwise.

   if (!fBufComp || !(fWhat & kMESS_ZIP))
      return -1;

   Int_t buflen;
   Int_t hdrlen = 2*sizeof(UInt_t);
   char *bufcur1 = fBufComp + hdrlen;
   frombuf(bufcur1, &buflen);
   UChar_t *bufcur = (UChar_t*)bufcur1;

   /* early consistency check */
   Int_t nin, nbuf;
   if(R__unzip_header(&nin, bufcur, &nbuf)!=0) {
      Error("Uncompress", "Inconsistency found in header (nin=%d, nbuf=%d)", nin, nbuf);
      return -1;
   }

   fBuffer  = new char[buflen];
   fBufSize = buflen;
   fBufCur  = fBuffer + sizeof(UInt_t) + sizeof(fWhat);
   fBufMax  = fBuffer + fBufSize;
   char *messbuf = fBuffer + hdrlen;

   Int_t nout;
   Int_t noutot = 0;
   while (1) {
      Int_t hc = R__unzip_header(&nin, bufcur, &nbuf);
      if (hc!=0) break;
      R__unzip(&nin, bufcur, &nbuf, (unsigned char*) messbuf, &nout);
      if (!nout) break;
      noutot += nout;
      if (noutot >= buflen - hdrlen) break;
      bufcur  += nin;
      messbuf += nout;
   }

   fWhat &= ~kMESS_ZIP;
   fCompress = 1;

   return 0;
}

//______________________________________________________________________________
void TMessage::WriteObject(const TObject *obj)
{
   // Write object to message buffer.
   // When support for schema evolution is enabled the list of TStreamerInfo
   // used to stream this object is kept in fInfos. This information is used
   // by TSocket::Send that sends this list through the socket. This list is in
   // turn used by TSocket::Recv to store the TStreamerInfo objects in the
   // relevant TClass in case the TClass does not know yet about a particular
   // class version. This feature is implemented to support clients and servers
   // with either different ROOT versions or different user classes versions.

   if (fgEvolution || fEvolution) {
      if (fInfos)
         fInfos->Clear();
      else
         fInfos = new TList();
   }

   fBitsPIDs.ResetAllBits();
   WriteObjectAny(obj, TObject::Class());
}

//______________________________________________________________________________
UShort_t TMessage::WriteProcessID(TProcessID *pid)
{
   // Check if the ProcessID pid is already in the message.
   // If not, then:
   //   - mark bit 0 of fBitsPIDs to indicate that a ProcessID has been found
   //   - mark bit uid+1 where uid id the uid of the ProcessID

   if (fBitsPIDs.TestBitNumber(0)) return 0;
   if (!pid)
      pid = TProcessID::GetPID();
   if (!pid) return 0;
   fBitsPIDs.SetBitNumber(0);
   UInt_t uid = pid->GetUniqueID();
   fBitsPIDs.SetBitNumber(uid+1);
   return 1;
}
 TMessage.cxx:1
 TMessage.cxx:2
 TMessage.cxx:3
 TMessage.cxx:4
 TMessage.cxx:5
 TMessage.cxx:6
 TMessage.cxx:7
 TMessage.cxx:8
 TMessage.cxx:9
 TMessage.cxx:10
 TMessage.cxx:11
 TMessage.cxx:12
 TMessage.cxx:13
 TMessage.cxx:14
 TMessage.cxx:15
 TMessage.cxx:16
 TMessage.cxx:17
 TMessage.cxx:18
 TMessage.cxx:19
 TMessage.cxx:20
 TMessage.cxx:21
 TMessage.cxx:22
 TMessage.cxx:23
 TMessage.cxx:24
 TMessage.cxx:25
 TMessage.cxx:26
 TMessage.cxx:27
 TMessage.cxx:28
 TMessage.cxx:29
 TMessage.cxx:30
 TMessage.cxx:31
 TMessage.cxx:32
 TMessage.cxx:33
 TMessage.cxx:34
 TMessage.cxx:35
 TMessage.cxx:36
 TMessage.cxx:37
 TMessage.cxx:38
 TMessage.cxx:39
 TMessage.cxx:40
 TMessage.cxx:41
 TMessage.cxx:42
 TMessage.cxx:43
 TMessage.cxx:44
 TMessage.cxx:45
 TMessage.cxx:46
 TMessage.cxx:47
 TMessage.cxx:48
 TMessage.cxx:49
 TMessage.cxx:50
 TMessage.cxx:51
 TMessage.cxx:52
 TMessage.cxx:53
 TMessage.cxx:54
 TMessage.cxx:55
 TMessage.cxx:56
 TMessage.cxx:57
 TMessage.cxx:58
 TMessage.cxx:59
 TMessage.cxx:60
 TMessage.cxx:61
 TMessage.cxx:62
 TMessage.cxx:63
 TMessage.cxx:64
 TMessage.cxx:65
 TMessage.cxx:66
 TMessage.cxx:67
 TMessage.cxx:68
 TMessage.cxx:69
 TMessage.cxx:70
 TMessage.cxx:71
 TMessage.cxx:72
 TMessage.cxx:73
 TMessage.cxx:74
 TMessage.cxx:75
 TMessage.cxx:76
 TMessage.cxx:77
 TMessage.cxx:78
 TMessage.cxx:79
 TMessage.cxx:80
 TMessage.cxx:81
 TMessage.cxx:82
 TMessage.cxx:83
 TMessage.cxx:84
 TMessage.cxx:85
 TMessage.cxx:86
 TMessage.cxx:87
 TMessage.cxx:88
 TMessage.cxx:89
 TMessage.cxx:90
 TMessage.cxx:91
 TMessage.cxx:92
 TMessage.cxx:93
 TMessage.cxx:94
 TMessage.cxx:95
 TMessage.cxx:96
 TMessage.cxx:97
 TMessage.cxx:98
 TMessage.cxx:99
 TMessage.cxx:100
 TMessage.cxx:101
 TMessage.cxx:102
 TMessage.cxx:103
 TMessage.cxx:104
 TMessage.cxx:105
 TMessage.cxx:106
 TMessage.cxx:107
 TMessage.cxx:108
 TMessage.cxx:109
 TMessage.cxx:110
 TMessage.cxx:111
 TMessage.cxx:112
 TMessage.cxx:113
 TMessage.cxx:114
 TMessage.cxx:115
 TMessage.cxx:116
 TMessage.cxx:117
 TMessage.cxx:118
 TMessage.cxx:119
 TMessage.cxx:120
 TMessage.cxx:121
 TMessage.cxx:122
 TMessage.cxx:123
 TMessage.cxx:124
 TMessage.cxx:125
 TMessage.cxx:126
 TMessage.cxx:127
 TMessage.cxx:128
 TMessage.cxx:129
 TMessage.cxx:130
 TMessage.cxx:131
 TMessage.cxx:132
 TMessage.cxx:133
 TMessage.cxx:134
 TMessage.cxx:135
 TMessage.cxx:136
 TMessage.cxx:137
 TMessage.cxx:138
 TMessage.cxx:139
 TMessage.cxx:140
 TMessage.cxx:141
 TMessage.cxx:142
 TMessage.cxx:143
 TMessage.cxx:144
 TMessage.cxx:145
 TMessage.cxx:146
 TMessage.cxx:147
 TMessage.cxx:148
 TMessage.cxx:149
 TMessage.cxx:150
 TMessage.cxx:151
 TMessage.cxx:152
 TMessage.cxx:153
 TMessage.cxx:154
 TMessage.cxx:155
 TMessage.cxx:156
 TMessage.cxx:157
 TMessage.cxx:158
 TMessage.cxx:159
 TMessage.cxx:160
 TMessage.cxx:161
 TMessage.cxx:162
 TMessage.cxx:163
 TMessage.cxx:164
 TMessage.cxx:165
 TMessage.cxx:166
 TMessage.cxx:167
 TMessage.cxx:168
 TMessage.cxx:169
 TMessage.cxx:170
 TMessage.cxx:171
 TMessage.cxx:172
 TMessage.cxx:173
 TMessage.cxx:174
 TMessage.cxx:175
 TMessage.cxx:176
 TMessage.cxx:177
 TMessage.cxx:178
 TMessage.cxx:179
 TMessage.cxx:180
 TMessage.cxx:181
 TMessage.cxx:182
 TMessage.cxx:183
 TMessage.cxx:184
 TMessage.cxx:185
 TMessage.cxx:186
 TMessage.cxx:187
 TMessage.cxx:188
 TMessage.cxx:189
 TMessage.cxx:190
 TMessage.cxx:191
 TMessage.cxx:192
 TMessage.cxx:193
 TMessage.cxx:194
 TMessage.cxx:195
 TMessage.cxx:196
 TMessage.cxx:197
 TMessage.cxx:198
 TMessage.cxx:199
 TMessage.cxx:200
 TMessage.cxx:201
 TMessage.cxx:202
 TMessage.cxx:203
 TMessage.cxx:204
 TMessage.cxx:205
 TMessage.cxx:206
 TMessage.cxx:207
 TMessage.cxx:208
 TMessage.cxx:209
 TMessage.cxx:210
 TMessage.cxx:211
 TMessage.cxx:212
 TMessage.cxx:213
 TMessage.cxx:214
 TMessage.cxx:215
 TMessage.cxx:216
 TMessage.cxx:217
 TMessage.cxx:218
 TMessage.cxx:219
 TMessage.cxx:220
 TMessage.cxx:221
 TMessage.cxx:222
 TMessage.cxx:223
 TMessage.cxx:224
 TMessage.cxx:225
 TMessage.cxx:226
 TMessage.cxx:227
 TMessage.cxx:228
 TMessage.cxx:229
 TMessage.cxx:230
 TMessage.cxx:231
 TMessage.cxx:232
 TMessage.cxx:233
 TMessage.cxx:234
 TMessage.cxx:235
 TMessage.cxx:236
 TMessage.cxx:237
 TMessage.cxx:238
 TMessage.cxx:239
 TMessage.cxx:240
 TMessage.cxx:241
 TMessage.cxx:242
 TMessage.cxx:243
 TMessage.cxx:244
 TMessage.cxx:245
 TMessage.cxx:246
 TMessage.cxx:247
 TMessage.cxx:248
 TMessage.cxx:249
 TMessage.cxx:250
 TMessage.cxx:251
 TMessage.cxx:252
 TMessage.cxx:253
 TMessage.cxx:254
 TMessage.cxx:255
 TMessage.cxx:256
 TMessage.cxx:257
 TMessage.cxx:258
 TMessage.cxx:259
 TMessage.cxx:260
 TMessage.cxx:261
 TMessage.cxx:262
 TMessage.cxx:263
 TMessage.cxx:264
 TMessage.cxx:265
 TMessage.cxx:266
 TMessage.cxx:267
 TMessage.cxx:268
 TMessage.cxx:269
 TMessage.cxx:270
 TMessage.cxx:271
 TMessage.cxx:272
 TMessage.cxx:273
 TMessage.cxx:274
 TMessage.cxx:275
 TMessage.cxx:276
 TMessage.cxx:277
 TMessage.cxx:278
 TMessage.cxx:279
 TMessage.cxx:280
 TMessage.cxx:281
 TMessage.cxx:282
 TMessage.cxx:283
 TMessage.cxx:284
 TMessage.cxx:285
 TMessage.cxx:286
 TMessage.cxx:287
 TMessage.cxx:288
 TMessage.cxx:289
 TMessage.cxx:290
 TMessage.cxx:291
 TMessage.cxx:292
 TMessage.cxx:293
 TMessage.cxx:294
 TMessage.cxx:295
 TMessage.cxx:296
 TMessage.cxx:297
 TMessage.cxx:298
 TMessage.cxx:299
 TMessage.cxx:300
 TMessage.cxx:301
 TMessage.cxx:302
 TMessage.cxx:303
 TMessage.cxx:304
 TMessage.cxx:305
 TMessage.cxx:306
 TMessage.cxx:307
 TMessage.cxx:308
 TMessage.cxx:309
 TMessage.cxx:310
 TMessage.cxx:311
 TMessage.cxx:312
 TMessage.cxx:313
 TMessage.cxx:314
 TMessage.cxx:315
 TMessage.cxx:316
 TMessage.cxx:317
 TMessage.cxx:318
 TMessage.cxx:319
 TMessage.cxx:320
 TMessage.cxx:321
 TMessage.cxx:322
 TMessage.cxx:323
 TMessage.cxx:324
 TMessage.cxx:325
 TMessage.cxx:326
 TMessage.cxx:327
 TMessage.cxx:328
 TMessage.cxx:329
 TMessage.cxx:330
 TMessage.cxx:331
 TMessage.cxx:332
 TMessage.cxx:333
 TMessage.cxx:334
 TMessage.cxx:335
 TMessage.cxx:336
 TMessage.cxx:337
 TMessage.cxx:338
 TMessage.cxx:339
 TMessage.cxx:340
 TMessage.cxx:341
 TMessage.cxx:342
 TMessage.cxx:343
 TMessage.cxx:344
 TMessage.cxx:345
 TMessage.cxx:346
 TMessage.cxx:347
 TMessage.cxx:348
 TMessage.cxx:349
 TMessage.cxx:350
 TMessage.cxx:351
 TMessage.cxx:352
 TMessage.cxx:353
 TMessage.cxx:354
 TMessage.cxx:355
 TMessage.cxx:356
 TMessage.cxx:357
 TMessage.cxx:358
 TMessage.cxx:359
 TMessage.cxx:360
 TMessage.cxx:361
 TMessage.cxx:362
 TMessage.cxx:363
 TMessage.cxx:364
 TMessage.cxx:365
 TMessage.cxx:366
 TMessage.cxx:367
 TMessage.cxx:368
 TMessage.cxx:369
 TMessage.cxx:370
 TMessage.cxx:371
 TMessage.cxx:372
 TMessage.cxx:373
 TMessage.cxx:374
 TMessage.cxx:375
 TMessage.cxx:376
 TMessage.cxx:377
 TMessage.cxx:378
 TMessage.cxx:379
 TMessage.cxx:380
 TMessage.cxx:381
 TMessage.cxx:382
 TMessage.cxx:383
 TMessage.cxx:384
 TMessage.cxx:385
 TMessage.cxx:386
 TMessage.cxx:387
 TMessage.cxx:388
 TMessage.cxx:389
 TMessage.cxx:390
 TMessage.cxx:391
 TMessage.cxx:392
 TMessage.cxx:393
 TMessage.cxx:394
 TMessage.cxx:395
 TMessage.cxx:396
 TMessage.cxx:397
 TMessage.cxx:398
 TMessage.cxx:399
 TMessage.cxx:400
 TMessage.cxx:401
 TMessage.cxx:402
 TMessage.cxx:403
 TMessage.cxx:404
 TMessage.cxx:405
 TMessage.cxx:406
 TMessage.cxx:407
 TMessage.cxx:408
 TMessage.cxx:409
 TMessage.cxx:410
 TMessage.cxx:411
 TMessage.cxx:412
 TMessage.cxx:413
 TMessage.cxx:414
 TMessage.cxx:415
 TMessage.cxx:416
 TMessage.cxx:417
 TMessage.cxx:418
 TMessage.cxx:419
 TMessage.cxx:420
 TMessage.cxx:421
 TMessage.cxx:422
 TMessage.cxx:423
 TMessage.cxx:424
 TMessage.cxx:425
 TMessage.cxx:426
 TMessage.cxx:427
 TMessage.cxx:428
 TMessage.cxx:429
 TMessage.cxx:430
 TMessage.cxx:431
 TMessage.cxx:432
 TMessage.cxx:433
 TMessage.cxx:434
 TMessage.cxx:435
 TMessage.cxx:436
 TMessage.cxx:437
 TMessage.cxx:438
 TMessage.cxx:439
 TMessage.cxx:440
 TMessage.cxx:441
 TMessage.cxx:442
 TMessage.cxx:443
 TMessage.cxx:444