utf: scicos 2
[scilab.git] / scilab / modules / scicos / sci_gateway / cpp / sci_scicos_log.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 <string>
14
15 #include "gw_scicos.hxx"
16
17 #include "types.hxx"
18 #include "string.hxx"
19 #include "mlist.hxx"
20 #include "list.hxx"
21 #include "function.hxx"
22
23 #include "Controller.hxx"
24 #include "LoggerView.hxx"
25 #include "utilities.hxx"
26 #include "controller_helpers.hxx"
27
28 extern "C"
29 {
30 #include "Scierror.h"
31 #include "localization.h"
32 }
33
34 using namespace org_scilab_modules_scicos;
35
36 static const std::string funame = "scicos_log";
37
38 types::Function::ReturnValue sci_scicos_log(types::typed_list &in, int _iRetCount, types::typed_list &out)
39 {
40     if (in.size() > 2)
41     {
42         Scierror(999, _("%s: Wrong number of input arguments: %d to %d expected.\n"), funame.data(), 0, 2);
43         return types::Function::Error;
44     }
45     if (!(0 <= _iRetCount && _iRetCount <= 1))
46     {
47         Scierror(999, _("%s: Wrong number of output arguments: %d to %d expected.\n"), funame.data(), 0, 1);
48         return types::Function::Error;
49     }
50
51     if (in.size() == 0)
52     {
53         LoggerView* logger = get_or_allocate_logger();
54         enum LogLevel previous = logger->getLevel();
55
56         if (_iRetCount == 1)
57         {
58             out.push_back(new types::String(LoggerView::toString(previous)));
59         }
60
61         return types::Function::OK;
62     }
63
64     types::InternalType* internLevel = in[0];
65     if (internLevel->getType() != types::InternalType::ScilabString)
66     {
67         Scierror(999, _("%s: Wrong type for input argument #%d: String expected.\n"), funame.data(), 1);
68         return types::Function::Error;
69     }
70     types::String* strLevel = internLevel->getAs<types::String>();
71     if (strLevel->getSize() != 1)
72     {
73         Scierror(999, _("%s: Wrong size for input argument #%d: String expected.\n"), funame.data(), 1);
74         return types::Function::Error;
75     }
76
77     enum LogLevel logLevel = LoggerView::indexOf(strLevel->get(0));
78     if (logLevel < 0)
79     {
80         std::stringstream buffer;
81         for (int i = LOG_TRACE; i < LOG_FATAL; i++)
82         {
83             buffer << LoggerView::toString(static_cast<enum LogLevel>(i));
84             buffer << ", ";
85         }
86         buffer << LoggerView::toString(LOG_FATAL);
87
88         Scierror(999, _("%s: Wrong value for input argument #%d: Must be in the set  {%s}.\n"), funame.data(), 1, buffer.str().data());
89         return types::Function::Error;
90     }
91
92     if (in.size() == 1)
93     {
94         /*
95          * Configure the logger value mode and return the previous log level
96          */
97         LoggerView* logger = get_or_allocate_logger();
98         enum LogLevel previous = logger->getLevel();
99         logger->setLevel(logLevel);
100
101         if (_iRetCount == 1)
102         {
103             out.push_back(new types::String(LoggerView::toString(previous)));
104         }
105     }
106     else
107     {
108         /*
109          * Log a message for a specific level and return the log level
110          */
111         types::InternalType* internMsg = in[1];
112         if (internMsg->getType() != types::InternalType::ScilabString)
113         {
114             Scierror(999, _("%s: Wrong type for input argument #%d: String expected.\n"), funame.data(), 2);
115             return types::Function::Error;
116         }
117         types::String* strMsg = internMsg->getAs<types::String>();
118         if (strMsg->getSize() != 1)
119         {
120             Scierror(999, _("%s: Wrong size for input argument #%d: String expected.\n"), funame.data(), 2);
121             return types::Function::Error;
122         }
123
124         LoggerView* logger = get_or_allocate_logger();
125         logger->log(logLevel, strMsg->get(0));
126
127         if (_iRetCount == 1)
128         {
129             out.push_back(new types::String(LoggerView::toString(logLevel)));
130         }
131     }
132
133     return types::Function::OK;
134 }