ivaria/reporter.h
Go to the documentation of this file.00001 /* 00002 Copyright (C) 2001 by Jorrit Tyberghein 00003 00004 This library is free software; you can redistribute it and/or 00005 modify it under the terms of the GNU Library General Public 00006 License as published by the Free Software Foundation; either 00007 version 2 of the License, or (at your option) any later version. 00008 00009 This library is distributed in the hope that it will be useful, 00010 but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00012 Library General Public License for more details. 00013 00014 You should have received a copy of the GNU Library General Public 00015 License along with this library; if not, write to the Free 00016 Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 00017 */ 00018 00019 #ifndef __CS_IVARIA_REPORTER_H__ 00020 #define __CS_IVARIA_REPORTER_H__ 00021 00022 #include "iutil/objreg.h" 00023 #include "iutil/threadmanager.h" 00024 00025 #include "csutil/ansicommand.h" 00026 #include "csutil/scf_interface.h" 00027 #include "csutil/sysfunc.h" 00028 #include "csutil/util.h" 00029 00036 struct iReporter; 00037 00045 #define CS_REPORTER_SEVERITY_BUG 0 00046 00052 #define CS_REPORTER_SEVERITY_ERROR 1 00053 00058 #define CS_REPORTER_SEVERITY_WARNING 2 00059 00064 #define CS_REPORTER_SEVERITY_NOTIFY 3 00065 00071 #define CS_REPORTER_SEVERITY_DEBUG 4 00072 00086 struct iReporterListener : public virtual iBase 00087 { 00088 SCF_INTERFACE (iReporterListener, 1, 0, 0); 00089 00095 THREADED_INTERFACE4(Report, iReporter* reporter, int severity, const char* msgId, 00096 const char* description); 00097 }; 00098 00106 struct iReporterIterator : public virtual iBase 00107 { 00108 SCF_INTERFACE(iReporterIterator, 2, 0, 0); 00109 00111 virtual bool HasNext () = 0; 00116 virtual void Next () = 0; 00117 00121 virtual int GetMessageSeverity () const = 0; 00122 00126 virtual const char* GetMessageId () const = 0; 00127 00131 virtual const char* GetMessageDescription () const = 0; 00132 }; 00133 00154 struct iReporter : public virtual iBase 00155 { 00156 SCF_INTERFACE(iReporter, 2, 0, 0); 00157 00164 virtual void Report (int severity, const char* msgId, 00165 const char* description, ...) CS_GNUC_PRINTF(4, 5) = 0; 00166 00171 virtual void ReportV (int severity, const char* msgId, 00172 const char* description, va_list) CS_GNUC_PRINTF(4, 0) = 0; 00173 00179 virtual void Clear (int severity = -1) = 0; 00180 00187 virtual void Clear (const char* mask) = 0; 00188 00193 virtual csPtr<iReporterIterator> GetMessageIterator () = 0; 00194 00201 virtual void AddReporterListener (iReporterListener* listener) = 0; 00202 00209 virtual void RemoveReporterListener (iReporterListener* listener) = 0; 00210 00214 virtual bool FindReporterListener (iReporterListener* listener) = 0; 00215 00216 //---------------------------------------------------------------------- 00217 // Convenience functions, these are not to be implemented in the plugin. 00218 //---------------------------------------------------------------------- 00219 00224 inline void ReportError (const char* msgId, const char* description, ...) 00225 CS_GNUC_PRINTF (3, 4); 00226 00231 inline void ReportWarning (const char* msgId, const char* description, ...) 00232 CS_GNUC_PRINTF (3, 4); 00233 00238 inline void ReportNotify (const char* msgId, const char* description, ...) 00239 CS_GNUC_PRINTF (3, 4); 00240 00245 inline void ReportBug (const char* msgId, const char* description, ...) 00246 CS_GNUC_PRINTF (3, 4); 00247 00252 inline void ReportDebug (const char* msgId, const char* description, ...) 00253 CS_GNUC_PRINTF (3, 4); 00254 }; 00255 00256 inline void iReporter::ReportError 00257 (const char* msgId, const char* description, ...) 00258 { 00259 va_list arg; 00260 va_start (arg, description); 00261 ReportV (CS_REPORTER_SEVERITY_ERROR, msgId, description, arg); 00262 va_end (arg); 00263 } 00264 00265 inline void iReporter::ReportWarning 00266 (const char* msgId, const char* description, ...) 00267 { 00268 va_list arg; 00269 va_start (arg, description); 00270 ReportV (CS_REPORTER_SEVERITY_WARNING, msgId, description, arg); 00271 va_end (arg); 00272 } 00273 00274 inline void iReporter::ReportNotify 00275 (const char* msgId, const char* description, ...) 00276 { 00277 va_list arg; 00278 va_start (arg, description); 00279 ReportV (CS_REPORTER_SEVERITY_NOTIFY, msgId, description, arg); 00280 va_end (arg); 00281 } 00282 00283 inline void iReporter::ReportBug 00284 (const char* msgId, const char* description, ...) 00285 { 00286 va_list arg; 00287 va_start (arg, description); 00288 ReportV (CS_REPORTER_SEVERITY_BUG, msgId, description, arg); 00289 va_end (arg); 00290 } 00291 00292 inline void iReporter::ReportDebug 00293 (const char* msgId, const char* description, ...) 00294 { 00295 va_list arg; 00296 va_start (arg, description); 00297 ReportV (CS_REPORTER_SEVERITY_DEBUG, msgId, description, arg); 00298 va_end (arg); 00299 } 00300 00301 00308 class csReporterHelper 00309 { 00310 public: 00317 static inline void ReportV(iObjectRegistry* reg, int severity, 00318 char const* msgId, char const* description, va_list args) 00319 CS_GNUC_PRINTF (4, 0); 00320 00327 static inline void Report(iObjectRegistry* reg, int severity, 00328 char const* msgId, char const* description, ...) 00329 CS_GNUC_PRINTF (4, 5); 00330 }; 00331 00332 inline void csReporterHelper::ReportV(iObjectRegistry* reg, int severity, 00333 char const* msgId, char const* description, va_list args) 00334 { 00335 csRef<iReporter> reporter; 00336 if (reg && (reporter = csQueryRegistry<iReporter> (reg))) 00337 reporter->ReportV (severity, msgId, description, args); 00338 else 00339 { 00340 /* 00341 \todo The csStrNCaseCmp()s are there because sometimes reported messages 00342 start with "Warning", and a "Warning: Warning" output looks rather 00343 crappy. The correct fix is obviously to remove "Warning" prefixes 00344 when the reporter is used. 00345 */ 00346 switch (severity) 00347 { 00348 case CS_REPORTER_SEVERITY_BUG: 00349 csPrintf (CS_ANSI_FM CS_ANSI_TEXT_BOLD_ON "BUG: " CS_ANSI_RST); 00350 break; 00351 case CS_REPORTER_SEVERITY_ERROR: 00352 if (csStrNCaseCmp (description, "error", 5) != 0) 00353 csPrintf (CS_ANSI_FR CS_ANSI_TEXT_BOLD_ON "ERROR: " CS_ANSI_RST); 00354 break; 00355 case CS_REPORTER_SEVERITY_WARNING: 00356 if (csStrNCaseCmp (description, "warning", 7) != 0) 00357 csPrintf (CS_ANSI_FY CS_ANSI_TEXT_BOLD_ON "WARNING: " CS_ANSI_RST); 00358 break; 00359 case CS_REPORTER_SEVERITY_NOTIFY: 00360 csPrintf ("NOTIFY: "); 00361 break; 00362 case CS_REPORTER_SEVERITY_DEBUG: 00363 csPrintf (CS_ANSI_FW CS_ANSI_TEXT_BOLD_ON "DEBUG: " CS_ANSI_RST); 00364 break; 00365 } 00366 csPrintfV(description, args); 00367 csPrintf("\n"); 00368 } 00369 } 00370 00371 inline void csReporterHelper::Report(iObjectRegistry* reg, int severity, 00372 char const* msgId, char const* description, ...) 00373 { 00374 va_list arg; 00375 va_start(arg, description); 00376 00377 ReportV(reg,severity,msgId,description,arg); 00378 00379 va_end (arg); 00380 } 00381 00385 #define csReport csReporterHelper::Report 00386 00389 #define csReportV csReporterHelper::ReportV 00390 00391 /* @} */ 00392 00393 #endif // __CS_IVARIA_REPORTER_H__ 00394
Generated for Crystal Space 2.0 by doxygen 1.6.1