STDMETHODIMP_(HANDLE) CDataBase::FindFirstContact(const char* szProto) { HANDLE hContact = (HANDLE)getEntities().compFirstContact(); if (!szProto || CheckProto(hContact, szProto)) return hContact; return FindNextContact(hContact, szProto); }
static INT_PTR FindFirstContact(WPARAM wParam,LPARAM lParam) { INT_PTR ret = 0; EnterCriticalSection(&csDbAccess); ret = (INT_PTR)dbHeader.ofsFirstContact; if (lParam && !CheckProto((HANDLE)ret,(const char*)lParam)) ret = FindNextContact((WPARAM)ret,lParam); LeaveCriticalSection(&csDbAccess); return ret; }
STDMETHODIMP_(MCONTACT) CDb3Mmap::FindFirstContact(const char *szProto) { mir_cslock lck(m_csDbAccess); DBCachedContact *cc = m_cache->GetFirstContact(); if (cc == NULL) return NULL; if (!szProto || CheckProto(cc, szProto)) return cc->contactID; return FindNextContact(cc->contactID, szProto); }
STDMETHODIMP_(HANDLE) CDataBase::FindNextContact(HANDLE hContact, const char* szProto) { while (hContact) { DBCachedContact *VL = m_cache->GetCachedContact(hContact); if (VL == NULL) VL = m_cache->AddContactToCache(hContact); if (VL->hNext != NULL) { if (!szProto || CheckProto(VL->hNext, szProto)) return VL->hNext; hContact = VL->hNext; continue; } VL->hNext = (HANDLE)getEntities().compNextContact((WPARAM)hContact); if (VL->hNext != NULL && (!szProto || CheckProto(VL->hNext, szProto))) return VL->hNext; hContact = VL->hNext; } return NULL; }
static INT_PTR FindNextContact(WPARAM wParam,LPARAM lParam) { int index; struct DBContact *dbc; DBCachedContactValueList VLtemp, *VL = NULL; VLtemp.hContact = (HANDLE)wParam; EnterCriticalSection(&csDbAccess); while(VLtemp.hContact) { if ( li.List_GetIndex(&lContacts,&VLtemp,&index)) { VL = ( DBCachedContactValueList* )lContacts.items[index]; if (VL->hNext != NULL) { if (!lParam || CheckProto(VL->hNext,(const char*)lParam)) { LeaveCriticalSection(&csDbAccess); return (INT_PTR)VL->hNext; } else { VLtemp.hContact = VL->hNext; continue; } } } dbc=(struct DBContact*)DBRead((DWORD)VLtemp.hContact,sizeof(struct DBContact),NULL); if (dbc->signature!=DBCONTACT_SIGNATURE) break; else { if ( VL == NULL ) VL = AddToCachedContactList(VLtemp.hContact,index); VL->hNext = (HANDLE)dbc->ofsNext; if (VL->hNext != NULL && (!lParam || CheckProto(VL->hNext,(const char*)lParam))) { LeaveCriticalSection(&csDbAccess); return (INT_PTR)VL->hNext; } VLtemp.hContact = VL->hNext; } } LeaveCriticalSection(&csDbAccess); return 0; }
STDMETHODIMP_(MCONTACT) CDbxKV::FindNextContact(MCONTACT contactID, const char *szProto) { mir_cslock lck(m_csDbAccess); while (contactID) { DBCachedContact *cc = m_cache->GetNextContact(contactID); if (cc == NULL) break; if (!szProto || CheckProto(cc, szProto)) return cc->contactID; contactID = cc->contactID; } return NULL; }
void CDbxKV::FillContacts() { m_contactCount = 0; ham_key_t key = { 0 }; ham_record_t rec = { 0 }; cursor_ptr cursor(m_dbContacts); if (ham_cursor_move(cursor, &key, &rec, HAM_CURSOR_FIRST) != HAM_SUCCESS) // empty table? return; do { DBContact *dbc = (DBContact*)rec.data; if (dbc->dwSignature != DBCONTACT_SIGNATURE) DatabaseCorruption(NULL); DBCachedContact *cc = m_cache->AddContactToCache(*(DWORD*)key.data); cc->dbc.dwSignature = DBCONTACT_SIGNATURE; cc->dbc.dwEventCount = dbc->dwEventCount; cc->dbc.dwFirstUnread = dbc->dwFirstUnread; cc->dbc.tsFirstUnread = dbc->tsFirstUnread; CheckProto(cc, ""); m_dwMaxContactId = cc->contactID+1; m_contactCount++; DBVARIANT dbv; dbv.type = DBVT_DWORD; cc->nSubs = (0 != GetContactSetting(cc->contactID, META_PROTO, "NumContacts", &dbv)) ? -1 : dbv.dVal; if (cc->nSubs != -1) { cc->pSubs = (MCONTACT*)mir_alloc(cc->nSubs*sizeof(MCONTACT)); for (int i = 0; i < cc->nSubs; i++) { char setting[100]; mir_snprintf(setting, SIZEOF(setting), "Handle%d", i); cc->pSubs[i] = (0 != GetContactSetting(cc->contactID, META_PROTO, setting, &dbv)) ? NULL : dbv.dVal; } } cc->nDefault = (0 != GetContactSetting(cc->contactID, META_PROTO, "Default", &dbv)) ? -1 : dbv.dVal; cc->parentID = (0 != GetContactSetting(cc->contactID, META_PROTO, "ParentMeta", &dbv)) ? NULL : dbv.dVal; } while (ham_cursor_move(cursor, &key, &rec, HAM_CURSOR_NEXT) == HAM_SUCCESS); }
void CDbxKyoto::FillContacts() { m_contactCount = 0; size_t size; cursor_ptr cursor(m_dbContacts); for (cursor->jump(); cursor->step();) { const char *pRec, *pKey = cursor->get(&size, &pRec, &size); DBContact *dbc = (DBContact*)pRec; if (dbc->dwSignature != DBCONTACT_SIGNATURE) DatabaseCorruption(NULL); DBCachedContact *cc = m_cache->AddContactToCache(*(DWORD*)pKey); cc->dbc.dwSignature = DBCONTACT_SIGNATURE; cc->dbc.dwEventCount = dbc->dwEventCount; cc->dbc.dwFirstUnread = dbc->dwFirstUnread; cc->dbc.tsFirstUnread = dbc->tsFirstUnread; CheckProto(cc, ""); m_dwMaxContactId = cc->contactID+1; m_contactCount++; DBVARIANT dbv; dbv.type = DBVT_DWORD; cc->nSubs = (0 != GetContactSetting(cc->contactID, META_PROTO, "NumContacts", &dbv)) ? -1 : dbv.dVal; if (cc->nSubs != -1) { cc->pSubs = (MCONTACT*)mir_alloc(cc->nSubs*sizeof(MCONTACT)); for (int i = 0; i < cc->nSubs; i++) { char setting[100]; mir_snprintf(setting, SIZEOF(setting), "Handle%d", i); cc->pSubs[i] = (0 != GetContactSetting(cc->contactID, META_PROTO, setting, &dbv)) ? NULL : dbv.dVal; } } cc->nDefault = (0 != GetContactSetting(cc->contactID, META_PROTO, "Default", &dbv)) ? -1 : dbv.dVal; cc->parentID = (0 != GetContactSetting(cc->contactID, META_PROTO, "ParentMeta", &dbv)) ? NULL : dbv.dVal; delete[] pKey; } }
void CDb3Mmap::FillContacts() { OBJLIST<COldMeta> arMetas(10, NumericKeySortT); for (DWORD dwOffset = m_dbHeader.ofsFirstContact; dwOffset != 0;) { DBContact *p = (DBContact*)DBRead(dwOffset, NULL); if (p->signature != DBCONTACT_SIGNATURE) break; DWORD dwContactID; if (m_dbHeader.version >= DB_095_VERSION) { dwContactID = p->dwContactID; if (dwContactID > m_dwMaxContactId) m_dwMaxContactId = dwContactID + 1; } else dwContactID = m_dwMaxContactId++; DBCachedContact *cc = m_cache->AddContactToCache(dwContactID); cc->dwDriverData = dwOffset; CheckProto(cc, ""); DBVARIANT dbv; dbv.type = DBVT_DWORD; cc->nSubs = (0 != GetContactSetting(dwContactID, META_PROTO, "NumContacts", &dbv)) ? -1 : dbv.dVal; if (cc->nSubs != -1) { cc->pSubs = (MCONTACT*)mir_alloc(cc->nSubs*sizeof(MCONTACT)); for (int i = 0; i < cc->nSubs; i++) { char setting[100]; mir_snprintf(setting, SIZEOF(setting), "Handle%d", i); 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; cc->parentID = (0 != GetContactSetting(dwContactID, META_PROTO, "ParentMeta", &dbv)) ? NULL : dbv.dVal; // whether we need conversion or not if (!GetContactSetting(dwContactID, META_PROTO, "MetaID", &dbv)) arMetas.insert(new COldMeta(dbv.dVal, cc)); dwOffset = p->ofsNext; } // no need in conversion? quit then if (m_bReadOnly || arMetas.getCount() == 0) return; DBVARIANT dbv; dbv.type = DBVT_DWORD; 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 (int(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"); WipeContactHistory((DBContact*)DBRead(ccMeta->dwDriverData, NULL)); } for (int k = 0; k < ccMeta->nSubs; k++) { DBCachedContact *ccSub = m_cache->GetCachedContact(ccMeta->pSubs[k]); if (ccSub) { ccSub->parentID = hContact; MetaMergeHistory(ccMeta, ccSub); } } } }