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
|
#include "common.h"
#include "mywindowlist.h"
#include "collection.h"
class WindowList: public LinkedList<HWND> {
public:
WindowList(): LinkedList<HWND>() {}
virtual ~WindowList() {}
void PostListMessage(UINT msg, WPARAM wParam, LPARAM lParam) {
ListNode<HWND> *n = head;
while(n) {
PostMessage(n->val, msg, wParam, lParam);
n = n->next;
}
}
};
class WindowMap: public Map<HANDLE, WindowList> {
public:
WindowMap(): Map<HANDLE, WindowList>() {}
virtual ~WindowMap() {}
void Add(HANDLE hContact, HWND hWnd) {
(*this)[hContact].add(hWnd);
}
void Remove(HANDLE hContact, HWND hWnd) {
if(contains(hContact)) {
(*this)[hContact].remove(hWnd);
if((*this)[hContact].size() == 0)
remove(hContact);
}
}
void PostMapMessage(UINT msg, WPARAM wParam, LPARAM lParam) {
for(Iterator i = start(); i.has_val();i.next())
i.val().second.PostListMessage(msg, wParam, lParam);
}
};
WindowMap window_map;
CRITICAL_SECTION list_cs;
void AddToWindowList(HANDLE hContact, HWND hWnd) {
EnterCriticalSection(&list_cs);
window_map.Add(hContact, hWnd);
LeaveCriticalSection(&list_cs);
}
void RemoveFromWindowList(HANDLE hContact, HWND hWnd) {
EnterCriticalSection(&list_cs);
window_map.Remove(hContact, hWnd);
LeaveCriticalSection(&list_cs);
}
void PostMessageWindowList(UINT msg, WPARAM wParam, LPARAM lParam) {
EnterCriticalSection(&list_cs);
window_map.PostMapMessage(msg, wParam, lParam);
LeaveCriticalSection(&list_cs);
}
void PostMessageWindowListContact(HANDLE hContact, UINT msg, WPARAM wParam, LPARAM lParam) {
EnterCriticalSection(&list_cs);
if(window_map.contains(hContact))
window_map[hContact].PostListMessage(msg, wParam, lParam);
LeaveCriticalSection(&list_cs);
}
bool InList(HANDLE hContact, HWND hWnd) {
bool ret = false;
EnterCriticalSection(&list_cs);
if(window_map.contains(hContact) && window_map[hContact].contains(hWnd))
ret = true;
LeaveCriticalSection(&list_cs);
return ret;
}
int CountList(HANDLE hContact) {
int count = 0;
EnterCriticalSection(&list_cs);
if(window_map.contains(hContact))
count = window_map[hContact].size();
LeaveCriticalSection(&list_cs);
return count;
}
bool EmptyList(HANDLE hContact) {
EnterCriticalSection(&list_cs);
bool ret = !window_map.contains(hContact);
LeaveCriticalSection(&list_cs);
return ret;
}
void InitWindowList() {
InitializeCriticalSection(&list_cs);
}
void DeinitWindowList() {
DeleteCriticalSection(&list_cs);
}
|