qtimezoneprivate_icu.cpp

Absolute File Name:/home/qt/qt5_coco/qt5/qtbase/src/corelib/tools/qtimezoneprivate_icu.cpp
Switch to Source codePreprocessed file
LineSourceCount
1-
2-
3-
4-
5-
6-
7-
8static UCalendarDisplayNameType ucalDisplayNameType(QTimeZone::TimeType timeType, QTimeZone::NameType nameType)-
9{-
10-
11 switch (nameType) {-
12 case QTimeZone::ShortName :-
13 case QTimeZone::OffsetName :-
14 if (timeType == QTimeZone::DaylightTime)-
15 return UCAL_SHORT_DST;-
16-
17 return UCAL_SHORT_STANDARD;-
18 case QTimeZone::DefaultName :-
19 case QTimeZone::LongName :-
20 if (timeType == QTimeZone::DaylightTime)-
21 return UCAL_DST;-
22-
23 return UCAL_STANDARD;-
24 }-
25 return UCAL_STANDARD;-
26}-
27-
28-
29static QByteArray ucalDefaultTimeZoneId()-
30{-
31 int32_t size = 30;-
32 QString result(size, Qt::Uninitialized);-
33 UErrorCode status = U_ZERO_ERROR;-
34-
35-
36 size = ucal_getDefaultTimeZone_52(reinterpret_cast<UChar *>(result.data()), size, &status);-
37-
38-
39 if (status == U_BUFFER_OVERFLOW_ERROR) {-
40 result.resize(size);-
41 status = U_ZERO_ERROR;-
42 size = ucal_getDefaultTimeZone_52(reinterpret_cast<UChar *>(result.data()), size, &status);-
43 }-
44-
45-
46 if (U_SUCCESS(status)) {-
47 result.resize(size);-
48 return result.toUtf8();-
49 }-
50-
51 return QByteArray();-
52}-
53-
54-
55static QString ucalTimeZoneDisplayName(UCalendar *ucal, QTimeZone::TimeType timeType,-
56 QTimeZone::NameType nameType,-
57 const QString &localeCode)-
58{-
59 int32_t size = 50;-
60 QString result(size, Qt::Uninitialized);-
61 UErrorCode status = U_ZERO_ERROR;-
62-
63-
64 size = ucal_getTimeZoneDisplayName_52(ucal,-
65 ucalDisplayNameType(timeType, nameType),-
66 localeCode.toUtf8(),-
67 reinterpret_cast<UChar *>(result.data()),-
68 size,-
69 &status);-
70-
71-
72 if (status == U_BUFFER_OVERFLOW_ERROR) {-
73 result.resize(size);-
74 status = U_ZERO_ERROR;-
75 size = ucal_getTimeZoneDisplayName_52(ucal,-
76 ucalDisplayNameType(timeType, nameType),-
77 localeCode.toUtf8(),-
78 reinterpret_cast<UChar *>(result.data()),-
79 size,-
80 &status);-
81 }-
82-
83-
84 if (U_SUCCESS(status)) {-
85 result.resize(size);-
86 return result;-
87 }-
88-
89 return QString();-
90}-
91-
92-
93static bool ucalOffsetsAtTime(UCalendar *m_ucal, qint64 atMSecsSinceEpoch,-
94 int *utcOffset, int *dstOffset)-
95{-
96 *utcOffset = 0;-
97 *dstOffset = 0;-
98-
99-
100 UErrorCode status = U_ZERO_ERROR;-
101 UCalendar *ucal = ucal_clone_52(m_ucal, &status);-
102 if (!U_SUCCESS(status))-
103 return false;-
104-
105-
106 status = U_ZERO_ERROR;-
107 ucal_setMillis_52(ucal, atMSecsSinceEpoch, &status);-
108-
109 int32_t utc = 0;-
110 if (U_SUCCESS(status)) {-
111 status = U_ZERO_ERROR;-
112-
113 utc = ucal_get_52(ucal, UCAL_ZONE_OFFSET, &status) / 1000;-
114 }-
115-
116 int32_t dst = 0;-
117 if (U_SUCCESS(status)) {-
118 status = U_ZERO_ERROR;-
119-
120 dst = ucal_get_52(ucal, UCAL_DST_OFFSET, &status) / 1000;-
121 }-
122-
123 ucal_close_52(ucal);-
124 if (U_SUCCESS(status)) {-
125 *utcOffset = utc;-
126 *dstOffset = dst;-
127 return true;-
128 }-
129 return false;-
130}-
131static QList<QByteArray> uenumToIdList(UEnumeration *uenum)-
132{-
133 QList<QByteArray> list;-
134 int32_t size = 0;-
135 UErrorCode status = U_ZERO_ERROR;-
136-
137 QByteArray result = uenum_next_52(uenum, &size, &status);-
138 while (U_SUCCESS(status) && !result.isEmpty()) {-
139 list << result;-
140 status = U_ZERO_ERROR;-
141 result = uenum_next_52(uenum, &size, &status);-
142 }-
143 std::sort(list.begin(), list.end());-
144 list.erase(std::unique(list.begin(), list.end()), list.end());-
145 return list;-
146}-
147-
148-
149static int ucalDaylightOffset(const QByteArray &id)-
150{-
151 UErrorCode status = U_ZERO_ERROR;-
152 const int32_t dstMSecs = ucal_getDSTSavings_52(reinterpret_cast<const UChar *>(id.data()), &status);-
153 if (U_SUCCESS(status))-
154 return (dstMSecs / 1000);-
155 else-
156 return 0;-
157}-
158-
159-
160QIcuTimeZonePrivate::QIcuTimeZonePrivate()-
161 : m_ucal(0)-
162{-
163-
164 init(ucalDefaultTimeZoneId());-
165}-
166-
167-
168QIcuTimeZonePrivate::QIcuTimeZonePrivate(const QByteArray &ianaId)-
169 : m_ucal(0)-
170{-
171-
172 if (availableTimeZoneIds().contains(ianaId))-
173 init(ianaId);-
174}-
175-
176QIcuTimeZonePrivate::QIcuTimeZonePrivate(const QIcuTimeZonePrivate &other)-
177 : QTimeZonePrivate(other), m_ucal(0)-
178{-
179-
180 UErrorCode status = U_ZERO_ERROR;-
181 m_ucal = ucal_clone_52(other.m_ucal, &status);-
182 if (!U_SUCCESS(status)) {-
183 m_id.clear();-
184 m_ucal = 0;-
185 }-
186}-
187-
188QIcuTimeZonePrivate::~QIcuTimeZonePrivate()-
189{-
190 ucal_close_52(m_ucal);-
191}-
192-
193QTimeZonePrivate *QIcuTimeZonePrivate::clone()-
194{-
195 return new QIcuTimeZonePrivate(*this);-
196}-
197-
198void QIcuTimeZonePrivate::init(const QByteArray &ianaId)-
199{-
200 m_id = ianaId;-
201-
202 const QString id = QString::fromUtf8(m_id);-
203 UErrorCode status = U_ZERO_ERROR;-
204-
205 m_ucal = ucal_open_52(reinterpret_cast<const UChar *>(id.data()), id.size(),-
206 QLocale().name().toUtf8(), UCAL_GREGORIAN, &status);-
207-
208 if (!U_SUCCESS(status)) {-
209 m_id.clear();-
210 m_ucal = 0;-
211 }-
212}-
213-
214QString QIcuTimeZonePrivate::displayName(QTimeZone::TimeType timeType,-
215 QTimeZone::NameType nameType,-
216 const QLocale &locale) const-
217{-
218-
219 if (nameType == QTimeZone::OffsetName
nameType == QT...ne::OffsetNameDescription
TRUEnever evaluated
FALSEevaluated 1237 times by 1 test
Evaluated by:
  • tst_QTimeZone
) {
0-1237
220 const Data nowData = data(QDateTime::currentDateTimeUtc().toMSecsSinceEpochcurrentMSecsSinceEpoch());-
221-
222-
223 if (timeType == QTimeZone::DaylightTime
timeType == QT...::DaylightTimeDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
224 return
never executed: return isoOffsetFormat(nowData.standardTimeOffset + ucalDaylightOffset(m_id));
isoOffsetFormat(nowData.standardTimeOffset + ucalDaylightOffset(m_id));
never executed: return isoOffsetFormat(nowData.standardTimeOffset + ucalDaylightOffset(m_id));
0
225 else-
226 return
never executed: return isoOffsetFormat(nowData.standardTimeOffset);
isoOffsetFormat(nowData.standardTimeOffset);
never executed: return isoOffsetFormat(nowData.standardTimeOffset);
0
227 }-
228 return
executed 1237 times by 1 test: return ucalTimeZoneDisplayName(m_ucal, timeType, nameType, locale.name());
Executed by:
  • tst_QTimeZone
ucalTimeZoneDisplayName(m_ucal, timeType, nameType, locale.name());
executed 1237 times by 1 test: return ucalTimeZoneDisplayName(m_ucal, timeType, nameType, locale.name());
Executed by:
  • tst_QTimeZone
1237
229}-
230-
231QString QIcuTimeZonePrivate::abbreviation(qint64 atMSecsSinceEpoch) const-
232{-
233-
234 if (isDaylightTime(atMSecsSinceEpoch))-
235 return displayName(QTimeZone::DaylightTime, QTimeZone::ShortName, QString());-
236 else-
237 return displayName(QTimeZone::StandardTime, QTimeZone::ShortName, QString());-
238}-
239-
240int QIcuTimeZonePrivate::offsetFromUtc(qint64 atMSecsSinceEpoch) const-
241{-
242 int stdOffset = 0;-
243 int dstOffset = 0;-
244 ucalOffsetsAtTime(m_ucal, atMSecsSinceEpoch, &stdOffset, & dstOffset);-
245 return stdOffset + dstOffset;-
246}-
247-
248int QIcuTimeZonePrivate::standardTimeOffset(qint64 atMSecsSinceEpoch) const-
249{-
250 int stdOffset = 0;-
251 int dstOffset = 0;-
252 ucalOffsetsAtTime(m_ucal, atMSecsSinceEpoch, &stdOffset, & dstOffset);-
253 return stdOffset;-
254}-
255-
256int QIcuTimeZonePrivate::daylightTimeOffset(qint64 atMSecsSinceEpoch) const-
257{-
258 int stdOffset = 0;-
259 int dstOffset = 0;-
260 ucalOffsetsAtTime(m_ucal, atMSecsSinceEpoch, &stdOffset, & dstOffset);-
261 return dstOffset;-
262}-
263-
264bool QIcuTimeZonePrivate::hasDaylightTime() const-
265{-
266-
267 return (ucalDaylightOffset(m_id) != 0);-
268}-
269-
270bool QIcuTimeZonePrivate::isDaylightTime(qint64 atMSecsSinceEpoch) const-
271{-
272-
273 UErrorCode status = U_ZERO_ERROR;-
274 UCalendar *ucal = ucal_clone_52(m_ucal, &status);-
275 if (!U_SUCCESS(status))-
276 return false;-
277-
278-
279 status = U_ZERO_ERROR;-
280 ucal_setMillis_52(ucal, atMSecsSinceEpoch, &status);-
281-
282 bool result = false;-
283 if (U_SUCCESS(status)) {-
284 status = U_ZERO_ERROR;-
285 result = ucal_inDaylightTime_52(ucal, &status);-
286 }-
287-
288 ucal_close_52(ucal);-
289 return result;-
290}-
291-
292QTimeZonePrivate::Data QIcuTimeZonePrivate::data(qint64 forMSecsSinceEpoch) const-
293{-
294-
295-
296 QTimeZonePrivate::Data data = invalidData();-
297-
298-
299-
300-
301 ucalOffsetsAtTime(m_ucal, forMSecsSinceEpoch, &data.standardTimeOffset,-
302 &data.daylightTimeOffset);-
303 data.offsetFromUtc = data.standardTimeOffset + data.daylightTimeOffset;-
304 data.abbreviation = abbreviation(forMSecsSinceEpoch);-
305-
306 data.atMSecsSinceEpoch = forMSecsSinceEpoch;-
307 return data;-
308}-
309-
310bool QIcuTimeZonePrivate::hasTransitions() const-
311{-
312-
313-
314-
315-
316-
317 return false;-
318-
319}-
320-
321QTimeZonePrivate::Data QIcuTimeZonePrivate::nextTransition(qint64 afterMSecsSinceEpoch) const-
322{-
323-
324-
325-
326-
327-
328 (void)afterMSecsSinceEpoch;-
329 return invalidData();-
330-
331}-
332-
333QTimeZonePrivate::Data QIcuTimeZonePrivate::previousTransition(qint64 beforeMSecsSinceEpoch) const-
334{-
335-
336-
337-
338-
339-
340 (void)beforeMSecsSinceEpoch;-
341 return invalidData();-
342-
343}-
344-
345QByteArray QIcuTimeZonePrivate::systemTimeZoneId() const-
346{-
347-
348-
349 return ucalDefaultTimeZoneId();-
350}-
351-
352QList<QByteArray> QIcuTimeZonePrivate::availableTimeZoneIds() const-
353{-
354 UErrorCode status = U_ZERO_ERROR;-
355 UEnumeration *uenum = ucal_openTimeZones_52(&status);-
356 QList<QByteArray> result;-
357 if (U_SUCCESS(status))-
358 result = uenumToIdList(uenum);-
359 uenum_close_52(uenum);-
360 return result;-
361}-
362-
363QList<QByteArray> QIcuTimeZonePrivate::availableTimeZoneIds(QLocale::Country country) const-
364{-
365 QByteArray regionCode = QLocalePrivate::countryToCode(country).toUtf8();-
366 UErrorCode status = U_ZERO_ERROR;-
367 UEnumeration *uenum = ucal_openCountryTimeZones_52(regionCode, &status);-
368 QList<QByteArray> result;-
369 if (U_SUCCESS(status))-
370 result = uenumToIdList(uenum);-
371 uenum_close_52(uenum);-
372 return result;-
373}-
374-
375QList<QByteArray> QIcuTimeZonePrivate::availableTimeZoneIds(int offsetFromUtc) const-
376{-
377-
378-
379 UErrorCode status = U_ZERO_ERROR;-
380 UEnumeration *uenum = ucal_openTimeZoneIDEnumeration_52(UCAL_ZONE_TYPE_ANY, 0,-
381 &offsetFromUtc, &status);-
382 QList<QByteArray> result;-
383 if (U_SUCCESS(status))-
384 result = uenumToIdList(uenum);-
385 uenum_close_52(uenum);-
386 return result;-
387-
388-
389-
390}-
391-
392-
Switch to Source codePreprocessed file

Generated by Squish Coco Non-Commercial 4.3.0-BETA-master-30-08-2018-4cb69e9