Sat, 21 Aug 2010 15:28:54 +0100
verse.plugins.jingle_ft: Jingle File Transfer application profile
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() |
e45883a3f39a
verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
261 | 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
|
262 | end |
e45883a3f39a
verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
263 | |
e45883a3f39a
verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
264 | function jingle_mt:handle_accepted(jingle_tag) |
e45883a3f39a
verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
265 | 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
|
266 | self.transport:handle_accepted(transport_tag); |
e45883a3f39a
verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
267 | self.transport:connect(function (conn) |
e45883a3f39a
verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
268 | print("CONNECTED (initiator)!") |
e45883a3f39a
verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
269 | -- Connected, send file |
e45883a3f39a
verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
270 | self.state = "active"; |
e45883a3f39a
verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
271 | self:event("connected", conn); |
e45883a3f39a
verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
272 | end); |
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 | |
e45883a3f39a
verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
275 | function jingle_mt:set_source(source, auto_close) |
e45883a3f39a
verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
276 | local function pump() |
e45883a3f39a
verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
277 | local chunk, err = source(); |
e45883a3f39a
verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
278 | if chunk and chunk ~= "" then |
e45883a3f39a
verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
279 | self.transport.conn:send(chunk); |
e45883a3f39a
verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
280 | elseif chunk == "" then |
e45883a3f39a
verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
281 | return pump(); -- We need some data! |
e45883a3f39a
verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
282 | elseif chunk == nil then |
e45883a3f39a
verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
283 | if auto_close then |
e45883a3f39a
verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
284 | self:terminate(); |
e45883a3f39a
verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
285 | end |
e45883a3f39a
verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
286 | self.transport.conn:unhook("drained", pump); |
e45883a3f39a
verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
287 | source = nil; |
e45883a3f39a
verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
288 | end |
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 | self.transport.conn:hook("drained", pump); |
e45883a3f39a
verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
291 | pump(); |
e45883a3f39a
verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
292 | end |
e45883a3f39a
verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
293 | |
e45883a3f39a
verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
294 | function jingle_mt:set_sink(sink) |
e45883a3f39a
verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
295 | self.transport.conn:hook("incoming-raw", sink); |
e45883a3f39a
verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
296 | self.transport.conn:hook("disconnected", function (event) |
e45883a3f39a
verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
297 | self.stream:debug("Closing sink..."); |
e45883a3f39a
verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
298 | local reason = event.reason; |
e45883a3f39a
verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
299 | if reason == "closed" then reason = nil; end |
e45883a3f39a
verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
300 | sink(nil, reason); |
e45883a3f39a
verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
301 | end); |
e45883a3f39a
verse.plugins.jingle: XEP-0166 Jingle plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
302 | end |