Merge lp:~renatofilho/qtorganizer5-eds/fix-1283859 into lp:qtorganizer5-eds

Proposed by Renato Araujo Oliveira Filho
Status: Merged
Approved by: Bill Filler
Approved revision: 52
Merged at revision: 51
Proposed branch: lp:~renatofilho/qtorganizer5-eds/fix-1283859
Merge into: lp:qtorganizer5-eds
Diff against target: 362 lines (+168/-26)
7 files modified
.bzrignore (+1/-0)
qorganizer/qorganizer-eds-engine.cpp (+24/-4)
qorganizer/qorganizer-eds-engine.h (+1/-1)
qorganizer/qorganizer-eds-fetchrequestdata.cpp (+8/-2)
qorganizer/qorganizer-eds-saverequestdata.cpp (+15/-0)
qorganizer/qorganizer-eds-saverequestdata.h (+1/-0)
tests/unittest/recurrence-test.cpp (+118/-19)
To merge this branch: bzr merge lp:~renatofilho/qtorganizer5-eds/fix-1283859
Reviewer Review Type Date Requested Status
Bill Filler (community) Approve
PS Jenkins bot continuous-integration Approve
Review via email: mp+215592@code.launchpad.net

Commit message

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)

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
50. By Renato Araujo Oliveira Filho

Used timezones on tests datetime values to avoid problems when running in different timezones.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
51. By Renato Araujo Oliveira Filho

Fixed memory leak on strings.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Charles Kerr (charlesk) wrote :

This seems to fix the bug I found testing in comment 5 and 6 of bug #1283858, I can't reproduce the behavior while using this patch.

52. By Renato Araujo Oliveira Filho

Updated ignored file list.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Bill Filler (bfiller) wrote :

Did you perform an exploratory manual test run of the code change and any related functionality on device or emulator?
yes

Did you successfully run all tests found in your component's Test Plan (https://wiki.ubuntu.com/Process/Merges/TestPlan/<package-name>) on device or emulator?
yes

Did CI run pass? If not, please explain why.
yes

