Revision control

++ // Copyright (C) 2022 The Qt Company Ltd.
++ // Copyright (C) 2016 Intel Corporation.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
++ // Qt-Security score:significant reason:default
++
++ #ifndef QDATETIME_P_H
++ #define QDATETIME_P_H
++
++ //
++ // W A R N I N G
++ // -------------
++ //
++ // This file is not part of the Qt API. It exists purely as an
++ // implementation detail. This header file may change from version to
++ // version without notice, or even be removed.
++ //
++ // We mean it.
++ //
++
++ #include <QtCore/private/qglobal_p.h>
++ #include "qplatformdefs.h"
++ #include "QtCore/qatomic.h"
++ #include "QtCore/qdatetime.h"
++ #include "QtCore/qshareddata.h"
++ #include "QtCore/qtimezone.h"
++
++ #if QT_CONFIG(timezone)
++ #include "qtimezone.h"
++ #endif
++
++ #include <chrono>
++
++ QT_BEGIN_NAMESPACE
++
++ class QDateTimePrivate : public QSharedData
++ {
++ public:
++ // forward the declarations from QDateTime (this makes them public)
++ typedef QDateTime::ShortData QDateTimeShortData;
++ typedef QDateTime::Data QDateTimeData;
++
++ // Never change or delete this enum, it is required for backwards compatible
++ // serialization of QDateTime before 5.2, so is essentially public API
++ enum Spec {
++ LocalUnknown = -1,
++ LocalStandard = 0,
++ LocalDST = 1,
++ UTC = 2,
++ OffsetFromUTC = 3,
++ TimeZone = 4
++ };
++
++ // Daylight Time Status
++ enum DaylightStatus {
++ UnknownDaylightTime = -1,
++ StandardTime = 0,
++ DaylightTime = 1
++ };
++
++ // Status of date/time
++ enum StatusFlag {
++ ShortData = 0x01,
++
++ ValidDate = 0x02,
++ ValidTime = 0x04,
++ ValidDateTime = 0x08,
++
++ TimeSpecMask = 0x30,
++
++ SetToStandardTime = 0x40,
++ SetToDaylightTime = 0x80,
++ ValidityMask = ValidDate | ValidTime | ValidDateTime,
++ DaylightMask = SetToStandardTime | SetToDaylightTime,
++ };
++ Q_DECLARE_FLAGS(StatusFlags, StatusFlag)
++
++
++ enum TransitionOption {
++ // Handling of a spring-forward (or other gap):
++ GapUseBefore = 2,
++ GapUseAfter = 4,
++ // Handling of a fall-back (or other repeated period):
++ FoldUseBefore = 0x20,
++ FoldUseAfter = 0x40,
++ // Quirk for negative DST:
++ FlipForReverseDst = 0x400,
++
++ GapMask = GapUseBefore | GapUseAfter,
++ FoldMask = FoldUseBefore | FoldUseAfter,
++ };
++ Q_DECLARE_FLAGS(TransitionOptions, TransitionOption)
++
++ enum {
++ TimeSpecShift = 4,
++ };
++
++ struct ZoneState {
++ qint64 when; // ms after zone/local 1970 start; may be revised from the input time.
++ int offset = 0; // seconds
++ DaylightStatus dst = UnknownDaylightTime;
++ // Other fields are set, if possible, even when valid is false due to spring-forward.
++ bool valid = false;
++
++ ZoneState(qint64 local) : when(local) {}
++ ZoneState(qint64 w, int o, DaylightStatus d, bool v = true)
++ : when(w), offset(o), dst(d), valid(v) {}
++ };
++
++ static QDateTime::Data create(QDate toDate, QTime toTime, const QTimeZone &timeZone,
++ QDateTime::TransitionResolution resolve);
++ #if QT_CONFIG(timezone)
++ static ZoneState zoneStateAtMillis(const QTimeZone &zone, qint64 millis,
++ TransitionOptions resolve);
++ #endif // timezone
++
++ static ZoneState expressUtcAsLocal(qint64 utcMSecs);
++
++ static ZoneState localStateAtMillis(qint64 millis, TransitionOptions resolve);
++ static QString localNameAtMillis(qint64 millis, DaylightStatus dst); // empty if unknown
++
++ StatusFlags m_status = StatusFlag(Qt::LocalTime << TimeSpecShift);
++ qint64 m_msecs = 0;
++ int m_offsetFromUtc = 0;
++ QTimeZone m_timeZone;
++ };
++
++ Q_DECLARE_OPERATORS_FOR_FLAGS(QDateTimePrivate::StatusFlags)
++ Q_DECLARE_OPERATORS_FOR_FLAGS(QDateTimePrivate::TransitionOptions)
++
++ namespace QtPrivate {
++ namespace DateTimeConstants {
++ using namespace std::chrono;
++ inline
++ constexpr qint64 SECS_PER_MIN = minutes::period::num;
++ inline
++ constexpr qint64 SECS_PER_HOUR = hours::period::num;
++ inline
++ constexpr qint64 SECS_PER_DAY = SECS_PER_HOUR * 24; // std::chrono::days is C++20
++
++ inline
++ constexpr qint64 MINS_PER_HOUR = std::ratio_divide<hours::period, minutes::period>::num;
++
++ inline
++ constexpr qint64 MSECS_PER_SEC = milliseconds::period::den;
++ inline
++ constexpr qint64 MSECS_PER_MIN = SECS_PER_MIN * MSECS_PER_SEC;
++ inline
++ constexpr qint64 MSECS_PER_HOUR = SECS_PER_HOUR * MSECS_PER_SEC;
++ inline
++ constexpr qint64 MSECS_PER_DAY = SECS_PER_DAY * MSECS_PER_SEC;
++
++ inline
++ constexpr qint64 JULIAN_DAY_FOR_EPOCH = 2440588; // result of QDate(1970, 1, 1).toJulianDay()
++
++ inline
++ constexpr qint64 JulianDayMax = Q_INT64_C( 784354017364);
++ inline
++ constexpr qint64 JulianDayMin = Q_INT64_C(-784350574879);
++ }
++ }
++
++ QT_END_NAMESPACE
++
++ #endif // QDATETIME_P_H