#include "QFramework/TQMessageStream.h"
#include <fstream>
#include <sstream>
#include "QFramework/TQUtils.h"

// #define _DEBUG_

#include "QFramework/TQLibrary.h"

////////////////////////////////////////////////////////////////////////////////////////////////
//
// TQMessageStream
//
// TQMessageStream is a helper class that provides an additional
// abstraction layer between I/O tasks and the I/O stream objects of
// the standard library. It can be helpful to control verbosity levels
// and redirect text output into log files.
//
////////////////////////////////////////////////////////////////////////////////////////////////

TQMessageStream& TQMessageStream::operator=(const TQMessageStream& other){
  // assign another stream to this one
  // this stream will become an exact copy of the other
  // stream ownership will stay with the other
  // if ownership shall be transferred, please use absorb(...)
  this->owner = false;
  this->colors = other.colors;
  this->close();
  this->stream = other.stream;
  this->endl = other.endl;
  return *this;
}

TString TQMessageStream::getMessages(){
  // retrieve the messages
  // if the underlying stream is I/O (stringstream),
  // this will return a string of all messages sent
  // since the last call of clearMessages
  // of the underlying stream is O (ofstream,cout),
  // this will return the empty string
  std::stringstream* ss = dynamic_cast<std::stringstream*>(this->stream);
  if(ss) return TString(ss->str().c_str());
  else return TString("");
}

void TQMessageStream::close(){
  // close the underlying stream
  // calling this function will only have an effect if
  // - the stream is owned by this instance, and
  // - the stream is an ofstream
  if(this->owner){
    std::ofstream* of = dynamic_cast<std::ofstream*>(this->stream);
    if(of){
#ifdef _DEBUG_
      std::cout << "closing output stream at " << &(this->activeStream()) << std::endl;
#endif
      of->flush();
      of->close();
    }
    delete this->stream;
    this->owner = false;
  }
  this->colors = true;
}

bool TQMessageStream::isFile(){
  // return true if this message stream streams to a file, false otherwise
  return (bool)(dynamic_cast<std::ofstream*>(this->stream));
}

bool TQMessageStream::isCOUT(){
  // return true if this message stream streams to std::cout, false otherwise
  return (bool)(&std::cout == this->stream);
}

bool TQMessageStream::isCERR(){
  // return true if this message stream streams to std::cerr, false otherwise
  return (bool)(&std::cerr == this->stream);
}

void TQMessageStream::clearMessages(){
  // clear all messages since the beginning of time
  // will only take effect if the underlying stream
  // is I/O (stringstream)
  std::stringstream* ss = dynamic_cast<std::stringstream*>(this->stream);
  if(ss) ss->str("");
}

TQMessageStream::TQMessageStream():
  stream(&std::cout),
  owner(false),
  colors(true),
  endl("\n"),
  useBuffer(false),
  overhang(false)
{
  // default constructor (will use colored ASCII std::cout)
}

TQMessageStream::TQMessageStream(std::ostream& _stream, bool _owner, bool _colors) :
  stream(&_stream),
  owner(_owner),
  colors(_colors),
  endl("\n"),
  useBuffer(false),
  overhang(false)
{
  // custom constructor with stream reference
}

TQMessageStream::TQMessageStream(std::ostream* _stream, bool _owner, bool _colors) :
  stream(_stream),
  owner(_owner),
  colors(_colors),
  endl("\n"),
  useBuffer(false),
  overhang(false)
{
  // custom constructor with stream pointer
}

TQMessageStream::TQMessageStream(const TString& fname, bool _colors) :
  stream(NULL),
  owner(true),
  colors(_colors),
  endl("\n"),
  useBuffer(false),
  overhang(false)
{
  // custom constructor with filename
  // will open a log file at the given location
  this->open(fname);
}

void TQMessageStream::reopen(bool append){
  // re-open the log file
  this->open(this->filename,append);
}

