File indexing completed on 2024-04-21 03:52:49

0001 /*
0002   This file is part of the kcalcore library.
0003 
0004   SPDX-FileCopyrightText: 2005-2007 David Jarvie <djarvie@kde.org>
0005 
0006   SPDX-License-Identifier: LGPL-2.0-or-later
0007 */
0008 #ifndef KCALCORE_ICALTIMEZONES_P_H
0009 #define KCALCORE_ICALTIMEZONES_P_H
0010 
0011 #include "incidencebase.h"
0012 #include "kcalendarcore_export.h"
0013 
0014 #include <QHash>
0015 #include <QList>
0016 #include <QTimeZone>
0017 
0018 #ifndef ICALCOMPONENT_H
0019 typedef struct icalcomponent_impl icalcomponent;
0020 #endif
0021 #ifndef ICALTIMEZONE_DEFINED
0022 #define ICALTIMEZONE_DEFINED
0023 typedef struct _icaltimezone icaltimezone;
0024 #endif
0025 
0026 namespace KCalendarCore
0027 {
0028 class ICalTimeZonePhase;
0029 
0030 class ICalTimeZonePhase
0031 {
0032 public:
0033     void dump();
0034 
0035     QSet<QByteArray> abbrevs; // abbreviations of the phase
0036     int utcOffset = 0; // UTC offset of the phase
0037     QList<QDateTime> transitions; // times on which transition into this phase occurs
0038 };
0039 
0040 class ICalTimeZone
0041 {
0042 public:
0043     void dump();
0044 
0045     QByteArray id; // original TZID
0046     QTimeZone qZone; // QTimeZone mapped from TZID
0047     ICalTimeZonePhase standard; // standard time
0048     ICalTimeZonePhase daylight; // DST time
0049 };
0050 
0051 class KCALENDARCORE_EXPORT ICalTimeZoneCache
0052 {
0053 public:
0054     explicit ICalTimeZoneCache();
0055 
0056     void insert(const QByteArray &id, const ICalTimeZone &tz);
0057 
0058     QTimeZone tzForTime(const QDateTime &dt, const QByteArray &tzid) const;
0059 
0060 private:
0061     QHash<QByteArray, ICalTimeZone> mCache;
0062 };
0063 
0064 using TimeZoneEarliestDate = QHash<QTimeZone, QDateTime>;
0065 
0066 class KCALENDARCORE_EXPORT ICalTimeZoneParser
0067 {
0068 public:
0069     explicit ICalTimeZoneParser(ICalTimeZoneCache *cache);
0070 
0071     void parse(icalcomponent *calendar);
0072 
0073     static void updateTzEarliestDate(const IncidenceBase::Ptr &incidence, TimeZoneEarliestDate *earliestDate);
0074 
0075     static icaltimezone *icaltimezoneFromQTimeZone(const QTimeZone &qtz, const QDateTime &earliest);
0076     static QByteArray vcaltimezoneFromQTimeZone(const QTimeZone &qtz, const QDateTime &earliest);
0077 
0078 private:
0079     static icalcomponent *icalcomponentFromQTimeZone(const QTimeZone &qtz, const QDateTime &earliest);
0080 
0081     ICalTimeZone parseTimeZone(icalcomponent *zone);
0082     bool parsePhase(icalcomponent *c, bool daylight, ICalTimeZonePhase &phase);
0083     QTimeZone resolveICalTimeZone(const ICalTimeZone &icalZone);
0084 
0085     ICalTimeZoneCache *mCache;
0086 };
0087 
0088 } // namespace KCalendarCore
0089 
0090 inline size_t qHash(const QTimeZone &tz, size_t seed = 0)
0091 {
0092     return qHash(tz.id(), seed);
0093 }
0094 
0095 #endif