<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">diff -Nru kdepim-runtime-4.13.0.orig/migration/knotes/knotesmigrator.cpp kdepim-runtime-4.13.0/migration/knotes/knotesmigrator.cpp
--- kdepim-runtime-4.13.0.orig/migration/knotes/knotesmigrator.cpp	2014-04-08 10:37:03.000000000 +0000
+++ kdepim-runtime-4.13.0/migration/knotes/knotesmigrator.cpp	2014-04-28 10:03:22.727567818 +0000
@@ -39,6 +39,7 @@
 #include &lt;KMime/Message&gt;
 
 #include &lt;KDebug&gt;
+#include &lt;KStandardDirs&gt;
 #include "maildirsettings.h"
 #include &lt;krandom.h&gt;
 
@@ -46,53 +47,76 @@
 using namespace Akonadi;
 
 KNotesMigrator::KNotesMigrator() :
-    KResMigrator&lt;KRES::Resource&gt;( QLatin1String("notes"), QString() ), m_notesResource( 0 )
+    KMigratorBase(), mIndexResource(-1), m_notesResource( 0 )
 {
     Akonadi::AttributeFactory::registerAttribute&lt;NoteLockAttribute&gt;();
     Akonadi::AttributeFactory::registerAttribute&lt;NoteAlarmAttribute&gt;();
     Akonadi::AttributeFactory::registerAttribute&lt;NoteDisplayAttribute&gt;();
     Akonadi::AttributeFactory::registerAttribute&lt;ShowFolderNotesAttribute&gt;();
+    const QString kresCfgFile = KStandardDirs::locateLocal( "config", QLatin1String( "kresources/notes/stdrc" ) );
+    mConfig = new KConfig( kresCfgFile );
+    const KConfigGroup generalGroup( mConfig, QLatin1String( "General" ) );
+    mUnknownTypeResources = generalGroup.readEntry( QLatin1String( "ResourceKeys" ), QStringList() );
+    m_notesResource = new KCal::CalendarLocal( QString() );
 }
 
 KNotesMigrator::~KNotesMigrator()
 {
     delete m_notesResource;
+    delete mConfig;
+}
+
+void KNotesMigrator::migrate()
+{
+    emit message( Info, i18n( "Beginning KNotes migration..." ) );
+    migrateNext();
 }
 
-bool KNotesMigrator::migrateResource( KRES::Resource* res)
+void KNotesMigrator::migrateNext()
 {
-    if ( res-&gt;type() == QLatin1String("file") )
+    ++mIndexResource;
+
+    if (mUnknownTypeResources.isEmpty() || mIndexResource &gt;= mUnknownTypeResources.count()) {
+        emit message( Info, i18n( "KNotes migration finished" ) );
+        deleteLater();
+        return;
+    }
+
+    const KConfigGroup kresCfgGroup( mConfig, QString::fromLatin1( "Resource_%1" ).arg( mUnknownTypeResources.at(mIndexResource) ) );
+    const QString resourceType = kresCfgGroup.readEntry( QLatin1String( "ResourceType" ), QString() );
+    if (resourceType == QLatin1String("file")) {
         createAgentInstance( QLatin1String("akonadi_akonotes_resource"), this, SLOT(notesResourceCreated(KJob*)) );
-    else
-        return false;
-    return true;
+    } else {
+        migrateNext();
+    }
 }
 
 void KNotesMigrator::notesResourceCreated(KJob * job)
 {
     if ( job-&gt;error() ) {
         migrationFailed( i18n( "Failed to create resource: %1", job-&gt;errorText() ) );
+        migrateNext();
         return;
     }
 
-    KRES::Resource *res = currentResource();
+    const KConfigGroup kresCfgGroup( mConfig, QString::fromLatin1( "Resource_%1" ).arg( mUnknownTypeResources.at(mIndexResource) ) );
+
     m_agentInstance = static_cast&lt;AgentInstanceCreateJob*&gt;( job )-&gt;instance();
-    const KConfigGroup kresCfg = kresConfig( res );
-    m_agentInstance.setName( kresCfg.readEntry( "ResourceName", "Migrated Notes" ) );
+    m_agentInstance.setName( kresCfgGroup.readEntry( "ResourceName", "Migrated Notes" ) );
 
-    QString resourcePath = kresCfg.readEntry( "NotesURL" );
+    const QString resourcePath = kresCfgGroup.readEntry( "NotesURL" );
     KUrl url( resourcePath );
 
     if ( !QFile::exists( url.toLocalFile() ) ) {
-        migrationCompleted( m_agentInstance );
+        migrateNext();
         return;
     }
 
-    m_notesResource = new KCal::CalendarLocal( QString() );
 
     bool success = m_notesResource-&gt;load( url.toLocalFile() );
     if ( !success ) {
         migrationFailed( i18n( "Failed to open file for reading: %1" , resourcePath ) );
+        migrateNext();
         return;
     }
 
@@ -103,9 +127,11 @@
     if ( !iface-&gt;isValid() ) {
         migrationFailed( i18n( "Failed to obtain D-Bus interface for remote configuration." ), m_agentInstance );
         delete iface;
+        migrateNext();
         return;
     }
-    iface-&gt;setReadOnly( res-&gt;readOnly() );
+    bool isReadOnly = kresCfgGroup.readEntry("ResourceIsReadOnly", false);
+    iface-&gt;setReadOnly( isReadOnly );
 
     QDBusPendingReply&lt;void&gt; response = iface-&gt;setPath( KGlobal::dirs()-&gt;localxdgdatadir() + QLatin1String("/notes/") + KRandom::randomString( 10 ) );
 
@@ -149,6 +175,7 @@
         }
     }
     emit message( Error, i18n( "Could not find root collection for resource \"%1\"" ,m_agentInstance.identifier() ) );
