FileTransferDescription.java

 1package eu.siacs.conversations.xmpp.jingle.stanzas;
 2
 3import com.google.common.base.Preconditions;
 4
 5import java.util.Arrays;
 6import java.util.List;
 7
 8import eu.siacs.conversations.crypto.axolotl.XmppAxolotlMessage;
 9import eu.siacs.conversations.entities.DownloadableFile;
10import eu.siacs.conversations.xml.Element;
11
12public class FileTransferDescription extends GenericDescription {
13
14    public static List<String> NAMESPACES = Arrays.asList(
15            Version.FT_3.namespace,
16            Version.FT_4.namespace,
17            Version.FT_5.namespace
18    );
19
20
21    private FileTransferDescription(String name, String namespace) {
22        super(name, namespace);
23    }
24
25    public Version getVersion() {
26        final String namespace = getNamespace();
27        if (namespace.equals(Version.FT_3.namespace)) {
28            return Version.FT_3;
29        } else if (namespace.equals(Version.FT_4.namespace)) {
30            return Version.FT_4;
31        } else if (namespace.equals(Version.FT_5.namespace)) {
32            return Version.FT_5;
33        } else {
34            throw new IllegalStateException("Unknown namespace");
35        }
36    }
37
38    public Element getFileOffer() {
39        final Version version = getVersion();
40        if (version == Version.FT_3) {
41            final Element offer = this.findChild("offer");
42            return offer == null ? null : offer.findChild("file");
43        } else {
44            return this.findChild("file");
45        }
46    }
47
48    public static FileTransferDescription of(DownloadableFile file, Version version, XmppAxolotlMessage axolotlMessage) {
49        final FileTransferDescription description = new FileTransferDescription("description", version.getNamespace());
50        final Element fileElement;
51        if (version == Version.FT_3) {
52            Element offer = description.addChild("offer");
53            fileElement = offer.addChild("file");
54        } else {
55            fileElement = description.addChild("file");
56        }
57        fileElement.addChild("size").setContent(Long.toString(file.getExpectedSize()));
58        fileElement.addChild("name").setContent(file.getName());
59        if (axolotlMessage != null) {
60            fileElement.addChild(axolotlMessage.toElement());
61        }
62        return description;
63    }
64
65    public static FileTransferDescription upgrade(final Element element) {
66        Preconditions.checkArgument("description".equals(element.getName()), "Name of provided element is not description");
67        Preconditions.checkArgument(NAMESPACES.contains(element.getNamespace()), "Element does not match a file transfer namespace");
68        final FileTransferDescription description = new FileTransferDescription("description", element.getNamespace());
69        description.setAttributes(element.getAttributes());
70        description.setChildren(element.getChildren());
71        return description;
72    }
73
74    public enum Version {
75        FT_3("urn:xmpp:jingle:apps:file-transfer:3"),
76        FT_4("urn:xmpp:jingle:apps:file-transfer:4"),
77        FT_5("urn:xmpp:jingle:apps:file-transfer:5");
78
79        private final String namespace;
80
81        Version(String namespace) {
82            this.namespace = namespace;
83        }
84
85        public String getNamespace() {
86            return namespace;
87        }
88    }
89}