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