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}