Abstract connections with "connection listeners"

- Added connlistener for xmppclient
- SASL/TLS now use a new session:reset_stream() method
- main.lua on its way to being a bit neater
This commit is contained in:
Matthew Wild 2008-10-22 17:36:21 +01:00
parent d510d54b28
commit ee7b432ab1
8 changed files with 137 additions and 89 deletions

View file

@ -1,16 +0,0 @@
local lxp = require "lxp"
local init_xmlhandlers = require "core.xmlhandlers"
module "connhandlers"
function new(name, session)
if name == "xmpp-client" then
local parser = lxp.new(init_xmlhandlers(session), ":");
local parse = parser.parse;
return { data = function (self, data) return parse(parser, data); end, parser = parser }
end
end
return _M;

40
net/connlisteners.lua Normal file
View file

@ -0,0 +1,40 @@
local server_add = require "net.server".add;
local log = require "util.logger".init("connlisteners");
local dofile, pcall, error =
dofile, pcall, error
module "connlisteners"
local listeners = {};
function register(name, listener)
if listeners[name] and listeners[name] ~= listener then
log("warning", "Listener %s is already registered, not registering any more", name);
return false;
end
listeners[name] = listener;
log("info", "Registered connection listener %s", name);
return true;
end
function deregister(name)
listeners[name] = nil;
end
function start(name, udata)
local h = listeners[name]
if not h then
pcall(dofile, "net/"..name:gsub("[^%w%-]", "_").."_listener.lua");
h = listeners[name];
if not h then
error("No such connection module: "..name, 0);
end
end
return server_add(h,
udata.port or h.default_port or error("Can't start listener "..name.." because no port was specified, and it has no default port", 0),
udata.interface or "*", udata.mode or h.default_mode or 1, udata.ssl );
end
return _M;

View file

@ -0,0 +1,74 @@
local logger = require "logger";
local lxp = require "lxp"
local init_xmlhandlers = require "core.xmlhandlers"
local sm_new_session = require "core.sessionmanager".new_session;
local connlisteners_register = require "net.connlisteners".register;
local t_insert = table.insert;
local t_concat = table.concat;
local t_concatall = function (t, sep) local tt = {}; for _, s in ipairs(t) do t_insert(tt, tostring(s)); end return t_concat(tt, sep); end
local m_random = math.random;
local format = string.format;
local sm_new_session, sm_destroy_session = sessionmanager.new_session, sessionmanager.destroy_session; --import("core.sessionmanager", "new_session", "destroy_session");
local sm_streamopened = sessionmanager.streamopened;
local st = stanza;
local sessions = {};
local xmppclient = { default_port = 5222 };
-- These are session methods --
local function session_reset_stream(session)
-- Reset stream
local parser = lxp.new(init_xmlhandlers(session, sm_streamopened), ":");
session.parser = parser;
session.notopen = true;
function session.data(conn, data)
parser:parse(data);
end
return true;
end
-- End of session methods --
function xmppclient.listener(conn, data)
local session = sessions[conn];
if not session then
session = sm_new_session(conn);
sessions[conn] = session;
-- Logging functions --
local mainlog, log = log;
do
local conn_name = tostring(conn):match("[a-f0-9]+$");
log = logger.init(conn_name);
end
local print = function (...) log("info", t_concatall({...}, "\t")); end
session.log = log;
print("Client connected");
session.reset_stream = session_reset_stream;
session_reset_stream(session); -- Initialise, ready for use
-- TODO: Below function should be session,stanza - and xmlhandlers should use :method() notation to call,
-- this will avoid the useless indirection we have atm
-- (I'm on a mission, no time to fix now)
session.stanza_dispatch = function (stanza) return core_process_stanza(session, stanza); end
end
if data then
session.data(conn, data);
end
end
function xmppclient.disconnect(conn)
end
connlisteners_register("xmppclient", xmppclient);