diff -Nru qtorganizer5-eds-0.1.1+14.04.20140404/debian/changelog qtorganizer5-eds-0.1.1+14.04.20140415.1/debian/changelog --- qtorganizer5-eds-0.1.1+14.04.20140404/debian/changelog 2014-04-15 22:21:12.000000000 +0000 +++ qtorganizer5-eds-0.1.1+14.04.20140415.1/debian/changelog 2014-04-15 22:21:12.000000000 +0000 @@ -1,3 +1,18 @@ +qtorganizer5-eds (0.1.1+14.04.20140415.1-0ubuntu1) trusty; urgency=low + + [ Renato Araujo Oliveira Filho ] + * Optimize eventid parse, and avoid memory leak. (LP: #1306112) + * Used alarm component description as message field for visual + reminders. (LP: #1284375) + * Implemented support to update recurrence items with different modes. + All (E_CAL_OBJ_MOD_ALL);. A single instance (E_CAL_OBJ_MOD_THIS),. A + specific set of instances (E_CAL_OBJ_MOD_THIS_AND_PRIOR and + E_CAL_OBJ_MOD_THIS_AND_FUTURE) (LP: #1283859) + * Fixed recurrence date limit parse. (LP: #1292554) + * Removed all debug messages. (LP: #1294426) + + -- Ubuntu daily release Tue, 15 Apr 2014 19:43:13 +0000 + qtorganizer5-eds (0.1.1+14.04.20140404-0ubuntu1) trusty; urgency=low [ Renato Araujo Oliveira Filho ] diff -Nru qtorganizer5-eds-0.1.1+14.04.20140404/qorganizer/qorganizer-eds-engine.cpp qtorganizer5-eds-0.1.1+14.04.20140415.1/qorganizer/qorganizer-eds-engine.cpp --- qtorganizer5-eds-0.1.1+14.04.20140404/qorganizer/qorganizer-eds-engine.cpp 2014-04-04 19:29:07.000000000 +0000 +++ qtorganizer5-eds-0.1.1+14.04.20140415.1/qorganizer/qorganizer-eds-engine.cpp 2014-04-15 19:43:05.000000000 +0000 @@ -69,23 +69,8 @@ using namespace QtOrganizer; QOrganizerEDSEngineData *QOrganizerEDSEngine::m_globalData = 0; -static void QOrganizerEDSEngineMessageOutput(QtMsgType type, - const QMessageLogContext &context, - const QString &message) -{ - Q_UNUSED(type); - Q_UNUSED(context); - Q_UNUSED(message); - //nothing -} - QOrganizerEDSEngine* QOrganizerEDSEngine::createEDSEngine(const QMap& parameters) { - // disable debug message if variable not exported - if (qgetenv("QORGANIZER_EDS_DEBUG").isEmpty()) { - qInstallMessageHandler(QOrganizerEDSEngineMessageOutput); - } - Q_UNUSED(parameters); if (!m_globalData) { m_globalData = new QOrganizerEDSEngineData(); @@ -98,7 +83,6 @@ QOrganizerEDSEngine::QOrganizerEDSEngine(QOrganizerEDSEngineData *data) : d(data) { - qDebug() << Q_FUNC_INFO; d->m_sharedEngines << this; Q_FOREACH(const QString &collectionId, d->m_sourceRegistry->collectionsIds()){ @@ -111,8 +95,6 @@ QOrganizerEDSEngine::~QOrganizerEDSEngine() { - qDebug() << Q_FUNC_INFO; - Q_FOREACH(QOrganizerAbstractRequest *req, m_runningRequests.keys()) { req->cancel(); } @@ -140,7 +122,6 @@ void QOrganizerEDSEngine::itemsAsync(QOrganizerItemFetchRequest *req) { - qDebug() << Q_FUNC_INFO; FetchRequestData *data = new FetchRequestData(this, d->m_sourceRegistry->collectionsIds(), req); @@ -187,7 +168,6 @@ time_t instanceEnd, FetchRequestData *data) { - qDebug() << Q_FUNC_INFO; Q_UNUSED(instanceStart); Q_UNUSED(instanceEnd); @@ -223,14 +203,12 @@ void QOrganizerEDSEngine::itemsByIdAsync(QOrganizerItemFetchByIdRequest *req) { - qDebug() << Q_FUNC_INFO; FetchByIdRequestData *data = new FetchByIdRequestData(this, req); itemsByIdAsyncStart(data); } void QOrganizerEDSEngine::itemsByIdAsyncStart(FetchByIdRequestData *data) { - qDebug() << Q_FUNC_INFO; QString id = data->nextId(); if (!id.isEmpty()) { QStringList ids = id.split("/"); @@ -267,7 +245,6 @@ GAsyncResult *res, FetchByIdRequestData *data) { - qDebug() << Q_FUNC_INFO; Q_UNUSED(client); GError *gError = 0; icalcomponent *icalComp = 0; @@ -289,7 +266,6 @@ void QOrganizerEDSEngine::itemOcurrenceAsync(QOrganizerItemOccurrenceFetchRequest *req) { - qDebug() << Q_FUNC_INFO; FetchOcurrenceData *data = new FetchOcurrenceData(this, req); QString rId; @@ -303,6 +279,7 @@ data->cancellable(), (GAsyncReadyCallback) QOrganizerEDSEngine::itemOcurrenceAsyncGetObjectDone, data); + g_object_unref(client); } else { qWarning() << "Fail to find collection:" << req->parentItem().collectionId(); data->finish(QOrganizerManager::DoesNotExistError); @@ -316,7 +293,6 @@ FetchOcurrenceData *data) { Q_UNUSED(source); - GError *error = 0; icalcomponent *comp = 0; e_cal_client_get_object_finish(data->client(), res, &comp, &error); @@ -343,7 +319,6 @@ time_t instanceEnd, FetchOcurrenceData *data) { - qDebug() << Q_FUNC_INFO; Q_UNUSED(instanceStart); Q_UNUSED(instanceEnd); @@ -364,8 +339,6 @@ QMap *errorMap, QOrganizerManager::Error *error) { - qDebug() << Q_FUNC_INFO; - QOrganizerItemFetchByIdRequest *req = new QOrganizerItemFetchByIdRequest(this); req->setIds(itemIds); req->setFetchHint(fetchHint); @@ -392,7 +365,6 @@ const QOrganizerItemFetchHint &fetchHint, QOrganizerManager::Error *error) { - qDebug() << Q_FUNC_INFO; QOrganizerItemFetchRequest *req = new QOrganizerItemFetchRequest(this); req->setFilter(filter); @@ -419,8 +391,11 @@ const QList &sortOrders, QOrganizerManager::Error *error) { - qDebug() << Q_FUNC_INFO; + qWarning() << Q_FUNC_INFO << "Not implemented"; QList items; + if (error) { + *error = QOrganizerManager::NotSupportedError; + } return items; } @@ -431,7 +406,6 @@ const QOrganizerItemFetchHint &fetchHint, QOrganizerManager::Error *error) { - qDebug() << Q_FUNC_INFO; QOrganizerItemOccurrenceFetchRequest *req = new QOrganizerItemOccurrenceFetchRequest(this); req->setParentItem(parentItem); @@ -458,13 +432,16 @@ const QOrganizerItemFetchHint &fetchHint, QOrganizerManager::Error *error) { - qDebug() << Q_FUNC_INFO; + qWarning() << Q_FUNC_INFO << "Not implemented"; + if (error) { + *error = QOrganizerManager::NotSupportedError; + } return QList(); + } void QOrganizerEDSEngine::saveItemsAsync(QOrganizerItemSaveRequest *req) { - qDebug() << Q_FUNC_INFO; if (req->items().count() == 0) { QOrganizerManagerEngine::updateItemSaveRequest(req, QList(), @@ -479,7 +456,6 @@ void QOrganizerEDSEngine::saveItemsAsyncStart(SaveRequestData *data) { - qDebug() << Q_FUNC_INFO; QString collectionId = data->nextCollection(); if (collectionId.isNull() && data->end()) { @@ -501,12 +477,10 @@ if (collectionId.isEmpty() && createItems) { collectionId = data->parent()->d->m_sourceRegistry->defaultCollection().id().toString(); - qDebug() << "Use default collection to save item with empty collection:" << collectionId; } EClient *client = data->parent()->d->m_sourceRegistry->client(collectionId); if (!client) { - qWarning() << "Trying to save items with invalid collection" << collectionId; Q_FOREACH(const QOrganizerItem &i, items) { data->appendResult(i, QOrganizerManager::InvalidCollectionError); } @@ -518,8 +492,10 @@ data->setClient(client); g_object_unref(client); + bool hasRecurrence = false; GSList *comps = parseItems(data->client(), - items); + items, + &hasRecurrence); if (comps) { data->setWorkingItems(items); if (createItems) { @@ -529,9 +505,20 @@ (GAsyncReadyCallback) QOrganizerEDSEngine::saveItemsAsyncCreated, data); } else { + //WORKAROUND: There is no api to say what kind of update we want in case of update recurrence + // items (E_CAL_OBJ_MOD_ALL, E_CAL_OBJ_MOD_THIS, E_CAL_OBJ_MOD_THISNADPRIOR, E_CAL_OBJ_MOD_THIS_AND_FUTURE) + // as temporary solution the user can use "update-mode" property in QOrganizerItemSaveRequest object, + // if not was specified, we will try to guess based on the event list. + // If the event list does not cotain any recurrence event we will use E_CAL_OBJ_MOD_ALL + // If the event list cotains any recurrence event we will use E_CAL_OBJ_MOD_THIS + // all other cases should be explicitly specified using "update-mode" property + int updateMode = data->updateMode(); + if (updateMode == -1) { + updateMode = hasRecurrence ? E_CAL_OBJ_MOD_THIS : E_CAL_OBJ_MOD_ALL; + } e_cal_client_modify_objects(data->client(), comps, - E_CAL_OBJ_MOD_THIS, + static_cast(updateMode), data->cancellable(), (GAsyncReadyCallback) QOrganizerEDSEngine::saveItemsAsyncModified, data); @@ -547,13 +534,13 @@ GAsyncResult *res, SaveRequestData *data) { - qDebug() << Q_FUNC_INFO; Q_UNUSED(source_object); GError *gError = 0; - e_cal_client_modify_objects_finish(E_CAL_CLIENT(data->client()), + gboolean result = e_cal_client_modify_objects_finish(E_CAL_CLIENT(data->client()), res, &gError); + QCoreApplication::processEvents(); if (gError) { @@ -574,7 +561,6 @@ GAsyncResult *res, SaveRequestData *data) { - qDebug() << Q_FUNC_INFO; Q_UNUSED(source_object); GError *gError = 0; @@ -623,7 +609,6 @@ QtOrganizer::QOrganizerManager::Error *error) { - qDebug() << Q_FUNC_INFO; QOrganizerItemSaveRequest *req = new QOrganizerItemSaveRequest(this); req->setItems(*items); req->setDetailMask(detailMask); @@ -640,7 +625,6 @@ void QOrganizerEDSEngine::removeItemsByIdAsync(QOrganizerItemRemoveByIdRequest *req) { - qDebug() << Q_FUNC_INFO; if (req->itemIds().count() == 0) { QOrganizerManagerEngine::updateItemRemoveByIdRequest(req, QOrganizerManager::NoError, @@ -655,7 +639,6 @@ void QOrganizerEDSEngine::removeItemsByIdAsyncStart(RemoveByIdRequestData *data) { - qDebug() << Q_FUNC_INFO; QString collectionId = data->next(); for(; !collectionId.isNull(); collectionId = data->next()) { EClient *client = data->parent()->d->m_sourceRegistry->client(collectionId); @@ -678,7 +661,6 @@ void QOrganizerEDSEngine::removeItemsAsync(QOrganizerItemRemoveRequest *req) { - qDebug() << Q_FUNC_INFO; if (req->items().count() == 0) { QOrganizerManagerEngine::updateItemRemoveRequest(req, QOrganizerManager::NoError, @@ -693,7 +675,6 @@ void QOrganizerEDSEngine::removeItemsAsyncStart(RemoveRequestData *data) { - qDebug() << Q_FUNC_INFO; QOrganizerCollectionId collection = data->next(); for(; !collection.isNull(); collection = data->next()) { EClient *client = data->parent()->d->m_sourceRegistry->client(collection.toString()); @@ -718,8 +699,6 @@ QMap *errorMap, QOrganizerManager::Error *error) { - qDebug() << Q_FUNC_INFO; - QOrganizerItemRemoveByIdRequest *req = new QOrganizerItemRemoveByIdRequest(this); req->setItemIds(itemIds); startRequest(req); @@ -737,7 +716,7 @@ QOrganizerCollection QOrganizerEDSEngine::defaultCollection(QOrganizerManager::Error* error) { - qDebug() << Q_FUNC_INFO; + qWarning() << Q_FUNC_INFO << "Not implemented"; if (error) { *error = QOrganizerManager::NoError; } @@ -747,7 +726,6 @@ QOrganizerCollection QOrganizerEDSEngine::collection(const QOrganizerCollectionId& collectionId, QOrganizerManager::Error* error) { - qDebug() << Q_FUNC_INFO; QOrganizerCollection collection = d->m_sourceRegistry->collection(collectionId.toString()); if (collection.id().isNull() && error) { *error = QOrganizerManager::DoesNotExistError; @@ -758,8 +736,6 @@ QList QOrganizerEDSEngine::collections(QOrganizerManager::Error* error) { - qDebug() << Q_FUNC_INFO; - QOrganizerCollectionFetchRequest *req = new QOrganizerCollectionFetchRequest(this); startRequest(req); @@ -776,7 +752,6 @@ bool QOrganizerEDSEngine::saveCollection(QOrganizerCollection* collection, QOrganizerManager::Error* error) { - qDebug() << Q_FUNC_INFO; QOrganizerCollectionSaveRequest *req = new QOrganizerCollectionSaveRequest(this); req->setCollection(*collection); @@ -795,8 +770,6 @@ void QOrganizerEDSEngine::saveCollectionAsync(QOrganizerCollectionSaveRequest *req) { - qDebug() << Q_FUNC_INFO; - if (req->collections().count() == 0) { QOrganizerManagerEngine::updateCollectionSaveRequest(req, QList(), @@ -826,7 +799,6 @@ GAsyncResult *res, SaveCollectionRequestData *data) { - qDebug() << Q_FUNC_INFO; GError *gError = 0; e_source_registry_create_sources_finish(registry, res, &gError); QCoreApplication::processEvents(); @@ -881,8 +853,6 @@ bool QOrganizerEDSEngine::removeCollection(const QOrganizerCollectionId& collectionId, QOrganizerManager::Error* error) { - qDebug() << Q_FUNC_INFO; - QOrganizerCollectionRemoveRequest *req = new QOrganizerCollectionRemoveRequest(this); req->setCollectionId(collectionId); @@ -895,8 +865,6 @@ void QOrganizerEDSEngine::removeCollectionAsync(QtOrganizer::QOrganizerCollectionRemoveRequest *req) { - qDebug() << Q_FUNC_INFO; - if (req->collectionIds().count() == 0) { QOrganizerManagerEngine::updateCollectionRemoveRequest(req, QOrganizerManager::NoError, @@ -953,7 +921,6 @@ void QOrganizerEDSEngine::requestDestroyed(QOrganizerAbstractRequest* req) { - qDebug() << Q_FUNC_INFO; RequestData *data = m_runningRequests.take(req); if (data) { delete data; @@ -962,8 +929,6 @@ bool QOrganizerEDSEngine::startRequest(QOrganizerAbstractRequest* req) { - qDebug() << Q_FUNC_INFO; - if (!req) return false; @@ -1010,7 +975,6 @@ bool QOrganizerEDSEngine::cancelRequest(QOrganizerAbstractRequest* req) { - qDebug() << Q_FUNC_INFO; RequestData *data = m_runningRequests.take(req); if (data) { data->cancel(); @@ -1022,7 +986,6 @@ bool QOrganizerEDSEngine::waitForRequestFinished(QOrganizerAbstractRequest* req, int msecs) { - qDebug() << Q_FUNC_INFO; Q_ASSERT(req); Q_UNUSED(msecs); @@ -1124,13 +1087,11 @@ void QOrganizerEDSEngine::onSourceAdded(const QString &collectionId) { - qDebug() << Q_FUNC_INFO << collectionId; d->watch(collectionId); } void QOrganizerEDSEngine::onSourceRemoved(const QString &collectionId) { - qDebug() << Q_FUNC_INFO << (void*) this; d->unWatch(collectionId); } @@ -1289,6 +1250,7 @@ e_cal_component_get_rdate_list(comp, &periodList); for(GSList *i = periodList; i != 0; i = i->next) { ECalComponentPeriod *period = (ECalComponentPeriod*) i->data; + //TODO: get timezone info QDateTime dt = fromIcalTime(period->start, 0); dates.insert(dt.date()); //TODO: period.end, period.duration @@ -1348,17 +1310,15 @@ break; } - - if (rule->count > 0) { - qRule.setLimit(rule->count); - } else { - QDateTime dt = fromIcalTime(rule->until, 0); + if (icaltime_is_date(rule->until)) { + QDate dt = QDate::fromString(icaltime_as_ical_string(rule->until), "yyyyMMdd"); if (dt.isValid()) { - qRule.setLimit(dt.date()); - } else { - qRule.clearLimit(); + qRule.setLimit(dt); } + } else { + qRule.setLimit(rule->count); } + qRule.setInterval(rule->interval); QSet positions; @@ -1617,50 +1577,40 @@ e_cal_component_free_categories_list(categories); } -QByteArray QOrganizerEDSEngine::dencodeAttachment(ECalComponentAlarm *alarm) +QUrl QOrganizerEDSEngine::dencodeAttachment(ECalComponentAlarm *alarm) { - QByteArray attachment; + QUrl attachment; icalattach *attach = 0; e_cal_component_alarm_get_attach(alarm, &attach); if (attach) { - attachment = QByteArray::fromBase64(icalattach_get_url(attach)); + if (icalattach_get_is_url(attach)) { + const gchar *url = icalattach_get_url(attach); + attachment = QUrl(QString::fromUtf8(url)); + } icalattach_unref(attach); } return attachment; } - void QOrganizerEDSEngine::parseVisualReminderAttachment(ECalComponentAlarm *alarm, QOrganizerItemReminder *aDetail) { - QByteArray attach = dencodeAttachment(alarm); - if (!attach.isEmpty()) { - QUrl url; - QString txt; - - QDataStream attachStream(&attach, QIODevice::ReadOnly); - - attachStream >> url; - attachStream >> txt; - - aDetail->setValue(QOrganizerItemVisualReminder::FieldDataUrl, QVariant(url)); - aDetail->setValue(QOrganizerItemVisualReminder::FieldMessage, QVariant(txt)); + QUrl attach = dencodeAttachment(alarm); + if (attach.isValid()) { + aDetail->setValue(QOrganizerItemVisualReminder::FieldDataUrl, attach); } -} + ECalComponentText txt; + e_cal_component_alarm_get_description(alarm, &txt); + aDetail->setValue(QOrganizerItemVisualReminder::FieldMessage, QString::fromUtf8(txt.value)); +} void QOrganizerEDSEngine::parseAudibleReminderAttachment(ECalComponentAlarm *alarm, QOrganizerItemReminder *aDetail) { - QByteArray attach = dencodeAttachment(alarm); - if (!attach.isEmpty()) { - QUrl url; - - QDataStream attachStream(&attach, QIODevice::ReadOnly); - - attachStream >> url; - - aDetail->setValue(QOrganizerItemAudibleReminder::FieldDataUrl, QVariant(url)); + QUrl attach = dencodeAttachment(alarm); + if (attach.isValid()) { + aDetail->setValue(QOrganizerItemAudibleReminder::FieldDataUrl, attach); } } @@ -2107,7 +2057,6 @@ ECalComponent *QOrganizerEDSEngine::parseEventItem(ECalClient *client, const QOrganizerItem &item) { - qDebug() << Q_FUNC_INFO; ECalComponent *comp = createDefaultComponent(client, ICAL_VEVENT_COMPONENT, E_CAL_COMPONENT_EVENT); parseStartTime(item, comp); @@ -2121,7 +2070,6 @@ ECalComponent *QOrganizerEDSEngine::parseTodoItem(ECalClient *client, const QOrganizerItem &item) { - qDebug() << Q_FUNC_INFO; ECalComponent *comp = createDefaultComponent(client, ICAL_VTODO_COMPONENT, E_CAL_COMPONENT_TODO); parseTodoStartTime(item, comp); @@ -2136,7 +2084,6 @@ ECalComponent *QOrganizerEDSEngine::parseJournalItem(ECalClient *client, const QOrganizerItem &item) { - qDebug() << Q_FUNC_INFO; ECalComponent *comp = createDefaultComponent(client, ICAL_VJOURNAL_COMPONENT, E_CAL_COMPONENT_JOURNAL); QOrganizerJournalTime jtime = item.detail(QOrganizerItemDetail::TypeJournalTime); @@ -2227,40 +2174,26 @@ } } -void QOrganizerEDSEngine::encodeAttachment(QByteArray data, ECalComponentAlarm *alarm) +void QOrganizerEDSEngine::encodeAttachment(const QUrl &url, ECalComponentAlarm *alarm) { - gchar *b64Bytes = strdup(data.toBase64()); - icalattach *attach = icalattach_new_from_url(b64Bytes); - + icalattach *attach = icalattach_new_from_url(url.toString().toUtf8()); e_cal_component_alarm_set_attach(alarm, attach); - icalattach_unref(attach); } void QOrganizerEDSEngine::parseVisualReminderAttachment(const QOrganizerItemDetail &detail, ECalComponentAlarm *alarm) { - QByteArray attachBytes; - - { - QDataStream attachData(&attachBytes, QIODevice::WriteOnly); - - attachData << detail.value(QOrganizerItemVisualReminder::FieldDataUrl).toUrl(); - attachData << detail.value(QOrganizerItemVisualReminder::FieldMessage).toString(); - } - - encodeAttachment(attachBytes, alarm); + ECalComponentText txt; + QByteArray str = detail.value(QOrganizerItemVisualReminder::FieldMessage).toString().toUtf8(); + txt.altrep = 0; + txt.value = str.constData(); + e_cal_component_alarm_set_description(alarm, &txt); + encodeAttachment(detail.value(QOrganizerItemVisualReminder::FieldDataUrl).toUrl(), alarm); } void QOrganizerEDSEngine::parseAudibleReminderAttachment(const QOrganizerItemDetail &detail, ECalComponentAlarm *alarm) { - QByteArray attachBytes; - - { - QDataStream attachData(&attachBytes, QIODevice::WriteOnly); - attachData << detail.value(QOrganizerItemAudibleReminder::FieldDataUrl).toUrl(); - } - - encodeAttachment(attachBytes, alarm); + encodeAttachment(detail.value(QOrganizerItemAudibleReminder::FieldDataUrl).toUrl(), alarm); } void QOrganizerEDSEngine::parseReminders(const QOrganizerItem &item, ECalComponent *comp) @@ -2305,13 +2238,18 @@ } } -GSList *QOrganizerEDSEngine::parseItems(ECalClient *client, QList items) +GSList *QOrganizerEDSEngine::parseItems(ECalClient *client, + QList items, + bool *hasRecurrence) { GSList *comps = 0; Q_FOREACH(const QOrganizerItem &item, items) { ECalComponent *comp = 0; + *hasRecurrence = ((item.type() == QOrganizerItemType::TypeTodoOccurrence) || + (item.type() == QOrganizerItemType::TypeEventOccurrence)); + switch(item.type()) { case QOrganizerItemType::TypeEvent: case QOrganizerItemType::TypeEventOccurrence: diff -Nru qtorganizer5-eds-0.1.1+14.04.20140404/qorganizer/qorganizer-eds-engine.h qtorganizer5-eds-0.1.1+14.04.20140415.1/qorganizer/qorganizer-eds-engine.h --- qtorganizer5-eds-0.1.1+14.04.20140404/qorganizer/qorganizer-eds-engine.h 2014-04-04 19:29:07.000000000 +0000 +++ qtorganizer5-eds-0.1.1+14.04.20140415.1/qorganizer/qorganizer-eds-engine.h 2014-04-15 19:42:51.000000000 +0000 @@ -139,7 +139,7 @@ QMap m_runningRequests; QList parseEvents(const QString &collectionId, GSList *events, bool isIcalEvents); - static GSList *parseItems(ECalClient *client, QList items); + static GSList *parseItems(ECalClient *client, QList items, bool *hasRecurrence); // QOrganizerItem -> ECalComponent static void parseId(const QtOrganizer::QOrganizerItem &item, ECalComponent *comp); @@ -148,7 +148,7 @@ static void parseComments(const QtOrganizer::QOrganizerItem &item, ECalComponent *comp); static void parseTags(const QtOrganizer::QOrganizerItem &item, ECalComponent *comp); static void parseReminders(const QtOrganizer::QOrganizerItem &item, ECalComponent *comp); - static void encodeAttachment(QByteArray data, ECalComponentAlarm *alarm); + static void encodeAttachment(const QUrl &url, ECalComponentAlarm *alarm); static void parseVisualReminderAttachment(const QtOrganizer::QOrganizerItemDetail &detail, ECalComponentAlarm *alarm); static void parseAudibleReminderAttachment(const QtOrganizer::QOrganizerItemDetail &detail, ECalComponentAlarm *alarm); static void parseStartTime(const QtOrganizer::QOrganizerItem &item, ECalComponent *comp); @@ -173,7 +173,7 @@ static void parseComments(ECalComponent *comp, QtOrganizer::QOrganizerItem *item); static void parseTags(ECalComponent *comp, QtOrganizer::QOrganizerItem *item); static void parseReminders(ECalComponent *comp, QtOrganizer::QOrganizerItem *item); - static QByteArray dencodeAttachment(ECalComponentAlarm *alarm); + static QUrl dencodeAttachment(ECalComponentAlarm *alarm); static void parseAudibleReminderAttachment(ECalComponentAlarm *alarm, QtOrganizer::QOrganizerItemReminder *aDetail); static void parseVisualReminderAttachment(ECalComponentAlarm *alarm, QtOrganizer::QOrganizerItemReminder *aDetail); static void parseStartTime(ECalComponent *comp, QtOrganizer::QOrganizerItem *item); diff -Nru qtorganizer5-eds-0.1.1+14.04.20140404/qorganizer/qorganizer-eds-factory.cpp qtorganizer5-eds-0.1.1+14.04.20140415.1/qorganizer/qorganizer-eds-factory.cpp --- qtorganizer5-eds-0.1.1+14.04.20140404/qorganizer/qorganizer-eds-factory.cpp 2014-04-04 19:28:54.000000000 +0000 +++ qtorganizer5-eds-0.1.1+14.04.20140415.1/qorganizer/qorganizer-eds-factory.cpp 2014-04-15 19:43:05.000000000 +0000 @@ -9,28 +9,23 @@ QOrganizerManagerEngine* QOrganizerEDSFactory::engine(const QMap& parameters, QOrganizerManager::Error* error) { - qDebug() << Q_FUNC_INFO << "eds"; Q_UNUSED(error); - return QOrganizerEDSEngine::createEDSEngine(parameters); } QOrganizerItemEngineId* QOrganizerEDSFactory::createItemEngineId(const QMap& parameters, const QString& idString) const { - qDebug() << Q_FUNC_INFO; Q_UNUSED(parameters); return new QOrganizerEDSEngineId(idString); } QOrganizerCollectionEngineId* QOrganizerEDSFactory::createCollectionEngineId(const QMap& parameters, const QString& idString) const { - qDebug() << Q_FUNC_INFO; Q_UNUSED(parameters); return new QOrganizerEDSCollectionEngineId(idString); } QString QOrganizerEDSFactory::managerName() const { - qDebug() << Q_FUNC_INFO; return QString::fromLatin1("eds"); } diff -Nru qtorganizer5-eds-0.1.1+14.04.20140404/qorganizer/qorganizer-eds-fetchrequestdata.cpp qtorganizer5-eds-0.1.1+14.04.20140415.1/qorganizer/qorganizer-eds-fetchrequestdata.cpp --- qtorganizer5-eds-0.1.1+14.04.20140404/qorganizer/qorganizer-eds-fetchrequestdata.cpp 2014-04-04 19:28:54.000000000 +0000 +++ qtorganizer5-eds-0.1.1+14.04.20140415.1/qorganizer/qorganizer-eds-fetchrequestdata.cpp 2014-04-15 19:42:51.000000000 +0000 @@ -134,11 +134,17 @@ return QStringLiteral("#t"); // match all } + gchar *startDateStr = isodate_from_time_t(startDate.toTime_t()); + gchar *endDateStr = isodate_from_time_t(endDate.toTime_t()); + QString query = QString("(occur-in-time-range? " "(make-time \"%1\") (make-time \"%2\"))") - .arg(isodate_from_time_t(startDate.toTime_t())) - .arg(isodate_from_time_t(endDate.toTime_t())); + .arg(startDateStr) + .arg(endDateStr); + + g_free(startDateStr); + g_free(endDateStr); return query; } diff -Nru qtorganizer5-eds-0.1.1+14.04.20140404/qorganizer/qorganizer-eds-saverequestdata.cpp qtorganizer5-eds-0.1.1+14.04.20140415.1/qorganizer/qorganizer-eds-saverequestdata.cpp --- qtorganizer5-eds-0.1.1+14.04.20140404/qorganizer/qorganizer-eds-saverequestdata.cpp 2014-04-04 19:28:54.000000000 +0000 +++ qtorganizer5-eds-0.1.1+14.04.20140415.1/qorganizer/qorganizer-eds-saverequestdata.cpp 2014-04-15 19:42:51.000000000 +0000 @@ -22,6 +22,8 @@ #include #include +#define UPDATE_MODE_PROPRETY "update-mode" + using namespace QtOrganizer; SaveRequestData::SaveRequestData(QOrganizerEDSEngine *engine, @@ -132,3 +134,16 @@ { return m_workingItems; } + +int SaveRequestData::updateMode() const +{ + // due the lack of API we will use the QObject proprety "update-mode" to allow specify wich kind of + // update the developer want + QOrganizerItemSaveRequest *req = request(); + QVariant updateMode = req->property(UPDATE_MODE_PROPRETY); + if (updateMode.isValid()) { + return updateMode.toInt(); + } else { + return -1; + } +} diff -Nru qtorganizer5-eds-0.1.1+14.04.20140404/qorganizer/qorganizer-eds-saverequestdata.h qtorganizer5-eds-0.1.1+14.04.20140415.1/qorganizer/qorganizer-eds-saverequestdata.h --- qtorganizer5-eds-0.1.1+14.04.20140404/qorganizer/qorganizer-eds-saverequestdata.h 2014-04-04 19:28:54.000000000 +0000 +++ qtorganizer5-eds-0.1.1+14.04.20140415.1/qorganizer/qorganizer-eds-saverequestdata.h 2014-04-15 19:42:51.000000000 +0000 @@ -39,6 +39,7 @@ bool end() const; void setWorkingItems(QList items); QList workingItems() const; + int updateMode() const; void appendResults(QList results); void appendResult(const QtOrganizer::QOrganizerItem &item, QtOrganizer::QOrganizerManager::Error error = QtOrganizer::QOrganizerManager::NoError); diff -Nru qtorganizer5-eds-0.1.1+14.04.20140404/qorganizer/qorganizer-eds-source-registry.cpp qtorganizer5-eds-0.1.1+14.04.20140415.1/qorganizer/qorganizer-eds-source-registry.cpp --- qtorganizer5-eds-0.1.1+14.04.20140404/qorganizer/qorganizer-eds-source-registry.cpp 2014-04-04 19:29:07.000000000 +0000 +++ qtorganizer5-eds-0.1.1+14.04.20140415.1/qorganizer/qorganizer-eds-source-registry.cpp 2014-04-15 19:43:05.000000000 +0000 @@ -17,8 +17,6 @@ SourceRegistry::~SourceRegistry() { - qDebug() << Q_FUNC_INFO << (void*) this; - clear(); if (m_sourceRegistry) { @@ -272,7 +270,6 @@ ESource *source, SourceRegistry *self) { - qDebug() << Q_FUNC_INFO << (void*) self; Q_UNUSED(registry); self->insert(source); } @@ -281,7 +278,6 @@ ESource *source, SourceRegistry *self) { - qDebug() << Q_FUNC_INFO << (void*) self; Q_UNUSED(registry); QString collectionId = self->findCollection(source); if (!collectionId.isEmpty() && self->m_collections.contains(collectionId)) { @@ -297,7 +293,6 @@ ESource *source, SourceRegistry *self) { - qDebug() << Q_FUNC_INFO << (void*) self; Q_UNUSED(registry); self->remove(source); } diff -Nru qtorganizer5-eds-0.1.1+14.04.20140404/qorganizer/qorganizer-eds-viewwatcher.cpp qtorganizer5-eds-0.1.1+14.04.20140415.1/qorganizer/qorganizer-eds-viewwatcher.cpp --- qtorganizer5-eds-0.1.1+14.04.20140404/qorganizer/qorganizer-eds-viewwatcher.cpp 2014-04-04 19:28:54.000000000 +0000 +++ qtorganizer5-eds-0.1.1+14.04.20140415.1/qorganizer/qorganizer-eds-viewwatcher.cpp 2014-04-15 19:43:05.000000000 +0000 @@ -91,9 +91,6 @@ << gError->message; g_error_free(gError); gError = 0; - } else { - qDebug() << "Listening for changes on (" - << self->m_collectionId << ")"; } } g_clear_object(&self->m_cancellable); @@ -138,12 +135,14 @@ for (GSList *l = objects; l; l = l->next) { const gchar *uid = 0; - ECalComponent *comp; - - icalcomponent *clone = icalcomponent_new_clone(static_cast(l->data)); - comp = e_cal_component_new_from_icalcomponent(clone); + icalcomponent *icalcomp = static_cast(l->data); + icalproperty *prop = icalcomponent_get_first_property(icalcomp, ICAL_UID_PROPERTY); + if (prop) { + uid = icalproperty_get_uid(prop); + } else { + qWarning() << "Fail to parse component ID"; + } - e_cal_component_get_uid(comp, &uid); QOrganizerEDSEngineId *itemId = new QOrganizerEDSEngineId(m_collectionId, QString::fromUtf8(uid)); result << QOrganizerItemId(itemId); @@ -155,7 +154,6 @@ GSList *objects, ViewWatcher *self) { - qDebug() << Q_FUNC_INFO << (void*)self; Q_UNUSED(view); QOrganizerItemChangeSet changeSet; @@ -167,7 +165,6 @@ GSList *objects, ViewWatcher *self) { - qDebug() << Q_FUNC_INFO << (void*)self; Q_UNUSED(view); QOrganizerItemChangeSet changeSet; @@ -185,7 +182,6 @@ GSList *objects, ViewWatcher *self) { - qDebug() << Q_FUNC_INFO << (void*)self; Q_UNUSED(view); QOrganizerItemChangeSet changeSet; diff -Nru qtorganizer5-eds-0.1.1+14.04.20140404/tests/unittest/recurrence-test.cpp qtorganizer5-eds-0.1.1+14.04.20140415.1/tests/unittest/recurrence-test.cpp --- qtorganizer5-eds-0.1.1+14.04.20140404/tests/unittest/recurrence-test.cpp 2014-04-04 19:28:54.000000000 +0000 +++ qtorganizer5-eds-0.1.1+14.04.20140415.1/tests/unittest/recurrence-test.cpp 2014-04-15 19:42:59.000000000 +0000 @@ -45,8 +45,8 @@ QOrganizerEvent ev; ev.setCollectionId(m_collection.id()); - ev.setStartDateTime(QDateTime(QDate(2013, 12, 2), QTime(0,0,0))); - ev.setEndDateTime(QDateTime(QDate(2013, 12, 2), QTime(0,30,0))); + ev.setStartDateTime(QDateTime(QDate(2013, 12, 2), QTime(0,0,0), QTimeZone("America/Recife"))); + ev.setEndDateTime(QDateTime(QDate(2013, 12, 2), QTime(0,30,0), QTimeZone("America/Recife"))); ev.setDisplayLabel(displayLabelValue); ev.setDescription(descriptionValue); @@ -210,9 +210,9 @@ } } - void testReccurenceParentId() + void testModifyReccurenceEvents() { - QOrganizerItemId recurrenceEventId = createTestEvent().id(); + createTestEvent().id(); QtOrganizer::QOrganizerManager::Error error; QOrganizerItemSortOrder sort; @@ -228,7 +228,7 @@ hint, &error); QCOMPARE(items.count(), 5); - QMap errorMap; + QMap errorMap; // remove only one item bool removeResult = m_engine->removeItems(QList() << items[3].id(), &errorMap, &error); @@ -253,7 +253,7 @@ updateItem.setDisplayLabel("Updated item 2"); updateItems << updateItem; - bool saveResult = m_engine->saveItems(&updateItems, mask, &errorMap, &error); + bool saveResult = m_engine->saveItems(&updateItems, mask, &errorMap, &error); QCOMPARE(saveResult, true); QCOMPARE(errorMap.size(), 0); QCOMPARE(error, QOrganizerManager::NoError); @@ -287,6 +287,13 @@ QCOMPARE(items.count(), 1); QCOMPARE(items[0].id(), recurrenceEvent.id()); + QOrganizerEvent parentEvent = static_cast(items[0]); + QCOMPARE(parentEvent.recurrenceRules().size(), 1); + + // Check if the limit date was saved correct + QOrganizerRecurrenceRule rrule = parentEvent.recurrenceRule(); + QCOMPARE(rrule.limitDate(), QDate(2013, 12, 31)); + // query recurrence events for the event items = m_engine->itemOccurrences(recurrenceEvent, QDateTime(QDate(2013, 11, 30), QTime(0,0,0)), @@ -299,11 +306,11 @@ QCOMPARE(items.count(), 5); QList expectedDates; - expectedDates << QDateTime(QDate(2013, 12, 2), QTime(0,0,0)) - << QDateTime(QDate(2013, 12, 9), QTime(0,0,0)) - << QDateTime(QDate(2013, 12, 16), QTime(0,0,0)) - << QDateTime(QDate(2013, 12, 23), QTime(0,0,0)) - << QDateTime(QDate(2013, 12, 30), QTime(0,0,0)); + expectedDates << QDateTime(QDate(2013, 12, 2), QTime(0,0,0), QTimeZone("America/Recife")) + << QDateTime(QDate(2013, 12, 9), QTime(0,0,0), QTimeZone("America/Recife")) + << QDateTime(QDate(2013, 12, 16), QTime(0,0,0), QTimeZone("America/Recife")) + << QDateTime(QDate(2013, 12, 23), QTime(0,0,0), QTimeZone("America/Recife")) + << QDateTime(QDate(2013, 12, 30), QTime(0,0,0), QTimeZone("America/Recife")); for(int i=0; i < 5; i++) { QCOMPARE(items[i].type(), QOrganizerItemType::TypeEventOccurrence); QOrganizerEventTime time = items[i].detail(QOrganizerItemDetail::TypeEventTime); @@ -318,8 +325,8 @@ QOrganizerEvent ev; ev.setCollectionId(m_collection.id()); - ev.setStartDateTime(QDateTime(QDate(2014, 03, 1), QTime(0,0,0))); - ev.setEndDateTime(QDateTime(QDate(2014, 03, 1), QTime(0,30,0))); + ev.setStartDateTime(QDateTime(QDate(2014, 03, 1), QTime(0,0,0), QTimeZone("America/Recife"))); + ev.setEndDateTime(QDateTime(QDate(2014, 03, 1), QTime(0,30,0), QTimeZone("America/Recife"))); ev.setDisplayLabel(displayLabelValue); ev.setDescription(descriptionValue); @@ -378,12 +385,12 @@ &error); QList expectedDates; - expectedDates << QDateTime(QDate(2014, 03, 1), QTime(0,0,0)) - << QDateTime(QDate(2014, 03, 2), QTime(0,0,0)) - << QDateTime(QDate(2014, 03, 4), QTime(0,0,0)) - << QDateTime(QDate(2014, 03, 5), QTime(0,0,0)) - << QDateTime(QDate(2014, 03, 6), QTime(0,0,0)) - << QDateTime(QDate(2014, 03, 7), QTime(0,0,0)); + expectedDates << QDateTime(QDate(2014, 03, 1), QTime(0,0,0), QTimeZone("America/Recife")) + << QDateTime(QDate(2014, 03, 2), QTime(0,0,0), QTimeZone("America/Recife")) + << QDateTime(QDate(2014, 03, 4), QTime(0,0,0), QTimeZone("America/Recife")) + << QDateTime(QDate(2014, 03, 5), QTime(0,0,0), QTimeZone("America/Recife")) + << QDateTime(QDate(2014, 03, 6), QTime(0,0,0), QTimeZone("America/Recife")) + << QDateTime(QDate(2014, 03, 7), QTime(0,0,0), QTimeZone("America/Recife")); QCOMPARE(items.count(), expectedDates.size()); for(int i=0, iMax=expectedDates.size(); i < iMax; i++) { @@ -393,6 +400,105 @@ QCOMPARE(time.startDateTime(), expectedDates[i]); } } + + void testModifyAllRecurrence() + { + static const QString newDisplayLabel("New Display label for all items"); + QOrganizerItem item = createTestEvent(); + + // edit all items + QMap errorMap; + QtOrganizer::QOrganizerManager::Error error; + QList updateItems; + QList mask; + + item.setDisplayLabel(newDisplayLabel); + updateItems << item; + + bool saveResult = m_engine->saveItems(&updateItems, mask, &errorMap, &error); + QCOMPARE(saveResult, true); + QCOMPARE(errorMap.size(), 0); + QCOMPARE(error, QOrganizerManager::NoError); + + QOrganizerItemSortOrder sort; + QOrganizerItemFetchHint hint; + QOrganizerItemFilter filter; + QList items = m_engine->items(filter, + QDateTime(QDate(2013, 11, 30), QTime(0,0,0)), + QDateTime(QDate(2014, 1, 1), QTime(0,0,0)), + 100, + sort, + hint, + &error); + QCOMPARE(items.count(), 5); + Q_FOREACH(const QOrganizerItem &i, items) { + QCOMPARE(i.displayLabel(), newDisplayLabel); + } + } + + void testModifyPriorEvents() + { + static const QString newDisplayLabel("New Display label for prior items"); + static const QDateTime startInteval(QDateTime(QDate(2013, 12, 2), QTime(0,0,0), QTimeZone("America/Recife"))); + static const QDateTime endInteval(QDateTime(QDate(2014, 1, 1), QTime(0,0,0), QTimeZone("America/Recife"))); + + QOrganizerItem item = createTestEvent(); + + QtOrganizer::QOrganizerManager::Error error; + QOrganizerItemFetchHint hint; + QList items; + + items = m_engine->itemOccurrences(item, + startInteval, + endInteval, + 100, + hint, + &error); + + QCOMPARE(items.count(), 5); + // edit only events before 16/12/2013 + QOrganizerEventOccurrence changeItem = static_cast(items[2]); + QDate changeItemDate(2013, 12, 16); + QCOMPARE(changeItem.startDateTime().date(), changeItemDate); + + // edit only one item + changeItem.setDisplayLabel(newDisplayLabel); + changeItem.setDescription("New Event Description"); + + QtOrganizer::QOrganizerItemSaveRequest req(m_engine); + changeItem.setDisplayLabel(newDisplayLabel); + req.setItem(changeItem); + req.setProperty("update-mode", 1 << 1); + + m_engine->startRequest(&req); + m_engine->waitForRequestFinished(&req, 0); + QCOMPARE(req.error(), QtOrganizer::QOrganizerManager::NoError); + + QOrganizerItemSortOrder sort; + QOrganizerItemFilter filter; + + items = m_engine->items(filter, + startInteval, + endInteval, + 100, + sort, + hint, + &error); + + QCOMPARE(items.count(), 5); +//FIXME +#if 0 + Q_FOREACH(const QOrganizerItem &i, items) { + QOrganizerEventOccurrence event = static_cast(i); + qDebug() << i.displayLabel() << event.startDateTime().time() << i.description(); + //if (event.startDateTime().date() <= changeItemDate) { + // QCOMPARE(i.displayLabel(), newDisplayLabel); + //} else { + // QCOMPARE(i.displayLabel(), item.displayLabel()); + //} + } +#endif + } }; const QString RecurrenceTest::defaultCollectionName = QStringLiteral("TEST_RECURRENCE_EVENT_COLLECTION");