/* * Jicofo, the Jitsi Conference Focus. * * Distributable under LGPL license. * See terms of license at gnu.org. */ package org.jitsi.jicofo; import net.java.sip.communicator.impl.protocol.jabber.extensions.jingle.*; import java.util.*; /** * Class maps lists of SSRC groups to media types and encapsulates various * utility operations. * * @author Pawel Domas */ public class MediaSSRCGroupMap { /** * Map backend. */ private final Map<String, List<SSRCGroup>> groupMap; /** * Creates new instance of <tt>MediaSSRCGroupMap</tt>. */ public MediaSSRCGroupMap() { groupMap = new HashMap<String, List<SSRCGroup>>(); } /** * Creates new instance of <tt>MediaSSRCGroupMap</tt>. * @param map the map with predefined values that will be used by new * instance. */ private MediaSSRCGroupMap(Map<String, List<SSRCGroup>> map) { this.groupMap = map; } /** * Returns the list of {@link SSRCGroup} for given media type. * @param media the name of media type for which list of SSRC groups will be * returned. */ public List<SSRCGroup> getSSRCGroupsForMedia(String media) { List<SSRCGroup> mediaGroups = groupMap.get(media); if (mediaGroups == null) { mediaGroups = new ArrayList<SSRCGroup>(); groupMap.put(media, mediaGroups); } return mediaGroups; } /** * Extracts SSRC groups from Jingle content list. * @param contents the list of <tt>ContentPacketExtension</tt> which will be * examined for media SSRC groups. * @return <tt>MediaSSRCGroupMap</tt> that reflects SSRC groups of media * described by given content list. */ public static MediaSSRCGroupMap getSSRCGroupsForContents( List<ContentPacketExtension> contents) { MediaSSRCGroupMap mediaSSRCGroupMap = new MediaSSRCGroupMap(); for (ContentPacketExtension content : contents) { List<SSRCGroup> mediaGroups = mediaSSRCGroupMap.getSSRCGroupsForMedia(content.getName()); // FIXME: does not check for duplicates mediaGroups.addAll(SSRCGroup.getSSRCGroupsForContent(content)); } return mediaSSRCGroupMap; } /** * Returns all media types stored in this map(some of them might be empty). */ public List<String> getMediaTypes() { return new ArrayList<String>(groupMap.keySet()); } /** * Adds mapping of SSRC group to media type. * @param media the media type name. * @param ssrcGroup <tt>SSRCGroup</tt> that will be mapped to given media * type. */ public void addSSRCGroup(String media, SSRCGroup ssrcGroup) { getSSRCGroupsForMedia(media).add(ssrcGroup); } /** * Adds mapping of SSRC groups to media type. * @param media the media type name. * @param ssrcGroups <tt>SSRCGroup</tt>s that will be mapped to given media * type. */ public void addSSRCGroups(String media, List<SSRCGroup> ssrcGroups) { getSSRCGroupsForMedia(media).addAll(ssrcGroups); } /** * Adds SSRC groups contained in given <tt>MediaSSRCGroupMap</tt> to this * map instance. * @param ssrcGroups the <tt>MediaSSRCGroupMap</tt> that will be added to * this map instance. */ public void add(MediaSSRCGroupMap ssrcGroups) { for (String media : ssrcGroups.getMediaTypes()) { addSSRCGroups(media, ssrcGroups.getSSRCGroupsForMedia(media)); } } /** * Returns <tt>true</tt> if this map contains any SSRC groups. */ public boolean isEmpty() { for (String media : groupMap.keySet()) { if (!getSSRCGroupsForMedia(media).isEmpty()) { return false; } } return true; } /** * Removes SSRC groups contained ing given <tt>MediaSSRCGroupMap</tt> from * this map if they exist. * @param mapToRemove the <tt>MediaSSRCGroupMap</tt> that contains SSRC * groups mappings to be removed from this instance. */ public void remove(MediaSSRCGroupMap mapToRemove) { for (String media : mapToRemove.groupMap.keySet()) { List<SSRCGroup> groupList = getSSRCGroupsForMedia(media); List<SSRCGroup> toBeRemoved = new ArrayList<SSRCGroup>(); for (SSRCGroup ssrcGroupToCheck : mapToRemove.groupMap.get(media)) { for (SSRCGroup ssrcGroup : groupList) { if (ssrcGroupToCheck.equals(ssrcGroup)) { toBeRemoved.add(ssrcGroup); } } } groupList.removeAll(toBeRemoved); } } /** * Returns deep copy of this map instance. */ public MediaSSRCGroupMap copy() { Map<String, List<SSRCGroup>> mapCopy = new HashMap<String, List<SSRCGroup>>(); for (String media : groupMap.keySet()) { List<SSRCGroup> listToCopy = new ArrayList<SSRCGroup>(groupMap.get(media)); List<SSRCGroup> listCopy = new ArrayList<SSRCGroup>(listToCopy.size()); for (SSRCGroup group : listToCopy) { listCopy.add(group.copy()); } mapCopy.put(media, listCopy); } return new MediaSSRCGroupMap(mapCopy); } }