From b81bd804e435e76592f9f281b717c696c3618fa2 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Sun, 15 Mar 2015 15:30:03 +0000 Subject: initial release git-svn-id: http://svn.miranda-ng.org/main/trunk@12409 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/Dbx_kv/src/dbintf.h | 306 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 306 insertions(+) create mode 100644 plugins/Dbx_kv/src/dbintf.h (limited to 'plugins/Dbx_kv/src/dbintf.h') diff --git a/plugins/Dbx_kv/src/dbintf.h b/plugins/Dbx_kv/src/dbintf.h new file mode 100644 index 0000000000..4a65db7fda --- /dev/null +++ b/plugins/Dbx_kv/src/dbintf.h @@ -0,0 +1,306 @@ +/* + +Miranda NG: the free IM client for Microsoft* Windows* + +Copyright (ñ) 2012-15 Miranda NG project (http://miranda-ng.org) +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#define OWN_CACHED_CONTACT + +#include + +/* tree diagram + +DBHeader +|-->end of file (plain offset) +|-->first contact (DBContact) +| |-->next contact (DBContact) +| | \--> ... +| |-->first settings (DBContactSettings) +| | |-->next settings (DBContactSettings) +| | | \--> ... +| | \-->module name (DBModuleName) +| \-->first/last/firstunread event +|-->user contact (DBContact) +| |-->next contact = NULL +| |-->first settings as above +| \-->first/last/firstunread event as above +\-->first module name (DBModuleName) +\-->next module name (DBModuleName) +\--> ... +*/ + +#define DBMODE_SHARED 0x0001 +#define DBMODE_READONLY 0x0002 + +#define DBVT_ENCRYPTED 250 +#define DBVT_UNENCRYPTED 251 + +#define MARKED_READ (DBEF_READ | DBEF_SENT) + +struct ModuleName +{ + char *name; + DWORD ofs; +}; + +#include + +#define DBHEADER_SIGNATURE 0x40DECADEu +struct DBHeader +{ + DWORD dwSignature; + DWORD dwVersion; // database format version +}; + +#define DBCONTACT_SIGNATURE 0x43DECADEu +struct DBContact +{ + DWORD dwSignature; + DWORD dwEventCount; // number of events in the chain for this contact + DWORD tsFirstUnread; + DWORD dwFirstUnread; +}; + +#define DBMODULENAME_SIGNATURE 0x4DDECADEu +struct DBModuleName +{ + DWORD dwSignature; + BYTE cbName; // number of characters in this module name + char name[1]; // name, no nul terminator +}; + +#define DBEVENT_SIGNATURE 0x45DECADEu +struct DBEvent +{ + DWORD dwSignature; + MCONTACT contactID; // a contact this event belongs to + DWORD ofsModuleName; // offset to a DBModuleName struct of the name of + DWORD timestamp; // seconds since 00:00:00 01/01/1970 + DWORD flags; // see m_database.h, db/event/add + WORD wEventType; // module-defined event type + WORD cbBlob; // number of bytes in the blob + + bool __forceinline markedRead() const + { + return (flags & MARKED_READ) != 0; + } +}; + +#include + +struct DBEventSortingKey +{ + DWORD dwContactId, ts, dwEventId; +}; + +struct DBSettingSortingKey +{ + DWORD dwContactID; + DWORD dwOfsModule; + char szSettingName[100]; +}; + +struct DBCachedContact : public DBCachedContactBase +{ + void Advance(DWORD id, DBEvent &dbe); + + DBContact dbc; +}; + +struct CDbxKV : public MIDatabase, public MIDatabaseChecker, public MZeroedObject +{ + CDbxKV(const TCHAR *tszFileName, int mode); + ~CDbxKV(); + + int Load(bool bSkipInit); + int Create(void); + int Check(void); + + void DatabaseCorruption(const TCHAR *ptszText); + + void ToggleEncryption(void); + void StoreKey(void); + void SetPassword(const TCHAR *ptszPassword); + void UpdateMenuItem(void); + + int PrepareCheck(int*); + + __forceinline LPSTR GetMenuTitle() const { return m_bUsesPassword ? LPGEN("Change/remove password") : LPGEN("Set password"); } + + __forceinline bool isEncrypted() const { return m_bEncrypted; } + __forceinline bool usesPassword() const { return m_bUsesPassword; } + +public: + STDMETHODIMP_(void) SetCacheSafetyMode(BOOL); + + STDMETHODIMP_(LONG) GetContactCount(void); + STDMETHODIMP_(MCONTACT) FindFirstContact(const char *szProto = NULL); + STDMETHODIMP_(MCONTACT) FindNextContact(MCONTACT contactID, const char *szProto = NULL); + STDMETHODIMP_(LONG) DeleteContact(MCONTACT contactID); + STDMETHODIMP_(MCONTACT) AddContact(void); + STDMETHODIMP_(BOOL) IsDbContact(MCONTACT contactID); + STDMETHODIMP_(LONG) GetContactSize(void); + + STDMETHODIMP_(LONG) GetEventCount(MCONTACT contactID); + STDMETHODIMP_(MEVENT) AddEvent(MCONTACT contactID, DBEVENTINFO *dbe); + STDMETHODIMP_(BOOL) DeleteEvent(MCONTACT contactID, MEVENT hDbEvent); + STDMETHODIMP_(LONG) GetBlobSize(MEVENT hDbEvent); + STDMETHODIMP_(BOOL) GetEvent(MEVENT hDbEvent, DBEVENTINFO *dbe); + STDMETHODIMP_(BOOL) MarkEventRead(MCONTACT contactID, MEVENT hDbEvent); + STDMETHODIMP_(MCONTACT) GetEventContact(MEVENT hDbEvent); + STDMETHODIMP_(MEVENT) FindFirstEvent(MCONTACT contactID); + STDMETHODIMP_(MEVENT) FindFirstUnreadEvent(MCONTACT contactID); + STDMETHODIMP_(MEVENT) FindLastEvent(MCONTACT contactID); + STDMETHODIMP_(MEVENT) FindNextEvent(MCONTACT contactID, MEVENT hDbEvent); + STDMETHODIMP_(MEVENT) FindPrevEvent(MCONTACT contactID, MEVENT hDbEvent); + + STDMETHODIMP_(BOOL) EnumModuleNames(DBMODULEENUMPROC pFunc, void *pParam); + + STDMETHODIMP_(BOOL) GetContactSetting(MCONTACT contactID, LPCSTR szModule, LPCSTR szSetting, DBVARIANT *dbv); + STDMETHODIMP_(BOOL) GetContactSettingStr(MCONTACT contactID, LPCSTR szModule, LPCSTR szSetting, DBVARIANT *dbv); + STDMETHODIMP_(BOOL) GetContactSettingStatic(MCONTACT contactID, LPCSTR szModule, LPCSTR szSetting, DBVARIANT *dbv); + STDMETHODIMP_(BOOL) FreeVariant(DBVARIANT *dbv); + STDMETHODIMP_(BOOL) WriteContactSetting(MCONTACT contactID, DBCONTACTWRITESETTING *dbcws); + STDMETHODIMP_(BOOL) DeleteContactSetting(MCONTACT contactID, LPCSTR szModule, LPCSTR szSetting); + STDMETHODIMP_(BOOL) EnumContactSettings(MCONTACT contactID, DBCONTACTENUMSETTINGS *dbces); + STDMETHODIMP_(BOOL) SetSettingResident(BOOL bIsResident, const char *pszSettingName); + STDMETHODIMP_(BOOL) EnumResidentSettings(DBMODULEENUMPROC pFunc, void *pParam); + STDMETHODIMP_(BOOL) IsSettingEncrypted(LPCSTR szModule, LPCSTR szSetting); + + STDMETHODIMP_(BOOL) MetaDetouchSub(DBCachedContact *cc, int nSub); + STDMETHODIMP_(BOOL) MetaSetDefault(DBCachedContact *cc); + STDMETHODIMP_(BOOL) MetaMergeHistory(DBCachedContact *ccMeta, DBCachedContact *ccSub); + STDMETHODIMP_(BOOL) MetaSplitHistory(DBCachedContact *ccMeta, DBCachedContact *ccSub); + +protected: + STDMETHODIMP_(BOOL) Start(DBCHeckCallback *callback); + STDMETHODIMP_(BOOL) CheckDb(int phase, int firstTime); + STDMETHODIMP_(VOID) Destroy(); + +protected: + void InvalidateSettingsGroupOfsCacheEntry(DWORD) {} + int WorkInitialCheckHeaders(void); + + void FillContacts(void); + +public: // Check functions + int WorkInitialChecks(int); + int WorkModuleChain(int); + int WorkUser(int); + int WorkContactChain(int); + int WorkAggressive(int); + int WorkFinalTasks(int); + +protected: + TCHAR* m_tszProfileName; + bool m_safetyMode, m_bReadOnly, m_bShared, m_bEncrypted, m_bUsesPassword; + + //////////////////////////////////////////////////////////////////////////// + // database stuff +public: + MICryptoEngine *m_crypto; + +protected: + ham_env_t *m_pMdbEnv; + ham_db_t *m_dbGlobal; + DBHeader m_header; + + HANDLE hSettingChangeEvent, hContactDeletedEvent, hContactAddedEvent, hEventMarkedRead; + + mir_cs m_csDbAccess; + + int CheckProto(DBCachedContact *cc, const char *proto); + + //////////////////////////////////////////////////////////////////////////// + // settings + + ham_db_t *m_dbSettings; + int m_codePage; + HANDLE hService, hHook; + + //////////////////////////////////////////////////////////////////////////// + // contacts + + ham_db_t *m_dbContacts; + int m_contactCount, m_dwMaxContactId; + + int WipeContactHistory(DBContact *dbc); + + //////////////////////////////////////////////////////////////////////////// + // events + + ham_db_t *m_dbEvents, *m_dbEventsSort; + DWORD m_dwMaxEventId, m_tsLast; + MEVENT m_evLast; + + void FindNextUnread(DBCachedContact *cc, DBEventSortingKey &key2); + + //////////////////////////////////////////////////////////////////////////// + // modules + + ham_db_t *m_dbModules; + HANDLE m_hModHeap; + LIST m_lMods, m_lOfs; + LIST m_lResidentSettings; + HANDLE hEventAddedEvent, hEventDeletedEvent, hEventFilterAddedEvent; + MCONTACT m_hLastCachedContact; + int m_maxModuleID; + + void AddToList(char *name, DWORD ofs); + DWORD FindExistingModuleNameOfs(const char *szName); + int InitModuleNames(void); + DWORD GetModuleNameOfs(const char *szName); + char* GetModuleNameByOfs(DWORD ofs); + + //////////////////////////////////////////////////////////////////////////// + // checker + + int PeekSegment(DWORD ofs, PVOID buf, int cbBytes); + int ReadSegment(DWORD ofs, PVOID buf, int cbBytes); + int ReadWrittenSegment(DWORD ofs, PVOID buf, int cbBytes); + int SignatureValid(DWORD ofs, DWORD dwSignature); + void FreeModuleChain(); + + DWORD ConvertModuleNameOfs(DWORD ofsOld); + void ConvertOldEvent(DBEvent*& dbei); + + int GetContactSettingWorker(MCONTACT contactID, LPCSTR szModule, LPCSTR szSetting, DBVARIANT *dbv, int isStatic); + int WorkSettingsChain(DBContact *dbc, int firstTime); + int WorkEventChain(DWORD ofsContact, DBContact *dbc, int firstTime); + + DWORD WriteSegment(DWORD ofs, PVOID buf, int cbBytes); + DWORD WriteEvent(DBEvent *dbe); + DWORD PeekEvent(DWORD ofs, DWORD dwContactID, DBEvent &dbe); + void WriteOfsNextToPrevious(DWORD ofsPrev, DBContact *dbc, DWORD ofsNext); + void FinishUp(DWORD ofsLast, DBContact *dbc); + + DBCHeckCallback *cb; + DWORD sourceFileSize, ofsAggrCur; + + //////////////////////////////////////////////////////////////////////////// + // encryption + + int InitCrypt(void); + void ToggleEventsEncryption(MCONTACT contactID); + void ToggleSettingsEncryption(MCONTACT contactID); + + void InitDialogs(); + bool EnterPassword(const BYTE *pKey, const size_t keyLen); +}; -- cgit v1.2.3