KCalendarCore

utils.cpp
1 /*
2  This file is part of the kcalcore library.
3 
4  SPDX-FileCopyrightText: 2017 Daniel Vrátil <[email protected]>
5 
6  SPDX-License-Identifier: LGPL-2.0-or-later
7 */
8 
9 #include "utils_p.h"
10 
11 #include <QDataStream>
12 #include <QTimeZone>
13 
14 // To remain backwards compatible we need to (de)serialize QDateTime the way KDateTime
15 // was (de)serialized
16 void KCalendarCore::serializeQDateTimeAsKDateTime(QDataStream &out, const QDateTime &dt)
17 {
18  out << dt.date() << dt.time();
19  switch (dt.timeSpec()) {
20  case Qt::UTC:
21  out << static_cast<quint8>('u');
22  break;
23  case Qt::OffsetFromUTC:
24  out << static_cast<quint8>('o') << dt.offsetFromUtc();
25  break;
26  case Qt::TimeZone:
27  serializeQTimeZoneAsSpec(out, dt.timeZone());
28  break;
29  case Qt::LocalTime:
30  out << static_cast<quint8>('c');
31  break;
32  }
33  const bool isDateOnly = dt.date().isValid() && !dt.time().isValid();
34  out << quint8(isDateOnly ? 0x01 : 0x00);
35 }
36 
37 void KCalendarCore::deserializeKDateTimeAsQDateTime(QDataStream &in, QDateTime &dt)
38 {
39  QDate date;
40  QTime time;
41  quint8 ts;
42  quint8 flags;
43 
44  in >> date >> time >> ts;
45  switch (static_cast<uchar>(ts)) {
46  case 'u':
47  dt = QDateTime(date, time, Qt::UTC);
48  break;
49  case 'o': {
50  int offset;
51  in >> offset;
52  dt = QDateTime(date, time, Qt::OffsetFromUTC, offset);
53  break;
54  }
55  case 'z': {
56  QString tzid;
57  in >> tzid;
58  dt = QDateTime(date, time, QTimeZone(tzid.toUtf8()));
59  break;
60  }
61  case 'c':
62  dt = QDateTime(date, time, Qt::LocalTime);
63  break;
64  }
65 
66  // unused, we don't have a special handling for date-only QDateTime
67  in >> flags;
68 }
69 
70 QDateTime KCalendarCore::deserializeKDateTimeAsQDateTime(QDataStream &in)
71 {
72  QDateTime dt;
73  QDate date;
74  QTime time;
75  quint8 ts;
76  quint8 flags;
77 
78  in >> date >> time >> ts;
79  switch (static_cast<uchar>(ts)) {
80  case 'u':
81  dt = QDateTime(date, time, Qt::UTC);
82  break;
83  case 'o': {
84  int offset;
85  in >> offset;
86  dt = QDateTime(date, time, Qt::OffsetFromUTC, offset);
87  break;
88  }
89  case 'z': {
90  QString tzid;
91  in >> tzid;
92  dt = QDateTime(date, time, QTimeZone(tzid.toUtf8()));
93  break;
94  }
95  case 'c':
96  dt = QDateTime(date, time, Qt::LocalTime);
97  break;
98  }
99 
100  // unused, we don't have a special handling for date-only QDateTime
101  in >> flags;
102 
103  return dt;
104 }
105 
106 void KCalendarCore::serializeQTimeZoneAsSpec(QDataStream &out, const QTimeZone &tz)
107 {
108  out << static_cast<quint8>('z') << (tz.isValid() ? QString::fromUtf8(tz.id()) : QString());
109 }
110 
111 void KCalendarCore::deserializeSpecAsQTimeZone(QDataStream &in, QTimeZone &tz)
112 {
113  quint8 ts;
114  in >> ts;
115  switch (static_cast<uchar>(ts)) {
116  case 'u':
117  tz = QTimeZone::utc();
118  return;
119  case 'o': {
120  int offset;
121  in >> offset;
122  tz = QTimeZone(offset);
123  return;
124  }
125  case 'z': {
126  QString tzid;
127  in >> tzid;
128  tz = QTimeZone(tzid.toUtf8());
129  return;
130  }
131  case 'c':
133  break;
134  }
135 }
136 
137 void KCalendarCore::serializeQDateTimeList(QDataStream &out, const QList<QDateTime> &list)
138 {
139  out << (qint32)list.size();
140  for (const auto &i : list) {
141  serializeQDateTimeAsKDateTime(out, i);
142  }
143 }
144 
145 void KCalendarCore::deserializeQDateTimeList(QDataStream &in, QList<QDateTime> &list)
146 {
147  int size;
148  in >> size;
149  list.clear();
150  list.reserve(size);
151  for (int i = 0; i < size; ++i) {
152  QDateTime dt;
153  deserializeKDateTimeAsQDateTime(in, dt);
154  list << dt;
155  }
156 }
QTimeZone utc()
QTimeZone timeZone() const const
QString fromUtf8(const char *str, int size)
QTime time() const const
bool isValid() const const
KIOFILEWIDGETS_EXPORT QStringList list(const QString &fileClass)
void reserve(int alloc)
int size() const const
bool isValid() const const
QByteArray id() const const
bool isValid() const const
int offsetFromUtc() const const
Qt::TimeSpec timeSpec() const const
QTimeZone systemTimeZone()
QDate date() const const
void clear()
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Thu Sep 28 2023 03:53:12 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.