/*
* Jicofo, the Jitsi Conference Focus.
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
package org.jitsi.protocol.xmpp.util;
import net.java.sip.communicator.impl.protocol.jabber.extensions.colibri.*;
import net.java.sip.communicator.impl.protocol.jabber.extensions.jingle.*;
import java.util.*;
/**
* The map of media <tt>SourcePacketExtension</tt> encapsulates various
* manipulation and access operations.
*
* @author Pawel Domas
*/
public class MediaSSRCMap
{
/**
* The media SSRC map storage.
*/
private Map<String, List<SourcePacketExtension>> ssrcs
= new HashMap<String, List<SourcePacketExtension>>();
/**
* Creates new empty instance of <tt>MediaSSRCMap</tt>.
*/
public MediaSSRCMap()
{
ssrcs = new HashMap<String, List<SourcePacketExtension>>();
}
/**
* Creates new instance of <tt>MediaSSRCMap</tt> initialized with given map
* of media SSRCs.
*
* @param ssrcs initial map of media SSRCs.
*/
private MediaSSRCMap(Map<String, List<SourcePacketExtension>> ssrcs)
{
this.ssrcs = ssrcs;
}
/**
* Returns the list of <tt>SourcePacketExtension</tt> for given media type
* contained in this map.
*
* @param media the media type for which the list of
* <tt>SourcePacketExtension</tt> will be returned.
*/
public List<SourcePacketExtension> getSSRCsForMedia(String media)
{
List<SourcePacketExtension> ssrcList = ssrcs.get(media);
if (ssrcList == null)
{
ssrcList = new ArrayList<SourcePacketExtension>();
ssrcs.put(media, ssrcList);
}
return ssrcList;
}
/**
* Returns all media types contained in this map.
*/
public Set<String> getMediaTypes()
{
return ssrcs.keySet();
}
/**
* Merges SSRCs from given map with this instance.
*
* @param mapToMerge the map of media SSRCs to be included in this map.
*/
public void add(MediaSSRCMap mapToMerge)
{
for (String media : mapToMerge.ssrcs.keySet())
{
List<SourcePacketExtension> ssrcList
= getSSRCsForMedia(media);
// FIXME: addAll will not detect duplications
// as .equals is not overridden
ssrcList.addAll(mapToMerge.ssrcs.get(media));
}
}
/**
* Removes SSRCs contained in given map from this instance.
*
* @param mapToRemove the map that contains media SSRCs to be removed from
* this instance f they are present.
*/
public void remove(MediaSSRCMap mapToRemove)
{
// FIXME: fix duplication
for (String media : mapToRemove.ssrcs.keySet())
{
List<SourcePacketExtension> ssrcList
= getSSRCsForMedia(media);
List<SourcePacketExtension> toBeRemoved
= new ArrayList<SourcePacketExtension>();
for (SourcePacketExtension ssrcToCheck
: mapToRemove.ssrcs.get(media))
{
for (SourcePacketExtension ssrc : ssrcList)
{
if (ssrcToCheck.getSSRC() == ssrc.getSSRC())
{
toBeRemoved.add(ssrc);
}
}
}
ssrcList.removeAll(toBeRemoved);
}
}
/**
* Returns shallow copy of this map. <tt>SourcePacketExtension</tt>
* instances are not copied, but referenced from both copy and this
* instance.
*/
public MediaSSRCMap copyShallow()
{
Map<String, List<SourcePacketExtension>> mapCopy
= new HashMap<String, List<SourcePacketExtension>>();
for (String media : ssrcs.keySet())
{
List<SourcePacketExtension> listCopy
= new ArrayList<SourcePacketExtension>(
ssrcs.get(media));
mapCopy.put(media, listCopy);
}
return new MediaSSRCMap(mapCopy);
}
/**
* Returns <tt>true</tt> if this map does not contain any
* <tt>SourcePacketExtension</tt>s or <tt>false</tt> otherwise.
*/
public boolean isEmpty()
{
for (String media : ssrcs.keySet())
{
if (!getSSRCsForMedia(media).isEmpty())
{
return false;
}
}
return true;
}
/**
* Extracts <tt>SourcePacketExtension</tt> from given <tt>contents</tt> list
* and creates {@link MediaSSRCMap} that reflects this contents list.
*
* @param contents the list of {@link ContentPacketExtension} from which
* <tt>SourcePacketExtension</tt> will be extracted and put
* into {@link MediaSSRCMap}.
*
* @return the {@link MediaSSRCMap} that describes given <tt>contents</tt>
* list.
*/
public static MediaSSRCMap getSSRCsFromContent(
List<ContentPacketExtension> contents)
{
Map<String, List<SourcePacketExtension>> ssrcMap
= new HashMap<String, List<SourcePacketExtension>>();
for (ContentPacketExtension content : contents)
{
RtpDescriptionPacketExtension rtpDesc
= content.getFirstChildOfType(
RtpDescriptionPacketExtension.class);
List<SourcePacketExtension> ssrcPe;
String media;
// FIXME: different approach for SourcePacketExtension
if (rtpDesc != null)
{
media = rtpDesc.getMedia();
ssrcPe = rtpDesc.getChildExtensionsOfType(
SourcePacketExtension.class);
}
else
{
media = content.getName();
ssrcPe = content.getChildExtensionsOfType(
SourcePacketExtension.class);
}
ssrcMap.put(media, ssrcPe);
}
return new MediaSSRCMap(ssrcMap);
}
}