mirror of
https://bitbucket.org/smil3y/kde-playground.git
synced 2025-02-24 10:52:52 +00:00
183 lines
4.5 KiB
C++
183 lines
4.5 KiB
C++
/*
|
|
This file is part of the kcalcore library.
|
|
|
|
Copyright (c) 2002 Cornelius Schumacher <schumacher@kde.org>
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Library General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2 of the License, or (at your option) any later version.
|
|
|
|
This library 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
|
|
Library General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Library General Public License
|
|
along with this library; see the file COPYING.LIB. If not, write to
|
|
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
Boston, MA 02110-1301, USA.
|
|
*/
|
|
/**
|
|
@file
|
|
This file is part of the API for handling calendar data and
|
|
defines the FileStorage class.
|
|
|
|
@brief
|
|
This class provides a calendar storage as a local file.
|
|
|
|
@author Cornelius Schumacher \<schumacher@kde.org\>
|
|
*/
|
|
#include "filestorage.h"
|
|
#include "exceptions.h"
|
|
#include "icalformat.h"
|
|
#include "memorycalendar.h"
|
|
#include "vcalformat.h"
|
|
|
|
#include <KDebug>
|
|
|
|
using namespace KCalCore;
|
|
|
|
/*
|
|
Private class that helps to provide binary compatibility between releases.
|
|
*/
|
|
//@cond PRIVATE
|
|
class KCalCore::FileStorage::Private
|
|
{
|
|
public:
|
|
Private(const QString &fileName, CalFormat *format)
|
|
: mFileName(fileName),
|
|
mSaveFormat(format)
|
|
{}
|
|
~Private() {
|
|
delete mSaveFormat;
|
|
}
|
|
|
|
QString mFileName;
|
|
CalFormat *mSaveFormat;
|
|
};
|
|
//@endcond
|
|
|
|
FileStorage::FileStorage(const Calendar::Ptr &cal, const QString &fileName,
|
|
CalFormat *format)
|
|
: CalStorage(cal),
|
|
d(new Private(fileName, format))
|
|
{
|
|
}
|
|
|
|
FileStorage::~FileStorage()
|
|
{
|
|
delete d;
|
|
}
|
|
|
|
void FileStorage::setFileName(const QString &fileName)
|
|
{
|
|
d->mFileName = fileName;
|
|
}
|
|
|
|
QString FileStorage::fileName() const
|
|
{
|
|
return d->mFileName;
|
|
}
|
|
|
|
void FileStorage::setSaveFormat(CalFormat *format)
|
|
{
|
|
delete d->mSaveFormat;
|
|
d->mSaveFormat = format;
|
|
}
|
|
|
|
CalFormat *FileStorage::saveFormat() const
|
|
{
|
|
return d->mSaveFormat;
|
|
}
|
|
|
|
bool FileStorage::open()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
bool FileStorage::load()
|
|
{
|
|
if (d->mFileName.isEmpty()) {
|
|
kWarning() << "Empty filename while trying to load";
|
|
return false;
|
|
}
|
|
|
|
// Always try to load with iCalendar. It will detect, if it is actually a
|
|
// vCalendar file.
|
|
bool success;
|
|
QString productId;
|
|
// First try the supplied format. Otherwise fall through to iCalendar, then
|
|
// to vCalendar
|
|
success = saveFormat() && saveFormat()->load(calendar(), d->mFileName);
|
|
if (success) {
|
|
productId = saveFormat()->loadedProductId();
|
|
} else {
|
|
ICalFormat iCal;
|
|
|
|
success = iCal.load(calendar(), d->mFileName);
|
|
|
|
if (success) {
|
|
productId = iCal.loadedProductId();
|
|
} else {
|
|
if (iCal.exception()) {
|
|
if (iCal.exception()->code() == Exception::CalVersion1) {
|
|
// Expected non vCalendar file, but detected vCalendar
|
|
kDebug() << "Fallback to VCalFormat";
|
|
VCalFormat vCal;
|
|
success = vCal.load(calendar(), d->mFileName);
|
|
productId = vCal.loadedProductId();
|
|
if (!success) {
|
|
if (vCal.exception()) {
|
|
kWarning() << "Exception while importing:" << vCal.exception()->code();
|
|
}
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
kWarning() << "There should be an exception set.";
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
|
|
calendar()->setProductId(productId);
|
|
calendar()->setModified(false);
|
|
|
|
return true;
|
|
}
|
|
|
|
bool FileStorage::save()
|
|
{
|
|
kDebug();
|
|
if (d->mFileName.isEmpty()) {
|
|
return false;
|
|
}
|
|
|
|
CalFormat *format = d->mSaveFormat ? d->mSaveFormat : new ICalFormat;
|
|
|
|
bool success = format->save(calendar(), d->mFileName);
|
|
|
|
if (success) {
|
|
calendar()->setModified(false);
|
|
} else {
|
|
if (!format->exception()) {
|
|
kDebug() << "Error. There should be an expection set.";
|
|
} else {
|
|
kDebug() << int(format->exception()->code());
|
|
}
|
|
}
|
|
|
|
if (!d->mSaveFormat) {
|
|
delete format;
|
|
}
|
|
|
|
return success;
|
|
}
|
|
|
|
bool FileStorage::close()
|
|
{
|
|
return true;
|
|
}
|