summaryrefslogtreecommitdiff
path: root/plugins/TabSRMM/src/contactcache.h
blob: cc9c4d1a66ae92fb94e6eb189c90970db0e5ad6e (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
/////////////////////////////////////////////////////////////////////////////////////////
// Miranda NG: the free IM client for Microsoft* Windows*
//
// Copyright (c) 2012-14 Miranda NG project,
// 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-2010 by silvercircle _at_ gmail _dot_ com and contributors
//
// the contact cache

#ifndef __CONTACTCACHE_H
#define __CONTACTCACHE_H

#define C_INVALID_ACCOUNT _T("<account 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 MCONTACT hContact);
	~CContactCache()
	{
		releaseAlloced();
	}

	const bool     isValid() const { return m_Valid; }
	const WORD     getStatus() const { return m_wStatus; }
	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 MCONTACT getContact() const { return m_hContact; }
	const MCONTACT getActiveContact() const { return (m_isMeta) ? m_hSub : m_hContact; }
	const DWORD    getIdleTS() const { return m_idleTS; }
	const char*    getProto() const { return cc->szProto; }
	const char*    getActiveProto() const { return m_isMeta ? (m_szMetaProto ? m_szMetaProto : cc->szProto) : cc->szProto; }
	bool           isMeta() const { return m_isMeta; }
	bool           isSubContact() const { return cc->IsSub(); }
	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   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(MCONTACT hContact);
	static int cacheUpdateMetaChanged(WPARAM wParam, LPARAM lParam);

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

	MCONTACT m_hContact, m_hSub;
	WORD     m_wStatus, m_wOldStatus, m_wMetaStatus;
	char    *m_szMetaProto;
	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;
	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;
	DBCachedContact *cc;
};

#endif /* __CONTACTCACHE_H */