ROOT logo
#ifndef HMESSAGEMGR__H
#define HMESSAGEMGR__H

#include "TObject.h"
#include "TString.h"
#include "TSocket.h"
#include "TError.h"
#include "hades.h"

using namespace std;
#include <fstream>
#include <iostream>

#define LEVELMAX 10

#if HDL > 0
/*!
	Macro that prints out a debug message, containing filename and linenumber
	if HDL set to a nonzero value
 */ 
#define DEBUG_msg(level, det, text) \
  ((HMessageMgr *)gHades->getMsg())->setL(__LINE__); \
  ((HMessageMgr *)gHades->getMsg())->setF(__FILE__); \
  ((HMessageMgr *)gHades->getMsg())->debug(level,det, this->GetName(), text);
#else
#define DEBUG_msg(level, det, text) \
  ((HMessageMgr *)gHades->getMsg())->setL(0); \
  ((HMessageMgr *)gHades->getMsg())->setF(""); \
  ((HMessageMgr *)gHades->getMsg())->debug(level,det, this->GetName(), text);
#endif // HDL > 0

/*!
	Macro that prints out an error message via HMessageMgr if set otherwise
	expands to fprintf()
 */
#define ERROR_msg(det, text) \
  if(((HMessageMgr *)gHades->getMsg()) != NULL) \
  ((HMessageMgr *)gHades->getMsg())->error(1, det, this->GetName(), text); \
  else cerr << text << endl;

/*!
	Macro that prints out a warning message via HMessageMgr if set otherwise
	expands to fprintf()
 */
#define WARNING_msg(level, det, text) \
  if(((HMessageMgr *)gHades->getMsg()) != NULL) \
  ((HMessageMgr *)gHades->getMsg())->warning(level,det, this->GetName(), text); \
  else cout << text << endl;

/*!
	Macro that prints out an info message via HMessageMgr if set otherwise
	expands to fprintf()
*/
#define INFO_msg(level, det, text) \
  if(((HMessageMgr *)gHades->getMsg()) != NULL) \
  ((HMessageMgr *)gHades->getMsg())->info((level),(det), (this->GetName()), (text)); \
  else cout << text << endl;

/*!
 Macro that prints out an seperator line via HMessageMgr if set otherwise
	expands to fprintf()
*/
#define SEPERATOR_msg(sep, num) \
  if(((HMessageMgr *)gHades->getMsg()) != NULL) \
  ((HMessageMgr *)gHades->getMsg())->messageSeperator(sep,num); \
  else for(Int_t i=0;i<num;i++) \
    cout << sep; \
    cout << endl;

/// Message manager class to send messages to different outputs.
/*!
	This class manages three different outputs for all kind of messages.
	Besides the standart output, which is the default, one can also
	write the messages to a file, or via a socket to a remote logging process.<p>
	The usage of this class should be done via the four macros that are defined
	in the hmessagemgr.h file.<p>
	DEBUG_msg(level, det, text)<br>
	ERROR_msg(det, text)<br>
	WARNING_msg(level, det, text)<br>
	INFO_msg(level, det, text)<br>
	SEPERATOR_msg(sep,num)<p>
	The meaning of the parameters is:<br>
	level - level of this message, never set it to zero because this means 
	no message at all will be printed<br>
	det   - detector which sends this message, can be one of:<br>
	DET_RICH DET_START DET_MDC DET_TOF DET_TOFINO DET_SHOWER
	DET_TRIGGER DET_KICKPLANE DET_RUNTIMEDB DET_QA<br>
	text  - text to print
 */
class HMessageMgr : public TNamed
{
 public:
  HMessageMgr(const Char_t *name, const Char_t *title);
  ~HMessageMgr(void);

  Bool_t setDefault(void);
  Bool_t setFile(const Char_t *dir);
  Bool_t setPort(const Char_t *host, Int_t port);
  Bool_t switchOff(void);

  void setDebugLevel(Char_t level);
  void setInfoLevel(Char_t level);
  void setWarningLevel(Char_t level);
  void enableDetectorMsg(Int_t det);

  void messageSeperator(const Char_t *seperator, Int_t num);

  static void hydraErrorHandler(Int_t level, Bool_t abort, const Char_t *location, const Char_t *msg);

