/* * TeleStax, Open Source Cloud Communications * Copyright 2011-2014, Telestax Inc and individual contributors * by the @authors tag. * * This program is free software: you can redistribute it and/or modify * under the terms of the GNU Affero General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/> * */ package org.restcomm.media.sdp; import java.util.HashMap; import java.util.Map; import org.restcomm.media.sdp.attributes.ConnectionModeAttribute; import org.restcomm.media.sdp.dtls.attributes.FingerprintAttribute; import org.restcomm.media.sdp.dtls.attributes.SetupAttribute; import org.restcomm.media.sdp.fields.ConnectionField; import org.restcomm.media.sdp.fields.MediaDescriptionField; import org.restcomm.media.sdp.fields.OriginField; import org.restcomm.media.sdp.fields.SessionNameField; import org.restcomm.media.sdp.fields.TimingField; import org.restcomm.media.sdp.fields.VersionField; import org.restcomm.media.sdp.ice.attributes.IceLiteAttribute; import org.restcomm.media.sdp.ice.attributes.IcePwdAttribute; import org.restcomm.media.sdp.ice.attributes.IceUfragAttribute; /** * * @author Henrique Rosa (henrique.rosa@telestax.com) * */ public class SessionDescription implements SessionLevelAccessor { private static final String NEWLINE = "\n"; private final StringBuilder builder; // SDP fields (session-level) private VersionField version; private OriginField origin; private SessionNameField sessionName; private ConnectionField connection; private TimingField timing; private ConnectionModeAttribute connectionMode; // ICE attributes (session-level) private IceLiteAttribute iceLite; private IcePwdAttribute icePwd; private IceUfragAttribute iceUfrag; // WebRTC attributes (session-level) private FingerprintAttribute fingerprint; private SetupAttribute setup; // Media Descriptions private final Map<String, MediaDescriptionField> mediaMap; public SessionDescription() { this.builder = new StringBuilder(); this.mediaMap = new HashMap<String, MediaDescriptionField>(5); } public VersionField getVersion() { return version; } public void setVersion(VersionField version) { this.version = version; } public OriginField getOrigin() { return origin; } public void setOrigin(OriginField origin) { this.origin = origin; } public SessionNameField getSessionName() { return sessionName; } public void setSessionName(SessionNameField sessionName) { this.sessionName = sessionName; } @Override public ConnectionField getConnection() { return connection; } public ConnectionField getConnection(String media) { if(this.mediaMap.containsKey(media)) { ConnectionField mediaConn = this.mediaMap.get(media).getConnection(); if(mediaConn != null) { return mediaConn; } } return this.connection; } public void setConnection(ConnectionField connection) { this.connection = connection; } public TimingField getTiming() { return timing; } public void setTiming(TimingField timing) { this.timing = timing; } @Override public ConnectionModeAttribute getConnectionMode() { return connectionMode; } public ConnectionModeAttribute getConnectionMode(String media) { if(this.mediaMap.containsKey(media)) { ConnectionModeAttribute connectionMode = this.mediaMap.get(media).getConnectionMode(); if(connectionMode != null) { return connectionMode; } } return this.connectionMode; } public void setConnectionMode(ConnectionModeAttribute connectionMode) { this.connectionMode = connectionMode; } public IceLiteAttribute getIceLite() { return iceLite; } public void setIceLite(IceLiteAttribute iceLite) { this.iceLite = iceLite; } @Override public IcePwdAttribute getIcePwd() { return icePwd; } public void setIcePwd(IcePwdAttribute icePwd) { this.icePwd = icePwd; } @Override public IceUfragAttribute getIceUfrag() { return iceUfrag; } public void setIceUfrag(IceUfragAttribute iceUfrag) { this.iceUfrag = iceUfrag; } @Override public FingerprintAttribute getFingerprint() { return fingerprint; } public FingerprintAttribute getFingerprint(String media) { if(this.mediaMap.containsKey(media)) { FingerprintAttribute audioFingerprint = this.mediaMap.get(media).getFingerprint(); if(audioFingerprint != null) { return audioFingerprint; } } return this.fingerprint; } @Override public SetupAttribute getSetup() { return this.setup; } public SetupAttribute getSetupAttribute(String media) { if(this.mediaMap.containsKey(media)) { SetupAttribute setup = this.mediaMap.get(media).getSetup(); if(setup != null) { return setup; } } return this.setup; } public void setSetup(SetupAttribute setup) { this.setup = setup; } public void setFingerprint(FingerprintAttribute fingerprint) { this.fingerprint = fingerprint; } public MediaDescriptionField getMediaDescription(String mediaType) { return this.mediaMap.get(mediaType); } public boolean containsMediaDescription(String mediaType) { return this.mediaMap.containsKey(mediaType); } public void addMediaDescription(MediaDescriptionField media) { this.mediaMap.put(media.getMedia(), media); } public boolean containsIce() { // Look for session-level ICE attributes if(this.iceLite != null || this.iceUfrag != null || this.icePwd != null) { return true; } // Look for media-level ICE attributes if(!this.mediaMap.isEmpty()) { for (MediaDescriptionField media : this.mediaMap.values()) { if(media.containsIce()) { return true; } } } // No ICE attributes found return false; } public boolean containsDtls() { // Look for session-level DTLS attributes if(this.fingerprint != null) { return true; } // Look for media-level DTLS attributes if(!this.mediaMap.isEmpty()) { for (MediaDescriptionField media : this.mediaMap.values()) { if(media.containsDtls()) { return true; } } } // No DTLS attributes found return false; } @Override public String toString() { this.builder.setLength(0); append(this.version); append(this.origin); append(this.sessionName); append(this.connection); append(this.timing); append(this.iceLite); append(this.iceUfrag); append(this.icePwd); append(this.fingerprint); append(this.setup); for (MediaDescriptionField media : this.mediaMap.values()) { append(media); } this.builder.deleteCharAt(this.builder.length() - 1); return this.builder.toString(); } private void append(SdpField field) { if(field != null) { this.builder.append(field.toString()).append(NEWLINE); } } }