svn merge ^/trunk/blender -r41226:41227 .
[blender.git] / source / gameengine / VideoTexture / Exception.cpp
1 /** \file gameengine/VideoTexture/Exception.cpp
2  *  \ingroup bgevideotex
3  */
4 -----------------------------------------------------------------------------
5 This source file is part of VideoTexture library
6
7 Copyright (c) 2006 The Zdeno Ash Miklas
8
9 This program is free software; you can redistribute it and/or modify it under
10 the terms of the GNU Lesser General Public License as published by the Free Software
11 Foundation; either version 2 of the License, or (at your option) any later
12 version.
13
14 This program is distributed in the hope that it will be useful, but WITHOUT
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
17
18 You should have received a copy of the GNU Lesser General Public License along with
19 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
20 Place - Suite 330, Boston, MA 02111-1307, USA, or go to
21 http://www.gnu.org/copyleft/lesser.txt.
22 -----------------------------------------------------------------------------
23 */
24
25
26 #include <sstream>
27 #include <fstream>
28
29 #include <PyObjectPlus.h>
30
31 #include "Exception.h"
32
33
34 // exception identificators
35 ExceptionID ErrGeneral, ErrNotFound;
36
37 // exception descriptions
38 ExpDesc errGenerDesc (ErrGeneral, "General Error");
39 ExpDesc errNFoundDesc (ErrNotFound, "Error description not found");
40
41
42
43 // implementation of ExpDesc
44
45 // constructor
46 ExpDesc::ExpDesc (ExceptionID & exp, const char * desc, RESULT hres)
47 : m_expID(exp), m_hRslt(hres), m_description(desc)
48 {
49 }
50
51 // destructor
52 ExpDesc::~ExpDesc (void) {}
53
54 // list of descriptions
55 std::vector<ExpDesc*> ExpDesc::m_expDescs;
56
57
58 // class Exception
59
60
61 // last exception description
62 std::string Exception::m_lastError;
63
64 // log file name
65 const char * Exception::m_logFile = NULL;
66
67
68 // basic constructor
69 Exception::Exception ()
70 {
71         // default values
72         m_expID = &ErrNotFound;
73         m_hRslt = S_OK;
74         m_line = 0;
75 }
76
77
78 // destructor
79 Exception::~Exception () throw() { }
80
81
82 // copy constructor
83 Exception::Exception (const Exception & xpt)
84 { copy (xpt); }
85
86
87 // assignment operator
88 Exception & Exception::operator= (const Exception & xpt)
89 { copy (xpt); return *this; }
90
91
92 // get exception description
93 const char * Exception::what()
94 {
95         // set exception description
96         setXptDesc();
97         // return c string
98         return m_desc.c_str();
99 }
100
101
102 // debug version - with file and line of exception
103 Exception::Exception (ExceptionID & expID, RESULT rslt, const char * fil, int lin)
104 : m_expID (&expID), m_hRslt (rslt)
105 {
106         // set file and line
107         if (fil[0] != '\0' || lin > 0)
108                 setFileLine (fil, lin);
109 }
110
111
112 // set file and line
113 void Exception::setFileLine (const char * fil, int lin)
114 {
115         if (fil != NULL) m_fileName = fil;
116         m_line = lin;
117 }
118
119
120 // report exception
121 void Exception::report(void)
122 {
123         // set exception description
124         setXptDesc();
125         // set python error
126         PyErr_SetString(PyExc_RuntimeError, what());
127         // if log file is set
128         if (m_logFile != NULL)
129         {
130                 // write description to log
131                 std::ofstream logf (m_logFile, std::ios_base::app);
132                 logf << m_fileName << ':' << m_line << ':' << m_desc << std::endl;
133                 logf.flush();
134                 logf.close();
135         }
136 }
137
138
139 // set exception description
140 void Exception::setXptDesc (void)
141 {
142         // if description is not set
143         if (m_desc.size() == 0)
144         {
145                 // start of search                           -1
146                 // found description "NotFound"               0
147                 // found description without matching result  1
148                 // found description with matching result     2
149                 int best = -1;
150                 // find exception description
151                 for (std::vector<ExpDesc*>::iterator it = ExpDesc::m_expDescs.begin(); it != ExpDesc::m_expDescs.end(); ++it)
152                 {
153                         // use "NotFound", if there is not better
154                         if (best < 0 && (*it)->isExp(&ErrNotFound) > 0)
155                         {
156                                 (*it)->loadDesc(m_desc);
157                                 best = 0;
158                         }
159                         // match exception
160                         int nBest = (*it)->isExp(m_expID, m_hRslt);
161                         // if exception is matching better
162                         if (nBest > 0 && best < nBest)
163                         {
164                                 // set description
165                                 (*it)->loadDesc(m_desc);
166                                 best = nBest;
167                                 // if matching exactly, finish search
168                                 if (best == 2) break;
169                         }
170                 }
171                 // add result code
172                 // length of result code
173                 const size_t rsltSize = 11;
174                 // delimit description
175                 //const char delimRslt[] = ": ";
176                 // set text of description
177                 char rsltTxt[rsltSize];
178                 std::ostringstream os;
179                 os << std::hex << m_hRslt << ": " << '\0';
180                 // copy result to description
181                 m_desc.insert(0, rsltTxt);
182                 // copy exception description to last exception string
183                 m_lastError = m_desc;
184         }
185 }
186
187
188 // copy exception data
189 void Exception::copy (const Exception & xpt)
190 {
191         // standard data
192         m_expID = xpt.m_expID;
193         m_hRslt = xpt.m_hRslt;
194         m_desc = xpt.m_desc;
195
196         // debug data
197         m_fileName = xpt.m_fileName;
198         m_line = xpt.m_line;
199 }
200
201 void registerAllExceptions(void)
202 {
203         errGenerDesc.registerDesc();
204         errNFoundDesc.registerDesc();
205         MaterialNotAvailDesc.registerDesc();
206         ImageSizesNotMatchDesc.registerDesc();
207         ImageHasExportsDesc.registerDesc();
208         InvalidColorChannelDesc.registerDesc();
209         SceneInvalidDesc.registerDesc();
210         CameraInvalidDesc.registerDesc();
211         ObserverInvalidDesc.registerDesc();
212         MirrorInvalidDesc.registerDesc();
213         MirrorSizeInvalidDesc.registerDesc();
214         MirrorNormalInvalidDesc.registerDesc();
215         MirrorHorizontalDesc.registerDesc();
216         MirrorTooSmallDesc.registerDesc();
217         SourceVideoEmptyDesc.registerDesc();
218         SourceVideoCreationDesc.registerDesc();
219 }