Absolute File Name: | /home/qt/qt5_coco/qt5/qtbase/src/corelib/tools/qtimezoneprivate_icu.cpp |
Switch to Source code | Preprocessed file |
Line | Source | Count | ||||||
---|---|---|---|---|---|---|---|---|
1 | - | |||||||
2 | - | |||||||
3 | - | |||||||
4 | - | |||||||
5 | - | |||||||
6 | - | |||||||
7 | - | |||||||
8 | static 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 | - | |||||||
29 | static 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 | - | |||||||
55 | static 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 | - | |||||||
93 | static 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 | } | - | ||||||
131 | static 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 | - | |||||||
149 | static 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 | - | |||||||
160 | QIcuTimeZonePrivate::QIcuTimeZonePrivate() | - | ||||||
161 | : m_ucal(0) | - | ||||||
162 | { | - | ||||||
163 | - | |||||||
164 | init(ucalDefaultTimeZoneId()); | - | ||||||
165 | } | - | ||||||
166 | - | |||||||
167 | - | |||||||
168 | QIcuTimeZonePrivate::QIcuTimeZonePrivate(const QByteArray &ianaId) | - | ||||||
169 | : m_ucal(0) | - | ||||||
170 | { | - | ||||||
171 | - | |||||||
172 | if (availableTimeZoneIds().contains(ianaId)) | - | ||||||
173 | init(ianaId); | - | ||||||
174 | } | - | ||||||
175 | - | |||||||
176 | QIcuTimeZonePrivate::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 | - | |||||||
188 | QIcuTimeZonePrivate::~QIcuTimeZonePrivate() | - | ||||||
189 | { | - | ||||||
190 | ucal_close_52(m_ucal); | - | ||||||
191 | } | - | ||||||
192 | - | |||||||
193 | QTimeZonePrivate *QIcuTimeZonePrivate::clone() | - | ||||||
194 | { | - | ||||||
195 | return new QIcuTimeZonePrivate(*this); | - | ||||||
196 | } | - | ||||||
197 | - | |||||||
198 | void 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 | - | |||||||
214 | QString QIcuTimeZonePrivate::displayName(QTimeZone::TimeType timeType, | - | ||||||
215 | QTimeZone::NameType nameType, | - | ||||||
216 | const QLocale &locale) const | - | ||||||
217 | { | - | ||||||
218 | - | |||||||
219 | if (nameType == QTimeZone::OffsetName
| 0-1237 | ||||||
220 | const Data nowData = data(QDateTime::currentDateTimeUtc().toMSecsSinceEpochcurrentMSecsSinceEpoch()); | - | ||||||
221 | - | |||||||
222 | - | |||||||
223 | if (timeType == QTimeZone::DaylightTime
| 0 | ||||||
224 | return never executed: isoOffsetFormat(nowData.standardTimeOffset + ucalDaylightOffset(m_id));return isoOffsetFormat(nowData.standardTimeOffset + ucalDaylightOffset(m_id)); never executed: return isoOffsetFormat(nowData.standardTimeOffset + ucalDaylightOffset(m_id)); | 0 | ||||||
225 | else | - | ||||||
226 | return never executed: isoOffsetFormat(nowData.standardTimeOffset);return isoOffsetFormat(nowData.standardTimeOffset); never executed: return isoOffsetFormat(nowData.standardTimeOffset); | 0 | ||||||
227 | } | - | ||||||
228 | return executed 1237 times by 1 test: ucalTimeZoneDisplayName(m_ucal, timeType, nameType, locale.name());return ucalTimeZoneDisplayName(m_ucal, timeType, nameType, locale.name()); Executed by:
executed 1237 times by 1 test: return ucalTimeZoneDisplayName(m_ucal, timeType, nameType, locale.name()); Executed by:
| 1237 | ||||||
229 | } | - | ||||||
230 | - | |||||||
231 | QString 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 | - | |||||||
240 | int 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 | - | |||||||
248 | int 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 | - | |||||||
256 | int 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 | - | |||||||
264 | bool QIcuTimeZonePrivate::hasDaylightTime() const | - | ||||||
265 | { | - | ||||||
266 | - | |||||||
267 | return (ucalDaylightOffset(m_id) != 0); | - | ||||||
268 | } | - | ||||||
269 | - | |||||||
270 | bool 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 | - | |||||||
292 | QTimeZonePrivate::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 | - | |||||||
310 | bool QIcuTimeZonePrivate::hasTransitions() const | - | ||||||
311 | { | - | ||||||
312 | - | |||||||
313 | - | |||||||
314 | - | |||||||
315 | - | |||||||
316 | - | |||||||
317 | return false; | - | ||||||
318 | - | |||||||
319 | } | - | ||||||
320 | - | |||||||
321 | QTimeZonePrivate::Data QIcuTimeZonePrivate::nextTransition(qint64 afterMSecsSinceEpoch) const | - | ||||||
322 | { | - | ||||||
323 | - | |||||||
324 | - | |||||||
325 | - | |||||||
326 | - | |||||||
327 | - | |||||||
328 | (void)afterMSecsSinceEpoch; | - | ||||||
329 | return invalidData(); | - | ||||||
330 | - | |||||||
331 | } | - | ||||||
332 | - | |||||||
333 | QTimeZonePrivate::Data QIcuTimeZonePrivate::previousTransition(qint64 beforeMSecsSinceEpoch) const | - | ||||||
334 | { | - | ||||||
335 | - | |||||||
336 | - | |||||||
337 | - | |||||||
338 | - | |||||||
339 | - | |||||||
340 | (void)beforeMSecsSinceEpoch; | - | ||||||
341 | return invalidData(); | - | ||||||
342 | - | |||||||
343 | } | - | ||||||
344 | - | |||||||
345 | QByteArray QIcuTimeZonePrivate::systemTimeZoneId() const | - | ||||||
346 | { | - | ||||||
347 | - | |||||||
348 | - | |||||||
349 | return ucalDefaultTimeZoneId(); | - | ||||||
350 | } | - | ||||||
351 | - | |||||||
352 | QList<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 | - | |||||||
363 | QList<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 | - | |||||||
375 | QList<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 code | Preprocessed file |