Branch 'kolab/integration/4.13.0' - resources/imap resources/kolab
Christian Mollekopf
mollekopf at kolabsys.com
Wed Jan 14 00:21:36 CET 2015
resources/imap/CMakeLists.txt | 1
resources/imap/imapresource.cpp | 1
resources/imap/imapresourcebase.cpp | 7 +++
resources/imap/resourcetask.cpp | 9 +++
resources/imap/tracer.cpp | 53 +++++++++++++++++++++++
resources/imap/tracer.h | 7 +++
resources/kolab/kolabresource.cpp | 16 ++++++
resources/kolab/kolabretrievecollectionstask.cpp | 10 ++++
8 files changed, 103 insertions(+), 1 deletion(-)
New commits:
commit 3c92a97502bccfb2b46fb53a92857635a5429daf
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date: Wed Jan 14 00:21:29 2015 +0100
Added tracing information.
Can be enabled by exporting IMAP_TRACE=1
diff --git a/resources/imap/CMakeLists.txt b/resources/imap/CMakeLists.txt
index 319ffd2..d194d00 100644
--- a/resources/imap/CMakeLists.txt
+++ b/resources/imap/CMakeLists.txt
@@ -49,6 +49,7 @@ set( imapresource_LIB_SRCS
resourcestate.cpp
collectionmetadatahelper.cpp
replacemessagejob.cpp
+ tracer.cpp
${AKONADI_COLLECTIONATTRIBUTES_SHARED_SOURCES}
${AKONADI_IMAPATTRIBUTES_SHARED_SOURCES}
)
diff --git a/resources/imap/imapresource.cpp b/resources/imap/imapresource.cpp
index e78768a..5e37b96 100644
--- a/resources/imap/imapresource.cpp
+++ b/resources/imap/imapresource.cpp
@@ -29,6 +29,7 @@
#include "sessionpool.h"
#include "settingspasswordrequester.h"
#include "sessionuiproxy.h"
+#include "tracer.h"
#include <KWindowSystem>
#include <KLocalizedString>
diff --git a/resources/imap/imapresourcebase.cpp b/resources/imap/imapresourcebase.cpp
index 62d2457..4d0f5a8 100644
--- a/resources/imap/imapresourcebase.cpp
+++ b/resources/imap/imapresourcebase.cpp
@@ -75,6 +75,7 @@
#include "retrieveitemtask.h"
#include "retrieveitemstask.h"
#include "searchtask.h"
+#include "tracer.h"
#include "settingspasswordrequester.h"
#include "sessionpool.h"
@@ -146,11 +147,13 @@ ImapResourceBase::ImapResourceBase( const QString &id )
connect( m_statusMessageTimer, SIGNAL(timeout()), SLOT(clearStatusMessage()) );
connect( this, SIGNAL(error(QString)), SLOT(showError(QString)) );
+ Trace() << "foobar";
QMetaObject::invokeMethod( this, "delayedInit", Qt::QueuedConnection );
}
void ImapResourceBase::delayedInit()
{
+ Trace();
settings(); // make sure the D-Bus settings interface is up
new ImapResourceBaseAdaptor( this );
setNeedsNetwork( needsNetwork() );
@@ -350,6 +353,7 @@ Settings *ImapResourceBase::settings() const
bool ImapResourceBase::retrieveItem( const Akonadi::Item &item, const QSet<QByteArray> &parts )
{
+ Trace() << item.id() << parts;
// The collection name is empty here...
//emit status( AgentBase::Running, i18nc( "@info:status", "Retrieving item in '%1'", item.parentCollection().name() ) );
@@ -398,6 +402,7 @@ void ImapResourceBase::itemsRemoved( const Akonadi::Item::List &items )
void ImapResourceBase::itemsMoved( const Akonadi::Item::List &items, const Akonadi::Collection &source,
const Akonadi::Collection &destination )
{
+ Trace() << items.size() << source.id() << destination.id();
if ( items.first().parentCollection() != destination ) { // should have been set by the server
kWarning() << "Collections don't match: destination=" << destination.id()
<< "; items parent=" << items.first().parentCollection().id()
@@ -419,6 +424,7 @@ void ImapResourceBase::itemsMoved( const Akonadi::Item::List &items, const Akona
void ImapResourceBase::retrieveCollections()
{
+ Trace();
emit status( AgentBase::Running, i18nc( "@info:status", "Retrieving folders" ) );
startTask(new RetrieveCollectionsTask( createResourceState(TaskArguments()), this ));
@@ -752,6 +758,7 @@ void ImapResourceBase::clearStatusMessage()
void ImapResourceBase::modifyCollection(const Collection &col)
{
+ Trace() << col.id();
Akonadi::CollectionModifyJob *modJob = new Akonadi::CollectionModifyJob(col, this);
connect(modJob, SIGNAL(result(KJob*)), this, SLOT(onCollectionModifyDone(KJob*)));
}
diff --git a/resources/imap/resourcetask.cpp b/resources/imap/resourcetask.cpp
index cc991d1..767d692 100644
--- a/resources/imap/resourcetask.cpp
+++ b/resources/imap/resourcetask.cpp
@@ -30,6 +30,7 @@
#include "imapflags.h"
#include "sessionpool.h"
#include "resourcestateinterface.h"
+#include "tracer.h"
ResourceTask::ResourceTask( ActionIfNoSession action, ResourceStateInterface::Ptr resource, QObject *parent )
: QObject( parent ),
@@ -55,6 +56,7 @@ ResourceTask::~ResourceTask()
void ResourceTask::start( SessionPool *pool )
{
+ Trace() << metaObject()->className();
m_pool = pool;
connect( m_pool, SIGNAL(sessionRequestDone(qint64,KIMAP::Session*,int,QString)),
this, SLOT(onSessionRequested(qint64,KIMAP::Session*,int,QString)) );
@@ -95,6 +97,7 @@ void ResourceTask::onSessionRequested( qint64 requestId, KIMAP::Session *session
m_sessionRequestId = 0;
if ( errorCode!=SessionPool::NoError ) {
+ Trace() << "Error on: " << metaObject()->className();
switch ( m_actionIfNoSession ) {
case CancelIfNoSession:
kDebug() << "Cancelling this request. Probably there is no more session available.";
@@ -118,6 +121,7 @@ void ResourceTask::onSessionRequested( qint64 requestId, KIMAP::Session *session
connect( m_pool, SIGNAL(disconnectDone()),
this, SLOT(onPoolDisconnect()) );
+ Trace() << "starting: " << metaObject()->className();
doStart( m_session );
}
@@ -128,6 +132,8 @@ void ResourceTask::onConnectionLost( KIMAP::Session *session )
// the pointer, we don't need to release it once the
// task is done
m_session = 0;
+
+ Trace() << metaObject()->className();
cancelTask( i18n( "Connection lost" ) );
}
}
@@ -139,6 +145,7 @@ void ResourceTask::onPoolDisconnect()
// release our session anymore
m_pool = 0;
+ Trace() << metaObject()->className();
cancelTask( i18n( "Connection lost" ) );
}
@@ -366,6 +373,7 @@ void ResourceTask::changeProcessed()
void ResourceTask::cancelTask( const QString &errorString )
{
+ kDebug() << "Cancel task: " << errorString;
if (!mCancelled) {
mCancelled = true;
m_resource->cancelTask( errorString );
@@ -489,6 +497,7 @@ QList<QByteArray> ResourceTask::toAkonadiFlags( const QList<QByteArray> &flags )
void ResourceTask::kill()
{
+ Trace() << metaObject()->className();
kDebug();
cancelTask(i18n("killed"));
}
diff --git a/resources/imap/tracer.cpp b/resources/imap/tracer.cpp
new file mode 100644
index 0000000..714a013
--- /dev/null
+++ b/resources/imap/tracer.cpp
@@ -0,0 +1,53 @@
+#include "tracer.h"
+#include <kdebug.h>
+
+#include <QString>
+#include <QIODevice>
+#include <QCoreApplication>
+#include <iostream>
+#include <unistd.h>
+
+class DebugStream: public QIODevice
+{
+public:
+ QString m_location;
+ DebugStream()
+ : QIODevice()
+ {
+ open(WriteOnly);
+ }
+ virtual ~DebugStream(){};
+
+ bool isSequential() const { return true; }
+ qint64 readData(char *, qint64) { return 0; /* eof */ }
+ qint64 readLineData(char *, qint64) { return 0; /* eof */ }
+ qint64 writeData(const char *data, qint64 len)
+ {
+ const QByteArray buf = QByteArray::fromRawData(data, len);
+ if (!qgetenv("IMAP_TRACE").isEmpty()) {
+ // qt_message_output(QtDebugMsg, buf.trimmed().constData());
+ std::cout << buf.trimmed().constData() << std::endl;
+ }
+ return len;
+ }
+private:
+ Q_DISABLE_COPY(DebugStream)
+};
+
+QDebug debugStream(int line, const char* file, const char* function)
+{
+ static DebugStream stream;
+ QDebug debug(&stream);
+
+ static QByteArray programName;
+ if (programName.isEmpty()) {
+ if (QCoreApplication::instance())
+ programName = QCoreApplication::instance()->applicationName().toLocal8Bit();
+ else
+ programName = "<unknown program name>";
+ }
+
+ debug << QString("Trace:%1(%2) %3:").arg(QString::fromLatin1(programName)).arg(unsigned(getpid())).arg(function) /* << file << ":" << line */;
+
+ return debug;
+}
diff --git a/resources/imap/tracer.h b/resources/imap/tracer.h
new file mode 100644
index 0000000..df57acf
--- /dev/null
+++ b/resources/imap/tracer.h
@@ -0,0 +1,7 @@
+#pragma once
+
+#include <QDebug>
+
+QDebug debugStream(int line, const char* file, const char* function);
+
+#define Trace() debugStream(__LINE__, __FILE__, Q_FUNC_INFO)
diff --git a/resources/kolab/kolabresource.cpp b/resources/kolab/kolabresource.cpp
index 2066aab..e07c946 100644
--- a/resources/kolab/kolabresource.cpp
+++ b/resources/kolab/kolabresource.cpp
@@ -42,6 +42,7 @@
#include "kolabremovetagtask.h"
#include "kolabretrievecollectionstask.h"
#include "kolabretrievetagstask.h"
+#include "tracer.h"
KolabResource::KolabResource(const QString& id)
:ImapResource(id)
@@ -95,6 +96,7 @@ ResourceStateInterface::Ptr KolabResource::createResourceState(const TaskArgumen
void KolabResource::retrieveCollections()
{
+ Trace();
emit status(AgentBase::Running, i18nc("@info:status", "Retrieving folders"));
startTask(new KolabRetrieveCollectionsTask(createResourceState(TaskArguments()), this));
@@ -104,6 +106,7 @@ void KolabResource::retrieveCollections()
void KolabResource::itemAdded(const Akonadi::Item& item, const Akonadi::Collection& collection)
{
+ Trace() << item.id() << collection.id();
bool ok = true;
const Akonadi::Item imapItem = KolabHelpers::translateToImap(item, ok);
if (!ok) {
@@ -116,6 +119,7 @@ void KolabResource::itemAdded(const Akonadi::Item& item, const Akonadi::Collecti
void KolabResource::itemChanged(const Akonadi::Item& item, const QSet< QByteArray >& parts)
{
+ Trace() << item.id() << parts;
bool ok = true;
const Akonadi::Item imapItem = KolabHelpers::translateToImap(item, ok);
if (!ok) {
@@ -128,6 +132,7 @@ void KolabResource::itemChanged(const Akonadi::Item& item, const QSet< QByteArra
void KolabResource::itemsMoved(const Akonadi::Item::List& items, const Akonadi::Collection& source, const Akonadi::Collection& destination)
{
+ Trace() << items.size() << source.id() << destination.id();
bool ok = true;
const Akonadi::Item::List imapItems = KolabHelpers::translateToImap(items, ok);
if (!ok) {
@@ -140,6 +145,7 @@ void KolabResource::itemsMoved(const Akonadi::Item::List& items, const Akonadi::
static Akonadi::Collection updateAnnotations(const Akonadi::Collection &collection)
{
+ Trace() << collection.id();
//Set the annotations on new folders
const QByteArray kolabType = KolabHelpers::kolabTypeForMimeType(collection.contentMimeTypes());
if (!kolabType.isEmpty()) {
@@ -155,6 +161,7 @@ static Akonadi::Collection updateAnnotations(const Akonadi::Collection &collecti
void KolabResource::collectionAdded(const Akonadi::Collection& collection, const Akonadi::Collection& parent)
{
+ Trace() << collection.id() << parent.id();
//Set the annotations on new folders
const Akonadi::Collection col = updateAnnotations(collection);
//TODO we need to save the collections as well if the annotations have changed
@@ -164,6 +171,7 @@ void KolabResource::collectionAdded(const Akonadi::Collection& collection, const
void KolabResource::collectionChanged(const Akonadi::Collection& collection, const QSet< QByteArray >& parts)
{
+ Trace() << collection.id() << parts;
//Update annotations if necessary
const Akonadi::Collection col = updateAnnotations(collection);
//TODO we need to save the collections as well if the annotations have changed
@@ -175,36 +183,42 @@ void KolabResource::collectionChanged(const Akonadi::Collection& collection, con
void KolabResource::tagAdded(const Akonadi::Tag &tag)
{
+ Trace() << tag.id();
KolabAddTagTask *task = new KolabAddTagTask(createResourceState(TaskArguments(tag)), this);
startTask(task);
}
void KolabResource::tagChanged(const Akonadi::Tag &tag)
{
+ Trace() << tag.id();
KolabChangeTagTask *task = new KolabChangeTagTask(createResourceState(TaskArguments(tag)), QSharedPointer<TagConverter>(new TagConverter), this);
startTask(task);
}
void KolabResource::tagRemoved(const Akonadi::Tag &tag)
{
+ Trace() << tag.id();
KolabRemoveTagTask *task = new KolabRemoveTagTask(createResourceState(TaskArguments(tag)), this);
startTask(task);
}
void KolabResource::itemsTagsChanged(const Akonadi::Item::List &items, const QSet<Akonadi::Tag> &addedTags, const QSet<Akonadi::Tag> &removedTags)
{
+ Trace() << items.size() << addedTags.size() << removedTags.size();
KolabChangeItemsTagsTask *task = new KolabChangeItemsTagsTask(createResourceState(TaskArguments(items, addedTags, removedTags)), QSharedPointer<TagConverter>(new TagConverter), this);
startTask(task);
}
void KolabResource::retrieveTags()
{
+ Trace();
KolabRetrieveTagTask *task = new KolabRetrieveTagTask(createResourceState(TaskArguments()), KolabRetrieveTagTask::RetrieveTags, this);
startTask(task);
}
void KolabResource::retrieveRelations()
{
+ Trace();
KolabRetrieveTagTask *task = new KolabRetrieveTagTask(createResourceState(TaskArguments()), KolabRetrieveTagTask::RetrieveRelations, this);
startTask(task);
}
@@ -213,7 +227,7 @@ void KolabResource::itemsRelationsChanged(const Akonadi::Item::List &items,
const Akonadi::Relation::List &addedRelations,
const Akonadi::Relation::List &removedRelations)
{
- qDebug() << "WORKS .. relations added!" << items.count();
+ Trace() << items.size() << addedRelations.size() << removedRelations.size();
KolabChangeItemsRelationsTask *task = new KolabChangeItemsRelationsTask(createResourceState(TaskArguments(items, addedRelations, removedRelations)));
}
diff --git a/resources/kolab/kolabretrievecollectionstask.cpp b/resources/kolab/kolabretrievecollectionstask.cpp
index 353df77..53a84e0 100644
--- a/resources/kolab/kolabretrievecollectionstask.cpp
+++ b/resources/kolab/kolabretrievecollectionstask.cpp
@@ -22,6 +22,7 @@
#include "kolabretrievecollectionstask.h"
#include "kolabhelpers.h"
+#include "tracer.h"
#include <noselectattribute.h>
#include <noinferiorsattribute.h>
@@ -71,6 +72,7 @@ RetrieveMetadataJob::RetrieveMetadataJob(KIMAP::Session *session, const QStringL
void RetrieveMetadataJob::start()
{
+ Trace();
//Fill the map with empty entires so we set the mimetype to mail if no metadata is retrieved
Q_FOREACH (const QString &mailbox, mMailboxes) {
mMetadata.insert(mailbox, QMap<QByteArray, QByteArray>());
@@ -172,6 +174,7 @@ void RetrieveMetadataJob::onRightsReceived( KJob *job )
void RetrieveMetadataJob::checkDone()
{
if (!mJobs) {
+ Trace() << "done";
kDebug() << "done";
emitResult();
}
@@ -199,6 +202,7 @@ KolabRetrieveCollectionsTask::~KolabRetrieveCollectionsTask()
void KolabRetrieveCollectionsTask::doStart(KIMAP::Session *session)
{
+ Trace();
kDebug() << "Starting collection retrieval";
mTime.start();
mSession = session;
@@ -235,6 +239,7 @@ void KolabRetrieveCollectionsTask::doStart(KIMAP::Session *session)
mMailCollections.insert(QString(), root);
+ Trace() << "subscription enabled: " << isSubscriptionEnabled();
//jobs are serialized by the session
if (isSubscriptionEnabled()) {
KIMAP::ListJob *fullListJob = new KIMAP::ListJob(session);
@@ -403,10 +408,12 @@ void KolabRetrieveCollectionsTask::createCollection(const QString &mailbox, cons
void KolabRetrieveCollectionsTask::onMailBoxesReceiveDone(KJob* job)
{
+ Trace();
kDebug() << "All mailboxes received: " << mTime.elapsed();
kDebug() << "in total: " << mMailCollections.size();
mJobs--;
if (job->error()) {
+ kWarning() << job->errorString();
cancelTask(job->errorString());
} else {
QSet<QString> mailboxes;
@@ -479,6 +486,7 @@ void KolabRetrieveCollectionsTask::applyMetadata(QHash<QString, QMap<QByteArray,
void KolabRetrieveCollectionsTask::onMetadataRetrieved(KJob *job)
{
+ Trace();
kDebug() << mTime.elapsed();
mJobs--;
if (job->error()) {
@@ -495,6 +503,7 @@ void KolabRetrieveCollectionsTask::onMetadataRetrieved(KJob *job)
void KolabRetrieveCollectionsTask::checkDone()
{
if (!mJobs) {
+ Trace() << "done " << mMailCollections.size();
collectionsRetrieved(mMailCollections.values());
kDebug() << "done " << mTime.elapsed();
}
@@ -511,6 +520,7 @@ void KolabRetrieveCollectionsTask::onFullMailBoxesReceived(const QList< KIMAP::M
void KolabRetrieveCollectionsTask::onFullMailBoxesReceiveDone(KJob* job)
{
+ Trace();
kDebug() << "received subscribed collections " << mTime.elapsed();
mJobs--;
if (job->error()) {
More information about the commits
mailing list