Some docs written by Thorns. Need reviewing.
authorbt@silverblade <bt@silverblade>
Wed, 17 Sep 2008 19:20:08 +0000 (22:20 +0300)
committerbt@silverblade <bt@silverblade>
Wed, 17 Sep 2008 19:20:08 +0000 (22:20 +0300)
core/.directory [new file with mode: 0644]
doc/.directory [new file with mode: 0644]
doc/lxmppd_core_offlinemessages.txt [new file with mode: 0644]
doc/lxmppd_core_rostermanager.txt [new file with mode: 0644]
doc/lxmppd_core_stanz_dispatch.txt [new file with mode: 0644]
util/stanza.lua
util/stanza.lua~ [new file with mode: 0644]

diff --git a/core/.directory b/core/.directory
new file mode 100644 (file)
index 0000000..a4330e1
--- /dev/null
@@ -0,0 +1,3 @@
+[Dolphin]
+Timestamp=2008,9,15,21,41,24
+ViewMode=1
diff --git a/doc/.directory b/doc/.directory
new file mode 100644 (file)
index 0000000..2bcc45d
--- /dev/null
@@ -0,0 +1,3 @@
+[Dolphin]
+Timestamp=2008,9,15,21,41,28
+ViewMode=1
diff --git a/doc/lxmppd_core_offlinemessages.txt b/doc/lxmppd_core_offlinemessages.txt
new file mode 100644 (file)
index 0000000..fa06a8e
--- /dev/null
@@ -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
diff --git a/doc/lxmppd_core_rostermanager.txt b/doc/lxmppd_core_rostermanager.txt
new file mode 100644 (file)
index 0000000..4f50115
--- /dev/null
@@ -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
diff --git a/doc/lxmppd_core_stanz_dispatch.txt b/doc/lxmppd_core_stanz_dispatch.txt
new file mode 100644 (file)
index 0000000..c76844e
--- /dev/null
@@ -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
index 35277e9cdeeb5504acc2b4f9a9d960c4388a91a7..3a17fc2061d693e3c60454d8aec92cd647760c5e 100644 (file)
@@ -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 @@ function stanza_mt.__tostring(t)
 
        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)
diff --git a/util/stanza.lua~ b/util/stanza.lua~
new file mode 100644 (file)
index 0000000..0425948
--- /dev/null
@@ -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
+