| 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 |