107 local type, condition, text = reply:get_error(); |
107 local type, condition, text = reply:get_error(); |
108 conn:event("connection-failed", { conn = conn, type = type, condition = condition, text = text }); |
108 conn:event("connection-failed", { conn = conn, type = type, condition = condition, text = text }); |
109 else |
109 else |
110 -- Target connected to streamhost, connect ourselves |
110 -- Target connected to streamhost, connect ourselves |
111 local streamhost_used = reply.tags[1]:get_child("streamhost-used"); |
111 local streamhost_used = reply.tags[1]:get_child("streamhost-used"); |
112 if not streamhost_used then |
112 -- if not streamhost_used then |
113 --FIXME: Emit error |
113 --FIXME: Emit error |
114 end |
114 -- end |
115 conn.streamhost_jid = streamhost_used.attr.jid; |
115 conn.streamhost_jid = streamhost_used.attr.jid; |
116 local host, port; |
116 local host, port; |
117 for _, proxy in ipairs(proxies or self.proxies) do |
117 for _, proxy in ipairs(proxies or self.proxies) do |
118 if proxy.jid == conn.streamhost_jid then |
118 if proxy.jid == conn.streamhost_jid then |
119 host, port = proxy.host, proxy.port; |
119 host, port = proxy.host, proxy.port; |
120 break; |
120 break; |
121 end |
121 end |
122 end |
122 end |
123 if not (host and port) then |
123 -- if not (host and port) then |
124 --FIXME: Emit error |
124 --FIXME: Emit error |
125 end |
125 -- end |
126 |
126 |
127 conn:connect(host, port); |
127 conn:connect(host, port); |
128 |
128 |
129 local function handle_proxy_connected() |
129 local function handle_proxy_connected() |
130 conn:unhook("connected", handle_proxy_connected); |
130 conn:unhook("connected", handle_proxy_connected); |
131 -- Both of us connected, tell proxy to activate connection |
131 -- Both of us connected, tell proxy to activate connection |
132 local request = verse.iq{to = conn.streamhost_jid, type="set"} |
132 local activate_request = verse.iq{to = conn.streamhost_jid, type="set"} |
133 :tag("query", { xmlns = xmlns_bytestreams, sid = conn.bytestream_sid }) |
133 :tag("query", { xmlns = xmlns_bytestreams, sid = conn.bytestream_sid }) |
134 :tag("activate"):text(target_jid); |
134 :tag("activate"):text(target_jid); |
135 self.stream:send_iq(request, function (reply) |
135 self.stream:send_iq(activate_request, function (activated) |
136 if reply.attr.type == "result" then |
136 if activated.attr.type == "result" then |
137 -- Connection activated, ready to use |
137 -- Connection activated, ready to use |
138 conn:event("connected", conn); |
138 conn:event("connected", conn); |
139 else |
139 -- else --FIXME: Emit error |
140 --FIXME: Emit error |
|
141 end |
140 end |
142 end); |
141 end); |
143 return true; |
142 return true; |
144 end |
143 end |
145 conn:hook("connected", handle_proxy_connected, 100); |
144 conn:hook("connected", handle_proxy_connected, 100); |