util/filters.lua
author Matthew Wild <mwild1@gmail.com>
Wed, 02 Jun 2010 12:20:29 +0100
changeset 3133 d3f16b4c1ecb
child 3134 9a29ad6a9b97
permissions -rw-r--r--
util.filters: New utility library for managing filters on an object
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3133
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     1
-- Prosody IM
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     2
-- Copyright (C) 2008-2010 Matthew Wild
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     3
-- Copyright (C) 2008-2010 Waqas Hussain
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     4
-- 
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     5
-- This project is MIT/X11 licensed. Please see the
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     6
-- COPYING file in the source package for more information.
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     7
--
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     8
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     9
local t_insert, t_remove = table.insert, table.remove;
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    10
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    11
module "filters"
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    12
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    13
local function initialize_session(session)
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    14
	local filters = {};
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    15
	session.filters = filters;
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    16
	
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    17
	function session.filter(type, data)
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    18
		local filter_list = filters[type];
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    19
		for i = 1, #filter_list do
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    20
			data = filter_list[i](data);
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    21
		end
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    22
		return data;
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    23
	end
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    24
end
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    25
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    26
function add_filter(session, type, callback, priority)
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    27
	if not session.filters then
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    28
		initialize_session(session);
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    29
	end
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    30
	
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    31
	local filter_list = session.filters[type];
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    32
	if not filter_list then
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    33
		filter_list = {};
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    34
		session.filters[type] = filter_list;
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    35
	end
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    36
	
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    37
	priority = priority or 0;
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    38
	
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    39
	local i = 0;
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    40
	repeat
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    41
		i = i + 1;
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    42
	until not filter_list[i] or filter_list[filter_list[i]] >= priority;
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    43
	
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    44
	t_insert(filter_list, i, callback);
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    45
	filter_list[callback] = priority;
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    46
end
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    47
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    48
function remove_filter(session, type, callback)
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    49
	local filter_list = session.filters[type];
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    50
	if filter_list and filter_list[callback] then
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    51
		for i=1, #filter_list do
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    52
			if filter_list[i] == callback then
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    53
				t_remove(filter_list, i);
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    54
				filter_list[callback] = nil;
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    55
				return true;
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    56
			end
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    57
		end
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    58
	end
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    59
end
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    60
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    61
return _M;