[SCM] ktp-common-internals packaging branch, master, updated. debian/15.12.1-2-1839-gf0635e9

Maximiliano Curia maxy at moszumanska.debian.org
Mon May 9 09:07:48 UTC 2016


Gitweb-URL: http://git.debian.org/?p=pkg-kde/applications/ktp-common-internals.git;a=commitdiff;h=31ca8b3

The following commit has been merged in the master branch:
commit 31ca8b3d659951bc80422a3ba6ac8766661e2a5b
Author: Siddhartha Sahu <sh.siddhartha at gmail.com>
Date:   Wed Nov 6 19:37:07 2013 +0530

    Add backlog messages to MessagesModel
---
 KTp/CMakeLists.txt                 |   2 +-
 KTp/Declarative/CMakeLists.txt     |   1 +
 KTp/Declarative/messages-model.cpp |  28 +++++-
 KTp/Declarative/messages-model.h   |   5 ++
 KTp/Logger/CMakeLists.txt          |   2 +
 KTp/Logger/logmanager.cpp          | 175 +++++++++++++++++++++++++++++++++++++
 KTp/Logger/logmanager.h            |  71 +++++++++++++++
 7 files changed, 281 insertions(+), 3 deletions(-)

diff --git a/KTp/CMakeLists.txt b/KTp/CMakeLists.txt
index ec1760d..363220c 100644
--- a/KTp/CMakeLists.txt
+++ b/KTp/CMakeLists.txt
@@ -117,10 +117,10 @@ install (FILES ${ktp_common_internals_private_HDRS}
          DESTINATION ${INCLUDE_INSTALL_DIR}/KTp
 )
 
-add_subdirectory(Declarative)
 add_subdirectory(Models)
 add_subdirectory(Widgets)
 add_subdirectory(Logger)
+add_subdirectory(Declarative)
 
 # API docs
 find_package(Doxygen)
diff --git a/KTp/Declarative/CMakeLists.txt b/KTp/Declarative/CMakeLists.txt
index 7208fd2..5517c31 100644
--- a/KTp/Declarative/CMakeLists.txt
+++ b/KTp/Declarative/CMakeLists.txt
@@ -26,6 +26,7 @@ target_link_libraries (ktpqmlplugin
     ${TELEPATHY_QT4_LIBRARIES}
     ${KDE4_KDEUI_LIBS}
     ktpcommoninternalsprivate
+    ktploggerprivate
     ktpmodelsprivate
 )
 
diff --git a/KTp/Declarative/messages-model.cpp b/KTp/Declarative/messages-model.cpp
index 601c418..e8ff036 100644
--- a/KTp/Declarative/messages-model.cpp
+++ b/KTp/Declarative/messages-model.cpp
@@ -27,8 +27,9 @@
 #include <TelepathyQt/TextChannel>
 #include <TelepathyQt/Account>
 
-#include "KTp/message-processor.h"
-#include "KTp/message.h"
+#include "../message-processor.h"
+#include "../message-context.h"
+#include <../Logger/logmanager.h>
 
 class MessagePrivate
 {
@@ -51,6 +52,7 @@ class MessagesModel::MessagesModelPrivate
   public:
     Tp::TextChannelPtr textChannel;
     Tp::AccountPtr account;
+    LogManager *logManager;
     QList<MessagePrivate> messages;
     // For fast lookup of original messages upon receipt of a message delivery report.
     QHash<QString /*messageToken*/, QPersistentModelIndex> messagesByMessageToken;
@@ -76,6 +78,10 @@ MessagesModel::MessagesModel(const Tp::AccountPtr &account, QObject *parent) :
 
     d->account = account;
     d->visible = false;
+
+    d->logManager = new LogManager(this);
+    connect(d->logManager, SIGNAL(fetched(QList<KTp::Message>)), SLOT(onHistoryFetched(QList<KTp::Message>)));
+    d->logManager->setScrollbackLength(10);
 }
 
 Tp::TextChannelPtr MessagesModel::textChannel() const
@@ -120,6 +126,10 @@ void MessagesModel::setTextChannel(const Tp::TextChannelPtr &channel)
 
     d->textChannel = channel;
 
+    d->logManager->setTextChannel(d->account, d->textChannel);
+    m_previousConversationAvailable = d->logManager->exists();
+    d->logManager->fetchScrollback();
+
     QList<Tp::ReceivedMessage> messageQueue = channel->messageQueue();
     Q_FOREACH(const Tp::ReceivedMessage &message, messageQueue) {
         bool messageAlreadyInModel = false;
@@ -137,6 +147,20 @@ void MessagesModel::setTextChannel(const Tp::TextChannelPtr &channel)
     }
 }
 
