Content.java

  1package eu.siacs.conversations.xmpp.jingle.stanzas;
  2
  3import android.support.annotation.NonNull;
  4
  5import com.google.common.base.Preconditions;
  6
  7import java.util.Locale;
  8
  9import eu.siacs.conversations.entities.DownloadableFile;
 10import eu.siacs.conversations.xml.Element;
 11import eu.siacs.conversations.xml.Namespace;
 12
 13public class Content extends Element {
 14    private String transportId;
 15
 16
 17    //refactor to getDescription and getTransport
 18    //return either FileTransferDescription or GenericDescription or RtpDescription (all extend Description interface)
 19
 20    public Content(final Creator creator, final String name) {
 21        super("content", Namespace.JINGLE);
 22        this.setAttribute("creator", creator.toString());
 23        this.setAttribute("name", name);
 24    }
 25
 26    private Content() {
 27        super("content", Namespace.JINGLE);
 28    }
 29
 30    public static Content upgrade(final Element element) {
 31        Preconditions.checkArgument("content".equals(element.getName()));
 32        final Content content = new Content();
 33        content.setAttributes(element.getAttributes());
 34        content.setChildren(element.getChildren());
 35        return content;
 36    }
 37
 38    public Creator getCreator() {
 39        return Creator.of(getAttribute("creator"));
 40    }
 41
 42    public Version getVersion() {
 43        if (hasChild("description", Version.FT_3.namespace)) {
 44            return Version.FT_3;
 45        } else if (hasChild("description", Version.FT_4.namespace)) {
 46            return Version.FT_4;
 47        } else if (hasChild("description", Version.FT_5.namespace)) {
 48            return Version.FT_5;
 49        }
 50        return null;
 51    }
 52
 53    public Element setFileOffer(DownloadableFile actualFile, boolean otr, Version version) {
 54        Element description = this.addChild("description", version.namespace);
 55        Element file;
 56        if (version == Version.FT_3) {
 57            Element offer = description.addChild("offer");
 58            file = offer.addChild("file");
 59        } else {
 60            file = description.addChild("file");
 61        }
 62        file.addChild("size").setContent(Long.toString(actualFile.getExpectedSize()));
 63        if (otr) {
 64            file.addChild("name").setContent(actualFile.getName() + ".otr");
 65        } else {
 66            file.addChild("name").setContent(actualFile.getName());
 67        }
 68        return file;
 69    }
 70
 71    public Element getFileOffer(Version version) {
 72        Element description = this.findChild("description", version.namespace);
 73        if (description == null) {
 74            return null;
 75        }
 76        if (version == Version.FT_3) {
 77            Element offer = description.findChild("offer");
 78            if (offer == null) {
 79                return null;
 80            }
 81            return offer.findChild("file");
 82        } else {
 83            return description.findChild("file");
 84        }
 85    }
 86
 87    public void setFileOffer(Element fileOffer, Version version) {
 88        Element description = this.addChild("description", version.namespace);
 89        if (version == Version.FT_3) {
 90            description.addChild("offer").addChild(fileOffer);
 91        } else {
 92            description.addChild(fileOffer);
 93        }
 94    }
 95
 96    public String getTransportId() {
 97        if (hasSocks5Transport()) {
 98            this.transportId = socks5transport().getAttribute("sid");
 99        } else if (hasIbbTransport()) {
100            this.transportId = ibbTransport().getAttribute("sid");
101        }
102        return this.transportId;
103    }
104
105    public void setTransportId(String sid) {
106        this.transportId = sid;
107    }
108
109    public Element socks5transport() {
110        Element transport = this.findChild("transport", Namespace.JINGLE_TRANSPORTS_S5B);
111        if (transport == null) {
112            transport = this.addChild("transport", Namespace.JINGLE_TRANSPORTS_S5B);
113            transport.setAttribute("sid", this.transportId);
114        }
115        return transport;
116    }
117
118    public Element ibbTransport() {
119        Element transport = this.findChild("transport", Namespace.JINGLE_TRANSPORTS_IBB);
120        if (transport == null) {
121            transport = this.addChild("transport", Namespace.JINGLE_TRANSPORTS_IBB);
122            transport.setAttribute("sid", this.transportId);
123        }
124        return transport;
125    }
126
127    public boolean hasSocks5Transport() {
128        return this.hasChild("transport", Namespace.JINGLE_TRANSPORTS_S5B);
129    }
130
131    public boolean hasIbbTransport() {
132        return this.hasChild("transport", Namespace.JINGLE_TRANSPORTS_IBB);
133    }
134
135    public enum Version {
136        FT_3("urn:xmpp:jingle:apps:file-transfer:3"),
137        FT_4("urn:xmpp:jingle:apps:file-transfer:4"),
138        FT_5("urn:xmpp:jingle:apps:file-transfer:5");
139
140        private final String namespace;
141
142        Version(String namespace) {
143            this.namespace = namespace;
144        }
145
146        public String getNamespace() {
147            return namespace;
148        }
149    }
150
151    public enum Creator {
152        INITIATOR, RESPONDER;
153
154        public static Creator of(final String value) {
155            return Creator.valueOf(value.toUpperCase(Locale.ROOT));
156        }
157
158        @Override
159        @NonNull
160        public String toString() {
161            return super.toString().toLowerCase(Locale.ROOT);
162        }
163    }
164
165    public enum Senders {
166        BOTH, INITIATOR, NONE, RESPONDER;
167
168        public static Senders of(final String value) {
169            return Senders.valueOf(value.toUpperCase(Locale.ROOT));
170        }
171
172        @Override
173        @NonNull
174        public String toString() {
175            return super.toString().toLowerCase(Locale.ROOT);
176        }
177    }
178}