AbstractJingleConnection.java

 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}