util/filters.lua
author Matthew Wild <mwild1@gmail.com>
Thu, 28 Aug 2014 09:20:33 +0100
changeset 6366 8dee696c33cc
parent 5849 8f451d370dd4
child 6367 769a3577dd85
permissions -rw-r--r--
util.filters: Ignore filters being added twice (fixes issues on removal)
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
3625
f8d61da5bcc1 util.filters: Support for 'filter hooks' that get called when a session is initialized for filters
Matthew Wild <mwild1@gmail.com>
parents: 3331
diff changeset
    13
local new_filter_hooks = {};
f8d61da5bcc1 util.filters: Support for 'filter hooks' that get called when a session is initialized for filters
Matthew Wild <mwild1@gmail.com>
parents: 3331
diff changeset
    14
3134
9a29ad6a9b97 util.filters: Expose the initialization function
Matthew Wild <mwild1@gmail.com>
parents: 3133
diff changeset
    15
function initialize(session)
3142
3cf02e5e632b util.filters: Ensure initialize() never initializes an object twice - and return the filter function to the caller
Matthew Wild <mwild1@gmail.com>
parents: 3140
diff changeset
    16
	if not session.filters then
3cf02e5e632b util.filters: Ensure initialize() never initializes an object twice - and return the filter function to the caller
Matthew Wild <mwild1@gmail.com>
parents: 3140
diff changeset
    17
		local filters = {};
3cf02e5e632b util.filters: Ensure initialize() never initializes an object twice - and return the filter function to the caller
Matthew Wild <mwild1@gmail.com>
parents: 3140
diff changeset
    18
		session.filters = filters;
3cf02e5e632b util.filters: Ensure initialize() never initializes an object twice - and return the filter function to the caller
Matthew Wild <mwild1@gmail.com>
parents: 3140
diff changeset
    19
		
3cf02e5e632b util.filters: Ensure initialize() never initializes an object twice - and return the filter function to the caller
Matthew Wild <mwild1@gmail.com>
parents: 3140
diff changeset
    20
		function session.filter(type, data)
3cf02e5e632b util.filters: Ensure initialize() never initializes an object twice - and return the filter function to the caller
Matthew Wild <mwild1@gmail.com>
parents: 3140
diff changeset
    21
			local filter_list = filters[type];
3cf02e5e632b util.filters: Ensure initialize() never initializes an object twice - and return the filter function to the caller
Matthew Wild <mwild1@gmail.com>
parents: 3140
diff changeset
    22
			if filter_list then
3cf02e5e632b util.filters: Ensure initialize() never initializes an object twice - and return the filter function to the caller
Matthew Wild <mwild1@gmail.com>
parents: 3140
diff changeset
    23
				for i = 1, #filter_list do
3625
f8d61da5bcc1 util.filters: Support for 'filter hooks' that get called when a session is initialized for filters
Matthew Wild <mwild1@gmail.com>
parents: 3331
diff changeset
    24
					data = filter_list[i](data, session);
3142
3cf02e5e632b util.filters: Ensure initialize() never initializes an object twice - and return the filter function to the caller
Matthew Wild <mwild1@gmail.com>
parents: 3140
diff changeset
    25
					if data == nil then break; end
3cf02e5e632b util.filters: Ensure initialize() never initializes an object twice - and return the filter function to the caller
Matthew Wild <mwild1@gmail.com>
parents: 3140
diff changeset
    26
				end
3139
7b4f180d7c6f util.filters: Don't traceback with no filters of a type added
Matthew Wild <mwild1@gmail.com>
parents: 3135
diff changeset
    27
			end
3142
3cf02e5e632b util.filters: Ensure initialize() never initializes an object twice - and return the filter function to the caller
Matthew Wild <mwild1@gmail.com>
parents: 3140
diff changeset
    28
			return data;
3133
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
	end
3625
f8d61da5bcc1 util.filters: Support for 'filter hooks' that get called when a session is initialized for filters
Matthew Wild <mwild1@gmail.com>
parents: 3331
diff changeset
    31
	
f8d61da5bcc1 util.filters: Support for 'filter hooks' that get called when a session is initialized for filters
Matthew Wild <mwild1@gmail.com>
parents: 3331
diff changeset
    32
	for i=1,#new_filter_hooks do
f8d61da5bcc1 util.filters: Support for 'filter hooks' that get called when a session is initialized for filters
Matthew Wild <mwild1@gmail.com>
parents: 3331
diff changeset
    33
		new_filter_hooks[i](session);
f8d61da5bcc1 util.filters: Support for 'filter hooks' that get called when a session is initialized for filters
Matthew Wild <mwild1@gmail.com>
parents: 3331
diff changeset
    34
	end
