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