[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdepim/akonadi/libakonadi
From:       Volker Krause <vkrause () kde ! org>
Date:       2007-01-12 15:17:29
Message-ID: 1168615049.741437.26899.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 622650 by vkrause:

ItemModel now keeps itself up-to-date


 M  +0 -3      CMakeLists.txt  
 M  +42 -78    itemmodel.cpp  
 M  +4 -9      itemmodel.h  
 D             itemquery.cpp  
 D             itemquery.h  
 M  +0 -1      messagemodel.cpp  
 D             messagequery.cpp  
 D             messagequery.h  


--- trunk/KDE/kdepim/akonadi/libakonadi/CMakeLists.txt #622649:622650
@@ -36,7 +36,6 @@
 	itemdeletejob.cpp
 	itemfetchjob.cpp
 	itemstorejob.cpp
-	itemquery.cpp
 	itemmodel.cpp
 	job.cpp
 	jobqueue.cpp
@@ -45,7 +44,6 @@
 	message.cpp
 	messagefetchjob.cpp
 	messagemodel.cpp
-	messagequery.cpp
 	monitor.cpp
 	profilemanager.cpp
 	profilemodel.cpp
@@ -93,7 +91,6 @@
 	message.h
 	messagefetchjob.h
 	messagemodel.h
-	messagequery.h
 	monitor.h
 	profilemanager.h
 	transactionjobs.h
--- trunk/KDE/kdepim/akonadi/libakonadi/itemmodel.cpp #622649:622650
@@ -1,5 +1,5 @@
 /*
-    Copyright (c) 2006 Volker Krause <volker.krause@rwth-aachen.de>
+    Copyright (c) 2006 - 2007 Volker Krause <volker.krause@rwth-aachen.de>
 
     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
@@ -17,7 +17,6 @@
     02110-1301, USA.
 */
 
-#include "itemquery.h"
 #include "itemfetchjob.h"
 #include "itemmodel.h"
 #include "monitor.h"
@@ -38,7 +37,7 @@
     QString path;
     ItemFetchJob *listingJob;
     Monitor *monitor;
-    QList<ItemQuery*> fetchJobs, updateJobs;
+    QList<ItemFetchJob*> fetchJobs;
 };
 
 Akonadi::ItemModel::ItemModel( QObject *parent ) :
@@ -55,7 +54,6 @@
   delete d->monitor;
   qDeleteAll( d->items );
   qDeleteAll( d->fetchJobs );
-  qDeleteAll( d->updateJobs );
   delete d;
 }
 
@@ -122,10 +120,8 @@
   // stop all running jobs
   delete d->monitor;
   d->monitor = 0;
-  qDeleteAll( d->updateJobs );
-  d->updateJobs.clear();
   qDeleteAll( d->fetchJobs );
-  d->updateJobs.clear();
+  d->fetchJobs.clear();
   delete d->listingJob;
   // start listing job
   d->listingJob = createFetchJob( path, this );
@@ -142,104 +138,72 @@
   } else {
     d->items = d->listingJob->items();
     reset();
-    kDebug() << k_funcinfo << "################################" << d->items.count() << endl;
   }
   d->listingJob->deleteLater();
   d->listingJob = 0;
 
-  // start monitor job
-  // TODO error handling
-  /*d->monitor = new Monitor( "folder=" + d->path );
-  connect( d->monitor, SIGNAL( changed( const DataReference::List& ) ),
-           SLOT( messagesChanged( const DataReference::List& ) ) );
-  connect( d->monitor, SIGNAL( added( const DataReference::List& ) ),
-           SLOT( messagesAdded( const DataReference::List& ) ) );
-  connect( d->monitor, SIGNAL( removed( const DataReference::List& ) ),
-           SLOT( messagesRemoved( const DataReference::List& ) ) );*/
-//   d->monitor->start();
+  // start monitor
+  d->monitor = new Monitor( this );
+  d->monitor->monitorCollection( d->path, false );
+  connect( d->monitor, SIGNAL(itemChanged(Akonadi::DataReference)),
+           SLOT(itemChanged(Akonadi::DataReference)) );
+  connect( d->monitor, SIGNAL(itemAdded(Akonadi::DataReference)),
+           SLOT(itemAdded(Akonadi::DataReference)) );
+  connect( d->monitor, SIGNAL(itemRemoved(Akonadi::DataReference)),
+           SLOT(itemRemoved(Akonadi::DataReference)) );
 }
 
 void Akonadi::ItemModel::fetchingNewDone( Akonadi::Job * job )
 {
-  Q_ASSERT( d->fetchJobs.contains( static_cast<ItemQuery*>( job ) ) );
+  Q_ASSERT( d->fetchJobs.contains( static_cast<ItemFetchJob*>( job ) ) );
   if ( job->error() ) {
     // TODO
     kWarning() << k_funcinfo << "Fetching new items failed!" << endl;
   } else {
-    Item::List list = static_cast<ItemQuery*>( job )->items();
-    beginInsertRows( QModelIndex(), d->items.size(), d->items.size() + list.size() );
-    d->items += list;
-    endInsertRows();
+    Item::List list = static_cast<ItemFetchJob*>( job )->items();
+    if ( !list.isEmpty() ) {
+      beginInsertRows( QModelIndex(), d->items.size(), d->items.size() + list.size() );
+      d->items += list;
+      endInsertRows();
+    } else
+      kWarning() << k_funcinfo << "Got unexpected empty fetch response!" << endl;
   }
-  d->fetchJobs.removeAll( static_cast<ItemQuery*>( job ) );
+  d->fetchJobs.removeAll( static_cast<ItemFetchJob*>( job ) );
   job->deleteLater();
 }
 
