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
|
#include "commonheaders.h"
struct ICON_CACHE
{
ICON_CACHE::~ICON_CACHE() {
::DestroyIcon(icon);
}
HICON icon;
HANDLE hCLIcon;
SHORT mode;
};
OBJLIST<ICON_CACHE> arIcoList(10);
// ïðåîáðàçóåò mode â HICON êîòîðûé ÍÅ ÍÓÆÍÎ ðàçðóøàòü â êîíöå
static ICON_CACHE& getCacheItem(int mode, int type)
{
int m = mode & 0x0f, s = (mode & SECURED)>>4, i; // ðàçîáðàëè íà ÷àñòè - ðåæèì è ñîñòîÿíèå
HICON icon;
for (i=0; i < arIcoList.getCount(); i++)
if (arIcoList[i].mode == ((type<<8) | mode))
return arIcoList[i];
i = s;
switch(type) {
case 1: i += IEC_CL_DIS; break;
case 2: i += ICO_CM_DIS; break;
case 3: i += ICO_MW_DIS; break;
}
if (type == 1)
icon = BindOverlayIcon(g_hIEC[i], g_hICO[ICO_OV_NAT+m]);
else
icon = BindOverlayIcon(g_hICO[i], g_hICO[ICO_OV_NAT+m]);
ICON_CACHE *p = new ICON_CACHE;
p->icon = icon;
p->mode = (type << 8) | mode;
p->hCLIcon = NULL;
arIcoList.insert(p);
return *p;
}
HICON mode2icon(int mode, int type)
{
return getCacheItem(mode, type).icon;
}
HANDLE mode2clicon(int mode, int type)
{
if (!bASI && !(mode & SECURED))
return INVALID_HANDLE_VALUE;
ICON_CACHE &p = getCacheItem(mode, type);
if (p.hCLIcon == NULL)
p.hCLIcon = (HANDLE)CallService(MS_CLIST_EXTRA_ADD_ICON, (WPARAM)p.icon, 0);
return p.hCLIcon;
}
// îáíîâëÿåò èêîíêè â clist è â messagew
void ShowStatusIcon(MCONTACT hContact, int mode)
{
MCONTACT hMC = getMetaContact(hContact);
// îáíîâèòü èêîíêè â clist
if (mode != -1) {
HANDLE hIcon = mode2clicon(mode, 1);
ExtraIcon_SetIcon(g_hCLIcon, hContact, hIcon);
if (hMC)
ExtraIcon_SetIcon(g_hCLIcon, hMC, hIcon);
}
else {
ExtraIcon_Clear(g_hCLIcon, hContact);
if (hMC)
ExtraIcon_Clear(g_hCLIcon, hMC);
}
StatusIconData sid = { sizeof(sid) };
sid.szModule = (char*)MODULENAME;
for (int i = MODE_NATIVE; i < MODE_CNT; i++) {
sid.dwId = i;
sid.flags = (mode & SECURED) ? 0 : MBF_DISABLED;
if (mode == -1 || (mode & 0x0f) != i || isChatRoom(hContact))
sid.flags |= MBF_HIDDEN; // îòêëþ÷àåì âñå íåíóæíûå èêîíêè
Srmm_ModifyIcon(hContact, &sid);
if (hMC)
Srmm_ModifyIcon(hMC, &sid);
}
}
void ShowStatusIcon(MCONTACT hContact)
{
ShowStatusIcon(hContact, isContactSecured(hContact));
}
void ShowStatusIconNotify(MCONTACT hContact)
{
BYTE mode = isContactSecured(hContact);
NotifyEventHooks(g_hEvent[(mode&SECURED) != 0], (WPARAM)hContact, 0);
ShowStatusIcon(hContact,mode);
}
void RefreshContactListIcons(void)
{
for (int i=0; i < arIcoList.getCount(); i++)
arIcoList[i].hCLIcon = 0;
for (MCONTACT hContact = db_find_first(); hContact; hContact = db_find_next(hContact))
if (isSecureProtocol(hContact))
ShowStatusIcon(hContact);
}
// EOF
|