+    migrateNext();
 }
 
 void KNotesMigrator::startMigration()
@@ -236,5 +263,12 @@
 void KNotesMigrator::slotCollectionModify(KJob* job)
 {
     Q_UNUSED( job );
-    migrationCompleted( m_agentInstance );
+    migrateNext();
 }
+
+void KNotesMigrator::migrationFailed( const QString&amp; errorMsg, const Akonadi::AgentInstance&amp; instance )
+{
+    Q_UNUSED( instance )
+    emit message( Error, i18n( "Migration failed: %1" ,errorMsg ) );
+}
+
diff -Nru kdepim-runtime-4.13.0.orig/migration/knotes/knotesmigrator.cpp.orig kdepim-runtime-4.13.0/migration/knotes/knotesmigrator.cpp.orig
--- kdepim-runtime-4.13.0.orig/migration/knotes/knotesmigrator.cpp.orig	1970-01-01 00:00:00.000000000 +0000
+++ kdepim-runtime-4.13.0/migration/knotes/knotesmigrator.cpp.orig	2014-04-08 10:37:03.000000000 +0000
@@ -0,0 +1,240 @@
+/*
+    Copyright (c) 2008 Volker Krause &lt;vkrause@kde.org&gt;
+    Copyright (c) 2013 Laurent Montel &lt;montel@kde.org&gt;
+
+    This library is free software; you can redistribute it and/or modify it
+    under the terms of the GNU Library General Public License as published by
+    the Free Software Foundation; either version 2 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 Library General Public
+    License for more details.
+
+    You should have received a copy of the GNU Library General Public License
+    along with this library; see the file COPYING.LIB.  If not, write to the
+    Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+    02110-1301, USA.
+*/
+
+#include "knotesmigrator.h"
+#include "notelockattribute.h"
+#include "notealarmattribute.h"
+#include "notedisplayattribute.h"
+#include "showfoldernotesattribute.h"
+#include "knotesmigratorconfig.h"
+#include "knoteconfig.h"
+
+#include &lt;akonadi/agentinstance.h&gt;
+#include &lt;akonadi/agentinstancecreatejob.h&gt;
+#include &lt;akonadi/agentmanager.h&gt;
+#include &lt;akonadi/agenttype.h&gt;
+#include &lt;akonadi/resourcesynchronizationjob.h&gt;
+#include &lt;akonadi/collectionfetchjob.h&gt;
+#include &lt;Akonadi/AttributeFactory&gt;
+#include &lt;Akonadi/CollectionModifyJob&gt;
+#include &lt;akonadi/item.h&gt;
+#include "entitytreecreatejob.h"
+#include &lt;KMime/Message&gt;
+
+#include &lt;KDebug&gt;
+#include "maildirsettings.h"
+#include &lt;krandom.h&gt;
+
+
+using namespace Akonadi;
+
+KNotesMigrator::KNotesMigrator() :
+    KResMigrator&lt;KRES::Resource&gt;( QLatin1String("notes"), QString() ), m_notesResource( 0 )
+{
+    Akonadi::AttributeFactory::registerAttribute&lt;NoteLockAttribute&gt;();
+    Akonadi::AttributeFactory::registerAttribute&lt;NoteAlarmAttribute&gt;();
+    Akonadi::AttributeFactory::registerAttribute&lt;NoteDisplayAttribute&gt;();
+    Akonadi::AttributeFactory::registerAttribute&lt;ShowFolderNotesAttribute&gt;();
+}
+
+KNotesMigrator::~KNotesMigrator()
+{
+    delete m_notesResource;
+}
+
+bool KNotesMigrator::migrateResource( KRES::Resource* res)
+{
+    if ( res-&gt;type() == QLatin1String("file") )
+        createAgentInstance( QLatin1String("akonadi_akonotes_resource"), this, SLOT(notesResourceCreated(KJob*)) );
+    else
+        return false;
+    return true;
+}
+
+void KNotesMigrator::notesResourceCreated(KJob * job)
+{
+    if ( job-&gt;error() ) {
+        migrationFailed( i18n( "Failed to create resource: %1", job-&gt;errorText() ) );
+        return;
+    }
+
+    KRES::Resource *res = currentResource();
+    m_agentInstance = static_cast&lt;AgentInstanceCreateJob*&gt;( job )-&gt;instance();
+    const KConfigGroup kresCfg = kresConfig( res );
+    m_agentInstance.setName( kresCfg.readEntry( "ResourceName", "Migrated Notes" ) );
+
+    QString resourcePath = kresCfg.readEntry( "NotesURL" );
+    KUrl url( resourcePath );
+
+    if ( !QFile::exists( url.toLocalFile() ) ) {
+        migrationCompleted( m_agentInstance );
+        return;
+    }
+
+    m_notesResource = new KCal::CalendarLocal( QString() );
+
+    bool success = m_notesResource-&gt;load( url.toLocalFile() );
+    if ( !success ) {
+        migrationFailed( i18n( "Failed to open file for reading: %1" , resourcePath ) );
+        return;
+    }
+
+    OrgKdeAkonadiMaildirSettingsInterface *iface = new OrgKdeAkonadiMaildirSettingsInterface(
+                QLatin1String("org.freedesktop.Akonadi.Resource.") + m_agentInstance.identifier(),
+                QLatin1String("/Settings"), QDBusConnection::sessionBus(), this );
+
+    if ( !iface-&gt;isValid() ) {
+        migrationFailed( i18n( "Failed to obtain D-Bus interface for remote configuration." ), m_agentInstance );
+        delete iface;
+        return;
+    }
+    iface-&gt;setReadOnly( res-&gt;readOnly() );
+
+    QDBusPendingReply&lt;void&gt; response = iface-&gt;setPath( KGlobal::dirs()-&gt;localxdgdatadir() + QLatin1String("/notes/") + KRandom::randomString( 10 ) );
+
+    // make sure the config is saved
+    iface-&gt;writeConfig();
+
+    m_agentInstance.reconfigure();
+
+    ResourceSynchronizationJob *syncJob = new ResourceSynchronizationJob( m_agentInstance, this );
+    connect( syncJob, SIGNAL(result(KJob*)), SLOT(syncDone(KJob*)));
+    syncJob-&gt;start();
+}
+
+void KNotesMigrator::syncDone(KJob *job)
+{
+    Q_UNUSED( job );
+    emit message( Info, i18n( "Instance \"%1\" synchronized" , m_agentInstance.identifier() ) );
+    qDebug()&lt;&lt;" m_agentInstance.identifier() :"&lt;&lt;m_agentInstance.identifier();
+
+    CollectionFetchJob *collectionFetchJob = new CollectionFetchJob( Collection::root(), CollectionFetchJob::FirstLevel, this );
+    connect( collectionFetchJob, SIGNAL(collectionsReceived(Akonadi::Collection::List)), SLOT(rootCollectionsRecieved(Akonadi::Collection::List)) );
+    connect( collectionFetchJob, SIGNAL(result(KJob*)), SLOT(rootFetchFinished(KJob*)) );
+}
+
+void KNotesMigrator::rootFetchFinished( KJob *job )
+{
+    emit message( Info, i18n( "Root fetch finished" ) );
+    if ( job-&gt;error() ) {
+        emit message( Error, i18nc( "A job to fetch akonadi resources failed. %1 is the error string.", "Fetching resources failed: %1" , job-&gt;errorString() ) );
+    }
+}
+
+void KNotesMigrator::rootCollectionsRecieved( const Akonadi::Collection::List &amp;list )
+{
+    emit message( Info, i18n( "Received root collections" ) );
+    foreach ( const Collection &amp;collection, list ) {
+        if ( collection.resource() == m_agentInstance.identifier() ) {
+            m_resourceCollection = collection;
+            startMigration();
+            return;
+        }
+    }
+    emit message( Error, i18n( "Could not find root collection for resource \"%1\"" ,m_agentInstance.identifier() ) );
+}
+
+void KNotesMigrator::startMigration()
+{
+    KCal::Journal::List oldNotesList = m_notesResource-&gt;rawJournals();
+    Akonadi::Item::List newItemsList;
+    KConfig config(QLatin1String("globalnotesettings"));
+    KConfigGroup grp = config.group(QLatin1String("SelectNoteFolder"));
+    grp.writeEntry("DefaultFolder", m_resourceCollection.id());
+    config.sync();
+
+    emit message( Info, i18np( "Starting migration of %1 note", "Starting migration of %1 notes", oldNotesList.size() ) );
+
+    foreach ( KCal::Journal *journal, oldNotesList ) {
+        Item newItem;
+        newItem.setMimeType( QLatin1String("text/x-vnd.akonadi.note") );
+        newItem.setParentCollection( m_resourceCollection );
+        KMime::Message::Ptr note( new KMime::Message() );
+
+        QByteArray encoding( "utf-8" );
+        note-&gt;subject( true )-&gt;fromUnicodeString( journal-&gt;summary(), encoding );
+        note-&gt;mainBodyPart()-&gt;fromUnicodeString( journal-&gt;description() );
+        note-&gt;contentType( true )-&gt;setMimeType( journal-&gt;descriptionIsRich() ? "text/html" : "text/plain" );
+
+        note-&gt;assemble();
+        KNotesMigratorConfig *config = new KNotesMigratorConfig(journal);
+        if (config) {
+
+            if (config-&gt;readOnly()) {
+                newItem.addAttribute( new NoteLockAttribute() );
+            }
+
+            //Position/Editor/Color etc.
+            NoteDisplayAttribute *displayAttribute = new NoteDisplayAttribute();
+            displayAttribute-&gt;setBackgroundColor(config-&gt;noteConfig()-&gt;bgColor());
+            displayAttribute-&gt;setForegroundColor(config-&gt;noteConfig()-&gt;fgColor());
+            displayAttribute-&gt;setSize(QSize(config-&gt;noteConfig()-&gt;width(), config-&gt;noteConfig()-&gt;height()));
+            displayAttribute-&gt;setRememberDesktop(config-&gt;noteConfig()-&gt;rememberDesktop());
+            displayAttribute-&gt;setTabSize(config-&gt;noteConfig()-&gt;tabSize());
+            displayAttribute-&gt;setFont(config-&gt;noteConfig()-&gt;font());
+            displayAttribute-&gt;setTitleFont(config-&gt;noteConfig()-&gt;titleFont());
+            displayAttribute-&gt;setDesktop(config-&gt;noteConfig()-&gt;desktop());
+            displayAttribute-&gt;setIsHidden(config-&gt;noteConfig()-&gt;hideNote());
+            displayAttribute-&gt;setPosition(config-&gt;noteConfig()-&gt;position());
+            displayAttribute-&gt;setShowInTaskbar(config-&gt;noteConfig()-&gt;showInTaskbar());
+            displayAttribute-&gt;setKeepAbove(config-&gt;noteConfig()-&gt;keepAbove());
+            displayAttribute-&gt;setKeepBelow(config-&gt;noteConfig()-&gt;keepBelow());
+            displayAttribute-&gt;setAutoIndent(config-&gt;noteConfig()-&gt;autoIndent());
+            newItem.addAttribute( displayAttribute );
+            delete config;
+        }
+
+        //Alarm.
+        //In note we have an unique alarm.
+        if (!journal-&gt;alarms().isEmpty()) {
+            KCal::Alarm *alarm = journal-&gt;alarms().first();
+            if (alarm-&gt;hasTime()) {
+                NoteAlarmAttribute *alarmAttribute = new NoteAlarmAttribute;
+                alarmAttribute-&gt;setDateTime(alarm-&gt;time());
+                newItem.addAttribute( alarmAttribute );
+            }
+        }
+        newItem.setPayload( note );
+        newItemsList.append( newItem );
+    }
+
+    EntityTreeCreateJob *createJob = new EntityTreeCreateJob( QList&lt;Akonadi::Collection::List&gt;(), newItemsList,this );
+    connect(createJob, SIGNAL(result(KJob*)), SLOT(newResourceFilled(KJob*)));
+}
+
+void KNotesMigrator::newResourceFilled(KJob* job)
+{
+    Q_UNUSED( job );
+    showDefaultCollection();
+}
+
+void KNotesMigrator::showDefaultCollection()
+{
+    ShowFolderNotesAttribute *attribute = m_resourceCollection.attribute&lt;ShowFolderNotesAttribute&gt;( Akonadi::Collection::AddIfMissing );
+    Q_UNUSED(attribute);
+    Akonadi::CollectionModifyJob *job = new Akonadi::CollectionModifyJob( m_resourceCollection );
+    connect(job, SIGNAL(result(KJob*)), SLOT(slotCollectionModify(KJob*)));
+}
+
+void KNotesMigrator::slotCollectionModify(KJob* job)
+{
+    Q_UNUSED( job );
+    migrationCompleted( m_agentInstance );
+}
diff -Nru kdepim-runtime-4.13.0.orig/migration/knotes/knotesmigrator.cpp.rej kdepim-runtime-4.13.0/migration/knotes/knotesmigrator.cpp.rej
--- kdepim-runtime-4.13.0.orig/migration/knotes/knotesmigrator.cpp.rej	1970-01-01 00:00:00.000000000 +0000
+++ kdepim-runtime-4.13.0/migration/knotes/knotesmigrator.cpp.rej	2014-04-28 10:02:38.513018943 +0000
@@ -0,0 +1,19 @@
+--- migration/knotes/knotesmigrator.cpp
++++ migration/knotes/knotesmigrator.cpp
+@@ -290,6 +317,13 @@
+ void KNotesMigrator::slotCollectionModify(KJob* job)
+ {
+     Q_UNUSED( job );
+-    migrationCompleted( m_agentInstance );
+-}
+-
++    migrateNext();
++}
++
++void KNotesMigrator::migrationFailed( const QString&amp; errorMsg, const Akonadi::AgentInstance&amp; instance )
++{
++    Q_UNUSED( instance )
++    emit message( Error, i18n( "Migration failed: %1" ,errorMsg ) );
++}
++
++
diff -Nru kdepim-runtime-4.13.0.orig/migration/knotes/knotesmigrator.h kdepim-runtime-4.13.0/migration/knotes/knotesmigrator.h
--- kdepim-runtime-4.13.0.orig/migration/knotes/knotesmigrator.h	2014-04-08 10:37:03.000000000 +0000
+++ kdepim-runtime-4.13.0/migration/knotes/knotesmigrator.h	2014-04-28 10:02:38.514018932 +0000
@@ -22,8 +22,7 @@
 #ifndef KNOTESMIGRATOR_H
 #define KNOTESMIGRATOR_H
 
