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        REJECTED,
 91        RETRACTED,
 92        SESSION_INITIALIZED, //equal to 'PENDING'
 93        SESSION_INITIALIZED_PRE_APPROVED,
 94        SESSION_ACCEPTED, //equal to 'ACTIVE'
 95        TERMINATED_SUCCESS, //equal to 'ENDED' (after successful call) ui will just close
 96        TERMINATED_DECLINED_OR_BUSY, //equal to 'ENDED' (after other party declined the call)
 97        TERMINATED_CONNECTIVITY_ERROR, //equal to 'ENDED' (but after network failures; ui will display retry button)
 98        TERMINATED_CANCEL_OR_TIMEOUT, //more or less the same as retracted; caller pressed end call before session was accepted
 99        TERMINATED_APPLICATION_FAILURE
100    }
101}