summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugins/Import/src/import.cpp7
-rw-r--r--src/mir_app/src/MDatabaseCommon.cpp56
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);
}