	// normal version including classname
  void debug(Char_t level, Int_t det, const Char_t *className, const Char_t *text);
  void error(Char_t level, Int_t det, const Char_t *className, const Char_t *text);
  void warning(Char_t level, Int_t det, const Char_t *className, const Char_t *text);
  void info(Char_t level, Int_t det, const Char_t *className, const Char_t *text);

  // version with variable arguments list and classname
  void debug(Int_t level, Int_t det, const Char_t *className, const Char_t *text, ...);
  void error(Int_t level, Int_t det, const Char_t *className, const Char_t *text, ...);
  void warning(Int_t level, Int_t det, const Char_t *className, const Char_t *text, ...);
  void info(Int_t level, Int_t det, const Char_t *className, const Char_t *text, ...);
  
	// version with variable arguments but without classname
  void debugB(Char_t level, Int_t det, const Char_t *text, ...);
  void errorB(Char_t level, Int_t det, const Char_t *text, ...);
  void warningB(Char_t level, Int_t det, const Char_t *text, ...);
  void infoB(Char_t level, Int_t det, const Char_t *text, ...);


  //version with variable argument list including filename and line number
  void debug(Int_t level, Int_t det, const Char_t *className, const Char_t *file, Int_t line, const Char_t *text, ...);

  void setF(const Char_t *name);
  void setL(Int_t num);

	/// Enable output to stdout even if writen to file.
  void setScreenOutput(Bool_t f = kTRUE){screen = f;};

	enum Detector {
			DET_RICH       = 0x001,
			DET_START      = 0x002,
			DET_MDC        = 0x004,
			DET_TOF        = 0x008,
			DET_TOFINO     = 0x010,
			DET_SHOWER     = 0x020,
			DET_TRIGGER    = 0x040,
			DET_RUNTIMEDB  = 0x080,
			DET_KICKPLANE  = 0x100,
			DET_QA         = 0x200,
			DET_ALL        = 0x3ff
	};

 protected:
  void write(const Char_t *text);
  void ewrite(const Char_t *text);

 private:
  Char_t debugLevel;       //!< Level up to which the messages wil be printed.
  Char_t warningLevel;     //!< Level up to which the messages wil be printed.
  Char_t infoLevel;        //!< Level up to which the messages wil be printed.

  ofstream *msgFile;       //!< File to write messages to (debug,warning,info)
  ofstream *errorFile;     //!< File to write error messages to

  TSocket *msgSocket;      //!< Socket to send messages to (debug,warning,info)
  TSocket *errorSocket;    //!< Socket to send error messages to
  TString *thisHost;       //!< Name of this host

  Int_t detectorMsg;       //!< Bitmask fo which detector to print messages
  Char_t *msg1;            //!< internal message variable
	Char_t *msg2;            //!< internal message variable 
  Char_t *file;            //!< pointer to store name of file where message comes from
  Int_t line;              //!< line in file where message comes from
  Bool_t screen;           //!< write to stdout in addition to file or socket

  ClassDef(HMessageMgr,0)  // Message logging facility
};

