From 7578f068b6dd10641ced7d08d5eebb4654c4911c Mon Sep 17 00:00:00 2001 From: Vadim Dashevskiy Date: Fri, 14 Feb 2014 15:34:14 +0000 Subject: Dbx_tree moved to deprecated git-svn-id: http://svn.miranda-ng.org/main/trunk@8122 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/!Deprecated/Dbx_tree/src/DataBase.h | 232 ++++++++++++++++++++++++++++ 1 file changed, 232 insertions(+) create mode 100644 plugins/!Deprecated/Dbx_tree/src/DataBase.h (limited to 'plugins/!Deprecated/Dbx_tree/src/DataBase.h') diff --git a/plugins/!Deprecated/Dbx_tree/src/DataBase.h b/plugins/!Deprecated/Dbx_tree/src/DataBase.h new file mode 100644 index 0000000000..6f3cc07b6e --- /dev/null +++ b/plugins/!Deprecated/Dbx_tree/src/DataBase.h @@ -0,0 +1,232 @@ +/* + +dbx_tree: tree database driver for Miranda IM + +Copyright 2007-2010 Michael "Protogenes" Kunz, + +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. + +*/ + +#pragma once + +#include +#include "MREWSync.h" + +#include "Events.h" +#include "Settings.h" +#include "Entities.h" + +#include "FileAccess.h" +#include "MappedMemory.h" +#include "DirectAccess.h" +#include "Blockmanager.h" + +#include "sigslot.h" + +#include "EncryptionManager.h" + +typedef enum TDBFileType { + DBFileSetting = 0, + DBFilePrivate = 1, + DBFileMax = 2 +} TDBFileType; + +static const uint8_t cFileSignature[DBFileMax][20] = {"Miranda IM Settings", "Miranda IM DataTree"}; +static const uint32_t cDBVersion = 0x00000001; + +static const uint32_t cHeaderBlockSignature = 0x7265491E; + +#pragma pack(push, 1) // push current alignment to stack, set alignment to 1 byte boundary + +typedef struct TSettingsHeader { + uint8_t Signature[20]; /// signature must be cSettingsHeader + uint32_t Version; /// internal DB version cDataBaseVersion + uint32_t Obscure; + TFileEncryption FileEncryption; /// Encryption Method + uint32_t FileStructureBlock; /// Offset of CBlockManager master block + uint32_t FileSize; /// Offset to the last used byte + 1 + uint32_t Settings; /// Offset to the SettingsBTree RootNode + uint8_t Reserved[256 - sizeof(TFileEncryption) - 20 - 5*sizeof(uint32_t)]; /// reserved storage +} TSettingsHeader; + +typedef struct TPrivateHeader { + uint8_t Signature[20]; /// signature must be CDataHeader + uint32_t Version; /// internal DB version cDataBaseVersion + uint32_t Obscure; + TFileEncryption FileEncryption; /// Encryption Method + uint32_t FileStructureBlock; /// Offset of CBlockManager master block + uint32_t FileSize; /// Offset to the last used byte + 1 + uint32_t RootEntity; /// Offset to the Root CList Entity + uint32_t Entities; /// Offset to the EntityBTree RootNode + uint32_t Virtuals; /// Offset to the VirtualsBTree RootNode + uint8_t Reserved[256 - sizeof(TFileEncryption) - 20 - 7*sizeof(uint32_t)]; /// reserved storage +} TPrivateHeader; + + +typedef union TGenericFileHeader { + struct { + uint8_t Signature[20]; /// signature must be cSettingsHeader + uint32_t Version; /// internal DB version cDataBaseVersion + uint32_t Obscure; + TFileEncryption FileEncryption; /// Encryption Method + uint32_t FileStructureBlock; /// Offset of CBlockManager master block + uint32_t FileSize; /// Offset to the last used byte + 1 + uint8_t Reserved[256 - sizeof(TFileEncryption) - 20 - 4*sizeof(uint32_t)]; /// reserved storage + } Gen; + TSettingsHeader Set; + TPrivateHeader Pri; +} TGenericFileHeader; + +#pragma pack(pop) + +class CDataBase : public sigslot::has_slots<>, public MIDatabase +{ +private: + TCHAR* m_FileName[DBFileMax]; + bool m_Opened; + + CBlockManager *m_BlockManager[DBFileMax]; + CFileAccess *m_FileAccess[DBFileMax]; + TGenericFileHeader * m_Header[DBFileMax]; + CEncryptionManager *m_EncryptionManager[DBFileMax]; + + uint32_t m_HeaderBlock[DBFileMax]; + + void onSettingsRootChanged(CSettings* Settings, CSettingsTree::TNodeRef NewRoot); + void onVirtualsRootChanged(void* Virtuals, CVirtuals::TNodeRef NewRoot); + void onEntitiesRootChanged(void* Entities, CEntities::TNodeRef NewRoot); + void onFileSizeChanged(CFileAccess * File, uint32_t Size); + + bool PrivateFileExists(); + bool CreateNewFile(TDBFileType File); + + int CheckFile(TDBFileType Index); + int LoadFile(TDBFileType Index); +protected: + CEntities *m_Entities; + CSettings *m_Settings; + CEvents *m_Events; + + void ReWriteHeader(TDBFileType Index); + +public: + CDataBase(const TCHAR* FileName); + virtual ~CDataBase(); + + int CreateDB(); + int CheckDB(); + int OpenDB(); + + CEntities & getEntities() + { + return *m_Entities; + } + CSettings & getSettings() + { + return *m_Settings; + } + CEvents & getEvents() + { + return *m_Events; + } + + int getProfileName(int BufferSize, char * Buffer); + int getProfilePath(int BufferSize, char * Buffer); + +public: // services + INT_PTR __cdecl DBEntityGetRoot(WPARAM wParam, LPARAM lParam); + INT_PTR __cdecl DBEntityChildCount(WPARAM hEntity, LPARAM lParam); + INT_PTR __cdecl DBEntityGetParent(WPARAM hEntity, LPARAM lParam); + INT_PTR __cdecl DBEntityMove(WPARAM hEntity, LPARAM hParent); + INT_PTR __cdecl DBEntityGetFlags(WPARAM hEntity, LPARAM lParam); + INT_PTR __cdecl DBEntityIterInit(WPARAM pFilter, LPARAM hParent); + INT_PTR __cdecl DBEntityIterNext(WPARAM hIteration, LPARAM lParam); + INT_PTR __cdecl DBEntityIterClose(WPARAM hIteration, LPARAM lParam); + INT_PTR __cdecl DBEntityDelete(WPARAM hEntity, LPARAM lParam); + INT_PTR __cdecl DBEntityCreate(WPARAM pEntity, LPARAM lParam); + INT_PTR __cdecl DBEntityGetAccount(WPARAM hEntity, LPARAM lParam); + + INT_PTR __cdecl DBVirtualEntityCreate(WPARAM hEntity, LPARAM hParent); + INT_PTR __cdecl DBVirtualEntityGetParent(WPARAM hVirtualEntity, LPARAM lParam); + INT_PTR __cdecl DBVirtualEntityGetFirst(WPARAM hEntity, LPARAM lParam); + INT_PTR __cdecl DBVirtualEntityGetNext(WPARAM hVirtualEntity, LPARAM lParam); + + INT_PTR __cdecl DBSettingFind(WPARAM pSettingDescriptor, LPARAM lParam); + INT_PTR __cdecl DBSettingDelete(WPARAM pSettingDescriptor, LPARAM lParam); + INT_PTR __cdecl DBSettingDeleteHandle(WPARAM hSetting, LPARAM lParam); + INT_PTR __cdecl DBSettingWrite(WPARAM pSetting, LPARAM lParam); + INT_PTR __cdecl DBSettingWriteHandle(WPARAM pSetting, LPARAM hSetting); + INT_PTR __cdecl DBSettingRead(WPARAM pSetting, LPARAM lParam); + INT_PTR __cdecl DBSettingReadHandle(WPARAM pSetting, LPARAM hSetting); + INT_PTR __cdecl DBSettingIterInit(WPARAM pFilter, LPARAM lParam); + INT_PTR __cdecl DBSettingIterNext(WPARAM hIteration, LPARAM lParam); + INT_PTR __cdecl DBSettingIterClose(WPARAM hIteration, LPARAM lParam); + + INT_PTR __cdecl DBEventGetBlobSize(WPARAM hEvent, LPARAM lParam); + INT_PTR __cdecl DBEventGet(WPARAM hEvent, LPARAM pEvent); + INT_PTR __cdecl DBEventGetCount(WPARAM hEntity, LPARAM lParam); + INT_PTR __cdecl DBEventDelete(WPARAM hEvent, LPARAM lParam); + INT_PTR __cdecl DBEventAdd(WPARAM hEntity, LPARAM pEvent); + INT_PTR __cdecl DBEventMarkRead(WPARAM hEvent, LPARAM lParam); + INT_PTR __cdecl DBEventWriteToDisk(WPARAM hEvent, LPARAM lParam); + INT_PTR __cdecl DBEventGetEntity(WPARAM hEvent, LPARAM lParam); + INT_PTR __cdecl DBEventIterInit(WPARAM pFilter, LPARAM lParam); + INT_PTR __cdecl DBEventIterNext(WPARAM hIteration, LPARAM lParam); + INT_PTR __cdecl DBEventIterClose(WPARAM hIteration, LPARAM lParam); + + bool RegisterServices(); + + typedef INT_PTR ( __cdecl CDataBase::*DbServiceFunc )( WPARAM, LPARAM ); + void CreateDbService(const char *szServiceName, DbServiceFunc pFunc); + +protected: // to be compatible with the standard Miranda databases + 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_(HANDLE) AddContact(void); + STDMETHODIMP_(BOOL) IsDbContact(MCONTACT contactID); + + STDMETHODIMP_(LONG) GetEventCount(MCONTACT contactID); + STDMETHODIMP_(HANDLE) AddEvent(MCONTACT contactID, DBEVENTINFO *dbe); + STDMETHODIMP_(BOOL) DeleteEvent(MCONTACT contactID, HANDLE hDbEvent); + STDMETHODIMP_(LONG) GetBlobSize(HANDLE hDbEvent); + STDMETHODIMP_(BOOL) GetEvent(HANDLE hDbEvent, DBEVENTINFO *dbe); + STDMETHODIMP_(BOOL) MarkEventRead(MCONTACT contactID, HANDLE hDbEvent); + STDMETHODIMP_(MCONTACT) GetEventContact(HANDLE hDbEvent); + STDMETHODIMP_(HANDLE) FindFirstEvent(MCONTACT contactID); + STDMETHODIMP_(HANDLE) FindFirstUnreadEvent(MCONTACT contactID); + STDMETHODIMP_(HANDLE) FindLastEvent(MCONTACT contactID); + STDMETHODIMP_(HANDLE) FindNextEvent(HANDLE hDbEvent); + STDMETHODIMP_(HANDLE) FindPrevEvent(HANDLE 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); + + int CheckProto(DBCachedContact *cc, const char *proto); +}; -- cgit v1.2.3