local function session_reset_stream(session)
-- Reset stream
- local parser = lxp.new(init_xmlhandlers(session, sm_streamopened), ":");
+ local parser = lxp.new(init_xmlhandlers(session, sm_streamopened), "|");
session.parser = parser;
session.notopen = true;
-- TODO: Below function should be session,stanza - and xmlhandlers should use :method() notation to call,
-- this will avoid the useless indirection we have atm
-- (I'm on a mission, no time to fix now)
- session.stanza_dispatch = function (stanza) return core_process_stanza(session, stanza); end
+
+ -- Debug version --
+ local function handleerr() print("Traceback:", debug.traceback()); end
+ session.stanza_dispatch = function (stanza) return select(2, xpcall(function () return core_process_stanza(session, stanza); end, handleerr)); end
+
+-- session.stanza_dispatch = function (stanza) return core_process_stanza(session, stanza); end
end
if data then
end
function xmppclient.disconnect(conn)
+ local session = sessions[conn];
+ if session then
+ if session.last_presence and session.last_presence.attr.type ~= "unavailable" then
+ local pres = st.presence{ type = "unavailable" };
+ if err == "closed" then err = "connection closed"; end
+ pres:tag("status"):text("Disconnected: "..err);
+ session.stanza_dispatch(pres);
+ end
+ sm_destroy_session(session);
+ sessions[conn] = nil;
+ session = nil;
+ collectgarbage("collect");
+ end
end
connlisteners_register("xmppclient", xmppclient);