summaryrefslogtreecommitdiff
path: root/plugins/Db3x_mmap
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/Db3x_mmap')
-rw-r--r--plugins/Db3x_mmap/src/dbcontacts.cpp86
-rw-r--r--plugins/Db3x_mmap/src/dbintf.cpp3
-rw-r--r--plugins/Db3x_mmap/src/dbintf.h10
-rw-r--r--plugins/Db3x_mmap/src/dbtool/contactchain.cpp3
-rw-r--r--plugins/Db3x_mmap/src/version.h2
5 files changed, 61 insertions, 43 deletions
diff --git a/plugins/Db3x_mmap/src/dbcontacts.cpp b/plugins/Db3x_mmap/src/dbcontacts.cpp
index 44af1cdc95..2fdf598252 100644
--- a/plugins/Db3x_mmap/src/dbcontacts.cpp
+++ b/plugins/Db3x_mmap/src/dbcontacts.cpp
@@ -298,6 +298,8 @@ BOOL CDb3Mmap::MetaMergeHistory(DBCachedContact *ccMeta, DBCachedContact *ccSub)
return ret;
}
+/////////////////////////////////////////////////////////////////////////////////////////
+
BOOL CDb3Mmap::MetaSplitHistory(DBCachedContact *ccMeta, DBCachedContact *ccSub)
{
mir_cslock lck(m_csDbAccess);
@@ -376,10 +378,22 @@ BOOL CDb3Mmap::MetaSplitHistory(DBCachedContact *ccMeta, DBCachedContact *ccSub)
return ret;
}
+/////////////////////////////////////////////////////////////////////////////////////////
+// initial cycle to fill the contacts' cache
+
+struct COldMeta
+{
+ COldMeta(DWORD _id, DBCachedContact *_cc) :
+ hMetaID(_id), cc(_cc)
+ {}
+
+ DWORD hMetaID;
+ DBCachedContact *cc;
+};
void CDb3Mmap::FillContacts()
{
- LIST<void> arMetas(10);
+ OBJLIST<COldMeta> arMetas(10, NumericKeySortT);
for (DWORD dwOffset = m_dbHeader.ofsFirstContact; dwOffset != 0;) {
DBContact *p = (DBContact*)DBRead(dwOffset, sizeof(DBContact), NULL);
@@ -401,17 +415,7 @@ void CDb3Mmap::FillContacts()
for (int i = 0; i < cc->nSubs; i++) {
char setting[100];
mir_snprintf(setting, sizeof(setting), "Handle%d", i);
- MCONTACT hSub = (0 != GetContactSetting(dwContactID, META_PROTO, setting, &dbv)) ? NULL : dbv.dVal;
- ConvertedContact *pcc = m_contactsMap.find((ConvertedContact*)&hSub);
- if (pcc != NULL) {
- hSub = pcc->hNew;
-
- DBCONTACTWRITESETTING dbws = { META_PROTO, setting };
- dbws.value.type = DBVT_DWORD;
- dbws.value.dVal = hSub;
- WriteContactSetting(dwContactID, &dbws);
- }
- cc->pSubs[i] = hSub;
+ cc->pSubs[i] = (0 != GetContactSetting(dwContactID, META_PROTO, setting, &dbv)) ? NULL : dbv.dVal;
}
}
cc->nDefault = (0 != GetContactSetting(dwContactID, META_PROTO, "Default", &dbv)) ? -1 : dbv.dVal;
@@ -419,18 +423,56 @@ void CDb3Mmap::FillContacts()
// whether we need conversion or not
if (!GetContactSetting(dwContactID, META_PROTO, "MetaID", &dbv))
- arMetas.insert((void*)dwContactID);
+ arMetas.insert(new COldMeta(dbv.dVal, cc));
dwOffset = p->ofsNext;
}
+ // no need in conversion? quit then
+ if (arMetas.getCount() == 0)
+ return;
+
DBVARIANT dbv; dbv.type = DBVT_DWORD;
- for (int i = 0; i < arMetas.getCount(); i++) {
- MCONTACT hContact = (MCONTACT)arMetas[i];
- DBCachedContact *ccMeta = m_cache->GetCachedContact(hContact);
- if (ccMeta == NULL)
+ for (MCONTACT hh = FindFirstContact(); hh; hh = FindNextContact(hh)) {
+ if (GetContactSetting(hh, META_PROTO, "MetaLink", &dbv))
+ continue;
+
+ COldMeta *p = arMetas.find((COldMeta*)&dbv.dVal);
+ if (p == NULL)
+ continue;
+
+ if (GetContactSetting(hh, META_PROTO, "ContactNumber", &dbv))
continue;
+ DBCONTACTWRITESETTING dbws = { META_PROTO };
+ dbws.value.type = DBVT_DWORD;
+
+ DBCachedContact *ccMeta = p->cc;
+ if (dbv.dVal < ccMeta->nSubs) {
+ ccMeta->pSubs[dbv.dVal] = hh;
+
+ char setting[100];
+ mir_snprintf(setting, sizeof(setting), "Handle%d", dbv.dVal);
+ dbws.szSetting = setting;
+ dbws.value.dVal = hh;
+ WriteContactSetting(ccMeta->contactID, &dbws);
+ }
+
+ // store contact id instead of the old mc number
+ dbws.szSetting = "ParentMeta";
+ dbws.value.dVal = ccMeta->contactID;
+ WriteContactSetting(hh, &dbws);
+
+ // wipe out old data from subcontacts
+ DeleteContactSetting(hh, META_PROTO, "ContactNumber");
+ DeleteContactSetting(hh, META_PROTO, "MetaLink");
+ }
+
+ for (int i = 0; i < arMetas.getCount(); i++) {
+ COldMeta &p = arMetas[i];
+ DBCachedContact *ccMeta = p.cc;
+ MCONTACT hContact = ccMeta->contactID;
+
// we don't need it anymore
if (!GetContactSetting(hContact, META_PROTO, "MetaID", &dbv)) {
DeleteContactSetting(hContact, META_PROTO, "MetaID");
@@ -438,16 +480,6 @@ void CDb3Mmap::FillContacts()
}
for (int k = 0; k < ccMeta->nSubs; k++) {
- // store contact id instead of the old mc number
- DBCONTACTWRITESETTING dbws = { META_PROTO, "ParentMeta" };
- dbws.value.type = DBVT_DWORD;
- dbws.value.dVal = hContact;
- WriteContactSetting(ccMeta->pSubs[k], &dbws);
-
- // wipe out old data from subcontacts
- DeleteContactSetting(ccMeta->pSubs[k], META_PROTO, "ContactNumber");
- DeleteContactSetting(ccMeta->pSubs[k], META_PROTO, "MetaLink");
-
DBCachedContact *ccSub = m_cache->GetCachedContact(ccMeta->pSubs[k]);
if (ccSub) {
ccSub->parentID = hContact;
diff --git a/plugins/Db3x_mmap/src/dbintf.cpp b/plugins/Db3x_mmap/src/dbintf.cpp
index 99d0126696..96fee79626 100644
--- a/plugins/Db3x_mmap/src/dbintf.cpp
+++ b/plugins/Db3x_mmap/src/dbintf.cpp
@@ -52,8 +52,7 @@ CDb3Mmap::CDb3Mmap(const TCHAR *tszFileName, int iMode) :
m_dwMaxContactId(1),
m_lMods(50, ModCompare),
m_lOfs(50, OfsCompare),
- m_lResidentSettings(50, stringCompare2),
- m_contactsMap(50, NumericKeySortT)
+ m_lResidentSettings(50, stringCompare2)
{
m_tszProfileName = mir_tstrdup(tszFileName);
InitDbInstance(this);
diff --git a/plugins/Db3x_mmap/src/dbintf.h b/plugins/Db3x_mmap/src/dbintf.h
index 7765644baf..700fc465b0 100644
--- a/plugins/Db3x_mmap/src/dbintf.h
+++ b/plugins/Db3x_mmap/src/dbintf.h
@@ -173,14 +173,6 @@ struct DBEvent
#include <poppack.h>
-struct ConvertedContact
-{
- ConvertedContact(MCONTACT _old, MCONTACT _new) :
- hOld(_old), hNew(_new) {}
-
- MCONTACT hOld, hNew;
-};
-
struct CDb3Mmap : public MIDatabase, public MIDatabaseChecker, public MZeroedObject
{
CDb3Mmap(const TCHAR *tszFileName, int mode);
@@ -317,8 +309,6 @@ protected:
////////////////////////////////////////////////////////////////////////////
// contacts
- OBJLIST<ConvertedContact> m_contactsMap;
-
int WipeContactHistory(DBContact *dbc);
////////////////////////////////////////////////////////////////////////////
diff --git a/plugins/Db3x_mmap/src/dbtool/contactchain.cpp b/plugins/Db3x_mmap/src/dbtool/contactchain.cpp
index d149bd0e86..36dc7cf239 100644
--- a/plugins/Db3x_mmap/src/dbtool/contactchain.cpp
+++ b/plugins/Db3x_mmap/src/dbtool/contactchain.cpp
@@ -72,9 +72,6 @@ LBL_FinishUp:
WriteSegment(ofsDestPrevContact + offsetof(DBContact, ofsNext), &ofsDestThis, sizeof(DWORD));
else
m_dbHeader.ofsFirstContact = ofsDestThis;
-
- if (m_dbHeader.version < DB_095_VERSION)
- m_contactsMap.insert(new ConvertedContact(ofsThisContact, ofsDestThis));
}
else ofsDestThis = ofsThisContact; // needed in event chain worker
diff --git a/plugins/Db3x_mmap/src/version.h b/plugins/Db3x_mmap/src/version.h
index 3622fa9133..0e20cc7daf 100644
--- a/plugins/Db3x_mmap/src/version.h
+++ b/plugins/Db3x_mmap/src/version.h
@@ -1,7 +1,7 @@
#define __MAJOR_VERSION 0
#define __MINOR_VERSION 95
#define __RELEASE_NUM 1
-#define __BUILD_NUM 2
+#define __BUILD_NUM 3
#include <stdver.h>