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