summaryrefslogtreecommitdiff
path: root/plugins/TabSRMM/src/contactcache.h
blob: d6684e9cd7ec8f40746bb0ac156bca07b4744e01 (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
161
162
163
164
/*
 * astyle --force-indent=tab=4 --brackets=linux --indent-switches
 *		  --pad=oper --one-line=keep-blocks  --unpad=paren
 *
 * Miranda NG: the free IM client for Microsoft* Windows*
 *
 * Copyright 2000-2009 Miranda ICQ/IM 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.
 *
 * part of tabSRMM messaging plugin for Miranda.
 *
 * (C) 2005-2009 by silvercircle _at_ gmail _dot_ com and contributors
 *
 * the contact cache
 *
 */

#ifndef __CONTACTCACHE_H
#define __CONTACTCACHE_H

#define C_INVALID_PROTO "<proto error>"
#define C_INVALID_ACCOUNT _T("<account error>")
#define C_INVALID_PROTO_T _T("<proto error>")
#define HISTORY_INITIAL_ALLOCSIZE 300


struct TInputHistory {
	TCHAR*	szText;
	size_t	lLen;
};

struct TSessionStats {
	enum {
		BYTES_RECEIVED = 1,
		BYTES_SENT = 2,
		FAILURE = 3,
		UPDATE_WITH_LAST_RCV = 4,
		SET_LAST_RCV = 5,
		INIT_TIMER = 6,
	};

	time_t   started;
	unsigned iSent, iReceived, iSentBytes, iReceivedBytes;
	unsigned messageCount;
	unsigned iFailures;
	unsigned lastReceivedChars;
	BOOL     bWritten;
};

struct CContactCache : public MZeroedObject
{
	CContactCache() {}
	CContactCache(const HANDLE hContact);
	~CContactCache()
	{
		releaseAlloced();
	}

	const bool   isValid() const { return(m_Valid); }
	const WORD   getStatus() const { return(m_wStatus); }
	const WORD   getMetaStatus() const { return(m_wMetaStatus); }
	const WORD   getActiveStatus() const { return(m_isMeta ? m_wMetaStatus : m_wStatus); }
	const WORD   getOldStatus() const { return(m_wOldStatus); }
	const TCHAR* getNick() const { return(m_szNick); }
	const HANDLE getContact() const { return(m_hContact); }
	const HANDLE getActiveContact() const { return(m_isMeta ? (m_hSubContact ? m_hSubContact : m_hContact) : m_hContact); }
	const DWORD  getIdleTS() const { return(m_idleTS); }
	const char*  getProto() const { return(m_szProto); }
	const TCHAR* getProtoT() const { return(m_tszProto); }
	const char*  getMetaProto() const { return(m_szMetaProto ? m_szMetaProto : C_INVALID_PROTO); }
	const TCHAR* getMetaProtoT() const { return(m_szMetaProto ? m_tszMetaProto : C_INVALID_PROTO_T); }
	const char*  getActiveProto() const { return(m_isMeta ? (m_szMetaProto ? m_szMetaProto : m_szProto) : m_szProto); }
	const TCHAR* getActiveProtoT() const { return(m_isMeta ? (m_szMetaProto ? m_tszMetaProto : m_tszProto) : m_tszProto); }
	bool         isMeta() const { return(m_isMeta); }
	bool         isSubContact() const { return(m_isSubcontact); }
	bool         isFavorite() const { return(m_isFavorite); }
	bool         isRecent() const { return(m_isRecent); }
	const TCHAR* getRealAccount() const { return(m_szAccount ? m_szAccount : C_INVALID_ACCOUNT); }
	const TCHAR* getUIN() const { return(m_szUIN); }
	const TCHAR* getStatusMsg() const { return(m_szStatusMsg); }
	const TCHAR* getXStatusMsg() const { return(m_xStatusMsg); }
	const TCHAR* getListeningInfo() const { return(m_ListeningInfo); }
	BYTE         getXStatusId() const { return(m_xStatus); }
	const HWND   getWindowData(TWindowData*& dat) const { dat = m_dat; return(m_hwnd); }
	const HWND   getHwnd() const { return(m_hwnd); }
	int          getMaxMessageLength();
					 
	TWindowData* getDat() const { return(m_dat); }

	void         updateStats(int iType, size_t value = 0);
	const DWORD  getSessionStart() const { return(m_stats->started); }
	const int    getSessionMsgCount() const { return((int)m_stats->messageCount) ; }

	////////////////////////////////////////////////////////////////////////////

	void   updateState();
	bool   updateStatus();
	bool   updateNick();
	void   updateMeta(bool fForce = false);
	bool   updateUIN();
	void   updateStatusMsg(const char *szKey = 0);
	void   setWindowData(const HWND hwnd = 0, TWindowData *dat = 0);
	void   resetMeta();
	void   closeWindow();
	void   deletedHandler();
	void   updateFavorite();
	TCHAR* getNormalizedStatusMsg(const TCHAR *src, bool fStripAll = false);
	HICON  getIcon(int& iSize) const;

	/*
	 * input history
	 */
	void   saveHistory(WPARAM wParam, LPARAM lParam);
	void   inputHistoryEvent(WPARAM wParam);

	static CContactCache* getContactCache(HANDLE hContact);
	static void cacheUpdateMetaChanged();

private:
	void   allocStats();
	void   initPhaseTwo();
	void   allocHistory();
	void   releaseAlloced();

	HANDLE m_hContact;
	HANDLE m_hSubContact;
	WORD   m_wStatus, m_wMetaStatus;
	WORD   m_wOldStatus;
	char*  m_szProto, *m_szMetaProto;
	TCHAR* m_tszProto, m_tszMetaProto[40];
	TCHAR* m_szAccount;
	TCHAR  m_szNick[80], m_szUIN[80];
	TCHAR* m_szStatusMsg, *m_xStatusMsg, *m_ListeningInfo;
	BYTE   m_xStatus;
	DWORD  m_idleTS;
	bool   m_isMeta, m_isSubcontact;
	bool   m_Valid;
	bool   m_isFavorite;
	bool   m_isRecent;
	HWND   m_hwnd;
	int    m_nMax;
	int    m_iHistoryCurrent, m_iHistoryTop, m_iHistorySize;

	TWindowData *m_dat;
	TSessionStats *m_stats;
	TInputHistory *m_history;
};

#endif /* __CONTACTCACHE_H */