bool TQMessageStream::open(const TString& fname, bool append){
  // open a log file at the given location
  if(!TQUtils::ensureDirectoryForFile(fname)){
    ERRORfunc("unable to open file '%s' for logging, continue to use previous stream",fname.Data());
    return false;
  }
  std::ofstream* os = new std::ofstream(fname, append ? std::ofstream::out | std::ofstream::app : std::ofstream::out);
#ifdef _DEBUG_
  std::cerr << "opening output stream '" << fname << "' at " << os << std::endl;
#endif
  if(!os->is_open()){
    delete os;
    ERRORfunc("unable to open file '%s' for logging, continue to use previous stream",fname.Data());
    return false;
  } else {
    this->close();
    this->owner = true;
    this->filename = fname;
    this->stream = os;
    this->colors = false;
  }
  return true;
}

TQMessageStream::~TQMessageStream(){
  // destructor - will call close()
  this->close();
}

void TQMessageStream::absorb(const TQMessageStream& other){
  // absorb another stream
  // this stream will become an exact copy of the other
  // and henceforth own the other's stream
  // the ownership of the other stream will be removed
  this->stream = other.stream;
  this->colors = other.colors;
  this->owner = other.owner;
  other.owner = false;
}

bool TQMessageStream::isGood(){
  // return true if this instance is good for streaming output
  // return false otherwise
  return this->stream;
}

const TString& TQMessageStream::getFilename(){
  // return the filename associated to this stream
  return this->filename;
}

void TQMessageStream::startProcessInfo (TQMessageStream::MessageType type, int lineWidth, const TString& align, TString fmt, ...){
  // start a "process info"
  if(!this->isGood()) return;
  va_list ap;
  va_start(ap, va_(fmt));
  TString text = TQStringUtils::vaFormat(va_(fmt), ap);
  va_end(ap);
  this->startBuffer();
  TString msgHead = TQMessageStream::getMessageTypeString(type) + TQMessageStream::formatMessageMetaText(type,": ");
  int headLength = TQStringUtils::getWidth(msgHead) + 8; // the additinal characters come from spaces & the tail, i.e. "[ OK ]"
  this->tmpString = msgHead + TQStringUtils::fixedWidth(TQMessageStream::formatMessageContentText(type,text),lineWidth-headLength,align);
  this->overhang = true;
  std::cout << this->tmpString << " " << TQMessageStream::getInfoTypeString(TQMessageStream::PENDING) << "\r";
  std::cout.flush();
}
void TQMessageStream::endProcessInfo (TQMessageStream::InfoType result){
  // end a "process info"
  if(!this->isGood()) return;
  this->overhang = false;
  std::cout << this->tmpString << " " << TQMessageStream::getInfoTypeString(result) << std::endl;
  this->tmpString.Clear();
  this->flushBuffer();
}

void TQMessageStream::newline(){
  // submit a newline
  this->activeStream() << this->endl;
}

void TQMessageStream::newlines(size_t n){
  // submit n newlines
  for(size_t i=0; i<n; i++){
    this->activeStream() << this->endl;
  }
}

void TQMessageStream::sendMessage (TQMessageStream::MessageType type, TString fmt, ...){
  // send a message
  if(!this->isGood()) return;
  va_list ap;
  va_start(ap, va_(fmt));
  TString text = TQStringUtils::vaFormat(va_(fmt), ap);
  va_end(ap);
#ifdef _DEBUG_
  std::cout << "writing to " << &(this->activeStream()) << std::endl;
#endif
  this->activeStream() << TQMessageStream::getMessageTypeString(type) << TQMessageStream::formatMessageMetaText(type,": ") << TQMessageStream::formatMessageContentText(type,text) << this->endl;
  TQMessageStream::triggerMessageAction(type);
  countMessage(type);
}

void TQMessageStream::sendFileLineMessage (TQMessageStream::MessageType type, const TString& file, int line, TString fmt, ...){
  // send a message message with file and line information
  if(!this->isGood()) return;
  va_list ap;
  va_start(ap, va_(fmt));
  TString text = TQStringUtils::vaFormat(va_(fmt), ap);
  va_end(ap);
  this->activeStream() << TQMessageStream::getMessageTypeString(type) << TQMessageStream::formatMessageMetaText(type,TQStringUtils::format(" in %s [l.%d]: ",file.Data(),line)) << TQMessageStream::formatMessageContentText(type,text) << this->endl;
  TQMessageStream::triggerMessageAction(type);
  countMessage(type);
}