-#include "kresmigrator.h"
-
+#include "kmigratorbase.h"
 #include &lt;kcal/resourcecalendar.h&gt;
 #include &lt;kcal/calendarlocal.h&gt;
 #include &lt;akonadi/collection.h&gt;
@@ -37,13 +36,17 @@
 /**
  * Migrate KNotes resources to Akonadi
  */
-class KNotesMigrator : public KResMigrator&lt;KRES::Resource&gt;
+class KNotesMigrator : public KMigratorBase
 {
     Q_OBJECT
 public:
     KNotesMigrator();
     ~KNotesMigrator();
-    bool migrateResource( KRES::Resource *res );
+
+    /* reimp */ void migrate();
+    /* reimp */ void migrateNext();
+protected:
+  /* reimp */ void migrationFailed( const QString&amp; errorMsg, const Akonadi::AgentInstance&amp; instance = Akonadi::AgentInstance() );
 
 private slots:
     void notesResourceCreated( KJob* job );
@@ -58,10 +61,13 @@
     void showDefaultCollection();
 
 private:
+    int mIndexResource;
+    QStringList mUnknownTypeResources;
     Akonadi::Collection m_resourceCollection;
-    AgentInstance m_agentInstance;
+    Akonadi::AgentInstance m_agentInstance;
 
     KCal::CalendarLocal *m_notesResource;
+    KConfig *mConfig;
 };
 
 #endif
diff -Nru kdepim-runtime-4.13.0.orig/migration/knotes/main.cpp kdepim-runtime-4.13.0/migration/knotes/main.cpp
--- kdepim-runtime-4.13.0.orig/migration/knotes/main.cpp	2014-04-08 10:37:03.000000000 +0000
+++ kdepim-runtime-4.13.0/migration/knotes/main.cpp	2014-04-28 10:02:38.514018932 +0000
@@ -64,8 +64,6 @@
     args-&gt;clear();
 
     KNotesMigrator *migrator = new KNotesMigrator;
-    migrator-&gt;setBridgingOnly(false);
-    migrator-&gt;setOmitClientBridge(false);
     if ( infoDialog &amp;&amp; migrator ) {
         infoDialog-&gt;migratorAdded();
         QObject::connect( migrator, SIGNAL(message(KMigratorBase::MessageType,QString)),
</pre></body></html>