diff options
-rw-r--r-- | plugins/Import/src/import.cpp | 7 | ||||
-rw-r--r-- | src/mir_app/src/MDatabaseCommon.cpp | 56 |
2 files changed, 57 insertions, 6 deletions
diff --git a/plugins/Import/src/import.cpp b/plugins/Import/src/import.cpp index 8ebafa0aa4..22716620bf 100644 --- a/plugins/Import/src/import.cpp +++ b/plugins/Import/src/import.cpp @@ -878,8 +878,11 @@ void CImportBatch::ImportHistory(MCONTACT hContact, PROTOACCOUNT **protocol, int BYTE *eventBuf = (PBYTE)mir_alloc(cbAlloc);
// Get the start of the event chain
- MEVENT hEvent = srcDb->FindFirstEvent(hContact);
- for (int i = 0; hEvent; i++, hEvent = srcDb->FindNextEvent(hContact, hEvent)) {
+ int i = 0;
+ DB::ECPTR pCursor(srcDb->EventCursor(hContact, 0));
+ while (MEVENT hEvent = pCursor.FetchNext()) {
+ i++;
+
// Copy the event and import it
DBEVENTINFO dbei = {};
dbei.cbBlob = srcDb->GetBlobSize(hEvent);
diff --git a/src/mir_app/src/MDatabaseCommon.cpp b/src/mir_app/src/MDatabaseCommon.cpp index 787c6609bd..23537f1dc0 100644 --- a/src/mir_app/src/MDatabaseCommon.cpp +++ b/src/mir_app/src/MDatabaseCommon.cpp @@ -583,12 +583,60 @@ STDMETHODIMP_(MIDatabaseChecker *) MDatabaseCommon::GetChecker() ///////////////////////////////////////////////////////////////////////////////////////// // Event cursors -STDMETHODIMP_(DB::EventCursor *) MDatabaseCommon::EventCursor(MCONTACT, MEVENT) +class CCompatiblityCursor : public DB::EventCursor { - return nullptr; + MDatabaseCommon *db; + MEVENT curr; + +public: + CCompatiblityCursor(MDatabaseCommon *pDb, MCONTACT hContact, MEVENT hEvent) : + DB::EventCursor(hContact), + db(pDb) + { + curr = (hEvent == 0) ? db->FindFirstEvent(hContact) : db->FindNextEvent(hContact, hEvent); + } + + MEVENT FetchNext() override + { + if (curr == 0) + return 0; + + MEVENT ret = curr; curr = db->FindNextEvent(hContact, curr); + return ret; + } +}; + +STDMETHODIMP_(DB::EventCursor*) MDatabaseCommon::EventCursor(MCONTACT hContact, MEVENT hEvent) +{ + return new CCompatiblityCursor(this, hContact, hEvent); } -STDMETHODIMP_(DB::EventCursor *) MDatabaseCommon::EventCursorRev(MCONTACT, MEVENT) +///////////////////////////////////////////////////////////////////////////////////////// + +class CCompatiblityCursorRev : public DB::EventCursor { - return nullptr; + MDatabaseCommon *db; + MEVENT curr; + +public: + CCompatiblityCursorRev(MDatabaseCommon *pDb, MCONTACT hContact, MEVENT hEvent) : + DB::EventCursor(hContact), + db(pDb) + { + curr = (hEvent == 0) ? db->FindLastEvent(hContact) : db->FindPrevEvent(hContact, hEvent); + } + + MEVENT FetchNext() override + { + if (curr == 0) + return 0; + + MEVENT ret = curr; curr = db->FindPrevEvent(hContact, curr); + return ret; + } +}; + +STDMETHODIMP_(DB::EventCursor*) MDatabaseCommon::EventCursorRev(MCONTACT hContact, MEVENT hEvent) +{ + return new CCompatiblityCursorRev(this, hContact, hEvent); } |