1    	#include "StMessMgr.h"
2    	#include <string.h>
3    	
4    	#ifdef __ROOT__
5    	ClassImp(StMessMgr)
6    	#endif
7    	
8    	StMessMgr* gMessMgr = 0;
9    	StMessage* endm     = 0;
10   	StMessage* gMessage = 0;
11   	
12   	//______________________________________________________________________________
13   	StMessMgr::StMessMgr() : ostrstream() {}
14   	
15   	//  Manager factory
16   	//  The default version of the manager factory provide the singleton object
17   	//______________________________________________________________________________
18   	StMessMgr*  StMessMgr::CurrentMessager() { return gMessMgr;}
19   	//______________________________________________________________________________
20   	StMessMgr*  StMessMgr::Instance() { return (gMessMgr)?gMessMgr->Instantiate():0;}
21   	//______________________________________________________________________________
22   	StMessMgr*  StMessMgr::Instance(const char *loggerName)
23   	{return (gMessMgr)?gMessMgr->Instantiate(loggerName):0; }
24   	//______________________________________________________________________________
25   	StMessMgr*  StMessMgr::SetCurrentMessager(StMessMgr *mgr)
26   	{
27   	   // Set the new value for the current logger manager and return the previous one
28   	   StMessMgr* old = gMessMgr;
29   	   gMessMgr=mgr;
30   	   return old;
31   	}
32   	//______________________________________________________________________________
33   	StMessMgr*  StMessMgr::Instantiate()            {return gMessMgr;     }
34   	//______________________________________________________________________________
35   	StMessMgr*  StMessMgr::Instantiate(const char *){return Instantiate();}
36   	
37   	//______________________________________________________________________________
38   	bool  StMessMgr::isDebugEnabled()  const{ return true; }
39   	//______________________________________________________________________________
40   	bool  StMessMgr::isWarnEnabled()   const{ return true; }
41   	//______________________________________________________________________________
42   	bool  StMessMgr::isWarningEnabled()   const{ return isWarnEnabled(); }
43   	//______________________________________________________________________________
44   	bool  StMessMgr::isErrorEnabled()  const{ return true; }
45   	//______________________________________________________________________________
46   	bool  StMessMgr::isInfoEnabled()   const{ return true; }
47   	//______________________________________________________________________________
48   	bool  StMessMgr::isFatalEnabled()  const{ return true; }
49   	//______________________________________________________________________________
50   	bool  StMessMgr::isEnabledFor()    const{ return true; }
51   	//______________________________________________________________________________
52   	bool  StMessMgr::isQAInfoEnabled() const{ return true; }
53   	//______________________________________________________________________________
54   	bool  StMessMgr::isUCMInfoEnabled()const{ return true; }
55   	
56   	//
57   	// C and Fortran routines:
58   	//________________________________________
59   	static const char defaultMessType = 'I';
60   	static char emptyString[] = "";
61   	static char oOpt[] = "O";
62   	static char otsOpt[] = "OTS";
63   	static char eOpt[] = "E";
64   	static char nullMess[] = "Null message!!!";
65   	#ifdef __linux__
66   	static int sMessLength;
67   	#endif
68   	
69   	void type_of_call Message_(const char* mess, int* lines, int*, size_t len) {
70   	  static char space = ' ';
71   	  static const char* messReturnChar = "\n";
72   	  size_t messSize = strlen(mess);
73   	  char* mess2=const_cast<char*> (mess);
74   	  int del_mess = 0;
75   	  if (*lines>1) {
76   	    char* mess1 = const_cast<char*> (mess);
77   	    mess2 = new char[(messSize+1)]{};    // Build a new version of the
78   	                                         // message with trailing spaces
79   	    for (int i=(*lines); i>0; i--) {     // removed, and \n's inserted.
80   	      int clen = len;                    // Now trusting line length argument.
81   	      while (mess1[--clen] == space) {}
82   	      strncat(mess2,mess1,(++clen));
83   	      if (i>1) {
84   	        strcat(mess2,messReturnChar);
85   	        mess1 = &(mess1[len]);
86   	      }
87   	    }
88   	    strcat(mess2,emptyString);
89   	    del_mess = 1;
90   	  } else {
91   	#ifdef __linux__
92   	    sMessLength = len;
93   	#endif
94   	    if ((len>1) && (messSize > len)) {
95   	      mess2 = new char[(len+1)]{};
96   	      strncpy(mess2,mess,len);
97   	      del_mess = 1;
98   	    }
99   	  }
100  	  gMessMgr->Message(mess2);
101  	  if (del_mess) delete [] mess2;
102  	}
103  	//________________________________________
104  	void type_of_call Msg_Enable_(const char* mess, size_t len) {
105  	  size_t messlen = strlen(mess);
106  	  if ((len>1) && (messlen > len)) {
107  	    char* mess2 = new char[(len+1)]{};
108  	    strncpy(mess2,mess,len);
109  	    gMessMgr->SwitchOn(mess2);
110  	    delete [] mess2;
111  	  } else {
112  	    gMessMgr->SwitchOn(mess);
113  	  }
114  	}
115  	//________________________________________
116  	int type_of_call Msg_Enabled_(const char* mess, int*, size_t len) {
117  	  size_t messlen = strlen(mess);
118  	  int ret_val = 1;
119  	  if ((len>1) && (messlen > len)) {
120  	    char* mess2 = new char[(len+1)]{};
121  	    strncpy(mess2,mess,len);
122  	    if ((gMessMgr->GetLimit(mess2))==0) ret_val = 0;
123  	    delete [] mess2;
124  	  } else {
125  	    if ((gMessMgr->GetLimit(mess))==0) ret_val = 0;
126  	  }
127  	  return ret_val;
128  	}
129  	//________________________________________
130  	void type_of_call Msg_Disable_(const char* mess, size_t len) {
131  	  size_t messlen = strlen(mess);
132  	  if ((len>1) && (messlen > len)) {
133  	    char* mess2 = new char[(len+1)]{};
134  	    strncpy(mess2,mess,len);
135  	    gMessMgr->SwitchOff(mess2);
136  	    delete [] mess2;
137  	  } else {
138  	    gMessMgr->SwitchOff(mess);
139  	  }
140  	}
141  	//________________________________________
142  	void type_of_call MessageOut( const char *msg ) {
143  	  gMessMgr->Message(msg);
144  	}
145  	//________________________________________
146  	void type_of_call StCaller(const char* mess, const char* typString,
147  	                           const char* opt, size_t len) {
148  	#ifdef __linux__
149  	  sMessLength = len;
150  	#endif
151  	  if (mess[0]==0) {
152  	    gMessMgr->Message(nullMess,"E",eOpt);
153  	    return;
154  	  }
155  	
156  	  size_t messlen = strlen(mess);
157  	  if ((len>1) && (messlen > len)) messlen = len;
158  	  char* mess2 = new char[(messlen+1)]{};
159  	  strncpy(mess2,mess,messlen);
160  	  
161  	  gMessMgr->Message(mess2,typString,opt);
162  	  delete [] mess2;
163  	}
164  	//________________________________________
165  	void type_of_call StCallerOpt(const char* mess, const char* typString,
166  	                              const char* opt, size_t len1, size_t len2,
167  	                              char* optString) {
168  	  char* opt2=const_cast<char*> (opt);
169  	  int del_opt=0;
170  	
171  	  if (len2<=0) {
172  	    opt2=optString;
173  	  } else if (strlen(opt) > len2) {
174  	    opt2 = new char[(len2+1)]{};
175  	    strncpy(opt2,opt,len2);
176  	    del_opt = 1;
177  	  }
178  	
179  	  StCaller(mess,typString,opt2,len1);
180  	  if (del_opt) delete [] opt2;
181  	}
182  	//________________________________________
183  	void type_of_call StMessage_(const char* mess, const char* type,
184  	                             const char* opt, size_t len1,
185  				     size_t len2, size_t len3) {
186  	  char* type2=const_cast<char*> (type);
187  	  int del_type=0;
188  	
189  	  if (len2<=0) {
190  	    type2=emptyString;
191  	  } else if (strlen(type) > len2) {
192  	    type2 = new char[(len2+1)]{};
193  	    strncpy(type2,type,len2);
194  	    del_type = 1;
195  	  }
196  	
197  	  StCallerOpt(mess,type2,opt,len1,len3,oOpt);
198  	  if (del_type) delete [] type2;
199  	}
200  	//________________________________________
201  	void type_of_call StInfo_(const char* mess, size_t len) {
202  	  StCaller(mess,"I",oOpt,len);
203  	}
204  	//________________________________________
205  	void type_of_call StWarning_(const char* mess, size_t len) {
206  	  StCaller(mess,"W",eOpt,len);
207  	}
208  	//________________________________________
209  	void type_of_call StError_(const char* mess, size_t len) {
210  	  StCaller(mess,"E",eOpt,len);
211  	}
212  	//________________________________________
213  	void type_of_call StDebug_(const char* mess, size_t len) {
214  	  StCaller(mess,"D",oOpt,len);
215  	}
216  	//________________________________________
217  	void type_of_call QAInfo_(const char* mess, size_t len) {
218  	  StCaller(mess,"Q",otsOpt,len);
219  	}
220  	//________________________________________
221  	void type_of_call UCMInfo_(const char* mess, size_t len) {
222  	  StCaller(mess,"U",otsOpt,len);
223  	}
224  	//________________________________________
225  	void type_of_call StInfoOpt_(const char* mess, const char* opt,
226  	                             size_t len1, size_t len2) {
227  	  StCallerOpt(mess,"I",opt,len1,len2,oOpt);
228  	}
229  	//________________________________________
230  	void type_of_call StWarningOpt_(const char* mess, const char* opt,
231  	                                size_t len1, size_t len2) {
232  	  StCallerOpt(mess,"W",opt,len1,len2,eOpt);
233  	}
234  	//________________________________________
235  	void type_of_call StErrorOpt_(const char* mess, const char* opt,
236  	                              size_t len1, size_t len2) {
237  	  StCallerOpt(mess,"E",opt,len1,len2,eOpt);
238  	}
239  	//________________________________________
240  	void type_of_call StDebugOpt_(const char* mess, const char* opt,
241  	                              size_t len1, size_t len2) {
242  	  StCallerOpt(mess,"D",opt,len1,len2,oOpt);
243  	}
244  	//________________________________________
245  	void type_of_call QAInfoOpt_(const char* mess, const char* opt,
246  	                             size_t len1, size_t len2) {
247  	  StCallerOpt(mess,"Q",opt,len1,len2,otsOpt);
248  	}
249  	//________________________________________
250  	void type_of_call UCMInfoOpt_(const char* mess, const char* opt,
251  	                             size_t len1, size_t len2) {
252  	  StCallerOpt(mess,"U",opt,len1,len2,otsOpt);
253  	}
254  	//________________________________________
255  	void type_of_call StMessAddType_(const char* type, const char* text,
256  	                                 size_t len1, size_t len2) {
257  	  if (strlen(type) > len1) (const_cast<char*> (type))[len1] = 0;
258  	  if (strlen(text) > len2) (const_cast<char*> (text))[len2] = 0;
259  	  gMessMgr->AddType(type,text);
260  	}
261  	
262  	//_____________________________________________________________________________
263  	// $Id: StMessMgr.cxx,v 1.7 2009/06/22 22:36:02 fine Exp $
264