-void Akonadi::ItemModel::fetchingUpdatesDone( Akonadi::Job * job )
+void ItemModel::itemChanged( const DataReference &reference )
 {
-  Q_ASSERT( d->updateJobs.contains( static_cast<ItemQuery*>( job ) ) );
-  if ( job->error() ) {
-    // TODO
-    kWarning() << k_funcinfo << "Updating changed items failed!" << endl;
-  } else {
-    Item::List list = static_cast<ItemQuery*>( job )->items();
-    foreach ( Item* itm, list ) {
-      // ### *slow*
-      for ( int i = 0; i < d->items.size(); ++i ) {
-        if ( d->items.at( i )->reference() == itm->reference() ) {
-          delete d->items.at( i );
-          d->items.replace( i, itm );
-          emit dataChanged( index( i, 0 ), index( i, columnCount() ) );
-          break;
-        }
-      }
-    }
-  }
-  d->updateJobs.removeAll( static_cast<ItemQuery*>( job ) );
-  job->deleteLater();
+  itemRemoved( reference );
+  itemAdded( reference );
 }
 
-void Akonadi::ItemModel::itemsChanged( const DataReference::List & references )
+void ItemModel::itemAdded( const DataReference &reference )
 {
-  // TODO: build query based on the reference list
-  Q_UNUSED( references );
-  QString query;
-  ItemQuery* job = new ItemQuery( query );
-  connect( job, SIGNAL( done( Akonadi::Job* ) ), SLOT( fetchingUpdatesDone( Akonadi::Job* job ) ) );
+  // TODO: make sure we don't fetch the complete data here!
+  ItemFetchJob *job = new ItemFetchJob( reference, this );
+  connect( job, SIGNAL(done(Akonadi::Job*)), SLOT(fetchingNewDone(Akonadi::Job*)) );
   job->start();
-  d->updateJobs.append( job );
-}
-
-void Akonadi::ItemModel::itemsAdded( const DataReference::List & references )
-{
-  // TODO: build query based on the reference list
-  Q_UNUSED( references );
-  QString query;
-  ItemQuery* job = new ItemQuery( query );
-  connect( job, SIGNAL( done( Akonadi::Job* ) ), SLOT( fetchingNewDone( Akonadi::Job* job ) ) );
-  job->start();
   d->fetchJobs.append( job );
 }
 
-void Akonadi::ItemModel::itemsRemoved( const DataReference::List & references )
+void ItemModel::itemRemoved( const DataReference &reference )
 {
-  foreach ( DataReference ref, references ) {
-    // ### *slow*
-    int index = -1;
-    for ( int i = 0; i < d->items.size(); ++i ) {
-      if ( d->items.at( i )->reference() == ref ) {
-        index = i;
-        break;
-      }
+  // ### *slow*
+  int index = -1;
+  for ( int i = 0; i < d->items.size(); ++i ) {
+    if ( d->items.at( i )->reference() == reference ) {
+      index = i;
+      break;
     }
-    if ( index < 0 )
-      continue;
-    beginRemoveRows( QModelIndex(), index, index );
-    Item* itm = d->items.at( index );
-    d->items.removeAt( index );
-    delete itm;
-    endRemoveRows();
   }
+  if ( index < 0 )
+    return;
+  beginRemoveRows( QModelIndex(), index, index );
+  Item* itm = d->items.at( index );
+  d->items.removeAt( index );
+  delete itm;
+  endRemoveRows();
 }
 
 DataReference Akonadi::ItemModel::referenceForIndex( const QModelIndex & index ) const
--- trunk/KDE/kdepim/akonadi/libakonadi/itemmodel.h #622649:622650
@@ -1,5 +1,5 @@
 /*
-    Copyright (c) 2006 Volker Krause <volker.krause@rwth-aachen.de>
+    Copyright (c) 2006 - 2007 Volker Krause <volker.krause@rwth-aachen.de>
 
     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
@@ -118,24 +118,19 @@
     void fetchingNewDone( Akonadi::Job* job );
 
     /**
-      Connected to message queries that handle changed messages.
-    */
-    void fetchingUpdatesDone( Akonadi::Job* job );
-
-    /**
       Connected to the monitor job.
     */
-    void itemsChanged( const DataReference::List &references );
+    void itemChanged( const Akonadi::DataReference &reference );
 
     /**
       Connected to the monitor job.
     */
-    void itemsAdded( const DataReference::List &references );
+    void itemAdded( const Akonadi::DataReference &reference );
 
     /**
       Connected to the monitor job.
     */
-    void itemsRemoved( const DataReference::List &references );
+    void itemRemoved( const Akonadi::DataReference &reference );
 
   private:
     class Private;
--- trunk/KDE/kdepim/akonadi/libakonadi/messagemodel.cpp #622649:622650
@@ -20,7 +20,6 @@
 #include "message.h"
 #include "messagefetchjob.h"
 #include "messagemodel.h"
-#include "messagequery.h"
 #include "monitor.h"
 
 #include <kmime/kmime_message.h>
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic