kalarm
calendarcompat.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "kalarm.h"
00022 #include "calendarcompat.h"
00023
00024 #include "alarmevent.h"
00025 #include "alarmresource.h"
00026 #include "functions.h"
00027 #include "preferences.h"
00028
00029 #include <QFile>
00030 #include <QFileInfo>
00031 #include <QTextStream>
00032
00033 #include <kapplication.h>
00034 #include <kaboutdata.h>
00035 #include <klocale.h>
00036 #include <kmessagebox.h>
00037 #include <kdebug.h>
00038
00039 #include <kcal/calendarlocal.h>
00040
00041
00042 using namespace KCal;
00043
00044 static const QByteArray VERSION_PROPERTY("VERSION");
00045
00046
00047
00048
00049
00050 void CalendarCompat::setID(KCal::CalendarLocal& calendar)
00051 {
00052 calendar.setCustomProperty(KCalendar::APPNAME, VERSION_PROPERTY, KAlarm::currentCalendarVersionString());
00053 }
00054
00055
00056
00057
00058
00059
00060
00061
00062 KCalendar::Status CalendarCompat::fix(KCal::CalendarLocal& calendar, const QString& localFile, AlarmResource* resource, AlarmResource::FixFunc conv)
00063 {
00064 bool version057_UTC = false;
00065 QString subVersion, versionString;
00066 int version = readKAlarmVersion(calendar, localFile, subVersion, versionString);
00067 if (!version)
00068 return KCalendar::Current;
00069 if (version < 0 || version > KAlarm::Version())
00070 return KCalendar::Incompatible;
00071
00072
00073
00074 if (version == KAlarm::Version(0,5,7) && !localFile.isEmpty())
00075 {
00076
00077
00078 version057_UTC = isUTC(localFile);
00079 kDebug() << "KAlarm version 0.5.7 (" << (version057_UTC ?"" :"non-") << "UTC)";
00080 }
00081 else
00082 kDebug() << "KAlarm version" << version;
00083
00084
00085 KAEvent::convertKCalEvents(calendar, version, version057_UTC);
00086 if (!resource)
00087 return KCalendar::Current;
00088 if (resource->ResourceCached::readOnly() || conv == AlarmResource::NO_CONVERT)
00089 return KCalendar::Convertible;
00090
00091 if (conv == AlarmResource::PROMPT || conv == AlarmResource::PROMPT_PART)
00092 {
00093 QString msg = (conv == AlarmResource::PROMPT)
00094 ? i18nc("@info", "Resource <resource>%1</resource> is in an old format (<application>KAlarm</application> version %2), and will be read-only unless "
00095 "you choose to update it to the current format.", resource->resourceName(), versionString)
00096 : i18nc("@info", "Some or all of the alarms in resource <resource>%1</resource> are in an old <application>KAlarm</application> format, and will be read-only unless "
00097 "you choose to update them to the current format.", resource->resourceName());
00098 if (KMessageBox::warningYesNo(0,
00099 i18nc("@info", "<para>%1</para><para>"
00100 "<warning>Do not update the resource if it is shared with other users who run an older version "
00101 "of <application>KAlarm</application>. If you do so, they may be unable to use it any more.</warning></para>"
00102 "<para>Do you wish to update the resource?</para>", msg))
00103 != KMessageBox::Yes)
00104 return KCalendar::Convertible;
00105 }
00106 calendar.setCustomProperty(KCalendar::APPNAME, VERSION_PROPERTY, QLatin1String(KALARM_VERSION));
00107 return KCalendar::Converted;
00108 }
00109
00110
00111
00112
00113
00114
00115
00116
00117 int CalendarCompat::readKAlarmVersion(KCal::CalendarLocal& calendar, const QString& localFile, QString& subVersion, QString& versionString)
00118 {
00119 subVersion.clear();
00120 versionString = calendar.customProperty(KCalendar::APPNAME, VERSION_PROPERTY);
00121 if (versionString.isEmpty())
00122 {
00123
00124
00125 const QString prodid = calendar.productId();
00126 if (prodid.isEmpty())
00127 {
00128
00129
00130 QFileInfo fi(localFile);
00131 if (!fi.size())
00132 return 0;
00133 }
00134
00135
00136 QString progname = QLatin1String(" KAlarm ");
00137 int i = prodid.indexOf(progname, 0, Qt::CaseInsensitive);
00138 if (i < 0)
00139 {
00140
00141
00142 progname = QString(" ") + KGlobal::mainComponent().aboutData()->programName() + ' ';
00143 i = prodid.indexOf(progname, 0, Qt::CaseInsensitive);
00144 if (i < 0)
00145 return -1;
00146 }
00147
00148
00149 versionString = prodid.mid(i + progname.length()).trimmed();
00150 i = versionString.indexOf('/');
00151 int j = versionString.indexOf(' ');
00152 if (j >= 0 && j < i)
00153 i = j;
00154 if (i <= 0)
00155 return -1;
00156 versionString = versionString.left(i);
00157 }
00158 if (versionString == KAlarm::currentCalendarVersionString())
00159 return 0;
00160 int ver = KAlarm::getVersionNumber(versionString, &subVersion);
00161 if (ver >= KAlarm::currentCalendarVersion() && ver <= KAlarm::Version())
00162 return 0;
00163 return KAlarm::getVersionNumber(versionString, &subVersion);
00164 }
00165
00166
00167
00168
00169
00170
00171
00172 bool CalendarCompat::isUTC(const QString& localFile)
00173 {
00174
00175 QFile file(localFile);
00176 if (!file.open(QIODevice::ReadOnly))
00177 return false;
00178 QTextStream ts(&file);
00179 ts.setCodec("ISO 8859-1");
00180 QByteArray text = ts.readAll().toLocal8Bit();
00181 file.close();
00182
00183
00184 QList<QByteArray> lines = text.split('\n');
00185 for (int i = 0, end = lines.count(); i < end; ++i)
00186 {
00187 if (lines[i].startsWith("BEGIN:VCALENDAR"))
00188 {
00189 while (++i < end)
00190 {
00191 if (lines[i].startsWith("BEGIN:VEVENT"))
00192 {
00193 while (++i < end)
00194 {
00195 if (lines[i].startsWith("CREATED:"))
00196 return lines[i].endsWith('Z');
00197 }
00198 }
00199 }
00200 break;
00201 }
00202 }
00203 return false;
00204 }
00205