[#18961] Use const char * where appropriate (2.5)
[blender-staging.git] / source / gameengine / VideoTexture / Exception.h
1 /* $Id$
2 -----------------------------------------------------------------------------
3 This source file is part of VideoTexture library
4
5 Copyright (c) 2006 The Zdeno Ash Miklas
6
7 This program is free software; you can redistribute it and/or modify it under
8 the terms of the GNU Lesser General Public License as published by the Free Software
9 Foundation; either version 2 of the License, or (at your option) any later
10 version.
11
12 This program is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public License along with
17 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
18 Place - Suite 330, Boston, MA 02111-1307, USA, or go to
19 http://www.gnu.org/copyleft/lesser.txt.
20 -----------------------------------------------------------------------------
21 */
22
23
24 #if !defined EXCEPTION_H
25 #define EXCEPTION_H
26
27 #include <exception>
28 #include <vector>
29 #include <string>
30 #include <algorithm>
31
32 #include "Common.h"
33
34
35 #define CHCKHRSLTV(fnc,val,err) \
36 { \
37         HRESULT macroHRslt = (fnc); \
38         if (macroHRslt != val) \
39         throw Exception (err, macroHRslt, __FILE__, __LINE__); \
40 }
41
42 #define THRWEXCP(err,hRslt) throw Exception (err, hRslt, __FILE__, __LINE__);
43
44
45 #if defined WIN32
46
47 #define CHCKHRSLT(fnc,err) \
48 { \
49         HRESULT macroHRslt = (fnc); \
50         if (FAILED(macroHRslt)) \
51         throw Exception (err, macroHRslt, __FILE__, __LINE__); \
52 }
53
54 #else
55
56 #define CHCKHRSLT(fnc,err) CHCKHRSLTV(fnc,S_OK,err)
57
58 #endif
59
60
61 // forward declarations
62 class ExceptionID;
63 class Exception;
64
65
66 // exception identificators
67 extern ExceptionID ErrGeneral, ErrNotFound;
68
69
70 // result type
71 typedef long RESULT;
72
73
74 // class ExceptionID for exception identification
75 class ExceptionID
76 {
77 public:
78         // constructor a destructor
79         ExceptionID (void) {}
80         ~ExceptionID (void) {}
81
82 private:
83         // not allowed 
84         ExceptionID (const ExceptionID & obj) throw() {}
85         ExceptionID & operator= (const ExceptionID & obj) throw() { return *this; }
86 };
87
88
89 // class ExpDesc for exception description
90 class ExpDesc
91 {
92 public:
93         // constructor a destructor
94         ExpDesc (ExceptionID & exp, const char * desc, RESULT hres = S_OK);
95         ~ExpDesc (void);
96
97         // comparision function
98         // returns 0, if exception identification don't match at all
99         // returns 1, if only exception identification is matching
100         // returns 2, if both exception identification and result are matching
101         int isExp (ExceptionID * exp, RESULT hres = S_OK) throw()
102         {
103                 // check exception identification
104                 if (&m_expID == exp)
105                 {
106                         // check result value
107                         if (m_hRslt == hres) return 2;
108                         // only identification match
109                         if (m_hRslt == S_OK) return 1;
110                 }
111                 // no match
112                 return 0;
113         }
114
115         // get exception description
116         void loadDesc (std::string & desc) throw()
117         {
118                 desc = m_description;
119         }
120
121     void registerDesc(void)
122     {
123         if (std::find(m_expDescs.begin(), m_expDescs.end(), this) == m_expDescs.end())
124             m_expDescs.push_back(this);
125     }
126         // list of exception descriptions
127         static std::vector<ExpDesc*> m_expDescs;
128
129 private:
130         // exception ID
131         ExceptionID & m_expID;
132         // result
133         RESULT m_hRslt;
134         // description
135         const char * m_description;
136
137         // not allowed
138         ExpDesc (const ExpDesc & obj) : m_expID (ErrNotFound) {}
139         ExpDesc & operator= (const ExpDesc & obj) { return *this; }
140 };
141
142
143
144 // class Exception
145 class Exception : public std::exception  
146 {
147 public:
148         // constructor
149         Exception ();
150         // destructor
151         virtual ~Exception () throw();
152         // copy constructor
153         Exception (const Exception & xpt);
154         // assignment operator
155         Exception & operator= (const Exception & xpt);
156         // get exception description
157         virtual const char * what(void);
158
159         // debug version of constructor
160         Exception (ExceptionID & expID, RESULT rslt, const char * fil, int lin);
161         // set source file and line of exception
162         void setFileLine (const char * fil, int lin);
163
164         // get description in string
165         std::string & getDesc (void) throw() { return m_desc; }
166
167         // report exception
168         virtual void report (void);
169
170         // get exception id
171         ExceptionID * getID (void) throw() { return m_expID; }
172
173         /// last exception description
174         static std::string m_lastError;
175
176         /// log file name
177         static const char * m_logFile;
178
179 protected:
180         // exception identification
181         ExceptionID * m_expID;
182         // RESULT code
183         RESULT m_hRslt;
184
185         // exception description
186         std::string m_desc;
187
188         // set exception description
189         virtual void setXptDesc (void);
190
191         // copy exception
192         void copy (const Exception & xpt);
193
194         // file name where exception was thrown
195         std::string m_fileName;
196         // line number in file
197         int m_line;
198
199 };
200
201 extern ExpDesc MaterialNotAvailDesc;
202 extern ExpDesc ImageSizesNotMatchDesc;
203 extern ExpDesc SceneInvalidDesc;
204 extern ExpDesc CameraInvalidDesc;
205 extern ExpDesc ObserverInvalidDesc;
206 extern ExpDesc MirrorInvalidDesc;
207 extern ExpDesc MirrorSizeInvalidDesc;
208 extern ExpDesc MirrorNormalInvalidDesc;
209 extern ExpDesc MirrorHorizontalDesc;
210 extern ExpDesc MirrorTooSmallDesc;
211 extern ExpDesc SourceVideoEmptyDesc;
212 extern ExpDesc SourceVideoCreationDesc;
213
214
215 void registerAllExceptions(void);
216 #endif