[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