+void MessagesModel::onHistoryFetched(const QList<KTp::Message> &messages)
+{
+    kDebug() << "found" << messages.count() << "messages in history";
+    if (!messages.isEmpty()) {
+        //Add all messages before the ones already present in the channel
+        for(int i=messages.size()-1;i>=0;i--) {
+            beginInsertRows(QModelIndex(), 0, 0);
+            d->messages.prepend(KTp::MessageProcessor::instance()->processIncomingMessage(
+                               messages[i], KTp::MessageContext(d->account, d->textChannel)));
+            endInsertRows();
+        }
+    }
+}
+
 void MessagesModel::onMessageReceived(const Tp::ReceivedMessage &message)
 {
     int unreadCount = d->textChannel->messageQueue().size();
diff --git a/KTp/Declarative/messages-model.h b/KTp/Declarative/messages-model.h
index 24d2cb8..53103ca 100644
--- a/KTp/Declarative/messages-model.h
+++ b/KTp/Declarative/messages-model.h
@@ -25,6 +25,8 @@
 #include <TelepathyQt/Types>
 #include <TelepathyQt/ReceivedMessage>
 
+#include "../message.h"
+
 class MessagesModel : public QAbstractListModel
 {
     Q_OBJECT
@@ -89,6 +91,7 @@ class MessagesModel : public QAbstractListModel
     void onMessageSent(const Tp::Message &message, Tp::MessageSendingFlags flags, const QString &messageToken);
     void onPendingMessageRemoved();
     bool verifyPendingOperation(Tp::PendingOperation *op);
+    void onHistoryFetched(const QList<KTp::Message> &messages);
 
   private:
     void setupChannelSignals(const Tp::TextChannelPtr &channel);
@@ -96,6 +99,8 @@ class MessagesModel : public QAbstractListModel
 
     class MessagesModelPrivate;
     MessagesModelPrivate *d;
+
+    bool m_previousConversationAvailable;
 };
 
 #endif // CONVERSATION_MODEL_H
diff --git a/KTp/Logger/CMakeLists.txt b/KTp/Logger/CMakeLists.txt
index 9bf6c68..5b77c80 100644
--- a/KTp/Logger/CMakeLists.txt
+++ b/KTp/Logger/CMakeLists.txt
@@ -9,6 +9,7 @@ set (ktp_logger_private_SRCS
     abstract-logger-plugin.cpp
     log-entity.cpp
     log-manager.cpp
+    logmanager.cpp
     log-message.cpp
     log-search-hit.cpp
     pending-logger-dates.cpp
@@ -26,6 +27,7 @@ set (ktp_logger_private_HDRS
     abstract-logger-plugin.h
     log-entity.h
     log-manager.h
+    logmanager.h
     log-message.h
     log-search-hit.h
     pending-logger-dates.h
diff --git a/KTp/Logger/logmanager.cpp b/KTp/Logger/logmanager.cpp
new file mode 100644
index 0000000..34bb7ef
--- /dev/null
+++ b/KTp/Logger/logmanager.cpp
@@ -0,0 +1,175 @@
+/*
+    Copyright (C) 2011  Dominik Schmidt <kde at dominik-schmidt.de>
+    Copyright (C) 2013  Daniel Vrátil <dvratil at redhat.com>
+
+    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) any later version.
+
+    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 "logmanager.h"
+
+#include "../message-processor.h"
+#include "log-entity.h"
+#include "log-manager.h"
+#include "pending-logger-dates.h"
+#include "pending-logger-logs.h"
+
+#include <KDebug>
+
+#include <TelepathyQt/Types>
+#include <TelepathyQt/AvatarData>
+#include <TelepathyQt/TextChannel>
+#include <TelepathyQt/ReceivedMessage>
+
+class LogManager::Private
+{
+  public:
+    Private(): scrollbackLength(10)
+    {
+    }
+
+    Tp::AccountPtr account;
+    Tp::TextChannelPtr textChannel;
+    KTp::LogEntity contactEntity;
+    int scrollbackLength;
+};
+
+LogManager::LogManager(QObject *parent)
+    : QObject(parent),
+    d(new Private)
+{
+}
+
+LogManager::~LogManager()
+{
+    delete d;
+}
+
+bool LogManager::exists() const
+{
+    if (d->account.isNull() || d->textChannel.isNull() ) {
+        return false;
+    }
+
+    return KTp::LogManager::instance()->logsExist(d->account, d->contactEntity);
+}
+
+void LogManager::setTextChannel(const Tp::AccountPtr &account, const Tp::TextChannelPtr &textChannel)
+{
+    d->textChannel = textChannel;
+    d->account = account;
+
+    if (d->account.isNull() || d->textChannel.isNull()) {
+        return;
+    }
+
+    KTp::LogEntity contactEntity;
+    if (d->textChannel->targetHandleType() == Tp::HandleTypeContact) {
+        d->contactEntity = KTp::LogEntity(d->textChannel->targetHandleType(),
+                                       d->textChannel->targetContact()->id(),
+                                       d->textChannel->targetContact()->alias());
+    } else if (d->textChannel->targetHandleType() == Tp::HandleTypeRoom) {
+        d->contactEntity = KTp::LogEntity(d->textChannel->targetHandleType(),
+                                       d->textChannel->targetId());
+    }
+}
+
+void LogManager::setScrollbackLength(int n)
+{
+    d->scrollbackLength = n;
+}
+
+int LogManager::scrollbackLength() const
+{
+    return d->scrollbackLength;
+}
+
+void LogManager::fetchScrollback()
+{
+    fetchHistory(d->scrollbackLength);
+}
+
+void LogManager::fetchHistory(int n)
+{
+    if (n > 0 && !d->account.isNull() && !d->textChannel.isNull()) {
+        if (d->contactEntity.isValid()) {
+            KTp::LogManager *manager = KTp::LogManager::instance();
+            KTp::PendingLoggerDates *dates = manager->queryDates(d->account, d->contactEntity);
+            connect(dates, SIGNAL(finished(KTp::PendingLoggerOperation*)),
+                    this, SLOT(onDatesFinished(KTp::PendingLoggerOperation*)));
+            return;
+        }
+    }
+
+    //in all other cases finish immediately.
+    QList<KTp::Message> messages;
+    Q_EMIT fetched(messages);
+}
+
+void LogManager::onDatesFinished(KTp::PendingLoggerOperation* po)
+{
+    KTp::PendingLoggerDates *datesOp = qobject_cast<KTp::PendingLoggerDates*>(po);
+    if (datesOp->hasError()) {
+        kWarning() << "Failed to fetch dates:" << datesOp->error();
+        Q_EMIT fetched(QList<KTp::Message>());
+        return;
+    }
+
+    const QList<QDate> dates = datesOp->dates();
+    if (dates.isEmpty()) {
+        Q_EMIT fetched(QList<KTp::Message>());
+        return;
+    }
+
+    KTp::LogManager *manager = KTp::LogManager::instance();
+    KTp::PendingLoggerLogs *logs = manager->queryLogs(datesOp->account(), datesOp->entity(),
+                                                      dates.last());
+    connect(logs, SIGNAL(finished(KTp::PendingLoggerOperation*)),
+            this, SLOT(onEventsFinished(KTp::PendingLoggerOperation*)));
+}
+
+void LogManager::onEventsFinished(KTp::PendingLoggerOperation *op)
+{
+    KTp::PendingLoggerLogs *logsOp = qobject_cast<KTp::PendingLoggerLogs*>(op);
+    if (logsOp->hasError()) {
+        kWarning() << "Failed to fetch events:" << logsOp->error();
+        Q_EMIT fetched(QList<KTp::Message>());
+        return;
+    }
+
+    QStringList queuedMessageTokens;
+    if (!d->textChannel.isNull()) {
+        Q_FOREACH(const Tp::ReceivedMessage &message, d->textChannel->messageQueue()) {
+            queuedMessageTokens.append(message.messageToken());
+        }
+    }
+    kDebug() << "queuedMessageTokens" << queuedMessageTokens;
+
+    // get last n (d->fetchLast) messages that are not queued
+    const QList<KTp::LogMessage> allMessages = logsOp->logs();
+    QList<KTp::Message> messages;
+    const KTp::MessageContext ctx(d->account, d->textChannel);
+    for (int i = qMax(allMessages.count() - d->scrollbackLength, 0) ; i < allMessages.count(); ++i) {
+        const KTp::LogMessage message = allMessages[i];
+        if (queuedMessageTokens.contains(message.token())) {
+            continue;
+        }
+
+        messages << KTp::MessageProcessor::instance()->processIncomingMessage(message, ctx);
+    }
+
+    kDebug() << "emit all messages" << messages.count();
+    Q_EMIT fetched(messages);
+}
diff --git a/KTp/Logger/logmanager.h b/KTp/Logger/logmanager.h
new file mode 100644
index 0000000..eb71320
--- /dev/null
+++ b/KTp/Logger/logmanager.h
@@ -0,0 +1,71 @@
+/*
+    Copyright (C) 2011  Dominik Schmidt <kde at dominik-schmidt.de>
+    Copyright (C) 2013  Daniel Vrátil <dvratil at redhat.com>
+
+    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) any later version.
+
+    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
+*/
+
+
+#ifndef LOGMANAGER_H
+#define LOGMANAGER_H
+
+#include <KTp/message.h>
+
+namespace KTp {
+class PendingLoggerOperation;
+}
+
+class KTP_EXPORT LogManager : public QObject
+{
+    Q_OBJECT
+
+public:
+    explicit LogManager(QObject *parent = 0);
+    virtual ~LogManager();
+
+    bool exists() const;
+
+    void setTextChannel(const Tp::AccountPtr &account, const Tp::TextChannelPtr &textChannel);
+
+    /**
+     * Sets amount of messages to be fetched via @p fetchScrollback()
+     */
+    void setScrollbackLength(int n);
+
+    int scrollbackLength() const;
+
+    /**
+     * Fetches last N message,s as set via setFetchAmount()
+     */
+    void fetchScrollback();
+
+    /**
+     * Fetches last @p n messages
+     */
+    void fetchHistory(int n);
+
+Q_SIGNALS:
+    void fetched(const QList<KTp::Message> &messages);
+
+private Q_SLOTS:
+    void onDatesFinished(KTp::PendingLoggerOperation *po);
+    void onEventsFinished(KTp::PendingLoggerOperation *po);
+
+private:
+    class Private;
+    Private * const d;
+};
+
+#endif // LOGMANAGER_H

-- 
ktp-common-internals packaging



More information about the pkg-kde-commits mailing list