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