aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbt <bt@silverblade>2008-09-17 22:20:08 +0300
committerbt <bt@silverblade>2008-09-17 22:20:08 +0300
commit2e735c5b6cdf59c4a96af39497b66a1e36371aea (patch)
tree17d2628674a17e597c4ddb3bfbc71105cd369504
parent8af81638a0d17d3cec2d8f73e156546679af5a4c (diff)
downloadprosody-2e735c5b6cdf59c4a96af39497b66a1e36371aea.tar.gz
prosody-2e735c5b6cdf59c4a96af39497b66a1e36371aea.zip
Some docs written by Thorns. Need reviewing.
-rw-r--r--core/.directory3
-rw-r--r--doc/.directory3
-rw-r--r--doc/lxmppd_core_offlinemessages.txt12
-rw-r--r--doc/lxmppd_core_rostermanager.txt9
-rw-r--r--doc/lxmppd_core_stanz_dispatch.txt26
-rw-r--r--util/stanza.lua6
-rw-r--r--util/stanza.lua~138
7 files changed, 194 insertions, 3 deletions
diff --git a/core/.directory b/core/.directory
new file mode 100644
index 00000000..a4330e19
--- /dev/null
+++ b/core/.directory
@@ -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
index 00000000..2bcc45d8
--- /dev/null
+++ b/doc/.directory
@@ -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
index 00000000..fa06a8e0
--- /dev/null
+++ b/doc/lxmppd_core_offlinemessages.txt
@@ -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
index 00000000..4f501158
--- /dev/null
+++ b/doc/lxmppd_core_rostermanager.txt
@@ -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
index 00000000..c76844e9
--- /dev/null
+++ b/doc/lxmppd_core_stanz_dispatch.txt
@@ -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
diff --git a/util/stanza.lua b/util/stanza.lua
index 35277e9c..3a17fc20 100644
--- a/util/stanza.lua
+++ b/util/stanza.lua
@@ -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
index 00000000..04259487
--- /dev/null
+++ b/util/stanza.lua~
@@ -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
+