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}