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

List:       kde-commits
Subject:    playground/pim/krss/resource
From:       Dmitry Ivanov <vonami () gmail ! com>
Date:       2008-07-05 15:50:17
Message-ID: 1215273017.349354.13463.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 828382 by divanov:

Start wrapping async operations inside the resource in KJobs in order to:
 - be on the safe side when processing D-Bus calls
 - improve code readability (now it is just a mess of signal/slot connections)


 M  +1 -0      CMakeLists.txt  
 M  +26 -157   rssresource.cpp  
 M  +2 -4      rssresource.h  
 A             syncfeedjob.cpp   [License: GPL (v2+)]
 A             syncfeedjob.h   [License: GPL (v2+)]


--- trunk/playground/pim/krss/resource/CMakeLists.txt #828381:828382
@@ -8,6 +8,7 @@
     ../libkrss/feedpropertiescollectionattribute.cpp
     rssitemsync.cpp
     ../libkrss/flagsmodifyjob.cpp
+    syncfeedjob.cpp
 )
 
 qt4_add_dbus_adaptor(rssresource_SRCS ../libkrss/org.kde.krss.xml rssresource.h \
                RssResource )
--- trunk/playground/pim/krss/resource/rssresource.cpp #828381:828382
@@ -17,15 +17,11 @@
 
 #include "krssadaptor.h"
 #include "rssresource.h"
-#include "rssitemsync.h"
 #include "../libkrss/tagscollectionattribute.h"
 #include "../libkrss/subscriptionlabelscollectionattribute.h"
 #include "../libkrss/feedpropertiescollectionattribute.h"
-#include "../libkrss/flagsmodifyjob.h"
+#include "syncfeedjob.h"
 
-#include <kfeed/person.h>
-#include <kfeed/enclosure.h>
-#include <kfeed/category.h>
 #include <akonadi/collectionfetchjob.h>
 #include <akonadi/collectioncreatejob.h>
 #include <akonadi/collectionmodifyjob.h>
@@ -35,7 +31,6 @@
 
 #include <KDebug>
 #include <KFileDialog>
-#include <KDateTime>
 #include <KLocale>
 #include <KRandom>
 
@@ -44,91 +39,6 @@
 using namespace Akonadi;
 
 // helper functions