void TQMessageStream::sendClassFunctionMessage (TQMessageStream::MessageType type, TClass* tclass, const TString& fname, TString fmt, ...){
  // send a message with class and function information
  if(!this->isGood()) return;
  va_list ap;
  va_start(ap, va_(fmt));
  TString text = TQStringUtils::vaFormat(va_(fmt), ap);
  va_end(ap);
  this->activeStream() << TQMessageStream::getMessageTypeString(type) << TQMessageStream::formatMessageMetaText(type,TQStringUtils::format(" in %s::%s(...) : ",tclass->GetName(),fname.Data())) << TQMessageStream::formatMessageContentText(type,text) << this->endl;
  TQMessageStream::triggerMessageAction(type);
  countMessage(type);
}

void TQMessageStream::sendFunctionMessage (TQMessageStream::MessageType type, const TString& fname, TString fmt, ...){
  // send a message with function information
  if(!this->isGood()) return;
  va_list ap;
  va_start(ap, va_(fmt));
  TString text = TQStringUtils::vaFormat(va_(fmt), ap);
  va_end(ap);
  this->activeStream() << TQMessageStream::getMessageTypeString(type) << TQMessageStream::formatMessageMetaText(type,TQStringUtils::format(" in %s(...) : ",fname.Data())) << TQMessageStream::formatMessageContentText(type,text) << this->endl;
  TQMessageStream::triggerMessageAction(type);
  countMessage(type);
}

void TQMessageStream::sendClassFunctionArgsMessage (TQMessageStream::MessageType type, TClass* tclass, const TString& fname, const TString& fargs, TString fmt, ...){
  // send a message with class, function and argument information
  if(!this->isGood()) return;
  va_list ap;
  va_start(ap, va_(fmt));
  TString text = TQStringUtils::vaFormat(va_(fmt), ap);
  va_end(ap);
  this->activeStream() << TQMessageStream::getMessageTypeString(type) << TQMessageStream::formatMessageMetaText(type,TQStringUtils::format(" in %s::%s(%s) : ",tclass->GetName(),fname.Data(),fargs.Data())) << TQMessageStream::formatMessageContentText(type,text) << this->endl;
  TQMessageStream::triggerMessageAction(type);
  countMessage(type);
}

void TQMessageStream::sendFunctionArgsMessage (TQMessageStream::MessageType type, const TString& fname, const TString& fargs, TString fmt, ...){
  // send a message with function and argument information
  if(!this->isGood()) return;
  va_list ap;
  va_start(ap, va_(fmt));
  TString text = TQStringUtils::vaFormat(va_(fmt), ap);
  va_end(ap);
  this->activeStream() << TQMessageStream::getMessageTypeString(type) << TQMessageStream::formatMessageMetaText(type,TQStringUtils::format(" in %s(%s) : ",fname.Data(),fargs.Data())) << TQMessageStream::formatMessageContentText(type,text) << this->endl;
  TQMessageStream::triggerMessageAction(type);
  countMessage(type);
}


TString TQMessageStream::formatMessage (TQMessageStream::MessageType type, TString fmt, ...){
  // format a message
  va_list ap;
  va_start(ap, va_(fmt));
  TString text = TQStringUtils::vaFormat(va_(fmt), ap);
  va_end(ap);
  TQMessageStream::triggerMessageAction(type);
  return TQMessageStream::getMessageTypeString(type) + TQMessageStream::formatMessageMetaText(type,": ") + TQMessageStream::formatMessageContentText(type,text) + this->endl;
}

TString TQMessageStream::formatFileLineMessage (TQMessageStream::MessageType type, const TString& file, int line, TString fmt, ...){
  // format a message message with file and line information
  va_list ap;
  va_start(ap, va_(fmt));
  TString text = TQStringUtils::vaFormat(va_(fmt), ap);
  va_end(ap);
  return TQMessageStream::getMessageTypeString(type) + TQMessageStream::formatMessageMetaText(type,TQStringUtils::format(" in %s [l.%d]: ",file.Data(),line)) + TQMessageStream::formatMessageContentText(type,text) + this->endl;
}

TString TQMessageStream::formatClassFunctionMessage (TQMessageStream::MessageType type, TClass* tclass, const TString& fname, TString fmt, ...){
  // format a message with class and function information
  va_list ap;
  va_start(ap, va_(fmt));
  TString text = TQStringUtils::vaFormat(va_(fmt), ap);
  va_end(ap);
  return TQMessageStream::getMessageTypeString(type) + TQMessageStream::formatMessageMetaText(type,TQStringUtils::format(" in %s::%s(...) : ",tclass->GetName(),fname.Data())) + TQMessageStream::formatMessageContentText(type,text) + this->endl;
}

TString TQMessageStream::formatFunctionMessage (TQMessageStream::MessageType type, const TString& fname, TString fmt, ...){
  // format a message with function information
  va_list ap;
  va_start(ap, va_(fmt));
  TString text = TQStringUtils::vaFormat(va_(fmt), ap);
  va_end(ap);
  return TQMessageStream::getMessageTypeString(type) + TQMessageStream::formatMessageMetaText(type,TQStringUtils::format(" in %s(...) : ",fname.Data())) + TQMessageStream::formatMessageContentText(type,text) + this->endl;
}

TString TQMessageStream::formatClassFunctionArgsMessage (TQMessageStream::MessageType type, TClass* tclass, const TString& fname, const TString& fargs, TString fmt, ...){
  // format a message with class, function and argument information
  va_list ap;
  va_start(ap, va_(fmt));
  TString text = TQStringUtils::vaFormat(va_(fmt), ap);
  va_end(ap);
  return TQMessageStream::getMessageTypeString(type) + TQMessageStream::formatMessageMetaText(type,TQStringUtils::format(" in %s::%s(%s) : ",tclass->GetName(),fname.Data(),fargs.Data())) + TQMessageStream::formatMessageContentText(type,text) + this->endl;
}

TString TQMessageStream::formatFunctionArgsMessage (TQMessageStream::MessageType type, const TString& fname, const TString& fargs, TString fmt, ...){
  // format a message with function and argument information
  va_list ap;
  va_start(ap, va_(fmt));
  TString text = TQStringUtils::vaFormat(va_(fmt), ap);
  va_end(ap);
  return TQMessageStream::getMessageTypeString(type) + TQMessageStream::formatMessageMetaText(type,TQStringUtils::format(" in %s(%s) : ",fname.Data(),fargs.Data())) + TQMessageStream::formatMessageContentText(type,text) + this->endl;
}



void TQMessageStream::setLineEnd(const TString& s){
  // set the line endings to be used
  this->endl = s;
}
TString TQMessageStream::getLineEnd(){
  // retrieve the currently used line endings
  return this->endl;
}


void TQMessageStream::startBuffer(){
  // start using the internal buffer
  this->useBuffer = true;
  this->buffer.str("");
}
void TQMessageStream::flushBuffer(){
  // flush the internal buffer to the stream and close it
  if(!this->stream) return;
  this->useBuffer = false;
  this->activeStream() << this->buffer.str();
  this->buffer.str("");
  this->activeStream().flush();
}

TString TQMessageStream::getStatusString(){
  // retrieve a human-readable string identfying the current status of this stream
  if(!this->isGood()){
    return useBuffer ? "BAD (buffered)" : "BAD";
  }
  if(this->isCOUT()){
    return useBuffer ? "std::cout" : "std::cout (buffered)";
  }
  if(this->isCERR()){
    return useBuffer ? "std::cerr" : "std::cerr (buffered)";
  }
  if(this->isFile()){
    return useBuffer ? TString::Format("file:%s (buffered)",this->filename.Data()) : TString::Format("file:%s",this->filename.Data());
  }
  return useBuffer ? TString::Format("stringstream:%p (buffered)",(void*)(this->stream)) : TString::Format("stringstream:%p",(void*)(this->stream));
}

void TQMessageStream::countMessage(TQMessageStream::MessageType type){
  if (this->stream == &(std::cout)){
    TQMessageStream::countGlobMessage(type);
  }
  else{
    countTmpMessage(type);
  }
}

void TQMessageStream::resetTmpMessageCount(){
  for (auto i = tmpMessageCounter.begin(); i != tmpMessageCounter.end(); i++)
    i->second = 0;
}

