CFugue
ErrorReporter.h
1 #ifndef _ERROR_H__FC8EA04F_57D6_4002_81BE_F37E1FA54F47_
2 #define _ERROR_H__FC8EA04F_57D6_4002_81BE_F37E1FA54F47_
3 
4 #include <TChar.h>
5 
6 #ifndef VERBOSE_ERR
7 #define VERBOSE_ERR 0 //Make this 0 to suppress the default MsgBox()
8 #endif
9 
10 namespace Err
11 {
12  /////////////////////////////////////////////////////////////////////
13  /// Collects and Formats the Error Message for the given error code.
14  /// Returns the input string.
15  ///
16  inline LPCTSTR GetErrorDetails(LPTSTR lpszBuf, DWORD dwBufLen, DWORD dwErrorCode = GetLastError())
17  {
18  FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
19  NULL, dwErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), lpszBuf, dwBufLen, NULL );
20  return lpszBuf;
21  }
22 
24  {
25  enum {ErrMsgBufSize = 1023};
26 
27  TCHAR m_szErrBuf[ ErrMsgBufSize + 1 ];
28 
29  public:
30  enum ErrReportingMode { Mode_MessageBox, Mode_OutputDebugString };
31 
32  protected:
33  ErrReportingMode m_ReportingMode;
34 
35  public:
36 #if VERBOSE_ERR
37  CErrReporter(ErrReportingMode Mode = Mode_MessageBox) : m_ReportingMode(Mode)
38  {
39  m_szErrBuf[0] = _T('\0');
40  }
41  CErrReporter(LPCTSTR lpszErrMsg, ErrReportingMode Mode = Mode_MessageBox) : m_ReportingMode(Mode)
42  {
43  SetErrorMessage(lpszErrMsg);
44  }
45 #else
46  CErrReporter(ErrReportingMode Mode = Mode_OutputDebugString) : m_ReportingMode(Mode)
47  {
48  m_szErrBuf[0] = _T('\0');
49  }
50  CErrReporter(LPCTSTR lpszErrMsg, ErrReportingMode Mode = Mode_OutputDebugString) : m_ReportingMode(Mode)
51  {
52  SetErrorMessage(lpszErrMsg);
53  }
54 #endif
55  // Copy constructor
56  CErrReporter(const CErrReporter& other)
57  {
58  *this = other;
59  }
60 
61  /// Gets/Sets the Error Reporting Mode
62  inline ErrReportingMode& ReportingMode()
63  {
64  return m_ReportingMode;
65  }
66 
67  /// Collects and Formats the Error Message for the last error
68  inline LPCTSTR CollectErrorDetails(DWORD dwErrorCode = GetLastError())
69  {
70  return GetErrorDetails(m_szErrBuf, ErrMsgBufSize, dwErrorCode);
71  }
72 
73  /// Displays or DebugPrints the Error Message for the last error (Uses GetLastError() API).
74  /// Also Sets the Error Message;
75  inline void ReportLastError()
76  {
77  ReportError(GetLastError());
78  }
79 
80  /// Displays or DebugPrints the Error Message for the given error code.
81  /// Equivalent to ReportLastError() when dwErrorCode == GetLastError();
82  inline void ReportError(DWORD dwErrorCode)
83  {
84  CollectErrorDetails(dwErrorCode);
85  ReportError();
86  }
87 
88  /// Sets and Displays or DebugPrints the supplied Error Message.
89  /// Useful for displaying custom messages.
90  inline void ReportError(LPCTSTR lpszErrMsg)
91  {
92  SetErrorMessage(lpszErrMsg);
93  ReportError();
94  }
95 
96  /// Reports the ErrorMessage that was set with SetErrorMessage.
97  inline void ReportError() const
98  {
99  ErrorMessage(m_szErrBuf);
100  }
101 
102  /// Clears the Error Message Buffer
103  inline void Clear()
104  {
105  ZeroMemory(m_szErrBuf, sizeof(m_szErrBuf));
106  }
107 
108  /// Sets the Error Message
109  inline void SetErrorMessage(LPCTSTR lpszErrMsg)
110  {
111  _tcsncpy(m_szErrBuf, lpszErrMsg, ErrMsgBufSize);
112  m_szErrBuf[ErrMsgBufSize] = _T('\0');
113  }
114 
115  /// Returns the last Set Error Message
116  inline LPCTSTR GetErrorMessage() const
117  {
118  return m_szErrBuf;
119  }
120 
121  inline operator LPCTSTR() const
122  {
123  return GetErrorMessage();
124  }
125 
126  inline CErrReporter& operator=(const CErrReporter& other)
127  {
128  m_ReportingMode = other.m_ReportingMode;
129  SetErrorMessage(other.m_szErrBuf);
130  return *this;
131  }
132 
133  protected:
134  /// Displays the given Error Message with MessageBox
135  inline void ErrorMessage(LPCTSTR lpszErrMsg) const
136  {
137  switch(m_ReportingMode)
138  {
139  case Mode_MessageBox: MessageBox(NULL, lpszErrMsg, _T("Error"), MB_OK | MB_ICONERROR); break;
140  case Mode_OutputDebugString: OutputDebugString(lpszErrMsg); break;
141  default: break;
142  }
143  }
144 
145  friend void ErrorMessage(LPCTSTR lpszErrMsg);
146  };
147 
148  /// Displays or DebugPrints the given Error Message
149  inline void ErrorMessage(LPCTSTR lpszErrMsg)
150  {
151  static CErrReporter ErrRep;
152  ErrRep.ErrorMessage(lpszErrMsg);
153  }
154 } // namespace Err
155 #endif // #ifndef _ERROR_H__FC8EA04F_57D6_4002_81BE_F37E1FA54F47_
156 
void Clear()
Clears the Error Message Buffer.
LPCTSTR CollectErrorDetails(DWORD dwErrorCode=GetLastError())
Collects and Formats the Error Message for the last error.
Definition: ErrorReporter.h:68
void ReportError() const
Reports the ErrorMessage that was set with SetErrorMessage.
Definition: ErrorReporter.h:97
void SetErrorMessage(LPCTSTR lpszErrMsg)
Sets the Error Message.
void ReportError(LPCTSTR lpszErrMsg)
Definition: ErrorReporter.h:90
LPCTSTR GetErrorMessage() const
Returns the last Set Error Message.
void ErrorMessage(LPCTSTR lpszErrMsg) const
Displays the given Error Message with MessageBox.
ErrReportingMode & ReportingMode()
Gets/Sets the Error Reporting Mode.
Definition: ErrorReporter.h:62
void ReportError(DWORD dwErrorCode)
Definition: ErrorReporter.h:82

CFugue, the C++ Music Programming Library © Copyright 2009 Cenacle Research India Private Limited Gopalakrishna Palem