package de.uni_passau.fim.pkjab.model.xmpp;
import java.io.IOException;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import de.uni_passau.fim.pkjab.model.tags.AbstractXMLTag;
import de.uni_passau.fim.pkjab.model.tags.Iq;
import de.uni_passau.fim.pkjab.model.tags.XMLTag;
import de.uni_passau.fim.pkjab.util.Jid;
import de.uni_passau.fim.pkjab.util.Stack;
class XMPPIqHandler extends XMPPReaderSubLevel {
private static final String XMPP_BIND_URI = "urn:ietf:params:xml:ns:xmpp-bind";
//private static final String XMPP_SESSIONS_URI = "urn:ietf:params:xml:ns:xmpp-session";
private static final XMLTag BIND_TAG = new XMLTag("bind", XMPP_BIND_URI);
protected XMPPIqHandler(XMPPReaderAdapter previousHandler) {
super(previousHandler, null);
}
protected boolean startTopLevel(Stack xmlStack,
AbstractXMLTag thisTag, Attributes atts) throws SAXException {
xmlStack.pop();
xmlStack.add(new Iq(thisTag.uri, atts));
return true;
}
protected boolean startChild(Stack xmlStack, AbstractXMLTag thisTag,
Attributes atts) throws SAXException {
Iq iq = (Iq) xmlStack.get(1);
if (thisTag.getName().equals("error")) {
// stanza error, recoverable
iq.setError(thisTag);
} else {
iq.setChild(thisTag);
}
return true;
}
protected boolean startGrandchild(Stack xmlStack,
AbstractXMLTag thisTag, Attributes atts) throws SAXException {
return true;
}
public boolean startFurtherChild(Stack xmlStack, AbstractXMLTag thisTag,
AbstractXMLTag lastTag, Attributes atts) throws SAXException {
return true;
}
protected boolean endTopLevel(AbstractXMLTag thisTag, String content)
throws IOException, SAXException {
super.endTopLevel(thisTag, content);
connection.handleQuery((Iq) thisTag);
return true;
}
protected boolean endChild(Stack xmlStack, AbstractXMLTag thisTag,
String content) throws IOException, SAXException {
return true;
}
protected boolean endGrandchild(Stack xmlStack,
AbstractXMLTag thisTag, String content)
throws IOException, SAXException {
if (xmlStack.get(2).equals(BIND_TAG)
&& thisTag.uri.equals(XMPP_BIND_URI) && thisTag.getName().equals("jid")) {
String[] parts = content.split("/");
Jid myJid = connection.connection.getJid();
if (parts.length == 2) {
if (!parts[0].equals(myJid.getBareJid())) {
System.err.println("Server bound us to wrong user: " + parts[0]);
}
if (!parts[1].equals(myJid.getResource())) {
System.out.println("Server gave us a new resource: " + parts[1]);
connection.setResource(parts[1]);
}
} else {
System.err.println("Invalid jid content: " + content);
}
return true;
}
return false;
}
}