/****************************************************************************** * Find the version of KAlarm which wrote the calendar file, and do any * necessary conversions to the current format. If it is a resource calendar, * the user is prompted whether to save the conversions. For a local calendar * file, any conversions will only be saved if changes are made later. * If the calendar only contains the wrong alarm types, 'wrongType' is set true. * Reply = true if the calendar file is now in the current format. */ KCalendar::Status CalendarCompat::fix(KCal::CalendarLocal& calendar, const QString& localFile, AlarmResource* resource, AlarmResource::FixFunc conv, bool* wrongType) { if (wrongType) *wrongType = false; bool version057_UTC = false; QString subVersion, versionString; int version = readKAlarmVersion(calendar, localFile, subVersion, versionString); if (version < 0 || version > KAlarm::Version()) return KCalendar::Incompatible; // calendar was created by another program, or an unknown version of KAlarm if (version) { // Calendar was created by an earlier version of KAlarm. // Convert it to the current format. if (version == KAlarm::Version(0,5,7) && !localFile.isEmpty()) { // KAlarm version 0.5.7 - check whether times are stored in UTC, in which // case it is the KDE 3.0.0 version, which needs adjustment of summer times. version057_UTC = isUTC(localFile); kDebug() << "KAlarm version 0.5.7 (" << (version057_UTC ?"" :"non-") << "UTC)"; } else kDebug() << "KAlarm version" << version; // Convert events to current KAlarm format for if the calendar is saved KAEventData::convertKCalEvents(calendar, version, version057_UTC, Preferences::startOfDay()); } if (!resource) return KCalendar::Current; // update non-shared calendars regardless // Check whether the alarm types in the calendar correspond with the resource's alarm type if (wrongType) *wrongType = !resource->checkAlarmTypes(calendar); if (!version) return KCalendar::Current; // calendar is in current KAlarm format if (resource->ResourceCached::readOnly() || conv == AlarmResource::NO_CONVERT) return KCalendar::Convertible; // Update the calendar file now if the user wants it to be read-write if (conv == AlarmResource::PROMPT || conv == AlarmResource::PROMPT_PART) { QString msg = (conv == AlarmResource::PROMPT) ? i18nc("@info", "Calendar <resource>%1</resource> is in an old format (<application>KAlarm</application> version %2), and will be read-only unless " "you choose to update it to the current format.", resource->resourceName(), versionString) : i18nc("@info", "Some or all of the alarms in calendar <resource>%1</resource> are in an old <application>KAlarm</application> format, and will be read-only unless " "you choose to update them to the current format.", resource->resourceName()); if (KMessageBox::warningYesNo(0, i18nc("@info", "<para>%1</para><para>" "<warning>Do not update the calendar if it is shared with other users who run an older version " "of <application>KAlarm</application>. If you do so, they may be unable to use it any more.</warning></para>" "<para>Do you wish to update the calendar?</para>", msg)) != KMessageBox::Yes) return KCalendar::Convertible; } calendar.setCustomProperty(KCalendar::APPNAME, VERSION_PROPERTY, QLatin1String(KALARM_VERSION)); return KCalendar::Converted; }
/****************************************************************************** * Write the X-KDE-KALARM-VERSION custom property into the calendar. */ void CalendarCompat::setID(KCal::CalendarLocal& calendar) { calendar.setCustomProperty(KCalendar::APPNAME, VERSION_PROPERTY, QString::fromLatin1(KAEventData::currentCalendarVersionString())); }