void CDb3Mmap::DeleteSpace(DWORD ofs, int bytes) { if (ofs + bytes == m_dbHeader.ofsFileEnd) { log2("freespace %d@%08x", bytes, ofs); m_dbHeader.ofsFileEnd = ofs; } else { log2("deletespace %d@%08x", bytes, ofs); m_dbHeader.slackSpace += bytes; } DBWrite(0, &m_dbHeader, sizeof(m_dbHeader)); DBFill(ofs, bytes); }
void CDb3Mmap::ToggleEventsEncryption(MCONTACT contactID) { DWORD ofsContact = GetContactOffset(contactID); if (ofsContact == 0) return; DBContact contact = *(DBContact*)DBRead(ofsContact, NULL); if (contact.ofsFirstEvent == 0 || contact.signature != DBCONTACT_SIGNATURE) return; // fast cycle through all events for (DWORD offset = contact.ofsFirstEvent; offset != 0;) { DBEvent evt = *(DBEvent*)DBRead(offset, NULL); if (evt.signature != DBEVENT_SIGNATURE) return; size_t len; DWORD ofsDest; mir_ptr<BYTE> pBlob; BYTE *pSource = DBRead(offset + offsetof(DBEvent, blob), 0); if (!m_bEncrypted) { // we need more space if ((pBlob = m_crypto->encodeBuffer(pSource, evt.cbBlob, &len)) == NULL) return; ofsDest = ReallocSpace(offset, offsetof(DBEvent, blob) + evt.cbBlob, offsetof(DBEvent, blob) + (DWORD)len); if (evt.ofsNext) { DBEvent *e = (DBEvent*)DBRead(evt.ofsNext, NULL); e->ofsPrev = ofsDest; DBWrite(evt.ofsNext, e, sizeof(DBEvent)); } if (evt.ofsPrev) { DBEvent *e = (DBEvent*)DBRead(evt.ofsPrev, NULL); e->ofsNext = ofsDest; DBWrite(evt.ofsPrev, e, sizeof(DBEvent)); } if (contact.ofsFirstEvent == offset) contact.ofsFirstEvent = ofsDest; if (contact.ofsLastEvent == offset) contact.ofsLastEvent = ofsDest; if (contact.ofsFirstUnread == offset) contact.ofsFirstUnread = ofsDest; evt.flags |= DBEF_ENCRYPTED; } else { if ((pBlob = (BYTE*)m_crypto->decodeBuffer(pSource, evt.cbBlob, &len)) == NULL) return; ofsDest = offset; // reuse the old space evt.flags &= ~DBEF_ENCRYPTED; if (len < evt.cbBlob) DBFill(ofsDest + offsetof(DBEvent, blob) + (DWORD)len, evt.cbBlob - (DWORD)len); } evt.cbBlob = (DWORD)len; DBWrite(ofsDest, &evt, offsetof(DBEvent, blob)); DBWrite(ofsDest + offsetof(DBEvent, blob), pBlob, (DWORD)len); offset = evt.ofsNext; } DBWrite(ofsContact, &contact, sizeof(DBContact)); }