diff options
author | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
---|---|---|
committer | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
commit | 460c52653ab0dcca6f19a4f492ed2c5e4e963ab0 (patch) | |
tree | 67208f7c145782a7e90b123b982ca78d88cc2c87 /korganizer/eventarchiver.cpp | |
download | tdepim-460c52653ab0dcca6f19a4f492ed2c5e4e963ab0.tar.gz tdepim-460c52653ab0dcca6f19a4f492ed2c5e4e963ab0.zip |
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdepim@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'korganizer/eventarchiver.cpp')
-rw-r--r-- | korganizer/eventarchiver.cpp | 225 |
1 files changed, 225 insertions, 0 deletions
diff --git a/korganizer/eventarchiver.cpp b/korganizer/eventarchiver.cpp new file mode 100644 index 000000000..f4ff3cbf9 --- /dev/null +++ b/korganizer/eventarchiver.cpp @@ -0,0 +1,225 @@ +/* + This file is part of KOrganizer. + Copyright (c) 2000,2001 Cornelius Schumacher <schumacher@kde.org> + Copyright (c) 2004 David Faure <faure@kde.org> + Copyright (C) 2004 Reinhold Kainhofer <reinhold@kainhofer.com> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + As a special exception, permission is given to link this program + with any edition of Qt, and distribute the resulting executable, + without including the source code for Qt in the source distribution. +*/ + +#include "eventarchiver.h" +#include <kglobal.h> +#include <klocale.h> +#include <ktempfile.h> +#include <kio/netaccess.h> +#include <kglobal.h> +#include <libkcal/filestorage.h> +#include <libkcal/calendarlocal.h> +#include <libkcal/calendar.h> +#include <kmessagebox.h> +#include <kdebug.h> +#include "koprefs.h" + +EventArchiver::EventArchiver( QObject* parent, const char* name ) + : QObject( parent, name ) +{ +} + +EventArchiver::~EventArchiver() +{ +} + +void EventArchiver::runOnce( Calendar* calendar, const QDate& limitDate, QWidget* widget ) +{ + run( calendar, limitDate, widget, true, true ); +} + +void EventArchiver::runAuto( Calendar* calendar, QWidget* widget, bool withGUI ) +{ + QDate limitDate( QDate::currentDate() ); + int expiryTime = KOPrefs::instance()->mExpiryTime; + switch (KOPrefs::instance()->mExpiryUnit) { + case KOPrefs::UnitDays: // Days + limitDate = limitDate.addDays( -expiryTime ); + break; + case KOPrefs::UnitWeeks: // Weeks + limitDate = limitDate.addDays( -expiryTime*7 ); + break; + case KOPrefs::UnitMonths: // Months + limitDate = limitDate.addMonths( -expiryTime ); + break; + default: + return; + } + run( calendar, limitDate, widget, withGUI, false ); +} + +void EventArchiver::run( Calendar* calendar, const QDate& limitDate, QWidget* widget, bool withGUI, bool errorIfNone ) +{ + // We need to use rawEvents, otherwise events hidden by filters will not be archived. + Incidence::List incidences; + Event::List events; + Todo::List todos; + Journal::List journals; + + if ( KOPrefs::instance()->mArchiveEvents ) { + events = calendar->rawEvents( + QDate( 1769, 12, 1 ), + // #29555, also advertised by the "limitDate not included" in the class docu + limitDate.addDays( -1 ), + true ); + } + if ( KOPrefs::instance()->mArchiveTodos ) { + Todo::List t = calendar->rawTodos(); + Todo::List::ConstIterator it; + for( it = t.begin(); it != t.end(); ++it ) { + if ( (*it) && ( (*it)->isCompleted() ) && ( (*it)->completed().date() < limitDate ) ) { + todos.append( *it ); + } + } + } + + incidences = Calendar::mergeIncidenceList( events, todos, journals ); + + + kdDebug(5850) << "EventArchiver: archiving incidences before " << limitDate << " -> " << incidences.count() << " incidences found." << endl; + if ( incidences.isEmpty() ) { + if ( withGUI && errorIfNone ) + KMessageBox::information( widget, i18n("There are no items before %1") + .arg(KGlobal::locale()->formatDate(limitDate)), + "ArchiverNoIncidences" ); + return; + } + + + switch ( KOPrefs::instance()->mArchiveAction ) { + case KOPrefs::actionDelete: + deleteIncidences( calendar, limitDate, widget, incidences, withGUI ); + break; + case KOPrefs::actionArchive: + archiveIncidences( calendar, limitDate, widget, incidences, withGUI ); + break; + } +} + +void EventArchiver::deleteIncidences( Calendar* calendar, const QDate& limitDate, QWidget* widget, const Incidence::List& incidences, bool withGUI ) +{ + QStringList incidenceStrs; + Incidence::List::ConstIterator it; + for( it = incidences.begin(); it != incidences.end(); ++it ) { + incidenceStrs.append( (*it)->summary() ); + } + + if ( withGUI ) { + int result = KMessageBox::warningContinueCancelList( + widget, i18n("Delete all items before %1 without saving?\n" + "The following items will be deleted:") + .arg(KGlobal::locale()->formatDate(limitDate)), incidenceStrs, + i18n("Delete Old Items"),KStdGuiItem::del()); + if (result != KMessageBox::Continue) + return; + } + for( it = incidences.begin(); it != incidences.end(); ++it ) { + calendar->deleteIncidence( *it ); + } + emit eventsDeleted(); +} + +void EventArchiver::archiveIncidences( Calendar* calendar, const QDate& /*limitDate*/, QWidget* widget, const Incidence::List& incidences, bool /*withGUI*/) +{ + FileStorage storage( calendar ); + + // Save current calendar to disk + KTempFile tmpFile; + tmpFile.setAutoDelete(true); + storage.setFileName( tmpFile.name() ); + if ( !storage.save() ) { + kdDebug(5850) << "EventArchiver::archiveEvents(): Can't save calendar to temp file" << endl; + return; + } + + // Duplicate current calendar by loading in new calendar object + CalendarLocal archiveCalendar( KOPrefs::instance()->mTimeZoneId ); + + FileStorage archiveStore( &archiveCalendar ); + archiveStore.setFileName( tmpFile.name() ); + if (!archiveStore.load()) { + kdDebug(5850) << "EventArchiver::archiveEvents(): Can't load calendar from temp file" << endl; + return; + } + + // Strip active events from calendar so that only events to be archived + // remain. This is not really efficient, but there is no other easy way. + QStringList uids; + Incidence::List allIncidences = archiveCalendar.rawIncidences(); + Incidence::List::ConstIterator it; + for( it = incidences.begin(); it != incidences.end(); ++it ) { + uids << (*it)->uid(); + } + for( it = allIncidences.begin(); it != allIncidences.end(); ++it ) { + if ( !uids.contains( (*it)->uid() ) ) { + archiveCalendar.deleteIncidence( *it ); + } + } + + // Get or create the archive file + KURL archiveURL( KOPrefs::instance()->mArchiveFile ); + QString archiveFile; + + if ( KIO::NetAccess::exists( archiveURL, true, widget ) ) { + if( !KIO::NetAccess::download( archiveURL, archiveFile, widget ) ) { + kdDebug(5850) << "EventArchiver::archiveEvents(): Can't download archive file" << endl; + return; + } + // Merge with events to be archived. + archiveStore.setFileName( archiveFile ); + if ( !archiveStore.load() ) { + kdDebug(5850) << "EventArchiver::archiveEvents(): Can't merge with archive file" << endl; + return; + } + } else { + archiveFile = tmpFile.name(); + } + + // Save archive calendar + if ( !archiveStore.save() ) { + KMessageBox::error(widget,i18n("Cannot write archive file %1.").arg( archiveStore.fileName() )); + return; + } + + // Upload if necessary + KURL srcUrl; + srcUrl.setPath(archiveFile); + if (srcUrl != archiveURL) { + if ( !KIO::NetAccess::upload( archiveFile, archiveURL, widget ) ) { + KMessageBox::error(widget,i18n("Cannot write archive to final destination.")); + return; + } + } + + KIO::NetAccess::removeTempFile(archiveFile); + + // Delete archived events from calendar + for( it = incidences.begin(); it != incidences.end(); ++it ) { + calendar->deleteIncidence( *it ); + } + emit eventsDeleted(); +} + +#include "eventarchiver.moc" |