util.filters: Add newline at end of file
[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         if not session.filters then
15                 local filters = {};
16                 session.filters = filters;
17                 
18                 function session.filter(type, data)
19                         local filter_list = filters[type];
20                         if filter_list then
21                                 for i = 1, #filter_list do
22                                         data = filter_list[i](data);
23                                         if data == nil then break; end
24                                 end
25                         end
26                         return data;
27                 end
28         end
29         return session.filter;
30 end
31
32 function add_filter(session, type, callback, priority)
33         if not session.filters then
34                 initialize(session);
35         end
36         
37         local filter_list = session.filters[type];
38         if not filter_list then
39                 filter_list = {};
40                 session.filters[type] = filter_list;
41         end
42         
43         priority = priority or 0;
44         
45         local i = 0;
46         repeat
47                 i = i + 1;
48         until not filter_list[i] or filter_list[filter_list[i]] >= priority;
49         
50         t_insert(filter_list, i, callback);
51         filter_list[callback] = priority;
52 end
53
54 function remove_filter(session, type, callback)
55         if not session.filters then return; end
56         local filter_list = session.filters[type];
57         if filter_list and filter_list[callback] then
58                 for i=1, #filter_list do
59                         if filter_list[i] == callback then
60                                 t_remove(filter_list, i);
61                                 filter_list[callback] = nil;
62                                 return true;
63                         end
64                 end
65         end
66 end
67
68 return _M;