f8d61da5bcc1 util.filters: Support for 'filter hooks' that get called when a session is initialized for filters
Matthew Wild <mwild1@gmail.com>
parents: 3331
diff changeset
    35
	
3142
3cf02e5e632b util.filters: Ensure initialize() never initializes an object twice - and return the filter function to the caller
Matthew Wild <mwild1@gmail.com>
parents: 3140
diff changeset
    36
	return session.filter;
3133
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    37
end
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
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
    40
	if not session.filters then
3134
9a29ad6a9b97 util.filters: Expose the initialization function
Matthew Wild <mwild1@gmail.com>
parents: 3133
diff changeset
    41
		initialize(session);
3133
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    42
	end
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
	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
    45
	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
    46
		filter_list = {};
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    47
		session.filters[type] = filter_list;
6366
8dee696c33cc util.filters: Ignore filters being added twice (fixes issues on removal)
Matthew Wild <mwild1@gmail.com>
parents: 5849
diff changeset
    48
	elseif filter_list[callback] then
8dee696c33cc util.filters: Ignore filters being added twice (fixes issues on removal)
Matthew Wild <mwild1@gmail.com>
parents: 5849
diff changeset
    49
		return; -- Filter already added
3133
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    50
	end
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    51
	
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    52
	priority = priority or 0;
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    53
	
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    54
	local i = 0;
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    55
	repeat
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    56
		i = i + 1;
5849
8f451d370dd4 util.filters: Fix inserting items so that higher priority filters run first
Kim Alvefur <zash@zash.se>
parents: 3943
diff changeset
    57
	until not filter_list[i] or filter_list[filter_list[i]] < priority;
3133
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    58
	
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    59
	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
    60
	filter_list[callback] = priority;
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    61
end
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    62
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    63
function remove_filter(session, type, callback)
3135
f29a297471e3 util.filters: Don't traceback when trying to remove a filter from an uninitialized object
Matthew Wild <mwild1@gmail.com>
parents: 3134
diff changeset
    64
	if not session.filters then return; end
3133
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    65
	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
    66
	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
    67
		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
    68
			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
    69
				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
    70
				filter_list[callback] = nil;
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    71
				return true;
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    72
			end
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    73
		end
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    74
	end
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    75
end
d3f16b4c1ecb util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    76
3625
f8d61da5bcc1 util.filters: Support for 'filter hooks' that get called when a session is initialized for filters
Matthew Wild <mwild1@gmail.com>
parents: 3331
diff changeset
    77
function add_filter_hook(callback)
f8d61da5bcc1 util.filters: Support for 'filter hooks' that get called when a session is initialized for filters
Matthew Wild <mwild1@gmail.com>
parents: 3331
diff changeset
    78
	t_insert(new_filter_hooks, callback);
f8d61da5bcc1 util.filters: Support for 'filter hooks' that get called when a session is initialized for filters
Matthew Wild <mwild1@gmail.com>
parents: 3331
diff changeset
    79
end
f8d61da5bcc1 util.filters: Support for 'filter hooks' that get called when a session is initialized for filters
Matthew Wild <mwild1@gmail.com>
parents: 3331
diff changeset
    80
3943
ad5924c31953 util.filters: Add remove_filter_hook()
Matthew Wild <mwild1@gmail.com>
parents: 3625
diff changeset
    81
function remove_filter_hook(callback)
ad5924c31953 util.filters: Add remove_filter_hook()
Matthew Wild <mwild1@gmail.com>
parents: 3625
diff changeset
    82
	for i=1,#new_filter_hooks do
ad5924c31953 util.filters: Add remove_filter_hook()
Matthew Wild <mwild1@gmail.com>
parents: 3625
diff changeset
    83
		if new_filter_hooks[i] == callback then
ad5924c31953 util.filters: Add remove_filter_hook()
Matthew Wild <mwild1@gmail.com>
parents: 3625
diff changeset
    84
			t_remove(new_filter_hooks, i);
ad5924c31953 util.filters: Add remove_filter_hook()
Matthew Wild <mwild1@gmail.com>
parents: 3625
diff changeset
    85
		end
ad5924c31953 util.filters: Add remove_filter_hook()
Matthew Wild <mwild1@gmail.com>
parents: 3625
diff changeset
    86
	end
ad5924c31953 util.filters: Add remove_filter_hook()
Matthew Wild <mwild1@gmail.com>
parents: 3625
diff changeset
    87
end
ad5924c31953 util.filters: Add remove_filter_hook()
Matthew Wild <mwild1@gmail.com>
parents: 3625
diff changeset
    88
3331
57a9cf5f4259 util.filters: Add newline at end of file
Matthew Wild <mwild1@gmail.com>
parents: 3142
diff changeset
    89
return _M;