1package eu.siacs.conversations.xmpp.jingle.stanzas;
2
3import android.support.annotation.NonNull;
4
5import com.google.common.base.CaseFormat;
6import com.google.common.base.Preconditions;
7
8import eu.siacs.conversations.xml.Element;
9import eu.siacs.conversations.xml.Namespace;
10import eu.siacs.conversations.xmpp.stanzas.IqPacket;
11import rocks.xmpp.addr.Jid;
12
13public class JinglePacket extends IqPacket {
14
15 //TODO add support for groups: https://xmpp.org/extensions/xep-0338.html
16
17 private JinglePacket() {
18 super();
19 }
20
21 public JinglePacket(final Action action, final String sessionId) {
22 super(TYPE.SET);
23 final Element jingle = addChild("jingle", Namespace.JINGLE);
24 jingle.setAttribute("sid", sessionId);
25 jingle.setAttribute("action", action.toString());
26 }
27
28 public static JinglePacket upgrade(final IqPacket iqPacket) {
29 Preconditions.checkArgument(iqPacket.hasChild("jingle", Namespace.JINGLE));
30 final JinglePacket jinglePacket = new JinglePacket();
31 jinglePacket.setAttributes(iqPacket.getAttributes());
32 jinglePacket.setChildren(iqPacket.getChildren());
33 return jinglePacket;
34 }
35
36 //TODO can have multiple contents
37 public Content getJingleContent() {
38 final Element content = getJingleChild("content");
39 return content == null ? null : Content.upgrade(content);
40 }
41
42 public void setJingleContent(final Content content) { //take content interface
43 setJingleChild(content);
44 }
45
46 public Reason getReason() {
47 final Element reason = getJingleChild("reason");
48 return reason == null ? null : Reason.upgrade(reason);
49 }
50
51 public void setReason(final Reason reason) {
52 final Element jingle = findChild("jingle", Namespace.JINGLE);
53 jingle.addChild(reason);
54 }
55
56 //RECOMMENDED for session-initiate, NOT RECOMMENDED otherwise
57 public void setInitiator(final Jid initiator) {
58 Preconditions.checkArgument(initiator.isFullJid(), "initiator should be a full JID");
59 findChild("jingle", Namespace.JINGLE).setAttribute("initiator", initiator.toEscapedString());
60 }
61
62 //RECOMMENDED for session-accept, NOT RECOMMENDED otherwise
63 public void setResponder(Jid responder) {
64 Preconditions.checkArgument(responder.isFullJid(), "responder should be a full JID");
65 findChild("jingle", Namespace.JINGLE).setAttribute("responder", responder.toEscapedString());
66 }
67
68 public Element getJingleChild(final String name) {
69 final Element jingle = findChild("jingle", Namespace.JINGLE);
70 return jingle == null ? null : jingle.findChild(name);
71 }
72
73 public void setJingleChild(final Element child) {
74 final Element jingle = findChild("jingle", Namespace.JINGLE);
75 jingle.addChild(child);
76 }
77
78 public String getSessionId() {
79 return findChild("jingle", Namespace.JINGLE).getAttribute("sid");
80 }
81
82 public Action getAction() {
83 return Action.of(findChild("jingle", Namespace.JINGLE).getAttribute("action"));
84 }
85
86 public enum Action {
87 CONTENT_ACCEPT,
88 CONTENT_ADD,
89 CONTENT_MODIFY,
90 CONTENT_REJECT,
91 CONTENT_REMOVE,
92 DESCRIPTION_INFO,
93 SECURITY_INFO,
94 SESSION_ACCEPT,
95 SESSION_INFO,
96 SESSION_INITIATE,
97 SESSION_TERMINATE,
98 TRANSPORT_ACCEPT,
99 TRANSPORT_INFO,
100 TRANSPORT_REJECT,
101 TRANSPORT_REPLACE;
102
103 public static Action of(final String value) {
104 //TODO handle invalid
105 return Action.valueOf(CaseFormat.LOWER_HYPHEN.to(CaseFormat.UPPER_UNDERSCORE, value));
106 }
107
108 @Override
109 @NonNull
110 public String toString() {
111 return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_HYPHEN, super.toString());
112 }
113 }
114}