diff -Nru qtorganizer5-eds-0.1.1+14.04.20140307.1/debian/changelog qtorganizer5-eds-0.1.1+14.04.20140403.1/debian/changelog --- qtorganizer5-eds-0.1.1+14.04.20140307.1/debian/changelog 2014-04-04 13:51:13.000000000 +0000 +++ qtorganizer5-eds-0.1.1+14.04.20140403.1/debian/changelog 2014-04-04 13:51:13.000000000 +0000 @@ -1,3 +1,13 @@ +qtorganizer5-eds (0.1.1+14.04.20140403.1-0ubuntu1) trusty; urgency=low + + [ Ubuntu daily release ] + * New rebuild forced + + [ Renato Araujo Oliveira Filho ] + * Initial implementation of time zone support. (LP: #1267814) + + -- Ubuntu daily release Thu, 03 Apr 2014 21:23:15 +0000 + qtorganizer5-eds (0.1.1+14.04.20140307.1-0ubuntu1) trusty; urgency=low * New rebuild forced diff -Nru qtorganizer5-eds-0.1.1+14.04.20140307.1/qorganizer/qorganizer-eds-engine.cpp qtorganizer5-eds-0.1.1+14.04.20140403.1/qorganizer/qorganizer-eds-engine.cpp --- qtorganizer5-eds-0.1.1+14.04.20140307.1/qorganizer/qorganizer-eds-engine.cpp 2014-03-07 07:02:36.000000000 +0000 +++ qtorganizer5-eds-0.1.1+14.04.20140403.1/qorganizer/qorganizer-eds-engine.cpp 2014-04-03 21:23:07.000000000 +0000 @@ -34,9 +34,8 @@ #include #include -#include -#include #include +#include #include #include @@ -1094,10 +1093,37 @@ change->emitSignals(this); } -QDateTime QOrganizerEDSEngine::fromIcalTime(struct icaltimetype value) +QDateTime QOrganizerEDSEngine::fromIcalTime(struct icaltimetype value, const char *tzId) { - uint tmTime = icaltime_as_timet(value); - return QDateTime::fromTime_t(tmTime); + uint tmTime; + + if (tzId) { + QByteArray tzName(tzId); + // keep only the timezone name. + tzName = tzName.replace("/freeassociation.sourceforge.net/Tzfile/", ""); + const icaltimezone *timezone = const_cast(icaltimezone_get_builtin_timezone(tzName.constData())); + tmTime = icaltime_as_timet_with_zone(value, timezone); + return QDateTime::fromTime_t(tmTime, QTimeZone(tzId)); + } else { + tmTime = icaltime_as_timet(value); + return QDateTime::fromTime_t(tmTime); + } +} + +icaltimetype QOrganizerEDSEngine::fromQDateTime(const QDateTime &dateTime, + bool allDay, + QByteArray *tzId) +{ + + if (dateTime.timeSpec() == Qt::TimeZone) { + const icaltimezone *timezone = 0; + *tzId = dateTime.timeZone().id(); + timezone = const_cast(icaltimezone_get_builtin_timezone(tzId->constData())); + return icaltime_from_timet_with_zone(dateTime.toTime_t(), allDay, timezone); + } else { + return icaltime_from_timet(dateTime.toTime_t(), allDay); + } + } void QOrganizerEDSEngine::parseStartTime(ECalComponent *comp, QOrganizerItem *item) @@ -1106,7 +1132,7 @@ e_cal_component_get_dtstart(comp, dt); if (dt->value) { QOrganizerEventTime etr = item->detail(QOrganizerItemDetail::TypeEventTime); - etr.setStartDateTime(fromIcalTime(*dt->value)); + etr.setStartDateTime(fromIcalTime(*dt->value, dt->tzid)); if (icaltime_is_date(*dt->value) != etr.isAllDay()) { etr.setAllDay(icaltime_is_date(*dt->value)); } @@ -1121,7 +1147,7 @@ e_cal_component_get_dtstart(comp, dt); if (dt->value) { QOrganizerTodoTime etr = item->detail(QOrganizerItemDetail::TypeTodoTime); - etr.setStartDateTime(fromIcalTime(*dt->value)); + etr.setStartDateTime(fromIcalTime(*dt->value, dt->tzid)); if (icaltime_is_date(*dt->value) != etr.isAllDay()) { etr.setAllDay(icaltime_is_date(*dt->value)); } @@ -1136,7 +1162,7 @@ e_cal_component_get_dtend(comp, dt); if (dt->value) { QOrganizerEventTime etr = item->detail(QOrganizerItemDetail::TypeEventTime); - etr.setEndDateTime(fromIcalTime(*dt->value)); + etr.setEndDateTime(fromIcalTime(*dt->value, dt->tzid)); if (icaltime_is_date(*dt->value) != etr.isAllDay()) { etr.setAllDay(icaltime_is_date(*dt->value)); } @@ -1217,7 +1243,7 @@ e_cal_component_get_rdate_list(comp, &periodList); for(GSList *i = periodList; i != 0; i = i->next) { ECalComponentPeriod *period = (ECalComponentPeriod*) i->data; - QDateTime dt = fromIcalTime(period->start); + QDateTime dt = fromIcalTime(period->start, 0); dates.insert(dt.date()); //TODO: period.end, period.duration } @@ -1235,7 +1261,7 @@ e_cal_component_get_exdate_list(comp, &exdateList); for(GSList *i = exdateList; i != 0; i = i->next) { ECalComponentDateTime* dateTime = (ECalComponentDateTime*) i->data; - QDateTime dt = fromIcalTime(*dateTime->value); + QDateTime dt = fromIcalTime(*dateTime->value, dateTime->tzid); dates.insert(dt.date()); } e_cal_component_free_exdate_list(exdateList); @@ -1280,7 +1306,7 @@ if (rule->count > 0) { qRule.setLimit(rule->count); } else { - QDateTime dt = fromIcalTime(rule->until); + QDateTime dt = fromIcalTime(rule->until, 0); if (dt.isValid()) { qRule.setLimit(dt.date()); } else { @@ -1346,7 +1372,7 @@ e_cal_component_get_due(comp, &due); if (due.value) { QOrganizerTodoTime ttr = item->detail(QOrganizerItemDetail::TypeTodoTime); - ttr.setDueDateTime(fromIcalTime(*due.value)); + ttr.setDueDateTime(fromIcalTime(*due.value, due.tzid)); if (icaltime_is_date(*due.value) != ttr.isAllDay()) { ttr.setAllDay(icaltime_is_date(*due.value)); } @@ -1488,7 +1514,7 @@ e_cal_component_get_dtstart(comp, &dt); if (dt.value) { QOrganizerJournalTime jtime; - jtime.setEntryDateTime(fromIcalTime(*dt.value)); + jtime.setEntryDateTime(fromIcalTime(*dt.value, dt.tzid)); journal->saveDetail(&jtime); } e_cal_component_free_datetime(&dt); @@ -1692,9 +1718,10 @@ { QOrganizerEventTime etr = item.detail(QOrganizerItemDetail::TypeEventTime); if (!etr.isEmpty()) { - struct icaltimetype ict = icaltime_from_timet(etr.startDateTime().toTime_t(), etr.isAllDay()); + QByteArray tzId; + struct icaltimetype ict = fromQDateTime(etr.startDateTime(), etr.isAllDay(), &tzId); ECalComponentDateTime dt; - dt.tzid = NULL; + dt.tzid = tzId.isEmpty() ? NULL : tzId.constData(); dt.value = &ict; e_cal_component_set_dtstart(comp, &dt); } @@ -1704,9 +1731,10 @@ { QOrganizerEventTime etr = item.detail(QOrganizerItemDetail::TypeEventTime); if (!etr.isEmpty()) { - struct icaltimetype ict = icaltime_from_timet(etr.endDateTime().toTime_t(), etr.isAllDay()); + QByteArray tzId; + struct icaltimetype ict = fromQDateTime(etr.endDateTime(), etr.isAllDay(), &tzId); ECalComponentDateTime dt; - dt.tzid = NULL; + dt.tzid = tzId.isEmpty() ? NULL : tzId.constData(); dt.value = &ict; e_cal_component_set_dtend(comp, &dt); } @@ -1716,9 +1744,10 @@ { QOrganizerTodoTime etr = item.detail(QOrganizerItemDetail::TypeTodoTime); if (!etr.isEmpty()) { - struct icaltimetype ict = icaltime_from_timet(etr.startDateTime().toTime_t(), etr.isAllDay()); + QByteArray tzId; + struct icaltimetype ict = fromQDateTime(etr.startDateTime(), etr.isAllDay(), &tzId); ECalComponentDateTime dt; - dt.tzid = NULL; + dt.tzid = tzId.isEmpty() ? NULL : tzId.constData(); dt.value = &ict; e_cal_component_set_dtstart(comp, &dt);; } @@ -1888,9 +1917,10 @@ { QOrganizerTodoTime ttr = item.detail(QOrganizerItemDetail::TypeTodoTime); if (!ttr.isEmpty()) { - struct icaltimetype ict = icaltime_from_timet(ttr.dueDateTime().toTime_t(), ttr.isAllDay()); + QByteArray tzId; + struct icaltimetype ict = fromQDateTime(ttr.dueDateTime(), ttr.isAllDay(), &tzId); ECalComponentDateTime dt; - dt.tzid = NULL; + dt.tzid = tzId.isEmpty() ? NULL : tzId.constData(); dt.value = &ict; e_cal_component_set_due(comp, &dt);; } @@ -2065,9 +2095,10 @@ QOrganizerJournalTime jtime = item.detail(QOrganizerItemDetail::TypeJournalTime); if (!jtime.isEmpty()) { - struct icaltimetype ict = icaltime_from_timet(jtime.entryDateTime().toTime_t(), FALSE); + QByteArray tzId; + struct icaltimetype ict = fromQDateTime(jtime.entryDateTime(), false, &tzId); ECalComponentDateTime dt; - dt.tzid = NULL; + dt.tzid = tzId.isEmpty() ? NULL : tzId.constData(); dt.value = &ict; e_cal_component_set_dtstart(comp, &dt); } diff -Nru qtorganizer5-eds-0.1.1+14.04.20140307.1/qorganizer/qorganizer-eds-engine.h qtorganizer5-eds-0.1.1+14.04.20140403.1/qorganizer/qorganizer-eds-engine.h --- qtorganizer5-eds-0.1.1+14.04.20140307.1/qorganizer/qorganizer-eds-engine.h 2014-03-07 07:02:36.000000000 +0000 +++ qtorganizer5-eds-0.1.1+14.04.20140403.1/qorganizer/qorganizer-eds-engine.h 2014-04-03 21:23:07.000000000 +0000 @@ -190,7 +190,8 @@ static void parseStatus(ECalComponent *comp, QtOrganizer::QOrganizerItem *item); static void parseAttendeeList(ECalComponent *comp, QtOrganizer::QOrganizerItem *item); - static QDateTime fromIcalTime(struct icaltimetype value); + static QDateTime fromIcalTime(struct icaltimetype value, const char *tzId); + static icaltimetype fromQDateTime(const QDateTime &dateTime, bool allDay, QByteArray *tzId); static QtOrganizer::QOrganizerItem *parseEvent(ECalComponent *comp); static QtOrganizer::QOrganizerItem *parseToDo(ECalComponent *comp); diff -Nru qtorganizer5-eds-0.1.1+14.04.20140307.1/tests/unittest/event-test.cpp qtorganizer5-eds-0.1.1+14.04.20140403.1/tests/unittest/event-test.cpp --- qtorganizer5-eds-0.1.1+14.04.20140307.1/tests/unittest/event-test.cpp 2014-03-07 07:02:36.000000000 +0000 +++ qtorganizer5-eds-0.1.1+14.04.20140403.1/tests/unittest/event-test.cpp 2014-04-03 21:23:07.000000000 +0000 @@ -512,6 +512,46 @@ QOrganizerTodo newTodo = static_cast(items[0]); QCOMPARE(newTodo.startDateTime(), startDateTime); } + + void testCreateWithDiffTimeZone() + { + static QString displayLabelValue = QStringLiteral("Event with diff timezone"); + static QString descriptionValue = QStringLiteral("Event with diff timezone description"); + static QDateTime startDateTime = QDateTime(QDate(2013, 9, 3), QTime(0, 30, 0), QTimeZone("Asia/Bangkok")); + + // create a new item + QOrganizerTodo todo; + todo.setCollectionId(m_collection.id()); + todo.setStartDateTime(startDateTime); + todo.setDisplayLabel(displayLabelValue); + todo.setDescription(descriptionValue); + + QtOrganizer::QOrganizerManager::Error error; + QMap errorMap; + QList items; + items << todo; + bool saveResult = m_engine->saveItems(&items, + QList(), + &errorMap, + &error); + QVERIFY(saveResult); + QCOMPARE(error, QOrganizerManager::NoError); + QVERIFY(errorMap.isEmpty()); + + // query by the new item + QOrganizerItemFetchHint hint; + QList ids; + ids << items[0].id(); + items = m_engine->items(ids, hint, &errorMap, &error); + QCOMPARE(items.count(), 1); + + // compare start datetime + QOrganizerTodo newTodo = static_cast(items[0]); + QDateTime newStartDateTime = newTodo.startDateTime(); + QCOMPARE(newStartDateTime.timeSpec(), Qt::TimeZone); + QCOMPARE(newStartDateTime.timeZone(), QTimeZone("Asia/Bangkok")); + QCOMPARE(newTodo.startDateTime(), startDateTime); + } }; const QString EventTest::defaultCollectionName = QStringLiteral("TEST_EVENT_COLLECTION"); diff -Nru qtorganizer5-eds-0.1.1+14.04.20140307.1/tests/unittest/recurrence-test.cpp qtorganizer5-eds-0.1.1+14.04.20140403.1/tests/unittest/recurrence-test.cpp --- qtorganizer5-eds-0.1.1+14.04.20140307.1/tests/unittest/recurrence-test.cpp 2014-03-07 07:02:36.000000000 +0000 +++ qtorganizer5-eds-0.1.1+14.04.20140403.1/tests/unittest/recurrence-test.cpp 2014-04-03 21:23:07.000000000 +0000 @@ -160,11 +160,13 @@ { static QString displayLabelValue = QStringLiteral("Monthly test"); static QString descriptionValue = QStringLiteral("Monthly description"); + static QDateTime eventStartDate = QDateTime(QDate(2013, 1, 1), QTime(0, 0, 0), Qt::UTC); + static QDateTime eventEndDate = QDateTime(QDate(2013, 1, 1), QTime(0, 30, 0), Qt::UTC); QOrganizerEvent ev; ev.setCollectionId(m_collection.id()); - ev.setStartDateTime(QDateTime(QDate(2013, 1, 1), QTime(0,0,0))); - ev.setEndDateTime(QDateTime(QDate(2013, 1, 1), QTime(0,30,0))); + ev.setStartDateTime(eventStartDate); + ev.setEndDateTime(eventEndDate); ev.setDisplayLabel(displayLabelValue); ev.setDescription(descriptionValue); @@ -192,19 +194,19 @@ QOrganizerItemFetchHint hint; QOrganizerItemFilter filter; items = m_engine->items(filter, - QDateTime(QDate(2013, 1, 1), QTime(0,0,0)), - QDateTime(QDate(2014, 1, 1), QTime(0,0,0)), - 100, - sort, - hint, - &error); + eventStartDate, + eventStartDate.addYears(1), + 100, + sort, + hint, + &error); QCOMPARE(items.count(), 24); for(int i=0; i < 12; i++) { QOrganizerEventTime time = items[i*2].detail(QOrganizerItemDetail::TypeEventTime); - QCOMPARE(time.startDateTime(), QDateTime(QDate(2013, i+1, 1), QTime(0,0,0))); + QCOMPARE(time.startDateTime(), eventStartDate.addMonths(i)); time = items[(i*2)+1].detail(QOrganizerItemDetail::TypeEventTime); - QCOMPARE(time.startDateTime(), QDateTime(QDate(2013, i+1, 5), QTime(0,0,0))); + QCOMPARE(time.startDateTime(), QDateTime(QDate(2013, i+1, 5), QTime(0,0,0), Qt::UTC)); } }