#endif
 hmessagemgr.h:1
 hmessagemgr.h:2
 hmessagemgr.h:3
 hmessagemgr.h:4
 hmessagemgr.h:5
 hmessagemgr.h:6
 hmessagemgr.h:7
 hmessagemgr.h:8
 hmessagemgr.h:9
 hmessagemgr.h:10
 hmessagemgr.h:11
 hmessagemgr.h:12
 hmessagemgr.h:13
 hmessagemgr.h:14
 hmessagemgr.h:15
 hmessagemgr.h:16
 hmessagemgr.h:17
 hmessagemgr.h:18
 hmessagemgr.h:19
 hmessagemgr.h:20
 hmessagemgr.h:21
 hmessagemgr.h:22
 hmessagemgr.h:23
 hmessagemgr.h:24
 hmessagemgr.h:25
 hmessagemgr.h:26
 hmessagemgr.h:27
 hmessagemgr.h:28
 hmessagemgr.h:29
 hmessagemgr.h:30
 hmessagemgr.h:31
 hmessagemgr.h:32
 hmessagemgr.h:33
 hmessagemgr.h:34
 hmessagemgr.h:35
 hmessagemgr.h:36
 hmessagemgr.h:37
 hmessagemgr.h:38
 hmessagemgr.h:39
 hmessagemgr.h:40
 hmessagemgr.h:41
 hmessagemgr.h:42
 hmessagemgr.h:43
 hmessagemgr.h:44
 hmessagemgr.h:45
 hmessagemgr.h:46
 hmessagemgr.h:47
 hmessagemgr.h:48
 hmessagemgr.h:49
 hmessagemgr.h:50
 hmessagemgr.h:51
 hmessagemgr.h:52
 hmessagemgr.h:53
 hmessagemgr.h:54
 hmessagemgr.h:55
 hmessagemgr.h:56
 hmessagemgr.h:57
 hmessagemgr.h:58
 hmessagemgr.h:59
 hmessagemgr.h:60
 hmessagemgr.h:61
 hmessagemgr.h:62
 hmessagemgr.h:63
 hmessagemgr.h:64
 hmessagemgr.h:65
 hmessagemgr.h:66
 hmessagemgr.h:67
 hmessagemgr.h:68
 hmessagemgr.h:69
 hmessagemgr.h:70
 hmessagemgr.h:71
 hmessagemgr.h:72
 hmessagemgr.h:73
 hmessagemgr.h:74
 hmessagemgr.h:75
 hmessagemgr.h:76
 hmessagemgr.h:77
 hmessagemgr.h:78
 hmessagemgr.h:79
 hmessagemgr.h:80
 hmessagemgr.h:81
 hmessagemgr.h:82
 hmessagemgr.h:83
 hmessagemgr.h:84
 hmessagemgr.h:85
 hmessagemgr.h:86
 hmessagemgr.h:87
 hmessagemgr.h:88
 hmessagemgr.h:89
 hmessagemgr.h:90
 hmessagemgr.h:91
 hmessagemgr.h:92
 hmessagemgr.h:93
 hmessagemgr.h:94
 hmessagemgr.h:95
 hmessagemgr.h:96
 hmessagemgr.h:97
 hmessagemgr.h:98
 hmessagemgr.h:99
 hmessagemgr.h:100
 hmessagemgr.h:101
 hmessagemgr.h:102
 hmessagemgr.h:103
 hmessagemgr.h:104
 hmessagemgr.h:105
 hmessagemgr.h:106
 hmessagemgr.h:107
 hmessagemgr.h:108
 hmessagemgr.h:109
 hmessagemgr.h:110
 hmessagemgr.h:111
 hmessagemgr.h:112
 hmessagemgr.h:113
 hmessagemgr.h:114
 hmessagemgr.h:115
 hmessagemgr.h:116
 hmessagemgr.h:117
 hmessagemgr.h:118
 hmessagemgr.h:119
 hmessagemgr.h:120
 hmessagemgr.h:121
 hmessagemgr.h:122
 hmessagemgr.h:123
 hmessagemgr.h:124
 hmessagemgr.h:125
 hmessagemgr.h:126
 hmessagemgr.h:127
 hmessagemgr.h:128
 hmessagemgr.h:129
 hmessagemgr.h:130
 hmessagemgr.h:131
 hmessagemgr.h:132
 hmessagemgr.h:133
 hmessagemgr.h:134
 hmessagemgr.h:135
 hmessagemgr.h:136
 hmessagemgr.h:137
 hmessagemgr.h:138
 hmessagemgr.h:139
 hmessagemgr.h:140
 hmessagemgr.h:141
 hmessagemgr.h:142
 hmessagemgr.h:143
 hmessagemgr.h:144
 hmessagemgr.h:145
 hmessagemgr.h:146
 hmessagemgr.h:147
 hmessagemgr.h:148
 hmessagemgr.h:149
 hmessagemgr.h:150
 hmessagemgr.h:151
 hmessagemgr.h:152
 hmessagemgr.h:153
 hmessagemgr.h:154
 hmessagemgr.h:155
 hmessagemgr.h:156
 hmessagemgr.h:157
 hmessagemgr.h:158
 hmessagemgr.h:159
 hmessagemgr.h:160
 hmessagemgr.h:161
 hmessagemgr.h:162
 hmessagemgr.h:163
 hmessagemgr.h:164
 hmessagemgr.h:165
 hmessagemgr.h:166
 hmessagemgr.h:167
 hmessagemgr.h:168
 hmessagemgr.h:169
 hmessagemgr.h:170
 hmessagemgr.h:171
 hmessagemgr.h:172
 hmessagemgr.h:173
 hmessagemgr.h:174
 hmessagemgr.h:175
 hmessagemgr.h:176
 hmessagemgr.h:177
 hmessagemgr.h:178