conversations-classic/src/main/java/eu/siacs/conversations/xmpp/jingle/AbstractJingleConnection.java

140 lines
4.7 KiB
Java
Raw Normal View History

package eu.siacs.conversations.xmpp.jingle;
2020-05-27 11:54:35 +00:00
import com.google.common.base.MoreObjects;
import com.google.common.base.Objects;
import com.google.common.base.Preconditions;
import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.entities.Contact;
import eu.siacs.conversations.entities.Message;
import eu.siacs.conversations.services.XmppConnectionService;
import eu.siacs.conversations.xmpp.jingle.stanzas.JinglePacket;
2020-05-15 15:06:16 +00:00
import eu.siacs.conversations.xmpp.Jid;
public abstract class AbstractJingleConnection {
public static final String JINGLE_MESSAGE_PROPOSE_ID_PREFIX = "jm-propose-";
public static final String JINGLE_MESSAGE_PROCEED_ID_PREFIX = "jm-proceed-";
2020-04-07 09:36:28 +00:00
protected final JingleConnectionManager jingleConnectionManager;
protected final XmppConnectionService xmppConnectionService;
protected final Id id;
protected final Jid initiator;
AbstractJingleConnection(final JingleConnectionManager jingleConnectionManager, final Id id, final Jid initiator) {
this.jingleConnectionManager = jingleConnectionManager;
this.xmppConnectionService = jingleConnectionManager.getXmppConnectionService();
this.id = id;
this.initiator = initiator;
}
boolean isInitiator() {
return initiator.equals(id.account.getJid());
}
abstract void deliverPacket(JinglePacket jinglePacket);
public Id getId() {
return id;
}
abstract void notifyRebound();
2020-05-02 07:50:17 +00:00
public static class Id implements OngoingRtpSession {
public final Account account;
2020-04-02 14:29:33 +00:00
public final Jid with;
public final String sessionId;
2020-04-02 14:29:33 +00:00
private Id(final Account account, final Jid with, final String sessionId) {
Preconditions.checkNotNull(with);
Preconditions.checkArgument(with.isFullJid());
this.account = account;
2020-04-02 14:29:33 +00:00
this.with = with;
this.sessionId = sessionId;
}
public static Id of(Account account, JinglePacket jinglePacket) {
return new Id(account, jinglePacket.getFrom(), jinglePacket.getSessionId());
}
2020-04-02 14:29:33 +00:00
public static Id of(Account account, Jid with, final String sessionId) {
return new Id(account, with, sessionId);
}
public static Id of(Account account, Jid with) {
return new Id(account, with, JingleConnectionManager.nextRandomId());
}
public static Id of(Message message) {
return new Id(
message.getConversation().getAccount(),
message.getCounterpart(),
JingleConnectionManager.nextRandomId()
);
}
public Contact getContact() {
return account.getRoster().getContact(with);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Id id = (Id) o;
2020-05-27 11:54:35 +00:00
return Objects.equal(account.getUuid(), id.account.getUuid()) &&
2020-04-02 14:29:33 +00:00
Objects.equal(with, id.with) &&
Objects.equal(sessionId, id.sessionId);
}
@Override
public int hashCode() {
2020-05-27 11:54:35 +00:00
return Objects.hashCode(account.getUuid(), with, sessionId);
}
2020-05-02 07:50:17 +00:00
@Override
public Account getAccount() {
return account;
}
@Override
public Jid getWith() {
return with;
}
@Override
public String getSessionId() {
return sessionId;
}
2020-05-27 11:54:35 +00:00
@Override
public String toString() {
return MoreObjects.toStringHelper(this)
.add("account", account.getJid())
.add("with", with)
.add("sessionId", sessionId)
.toString();
}
}
2020-04-02 19:12:38 +00:00
public enum State {
NULL, //default value; nothing has been sent or received yet
PROPOSED,
ACCEPTED,
PROCEED,
2020-04-07 19:26:51 +00:00
REJECTED,
RETRACTED,
RETRACTED_RACED, //used when receiving a retract after we already asked to proceed
2020-04-02 19:12:38 +00:00
SESSION_INITIALIZED, //equal to 'PENDING'
2020-04-08 13:27:17 +00:00
SESSION_INITIALIZED_PRE_APPROVED,
2020-04-02 19:12:38 +00:00
SESSION_ACCEPTED, //equal to 'ACTIVE'
2020-04-07 19:26:51 +00:00
TERMINATED_SUCCESS, //equal to 'ENDED' (after successful call) ui will just close
TERMINATED_DECLINED_OR_BUSY, //equal to 'ENDED' (after other party declined the call)
TERMINATED_CONNECTIVITY_ERROR, //equal to 'ENDED' (but after network failures; ui will display retry button)
TERMINATED_CANCEL_OR_TIMEOUT, //more or less the same as retracted; caller pressed end call before session was accepted
TERMINATED_APPLICATION_FAILURE
2020-04-02 19:12:38 +00:00
}
}