[Bug 259731] archive old events action not working

Andre Heinecke aheinecke at intevation.de
Wed Jan 12 15:05:17 GMT 2011


https://bugs.kde.org/show_bug.cgi?id=259731





--- Comment #6 from Andre Heinecke <aheinecke intevation de>  2011-01-12 16:05:15 ---
commit c5c727a06cd899ef9727e9a41b6529870524becd
branch master
Author: Andre Heinecke <aheinecke at intevation.de>
Date:   Wed Jan 12 12:02:23 2011 +0000

    Don't call KSaveFile with an already open File

        On Windows Systems files can not be removed when there are open
        Handles to them. This breaks the way KTemporaryFile and KSaveFile
        interact in this case.
        When archivestore::save is called a KSaveFile is created by the
        Filename which was already opened by KTemporaryFile so the renaming
        fails.

        CCBUG: 259731

diff --git a/calendarsupport/eventarchiver.cpp
b/calendarsupport/eventarchiver.cpp
index 0a95f35..55d3280 100644
--- a/calendarsupport/eventarchiver.cpp
+++ b/calendarsupport/eventarchiver.cpp
@@ -176,10 +176,18 @@ void EventArchiver::archiveIncidences(
CalendarSupport::Calendar *calendar, Cale
   CalendarSupport::CalendarAdaptor::Ptr cal( new
CalendarSupport::CalendarAdaptor( calendar, widget ) );
   FileStorage storage( cal );

+  QString tmpFileName;
+  // KSaveFile can not be called with an open File Handle on Windows.
+  // So we use KTemporaryFile only to generate a unique filename
+  // and then close/delete the file again. This file must be deleted
+  // here.
+  {
+    KTemporaryFile tmpFile;
+    tmpFile.open();
+    tmpFileName = tmpFile.fileName();
+  }
   // Save current calendar to disk
-  KTemporaryFile tmpFile;
-  tmpFile.open();
-  storage.setFileName( tmpFile.fileName() );
+  storage.setFileName( tmpFileName );
   if ( !storage.save() ) {
     kDebug() << "Can't save calendar to temp file";
     return;
@@ -190,11 +198,12 @@ void EventArchiver::archiveIncidences(
CalendarSupport::Calendar *calendar, Cale
     new MemoryCalendar( CalendarSupport::KCalPrefs::instance()->timeSpec() )
);

   FileStorage archiveStore( archiveCalendar );
-  archiveStore.setFileName( tmpFile.fileName() );
+  archiveStore.setFileName( tmpFileName );
   ICalFormat *format = new ICalFormat();
   archiveStore.setSaveFormat( format );
   if ( !archiveStore.load() ) {
     kDebug() << "Can't load calendar from temp file";
+    QFile::remove( tmpFileName );
     return;
   }

@@ -218,16 +227,18 @@ void EventArchiver::archiveIncidences(
CalendarSupport::Calendar *calendar, Cale
   if ( KIO::NetAccess::exists( archiveURL, KIO::NetAccess::SourceSide, widget
) ) {
     if( !KIO::NetAccess::download( archiveURL, archiveFile, widget ) ) {
       kDebug() << "Can't download archive file";
+      QFile::remove( tmpFileName );
       return;
     }
     // Merge with events to be archived.
     archiveStore.setFileName( archiveFile );
     if ( !archiveStore.load() ) {
       kDebug() << "Can't merge with archive file";
+      QFile::remove( tmpFileName );
       return;
     }
   } else {
-    archiveFile = tmpFile.fileName();
+    archiveFile = tmpFileName;
   }

   // Save archive calendar
@@ -240,6 +251,7 @@ void EventArchiver::archiveIncidences(
CalendarSupport::Calendar *calendar, Cale
     }
     KMessageBox::error( widget, i18n( "Cannot write archive file %1. %2",
                                       archiveStore.fileName(), errmess ) );
+    QFile::remove( tmpFileName );
     return;
   }

@@ -250,10 +262,12 @@ void EventArchiver::archiveIncidences(
CalendarSupport::Calendar *calendar, Cale
     if ( !KIO::NetAccess::upload( archiveFile, archiveURL, widget ) ) {
       KMessageBox::error( widget, i18n( "Cannot write archive. %1",
                                         KIO::NetAccess::lastErrorString() ) );
+      QFile::remove( tmpFileName );
       return;
     }
   }

+  QFile::remove( tmpFileName );
   KIO::NetAccess::removeTempFile( archiveFile );

   // Delete archived events from calendar

-- 
Configure bugmail: https://bugs.kde.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.



More information about the Kdepim-bugs mailing list