[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