summaryrefslogtreecommitdiff
path: root/plugins/Db3x_mmap/dbintf.h
blob: ac5a1c25b57a7cdcd30d6228ee3327e0d824a0f9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
/*

Miranda NG: the free IM client for Microsoft* Windows*

Copyright 2012 Miranda NG project,
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.
*/

#include <m_db_int.h>

struct ModuleName
{
	char *name;
	DWORD ofs;
};

struct CDdxMmap : public MIDatabase, public MZeroedObject
{
	CDdxMmap(const TCHAR* tszFileName);
	~CDdxMmap();

	int Load(bool bSkipInit);
	int Create(void);
	int CreateDbHeaders();
	int CheckDbHeaders();
	void DatabaseCorruption(TCHAR *text);

protected:
	STDMETHODIMP_(void)   SetCacheSafetyMode(BOOL);

	STDMETHODIMP_(LONG)   GetContactCount(void);
	STDMETHODIMP_(HANDLE) FindFirstContact(const char* szProto = NULL);
	STDMETHODIMP_(HANDLE) FindNextContact(HANDLE hContact, const char* szProto = NULL);
	STDMETHODIMP_(LONG)   DeleteContact(HANDLE hContact);
	STDMETHODIMP_(HANDLE) AddContact(void);
	STDMETHODIMP_(BOOL)   IsDbContact(HANDLE hContact);

	STDMETHODIMP_(LONG)   GetEventCount(HANDLE hContact);
	STDMETHODIMP_(HANDLE) AddEvent(HANDLE hContact, DBEVENTINFO *dbe);
	STDMETHODIMP_(BOOL)   DeleteEvent(HANDLE hContact, HANDLE hDbEvent);
	STDMETHODIMP_(LONG)   GetBlobSize(HANDLE hDbEvent);
	STDMETHODIMP_(BOOL)   GetEvent(HANDLE hDbEvent, DBEVENTINFO *dbe);
	STDMETHODIMP_(BOOL)   MarkEventRead(HANDLE hContact, HANDLE hDbEvent);
	STDMETHODIMP_(HANDLE) GetEventContact(HANDLE hDbEvent);
	STDMETHODIMP_(HANDLE) FindFirstEvent(HANDLE hContact);
	STDMETHODIMP_(HANDLE) FindFirstUnreadEvent(HANDLE hContact);
	STDMETHODIMP_(HANDLE) FindLastEvent(HANDLE hContact);
	STDMETHODIMP_(HANDLE) FindNextEvent(HANDLE hDbEvent);
	STDMETHODIMP_(HANDLE) FindPrevEvent(HANDLE hDbEvent);

	STDMETHODIMP_(BOOL)   EnumModuleNames(DBMODULEENUMPROC pFunc, void *pParam);

	STDMETHODIMP_(BOOL)   GetContactSetting(HANDLE hContact, DBCONTACTGETSETTING *dbcgs);
	STDMETHODIMP_(BOOL)   GetContactSettingStr(HANDLE hContact, DBCONTACTGETSETTING *dbcgs);
	STDMETHODIMP_(BOOL)   GetContactSettingStatic(HANDLE hContact, DBCONTACTGETSETTING *dbcgs);
	STDMETHODIMP_(BOOL)   FreeVariant(DBVARIANT *dbv);
	STDMETHODIMP_(BOOL)   WriteContactSetting(HANDLE hContact, DBCONTACTWRITESETTING *dbcws);
	STDMETHODIMP_(BOOL)   DeleteContactSetting(HANDLE hContact, DBCONTACTGETSETTING *dbcgs);
	STDMETHODIMP_(BOOL)   EnumContactSettings(HANDLE hContact, DBCONTACTENUMSETTINGS* dbces);
	STDMETHODIMP_(BOOL)   SetSettingResident(BOOL bIsResident, const char *pszSettingName);
	STDMETHODIMP_(BOOL)   EnumResidentSettings(DBMODULEENUMPROC pFunc, void *pParam);

private:
	TCHAR*   m_tszProfileName;
	HANDLE   m_hDbFile;
	DBHeader m_dbHeader;
	DWORD    m_ChunkSize;
	BOOL     m_safetyMode;
	
	////////////////////////////////////////////////////////////////////////////
	// database stuff
public:	
	UINT_PTR m_flushBuffersTimerId;
	DWORD    m_flushFailTick;
	PBYTE    m_pDbCache;

private:
	PBYTE    m_pNull;
	HANDLE   m_hMap;
	DWORD    m_dwFileSize;

	CRITICAL_SECTION m_csDbAccess;

	int   CheckProto(HANDLE hContact, const char *proto);
	DWORD CreateNewSpace(int bytes);
	void  DeleteSpace(DWORD ofs, int bytes);
	DWORD ReallocSpace(DWORD ofs, int oldSize, int newSize);

	void  Map();
	void  ReMap(DWORD needed);
	void  DBMoveChunk(DWORD ofsDest, DWORD ofsSource, int bytes);
	PBYTE DBRead(DWORD ofs, int bytesRequired, int *bytesAvail);
	void  DBWrite(DWORD ofs, PVOID pData, int bytes);
	void  DBFill(DWORD ofs, int bytes);
	void  DBFlush(int setting);
	int   InitCache(void);

	__forceinline PBYTE DBRead(HANDLE hContact, int bytesRequired, int *bytesAvail)
	{	return DBRead((DWORD)hContact, bytesRequired, bytesAvail);
	}

	////////////////////////////////////////////////////////////////////////////
	// settings 

	int m_codePage;

	HANDLE m_hCacheHeap;
	HANDLE m_hLastCachedContact;
	char* m_lastSetting;
	DBCachedContactValueList *m_lastVL;

	LIST<DBCachedContactValueList> m_lContacts;
	LIST<DBCachedGlobalValue> m_lGlobalSettings;
	LIST<char> m_lSettings, m_lResidentSettings;
	HANDLE hSettingChangeEvent, hContactDeletedEvent, hContactAddedEvent;

	DWORD GetSettingsGroupOfsByModuleNameOfs(DBContact *dbc,DWORD ofsModuleName);
	char* InsertCachedSetting(const char* szName, size_t cbNameLen);
	char* GetCachedSetting(const char *szModuleName,const char *szSettingName, int moduleNameLen, int settingNameLen);
	void SetCachedVariant(DBVARIANT* s, DBVARIANT* d);
	void FreeCachedVariant(DBVARIANT* V);
	DBVARIANT* GetCachedValuePtr(HANDLE hContact, char* szSetting, int bAllocate);
	int GetContactSettingWorker(HANDLE hContact,DBCONTACTGETSETTING *dbcgs,int isStatic);

	////////////////////////////////////////////////////////////////////////////
	// contacts

	DBCachedContactValueList* AddToCachedContactList(HANDLE hContact, int index);

	////////////////////////////////////////////////////////////////////////////
	// modules

	HANDLE m_hModHeap;
	LIST<ModuleName> m_lMods, m_lOfs;
	HANDLE hEventAddedEvent, hEventDeletedEvent, hEventFilterAddedEvent;
	ModuleName *m_lastmn;

	void  AddToList(char *name, DWORD len, DWORD ofs);
	DWORD FindExistingModuleNameOfs(const char *szName);
	int   InitModuleNames(void);
	DWORD GetModuleNameOfs(const char *szName);
	char *GetModuleNameByOfs(DWORD ofs);
};

extern LIST<CDdxMmap> g_Dbs;