139 end |
139 end |
140 |
140 |
141 if #streamhost_array > 0 then |
141 if #streamhost_array > 0 then |
142 self.connecting_peer_candidates = true; |
142 self.connecting_peer_candidates = true; |
143 local function onconnect(streamhost, conn) |
143 local function onconnect(streamhost, conn) |
144 self.jingle:send_command("transport-info", verse.stanza("transport", { xmlns = xmlns_s5b, sid = self.s5b_sid }) |
144 self.jingle:send_command("transport-info", verse.stanza("content", { creator = self.creator, name = self.name }) |
145 :tag("candidate-used", { cid = streamhost.cid })); |
145 :tag("transport", { xmlns = xmlns_s5b, sid = self.s5b_sid }) |
|
146 :tag("candidate-used", { cid = streamhost.cid })); |
146 self.onconnect_callback = callback; |
147 self.onconnect_callback = callback; |
147 self.conn = conn; |
148 self.conn = conn; |
148 end |
149 end |
149 local auth_token = sha1(self.s5b_sid..self.peer..stream.jid, true); |
150 local auth_token = sha1(self.s5b_sid..self.peer..stream.jid, true); |
150 connect_to_usable_streamhost(onconnect, streamhost_array, auth_token); |
151 connect_to_usable_streamhost(onconnect, streamhost_array, auth_token); |
154 end |
155 end |
155 end |
156 end |
156 |
157 |
157 function s5b:info_received(jingle_tag) |
158 function s5b:info_received(jingle_tag) |
158 stream:warn("Info received"); |
159 stream:warn("Info received"); |
159 local transport_tag = jingle_tag:child_with_name("content"):child_with_name("transport"); |
160 local content_tag = jingle_tag:child_with_name("content"); |
|
161 local transport_tag = content_tag:child_with_name("transport"); |
160 if transport_tag:get_child("candidate-used") and not self.connecting_peer_candidates then |
162 if transport_tag:get_child("candidate-used") and not self.connecting_peer_candidates then |
161 local candidate_used = transport_tag:child_with_name("candidate-used"); |
163 local candidate_used = transport_tag:child_with_name("candidate-used"); |
162 if candidate_used then |
164 if candidate_used then |
163 -- Connect straight away to candidate used, we weren't trying any anyway |
165 -- Connect straight away to candidate used, we weren't trying any anyway |
164 local function onconnect(streamhost, conn) |
166 local function onconnect(streamhost, conn) |
167 self.jingle.stream:send_iq(verse.iq({ to = streamhost.jid, type = "set" }) |
169 self.jingle.stream:send_iq(verse.iq({ to = streamhost.jid, type = "set" }) |
168 :tag("query", { xmlns = xmlns_bytestreams, sid = self.s5b_sid }) |
170 :tag("query", { xmlns = xmlns_bytestreams, sid = self.s5b_sid }) |
169 :tag("activate"):text(self.jingle.peer), function (result) |
171 :tag("activate"):text(self.jingle.peer), function (result) |
170 |
172 |
171 if result.attr.type == "result" then |
173 if result.attr.type == "result" then |
172 self.jingle:send_command("transport-info", verse.stanza("transport", { xmlns = xmlns_s5b, sid = self.s5b_sid }) |
174 self.jingle:send_command("transport-info", verse.stanza("content", content_tag.attr) |
173 :tag("activated", { cid = candidate_used.attr.cid })); |
175 :tag("transport", { xmlns = xmlns_s5b, sid = self.s5b_sid }) |
|
176 :tag("activated", { cid = candidate_used.attr.cid })); |
174 self.conn = conn; |
177 self.conn = conn; |
175 self.onconnect_callback(conn); |
178 self.onconnect_callback(conn); |
176 else |
179 else |
177 self.jingle.stream:error("Failed to activate bytestream"); |
180 self.jingle.stream:error("Failed to activate bytestream"); |
178 end |
181 end |