[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