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 <[email protected]> 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. _______________________________________________ Kdepim-bugs mailing list [email protected] https://mail.kde.org/mailman/listinfo/kdepim-bugs