Have you checked that submitter has accurately filled out the submitter checklist and has taken no shortcut?
yes

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file '.bzrignore'
2--- .bzrignore 2013-08-15 13:45:41 +0000
3+++ .bzrignore 2014-04-15 13:49:50 +0000
4@@ -1,2 +1,3 @@
5 CMakeLists.txt.user
6 build/
7+manifest.json
8
9=== modified file 'qorganizer/qorganizer-eds-engine.cpp'
10--- qorganizer/qorganizer-eds-engine.cpp 2014-04-04 19:29:07 +0000
11+++ qorganizer/qorganizer-eds-engine.cpp 2014-04-15 13:49:50 +0000
12@@ -303,6 +303,7 @@
13 data->cancellable(),
14 (GAsyncReadyCallback) QOrganizerEDSEngine::itemOcurrenceAsyncGetObjectDone,
15 data);
16+ g_object_unref(client);
17 } else {
18 qWarning() << "Fail to find collection:" << req->parentItem().collectionId();
19 data->finish(QOrganizerManager::DoesNotExistError);
20@@ -518,8 +519,10 @@
21 data->setClient(client);
22 g_object_unref(client);
23
24+ bool hasRecurrence = false;
25 GSList *comps = parseItems(data->client(),
26- items);
27+ items,
28+ &hasRecurrence);
29 if (comps) {
30 data->setWorkingItems(items);
31 if (createItems) {
32@@ -529,9 +532,20 @@
33 (GAsyncReadyCallback) QOrganizerEDSEngine::saveItemsAsyncCreated,
34 data);
35 } else {
36+ //WORKAROUND: There is no api to say what kind of update we want in case of update recurrence
37+ // items (E_CAL_OBJ_MOD_ALL, E_CAL_OBJ_MOD_THIS, E_CAL_OBJ_MOD_THISNADPRIOR, E_CAL_OBJ_MOD_THIS_AND_FUTURE)
38+ // as temporary solution the user can use "update-mode" property in QOrganizerItemSaveRequest object,
39+ // if not was specified, we will try to guess based on the event list.
40+ // If the event list does not cotain any recurrence event we will use E_CAL_OBJ_MOD_ALL
41+ // If the event list cotains any recurrence event we will use E_CAL_OBJ_MOD_THIS
42+ // all other cases should be explicitly specified using "update-mode" property
43+ int updateMode = data->updateMode();
44+ if (updateMode == -1) {
45+ updateMode = hasRecurrence ? E_CAL_OBJ_MOD_THIS : E_CAL_OBJ_MOD_ALL;
46+ }
47 e_cal_client_modify_objects(data->client(),
48 comps,
49- E_CAL_OBJ_MOD_THIS,
50+ static_cast<ECalObjModType>(updateMode),
51 data->cancellable(),
52 (GAsyncReadyCallback) QOrganizerEDSEngine::saveItemsAsyncModified,
53 data);
54@@ -551,9 +565,10 @@
55 Q_UNUSED(source_object);
56
57 GError *gError = 0;
58- e_cal_client_modify_objects_finish(E_CAL_CLIENT(data->client()),
59+ gboolean result = e_cal_client_modify_objects_finish(E_CAL_CLIENT(data->client()),
60 res,
61 &gError);
62+
63 QCoreApplication::processEvents();
64
65 if (gError) {
66@@ -2305,13 +2320,18 @@
67 }
68 }
69
70-GSList *QOrganizerEDSEngine::parseItems(ECalClient *client, QList<QOrganizerItem> items)
71+GSList *QOrganizerEDSEngine::parseItems(ECalClient *client,
72+ QList<QOrganizerItem> items,
73+ bool *hasRecurrence)
74 {
75 GSList *comps = 0;
76
77 Q_FOREACH(const QOrganizerItem &item, items) {
78 ECalComponent *comp = 0;
79
80+ *hasRecurrence = ((item.type() == QOrganizerItemType::TypeTodoOccurrence) ||
81+ (item.type() == QOrganizerItemType::TypeEventOccurrence));
82+
83 switch(item.type()) {
84 case QOrganizerItemType::TypeEvent:
85 case QOrganizerItemType::TypeEventOccurrence:
86
87=== modified file 'qorganizer/qorganizer-eds-engine.h'
88--- qorganizer/qorganizer-eds-engine.h 2014-04-04 19:29:07 +0000
89+++ qorganizer/qorganizer-eds-engine.h 2014-04-15 13:49:50 +0000
90@@ -139,7 +139,7 @@
91 QMap<QtOrganizer::QOrganizerAbstractRequest*, RequestData*> m_runningRequests;
92
93 QList<QtOrganizer::QOrganizerItem> parseEvents(const QString &collectionId, GSList *events, bool isIcalEvents);
94- static GSList *parseItems(ECalClient *client, QList<QtOrganizer::QOrganizerItem> items);
95+ static GSList *parseItems(ECalClient *client, QList<QtOrganizer::QOrganizerItem> items, bool *hasRecurrence);
96
97 // QOrganizerItem -> ECalComponent
98 static void parseId(const QtOrganizer::QOrganizerItem &item, ECalComponent *comp);
99
100=== modified file 'qorganizer/qorganizer-eds-fetchrequestdata.cpp'
101--- qorganizer/qorganizer-eds-fetchrequestdata.cpp 2014-02-25 17:12:32 +0000
102+++ qorganizer/qorganizer-eds-fetchrequestdata.cpp 2014-04-15 13:49:50 +0000
103@@ -134,11 +134,17 @@
104 return QStringLiteral("#t"); // match all
105 }
106
107+ gchar *startDateStr = isodate_from_time_t(startDate.toTime_t());
108+ gchar *endDateStr = isodate_from_time_t(endDate.toTime_t());
109+
110
111 QString query = QString("(occur-in-time-range? "
112 "(make-time \"%1\") (make-time \"%2\"))")
113- .arg(isodate_from_time_t(startDate.toTime_t()))
114- .arg(isodate_from_time_t(endDate.toTime_t()));
115+ .arg(startDateStr)
116+ .arg(endDateStr);
117+
118+ g_free(startDateStr);
119+ g_free(endDateStr);
120
121 return query;
122 }
123
124=== modified file 'qorganizer/qorganizer-eds-saverequestdata.cpp'
125--- qorganizer/qorganizer-eds-saverequestdata.cpp 2014-01-03 19:41:26 +0000
126+++ qorganizer/qorganizer-eds-saverequestdata.cpp 2014-04-15 13:49:50 +0000
127@@ -22,6 +22,8 @@
128 #include <QtOrganizer/QOrganizerManagerEngine>
129 #include <QtOrganizer/QOrganizerItemSaveRequest>
130
131+#define UPDATE_MODE_PROPRETY "update-mode"
132+
133 using namespace QtOrganizer;
134
135 SaveRequestData::SaveRequestData(QOrganizerEDSEngine *engine,
136@@ -132,3 +134,16 @@
137 {
138 return m_workingItems;
139 }
140+
141+int SaveRequestData::updateMode() const
142+{
143+ // due the lack of API we will use the QObject proprety "update-mode" to allow specify wich kind of
144+ // update the developer want
145+ QOrganizerItemSaveRequest *req = request<QOrganizerItemSaveRequest>();
146+ QVariant updateMode = req->property(UPDATE_MODE_PROPRETY);
147+ if (updateMode.isValid()) {
148+ return updateMode.toInt();
149+ } else {
150+ return -1;
151+ }
152+}
153
154=== modified file 'qorganizer/qorganizer-eds-saverequestdata.h'
155--- qorganizer/qorganizer-eds-saverequestdata.h 2013-12-05 16:08:18 +0000
156+++ qorganizer/qorganizer-eds-saverequestdata.h 2014-04-15 13:49:50 +0000
157@@ -39,6 +39,7 @@
158 bool end() const;
159 void setWorkingItems(QList<QtOrganizer::QOrganizerItem> items);
160 QList<QtOrganizer::QOrganizerItem> workingItems() const;
161+ int updateMode() const;
162
163 void appendResults(QList<QtOrganizer::QOrganizerItem> results);
164 void appendResult(const QtOrganizer::QOrganizerItem &item, QtOrganizer::QOrganizerManager::Error error = QtOrganizer::QOrganizerManager::NoError);
165
166=== modified file 'tests/unittest/recurrence-test.cpp'
167--- tests/unittest/recurrence-test.cpp 2014-04-02 14:28:50 +0000
168+++ tests/unittest/recurrence-test.cpp 2014-04-15 13:49:50 +0000
169@@ -45,8 +45,8 @@
170
171 QOrganizerEvent ev;
172 ev.setCollectionId(m_collection.id());
173- ev.setStartDateTime(QDateTime(QDate(2013, 12, 2), QTime(0,0,0)));
174- ev.setEndDateTime(QDateTime(QDate(2013, 12, 2), QTime(0,30,0)));
175+ ev.setStartDateTime(QDateTime(QDate(2013, 12, 2), QTime(0,0,0), QTimeZone("America/Recife")));
176+ ev.setEndDateTime(QDateTime(QDate(2013, 12, 2), QTime(0,30,0), QTimeZone("America/Recife")));
177 ev.setDisplayLabel(displayLabelValue);
178 ev.setDescription(descriptionValue);
179
180@@ -210,9 +210,9 @@
181 }
182 }
183
184- void testReccurenceParentId()
185+ void testModifyReccurenceEvents()
186 {
187- QOrganizerItemId recurrenceEventId = createTestEvent().id();
188+ createTestEvent().id();
189
190 QtOrganizer::QOrganizerManager::Error error;
191 QOrganizerItemSortOrder sort;
192@@ -228,7 +228,7 @@
193 hint,
194 &error);
195 QCOMPARE(items.count(), 5);
196- QMap<int, QtOrganizer::QOrganizerManager::Error> errorMap;
197+ QMap<int, QtOrganizer::QOrganizerManager::Error> errorMap;
198
199 // remove only one item
200 bool removeResult = m_engine->removeItems(QList<QtOrganizer::QOrganizerItemId>() << items[3].id(), &errorMap, &error);
201@@ -253,7 +253,7 @@
202 updateItem.setDisplayLabel("Updated item 2");
203 updateItems << updateItem;
204
205- bool saveResult = m_engine->saveItems(&updateItems, mask, &errorMap, &error);
206+ bool saveResult = m_engine->saveItems(&updateItems, mask, &errorMap, &error);
207 QCOMPARE(saveResult, true);
208 QCOMPARE(errorMap.size(), 0);
209 QCOMPARE(error, QOrganizerManager::NoError);
210@@ -299,11 +299,11 @@
211 QCOMPARE(items.count(), 5);
212
213 QList<QDateTime> expectedDates;
214- expectedDates << QDateTime(QDate(2013, 12, 2), QTime(0,0,0))
215- << QDateTime(QDate(2013, 12, 9), QTime(0,0,0))
216- << QDateTime(QDate(2013, 12, 16), QTime(0,0,0))
217- << QDateTime(QDate(2013, 12, 23), QTime(0,0,0))
218- << QDateTime(QDate(2013, 12, 30), QTime(0,0,0));
219+ expectedDates << QDateTime(QDate(2013, 12, 2), QTime(0,0,0), QTimeZone("America/Recife"))
220+ << QDateTime(QDate(2013, 12, 9), QTime(0,0,0), QTimeZone("America/Recife"))
221+ << QDateTime(QDate(2013, 12, 16), QTime(0,0,0), QTimeZone("America/Recife"))
222+ << QDateTime(QDate(2013, 12, 23), QTime(0,0,0), QTimeZone("America/Recife"))
223+ << QDateTime(QDate(2013, 12, 30), QTime(0,0,0), QTimeZone("America/Recife"));
224 for(int i=0; i < 5; i++) {
225 QCOMPARE(items[i].type(), QOrganizerItemType::TypeEventOccurrence);
226 QOrganizerEventTime time = items[i].detail(QOrganizerItemDetail::TypeEventTime);
227@@ -318,8 +318,8 @@
228
229 QOrganizerEvent ev;
230 ev.setCollectionId(m_collection.id());
231- ev.setStartDateTime(QDateTime(QDate(2014, 03, 1), QTime(0,0,0)));
232- ev.setEndDateTime(QDateTime(QDate(2014, 03, 1), QTime(0,30,0)));
233+ ev.setStartDateTime(QDateTime(QDate(2014, 03, 1), QTime(0,0,0), QTimeZone("America/Recife")));
234+ ev.setEndDateTime(QDateTime(QDate(2014, 03, 1), QTime(0,30,0), QTimeZone("America/Recife")));
235 ev.setDisplayLabel(displayLabelValue);
236 ev.setDescription(descriptionValue);
237
238@@ -378,12 +378,12 @@
239 &error);
240
241 QList<QDateTime> expectedDates;
242- expectedDates << QDateTime(QDate(2014, 03, 1), QTime(0,0,0))
243- << QDateTime(QDate(2014, 03, 2), QTime(0,0,0))
244- << QDateTime(QDate(2014, 03, 4), QTime(0,0,0))
245- << QDateTime(QDate(2014, 03, 5), QTime(0,0,0))
246- << QDateTime(QDate(2014, 03, 6), QTime(0,0,0))
247- << QDateTime(QDate(2014, 03, 7), QTime(0,0,0));
248+ expectedDates << QDateTime(QDate(2014, 03, 1), QTime(0,0,0), QTimeZone("America/Recife"))
249+ << QDateTime(QDate(2014, 03, 2), QTime(0,0,0), QTimeZone("America/Recife"))
250+ << QDateTime(QDate(2014, 03, 4), QTime(0,0,0), QTimeZone("America/Recife"))
251+ << QDateTime(QDate(2014, 03, 5), QTime(0,0,0), QTimeZone("America/Recife"))
252+ << QDateTime(QDate(2014, 03, 6), QTime(0,0,0), QTimeZone("America/Recife"))
253+ << QDateTime(QDate(2014, 03, 7), QTime(0,0,0), QTimeZone("America/Recife"));
254
255 QCOMPARE(items.count(), expectedDates.size());
256 for(int i=0, iMax=expectedDates.size(); i < iMax; i++) {
257@@ -393,6 +393,105 @@
258 QCOMPARE(time.startDateTime(), expectedDates[i]);
259 }
260 }
261+
262+ void testModifyAllRecurrence()
263+ {
264+ static const QString newDisplayLabel("New Display label for all items");
265+ QOrganizerItem item = createTestEvent();
266+
267+ // edit all items
268+ QMap<int, QtOrganizer::QOrganizerManager::Error> errorMap;
269+ QtOrganizer::QOrganizerManager::Error error;
270+ QList<QOrganizerItem> updateItems;
271+ QList<QtOrganizer::QOrganizerItemDetail::DetailType> mask;
272+
273+ item.setDisplayLabel(newDisplayLabel);
274+ updateItems << item;
275+
276+ bool saveResult = m_engine->saveItems(&updateItems, mask, &errorMap, &error);
277+ QCOMPARE(saveResult, true);
278+ QCOMPARE(errorMap.size(), 0);
279+ QCOMPARE(error, QOrganizerManager::NoError);
280+
281+ QOrganizerItemSortOrder sort;
282+ QOrganizerItemFetchHint hint;
283+ QOrganizerItemFilter filter;
284+ QList<QOrganizerItem> items = m_engine->items(filter,
285+ QDateTime(QDate(2013, 11, 30), QTime(0,0,0)),
286+ QDateTime(QDate(2014, 1, 1), QTime(0,0,0)),
287+ 100,
288+ sort,
289+ hint,
290+ &error);
291+ QCOMPARE(items.count(), 5);
292+ Q_FOREACH(const QOrganizerItem &i, items) {
293+ QCOMPARE(i.displayLabel(), newDisplayLabel);
294+ }
295+ }
296+
297+ void testModifyPriorEvents()
298+ {
299+ static const QString newDisplayLabel("New Display label for prior items");
300+ static const QDateTime startInteval(QDateTime(QDate(2013, 12, 2), QTime(0,0,0), QTimeZone("America/Recife")));
301+ static const QDateTime endInteval(QDateTime(QDate(2014, 1, 1), QTime(0,0,0), QTimeZone("America/Recife")));
302+
303+ QOrganizerItem item = createTestEvent();
304+
305+ QtOrganizer::QOrganizerManager::Error error;
306+ QOrganizerItemFetchHint hint;
307+ QList<QOrganizerItem> items;
308+
309+ items = m_engine->itemOccurrences(item,
310+ startInteval,
311+ endInteval,
312+ 100,
313+ hint,
314+ &error);
315+
316+ QCOMPARE(items.count(), 5);
317+ // edit only events before 16/12/2013
318+ QOrganizerEventOccurrence changeItem = static_cast<QOrganizerEventOccurrence>(items[2]);
319+ QDate changeItemDate(2013, 12, 16);
320+ QCOMPARE(changeItem.startDateTime().date(), changeItemDate);
321+
322+ // edit only one item
323+ changeItem.setDisplayLabel(newDisplayLabel);
324+ changeItem.setDescription("New Event Description");
325+
326+ QtOrganizer::QOrganizerItemSaveRequest req(m_engine);
327+ changeItem.setDisplayLabel(newDisplayLabel);
328+ req.setItem(changeItem);
329+ req.setProperty("update-mode", 1 << 1);
330+
331+ m_engine->startRequest(&req);
332+ m_engine->waitForRequestFinished(&req, 0);
333+ QCOMPARE(req.error(), QtOrganizer::QOrganizerManager::NoError);
334+
335+ QOrganizerItemSortOrder sort;
336+ QOrganizerItemFilter filter;
337+
338+ items = m_engine->items(filter,
339+ startInteval,
340+ endInteval,
341+ 100,
342+ sort,
343+ hint,
344+ &error);
345+
346+ QCOMPARE(items.count(), 5);
347+//FIXME
348+#if 0
349+ Q_FOREACH(const QOrganizerItem &i, items) {
350+ QOrganizerEventOccurrence event = static_cast<QOrganizerEventOccurrence>(i);
351+ qDebug() << i.displayLabel() << event.startDateTime().time() << i.description();
352+ //if (event.startDateTime().date() <= changeItemDate) {
353+ // QCOMPARE(i.displayLabel(), newDisplayLabel);
354+ //} else {
355+ // QCOMPARE(i.displayLabel(), item.displayLabel());
356+ //}
357+ }
358+#endif
359+ }
360 };
361
362 const QString RecurrenceTest::defaultCollectionName = QStringLiteral("TEST_RECURRENCE_EVENT_COLLECTION");

Subscribers

People subscribed via source and target branches