JinglePacket.java

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