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.Resource; import de.uni_passau.fim.pkjab.model.messages.PresenceInformation; 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; import de.uni_passau.fim.pkjab.util.UserState; /** * Handles *content* of * <presence></presence> * * @author Philipp Wendler */ class XMPPPresenceHandler extends XMPPReaderSubLevel { private static XMLTag PRIORITY_TAG = new XMLTag("priority", JABBER_URI); private static XMLTag SHOW_TAG = new XMLTag("show", JABBER_URI); private static XMLTag STATUS_TAG = new XMLTag("status", JABBER_URI); private Contact contact = null; private Resource resource = null; protected XMPPPresenceHandler(final XMPPReaderAdapter previousHandler) { super(previousHandler, JABBER_URI); } 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")); String type = atts.getValue("type"); if (from != null && (to == null || to.equals(myJid) || to.equals(myJid.getBareJid()))) { contact = connection.connection.getRoster().get(from); // TODO: handle error if (contact != null) { if (from.isQualified()) { resource = new Resource(from.getResource()); if (type == null) { resource.setState(UserState.ONLINE); } else if (type.equals("unavailable")) { resource.setState(UserState.OFFLINE); } else { return false; } } else { PresenceInformation message = new PresenceInformation(); message.setFrom(from); message.setTo(to); message.setType(type); contact.setMessageReceived(message); if (type.equals("subscribe")) { contact.setSubscription(contact.getSubscription().addTo()); } else if (type.equals("subscribed")) { contact.setSubscription(contact.getSubscription().addFrom()); } else if (type.equals("unsubscribe")) { contact.setSubscription(contact.getSubscription().removeTo()); } else if (type.equals("unsubscribed")) { contact.setSubscription(contact.getSubscription().removeFrom()); } else { return false; } } } return true; } else { return false; } } protected boolean startChild(Stack xmlStack, AbstractXMLTag thisTag, Attributes atts) throws SAXException { return thisTag.equals(PRIORITY_TAG) || thisTag.equals(SHOW_TAG) || thisTag.equals(STATUS_TAG); } protected boolean endTopLevel(AbstractXMLTag thisTag, String content) throws IOException, SAXException { super.endTopLevel(thisTag, content); if (resource != null) { contact.addResource(resource); } if (contact != null) { contact.fireStateChanged(); } return true; } protected boolean endChild(Stack xmlStack, AbstractXMLTag thisTag, String content) { if (resource != null) { if (thisTag.equals(PRIORITY_TAG)) { resource.setPriority(Integer.parseInt(content.trim())); return true; } else if (thisTag.equals(SHOW_TAG)) { resource.setState(UserState.valueOf(content.trim().toUpperCase())); return true; } else if (thisTag.equals(STATUS_TAG)) { resource.setText(content); return true; } return false; } else { return thisTag.equals(PRIORITY_TAG) || thisTag.equals(SHOW_TAG) || thisTag.equals(STATUS_TAG); } } }