void TQMessageStream::countTmpMessage(TQMessageStream::MessageType type, int increment){
  std::map<TQMessageStream::MessageType, unsigned int>::iterator entry = tmpMessageCounter.find(type);
  if (entry == tmpMessageCounter.end()){
    tmpMessageCounter[type] = increment;
    return;
  }
  entry->second = entry->second + increment;
}

void TQMessageStream::countGlobMessage(TQMessageStream::MessageType type, int increment){
  std::map<TQMessageStream::MessageType, unsigned int>::iterator entry = TQMessageStream::globMessageCounter.find(type);
  if (entry == TQMessageStream::globMessageCounter.end()){
    TQMessageStream::globMessageCounter[type] = increment;
    return;
  }
  entry->second = entry->second + increment;
}

void TQMessageStream::uncountGlobMessage(TQMessageStream::MessageType type){
  std::map<TQMessageStream::MessageType, unsigned int>::iterator entry = TQMessageStream::globMessageCounter.find(type);
  if ((entry == TQMessageStream::globMessageCounter.end()) || (entry->second == 0)){
    return;
  }
  entry->second--;
}

unsigned int TQMessageStream::getGlobMessageCount(TQMessageStream::MessageType type){
  std::map<TQMessageStream::MessageType, unsigned int>::iterator entry = TQMessageStream::globMessageCounter.find(type);
  if (entry == TQMessageStream::globMessageCounter.end())
    return 0;
  return entry->second;
}

bool TQMessageStream::printGlobMessageCount(TQMessageStream::MessageType type, bool onlyNonZero){
  unsigned int count = TQMessageStream::getGlobMessageCount(type);
  if ((onlyNonZero) and (count == 0))
    return false;
  TString messageType = TQMessageStream::getMessageTypeString_colors(type);
  TString messageCount = std::to_string(count);
  TString additionalSpaces = TQStringUtils::fixedWidth("", 8-TQStringUtils::getWidth(messageType));
  messageCount = TQStringUtils::fixedWidth(messageCount, std::max(5, TQStringUtils::getWidth(messageCount)), "r");
  messageCount.Prepend(additionalSpaces);
  std::cout << "        ";
  TQLibrary::msgStream.sendMessage(type, messageCount);
  TQMessageStream::uncountGlobMessage(type);
  return true;
}

// It is difficult to loop over enums. Here, we list the enum values that we
// want to loop over explicitly.
std::initializer_list<TQMessageStream::MessageType> TQMessageStream::messageTypesAll =
  {TQMessageStream::DEBUG,
   TQMessageStream::VERBOSE,
   TQMessageStream::INFO,
   TQMessageStream::WARNING,
   TQMessageStream::ERROR,
   TQMessageStream::CRITICAL,
   TQMessageStream::BREAK};
std::initializer_list<TQMessageStream::MessageType> TQMessageStream::messageTypesAlert =
  {TQMessageStream::WARNING,
   TQMessageStream::ERROR,
   TQMessageStream::CRITICAL,
   TQMessageStream::BREAK};
std::map<TQMessageStream::MessageType, unsigned int> TQMessageStream::globMessageCounter = std::map<TQMessageStream::MessageType, unsigned int>();

void TQMessageStream::printGlobMessageCount(){
  INFO("Number of messages printed:");
  for (auto i = TQMessageStream::messageTypesAll.begin(); i != TQMessageStream::messageTypesAll.end(); i++)
    TQMessageStream::printGlobMessageCount(*i);

}

void TQMessageStream::printGlobAlertMessageCount(){
  INFO("Number of alert messages printed:");
  bool messagesPrinted = false;
  for (auto i = TQMessageStream::messageTypesAlert.begin(); i != TQMessageStream::messageTypesAlert.end(); i++){
    messagesPrinted = TQMessageStream::printGlobMessageCount(*i, true) || messagesPrinted;
  }
  if (!messagesPrinted)
    INFO("No messages of type warning or worse printed");
}

void TQMessageStream::addTmpMessageCountToGlobal(){
  // Add temporary message count to global message count and reset
  // temporary counter.
  for (auto i = tmpMessageCounter.begin(); i != tmpMessageCounter.end(); i++){
    TQMessageStream::countGlobMessage(i->first, i->second);
  }
  resetTmpMessageCount();
}

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