-
-// from akregator/src/utils.cpp
-static inline int calcHash( const QString &str )
-{
-        const QByteArray array = str.toAscii();
-        return qChecksum( array.constData(), array.size() );
-}
-
-static inline KFeed::Item convertToKFeedItem( const Syndication::ItemPtr &syndItem )
-{
-        KFeed::Item kfeedItem;
-
-        kfeedItem.setStatus( KFeed::New );
-        kfeedItem.setIdIsHash( syndItem->id().startsWith( "hash:" ) );
-        //kfeedItem.setSourceFeedId(currentCollection().remoteId().toInt()); // \
                kfeed supports only integer ids
-        kfeedItem.setTitle( syndItem->title() );
-        kfeedItem.setLink( syndItem->link() );
-        kfeedItem.setDescription( syndItem->description() );
-        kfeedItem.setContent( syndItem->content() );
-        KDateTime dt;
-        if ( syndItem->datePublished() > 0 ) {
-                dt.setTime_t( syndItem->datePublished() );
-                kfeedItem.setDatePublished( dt );
-        }
-        else {
-                kfeedItem.setDatePublished( KDateTime::currentLocalDateTime() );
-        }
-        dt.setTime_t( syndItem->dateUpdated() );
-        kfeedItem.setDateUpdated( dt );
-        kfeedItem.setId( syndItem->id() );
-        kfeedItem.setLanguage( syndItem->language() );
-        kfeedItem.setCommentsCount( syndItem->commentsCount() );
-        kfeedItem.setCommentsLink( syndItem->commentsLink() );
-        kfeedItem.setCommentsFeed( syndItem->commentsFeed() );
-        kfeedItem.setCommentPostUri( syndItem->commentPostUri() );
-
-        // Authors
-        QString authors;  // for hash
-        QList<KFeed::Person> kfeedPersons;
-        Q_FOREACH( const Syndication::PersonPtr &pers, syndItem->authors() ) {
-                if ( !pers->isNull() ) {
-                        KFeed::Person kfeedPerson;
-                        kfeedPerson.setName( pers->name() );
-                        kfeedPerson.setUri( pers->uri() );
-                        kfeedPerson.setEmail( pers->email() );
-                        kfeedPersons << kfeedPerson;
-                }
-        }
-        kfeedItem.setAuthors( kfeedPersons );
-
-        // Enclosures
-        QList<KFeed::Enclosure> kfeedEnclosures;
-        Q_FOREACH( const Syndication::EnclosurePtr &encl, syndItem->enclosures() ) {
-                if ( !encl->isNull() ) {
-                        KFeed::Enclosure kfeedEnclosure;
-                        kfeedEnclosure.setUrl( encl->url() );
-                        kfeedEnclosure.setTitle(encl->title());
-                        kfeedEnclosure.setType( encl->type() );
-                        kfeedEnclosure.setLength( encl->length() );
-                        kfeedEnclosure.setDuration( encl->duration() );
-                        kfeedEnclosures << kfeedEnclosure;
-                }
-        }
-        kfeedItem.setEnclosures( kfeedEnclosures );
-
-        // Categories
-        QList<KFeed::Category> kfeedCategories;
-        Q_FOREACH( const Syndication::CategoryPtr &cat, syndItem->categories() ) {
-                if ( !cat->isNull() ) {
-                        KFeed::Category kfeedCategory;
-                        kfeedCategory.setTerm( cat->term() );
-                        kfeedCategory.setScheme( cat->scheme() );
-                        kfeedCategory.setLabel( cat->label() );
-                        kfeedCategories << kfeedCategory;
-                }
-        }
-        kfeedItem.setCategories( kfeedCategories );
-
-        // TODO: custom properties
-
-        kfeedItem.setHash( calcHash( syndItem->title() + syndItem->description() + \
                syndItem->content() + syndItem->link() +
-                                     authors ) );
-        return kfeedItem;
-}
-
 static QStringRef attributeValue( const QXmlStreamAttributes &attributes, const \
QString &name )  {
         Q_FOREACH( const QXmlStreamAttribute &attr, attributes ) {
@@ -186,7 +96,10 @@
                 return;
         }
 
-        synchronizeCollection( m_collections[ remoteId ].id() );
+        kDebug() << "Request for:" << remoteId;
+        SyncFeedJob *job = new SyncFeedJob( m_collections[ remoteId ] );
+        connect( job, SIGNAL( result( KJob* ) ), this, SLOT( \
slotParallelFeedSyncDone( KJob* ) ) ); +        job->start();
 }
 
 bool RssResource::removeFeed( const QString &remoteId )
@@ -370,10 +283,9 @@
         kDebug() << "Retrieving items for" << col.name();
 
         if ( col.hasAttribute( "FeedProperties" ) ) {
-                // clear the 'New' flag on the previously fetched items 
-                FlagsModifyJob *job = new FlagsModifyJob( col, this );
-                job->clearFlags( Akonadi::Item::Flags() << "\\Recent" );
-                connect( job, SIGNAL( result( KJob* ) ), this, SLOT( \
slotClearNewDone( KJob* ) ) ); +                SyncFeedJob *job = new SyncFeedJob( \
col ); +                connect( job, SIGNAL( result( KJob* ) ), this, SLOT( \
slotBlockedFeedSyncDone( KJob* ) ) ); +                job->start();
         }
         else {
                 kDebug() << "Collection doesn't have \'FeedProperties\' attribute \
set"; @@ -381,6 +293,24 @@
         }
 }
 
+void RssResource::slotParallelFeedSyncDone( KJob *job )
+{
+        if ( job->error() ) {
+                kWarning() << "Failed to sync the feed";
+                kWarning() << job->errorString();
+        }
+}
+
+void RssResource::slotBlockedFeedSyncDone( KJob *job )
+{
+        if ( job->error() ) {
+                kWarning() << "Failed to sync the feed";
+                kWarning() << job->errorString();
+        }
+
+        itemsRetrievalDone();
+}
+
 void RssResource::listCollections()
 {
         Akonadi::CollectionFetchJob *job = new Akonadi::CollectionFetchJob( \
Akonadi::Collection::root(), @@ -416,17 +346,6 @@
         }
 }
 
