syncevolution/src/syncevo/Logging.cpp
Patrick Ohly 781e505c77 command line + D-Bus signal cleanup (MB #5043)
This patch started with the goal of changing the uint level into
a string. The motivation for that was that the numeric constants
would have to be documented (which they weren't) and prevent
us from easily changing the Logger::Level later on.

I did change them once today (see previous commit about reordering the
SHOW level) and really had the problem that a not-restarted
syncevo-dbus-server couldn't talk to a recompiled client.

Using strings avoids that problem.

While changing uint to string I had to make the change twice, once in
an entirely unnecessary new and the pointer definition. Replaced the
shared_ptr with normal members, throughout the code.

Then I wondered about the use of the () operator on these signal
watches.  At the point of use it was not obvious what that did. Turns
out that this activates the watch. In contrast to making a remote
function call or emitting a signal, I find the use of the operator
inappropriate for watches. Replaced with an explicit activate()
method.

While looking at the implementation, I found that this operator and
destructors had been duplicated. Instead of fixing it in all copies, I
moved the common code into a SignalWatch<> base template,
parameterized with the type of callback that it deals with.
2010-03-29 11:01:36 +02:00

104 lines
2.7 KiB
C++

/*
* Copyright (C) 2009 Patrick Ohly <patrick.ohly@gmx.de>
* Copyright (C) 2009 Intel Corporation
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) version 3.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA
*/
#include <syncevo/Logging.h>
#include <syncevo/LogStdout.h>
#include <vector>
#include <string.h>
#include <syncevo/declarations.h>
SE_BEGIN_CXX
static LoggerStdout DefaultLogger;
static std::vector<LoggerBase *> loggers;
LoggerBase &LoggerBase::instance()
{
if (!loggers.empty()) {
return *loggers[loggers.size() - 1];
} else {
return DefaultLogger;
}
}
void LoggerBase::pushLogger(LoggerBase *logger)
{
loggers.push_back(logger);
}
void LoggerBase::popLogger()
{
if (loggers.empty()) {
throw "too many popLogger() calls";
} else {
loggers.pop_back();
}
}
void Logger::message(Level level,
const char *prefix,
const char *file,
int line,
const char *function,
const char *format,
...)
{
va_list args;
va_start(args, format);
messagev(level, prefix, file, line, function, format, args);
va_end(args);
}
const char *Logger::levelToStr(Level level)
{
switch (level) {
case SHOW: return "SHOW";
case ERROR: return "ERROR";
case WARNING: return "WARNING";
case INFO: return "INFO";
case DEV: return "DEVELOPER";
case DEBUG: return "DEBUG";
default: return "???";
}
}
Logger::Level Logger::strToLevel(const char *str)
{
// order is based on a rough estimate of message frequency of the
// corresponding type
if (!str || !strcmp(str, "DEBUG")) {
return DEBUG;
} else if (!strcmp(str, "INFO")) {
return INFO;
} else if (!strcmp(str, "SHOW")) {
return SHOW;
} else if (!strcmp(str, "ERROR")) {
return ERROR;
} else if (!strcmp(str, "WARNING")) {
return WARNING;
} else if (!strcmp(str, "DEV")) {
return DEV;
} else {
return DEBUG;
}
}
SE_END_CXX