package de.uni_passau.fim.pkjab.model.xmpp; 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.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.Subscription; /** * Handles *content* of * <iq type='result'><query xmlns='jabber:iq:roster></query></iq> * * @author Philipp Wendler */ class XMPPRosterHandler extends XMPPReaderSubLevel { private static final XMLTag ROSTER_ITEM_TAG = new XMLTag("item", ROSTER_URI); private static final XMLTag ROSTER_GROUP_TAG = new XMLTag("group", ROSTER_URI); protected XMPPRosterHandler(final XMPPReaderAdapter previousHandler, final Stack xmlStack) { super(previousHandler, ROSTER_URI); } protected boolean startTopLevel(Stack xmlStack, AbstractXMLTag thisTag, Attributes atts) throws SAXException { String type = atts.getValue("type"); return (type == null || type.equals("result") || type.equals("set")); } protected boolean startChild(Stack xmlStack, AbstractXMLTag thisTag, Attributes atts) { if (thisTag.equals(ROSTER_ITEM_TAG)) { Jid jid = Jid.fromString(atts.getValue("jid")); if (jid != null) { final Roster roster = connection.connection.getRoster(); Contact contact = roster.get(jid); if (contact == null) { contact = new Contact(connection.connection, jid); roster.add(contact); } contact.setNick(atts.getValue("name")); contact.setSubscription(Subscription.valueOf(atts.getValue("subscription"))); contact.fireStateChanged(); return true; } } return false; } protected boolean startGrandchild(Stack xmlStack, AbstractXMLTag thisTag, Attributes atts) { return thisTag.equals(ROSTER_GROUP_TAG); } protected boolean endChild(Stack xmlStack, AbstractXMLTag thisTag, String content) { return thisTag.equals(ROSTER_ITEM_TAG); } protected boolean endGrandchild(Stack xmlStack, AbstractXMLTag thisTag, String content) { return thisTag.equals(ROSTER_GROUP_TAG); } }