1package eu.siacs.conversations.xmpp.jingle;
2
3import com.google.common.base.Objects;
4import com.google.common.base.Preconditions;
5
6import eu.siacs.conversations.entities.Account;
7import eu.siacs.conversations.entities.Message;
8import eu.siacs.conversations.services.XmppConnectionService;
9import eu.siacs.conversations.xmpp.jingle.stanzas.JinglePacket;
10import rocks.xmpp.addr.Jid;
11
12public abstract class AbstractJingleConnection {
13
14 public static final String JINGLE_MESSAGE_ID_PREFIX = "jm-propose-";
15
16 protected final JingleConnectionManager jingleConnectionManager;
17 protected final XmppConnectionService xmppConnectionService;
18 protected final Id id;
19 protected final Jid initiator;
20
21 AbstractJingleConnection(final JingleConnectionManager jingleConnectionManager, final Id id, final Jid initiator) {
22 this.jingleConnectionManager = jingleConnectionManager;
23 this.xmppConnectionService = jingleConnectionManager.getXmppConnectionService();
24 this.id = id;
25 this.initiator = initiator;
26 }
27
28 boolean isInitiator() {
29 return initiator.equals(id.account.getJid());
30 }
31
32 abstract void deliverPacket(JinglePacket jinglePacket);
33
34 public Id getId() {
35 return id;
36 }
37
38
39 public static class Id {
40 public final Account account;
41 public final Jid with;
42 public final String sessionId;
43
44 private Id(final Account account, final Jid with, final String sessionId) {
45 Preconditions.checkNotNull(with);
46 Preconditions.checkArgument(with.isFullJid());
47 this.account = account;
48 this.with = with;
49 this.sessionId = sessionId;
50 }
51
52 public static Id of(Account account, JinglePacket jinglePacket) {
53 return new Id(account, jinglePacket.getFrom(), jinglePacket.getSessionId());
54 }
55
56 public static Id of(Account account, Jid with, final String sessionId) {
57 return new Id(account, with, sessionId);
58 }
59
60 public static Id of(Message message) {
61 return new Id(
62 message.getConversation().getAccount(),
63 message.getCounterpart(),
64 JingleConnectionManager.nextRandomId()
65 );
66 }
67
68 @Override
69 public boolean equals(Object o) {
70 if (this == o) return true;
71 if (o == null || getClass() != o.getClass()) return false;
72 Id id = (Id) o;
73 return Objects.equal(account.getJid(), id.account.getJid()) &&
74 Objects.equal(with, id.with) &&
75 Objects.equal(sessionId, id.sessionId);
76 }
77
78 @Override
79 public int hashCode() {
80 return Objects.hashCode(account.getJid(), with, sessionId);
81 }
82 }
83
84
85 public enum State {
86 NULL, //default value; nothing has been sent or received yet
87 PROPOSED,
88 ACCEPTED,
89 PROCEED,
90 SESSION_INITIALIZED, //equal to 'PENDING'
91 SESSION_ACCEPTED, //equal to 'ACTIVE'
92 TERMINATED //equal to 'ENDED'
93 }
94}