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}