VideoTexture module.
[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
31 #include "Common.h"
32
33
34 #define CHCKHRSLTV(fnc,val,err) \
35 { \
36         HRESULT macroHRslt = (fnc); \
37         if (macroHRslt != val) \
38         throw Exception (err, macroHRslt, __FILE__, __LINE__); \
39 }
40
41 #define THRWEXCP(err,hRslt) throw Exception (err, hRslt, __FILE__, __LINE__);
42
43
44 #if defined WIN32
45
46 #define CHCKHRSLT(fnc,err) \
47 { \
48         HRESULT macroHRslt = (fnc); \
49         if (FAILED(macroHRslt)) \
50         throw Exception (err, macroHRslt, __FILE__, __LINE__); \
51 }
52
53 #else
54
55 #define CHCKHRSLT(fnc,err) CHCKHRSLTV(fnc,S_OK,err)
56
57 #endif
58
59
60 // forward declarations
61 class ExceptionID;
62 class Exception;
63
64
65 // exception identificators
66 extern ExceptionID ErrGeneral, ErrNotFound;
67
68
69 // result type
70 typedef long RESULT;
71
72
73 // class ExceptionID for exception identification
74 class ExceptionID
75 {
76 public:
77         // constructor a destructor
78         ExceptionID (void) {}
79         ~ExceptionID (void) {}
80
81 private:
82         // not allowed 
83         ExceptionID (const ExceptionID & obj) throw() {}
84         ExceptionID & operator= (const ExceptionID & obj) throw() { return *this; }
85 };
86
87
88 // class ExpDesc for exception description
89 class ExpDesc
90 {
91 public:
92         // constructor a destructor
93         ExpDesc (ExceptionID & exp, char * desc, RESULT hres = S_OK);
94         ~ExpDesc (void);
95
96         // comparision function
97         // returns 0, if exception identification don't match at all
98         // returns 1, if only exception identification is matching
99         // returns 2, if both exception identification and result are matching
100         int isExp (ExceptionID * exp, RESULT hres = S_OK) throw()
101         {
102                 // check exception identification
103                 if (&m_expID == exp)
104                 {
105                         // check result value
106                         if (m_hRslt == hres) return 2;
107                         // only identification match
108                         if (m_hRslt == S_OK) return 1;
109                 }
110                 // no match
111                 return 0;
112         }
113
114         // get exception description
115         void loadDesc (std::string & desc) throw()
116         {
117                 desc = m_description;
118         }
119
120         // list of exception descriptions
121         static std::vector<ExpDesc*> m_expDescs;
122
123 private:
124         // exception ID
125         ExceptionID & m_expID;
126         // result
127         RESULT m_hRslt;
128         // description
129         char * m_description;
130
131         // not allowed
132         ExpDesc (const ExpDesc & obj) : m_expID (ErrNotFound) {}
133         ExpDesc & operator= (const ExpDesc & obj) { return *this; }
134 };
135
136
137
138 // class Exception
139 class Exception : public std::exception  
140 {
141 public:
142         // constructor
143         Exception ();
144         // destructor
145         virtual ~Exception () throw();
146         // copy constructor
147         Exception (const Exception & xpt);
148         // assignment operator
149         Exception & operator= (const Exception & xpt);
150         // get exception description
151         virtual const char * what(void);
152
153         // debug version of constructor
154         Exception (ExceptionID & expID, RESULT rslt, char * fil, int lin);
155         // set source file and line of exception
156         void setFileLine (char * fil, int lin);
157
158         // get description in string
159         std::string & getDesc (void) throw() { return m_desc; }
160
161         // report exception
162         virtual void report (void);
163
164         // get exception id
165         ExceptionID * getID (void) throw() { return m_expID; }
166
167         /// last exception description
168         static std::string m_lastError;
169
170         /// log file name
171         static char * m_logFile;
172
173 protected:
174         // exception identification
175         ExceptionID * m_expID;
176         // RESULT code
177         RESULT m_hRslt;
178
179         // exception description
180         std::string m_desc;
181
182         // set exception description
183         virtual void setXptDesc (void);
184
185         // copy exception
186         void copy (const Exception & xpt);
187
188         // file name where exception was thrown
189         std::string m_fileName;
190         // line number in file
191         int m_line;
192
193 };
194
195 #endif