util.filters: Don't traceback when trying to remove a filter from an uninitialized...
[prosody.git] / 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 function initialize(session)
14         local filters = {};
15         session.filters = filters;
16         
17         function session.filter(type, data)
18                 local filter_list = filters[type];
19                 for i = 1, #filter_list do
20                         data = filter_list[i](data);
21                 end
22                 return data;
23         end
24 end
25
26 function add_filter(session, type, callback, priority)
27         if not session.filters then
28                 initialize(session);
29         end
30         
31         local filter_list = session.filters[type];
32         if not filter_list then
33                 filter_list = {};
34                 session.filters[type] = filter_list;
35         end
36         
37         priority = priority or 0;
38         
39         local i = 0;
40         repeat
41                 i = i + 1;
42         until not filter_list[i] or filter_list[filter_list[i]] >= priority;
43         
44         t_insert(filter_list, i, callback);
45         filter_list[callback] = priority;
46 end
47
48 function remove_filter(session, type, callback)
49         if not session.filters then return; end
50         local filter_list = session.filters[type];
51         if filter_list and filter_list[callback] then
52                 for i=1, #filter_list do
53                         if filter_list[i] == callback then
54                                 t_remove(filter_list, i);
55                                 filter_list[callback] = nil;
56                                 return true;
57                         end
58                 end
59         end
60 end
61
62 return _M;