From 5abbdb459be7870848ef16691174e91c68958304 Mon Sep 17 00:00:00 2001
From: tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>
Date: Sat, 28 Aug 2010 21:36:58 +0000
Subject: * Fixed CalDAV resource error messages and potential crash * Added
 write support to events with RECURRENCE-ID property   Only remaining
 potential issue is modification of parent series and
 association/update/delete of child event RECURRENCE-ID fields

git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdepim@1169262 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
---
 kresources/caldav/reader.cpp | 17 +++++-----
 kresources/caldav/writer.cpp | 80 +++++++++++++++++++++++---------------------
 libkcal/resourcecached.cpp   | 22 +++++++++---
 3 files changed, 67 insertions(+), 52 deletions(-)

diff --git a/kresources/caldav/reader.cpp b/kresources/caldav/reader.cpp
index a33c4d93..9e167e7d 100644
--- a/kresources/caldav/reader.cpp
+++ b/kresources/caldav/reader.cpp
@@ -40,12 +40,14 @@ int CalDavReader::runJob(runtime_info* RT) {
     response* result = caldav_get_response();
     CALDAV_RESPONSE res = OK;
 
-    if (mGetAll) {
-        kdDebug() << "getting all objects";
-        res = caldav_getall_object(result, std::string(url().ascii()).c_str(), RT);
-    } else {
-        kdDebug() << "getting object from the specified time range";
-        res = caldav_get_object(result, mTimeStart.toTime_t(), mTimeEnd.toTime_t(), std::string(url().ascii()).c_str(), RT);
+    if ((OK == res) && (url() != "")) {
+      if (mGetAll) {
+          kdDebug() << "getting all objects";
+          res = caldav_getall_object(result, std::string(url().ascii()).c_str(), RT);
+      } else {
+          kdDebug() << "getting object from the specified time range";
+          res = caldav_get_object(result, mTimeStart.toTime_t(), mTimeEnd.toTime_t(), std::string(url().ascii()).c_str(), RT);
+      }
     }
 
     if (OK == res) {
@@ -64,8 +66,7 @@ int CalDavReader::runJob(runtime_info* RT) {
     if ((OK == res) && (tasksUrl() != "")) {
       kdDebug() << "reader::run, url: " << tasksUrl();
 
-      response* result = caldav_get_response();
-      CALDAV_RESPONSE res = OK;
+      result = caldav_get_response();
 
       if (mGetAll) {
           kdDebug() << "getting all objects";
diff --git a/kresources/caldav/writer.cpp b/kresources/caldav/writer.cpp
index 4580df51..c4101a0b 100644
--- a/kresources/caldav/writer.cpp
+++ b/kresources/caldav/writer.cpp
@@ -49,54 +49,56 @@ int CalDavWriter::runJob(runtime_info* RT) {
 
     int res = OK;
 
-    kdDebug() << "pushing added objects";
-    res = pushObjects(mAdded, caldav_add_object, OK, RT);
-    if (OK == res) {
+    if ((OK == res) && (url() != "")) {
+      kdDebug() << "pushing added objects";
+      res = pushObjects(mAdded, caldav_add_object, OK, RT);
+      if (OK == res) {
 #ifdef USE_CALDAV_MODIFY
-        kdDebug() << "pushing changed objects";
-        res = pushObjects(mChanged, caldav_modify_object, OK, RT);
-        if (OK == res) {
-            kdDebug() << "pushing deleted objects";
-            res = pushObjects(mDeleted, caldav_delete_object, OK, RT);
-        }
+          kdDebug() << "pushing changed objects";
+          res = pushObjects(mChanged, caldav_modify_object, OK, RT);
+          if (OK == res) {
+              kdDebug() << "pushing deleted objects";
+              res = pushObjects(mDeleted, caldav_delete_object, OK, RT);
+          }
 #else // if USE_CALDAV_MODIFY
-        kdDebug() << "pushing changed objects (delete)";
-        res = pushObjects(mChanged, caldav_delete_object, OK, RT);
-        if (OK == res) {
-            kdDebug() << "pushing changed objects (add)";
-            res = pushObjects(mChanged, caldav_add_object, OK, RT);
-            if (OK == res) {
-                kdDebug() << "pushing deleted objects";
-                res = pushObjects(mDeleted, caldav_delete_object, OK, RT);
-            }
-        }
+          kdDebug() << "pushing changed objects (delete)";
+          res = pushObjects(mChanged, caldav_delete_object, OK, RT);
+          if (OK == res) {
+              kdDebug() << "pushing changed objects (add)";
+              res = pushObjects(mChanged, caldav_add_object, OK, RT);
+              if (OK == res) {
+                  kdDebug() << "pushing deleted objects";
+                  res = pushObjects(mDeleted, caldav_delete_object, OK, RT);
+              }
+          }
 #endif // if USE_CALDAV_MODIFY
+      }
     }
 
-    res = OK;
-
-    kdDebug() << "pushing added tasks objects";
-    res = pushTasksObjects(mTasksAdded, caldav_add_object, OK, RT);
     if ((OK == res) && (tasksUrl() != "")) {
+      kdDebug() << "pushing added tasks objects";
+      res = pushTasksObjects(mTasksAdded, caldav_add_object, OK, RT);
+      if (OK == res) {
 #ifdef USE_CALDAV_TASKS_MODIFY
-        kdDebug() << "pushing changed objects";
-        res = pushTasksObjects(mTasksChanged, caldav_tasks_modify_object, OK, RT);
-        if (OK == res) {
-            kdDebug() << "pushing deleted objects";
-            res = pushTasksObjects(mTasksDeleted, caldav_tasks_delete_object, OK, RT);
-        }
+          kdDebug() << "pushing changed objects";
+          res = pushTasksObjects(mTasksChanged, caldav_tasks_modify_object, OK, RT);
+          if (OK == res) {
+              kdDebug() << "pushing deleted objects";
+              res = pushTasksObjects(mTasksDeleted, caldav_tasks_delete_object, OK, RT);
+          }
 #else // if USE_CALDAV_TASKS_MODIFY
-        kdDebug() << "pushing changed objects (delete)";
-        res = pushTasksObjects(mTasksChanged, caldav_tasks_delete_object, OK, RT);
-        if (OK == res) {
-            kdDebug() << "pushing changed objects (add)";
-            res = pushTasksObjects(mTasksChanged, caldav_add_object, OK, RT);
-            if (OK == res) {
-                kdDebug() << "pushing deleted objects";
-                res = pushTasksObjects(mTasksDeleted, caldav_tasks_delete_object, OK, RT);
-            }
-        }
+          kdDebug() << "pushing changed objects (delete)";
+          res = pushTasksObjects(mTasksChanged, caldav_tasks_delete_object, OK, RT);
+          if (OK == res) {
+              kdDebug() << "pushing changed objects (add)";
+              res = pushTasksObjects(mTasksChanged, caldav_add_object, OK, RT);
+              if (OK == res) {
+                  kdDebug() << "pushing deleted objects";
+                  res = pushTasksObjects(mTasksDeleted, caldav_tasks_delete_object, OK, RT);
+              }
+          }
 #endif // if USE_CALDAV_TASKS_MODIFY
+      }
     }
 
     if (OK != res) {
diff --git a/libkcal/resourcecached.cpp b/libkcal/resourcecached.cpp
index 3b654aef..155d24a0 100644
--- a/libkcal/resourcecached.cpp
+++ b/libkcal/resourcecached.cpp
@@ -487,12 +487,24 @@ void ResourceCached::calendarIncidenceDeleted( Incidence *i )
             << i->uid() << endl;
 #endif
 
-  TQMap<Incidence *,bool>::ConstIterator it;
-  it = mDeletedIncidences.find( i );
-  if ( it == mDeletedIncidences.end() ) {
-    mDeletedIncidences.insert( i, true );
+  if (i->hasRecurrenceID()) {
+    // This incidence has a parent; notify the parent of the child's death and do not destroy the parent!
+    // Get the parent
+    IncidenceList il = i->childIncidences();
+    IncidenceListIterator it;
+    it = il.begin();
+    Incidence *parentIncidence;
+    parentIncidence = this->incidence(*it);
+    // Remove the child
+    calendarIncidenceChanged(parentIncidence);
+  }
+  else {
+    TQMap<Incidence *,bool>::ConstIterator it;
+    it = mDeletedIncidences.find( i );
+    if ( it == mDeletedIncidences.end() ) {
+      mDeletedIncidences.insert( i, true );
+    }
   }
-
   checkForAutomaticSave();
 }
 
-- 
cgit v1.2.3

