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