[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: branches/work/akonadi-ports
From: Sebastian Sauer <mail () dipe ! org>
Date: 2009-11-27 16:35:10
Message-ID: 1259339710.536515.5159.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 1055231 by sebsauer:
don't ignore dbus errors too. here I got an empty defaultId, the resource was not \
configured and there was no error ondication. Beside empty id's someone can also \
change the id to be an invalid dbus name like e.g. 'myid.'. So, prevent that too.
M +119 -21 kdepim/akonadi/agents/invitations/invitationsagent.cpp
M +6 -8 kdepim/akonadi/agents/invitations/invitationsagent.h
M +10 -1 kdepimlibs/akonadi/specialcollectionshelperjobs.cpp
--- branches/work/akonadi-ports/kdepim/akonadi/agents/invitations/invitationsagent.cpp \
#1055230:1055231 @@ -45,6 +45,8 @@
#include <Akonadi/AgentInstanceCreateJob>
#include <akonadi/resourcesynchronizationjob.h>
#include <akonadi/kcal/incidenceattribute.h>
+#include <akonadi/specialcollections.h>
+#include <akonadi/specialcollectionsrequestjob.h>
#include <QDBusInterface>
#include <QDBusReply>
@@ -55,6 +57,8 @@
#include <KJob>
#include <KLocale>
#include <KStandardDirs>
+#include <KConfig>
+#include <KConfigSkeleton>
#include <kpimidentities/identitymanager.h>
@@ -62,6 +66,78 @@
using namespace Akonadi;
+class InvitationsCollectionRequestJob : public SpecialCollectionsRequestJob
+{
+ public:
+ InvitationsCollectionRequestJob( SpecialCollections* collection, \
InvitationsAgent *agent ) : SpecialCollectionsRequestJob( collection, agent ) { + \
setDefaultResourceType( QLatin1String( "akonadi_ical_resource" ) ); +
+ QVariantMap options;
+ options.insert( QLatin1String( "Path" ), KGlobal::dirs()->localxdgdatadir() + \
"akonadi_invitations" ); + options.insert( QLatin1String( "Name" ), \
i18n("Invitations") ); + setDefaultResourceOptions( options );
+
+ QMap<QByteArray, QString> displayNameMap;
+ displayNameMap.insert( "invitations", i18n("Invitations") );
+ setTypes( displayNameMap.keys() );
+ setNameForTypeMap( displayNameMap );
+
+ QMap<QByteArray, QString> iconNameMap;
+ iconNameMap.insert( "invitations", QLatin1String( "folder" ) );
+ setIconForTypeMap( iconNameMap );
+ }
+ virtual ~InvitationsCollectionRequestJob() {}
+};
+
+class InvitationsCollection : public SpecialCollections
+{
+ public:
+
+ class Settings : public KCoreConfigSkeleton
+ {
+ public:
+ Settings() : KCoreConfigSkeleton() {
+ setCurrentGroup("Invitations");
+ addItemLongLong("DefaultResourceId", m_id, -1);
+ }
+ virtual ~Settings() {}
+ private:
+ qlonglong m_id;
+ };
+
+ InvitationsCollection( InvitationsAgent *agent ) : Akonadi::SpecialCollections( \
new Settings ), m_agent( agent ), sInvitationsType( "invitations" ) {} + virtual \
~InvitationsCollection() {} + /*
+ bool registerCollection( const Collection &collection ) {
+ return SpecialCollections::registerCollection( sInvitationsType, collection );
+ }
+ */
+ void clear() {
+ m_collection = Collection();
+ }
+ bool hasDefaultCollection() const {
+ return SpecialCollections::hasDefaultCollection( sInvitationsType );
+ }
+ Collection defaultCollection() const {
+ if( ! m_collection.isValid() )
+ m_collection = SpecialCollections::defaultCollection( sInvitationsType );
+ return m_collection;
+ }
+ void registerDefaultCollection() {
+ Q_ASSERT( m_collection.isValid() );
+ registerCollection( sInvitationsType, m_collection );
+ }
+ SpecialCollectionsRequestJob* reguestJob() const {
+ InvitationsCollectionRequestJob *j = new InvitationsCollectionRequestJob( \
const_cast<InvitationsCollection*>(this), m_agent ); + \
j->requestDefaultCollection( sInvitationsType ); + return j;
+ }
+ private:
+ InvitationsAgent *m_agent;
+ const QByteArray sInvitationsType;
+ mutable Collection m_collection;
+};
+
InvitationsAgentItem::InvitationsAgentItem(InvitationsAgent *a, const Item \
&originalItem) : QObject(a), a(a), originalItem(originalItem)
{
@@ -74,10 +150,12 @@
void InvitationsAgentItem::add(const Item &newItem)
{
kDebug();
+ Collection c = a->collection();
+ Q_ASSERT( c.isValid() );
- ItemCreateJob *j = new ItemCreateJob( newItem, a->invitations(), this );
+ ItemCreateJob *j = new ItemCreateJob( newItem, c, this );
+ jobs << j;
connect( j, SIGNAL( result( KJob* ) ), this, SLOT( createItemResult( KJob* ) ) );
- jobs << j;
j->start();
}
@@ -128,11 +206,21 @@
}
InvitationsAgent::InvitationsAgent( const QString &id )
- : AgentBase( id ), AgentBase::ObserverV2(), newAgentCreated( false )
+ : AgentBase( id ), AgentBase::ObserverV2()
+ , m_InvitationsCollection( new InvitationsCollection(this) )
{
kDebug();
KGlobal::locale()->insertCatalog( "akonadi_invitations_agent" );
+
changeRecorder()->setChangeRecordingEnabled( false ); // behave like Monitor
+ changeRecorder()->itemFetchScope().fetchFullPayload();
+ //changeRecorder()->setMimeTypeMonitored( KCalMimeTypeVisitor::eventMimeType() );
+ //changeRecorder()->setMimeTypeMonitored( KCalMimeTypeVisitor::todoMimeType() );
+ //changeRecorder()->setMimeTypeMonitored( KCalMimeTypeVisitor::journalMimeType() \
); + //changeRecorder()->setMimeTypeMonitored( \
KCalMimeTypeVisitor::freeBusyMimeType() ); + \
//changeRecorder()->setMimeTypeMonitored( "text/calendar", true ); + \
changeRecorder()->setMimeTypeMonitored( "message/rfc822", true ); + \
//changeRecorder()->setCollectionMonitored( Collection::root(), true );
connect( this, SIGNAL(reloadConfiguration()), this, SLOT(initStart()) );
QTimer::singleShot( 0, this, SLOT(initStart()) );
@@ -140,11 +228,23 @@
InvitationsAgent::~InvitationsAgent()
{
+ delete m_InvitationsCollection;
}
void InvitationsAgent::initStart()
{
kDebug();
+
+ m_InvitationsCollection->clear();
+ if( m_InvitationsCollection->hasDefaultCollection() ) {
+ initDone();
+ } else {
+ SpecialCollectionsRequestJob *j = m_InvitationsCollection->reguestJob();
+ connect( j, SIGNAL( result(KJob*) ), this, SLOT( initDone(KJob*) ) );
+ j->start();
+ }
+
+ /*
KConfig config( "akonadi_invitations_agent" );
KConfigGroup group = config.group( "General" );
m_resourceId = group.readEntry( "DefaultCalendarAgent", "default_ical_resource" );
@@ -160,31 +260,27 @@
AgentInstanceCreateJob *job = new AgentInstanceCreateJob( type, this );
connect( job, SIGNAL( result( KJob * ) ), this, SLOT( createAgentResult( KJob * \
) ) ); job->start();
- }
+ }
+ */
}
-void InvitationsAgent::initDone()
+void InvitationsAgent::initDone( KJob *job )
{
- kDebug();
- changeRecorder()->itemFetchScope().fetchFullPayload();
- //changeRecorder()->setMimeTypeMonitored( KCalMimeTypeVisitor::eventMimeType() );
- //changeRecorder()->setMimeTypeMonitored( KCalMimeTypeVisitor::todoMimeType() );
- //changeRecorder()->setMimeTypeMonitored( KCalMimeTypeVisitor::journalMimeType() \
);
- //changeRecorder()->setMimeTypeMonitored( KCalMimeTypeVisitor::freeBusyMimeType() \
);
- //changeRecorder()->setMimeTypeMonitored( "text/calendar", true );
- changeRecorder()->setMimeTypeMonitored( "message/rfc822", true );
- //changeRecorder()->setCollectionMonitored( Collection::root(), true );
+ if( job ) {
+ if( job->error() ) {
+ kWarning() << "Failed to request default collection:" << job->errorText();
+ return;
+ }
+ m_InvitationsCollection->registerDefaultCollection();
+ }
- KConfig config( "akonadi_invitations_agent" );
- KConfigGroup group = config.group( "General" );
- group.writeEntry( "DefaultCalendarCollection", m_invitations.id() );
-
+ Q_ASSERT( m_InvitationsCollection->defaultCollection().isValid() );
emit status( AgentBase::Idle, i18n("Ready to dispatch invitations") );
}
-Collection& InvitationsAgent::invitations()
+Collection InvitationsAgent::collection()
{
- return m_invitations;
+ return m_InvitationsCollection->defaultCollection();
}
#if 0
@@ -209,6 +305,7 @@
initStart(); //reload
}
+#if 0
void InvitationsAgent::createAgentResult( KJob *job )
{
kDebug();
@@ -342,6 +439,7 @@
m_invitations = j->collection();
initDone();
}
+#endif
Item InvitationsAgent::handleContent( const QString &vcal, KCal::Calendar* calendar, \
const Item &item ) {
@@ -373,7 +471,7 @@
{
Q_UNUSED( collection );
- if( ! m_invitations.isValid() ) {
+ if( ! m_InvitationsCollection->defaultCollection().isValid() ) {
return;
}
--- branches/work/akonadi-ports/kdepim/akonadi/agents/invitations/invitationsagent.h \
#1055230:1055231 @@ -36,6 +36,7 @@
}
class InvitationsAgent;
+class InvitationsCollection;
class InvitationsAgentItem : public QObject
{
@@ -64,19 +65,16 @@
explicit InvitationsAgent( const QString &id );
virtual ~InvitationsAgent();
- Akonadi::Collection& invitations();
+ Akonadi::Collection collection();
public Q_SLOTS:
virtual void configure( WId windowId );
private Q_SLOTS:
void initStart();
- void createAgentResult( KJob *job = 0 );
- void resourceSyncResult( KJob *job = 0 );
- void collectionFetchResult( KJob *job );
- void collectionCreateResult( KJob *job );
+ void initDone( KJob *job = 0 );
+
private:
- void initDone();
Akonadi::Item handleContent( const QString &vcal, KCal::Calendar* calendar, \
const Akonadi::Item &item );
virtual void itemAdded( const Akonadi::Item &item, const Akonadi::Collection \
&collection ); @@ -97,8 +95,8 @@
private:
QString m_resourceId;
- bool newAgentCreated;
- Akonadi::Collection m_invitations;
+ InvitationsCollection *m_InvitationsCollection;
+ Akonadi::Collection m_collection;
};
#endif // MAILDISPATCHERAGENT_H
--- branches/work/akonadi-ports/kdepimlibs/akonadi/specialcollectionshelperjobs.cpp \
#1055230:1055231 @@ -283,13 +283,22 @@
kDebug() << "Created maildir resource with id" << defaultResourceId( mSettings \
); }
+ const QString defaultId = defaultResourceId( mSettings );
+
// Configure the resource.
{
agent.setName( mDefaultResourceOptions.value( QLatin1String( "Name" ) \
).toString() );
- QDBusInterface conf( QString::fromLatin1( "org.freedesktop.Akonadi.Resource." ) \
+ defaultResourceId( mSettings ), + QDBusInterface conf( QString::fromLatin1( \
"org.freedesktop.Akonadi.Resource." ) + defaultId, QString::fromLatin1( "/Settings" \
), QString() );
+ if( ! conf.isValid() ) {
+ q->setError( -1 );
+ q->setErrorText( i18n("Invalid resource identifier '%1'", defaultId) );
+ q->emitResult();
+ return;
+ }
+
QMapIterator<QString, QVariant> it( mDefaultResourceOptions );
while ( it.hasNext() ) {
it.next();
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic