summaryrefslogtreecommitdiffstats
path: root/src/corelib/tools/qtimezoneprivate_mac.mm
diff options
context:
space:
mode:
authorFrederik Gladhorn <frederik.gladhorn@digia.com>2013-11-26 22:30:27 +0100
committerFrederik Gladhorn <frederik.gladhorn@digia.com>2013-11-26 22:35:48 +0100
commit4a8273a6fc2e741e811cf5dabc9a3c240306cf7f (patch)
tree2148abc88f8543eecdc0b97b2dd92594836af9b2 /src/corelib/tools/qtimezoneprivate_mac.mm
parent036c5db468164297d213764c59a4b59daa76d90a (diff)
parent1c2be58fecaff1de5f2849192eb712984ebd59bd (diff)
Merge remote-tracking branch 'origin/stable' into dev
For the conflicts in msvc_nmake.cpp the ifdefs are extended since we need to support windows phone in the target branch while it is not there in the current stable branch (as of Qt 5.2). Conflicts: configure qmake/generators/win32/msvc_nmake.cpp src/3rdparty/angle/src/libEGL/Surface.cpp src/angle/src/common/common.pri src/corelib/global/qglobal.h src/corelib/io/qstandardpaths.cpp src/plugins/platforms/qnx/qqnxintegration.cpp src/plugins/platforms/qnx/qqnxscreeneventhandler.h src/plugins/platforms/xcb/qglxintegration.h src/widgets/kernel/win.pri tests/auto/corelib/thread/qreadwritelock/tst_qreadwritelock.cpp tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp tests/auto/gui/text/qtextdocument/tst_qtextdocument.cpp tools/configure/configureapp.cpp Change-Id: I00b579eefebaf61d26ab9b00046d2b5bd5958812
Diffstat (limited to 'src/corelib/tools/qtimezoneprivate_mac.mm')
-rw-r--r--src/corelib/tools/qtimezoneprivate_mac.mm57
1 files changed, 38 insertions, 19 deletions
diff --git a/src/corelib/tools/qtimezoneprivate_mac.mm b/src/corelib/tools/qtimezoneprivate_mac.mm
index 8d319aebbd..69d2c42d27 100644
--- a/src/corelib/tools/qtimezoneprivate_mac.mm
+++ b/src/corelib/tools/qtimezoneprivate_mac.mm
@@ -185,15 +185,14 @@ bool QMacTimeZonePrivate::isDaylightTime(qint64 atMSecsSinceEpoch) const
QTimeZonePrivate::Data QMacTimeZonePrivate::data(qint64 forMSecsSinceEpoch) const
{
const NSTimeInterval seconds = forMSecsSinceEpoch / 1000.0;
+ NSDate *date = [NSDate dateWithTimeIntervalSince1970:seconds];
Data data;
data.atMSecsSinceEpoch = forMSecsSinceEpoch;
- data.offsetFromUtc = [m_nstz secondsFromGMTForDate:
- [NSDate dateWithTimeIntervalSince1970:seconds]];
- data.daylightTimeOffset = [m_nstz daylightSavingTimeOffsetForDate:
- [NSDate dateWithTimeIntervalSince1970:seconds]];
+ data.offsetFromUtc = [m_nstz secondsFromGMTForDate:date];
+ data.daylightTimeOffset = [m_nstz daylightSavingTimeOffsetForDate:date];
data.standardTimeOffset = data.offsetFromUtc - data.daylightTimeOffset;
- data.abbreviation = QCFString::toQString([m_nstz abbreviationForDate:
- [NSDate dateWithTimeIntervalSince1970:seconds]]);
+ data.abbreviation = QCFString::toQString([m_nstz abbreviationForDate:date]);
+ [date release];
return data;
}
@@ -213,26 +212,46 @@ QTimeZonePrivate::Data QMacTimeZonePrivate::nextTransition(qint64 afterMSecsSinc
{
QTimeZonePrivate::Data tran;
const NSTimeInterval seconds = afterMSecsSinceEpoch / 1000.0;
- NSDate *date = [NSDate dateWithTimeIntervalSince1970:seconds];
- const NSDate *next = [m_nstz nextDaylightSavingTimeTransitionAfterDate:date];
- const NSTimeInterval nextSecs = [next timeIntervalSince1970];
+ NSDate *nextDate = [NSDate dateWithTimeIntervalSince1970:seconds];
+ nextDate = [m_nstz nextDaylightSavingTimeTransitionAfterDate:nextDate];
+ const NSTimeInterval nextSecs = [nextDate timeIntervalSince1970];
+ if (nextDate == nil || nextSecs <= seconds) {
+ [nextDate release];
+ return invalidData();
+ }
tran.atMSecsSinceEpoch = nextSecs * 1000;
- tran.offsetFromUtc = [m_nstz secondsFromGMTForDate:
- [NSDate dateWithTimeIntervalSince1970:nextSecs]];
- tran.daylightTimeOffset = [m_nstz daylightSavingTimeOffsetForDate:
- [NSDate dateWithTimeIntervalSince1970:nextSecs]];
+ tran.offsetFromUtc = [m_nstz secondsFromGMTForDate:nextDate];
+ tran.daylightTimeOffset = [m_nstz daylightSavingTimeOffsetForDate:nextDate];
tran.standardTimeOffset = tran.offsetFromUtc - tran.daylightTimeOffset;
- tran.abbreviation = QCFString::toQString([m_nstz abbreviationForDate:date]);
- [next release];
- [date release];
+ tran.abbreviation = QCFString::toQString([m_nstz abbreviationForDate:nextDate]);
+ [nextDate release];
return tran;
}
QTimeZonePrivate::Data QMacTimeZonePrivate::previousTransition(qint64 beforeMSecsSinceEpoch) const
{
- // TODO No direct Mac API, so get all transitions since epoch and return the last one
- // Probably slow, need to optimize
- return transitions(0, beforeMSecsSinceEpoch - 1).last();
+ // No direct Mac API, so get all transitions since epoch and return the last one
+ QList<int> secsList;
+ if (beforeMSecsSinceEpoch > 0) {
+ const int endSecs = beforeMSecsSinceEpoch / 1000.0;
+ NSTimeInterval prevSecs = 0;
+ NSTimeInterval nextSecs = 0;
+ NSDate *nextDate = [NSDate dateWithTimeIntervalSince1970:nextSecs];
+ // If invalid may return a nil date or an Epoch date
+ nextDate = [m_nstz nextDaylightSavingTimeTransitionAfterDate:nextDate];
+ nextSecs = [nextDate timeIntervalSince1970];
+ while (nextDate != nil && nextSecs > prevSecs && nextSecs < endSecs) {
+ secsList.append(nextSecs);
+ prevSecs = nextSecs;
+ nextDate = [m_nstz nextDaylightSavingTimeTransitionAfterDate:nextDate];
+ nextSecs = [nextDate timeIntervalSince1970];
+ }
+ [nextDate release];
+ }
+ if (secsList.size() >= 1)
+ return data(qint64(secsList.last()) * 1000);
+ else
+ return invalidData();
}
QByteArray QMacTimeZonePrivate::systemTimeZoneId() const