JinglePacket.java

  1package eu.siacs.conversations.xmpp.jingle.stanzas;
  2
  3import android.support.annotation.NonNull;
  4
  5import com.google.common.base.CaseFormat;
  6import com.google.common.base.Preconditions;
  7
  8import eu.siacs.conversations.xml.Element;
  9import eu.siacs.conversations.xml.Namespace;
 10import eu.siacs.conversations.xmpp.stanzas.IqPacket;
 11import rocks.xmpp.addr.Jid;
 12
 13public class JinglePacket extends IqPacket {
 14
 15    //TODO add support for groups: https://xmpp.org/extensions/xep-0338.html
 16
 17    private JinglePacket() {
 18        super();
 19    }
 20
 21    public JinglePacket(final Action action, final String sessionId) {
 22        super(TYPE.SET);
 23        final Element jingle = addChild("jingle", Namespace.JINGLE);
 24        jingle.setAttribute("sid", sessionId);
 25        jingle.setAttribute("action", action.toString());
 26    }
 27
 28    public static JinglePacket upgrade(final IqPacket iqPacket) {
 29        Preconditions.checkArgument(iqPacket.hasChild("jingle", Namespace.JINGLE));
 30        final JinglePacket jinglePacket = new JinglePacket();
 31        jinglePacket.setAttributes(iqPacket.getAttributes());
 32        jinglePacket.setChildren(iqPacket.getChildren());
 33        return jinglePacket;
 34    }
 35
 36    //TODO can have multiple contents
 37    public Content getJingleContent() {
 38        final Element content = getJingleChild("content");
 39        return content == null ? null : Content.upgrade(content);
 40    }
 41
 42    public void setJingleContent(final Content content) { //take content interface
 43        setJingleChild(content);
 44    }
 45
 46    public Reason getReason() {
 47        final Element reason = getJingleChild("reason");
 48        return reason == null ? null : Reason.upgrade(reason);
 49    }
 50
 51    public void setReason(final Reason reason) {
 52        final Element jingle = findChild("jingle", Namespace.JINGLE);
 53        jingle.addChild(reason);
 54    }
 55
 56    //RECOMMENDED for session-initiate, NOT RECOMMENDED otherwise
 57    public void setInitiator(final Jid initiator) {
 58        Preconditions.checkArgument(initiator.isFullJid(), "initiator should be a full JID");
 59        findChild("jingle", Namespace.JINGLE).setAttribute("initiator", initiator.toEscapedString());
 60    }
 61
 62    //RECOMMENDED for session-accept, NOT RECOMMENDED otherwise
 63    public void setResponder(Jid responder) {
 64        Preconditions.checkArgument(responder.isFullJid(), "responder should be a full JID");
 65        findChild("jingle", Namespace.JINGLE).setAttribute("responder", responder.toEscapedString());
 66    }
 67
 68    public Element getJingleChild(final String name) {
 69        final Element jingle = findChild("jingle", Namespace.JINGLE);
 70        return jingle == null ? null : jingle.findChild(name);
 71    }
 72
 73    public void setJingleChild(final Element child) {
 74        final Element jingle = findChild("jingle", Namespace.JINGLE);
 75        jingle.addChild(child);
 76    }
 77
 78    public String getSessionId() {
 79        return findChild("jingle", Namespace.JINGLE).getAttribute("sid");
 80    }
 81
 82    public Action getAction() {
 83        return Action.of(findChild("jingle", Namespace.JINGLE).getAttribute("action"));
 84    }
 85
 86    public enum Action {
 87        CONTENT_ACCEPT,
 88        CONTENT_ADD,
 89        CONTENT_MODIFY,
 90        CONTENT_REJECT,
 91        CONTENT_REMOVE,
 92        DESCRIPTION_INFO,
 93        SECURITY_INFO,
 94        SESSION_ACCEPT,
 95        SESSION_INFO,
 96        SESSION_INITIATE,
 97        SESSION_TERMINATE,
 98        TRANSPORT_ACCEPT,
 99        TRANSPORT_INFO,
100        TRANSPORT_REJECT,
101        TRANSPORT_REPLACE;
102
103        public static Action of(final String value) {
104            //TODO handle invalid
105            return Action.valueOf(CaseFormat.LOWER_HYPHEN.to(CaseFormat.UPPER_UNDERSCORE, value));
106        }
107
108        @Override
109        @NonNull
110        public String toString() {
111            return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_HYPHEN, super.toString());
112        }
113    }
114}