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