-void RssResource::slotClearNewDone( KJob *job )
-{
-        kDebug() << "Clearing 'New' items done";
-        if ( job->error() ) {
-                kWarning() << "Clearing 'New' failed";
-                kWarning() << job->errorString();
-        }
-
-        fetchFeedContent( \
                currentCollection().attribute<FeedPropertiesCollectionAttribute>()->xmlUrl() \
                );
-}
-
 void RssResource::slotRootCollectionCreated( KJob *job )
 {
         kDebug() << "Root collection creation done";
@@ -550,27 +469,6 @@
         QDBusConnection::sessionBus().send( m_replyMessage );
 }
 
-void RssResource::slotItemSyncDone( KJob *job )
-{
-        kDebug() << "ItemSync done";
-        if ( job->error() ) {
-                kWarning() << "Failed to sync collection";
-                kWarning() << job->errorString();
-        }
-
-        itemsRetrievalDone();
-}
-
-void RssResource::fetchFeedContent( const QString &url )
-{
-        Syndication::Loader *loader = Syndication::Loader::create( this, SLOT( \
                feedContentFetched( Syndication::Loader*,
-                                                                  \
                Syndication::FeedPtr,
-                                                                  \
                Syndication::ErrorCode ) ) );
-
-        kDebug() << "Url:" << url;
-        loader->loadFrom( url );
-}
-
 void RssResource::fetchFeedProperties( const QString &url )
 {
         Syndication::Loader *loader = Syndication::Loader::create( this, SLOT( \
feedPropertiesFetched( Syndication::Loader*, @@ -611,35 +509,6 @@
                  this, SLOT( slotCollectionCreated( KJob* ) ) );
 }
 
-void RssResource::feedContentFetched( Syndication::Loader *loader, \
                Syndication::FeedPtr feed, Syndication::ErrorCode status )
-{
-        Q_UNUSED( loader )
-
-        kDebug() << "Status:" << status;
-
-        if ( status != Syndication::Success ) {
-                kDebug() << "Failed to load feed from"
-                        << \
                currentCollection().attribute<FeedPropertiesCollectionAttribute>()->xmlUrl();
                
-                itemsRetrievedIncremental( Akonadi::Item::List(), \
                Akonadi::Item::List() );
-                return;
-        }
-
-        Akonadi::Item::List items;
-        Q_FOREACH( const Syndication::ItemPtr &it, feed->items() ) {
-                Item item;
-                item.setRemoteId( it->id() );
-                item.setMimeType( "application/rss+xml" );
-                item.setPayload<KFeed::Item>( convertToKFeedItem( it ) );
-                items.append( item );
-        }
-
-        ItemSync *syncer = new RssItemSync( currentCollection() );
-        connect( syncer, SIGNAL( percent( KJob*, unsigned long ) ), this, SLOT( \
                slotPercent( KJob*, unsigned long ) ) );
-        connect( syncer, SIGNAL( result( KJob* ) ), this, SLOT( slotItemSyncDone( \
                KJob* ) ) );
-
-        syncer->setIncrementalSyncItems( items, Akonadi::Item::List() );
-}
-
 void RssResource::importOpml( const QString &path, const QString &defaultTag )
 {
         // load the opml to m_pendingCollections
--- trunk/playground/pim/krss/resource/rssresource.h #828381:828382
@@ -66,21 +66,19 @@
 private Q_SLOTS:
 
         void slotListingDone( KJob *job );
-        void slotClearNewDone( KJob *job );
         void slotRootCollectionCreated( KJob *job );
         void slotCollectionImported( KJob *job );
         void slotCollectionCreated( KJob *job );
         void slotCollectionDeleted( KJob *job );
         void slotSubscriptionDone( KJob *job );
         void slotTaggingDone( KJob *job );
-        void slotItemSyncDone( KJob *job );
+        void blockedFeedSyncDone( KJob *job );
+        void parallelFeedSyncDone( KJob *job );
         void feedPropertiesFetched( Syndication::Loader *loader, \
                Syndication::FeedPtr feed, Syndication::ErrorCode status );
-        void feedContentFetched( Syndication::Loader *loader, Syndication::FeedPtr \
feed, Syndication::ErrorCode status );  
 private:
 
         void listCollections();
-        void fetchFeedContent( const QString &url );
         void fetchFeedProperties( const QString &url );
 
         void loadOpml( const QString &path, const QString &defaultTag );


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

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