code cleanup: gpl header update (formatting)
[blender.git] / source / gameengine / VideoTexture / Exception.cpp
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 gameengine/VideoTexture/Exception.cpp
28  *  \ingroup bgevideotex
29  */
30
31 #include <sstream>
32 #include <fstream>
33
34 #include "PyObjectPlus.h"
35
36 #include "Exception.h"
37
38
39 // exception identificators
40 ExceptionID ErrGeneral, ErrNotFound;
41
42 // exception descriptions
43 ExpDesc errGenerDesc (ErrGeneral, "General Error");
44 ExpDesc errNFoundDesc (ErrNotFound, "Error description not found");
45
46
47
48 // implementation of ExpDesc
49
50 // constructor
51 ExpDesc::ExpDesc (ExceptionID & exp, const char * desc, RESULT hres)
52 : m_expID(exp), m_hRslt(hres), m_description(desc)
53 {
54 }
55
56 // destructor
57 ExpDesc::~ExpDesc (void) {}
58
59 // list of descriptions
60 std::vector<ExpDesc*> ExpDesc::m_expDescs;
61
62
63 // class Exception
64
65
66 // last exception description
67 std::string Exception::m_lastError;
68
69 // log file name
70 const char * Exception::m_logFile = NULL;
71
72
73 // basic constructor
74 Exception::Exception ()
75 {
76         // default values
77         m_expID = &ErrNotFound;
78         m_hRslt = S_OK;
79         m_line = 0;
80 }
81
82
83 // destructor
84 Exception::~Exception () throw() { }
85
86
87 // copy constructor
88 Exception::Exception (const Exception & xpt)
89 { copy (xpt); }
90
91
92 // assignment operator
93 Exception & Exception::operator= (const Exception & xpt)
94 { copy (xpt); return *this; }
95
96
97 // get exception description
98 const char * Exception::what()
99 {
100         // set exception description
101         setXptDesc();
102         // return c string
103         return m_desc.c_str();
104 }
105
106
107 // debug version - with file and line of exception
108 Exception::Exception (ExceptionID & expID, RESULT rslt, const char * fil, int lin)
109 : m_expID (&expID), m_hRslt (rslt)
110 {
111         // set file and line
112         if (fil[0] != '\0' || lin > 0)
113                 setFileLine (fil, lin);
114 }
115
116
117 // set file and line
118 void Exception::setFileLine (const char * fil, int lin)
119 {
120         if (fil != NULL) m_fileName = fil;
121         m_line = lin;
122 }
123
124
125 // report exception
126 void Exception::report(void)
127 {
128         // set exception description
129         setXptDesc();
130         // set python error
131         PyErr_SetString(PyExc_RuntimeError, what());
132         // if log file is set
133         if (m_logFile != NULL)
134         {
135                 // write description to log
136                 std::ofstream logf (m_logFile, std::ios_base::app);
137                 logf << m_fileName << ':' << m_line << ':' << m_desc << std::endl;
138                 logf.flush();
139                 logf.close();
140         }
141 }
142
143
144 // set exception description
145 void Exception::setXptDesc (void)
146 {
147         // if description is not set
148         if (m_desc.size() == 0)
149         {
150                 // start of search                           -1
151                 // found description "NotFound"               0
152                 // found description without matching result  1
153                 // found description with matching result     2
154                 int best = -1;
155                 // find exception description
156                 for (std::vector<ExpDesc*>::iterator it = ExpDesc::m_expDescs.begin(); it != ExpDesc::m_expDescs.end(); ++it)
157                 {
158                         // use "NotFound", if there is not better
159                         if (best < 0 && (*it)->isExp(&ErrNotFound) > 0)
160                         {
161                                 (*it)->loadDesc(m_desc);
162                                 best = 0;
163                         }
164                         // match exception
165                         int nBest = (*it)->isExp(m_expID, m_hRslt);
166                         // if exception is matching better
167                         if (nBest > 0 && best < nBest)
168                         {
169                                 // set description
170                                 (*it)->loadDesc(m_desc);
171                                 best = nBest;
172                                 // if matching exactly, finish search
173                                 if (best == 2) break;
174                         }
175                 }
176                 // add result code
177                 // length of result code
178                 const size_t rsltSize = 11;
179                 // delimit description
180                 //const char delimRslt[] = ": ";
181                 // set text of description
182                 char rsltTxt[rsltSize];
183                 std::ostringstream os;
184                 os << std::hex << m_hRslt << ": " << '\0';
185                 // copy result to description
186                 m_desc.insert(0, rsltTxt);
187                 // copy exception description to last exception string
188                 m_lastError = m_desc;
189         }
190 }
191
192
193 // copy exception data
194 void Exception::copy (const Exception & xpt)
195 {
196         // standard data
197         m_expID = xpt.m_expID;
198         m_hRslt = xpt.m_hRslt;
199         m_desc = xpt.m_desc;
200
201         // debug data
202         m_fileName = xpt.m_fileName;
203         m_line = xpt.m_line;
204 }
205
206 void registerAllExceptions(void)
207 {
208         errGenerDesc.registerDesc();
209         errNFoundDesc.registerDesc();
210         MaterialNotAvailDesc.registerDesc();
211         ImageSizesNotMatchDesc.registerDesc();
212         ImageHasExportsDesc.registerDesc();
213         InvalidColorChannelDesc.registerDesc();
214         SceneInvalidDesc.registerDesc();
215         CameraInvalidDesc.registerDesc();
216         ObserverInvalidDesc.registerDesc();
217         MirrorInvalidDesc.registerDesc();
218         MirrorSizeInvalidDesc.registerDesc();
219         MirrorNormalInvalidDesc.registerDesc();
220         MirrorHorizontalDesc.registerDesc();
221         MirrorTooSmallDesc.registerDesc();
222         SourceVideoEmptyDesc.registerDesc();
223         SourceVideoCreationDesc.registerDesc();
224 }