summaryrefslogtreecommitdiff
path: root/message_notify/mywindowlist.cpp
blob: 873d5792b2dbe01add6a57a972c5a8ea7f7c3485 (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
#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);
}