diff options
Diffstat (limited to 'kresources/caldav/resource.cpp')
-rw-r--r-- | kresources/caldav/resource.cpp | 126 |
1 files changed, 117 insertions, 9 deletions
diff --git a/kresources/caldav/resource.cpp b/kresources/caldav/resource.cpp index 462cd6290..f3835b180 100644 --- a/kresources/caldav/resource.cpp +++ b/kresources/caldav/resource.cpp @@ -160,7 +160,7 @@ bool ResourceCalDav::doLoad() { emit resourceLoaded(this); log("starting download job"); - startLoading(mPrefs->getFullUrl()); + startLoading(mPrefs->getFullUrl(), mPrefs->getFullTasksUrl()); return true; } @@ -189,7 +189,7 @@ bool ResourceCalDav::doSave() { } log("start writing job"); - if (startWriting(mPrefs->getFullUrl()) == true) { + if (startWriting(mPrefs->getFullUrl(), mPrefs->getFullTasksUrl()) == true) { log("clearing changes"); // FIXME: Calling clearChanges() here is not the ideal way since the // upload might fail, but there is no other place to call it... @@ -333,6 +333,7 @@ void ResourceCalDav::loadingQueuePop() { LoadingTask *t = mLoadingQueue.head(); mLoader->setUrl(t->url); + mLoader->setTasksUrl(t->tasksUrl); mLoader->setParent(this); mLoader->setType(0); @@ -352,9 +353,10 @@ void ResourceCalDav::loadingQueuePop() { delete t; } -void ResourceCalDav::startLoading(const TQString& url) { +void ResourceCalDav::startLoading(const TQString& url, const TQString& tasksUrl) { LoadingTask *t = new LoadingTask; t->url = url; + t->tasksUrl = tasksUrl; loadingQueuePush(t); } @@ -379,7 +381,7 @@ void ResourceCalDav::loadFinished() { else { // Set new password and try again mPrefs->setPassword(TQString(newpass)); - startLoading(mPrefs->getFullUrl()); + startLoading(mPrefs->getFullUrl(), mPrefs->getFullTasksUrl()); } } else { @@ -394,6 +396,7 @@ void ResourceCalDav::loadFinished() { } else { log("successful load"); TQString data = loader->data(); + TQString tasksData = loader->tasksData(); if (!data.isNull() && !data.isEmpty()) { // TODO: I don't know why, but some schedules on http://caldav-test.ioda.net/ (I used it for testing) @@ -414,6 +417,26 @@ void ResourceCalDav::loadFinished() { emit resourceLoaded(this); } } + + if (!tasksData.isNull() && !tasksData.isEmpty()) { + // TODO: I don't know why, but some schedules on http://caldav-test.ioda.net/ (I used it for testing) + // have some lines separated by single \r rather than \n or \r\n. + // ICalFormat fails to parse that. + tasksData.replace("\r\n", "\n"); // to avoid \r\n becomes \n\n after the next line + tasksData.replace('\r', '\n'); + + log("trying to parse..."); + if (parseTasksData(tasksData)) { + // FIXME: The agenda view can crash when a change is + // made on a remote server and a reload is requested! + log("... parsing is ok"); + log("clearing changes"); + enableChangeNotification(); + clearChanges(); + emit resourceChanged(this); + emit resourceLoaded(this); + } + } } // Loading queue and mLoadingQueueReady flag are not shared resources, i.e. only one thread has an access to them. @@ -495,6 +518,60 @@ bool ResourceCalDav::parseData(const TQString& data) { return ret; } +bool ResourceCalDav::parseTasksData(const TQString& data) { + log("parseTasksData()"); + + bool ret = true; + + // check if the data is OK + // May be it's not efficient (parsing is done twice), but it should be safe + if (!checkData(data)) { + loadError(i18n("Parsing calendar data failed.")); + return false; + } + + disableChangeNotification(); + + log("actually parsing the data"); + + ICalFormat ical; + if ( !ical.fromString( &mCalendar, data ) ) { + // this should never happen, but... + ret = false; + } + + // debug code here ------------------------------------------------------- +#ifdef KCALDAV_DEBUG + const TQString fout_path = "/tmp/kcaldav_download_" + identifier() + ".tmp"; + + TQFile fout(fout_path); + if (fout.open(IO_WriteOnly | IO_Append)) { + TQTextStream sout(&fout); + sout << "---------- " << resourceName() << ": --------------------------------\n"; + sout << data << "\n"; + fout.close(); + } else { + loadError(i18n("can't open file")); + } +#endif // KCALDAV_DEBUG + // end of debug code ---------------------------------------------------- + + enableChangeNotification(); + + if (ret) { + log("parsing is ok"); + //if ( !noReadOnlyOnLoad() && readOnly() ) { + if ( readOnly() ) { + log("ensuring read only flag honored"); + ensureReadOnlyFlagHonored(); + } + log("saving to cache"); + saveCache(); + } + + return ret; +} + /*========================================================================= | WRITING METHODS ========================================================================*/ @@ -554,6 +631,7 @@ void ResourceCalDav::writingQueuePop() { log("writingQueuePop: url = " + t->url); mWriter->setUrl(t->url); + mWriter->setTasksUrl(t->tasksUrl); mWriter->setParent(this); mWriter->setType(1); @@ -577,6 +655,10 @@ void ResourceCalDav::writingQueuePop() { mWriter->setChangedObjects(t->changed); mWriter->setDeletedObjects(t->deleted); + mWriter->setAddedTasksObjects(t->tasksAdded); + mWriter->setChangedTasksObjects(t->tasksChanged); + mWriter->setDeletedTasksObjects(t->tasksDeleted); + mWritingQueueReady = false; log("starting actual write job"); @@ -607,7 +689,7 @@ void ResourceCalDav::releaseReadLockout() { readLockout = false; } -bool ResourceCalDav::startWriting(const TQString& url) { +bool ResourceCalDav::startWriting(const TQString& url, const TQString& tasksUrl) { log("startWriting: url = " + url); // WARNING: This will segfault if a separate read or write thread @@ -644,9 +726,17 @@ bool ResourceCalDav::startWriting(const TQString& url) { currentIncidence.append(*it); t->url = url; - t->added = getICalString(currentIncidence); + t->tasksUrl = tasksUrl; + t->added = ""; t->changed = ""; t->deleted = ""; + t->tasksAdded = ""; + t->tasksChanged = ""; + t->tasksDeleted = ""; + if (getICalString(currentIncidence).contains("BEGIN:VEVENT") > 0) + t->added = getICalString(currentIncidence); + else if (getICalString(currentIncidence).contains("BEGIN:VTODO") > 0) + t->tasksAdded = getICalString(currentIncidence); writingQueuePush(t); } @@ -658,9 +748,18 @@ bool ResourceCalDav::startWriting(const TQString& url) { currentIncidence.append(*it); t->url = url; + t->tasksUrl = tasksUrl; t->added = ""; - t->changed = getICalString(currentIncidence); + t->changed = ""; t->deleted = ""; + t->tasksAdded = ""; + t->tasksChanged = ""; + t->tasksDeleted = ""; + + if (getICalString(currentIncidence).contains("BEGIN:VEVENT") > 0) + t->changed = getICalString(currentIncidence); + else if (getICalString(currentIncidence).contains("BEGIN:VTODO") > 0) + t->tasksChanged = getICalString(currentIncidence); writingQueuePush(t); } @@ -672,9 +771,18 @@ bool ResourceCalDav::startWriting(const TQString& url) { currentIncidence.append(*it); t->url = url; + t->tasksUrl = tasksUrl; t->added = ""; t->changed = ""; - t->deleted = getICalString(currentIncidence); + t->deleted = ""; + t->tasksAdded = ""; + t->tasksChanged = ""; + t->tasksDeleted = ""; + + if (getICalString(currentIncidence).contains("BEGIN:VEVENT") > 0) + t->deleted = getICalString(currentIncidence); + else if (getICalString(currentIncidence).contains("BEGIN:VTODO") > 0) + t->tasksDeleted = getICalString(currentIncidence); writingQueuePush(t); } @@ -701,7 +809,7 @@ void ResourceCalDav::writingFinished() { else { // Set new password and try again mPrefs->setPassword(TQString(newpass)); - startWriting(mPrefs->getFullUrl()); + startWriting(mPrefs->getFullUrl(), mPrefs->getFullTasksUrl()); } } else { |