Changeset

23:236375777f8c

Some docs written by Thorns. Need reviewing.
author bt@silverblade
date Wed, 17 Sep 2008 22:20:08 +0300
parents 21:ade26639f237
children 24:78746f3c9115
files core/.directory doc/.directory doc/lxmppd_core_offlinemessages.txt doc/lxmppd_core_rostermanager.txt doc/lxmppd_core_stanz_dispatch.txt util/stanza.lua util/stanza.lua~
diffstat 7 files changed, 194 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/.directory	Wed Sep 17 22:20:08 2008 +0300
@@ -0,0 +1,3 @@
+[Dolphin]
+Timestamp=2008,9,15,21,41,24
+ViewMode=1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/.directory	Wed Sep 17 22:20:08 2008 +0300
@@ -0,0 +1,3 @@
+[Dolphin]
+Timestamp=2008,9,15,21,41,28
+ViewMode=1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/lxmppd_core_offlinemessages.txt	Wed Sep 17 22:20:08 2008 +0300
@@ -0,0 +1,12 @@
+lxmppd -> core -> offlinemessages.lua
+	requires	"util.datamanager"
+	module		"offlinemessage"
+
+function new(user, host, stanza)
+	returns a function that stores the offline message it received
+
+This module offers storing of offline messages.
+
+Description:	If the user that is supposed to get the message is not online,
+		we store the messages locally as offline messages for later
+		processing.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/lxmppd_core_rostermanager.txt	Wed Sep 17 22:20:08 2008 +0300
@@ -0,0 +1,9 @@
+lxmppd -> core -> rostermanager.lua
+	requires	"util.datamanager"
+	module		"rostermanager"
+	
+function log(type, message)
+	logs a message of type "rostermanager"
+
+function getroster(username, host)
+	Retrieves the user's roster from the server and loads it with the datamanager
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/lxmppd_core_stanz_dispatch.txt	Wed Sep 17 22:20:08 2008 +0300
@@ -0,0 +1,26 @@
+lxmppd -> core -> stanza_dispatch
+	requires	"util.stanza"
+	requires	"core.usermanager"
+	
+function init_stanza_dispatcher(session)
+	Initialises the stanza dispatcher which handles different stanza according
+	to their type and XML namespace, dispatching to required handlers.
+	
+	iq_handlers["jabber:iq:auth"]
+		A list of handlers for "jabber:iq:auth" stanzas -- authentication
+		(request) stanzas.
+		
+		function (stanza)
+			If one of username, password and resource are missing then it ????.
+			If not, then it validates the credentials and replies with the
+			appropriate stanza.
+			
+	iq_handlers["jabber:iq:roster"]
+		A list of handlers for "jabber:iq:roster" stanzas -- roster management
+		
+		function (stanza)
+			Parses the type of stanza for roster management and does what is
+			requested (roster retrieval, etc.)
+	
+	function (stanza)
+		Validates the stanza and calls the required handler
--- a/util/stanza.lua	Wed Aug 27 03:16:14 2008 +0100
+++ b/util/stanza.lua	Wed Sep 17 22:20:08 2008 +0300
@@ -1,6 +1,6 @@
 local t_insert      =  table.insert;
 local t_remove      =  table.remove;
-local format        = string.format;
+local s_format      = string.format;
 local tostring      =      tostring;
 local setmetatable  =  setmetatable;
 local pairs         =         pairs;
@@ -97,10 +97,10 @@
 
 	local attr_string = "";
 	if t.attr then
-		for k, v in pairs(t.attr) do if type(k) == "string" then attr_string = attr_string .. format(" %s='%s'", k, tostring(v)); end end
+		for k, v in pairs(t.attr) do if type(k) == "string" then attr_string = attr_string .. s_format(" %s='%s'", k, tostring(v)); end end
 	end
 
-	return format("<%s%s>%s</%s>", t.name, attr_string, children_text, t.name);
+	return s_format("<%s%s>%s</%s>", t.name, attr_string, children_text, t.name);
 end
 
 function stanza_mt.__add(s1, s2)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/util/stanza.lua~	Wed Sep 17 22:20:08 2008 +0300
