/** * * Copyright 2017 Florian Schmaus * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jivesoftware.smackx.jingle; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.concurrent.Future; import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.packet.IQ; import org.jivesoftware.smack.util.EqualsUtil; import org.jivesoftware.smack.util.HashCode; import org.jivesoftware.smackx.jingle.element.Jingle; import org.jivesoftware.smackx.jingle.element.JingleContent; import org.jivesoftware.smackx.jingle.transports.JingleTransportSession; import org.jxmpp.jid.FullJid; public abstract class JingleSession implements JingleSessionHandler { protected HashSet failedTransportMethods = new HashSet<>(); protected final FullJid local; protected final FullJid remote; protected final Role role; protected final String sid; protected final List contents = new ArrayList<>(); protected ArrayList> queued = new ArrayList<>(); protected JingleTransportSession transportSession; public JingleSession(FullJid initiator, FullJid responder, Role role, String sid) { this(initiator, responder, role, sid, null); } public JingleSession(FullJid initiator, FullJid responder, Role role, String sid, List contents) { if (role == Role.initiator) { this.local = initiator; this.remote = responder; } else { this.local = responder; this.remote = initiator; } this.sid = sid; this.role = role; if (contents != null) { this.contents.addAll(contents); } } public FullJid getInitiator() { return isInitiator() ? local : remote; } public boolean isInitiator() { return role == Role.initiator; } public FullJid getResponder() { return isResponder() ? local : remote; } public boolean isResponder() { return role == Role.responder; } public FullJid getRemote() { return remote; } public FullJid getLocal() { return local; } public String getSessionId() { return sid; } public FullJidAndSessionId getFullJidAndSessionId() { return new FullJidAndSessionId(remote, sid); } public List getContents() { return contents; } public JingleTransportSession getTransportSession() { return transportSession; } protected void setTransportSession(JingleTransportSession transportSession) { this.transportSession = transportSession; } @Override public int hashCode() { return HashCode.builder() .append(getInitiator()) .append(getResponder()) .append(getSessionId()) .build(); } @Override public boolean equals(Object other) { return EqualsUtil.equals(this, other, (e, o) -> e.append(getInitiator(), o.getInitiator()) .append(getResponder(), o.getResponder()) .append(sid, o.sid) ); } @Override public IQ handleJingleSessionRequest(Jingle jingle) { switch (jingle.getAction()) { case content_accept: return handleContentAccept(jingle); case content_add: return handleContentAdd(jingle); case content_modify: return handleContentModify(jingle); case content_reject: return handleContentReject(jingle); case content_remove: return handleContentRemove(jingle); case description_info: return handleDescriptionInfo(jingle); case session_info: return handleSessionInfo(jingle); case security_info: return handleSecurityInfo(jingle); case session_accept: return handleSessionAccept(jingle); case transport_accept: return handleTransportAccept(jingle); case transport_info: return transportSession.handleTransportInfo(jingle); case session_initiate: return handleSessionInitiate(jingle); case transport_reject: return handleTransportReject(jingle); case session_terminate: return handleSessionTerminate(jingle); case transport_replace: return handleTransportReplace(jingle); default: return IQ.createResultIQ(jingle); } } protected IQ handleSessionInitiate(Jingle sessionInitiate) { return IQ.createResultIQ(sessionInitiate); } protected IQ handleSessionTerminate(Jingle sessionTerminate) { return IQ.createResultIQ(sessionTerminate); } protected IQ handleSessionInfo(Jingle sessionInfo) { return IQ.createResultIQ(sessionInfo); } protected IQ handleSessionAccept(Jingle sessionAccept) { return IQ.createResultIQ(sessionAccept); } protected IQ handleContentAdd(Jingle contentAdd) { return IQ.createResultIQ(contentAdd); } protected IQ handleContentAccept(Jingle contentAccept) { return IQ.createResultIQ(contentAccept); } protected IQ handleContentModify(Jingle contentModify) { return IQ.createResultIQ(contentModify); } protected IQ handleContentReject(Jingle contentReject) { return IQ.createResultIQ(contentReject); } protected IQ handleContentRemove(Jingle contentRemove) { return IQ.createResultIQ(contentRemove); } protected IQ handleDescriptionInfo(Jingle descriptionInfo) { return IQ.createResultIQ(descriptionInfo); } protected IQ handleSecurityInfo(Jingle securityInfo) { return IQ.createResultIQ(securityInfo); } protected IQ handleTransportAccept(Jingle transportAccept) { return IQ.createResultIQ(transportAccept); } protected IQ handleTransportReplace(Jingle transportReplace) { return IQ.createResultIQ(transportReplace); } protected IQ handleTransportReject(Jingle transportReject) { return IQ.createResultIQ(transportReject); } public abstract XMPPConnection getConnection(); public abstract void onTransportMethodFailed(String namespace); }