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.ConnectionCallback;
import de.uni_passau.fim.pkjab.model.tags.AbstractXMLTag;
import de.uni_passau.fim.pkjab.model.tags.XMLTag;
import de.uni_passau.fim.pkjab.util.Stack;
public class XMPPReader extends XMPPReaderTopLevel {
//private static final String XMPP_STREAMS_URI = "urn:ietf:params:xml:ns:xmpp-streams";
private static final XMLTag PRESENCE_TAG = new XMLTag("presence", JABBER_URI);
private static final XMLTag IQ_TAG = new XMLTag("iq", JABBER_URI);
private static final XMLTag MESSAGE_TAG = new XMLTag("message", JABBER_URI);
private String lang = null;
public XMPPReader(final ConnectionCallback connection) {
super(connection);
}
public String getLang() {
return lang;
}
protected void startStream(XMLTag thisTag, Attributes atts) {
lang = atts.getValue("lang");
}
protected boolean startChild(Stack xmlStack, AbstractXMLTag thisTag,
Attributes atts) throws SAXException {
boolean result = super.startChild(xmlStack, thisTag, atts);
XMPPReaderAdapter newHandler = null;
if (thisTag.equals(IQ_TAG)) {
newHandler = new XMPPIqHandler(this);
} else if (thisTag.equals(STREAM_ERROR_TAG)) {
/* TODO: handle non-recoverable stream errors (RFC 3920 4.7.3) */
newHandler = new XMPPReaderIgnore(this, null);
} else if (thisTag.equals(PRESENCE_TAG)) {
newHandler = new XMPPPresenceHandler(this);
} else if (thisTag.equals(MESSAGE_TAG)) {
newHandler = new XMPPMessageHandler(this);
}
if (newHandler != null) {
connection.setXMPPReader(newHandler);
return newHandler.startElement(xmlStack, thisTag, null, atts);
} else {
return result;
}
}
protected boolean endChild(Stack xmlStack, AbstractXMLTag thisTag,
String content) throws IOException, SAXException {
if (thisTag.equals(FEATURES_TAG)) {
connection.secondInitWasSuccessful(getFeatures());
return true;
}
return false;
}
}