JIMS: plug extraction
[scilab.git] / scilab / modules / external_objects_java / src / cpp / ScilabJavaException.hxx
1 #ifndef __SCILABJAVAEXCEPTION_HXX__
2 #define __SCILABJAVAEXCEPTION_HXX__
3
4 extern "C" {
5 #include "localization.h"
6 #include "backtrace_print.h"
7 }
8
9 #include "ExternalObjects.h"
10
11 #include <jni.h>
12
13 #include <exception>
14 #include <sstream>
15 #include <string>
16
17 #define BUFFER_SIZE 1024
18
19 using namespace org_modules_external_objects;
20
21 namespace org_scilab_modules_external_objects_java
22 {
23 class ScilabJavaException : public std::exception
24 {
25
26     std::string message;
27     std::string file;
28     int line;
29     //    PyObject * type;
30     //    PyObject * value;
31     //    PyObject * traceback;
32
33 public:
34
35     ScilabJavaException(const int _line, const char * _file, const char * _message, ...) //: message(""), file(_file), line(_line), type(0), value(0), traceback(0)
36     {
37         char str[BUFFER_SIZE];
38         va_list args;
39
40         va_start(args, _message);
41         vsnprintf(str, BUFFER_SIZE, _message, args);
42         va_end(args);
43
44         message = getDescription(std::string(str));
45     }
46     /*
47         ScilabJavaException(const int _line, const char * _file, std::string _message, ...) : message(""), file(_file), line(_line), type(0), value(0), traceback(0)
48         {
49             char str[BUFFER_SIZE];
50             va_list args;
51
52             va_start(args, _message);
53             vsnprintf(str, BUFFER_SIZE, _message.c_str(), args);
54             va_end(args);
55
56             message = getDescription(std::string(str));
57         }
58     */
59     /*    ScilabJavaException(PyObject * _type, PyObject * _value, PyObject * _traceback, const char * _message, ...) : message(""), file(""), line(-1), type(_type), value(_value), traceback(_traceback)
60         {
61             char str[BUFFER_SIZE];
62             va_list args;
63
64             va_start(args, _message);
65             vsnprintf(str, BUFFER_SIZE, _message, args);
66             va_end(args);
67
68             message = getDescription(std::string(str));
69         }
70
71         ScilabJavaException(const int _line, const char * _file, PyObject * _type, PyObject * _value, PyObject * _traceback, const char * _message, ...) : message(""), file(_file), line(_line), type(_type), value(_value), traceback(_traceback)
72         {
73             char str[BUFFER_SIZE];
74             va_list args;
75
76             va_start(args, _message);
77             vsnprintf(str, BUFFER_SIZE, _message, args);
78             va_end(args);
79
80             message = getDescription(std::string(str));
81         }
82
83         ScilabJavaException(const int _line, const char * _file, PyObject * _type, PyObject * _value, PyObject * _traceback, std::string _message, ...) : message(""), file(_file), line(_line), type(_type), value(_value), traceback(_traceback)
84         {
85             char str[BUFFER_SIZE];
86             va_list args;
87
88             va_start(args, _message);
89             vsnprintf(str, BUFFER_SIZE, _message.c_str(), args);
90             va_end(args);
91
92             message = getDescription(std::string(str));
93         }
94     */
95
96     ~ScilabJavaException() throw() { }
97
98     inline std::string getDescription(std::string m) const
99     {
100         std::ostringstream os;
101
102         os << m << std::endl;
103         /*
104                 if (traceback || type || value)
105                 {
106                     os << gettext("Java interpreter threw an exception:") << std::endl;
107
108                     if (traceback)
109                     {
110                         PyTracebackObject * tb = reinterpret_cast<PyTracebackObject *>(traceback);
111                         int err = 0;
112
113                         os << gettext("Traceback:") << std::endl;
114
115                         while (tb && err == 0)
116                         {
117                             os << "  " << gettext("File") << " " << PyString_AsString(tb->tb_frame->f_code->co_filename)
118                                << ", " << gettext("line") << " " << tb->tb_lineno << ", " << gettext("in") << " "
119                                << PyString_AsString(tb->tb_frame->f_code->co_name) << std::endl;
120                             tb = tb->tb_next;
121                             err = PyErr_CheckSignals();
122                         }
123
124                         Py_DECREF(traceback);
125                     }
126
127                     if (type)
128                     {
129                         os << reinterpret_cast<PyTypeObject *>(type)->tp_name << ": ";
130                         Py_DECREF(type);
131                     }
132
133                     if (value)
134                     {
135                         PyObject * _value = PyObject_Str(value);
136                         os << PyString_AsString(_value) << std::endl;
137                         Py_DECREF(_value);
138                         Py_DECREF(value);
139                     }
140
141             }
142         */
143 #if defined(EODEBUG)
144
145         if (line != -1)
146         {
147             const char * bt = backtrace_print(0, 1);
148
149             os << std::endl
150                << "DEBUG Informations:" << std::endl
151                << gettext("Exception thrown in file") << " " << file << " " << gettext("at line") << " " << line << std::endl
152                << bt;
153
154             free(const_cast<char *>(bt));
155         }
156
157 #endif
158
159         os.flush();
160
161         return os.str();
162     }
163
164     virtual const char * what() const throw()
165     {
166         return message.c_str();
167     }
168 };
169 }
170
171 #endif // __SCILABJAVAEXCEPTION_HXX__