From 143f24c1b6223e33feff5a6a80213eb76ca78a4f Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Wed, 13 Mar 2024 10:06:32 +0100 Subject: [PATCH] Ical: add some kind of better parsing when date/time of event is in specified timezone, it sucks before the iCal SPEC is huge and i just cannot implement it all correctly for purpose in rssguard --- .../services/standard/parsers/icalparser.cpp | 47 +++++++++++++------ .../services/standard/parsers/icalparser.h | 7 +-- 2 files changed, 37 insertions(+), 17 deletions(-) diff --git a/src/librssguard/services/standard/parsers/icalparser.cpp b/src/librssguard/services/standard/parsers/icalparser.cpp index c41ec4b2a..0cc941412 100644 --- a/src/librssguard/services/standard/parsers/icalparser.cpp +++ b/src/librssguard/services/standard/parsers/icalparser.cpp @@ -109,15 +109,15 @@ QString IcalParser::objMessageDescription(const QVariant& msg_element) const { const IcalendarComponent& comp_base = msg_element.value(); const EventComponent& comp = static_cast(comp_base); - auto son = comp.startsOn(m_iCalendar.m_tzs); - auto soff = comp.endsOn(m_iCalendar.m_tzs); + bool has_dt; + auto son = comp.startsOn(m_iCalendar.m_tzs, &has_dt).toLocalTime(); - QString formaton = son.time().hour() > 0 || son.time().minute() > 0 || son.time().second() > 0 - ? QLocale().dateTimeFormat(QLocale::FormatType::LongFormat) - : QLocale().dateFormat(QLocale::FormatType::LongFormat); - QString formatoff = soff.time().hour() > 0 || soff.time().minute() > 0 || soff.time().second() > 0 - ? QLocale().dateTimeFormat(QLocale::FormatType::LongFormat) - : QLocale().dateFormat(QLocale::FormatType::LongFormat); + QString formaton = has_dt ? QLocale().dateTimeFormat(QLocale::FormatType::LongFormat) + : QLocale().dateFormat(QLocale::FormatType::LongFormat); + + auto soff = comp.endsOn(m_iCalendar.m_tzs, &has_dt).toLocalTime(); + QString formatoff = has_dt ? QLocale().dateTimeFormat(QLocale::FormatType::LongFormat) + : QLocale().dateFormat(QLocale::FormatType::LongFormat); QString body = QSL("Start date/time: %2
" "End date/time: %3
" @@ -309,7 +309,8 @@ QVariant IcalendarComponent::getPropertyValue(const QString& property_name, QStr QDateTime IcalendarComponent::fixupDate(QDateTime dat, const QString& dt_format, const QMap& time_zones, - const QString& modifiers) const { + const QString& modifiers, + bool* has_dt) const { // dat.setTimeSpec(Qt::TimeSpec::LocalTime); // auto xx = dat.toUTC().toString(); @@ -317,7 +318,11 @@ QDateTime IcalendarComponent::fixupDate(QDateTime dat, bool time_initialized = dt_format.contains('T'); QStringList spl = modifiers.split('='); - if (time_initialized && time_zones.contains(spl.at(1))) { + if (has_dt != nullptr) { + *has_dt = time_initialized; + } + + if (time_initialized && spl.size() == 2 && time_zones.contains(spl.at(1))) { QTimeZone tz = time_zones.value(spl.at(1)); dat.setTimeSpec(Qt::TimeSpec::TimeZone); @@ -335,20 +340,34 @@ QDateTime IcalendarComponent::fixupDate(QDateTime dat, } } -QDateTime EventComponent::startsOn(const QMap& time_zones) const { +QDateTime EventComponent::startsOn(const QMap& time_zones, bool* had_dt) const { QString modifiers; QString dt_format; + bool has_dt; QDateTime dat = TextFactory::parseDateTime(getPropertyValue(QSL("DTSTART"), modifiers).toString(), &dt_format); - return fixupDate(dat, dt_format, time_zones, modifiers); + dat = fixupDate(dat, dt_format, time_zones, modifiers, &has_dt); + + if (had_dt != nullptr) { + *had_dt = has_dt; + } + + return dat; } -QDateTime EventComponent::endsOn(const QMap& time_zones) const { +QDateTime EventComponent::endsOn(const QMap& time_zones, bool *had_dt) const { QString modifiers; QString dt_format; + bool has_dt; QDateTime dat = TextFactory::parseDateTime(getPropertyValue(QSL("DTEND"), modifiers).toString(), &dt_format); - return fixupDate(dat, dt_format, time_zones, modifiers); + dat = fixupDate(dat, dt_format, time_zones, modifiers, &has_dt); + + if (had_dt != nullptr) { + *had_dt = has_dt; + } + + return dat; } QString EventComponent::title() const { diff --git a/src/librssguard/services/standard/parsers/icalparser.h b/src/librssguard/services/standard/parsers/icalparser.h index c71df525f..d4e134bb4 100644 --- a/src/librssguard/services/standard/parsers/icalparser.h +++ b/src/librssguard/services/standard/parsers/icalparser.h @@ -21,7 +21,8 @@ class IcalendarComponent { QDateTime fixupDate(QDateTime dat, const QString& dt_format, const QMap& time_zones, - const QString& modifiers) const; + const QString& modifiers, + bool* has_dt = nullptr) const; QVariantMap m_properties; }; @@ -30,8 +31,8 @@ Q_DECLARE_METATYPE(IcalendarComponent) class EventComponent : public IcalendarComponent { public: - QDateTime startsOn(const QMap& time_zones = {}) const; - QDateTime endsOn(const QMap& time_zones = {}) const; + QDateTime startsOn(const QMap& time_zones = {}, bool* had_dt = nullptr) const; + QDateTime endsOn(const QMap& time_zones = {}, bool* had_dt = nullptr) const; QString title() const; QString url() const; QString organizer() const;