telepathy-qt: BaseDebug: Implemented "keep N last messages" feature for GetMessages().

Alexandr Akulich kaffeine at kemper.freedesktop.org
Fri May 6 15:26:59 UTC 2016


Module: telepathy-qt
Branch: master
Commit: a66aacabbe8f6a8a4e3bad5d0a9f730652e98479
URL:    http://cgit.freedesktop.org/telepathy/telepathy-qt/commit/?id=a66aacabbe8f6a8a4e3bad5d0a9f730652e98479

Author: Alexandr Akulich <akulichalexander at gmail.com>
Date:   Wed Mar  2 17:51:39 2016 +0500

BaseDebug: Implemented "keep N last messages" feature for GetMessages().

- Added setGetMessagesLimit() to set a limit. Pass a negative number to
have unlimited messages log.
- Added clear() method to cleanup all messages.

---

 TelepathyQt/base-debug.cpp | 65 ++++++++++++++++++++++++++++++++++++++++++++++
 TelepathyQt/base-debug.h   |  3 +++
 2 files changed, 68 insertions(+)

diff --git a/TelepathyQt/base-debug.cpp b/TelepathyQt/base-debug.cpp
index 929759d..a7a1c28 100644
--- a/TelepathyQt/base-debug.cpp
+++ b/TelepathyQt/base-debug.cpp
@@ -35,12 +35,19 @@ struct TP_QT_NO_EXPORT BaseDebug::Private
     Private(BaseDebug *parent, const QDBusConnection &dbusConnection)
         : parent(parent),
           enabled(false),
+          getMessagesLimit(0),
+          lastMessageIndex(-1),
           adaptee(new BaseDebug::Adaptee(dbusConnection, parent))
     {
     }
 
     BaseDebug *parent;
     bool enabled;
+    int getMessagesLimit;
+    int lastMessageIndex;
+
+    DebugMessageList messages;
+
     GetMessagesCallback getMessageCB;
     BaseDebug::Adaptee *adaptee;
 };
@@ -85,6 +92,11 @@ bool BaseDebug::isEnabled() const
     return mPriv->enabled;
 }
 
+int BaseDebug::getMessagesLimit() const
+{
+    return mPriv->getMessagesLimit;
+}
+
 void BaseDebug::setGetMessagesCallback(const BaseDebug::GetMessagesCallback &cb)
 {
     mPriv->getMessageCB = cb;
@@ -93,6 +105,13 @@ void BaseDebug::setGetMessagesCallback(const BaseDebug::GetMessagesCallback &cb)
 DebugMessageList BaseDebug::getMessages(Tp::DBusError *error) const
 {
     if (!mPriv->getMessageCB.isValid()) {
+        if (mPriv->getMessagesLimit) {
+            if (mPriv->lastMessageIndex < 0) {
+                return mPriv->messages;
+            } else {
+                return mPriv->messages.mid(mPriv->lastMessageIndex + 1) + mPriv->messages.mid(0, mPriv->lastMessageIndex + 1);
+            }
+        }
         error->set(TP_QT_ERROR_NOT_IMPLEMENTED, QLatin1String("Not implemented"));
         return DebugMessageList();
     }
@@ -105,6 +124,32 @@ void BaseDebug::setEnabled(bool enabled)
     mPriv->enabled = enabled;
 }
 
+void BaseDebug::setGetMessagesLimit(int limit)
+{
+    mPriv->getMessagesLimit = limit;
+    DebugMessageList messages;
+
+    if (mPriv->lastMessageIndex < 0) {
+        messages = mPriv->messages;
+    } else {
+        messages = mPriv->messages.mid(mPriv->lastMessageIndex + 1) + mPriv->messages.mid(0, mPriv->lastMessageIndex + 1);
+    }
+
+    mPriv->lastMessageIndex = -1;
+
+    if (mPriv->messages.count() <= limit) {
+        mPriv->messages = messages;
+    } else {
+        mPriv->messages = messages.mid(messages.count() - limit, limit);
+    }
+}
+
+void BaseDebug::clear()
+{
+    mPriv->messages.clear();
+    mPriv->lastMessageIndex = -1;
+}
+
 void BaseDebug::newDebugMessage(const QString &domain, DebugLevel level, const QString &message)
 {
     qint64 msec = QDateTime::currentMSecsSinceEpoch();
@@ -115,6 +160,26 @@ void BaseDebug::newDebugMessage(const QString &domain, DebugLevel level, const Q
 
 void BaseDebug::newDebugMessage(double time, const QString &domain, DebugLevel level, const QString &message)
 {
+    if (mPriv->getMessagesLimit != 0) {
+        DebugMessage newMessage;
+        newMessage.timestamp = time;
+        newMessage.domain = domain;
+        newMessage.level = level;
+        newMessage.message = message;
+
+        if (mPriv->messages.count() == mPriv->getMessagesLimit) {
+            ++mPriv->lastMessageIndex;
+
+            if (mPriv->lastMessageIndex >= mPriv->messages.count()) {
+                mPriv->lastMessageIndex = 0;
+            }
+
+            mPriv->messages[mPriv->lastMessageIndex] = newMessage;
+        } else { // This works when the limit is not hitted yet, or when there is no limit at all (negative limit number)
+            mPriv->messages << newMessage;
+        }
+    }
+
     if (!isEnabled()) {
         return;
     }
diff --git a/TelepathyQt/base-debug.h b/TelepathyQt/base-debug.h
index 14f137a..22d4bd3 100644
--- a/TelepathyQt/base-debug.h
+++ b/TelepathyQt/base-debug.h
@@ -42,6 +42,7 @@ public:
     explicit BaseDebug(const QDBusConnection &dbusConnection = QDBusConnection::sessionBus());
 
     bool isEnabled() const;
+    int getMessagesLimit() const;
 
     typedef Callback1<DebugMessageList, DBusError*> GetMessagesCallback;
     void setGetMessagesCallback(const GetMessagesCallback &cb);
@@ -50,6 +51,8 @@ public:
 
 public Q_SLOTS:
     void setEnabled(bool enabled);
+    void setGetMessagesLimit(int limit);
+    void clear();
 
     void newDebugMessage(const QString &domain, DebugLevel level, const QString &message);
     void newDebugMessage(double time, const QString &domain, DebugLevel level, const QString &message);



More information about the telepathy-commits mailing list