Annotate

plugins/jingle.lua @ 119:989cb40f8e62

plugins.disco: Fixes for storing/retrieving items from the disco cache.
author Matthew Wild <mwild1@gmail.com>
date Thu, 09 Sep 2010 19:11:27 +0100
parent 118:d076948cd0e1
child 140:97bf22d6ff96
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
100
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1 local sha1 = require "util.sha1".sha1;
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2 local st = require "util.stanza";
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3 local timer = require "util.timer";
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
4 local uuid_generate = require "util.uuid".generate;
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6 local xmlns_jingle = "urn:xmpp:jingle:1";
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7 local xmlns_jingle_errors = "urn:xmpp:jingle:errors:1";
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9 local jingle_mt = {};
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10 jingle_mt.__index = jingle_mt;
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12 local registered_transports = {};
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13 local registered_content_types = {};
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
14
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15 function verse.plugins.jingle(stream)
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16 stream:hook("ready", function ()
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
17 stream:add_disco_feature(xmlns_jingle);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
18 end, 10);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
19
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20 function stream:jingle(to)
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21 return verse.eventable(setmetatable(base or {
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22 role = "initiator";
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23 peer = to;
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24 sid = uuid_generate();
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25 stream = stream;
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
26 }, jingle_mt));
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
27 end
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29 function stream:register_jingle_transport(transport)
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
30 -- transport is a function that receives a
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31 -- <transport> element, and returns a connection
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32 -- We wait for 'connected' on that connection,
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 -- and use :send() and 'incoming-raw'.
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34 end
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36 function stream:register_jingle_content_type(content)
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
37 -- Call content() for every 'incoming-raw'?
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38 -- I think content() returns the object we return
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39 -- on jingle:accept()
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40 end
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 local function handle_incoming_jingle(stanza)
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43 local jingle_tag = stanza:get_child("jingle", xmlns_jingle);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 local sid = jingle_tag.attr.sid;
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45 local action = jingle_tag.attr.action;
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46 local result = stream:event("jingle/"..sid, stanza);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47 if result == true then
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48 -- Ack
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49 stream:send(verse.reply(stanza));
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50 return true;
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51 end
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52 -- No existing Jingle object handled this action, our turn...
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53 if action ~= "session-initiate" then
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54 -- Trying to send a command to a session we don't know
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 local reply = st.error_reply(stanza, "cancel", "item-not-found")
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56 :tag("unknown-session", { xmlns = xmlns_jingle_errors }):up();
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57 stream:send(reply);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58 return;
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59 end
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61 -- Ok, session-initiate, new session
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
62
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63 -- Create new Jingle object
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64 local sid = jingle_tag.attr.sid;
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
66 local jingle = verse.eventable{
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67 role = "receiver";
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
68 peer = stanza.attr.from;
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
69 sid = sid;
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
70 stream = stream;
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
71 };
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
73 setmetatable(jingle, jingle_mt);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
74
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
75 local content_tag;
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
76 local content, transport;
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
77 for tag in jingle_tag:childtags() do
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
78 if tag.name == "content" and tag.attr.xmlns == xmlns_jingle then
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
79 local description_tag = tag:child_with_name("description");
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
80 local description_xmlns = description_tag.attr.xmlns;
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
81 if description_xmlns then
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
82 local desc_handler = stream:event("jingle/content/"..description_xmlns, jingle, description_tag);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
83 if desc_handler then
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
84 content = desc_handler;
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
85 end
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
86 end
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
87
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
88 local transport_tag = tag:child_with_name("transport");
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
89 local transport_xmlns = transport_tag.attr.xmlns;
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
90
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
91 transport = stream:event("jingle/transport/"..transport_xmlns, jingle, transport_tag);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
92 if content and transport then
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
93 content_tag = tag;
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
94 break;
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
95 end
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
96 end
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
97 end
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
98 if not content then
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
99 -- FIXME: Fail, no content
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
100 stream:send(st.error_reply(stanza, "cancel", "feature-not-implemented", "The specified content is not supported"));
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
101 return;
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
102 end
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
103
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
104 if not transport then
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
105 -- FIXME: Refuse session, no transport
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
106 stream:send(st.error_reply(stanza, "cancel", "feature-not-implemented", "The specified transport is not supported"));
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
107 return;
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
108 end
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
109
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
110 stream:send(st.reply(stanza));
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
111
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
112 jingle.content_tag = content_tag;
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
113 jingle.creator, jingle.name = content_tag.attr.creator, content_tag.attr.name;
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
114 jingle.content, jingle.transport = content, transport;
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
115
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
116 function jingle:decline()
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
117 -- FIXME: Decline session
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
118 end
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
119
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
120 stream:hook("jingle/"..sid, function (stanza)
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
121 if stanza.attr.from ~= jingle.peer then
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
122 return false;
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
123 end
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
124 local jingle_tag = stanza:get_child("jingle", xmlns_jingle);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
125 return jingle:handle_command(jingle_tag);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
126 end);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
127
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
128 stream:event("jingle", jingle);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
129 return true;
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
130 end
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
131
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
132 function jingle_mt:handle_command(jingle_tag)
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
133 local action = jingle_tag.attr.action;
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
134 stream:debug("Handling Jingle command: %s", action);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
135 if action == "session-terminate" then
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
136 self:destroy();
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
137 elseif action == "session-accept" then
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
138 -- Yay!
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
139 self:handle_accepted(jingle_tag);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
140 elseif action == "transport-info" then
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
141 stream:debug("Handling transport-info");
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
142 self.transport:info_received(jingle_tag);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
143 elseif action == "transport-replace" then
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
144 -- FIXME: Used for IBB fallback
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
145 stream:error("Peer wanted to swap transport, not implemented");
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
146 else
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
147 -- FIXME: Reply unhandled command
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
148 stream:warn("Unhandled Jingle command: %s", action);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
149 return nil;
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
150 end
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
151 return true;
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
152 end
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
153
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
154 function jingle_mt:send_command(command, element, callback)
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
155 local stanza = st.iq({ to = self.peer, type = "set" })
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
156 :tag("jingle", {
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
157 xmlns = xmlns_jingle,
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
158 sid = self.sid,
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
159 action = command,
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
160 initiator = self.role == "initiator" and self.stream.jid or nil,
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
161 responder = self.role == "responder" and self.jid or nil,
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
162 })
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
163 :tag("content", { creator = self.creator, name = self.name })
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
164 :add_child(element);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
165 if not callback then
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
166 self.stream:send(stanza);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
167 else
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
168 self.stream:send_iq(stanza, callback);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
169 end
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
170 end
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
171
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
172 function jingle_mt:accept(options)
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
173 local accept_stanza = st.iq({ to = self.peer, type = "set" })
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
174 :tag("jingle", {
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
175 xmlns = xmlns_jingle,
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
176 sid = self.sid,
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
177 action = "session-accept",
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
178 responder = stream.jid,
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
179 })
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
180 :tag("content", { creator = self.creator, name = self.name });
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
181
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
182 local content_accept_tag = self.content:generate_accept(self.content_tag:child_with_name("description"), options);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
183 accept_stanza:add_child(content_accept_tag);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
184
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
185 local transport_accept_tag = self.transport:generate_accept(self.content_tag:child_with_name("transport"), options);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
186 accept_stanza:add_child(transport_accept_tag);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
187
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
188 local jingle = self;
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
189 stream:send_iq(accept_stanza, function (result)
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
190 if result.attr.type == "error" then
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
191 local type, condition, text = result:get_error();
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
192 stream:error("session-accept rejected: %s", condition); -- FIXME: Notify
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
193 return false;
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
194 end
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
195 jingle.transport:connect(function (conn)
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
196 stream:warn("CONNECTED (receiver)!!!");
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
197 jingle.state = "active";
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
198 jingle:event("connected", conn);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
199 end);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
200 end);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
201 end
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
202
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
203
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
204 stream:hook("iq/"..xmlns_jingle, handle_incoming_jingle);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
205 return true;
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
206 end
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
207
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
208 function jingle_mt:offer(name, content)
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
209 local session_initiate = st.iq({ to = self.peer, type = "set" })
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
210 :tag("jingle", { xmlns = xmlns_jingle, action = "session-initiate",
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
211 initiator = self.stream.jid, sid = self.sid });
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
212
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
213 -- Content tag
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
214 session_initiate:tag("content", { creator = self.role, name = name });
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
215
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
216 -- Need description element from someone who can turn 'content' into XML
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
217 local description = self.stream:event("jingle/describe/"..name, content);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
218
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
219 if not description then
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
220 return false, "Unknown content type";
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
221 end
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
222
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
223 session_initiate:add_child(description);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
224
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
225 -- FIXME: Sort transports by 1) recipient caps 2) priority (SOCKS vs IBB, etc.)
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
226 -- Fixed to s5b in the meantime
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
227 local transport = self.stream:event("jingle/transport/".."urn:xmpp:jingle:transports:s5b:1", self);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
228 self.transport = transport;
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
229
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
230 session_initiate:add_child(transport:generate_initiate());
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
231
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
232 self.stream:debug("Hooking %s", "jingle/"..self.sid);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
233 self.stream:hook("jingle/"..self.sid, function (stanza)
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
234 if stanza.attr.from ~= self.peer then
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
235 return false;
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
236 end
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
237 local jingle_tag = stanza:get_child("jingle", xmlns_jingle);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
238 return self:handle_command(jingle_tag)
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
239 end);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
240
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
241 self.stream:send_iq(session_initiate, function (result)
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
242 if result.type == "error" then
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
243 self.state = "terminated";
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
244 local type, condition, text = result:get_error();
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
245 return self:event("error", { type = type, condition = condition, text = text });
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
246 end
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
247 end);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
248 self.state = "pending";
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
249 end
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
250
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
251 function jingle_mt:terminate(reason)
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
252 local reason_tag = verse.stanza("reason"):tag(reason or "success");
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
253 self:send_command("session-terminate", reason_tag, function (result)
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
254 self.state = "terminated";
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
255 self.transport:disconnect();
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
256 self:destroy();
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
257 end);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
258 end
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
259
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
260 function jingle_mt:destroy()
118
d076948cd0e1 plugins.jingle: Add 'terminated' event
Matthew Wild <mwild1@gmail.com>
parents: 100
diff changeset
261 self:event("terminated");
100
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
262 self.stream:unhook("jingle/"..self.sid, self.handle_command);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
263 end
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
264
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
265 function jingle_mt:handle_accepted(jingle_tag)
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
266 local transport_tag = jingle_tag:child_with_name("transport");
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
267 self.transport:handle_accepted(transport_tag);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
268 self.transport:connect(function (conn)
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
269 print("CONNECTED (initiator)!")
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
270 -- Connected, send file
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
271 self.state = "active";
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
272 self:event("connected", conn);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
273 end);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
274 end
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
275
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
276 function jingle_mt:set_source(source, auto_close)
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
277 local function pump()
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
278 local chunk, err = source();
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
279 if chunk and chunk ~= "" then
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
280 self.transport.conn:send(chunk);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
281 elseif chunk == "" then
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
282 return pump(); -- We need some data!
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
283 elseif chunk == nil then
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
284 if auto_close then
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
285 self:terminate();
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
286 end
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
287 self.transport.conn:unhook("drained", pump);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
288 source = nil;
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
289 end
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
290 end
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
291 self.transport.conn:hook("drained", pump);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
292 pump();
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
293 end
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
294
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
295 function jingle_mt:set_sink(sink)
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
296 self.transport.conn:hook("incoming-raw", sink);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
297 self.transport.conn:hook("disconnected", function (event)
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
298 self.stream:debug("Closing sink...");
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
299 local reason = event.reason;
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
300 if reason == "closed" then reason = nil; end
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
301 sink(nil, reason);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
302 end);
e45883a3f39a verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
303 end