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