util/filters.lua

1
-- Prosody IM
2
-- Copyright (C) 2008-2010 Matthew Wild
3
-- Copyright (C) 2008-2010 Waqas Hussain
4
-- 
5
-- This project is MIT/X11 licensed. Please see the
6
-- COPYING file in the source package for more information.
7
--
8
 
9
local t_insert, t_remove = table.insert, table.remove;
10
 
11
module "filters"
12
 
13
local new_filter_hooks = {};
14
 
15
function initialize(session)
16
	if not session.filters then
17
		local filters = {};
18
		session.filters = filters;
19
		
20
		function session.filter(type, data)
21
			local filter_list = filters[type];
22
			if filter_list then
23
				for i = 1, #filter_list do
24
					data = filter_list[i](data, session);
25
					if data == nil then break; end
26
				end
27
			end
28
			return data;
29
		end
30
	end
31
	
32
	for i=1,#new_filter_hooks do
33
		new_filter_hooks[i](session);
34
	end
35
	
36
	return session.filter;
37
end
38
 
39
function add_filter(session, type, callback, priority)
40
	if not session.filters then
41
		initialize(session);
42
	end
43
	
44
	local filter_list = session.filters[type];
45
	if not filter_list then
46
		filter_list = {};
47
		session.filters[type] = filter_list;
48
	end
49
	
50
	priority = priority or 0;
51
	
52
	local i = 0;
53
	repeat
54
		i = i + 1;
55
	until not filter_list[i] or filter_list[filter_list[i]] >= priority;
56
	
57
	t_insert(filter_list, i, callback);
58
	filter_list[callback] = priority;
59
end
60
 
61
function remove_filter(session, type, callback)
62
	if not session.filters then return; end
63
	local filter_list = session.filters[type];
64
	if filter_list and filter_list[callback] then
65
		for i=1, #filter_list do
66
			if filter_list[i] == callback then
67
				t_remove(filter_list, i);
68
				filter_list[callback] = nil;
69
				return true;
70
			end
71
		end
72
	end
73
end
74
 
75
function add_filter_hook(callback)
76
	t_insert(new_filter_hooks, callback);
77
end
78
 
79
function remove_filter_hook(callback)
80
	for i=1,#new_filter_hooks do
81
		if new_filter_hooks[i] == callback then
82
			t_remove(new_filter_hooks, i);
83
		end
84
	end
85
end
86
 
87
return _M;