diff options
author | Constantin Kaplinsky <const@tightvnc.com> | 2006-05-25 05:01:55 +0000 |
---|---|---|
committer | Constantin Kaplinsky <const@tightvnc.com> | 2006-05-25 05:01:55 +0000 |
commit | a2adc8d4cfdf7336ce9192414c5e775224742a97 (patch) | |
tree | 0fc9f229bd40a2de342d91338798033da8ebd7bc /common/rfb/Logger.cxx | |
parent | 4fc2026b9595e9425f50616d18781995aebe495b (diff) | |
download | tigervnc-a2adc8d4cfdf7336ce9192414c5e775224742a97.tar.gz tigervnc-a2adc8d4cfdf7336ce9192414c5e775224742a97.zip |
Migrating to new directory structure adopted from the RealVNC's source tree. More changes will follow.
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@589 3789f03b-4d11-0410-bbf8-ca57d06f2519
Diffstat (limited to 'common/rfb/Logger.cxx')
-rw-r--r-- | common/rfb/Logger.cxx | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/common/rfb/Logger.cxx b/common/rfb/Logger.cxx new file mode 100644 index 00000000..52d33085 --- /dev/null +++ b/common/rfb/Logger.cxx @@ -0,0 +1,118 @@ +/* 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. + */ + +// -=- Logger.cxx - support for the Logger and LogWriter classes + +#include <stdarg.h> +#include <stdio.h> +#include <string.h> +#ifdef WIN32 +#define strcasecmp _stricmp +#define vsnprintf _vsnprintf +#define HAVE_VSNPRINTF +#endif + +#include <rfb/Logger.h> +#include <rfb/LogWriter.h> +#include <rfb/util.h> +#include <rfb/Threading.h> + +using namespace rfb; + +#ifndef HAVE_VSNPRINTF +#ifdef __RFB_THREADING_IMPL +static Mutex fpLock; +#endif +static FILE* fp = 0; +int vsnprintf(char *str, size_t n, const char *format, va_list ap) +{ + str[0] = 0; + if (!fp) { + // Safely create a FILE* for /dev/null if there isn't already one +#ifdef __RFB_THREADING_IMPL + Lock l(fpLock); +#endif + if (!fp) + fp = fopen("/dev/null","w"); + if (!fp) return 0; + } + int len = vfprintf(fp, format, ap); + if (len <= 0) return 0; + + CharArray s(len+1); + vsprintf(s.buf, format, ap); + + int written = __rfbmin(len, (int)n-1); + memcpy(str, s.buf, written); + str[written] = 0; + return len; +} +#endif + + +Logger* Logger::loggers = 0; + +Logger::Logger(const char* name) : registered(false), m_name(name), m_next(0) { +} + +Logger::~Logger() { + // *** Should remove this logger here! +} + +void Logger::write(int level, const char *logname, const char* format, + va_list ap) +{ + // - Format the supplied data, and pass it to the + // actual log_message function + // The log level is included as a hint for loggers capable of representing + // different log levels in some way. + char buf1[4096]; + vsnprintf(buf1, sizeof(buf1)-1, format, ap); + buf1[sizeof(buf1)-1] = 0; + write(level, logname, buf1); +} + +void +Logger::registerLogger() { + if (!registered) { + registered = true; + m_next = loggers; + loggers=this; + } +} + +Logger* +Logger::getLogger(const char* name) { + Logger* current = loggers; + while (current) { + if (strcasecmp(name, current->m_name) == 0) return current; + current = current->m_next; + } + return 0; +} + +void +Logger::listLoggers() { + Logger* current = loggers; + while (current) { + printf(" %s\n", current->m_name); + current = current->m_next; + } +} + + |