summaryrefslogtreecommitdiff
path: root/plugins/TabSRMM/src/contactcache.h
blob: ec1f8e4bb0d975b5caa3e2ecfdb3637d6b888cc1 (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 (c) 2000-09 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 HCONTACT 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 HCONTACT getContact() const { return(m_hContact); }
	const HCONTACT 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(HCONTACT hContact);
	static void cacheUpdateMetaChanged();

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

	HCONTACT m_hContact;
	HCONTACT 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 */