diff options
Diffstat (limited to 'common/rfb/LogWriter.cxx')
-rw-r--r-- | common/rfb/LogWriter.cxx | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/common/rfb/LogWriter.cxx b/common/rfb/LogWriter.cxx new file mode 100644 index 00000000..c6461d14 --- /dev/null +++ b/common/rfb/LogWriter.cxx @@ -0,0 +1,137 @@ +/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. + * + * This is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this software; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + * USA. + */ + +// -=- LogWriter.cxx - client-side logging interface + +#include <string.h> +#ifdef WIN32 +#define strcasecmp _stricmp +#endif + +#include <rfb/LogWriter.h> +#include <rfb/Configuration.h> +#include <rfb/util.h> +#include <stdlib.h> + +rfb::LogParameter rfb::logParams; + +using namespace rfb; + + +LogWriter::LogWriter(const char* name) : m_name(name), m_level(0), m_log(0), m_next(log_writers) { + log_writers = this; +} + +LogWriter::~LogWriter() { + // *** Should remove this logger here! +} + +void LogWriter::setLog(Logger *logger) { + m_log = logger; +} + +void LogWriter::setLevel(int level) { + m_level = level; +} + +void +LogWriter::listLogWriters(int width) { + // *** make this respect width... + LogWriter* current = log_writers; + fprintf(stderr, " "); + while (current) { + fprintf(stderr, "%s", current->m_name); + current = current->m_next; + if (current) fprintf(stderr, ", "); + } + fprintf(stderr, "\n"); +} + +LogWriter* LogWriter::log_writers; + +LogWriter* +LogWriter::getLogWriter(const char* name) { + LogWriter* current = log_writers; + while (current) { + if (strcasecmp(name, current->m_name) == 0) return current; + current = current->m_next; + } + return 0; +} + +bool LogWriter::setLogParams(const char* params) { + CharArray logwriterName, loggerName, logLevel; + if (!strSplit(params, ':', &logwriterName.buf, &loggerName.buf) || + !strSplit(loggerName.buf, ':', &loggerName.buf, &logLevel.buf)) { + fprintf(stderr,"failed to parse log params:%s\n",params); + return false; + } + int level = atoi(logLevel.buf); + Logger* logger = 0; + if (strcmp("", loggerName.buf) != 0) { + logger = Logger::getLogger(loggerName.buf); + if (!logger) fprintf(stderr,"no logger found! %s\n",loggerName.buf); + } + if (strcmp("*", logwriterName.buf) == 0) { + LogWriter* current = log_writers; + while (current) { + current->setLog(logger); + current->setLevel(level); + current = current->m_next; + } + return true; + } else { + LogWriter* logwriter = getLogWriter(logwriterName.buf); + if (!logwriter) { + fprintf(stderr,"no logwriter found! %s\n",logwriterName.buf); + } else { + logwriter->setLog(logger); + logwriter->setLevel(level); + return true; + } + } + return false; +} + + +LogParameter::LogParameter() + : StringParameter("Log", + "Specifies which log output should be directed to " + "which target logger, and the level of output to log. " + "Format is <log>:<target>:<level>[, ...].", + "") { +} + +bool LogParameter::setParam(const char* v) { + if (immutable) return true; + LogWriter::setLogParams("*::0"); + StringParameter::setParam(v); + CharArray logParam; + CharArray params(getData()); + while (params.buf) { + strSplit(params.buf, ',', &logParam.buf, ¶ms.buf); + if (strlen(logParam.buf) && !LogWriter::setLogParams(logParam.buf)) + return false; + } + return true; +} + +void LogParameter::setDefault(const char* d) { + def_value = d; + setParam(def_value); +} |