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.Contact; import de.uni_passau.fim.pkjab.model.Roster; import de.uni_passau.fim.pkjab.model.messages.TextMessage; 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.Jid; import de.uni_passau.fim.pkjab.util.Stack; class XMPPMessageHandler extends XMPPReaderIgnore { private static XMLTag SUBJECT_TAG = new XMLTag("subject", JABBER_URI); private static XMLTag BODY_TAG = new XMLTag("body", JABBER_URI); private static XMLTag THREAD_TAG = new XMLTag("thread", JABBER_URI); protected Contact contact = null; protected TextMessage message = new TextMessage(); protected XMPPMessageHandler(final XMPPReaderAdapter previousHandler) { super(previousHandler, null); } protected boolean startTopLevel(Stack xmlStack, AbstractXMLTag thisTag, Attributes atts) throws SAXException { Jid to = Jid.fromString(atts.getValue("to")); Jid myJid = connection.connection.getJid(); Jid from = Jid.fromString(atts.getValue("from")); if (from != null && from.isQualified() && (to == null || to.equals(myJid) || to.equals(myJid.getBareJid()))) { Roster roster = connection.connection.getRoster(); contact = roster.get(from); if (contact == null) { contact = new Contact(connection.connection, from); roster.add(contact); } message.setType(atts.getValue("type")); message.setTo(to); message.setFrom(from); return true; } else { return false; } } protected boolean startChild(Stack xmlStack, AbstractXMLTag thisTag, Attributes atts) throws SAXException { if (thisTag.uri.equals(JABBER_URI)) { return thisTag.equals(BODY_TAG) || thisTag.equals(THREAD_TAG) || thisTag.equals(SUBJECT_TAG); } else { XMPPReaderAdapter newHandler = new XMPPReaderIgnore(this, null); connection.setXMPPReader(newHandler); return newHandler.startElement(xmlStack, thisTag, null, atts); } } protected boolean endTopLevel(AbstractXMLTag thisTag, String content) throws IOException, SAXException { super.endTopLevel(thisTag, content); if (message.getBody() != null) { contact.setMessageReceived(message); } return true; } protected boolean endChild(Stack xmlStack, AbstractXMLTag thisTag, String content) { if (thisTag.equals(SUBJECT_TAG)) { message.setSubject(content); return true; } else if (thisTag.equals(BODY_TAG)) { message.setBody(content); return true; } else if (thisTag.equals(THREAD_TAG)) { message.setThread(content); return true; } return false; } }