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;
11
12public class JinglePacket extends IqPacket {
13
14 private JinglePacket() {
15 super();
16 }
17
18 public JinglePacket(final Action action, final String sessionId) {
19 super(TYPE.SET);
20 final Element jingle = addChild("jingle", Namespace.JINGLE);
21 jingle.setAttribute("sid", sessionId);
22 jingle.setAttribute("action", action.toString());
23 }
24
25 public static JinglePacket upgrade(final IqPacket iqPacket) {
26 Preconditions.checkArgument(iqPacket.hasChild("jingle", Namespace.JINGLE));
27 final JinglePacket jinglePacket = new JinglePacket();
28 jinglePacket.setAttributes(iqPacket.getAttributes());
29 jinglePacket.setChildren(iqPacket.getChildren());
30 return jinglePacket;
31 }
32
33 public Content getJingleContent() {
34 final Element content = getJingleChild("content");
35 return content == null ? null : Content.upgrade(content);
36 }
37
38 public void setJingleContent(final Content content) { //take content interface
39 setJingleChild(content);
40 }
41
42 public Reason getReason() {
43 final Element reason = getJingleChild("reason");
44 return reason == null ? null : Reason.upgrade(reason);
45 }
46
47 public void setReason(final Reason reason) {
48 final Element jingle = findChild("jingle", Namespace.JINGLE);
49 jingle.addChild(reason);
50 }
51
52 public Element getJingleChild(final String name) {
53 final Element jingle = findChild("jingle", Namespace.JINGLE);
54 return jingle == null ? null : jingle.findChild(name);
55 }
56
57 public void setJingleChild(final Element child) {
58 final Element jingle = findChild("jingle", Namespace.JINGLE);
59 jingle.addChild(child);
60 }
61
62 public String getSessionId() {
63 return findChild("jingle", Namespace.JINGLE).getAttribute("sid");
64 }
65
66 public Action getAction() {
67 return Action.of(findChild("jingle", Namespace.JINGLE).getAttribute("action"));
68 }
69
70 public enum Action {
71 CONTENT_ACCEPT,
72 CONTENT_ADD,
73 CONTENT_MODIFY,
74 CONTENT_REJECT,
75 CONTENT_REMOVE,
76 DESCRIPTION_INFO,
77 SECURITY_INFO,
78 SESSION_ACCEPT,
79 SESSION_INFO,
80 SESSION_INITIATE,
81 SESSION_TERMINATE,
82 TRANSPORT_ACCEPT,
83 TRANSPORT_INFO,
84 TRANSPORT_REJECT,
85 TRANSPORT_REPLACE;
86
87 public static Action of(final String value) {
88 //TODO handle invalid
89 return Action.valueOf(CaseFormat.LOWER_HYPHEN.to(CaseFormat.UPPER_UNDERSCORE, value));
90 }
91
92 @Override
93 @NonNull
94 public String toString() {
95 return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_HYPHEN, super.toString());
96 }
97 }
98}