failed on exec correctly close file
[scilab.git] / scilab / modules / scicos / src / cpp / LoggerView.cpp
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2014-2014 - Scilab Enterprises - Clement DAVID
4  *
5  *  This file must be used under the terms of the CeCILL.
6  *  This source file is licensed as described in the file COPYING, which
7  *  you should have received as part of this distribution.  The terms
8  *  are also available at
9  *  http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
10  *
11  */
12
13 #include <cwchar>
14 #include <cstdarg>
15 #include <cstdio>
16 #include <string>
17 #include <iostream>
18 #include <sstream>
19 #include <string>
20
21 #include "scilabWrite.hxx"
22
23 #include "LoggerView.hxx"
24 #include "Controller.hxx"
25
26 namespace org_scilab_modules_scicos
27 {
28
29 static const bool USE_SCILAB_WRITE = true;
30
31 LoggerView::LoggerView() :
32     View(), m_level(LOG_WARNING)
33 {
34 }
35
36 LoggerView::~LoggerView()
37 {
38 }
39
40 static std::wstring levelTable[] =
41 {
42     L"TRACE",
43     L"DEBUG",
44     L"INFO",
45     L"WARNING",
46     L"ERROR",
47     L"FATAL",
48 };
49
50 static std::string displayTable[] =
51 {
52     "Xcos trace: ",
53     "Xcos debug: ",
54     "Xcos info: ",
55     "Xcos warning: ",
56     "Xcos error: ",
57     "Xcos fatal: ",
58 };
59
60 enum LogLevel LoggerView::indexOf(const wchar_t* name)
61 {
62     for (int i = LOG_TRACE; i <= LOG_FATAL; i++)
63     {
64         if (!wcscmp(name, levelTable[i].data()))
65         {
66             return static_cast<enum LogLevel>(i);
67         }
68     }
69     return LOG_UNDEF;
70 }
71
72 const wchar_t* LoggerView::toString(enum LogLevel level)
73 {
74     if (LOG_TRACE <= level && level <= LOG_FATAL)
75     {
76         return levelTable[level].data();
77     }
78     return L"";
79 }
80
81 const char* LoggerView::toDisplay(enum LogLevel level)
82 {
83     if (LOG_TRACE <= level && level <= LOG_FATAL)
84     {
85         return displayTable[level].data();
86     }
87     return "";
88 }
89
90 void LoggerView::log(enum LogLevel level, const std::stringstream& msg)
91 {
92     if (level >= this->m_level)
93     {
94         std::string str = msg.str();
95         if (USE_SCILAB_WRITE)
96         {
97             scilabForcedWrite(LoggerView::toDisplay(level));
98             scilabForcedWrite(str.data());
99         }
100         else
101         {
102             std::cerr << LoggerView::toDisplay(level);
103             std::cerr << str;
104         }
105     }
106 }
107
108 void LoggerView::log(enum LogLevel level, const std::string& msg)
109 {
110     if (level >= this->m_level)
111     {
112         if (USE_SCILAB_WRITE)
113         {
114             scilabForcedWrite(LoggerView::toDisplay(level));
115             scilabForcedWrite(msg.data());
116         }
117         else
118         {
119             std::cerr << LoggerView::toDisplay(level);
120             std::cerr << msg;
121         }
122     }
123 }
124
125 void LoggerView::log(enum LogLevel level, const char* msg, ...)
126 {
127     if (level >= this->m_level)
128     {
129         const int N = 1024;
130         char* str = new char[N];
131         va_list opts;
132         va_start(opts, msg);
133         vsnprintf(str, N, msg, opts);
134         va_end(opts);
135
136         if (USE_SCILAB_WRITE)
137         {
138             scilabForcedWrite(LoggerView::toDisplay(level));
139             scilabForcedWrite(str);
140         }
141         else
142         {
143             std::cerr << LoggerView::toDisplay(level);
144             std::cerr << str;
145         }
146     }
147 }
148
149 void LoggerView::log(enum LogLevel level, const wchar_t* msg, ...)
150 {
151     if (level >= this->m_level)
152     {
153         const int N = 1024;
154         wchar_t* str = new wchar_t[N];
155
156         va_list opts;
157         va_start(opts, msg);
158         vswprintf(str, N, msg, opts);
159         va_end(opts);
160
161         if (USE_SCILAB_WRITE)
162         {
163             scilabForcedWrite(LoggerView::toDisplay(level));
164             scilabForcedWriteW(str);
165         }
166         else
167         {
168             std::cerr << LoggerView::toDisplay(level);
169             std::wcerr << str;
170         }
171
172         delete[] str;
173     }
174 }
175
176 // generated with :
177 // awk ' $2 == "//!<" {sub(",","", $1); print "case " $1 ":\n    os << \"" $1 "\";\n    break;" }' ~/work/branches/master/scilab/modules/scicos/includes/utilities.hxx
178
179 std::ostream& operator<<(std::ostream& os, update_status_t u)
180 {
181     switch (u)
182     {
183         case SUCCESS:
184             os << "SUCCESS";
185             break;
186         case NO_CHANGES:
187             os << "NO_CHANGES";
188             break;
189         case FAIL:
190             os << "FAIL";
191             break;
192     }
193     return os;
194 }
195
196 std::ostream& operator<<(std::ostream& os, kind_t k)
197 {
198     switch (k)
199     {
200         case ANNOTATION:
201             os << "ANNOTATION";
202             break;
203         case BLOCK:
204             os << "BLOCK";
205             break;
206         case DIAGRAM:
207             os << "DIAGRAM";
208             break;
209         case LINK:
210             os << "LINK";
211             break;
212         case PORT:
213             os << "PORT";
214             break;
215     }
216     return os;
217 }
218
219
220 std::ostream& operator<<(std::ostream& os, object_properties_t p)
221 {
222     switch (p)
223     {
224         case PARENT_DIAGRAM:
225             os << "PARENT_DIAGRAM";
226             break;
227         case GEOMETRY:
228             os << "GEOMETRY";
229             break;
230         case DESCRIPTION:
231             os << "DESCRIPTION";
232             break;
233         case FONT:
234             os << "FONT";
235             break;
236         case FONT_SIZE:
237             os << "FONT_SIZE";
238             break;
239         case RELATED_TO:
240             os << "RELATED_TO";
241             break;
242         case INTERFACE_FUNCTION:
243             os << "INTERFACE_FUNCTION";
244             break;
245         case SIM_FUNCTION_NAME:
246             os << "SIM_FUNCTION_NAME";
247             break;
248         case SIM_FUNCTION_API:
249             os << "SIM_FUNCTION_API";
250             break;
251         case SIM_SCHEDULE:
252             os << "SIM_SCHEDULE";
253             break;
254         case SIM_BLOCKTYPE:
255             os << "SIM_BLOCKTYPE";
256             break;
257         case SIM_DEP_UT:
258             os << "SIM_DEP_UT";
259             break;
260         case ANGLE:
261             os << "ANGLE";
262             break;
263         case EXPRS:
264             os << "EXPRS";
265             break;
266         case INPUTS:
267             os << "INPUTS";
268             break;
269         case OUTPUTS:
270             os << "OUTPUTS";
271             break;
272         case EVENT_INPUTS:
273             os << "EVENT_INPUTS";
274             break;
275         case EVENT_OUTPUTS:
276             os << "EVENT_OUTPUTS";
277             break;
278         case STATE:
279             os << "STATE";
280             break;
281         case DSTATE:
282             os << "DSTATE";
283             break;
284         case ODSTATE:
285             os << "ODSTATE";
286             break;
287         case NZCROSS:
288             os << "NZCROSS";
289             break;
290         case NMODE:
291             os << "NMODE";
292             break;
293         case RPAR:
294             os << "RPAR";
295             break;
296         case IPAR:
297             os << "IPAR";
298             break;
299         case OPAR:
300             os << "OPAR";
301             break;
302         case EQUATIONS:
303             os << "EQUATIONS";
304             break;
305         case UID:
306             os << "UID";
307             break;
308         case PARENT_BLOCK:
309             os << "PARENT_BLOCK";
310             break;
311         case CHILDREN:
312             os << "CHILDREN";
313             break;
314         case PORT_REFERENCE:
315             os << "PORT_REFERENCE";
316             break;
317         case STYLE:
318             os << "STYLE";
319             break;
320         case LABEL:
321             os << "LABEL";
322             break;
323         case DESTINATION_PORT:
324             os << "DESTINATION_PORT";
325             break;
326         case SOURCE_PORT:
327             os << "SOURCE_PORT";
328             break;
329         case CONTROL_POINTS:
330             os << "CONTROL_POINTS";
331             break;
332         case THICK:
333             os << "THICK";
334             break;
335         case COLOR:
336             os << "COLOR";
337             break;
338         case KIND:
339             os << "KIND";
340             break;
341         case FROM:
342             os << "FROM";
343             break;
344         case TO:
345             os << "TO";
346             break;
347         case DATATYPE:
348             os << "DATATYPE";
349             break;
350         case DATATYPE_ROWS:
351             os << "DATATYPE_ROWS";
352             break;
353         case DATATYPE_COLS:
354             os << "DATATYPE_COLS";
355             break;
356         case DATATYPE_TYPE:
357             os << "DATATYPE_TYPE";
358             break;
359         case FIRING:
360             os << "FIRING";
361             break;
362         case SOURCE_BLOCK:
363             os << "SOURCE_BLOCK";
364             break;
365         case PORT_KIND:
366             os << "PORT_KIND";
367             break;
368         case IMPLICIT:
369             os << "IMPLICIT";
370             break;
371         case PORT_NUMBER:
372             os << "PORT_NUMBER";
373             break;
374         case CONNECTED_SIGNALS:
375             os << "CONNECTED_SIGNALS";
376             break;
377         case TITLE:
378             os << "TITLE";
379             break;
380         case PATH:
381             os << "PATH";
382             break;
383         case PROPERTIES:
384             os << "PROPERTIES";
385             break;
386         case DIAGRAM_CONTEXT:
387             os << "CONTEXT";
388             break;
389         case VERSION_NUMBER:
390             os << "VERSION_NUMBER";
391             break;
392         default:
393             break;
394     }
395     return os;
396 }
397
398 void LoggerView::objectCreated(const ScicosID& uid, kind_t k)
399 {
400     std::stringstream ss;
401     ss << __FUNCTION__ << "( " << uid << " , " << k << " )" << std::endl;
402     log(LOG_DEBUG, ss);
403 }
404
405 void LoggerView::objectReferenced(const ScicosID& uid, kind_t k, unsigned refCount)
406 {
407     std::stringstream ss;
408     ss << __FUNCTION__ << "( " << uid << " , " << k << " ) : " << refCount << std::endl;
409     log(LOG_DEBUG, ss);
410 }
411
412 void LoggerView::objectUnreferenced(const ScicosID& uid, kind_t k, unsigned refCount)
413 {
414     std::stringstream ss;
415     ss << __FUNCTION__ << "( " << uid << " , " << k << " ) : " << refCount << std::endl;
416     log(LOG_DEBUG, ss);
417 }
418
419 void LoggerView::objectDeleted(const ScicosID& uid, kind_t k)
420 {
421     std::stringstream ss;
422     ss << __FUNCTION__ << "( " << uid << " , " << k << " )" << std::endl;
423     log(LOG_DEBUG, ss);
424 }
425
426 void LoggerView::propertyUpdated(const ScicosID& uid, kind_t k, object_properties_t p, update_status_t u)
427 {
428     std::stringstream ss;
429     ss << __FUNCTION__ << "( " << uid << " , " << k << " , " << p << " ) : " << u << std::endl;
430     log(LOG_TRACE, ss);
431 }
432
433 } /* namespace org_scilab_modules_scicos */