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 "csutil/ansicommand.h" 00023 #include "csutil/scf_interface.h" 00024 #include "csutil/sysfunc.h" 00025 #include "csutil/util.h" 00026 #include "iutil/objreg.h" 00027 00034 struct iReporter; 00035 00043 #define CS_REPORTER_SEVERITY_BUG 0 00044 00050 #define CS_REPORTER_SEVERITY_ERROR 1 00051 00056 #define CS_REPORTER_SEVERITY_WARNING 2 00057 00062 #define CS_REPORTER_SEVERITY_NOTIFY 3 00063 00069 #define CS_REPORTER_SEVERITY_DEBUG 4 00070 00084 struct iReporterListener : public virtual iBase 00085 { 00086 SCF_INTERFACE (iReporterListener, 1, 0, 0); 00087 00093 virtual bool Report (iReporter* reporter, int severity, const char* msgId, 00094 const char* description) = 0; 00095 }; 00096 00104 struct iReporterIterator : public virtual iBase 00105 { 00106 SCF_INTERFACE(iReporterIterator, 2, 0, 0); 00107 00109 virtual bool HasNext () = 0; 00114 virtual void Next () = 0; 00115 00119 virtual int GetMessageSeverity () const = 0; 00120 00124 virtual const char* GetMessageId () const = 0; 00125 00129 virtual const char* GetMessageDescription () const = 0; 00130 }; 00131 00152 struct iReporter : public virtual iBase 00153 { 00154 SCF_INTERFACE(iReporter, 2, 0, 0); 00155 00162 virtual void Report (int severity, const char* msgId, 00163 const char* description, ...) CS_GNUC_PRINTF(4, 5) = 0; 00164 00169 virtual void ReportV (int severity, const char* msgId, 00170 const char* description, va_list) CS_GNUC_PRINTF(4, 0) = 0; 00171 00177 virtual void Clear (int severity = -1) = 0; 00178 00185 virtual void Clear (const char* mask) = 0; 00186 00191 virtual csPtr<iReporterIterator> GetMessageIterator () = 0; 00192 00199 virtual void AddReporterListener (iReporterListener* listener) = 0; 00200 00207 virtual void RemoveReporterListener (iReporterListener* listener) = 0; 00208 00212 virtual bool FindReporterListener (iReporterListener* listener) = 0; 00213 00214 //---------------------------------------------------------------------- 00215 // Convenience functions, these are not to be implemented in the plugin. 00216 //---------------------------------------------------------------------- 00217 00222 inline void ReportError (const char* msgId, const char* description, ...) 00223 CS_GNUC_PRINTF (3, 4); 00224 00229 inline void ReportWarning (const char* msgId, const char* description, ...) 00230 CS_GNUC_PRINTF (3, 4); 00231 00236 inline void ReportNotify (const char* msgId, const char* description, ...) 00237 CS_GNUC_PRINTF (3, 4); 00238 00243 inline void ReportBug (const char* msgId, const char* description, ...) 00244 CS_GNUC_PRINTF (3, 4); 00245 00250 inline void ReportDebug (const char* msgId, const char* description, ...) 00251 CS_GNUC_PRINTF (3, 4); 00252 }; 00253 00254 inline void iReporter::ReportError 00255 (const char* msgId, const char* description, ...) 00256 { 00257 va_list arg; 00258 va_start (arg, description); 00259 ReportV (CS_REPORTER_SEVERITY_ERROR, msgId, description, arg); 00260 va_end (arg); 00261 } 00262 00263 inline void iReporter::ReportWarning 00264 (const char* msgId, const char* description, ...) 00265 { 00266 va_list arg; 00267 va_start (arg, description); 00268 ReportV (CS_REPORTER_SEVERITY_WARNING, msgId, description, arg); 00269 va_end (arg); 00270 } 00271 00272 inline void iReporter::ReportNotify 00273 (const char* msgId, const char* description, ...) 00274 { 00275 va_list arg; 00276 va_start (arg, description); 00277 ReportV (CS_REPORTER_SEVERITY_NOTIFY, msgId, description, arg); 00278 va_end (arg); 00279 } 00280 00281 inline void iReporter::ReportBug 00282 (const char* msgId, const char* description, ...) 00283 { 00284 va_list arg; 00285 va_start (arg, description); 00286 ReportV (CS_REPORTER_SEVERITY_BUG, msgId, description, arg); 00287 va_end (arg); 00288 } 00289 00290 inline void iReporter::ReportDebug 00291 (const char* msgId, const char* description, ...) 00292 { 00293 va_list arg; 00294 va_start (arg, description); 00295 ReportV (CS_REPORTER_SEVERITY_DEBUG, msgId, description, arg); 00296 va_end (arg); 00297 } 00298 00299 00306 class csReporterHelper 00307 { 00308 public: 00315 static inline void ReportV(iObjectRegistry* reg, int severity, 00316 char const* msgId, char const* description, va_list args) 00317 CS_GNUC_PRINTF (4, 0); 00318 00325 static inline void Report(iObjectRegistry* reg, int severity, 00326 char const* msgId, char const* description, ...) 00327 CS_GNUC_PRINTF (4, 5); 00328 }; 00329 00330 inline void csReporterHelper::ReportV(iObjectRegistry* reg, int severity, 00331 char const* msgId, char const* description, va_list args) 00332 { 00333 csRef<iReporter> reporter; 00334 if (reg && (reporter = CS_QUERY_REGISTRY (reg, iReporter))) 00335 reporter->ReportV (severity, msgId, description, args); 00336 else 00337 { 00338 /* 00339 \todo The csStrNCaseCmp()s are there because sometimes reported messages 00340 start with "Warning", and a "Warning: Warning" output looks rather 00341 crappy. The correct fix is obviously to remove "Warning" prefixes 00342 when the reporter is used. 00343 */ 00344 switch (severity) 00345 { 00346 case CS_REPORTER_SEVERITY_BUG: 00347 csPrintf (CS_ANSI_FM CS_ANSI_TEXT_BOLD_ON "BUG: " CS_ANSI_RST); 00348 break; 00349 case CS_REPORTER_SEVERITY_ERROR: 00350 if (csStrNCaseCmp (description, "error", 5) != 0) 00351 csPrintf (CS_ANSI_FR CS_ANSI_TEXT_BOLD_ON "ERROR: " CS_ANSI_RST); 00352 break; 00353 case CS_REPORTER_SEVERITY_WARNING: 00354 if (csStrNCaseCmp (description, "warning", 7) != 0) 00355 csPrintf (CS_ANSI_FY CS_ANSI_TEXT_BOLD_ON "WARNING: " CS_ANSI_RST); 00356 break; 00357 case CS_REPORTER_SEVERITY_NOTIFY: 00358 csPrintf ("NOTIFY: "); 00359 break; 00360 case CS_REPORTER_SEVERITY_DEBUG: 00361 csPrintf (CS_ANSI_FW CS_ANSI_TEXT_BOLD_ON "DEBUG: " CS_ANSI_RST); 00362 break; 00363 } 00364 csPrintfV(description, args); 00365 csPrintf("\n"); 00366 } 00367 } 00368 00369 inline void csReporterHelper::Report(iObjectRegistry* reg, int severity, 00370 char const* msgId, char const* description, ...) 00371 { 00372 va_list arg; 00373 va_start(arg, description); 00374 00375 ReportV(reg,severity,msgId,description,arg); 00376 00377 va_end (arg); 00378 } 00379 00383 #define csReport csReporterHelper::Report 00384 00387 #define csReportV csReporterHelper::ReportV 00388 00389 /* @} */ 00390 00391 #endif // __CS_IVARIA_REPORTER_H__ 00392
Generated for Crystal Space by doxygen 1.4.7