@@ -0,0 +1,138 @@
+local t_insert      =  table.insert;
+local t_remove      =  table.remove;
+local s_format        = string.format;
+local tostring      =      tostring;
+local setmetatable  =  setmetatable;
+local pairs         =         pairs;
+local ipairs        =        ipairs;
+local type          =          type;
+local s_gsub        =   string.gsub;
+module "stanza"
+
+stanza_mt = {};
+stanza_mt.__index = stanza_mt;
+
+function stanza(name, attr)
+	local stanza = { name = name, attr = attr or {}, tags = {}, last_add = {}};
+	return setmetatable(stanza, stanza_mt);
+end
+
+function stanza_mt:iq(attrs)
+	return self + stanza("iq", attrs)
+end
+function stanza_mt:message(attrs)
+	return self + stanza("message", attrs)
+end
+function stanza_mt:presence(attrs)
+	return self + stanza("presence", attrs)
+end
+function stanza_mt:query(xmlns)
+	return self:tag("query", { xmlns = xmlns });
+end
+function stanza_mt:tag(name, attrs)
+	local s = stanza(name, attrs);
+	(self.last_add[#self.last_add] or self):add_child(s);
+	t_insert(self.last_add, s);
+	return self;
+end
+
+function stanza_mt:text(text)
+	(self.last_add[#self.last_add] or self):add_child(text);
+	return self; 
+end
+
+function stanza_mt:up()
+	t_remove(self.last_add);
+	return self;
+end
+
+function stanza_mt:add_child(child)
+	if type(child) == "table" then
+		t_insert(self.tags, child);
+	end
+	t_insert(self, child);
+end
+
+function stanza_mt:child_with_name(name)
+	for _, child in ipairs(self) do	
+		if child.name == name then return child; end
+	end
+end
+
+function stanza_mt:children()
+	local i = 0;
+	return function (a)
+			i = i + 1
+			local v = a[i]
+			if v then return v; end
+		end, self, i;
+	                                    
+end
+function stanza_mt:childtags()
+	local i = 0;
+	return function (a)
+			i = i + 1
+			local v = self.tags[i]
+			if v then return v; end
+		end, self.tags[1], i;
+	                                    
+end
+
+do
+	local xml_entities = { ["'"] = "&apos;", ["\""] = "&quot;", ["<"] = "&lt;", [">"] = "&gt;", ["&"] = "&amp;" };
+	function xml_escape(s) return s_gsub(s, "['&<>\"]", xml_entities); end
+end
+
+local xml_escape = xml_escape;
+
+function stanza_mt.__tostring(t)
+	local children_text = "";
+	for n, child in ipairs(t) do
+		if type(child) == "string" then	
+			children_text = children_text .. xml_escape(child);
+		else
+			children_text = children_text .. tostring(child);
+		end
+	end
+
+	local attr_string = "";
+	if t.attr then
+		for k, v in pairs(t.attr) do if type(k) == "string" then attr_string = attr_string .. s_format(" %s='%s'", k, tostring(v)); end end
+	end
+
+	return s_format("<%s%s>%s</%s>", t.name, attr_string, children_text, t.name);
+end
+
+function stanza_mt.__add(s1, s2)
+	return s1:add_child(s2);
+end
+
+
+do
+        local id = 0;
+        function new_id()
+                id = id + 1;
+                return "lx"..id;
+        end
+end
+
+function message(attr, body)
+	if not body then
+		return stanza("message", attr);
+	else
+		return stanza("message", attr):tag("body"):text(body);
+	end
+end
+function iq(attr)
+	if attr and not attr.id then attr.id = new_id(); end
+	return stanza("iq", attr or { id = new_id() });
+end
+
+function reply(orig)
+	return stanza(orig.name, orig.attr and { to = orig.attr.from, from = orig.attr.to, id = orig.attr.id, type = ((orig.name == "iq" and "result") or nil) });
+end
+
+function presence(attr)
+	return stanza("presence", attr);
+end
+