From a102fc73b685a84b042a3fe6a436aaa9e049a212 Mon Sep 17 00:00:00 2001 From: Mathew Sutcliffe Date: Mon, 14 Sep 2015 21:35:58 +0100 Subject: [PATCH] refs #466 Resolved TODO items in logging. --- src/blackmisc/logmessage.cpp | 34 +++++++++++++++++++-------------- src/blackmisc/logpattern.cpp | 16 +++++++++++++++- src/blackmisc/statusmessage.cpp | 24 +++++++++++++++++++++++ src/blackmisc/statusmessage.h | 3 +++ 4 files changed, 62 insertions(+), 15 deletions(-) diff --git a/src/blackmisc/logmessage.cpp b/src/blackmisc/logmessage.cpp index f610ecbc5..67fe77221 100644 --- a/src/blackmisc/logmessage.cpp +++ b/src/blackmisc/logmessage.cpp @@ -9,6 +9,7 @@ #include "logmessage.h" #include "blackmiscfreefunctions.h" +#include "index_sequence.h" namespace BlackMisc { @@ -76,8 +77,8 @@ namespace BlackMisc { // ostream(encodedCategory()) << message(); // QDebug::operator<<(QString) puts quote characters around the message - // FIXME hack to avoid putting quote characters around the message - // should be safe, but still it's horrible, we could directly call qt_message_output instead + // hack to avoid putting quote characters around the message + // should be safe, we could directly call qt_message_output instead, but it's undocumented QByteArray category = qtCategory(); QDebug debug = ostream(category); auto &stream = **reinterpret_cast(&debug); // should be safe because it is relying on Qt's guarantee of ABI compatibility @@ -125,6 +126,12 @@ namespace BlackMisc } } + namespace Private + { + template QString arg(index_sequence, const QString &format, const QStringList &args) { return format.arg(args[Is]...); } + QString arg(index_sequence<>, const QString &format, const QStringList &) { return format; } + } + QString CLogMessage::message() const { if (m_message.isEmpty()) @@ -133,20 +140,19 @@ namespace BlackMisc } else { - // TODO would like to have a QString::arg(QStringList) overload switch (m_args.size()) { - case 0: return m_message; - case 1: return m_message.arg(m_args[0]); - case 2: return m_message.arg(m_args[0], m_args[1]); - case 3: return m_message.arg(m_args[0], m_args[1], m_args[2]); - case 4: return m_message.arg(m_args[0], m_args[1], m_args[2], m_args[3]); - case 5: return m_message.arg(m_args[0], m_args[1], m_args[2], m_args[3], m_args[4]); - case 6: return m_message.arg(m_args[0], m_args[1], m_args[2], m_args[3], m_args[4], m_args[5]); - case 7: return m_message.arg(m_args[0], m_args[1], m_args[2], m_args[3], m_args[4], m_args[5], m_args[6]); - case 8: return m_message.arg(m_args[0], m_args[1], m_args[2], m_args[3], m_args[4], m_args[5], m_args[6], m_args[7]); - default: qWarning("Too many arguments"); - case 9: return m_message.arg(m_args[0], m_args[1], m_args[2], m_args[3], m_args[4], m_args[5], m_args[6], m_args[7], m_args[8]); + case 0: return Private::arg(Private::make_index_sequence<0>(), m_message, m_args); + case 1: return Private::arg(Private::make_index_sequence<1>(), m_message, m_args); + case 2: return Private::arg(Private::make_index_sequence<2>(), m_message, m_args); + case 3: return Private::arg(Private::make_index_sequence<3>(), m_message, m_args); + case 4: return Private::arg(Private::make_index_sequence<4>(), m_message, m_args); + case 5: return Private::arg(Private::make_index_sequence<5>(), m_message, m_args); + case 6: return Private::arg(Private::make_index_sequence<6>(), m_message, m_args); + case 7: return Private::arg(Private::make_index_sequence<7>(), m_message, m_args); + case 8: return Private::arg(Private::make_index_sequence<8>(), m_message, m_args); + default: qWarning("Too many arguments"); // intentional fall-through + case 9: return Private::arg(Private::make_index_sequence<9>(), m_message, m_args); } } } diff --git a/src/blackmisc/logpattern.cpp b/src/blackmisc/logpattern.cpp index 37236a462..3e4d78d67 100644 --- a/src/blackmisc/logpattern.cpp +++ b/src/blackmisc/logpattern.cpp @@ -248,7 +248,21 @@ namespace BlackMisc QString CLogPattern::convertToQString(bool i18n) const { Q_UNUSED(i18n); - return {}; //TODO + QString strategy; + QString categories = QStringList(m_strings.toList()).join("|"); + switch (m_strategy) + { + case Everything: strategy = "none"; break; + case ExactMatch: strategy = "exact match:" + categories; break; + case AnyOf: strategy = "any of:" + categories; break; + case AllOf: strategy = "all of:" + categories; break; + case StartsWith: strategy = "starts with:" + categories; break; + case EndsWith: strategy = "ends with:" + categories; break; + case Contains: strategy = "contains:" + categories; break; + case Nothing: strategy = "none"; break; + default: strategy = ""; break; + } + return "{" + CStatusMessage::severitiesToString(m_severities) + "," + strategy + "}"; } void CLogPattern::marshallToDbus(QDBusArgument &argument) const diff --git a/src/blackmisc/statusmessage.cpp b/src/blackmisc/statusmessage.cpp index c9786be04..33d21401d 100644 --- a/src/blackmisc/statusmessage.cpp +++ b/src/blackmisc/statusmessage.cpp @@ -236,6 +236,30 @@ namespace BlackMisc } } + QString CStatusMessage::severitiesToString(const QSet &severities) + { + auto minmax = std::minmax_element(severities.begin(), severities.end()); + auto min = *minmax.first; + auto max = *minmax.second; + if (min == SeverityDebug && max == SeverityError) + { + return "all severities"; + } + if (min == SeverityDebug) + { + return "at or below " + severityToString(max); + } + if (max == SeverityError) + { + return "at or above " + severityToString(min); + } + auto list = severities.toList(); + std::sort(list.begin(), list.end()); + QStringList ret; + std::transform(list.cbegin(), list.cend(), std::back_inserter(ret), severityToString); + return ret.join("|"); + } + const QString &CStatusMessage::getSeverityAsString() const { return severityToString(this->m_severity); diff --git a/src/blackmisc/statusmessage.h b/src/blackmisc/statusmessage.h index 99ab616e2..729579142 100644 --- a/src/blackmisc/statusmessage.h +++ b/src/blackmisc/statusmessage.h @@ -132,6 +132,9 @@ namespace BlackMisc //! Severity as string static const QString &severityToString(StatusSeverity severity); + //! Severity set as string + static QString severitiesToString(const QSet &severities); + //! Severity as string, if not possible to convert \sa CSeverityInfo static StatusSeverity stringToSeverity(const QString &severity);