diff --git a/src/calendarmanager.cpp b/src/calendarmanager.cpp index c6f69268..ed77cd29 100644 --- a/src/calendarmanager.cpp +++ b/src/calendarmanager.cpp @@ -53,7 +53,7 @@ CalendarManager::CalendarManager() qRegisterMetaType("CalendarEvent::Recur"); qRegisterMetaType >("QHash"); qRegisterMetaType("CalendarData::Event"); - qRegisterMetaType >("QMultiHash"); + qRegisterMetaType >("QHash"); qRegisterMetaType >("QHash"); qRegisterMetaType("CalendarData::Range"); qRegisterMetaType >("QList"); @@ -138,20 +138,26 @@ void CalendarManager::setDefaultNotebook(const QString ¬ebookUid) Q_ARG(QString, notebookUid)); } +static QString instanceIdentifier(const QString &uid, const QDateTime &recurrenceId) +{ + KCalendarCore::Event inc; + inc.setUid(uid); + inc.setRecurrenceId(recurrenceId); + return inc.instanceIdentifier(); +} + CalendarStoredEvent* CalendarManager::eventObject(const QString &eventUid, const QDateTime &recurrenceId) { - QMultiHash::iterator it = mEventObjects.find(eventUid); - while (it != mEventObjects.end() && it.key() == eventUid) { - if ((*it)->recurrenceId() == recurrenceId) { - return *it; - } - ++it; + const QString id = instanceIdentifier(eventUid, recurrenceId); + const QHash::ConstIterator it = mEventObjects.find(id); + if (it != mEventObjects.constEnd()) { + return *it; } - CalendarData::Event event = getEvent(eventUid, recurrenceId); + CalendarData::Event event = mEvents.value(id); if (event.isValid()) { CalendarStoredEvent *calendarEvent = new CalendarStoredEvent(this, &event); - mEventObjects.insert(eventUid, calendarEvent); + mEventObjects.insert(id, calendarEvent); return calendarEvent; } @@ -501,13 +507,9 @@ void CalendarManager::doAgendaAndQueryRefresh() if (eventUid.isEmpty()) continue; - const QDateTime recurrenceId = query->recurrenceId(); - KCalendarCore::Event missing; - missing.setUid(eventUid); - missing.setRecurrenceId(recurrenceId); - const QString id = missing.instanceIdentifier(); + const QString id = instanceIdentifier(eventUid, query->recurrenceId()); bool loaded = mLoadedQueries.contains(id); - CalendarData::Event event = getEvent(eventUid, recurrenceId); + CalendarData::Event event = mEvents.value(id); if (((!event.isValid() && !loaded) || mResetPending) && !missingInstanceList.contains(id)) { missingInstanceList << id; @@ -522,8 +524,8 @@ void CalendarManager::doAgendaAndQueryRefresh() if (id.isEmpty()) continue; - bool loaded; - CalendarData::Event event = getEvent(id, &loaded); + bool loaded = mLoadedQueries.contains(id); + CalendarData::Event event = mEvents.value(id); if (((!event.isValid() && !loaded) || mResetPending) && !missingInstanceList.contains(id)) { missingInstanceList << id; @@ -583,42 +585,12 @@ QString CalendarManager::convertEventToICalendarSync(const QString &uid, const Q return vEvent; } -CalendarData::Event CalendarManager::getEvent(const QString &uid, const QDateTime &recurrenceId) -{ - QMultiHash::iterator it = mEvents.find(uid); - while (it != mEvents.end() && it.key() == uid) { - if (it.value().recurrenceId == recurrenceId) { - return it.value(); - } - ++it; - } - - return CalendarData::Event(); -} - CalendarData::Event CalendarManager::getEvent(const QString &instanceIdentifier, bool *loaded) const { if (loaded) { *loaded = mLoadedQueries.contains(instanceIdentifier); } - // See CalendarWorker::loadData(), in case where instanceIdentifier is not the - // UID, the event structure is duplicated with the key as the instanceIdentifier. - QList events = mEvents.values(instanceIdentifier); - if (events.count() == 1) { - // Either the event is not recurring or it's an exception. - return events[0]; - } else if (events.count() > 1) { - // The event is recurring with exception, we look for the parent. - QList::ConstIterator it = events.constBegin(); - while (it != events.constEnd()) { - if (!it->recurrenceId.isValid()) { - return *it; - } - ++it; - } - } - - return CalendarData::Event(); + return mEvents.value(instanceIdentifier); } bool CalendarManager::sendResponse(const QString &uid, const QDateTime &recurrenceId, CalendarEvent::Response response) @@ -665,7 +637,7 @@ void CalendarManager::storageModifiedSlot() void CalendarManager::calendarTimezoneChangedSlot() { - QMultiHash::ConstIterator it; + QHash::ConstIterator it; for (it = mEventObjects.constBegin(); it != mEventObjects.constEnd(); it++) { // Actually, the date times have not changed, but // their representation in local time (as used in QML) @@ -763,7 +735,7 @@ CalendarEventOccurrence* CalendarManager::getNextOccurrence(const QString &uid, const QDateTime &start) { CalendarData::EventOccurrence eo; - const CalendarData::Event event = getEvent(uid, recurrenceId); + const CalendarData::Event event = mEvents.value(instanceIdentifier(uid, recurrenceId)); if (event.recur == CalendarEvent::RecurOnce) { const QTimeZone systemTimeZone = QTimeZone::systemTimeZone(); eo.eventUid = event.uniqueId; @@ -813,18 +785,11 @@ QList CalendarManager::getEventAttendees(const QString & void CalendarManager::dataLoadedSlot(const QList &ranges, const QStringList &instanceList, - const QMultiHash &events, + const QHash &events, const QHash &occurrences, const QHash &dailyOccurrences, bool reset) { - QList oldEvents; - foreach (const QString &uid, mEventObjects.keys()) { - // just add all matching uid, change signal emission will match recurrence ids - if (events.contains(uid)) - oldEvents.append(mEvents.values(uid)); - } - if (reset) { mEvents.clear(); mEventOccurrences.clear(); @@ -843,30 +808,14 @@ void CalendarManager::dataLoadedSlot(const QList &ranges, mEventOccurrenceForDates.insert(it.key(), it.value()); mLoadPending = false; - foreach (const CalendarData::Event &oldEvent, oldEvents) { - const CalendarData::Event &event = getEvent(oldEvent.uniqueId, oldEvent.recurrenceId); - if (event.isValid()) - sendEventChangeSignals(event); + for (QHash::ConstIterator it = mEventObjects.constBegin(); + it != mEventObjects.constEnd(); it++) { + const QHash::ConstIterator event = mEvents.find(it.key()); + if (event != mEvents.constEnd()) { + it.value()->setEvent(&(*event)); + } } emit dataUpdated(); mTimer->start(); } - -void CalendarManager::sendEventChangeSignals(const CalendarData::Event &newEvent) -{ - CalendarStoredEvent *eventObject = 0; - QMultiHash::iterator it = mEventObjects.find(newEvent.uniqueId); - while (it != mEventObjects.end() && it.key() == newEvent.uniqueId) { - if (it.value()->recurrenceId() == newEvent.recurrenceId) { - eventObject = it.value(); - break; - } - ++it; - } - - if (!eventObject) - return; - - eventObject->setEvent(&newEvent); -} diff --git a/src/calendarmanager.h b/src/calendarmanager.h index 9cfa03ca..0e71a1d8 100644 --- a/src/calendarmanager.h +++ b/src/calendarmanager.h @@ -75,7 +75,6 @@ class CalendarManager : public QObject // Event CalendarData::Event getEvent(const QString& instanceIdentifier, bool *loaded = nullptr) const; - CalendarData::Event getEvent(const QString& uid, const QDateTime &recurrenceId); CalendarData::Event dissociateSingleOccurrence(const QString &eventUid, const QDateTime &recurrenceId) const; bool sendResponse(const QString &uid, const QDateTime &recurrenceId, CalendarEvent::Response response); @@ -125,7 +124,7 @@ private slots: void notebooksChangedSlot(const QList ¬ebooks); void dataLoadedSlot(const QList &ranges, const QStringList &instanceList, - const QMultiHash &events, + const QHash &events, const QHash &occurrences, const QHash &dailyOccurrences, bool reset); @@ -153,12 +152,11 @@ private slots: QList addRanges(const QList &oldRanges, const QList &newRanges); void updateAgendaModel(CalendarAgendaModel *model); - void sendEventChangeSignals(const CalendarData::Event &newEvent); QThread mWorkerThread; CalendarWorker *mCalendarWorker; - QMultiHash mEvents; - QMultiHash mEventObjects; + QHash mEvents; + QHash mEventObjects; QHash mEventOccurrences; QHash mEventOccurrenceForDates; QList mAgendaRefreshList; diff --git a/src/calendarworker.cpp b/src/calendarworker.cpp index 02c70e41..3ce62d44 100644 --- a/src/calendarworker.cpp +++ b/src/calendarworker.cpp @@ -679,7 +679,7 @@ void CalendarWorker::loadData(const QList &ranges, if (reset) mSentEvents.clear(); - QMultiHash events; + QHash events; bool orphansDeleted = false; const KCalendarCore::Event::List list = mCalendar->rawEvents(); @@ -714,11 +714,7 @@ void CalendarWorker::loadData(const QList &ranges, if (!mSentEvents.contains(id)) { CalendarData::Event event = createEventStruct(e, notebook); mSentEvents.insert(id); - events.insert(event.uniqueId, event); - if (id != event.uniqueId) { - // Ensures that events can also be retrieved by instanceIdentifier - events.insert(id, event); - } + events.insert(id, event); } } @@ -775,7 +771,7 @@ CalendarData::Event CalendarWorker::createEventStruct(const KCalendarCore::Event void CalendarWorker::search(const QString &searchString, int limit) { QStringList identifiers; - QMultiHash events; + QHash events; if (mStorage->search(searchString, &identifiers, limit)) { emit searchResults(searchString, identifiers); @@ -790,11 +786,7 @@ void CalendarWorker::search(const QString &searchString, int limit) mKCal::Notebook::Ptr notebook = mStorage->notebook(mCalendar->notebook(incidence)); CalendarData::Event event = createEventStruct(incidence.staticCast(), notebook); mSentEvents.insert(identifiers[i]); - events.insert(event.uniqueId, event); - if (identifiers[i] != event.uniqueId) { - // Ensures that events can also be retrieved by instanceIdentifier - events.insert(identifiers[i], event); - } + events.insert(identifiers[i], event); } } } diff --git a/src/calendarworker.h b/src/calendarworker.h index 5d9f931a..3966efce 100644 --- a/src/calendarworker.h +++ b/src/calendarworker.h @@ -106,7 +106,7 @@ public slots: void dataLoaded(const QList &ranges, const QStringList &instanceList, - const QMultiHash &events, + const QHash &events, const QHash &occurrences, const QHash &dailyOccurrences, bool reset);