/*
* 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.colibri.*;
import net.java.sip.communicator.impl.protocol.jabber.extensions.jingle.*;
import org.jitsi.protocol.xmpp.*;
import org.jitsi.protocol.xmpp.util.*;
import java.util.*;
/**
* Class represent Jitsi Meet conference participant. Stores information about
* Colibri channels allocated, Jingle session and media SSRCs.
*
* @author Pawel Domas
*/
public class Participant
{
/**
* MUC chat member of this participant.
*/
private final XmppChatMember roomMember;
/**
* Jingle session(if any) established with this peer.
*/
private JingleSession jingleSession;
/**
* Information about Colibri channels allocated for this peer(if any).
*/
private ColibriConferenceIQ colibriChannelsInfo;
/**
* Peer's media SSRCs.
*/
private MediaSSRCMap ssrcs = new MediaSSRCMap();
/**
* Peer's media SSRC groups.
*/
private MediaSSRCGroupMap ssrcGroups = new MediaSSRCGroupMap();
/**
* SSRCs received from other peers scheduled for later addition, because
* of the Jingle session not being ready at the point when SSRCs appeared in
* the conference.
*/
private MediaSSRCMap ssrcsToAdd = new MediaSSRCMap();
/**
* SSRC groups received from other peers scheduled for later addition.
* @see #ssrcsToAdd
*/
private MediaSSRCGroupMap ssrcGroupsToAdd = new MediaSSRCGroupMap();
/**
* SSRCs received from other peers scheduled for later removal, because
* of the Jingle session not being ready at the point when SSRCs appeared in
* the conference.
* FIXME: do we need that since these were never added ? - check
*/
private MediaSSRCMap ssrcsToRemove = new MediaSSRCMap();
/**
* SSRC groups received from other peers scheduled for later removal.
* @see #ssrcsToRemove
*/
private MediaSSRCGroupMap ssrcGroupsToRemove = new MediaSSRCGroupMap();
/**
* Indicates whether this peer has RTP bundle and RTCP-mux support.
*/
private boolean hasBundleSupport;
/**
* Flag used to mark SIP gateway participants.
*/
private boolean isSipGateway;
/**
* Remembers participant's muted status.
*/
private boolean mutedStatus;
/**
* Participant's identity confirmed by authentication component.
*/
private String authenticatedIdentity;
/**
* Creates new {@link Participant} for given chat room member.
*
* @param roomMember the {@link XmppChatMember} that represent this
* participant in MUC conference room.
*/
public Participant(XmppChatMember roomMember)
{
this.roomMember = roomMember;
}
/**
* Returns {@link JingleSession} established with this conference
* participant or <tt>null</tt> if there is no session yet.
*/
public JingleSession getJingleSession()
{
return jingleSession;
}
/**
* Sets {@link JingleSession} established with this peer.
* @param jingleSession the new Jingle session to be assigned to this peer.
*/
public void setJingleSession(JingleSession jingleSession)
{
this.jingleSession = jingleSession;
}
/**
* Returns {@link XmppChatMember} that represents this participant in
* conference multi-user chat room.
*/
public XmppChatMember getChatMember()
{
return roomMember;
}
/**
* Imports media SSRCs from given list of <tt>ContentPacketExtension</tt>.
* @param answer the list that contains peer's media contents.
*/
public void addSSRCsFromContent(List<ContentPacketExtension> answer)
{
ssrcs.add(MediaSSRCMap.getSSRCsFromContent(answer));
}
/**
* Removes given media SSRCs from this peer state.
* @param ssrcMap the SSRC map that contains the SSRCs to be removed.
*/
public void removeSSRCs(MediaSSRCMap ssrcMap)
{
this.ssrcs.remove(ssrcMap);
}
/**
* Returns the {@link MediaSSRCMap} which contains this peer's media SSRCs.
*/
public MediaSSRCMap getSSRCS()
{
return ssrcs;
}
/**
* Returns shallow copy of this peer's media SSRC map.
*/
public MediaSSRCMap getSSRCsCopy()
{
return ssrcs.copyShallow();
}
/**
* Returns deep copy of this peer's media SSRC group map.
*/
public MediaSSRCGroupMap getSSRCGroupsCopy()
{
return ssrcGroups.copy();
}
/**
* Returns <tt>true</tt> if this peer has any not synchronized SSRCs
* scheduled for addition.
*/
public boolean hasSsrcsToAdd()
{
return !ssrcsToAdd.isEmpty() || !ssrcGroupsToAdd.isEmpty();
}
/**
* Reset the queue that holds not synchronized SSRCs scheduled for future
* addition.
*/
public void clearSsrcsToAdd()
{
ssrcsToAdd = new MediaSSRCMap();
ssrcGroupsToAdd = new MediaSSRCGroupMap();
}
/**
* Reset the queue that holds not synchronized SSRCs scheduled for future
* removal.
*/
public void clearSsrcsToRemove()
{
ssrcsToRemove = new MediaSSRCMap();
ssrcGroupsToRemove = new MediaSSRCGroupMap();
}
/**
* Returns <tt>true</tt> if this peer has any not synchronized SSRCs
* scheduled for removal.
*/
public boolean hasSsrcsToRemove()
{
return !ssrcsToRemove.isEmpty() || !ssrcGroupsToRemove.isEmpty();
}
/**
* Returns <tt>true</tt> if this peer has any not synchronized SSRCs
* scheduled for addition.
*/
public MediaSSRCMap getSsrcsToAdd()
{
return ssrcsToAdd;
}
/**
* Returns <tt>true</tt> if this peer has any not synchronized SSRCs
* scheduled for removal.
*/
public MediaSSRCMap getSsrcsToRemove()
{
return ssrcsToRemove;
}
/**
* Schedules SSRCs received from other peer for future 'source-add' update.
*
* @param ssrcMap the media SSRC map that contains SSRCs for future updates.
*/
public void scheduleSSRCsToAdd(MediaSSRCMap ssrcMap)
{
ssrcsToAdd.add(ssrcMap);
}
/**
* Schedules SSRCs received from other peer for future 'source-remove'
* update.
*
* @param ssrcMap the media SSRC map that contains SSRCs for future updates.
*/
public void scheduleSSRCsToRemove(MediaSSRCMap ssrcMap)
{
ssrcsToRemove.add(ssrcMap);
}
/**
* Sets information about Colibri channels allocated for this participant.
*
* @param colibriChannelsInfo the IQ that holds colibri channels state.
*/
public void setColibriChannelsInfo(ColibriConferenceIQ colibriChannelsInfo)
{
this.colibriChannelsInfo = colibriChannelsInfo;
}
/**
* Returns {@link ColibriConferenceIQ} that describes Colibri channels
* allocated for this participant.
*/
public ColibriConferenceIQ getColibriChannelsInfo()
{
return colibriChannelsInfo;
}
/**
* Sets RTP bundle support on this participant.
*
* @param hasBundleSupport <tt>true</tt> if this participant has RTP bundle
* support.
*/
public void setHasBundleSupport(boolean hasBundleSupport)
{
this.hasBundleSupport = hasBundleSupport;
}
/**
* Returns <tt>true</tt> if this participant supports RTP bundle and RTCP
* mux.
*/
public boolean hasBundleSupport()
{
return hasBundleSupport;
}
/**
* Returns <tt>true</tt> if this participant belongs to SIP gateway service.
*/
public boolean isSipGateway()
{
return isSipGateway;
}
/**
* Marks this participants as SIP gateway one.
*
* @param isSipGateway <tt>true</tt> if this participants belongs to
* the SIP gateway service.
*/
public void setIsSipGateway(boolean isSipGateway)
{
this.isSipGateway = isSipGateway;
}
/**
* Sets muted status of this participant.
* @param mutedStatus new muted status to set.
*/
public void setMuted(boolean mutedStatus)
{
this.mutedStatus = mutedStatus;
}
/**
* Returns <tt>true</tt> if this participant is muted or <tt>false</tt>
* otherwise.
*/
public boolean isMuted()
{
return mutedStatus;
}
/**
* Sets the identity confirmed by authentication component of this
* participant.
*
* @param authenticatedIdentity the authenticated identity string to set.
*/
public void setAuthenticatedIdentity(String authenticatedIdentity)
{
this.authenticatedIdentity = authenticatedIdentity;
}
/**
* Returns a string with the identity of this participant which has been
* confirmed by trusted authentication component.
*/
public String getAuthenticatedIdentity()
{
return authenticatedIdentity;
}
/**
* Returns the list of SSRC groups of given media type that belong ot this
* participant.
* @param media the name of media type("audio","video", ...)
* @return the list of {@link SSRCGroup} for given media type.
*/
public List<SSRCGroup> getSSRCGroupsForMedia(String media)
{
return ssrcGroups.getSSRCGroupsForMedia(media);
}
/**
* Returns <tt>MediaSSRCGroupMap</tt> that contains the mapping of media
* SSRC groups that describe media of this participant.
*/
public MediaSSRCGroupMap getSSRCGroups()
{
return ssrcGroups;
}
/**
* Adds SSRC groups for media described in given Jiongle content list.
* @param contents the list of <tt>ContentPacketExtension</tt> that
* describes media SSRC groups.
*/
public void addSSRCGroupsFromContent(List<ContentPacketExtension> contents)
{
for (ContentPacketExtension content : contents)
{
List<SSRCGroup> groups
= SSRCGroup.getSSRCGroupsForContent(content);
ssrcGroups.addSSRCGroups(content.getName(), groups);
}
}
/**
* Schedules given media SSRC groups for later addition.
* @param ssrcGroups the <tt>MediaSSRCGroupMap</tt> to be scheduled for
* later addition.
*/
public void scheduleSSRCGroupsToAdd(MediaSSRCGroupMap ssrcGroups)
{
ssrcGroupsToAdd.add(ssrcGroups);
}
/**
* Schedules given media SSRC groups for later removal.
* @param ssrcGroups the <tt>MediaSSRCGroupMap</tt> to be scheduled for
* later removal.
*/
public void scheduleSSRCGroupsToRemove(MediaSSRCGroupMap ssrcGroups)
{
ssrcGroupsToRemove.add(ssrcGroups);
}
/**
* Returns the map of SSRC groups that are waiting for synchronization.
*/
public MediaSSRCGroupMap getSSRCGroupsToAdd()
{
return ssrcGroupsToAdd;
}
/**
* Returns the map of SSRC groups that are waiting for being removed from
* peer session.
*/
public MediaSSRCGroupMap getSsrcGroupsToRemove()
{
return ssrcGroupsToRemove;
}
/**
* Removes SSRC groups from this participant state.
* @param ssrcGroupsToRemove the map of SSRC groups that will be removed
* from this participant media state description.
*/
public void removeSSRCGroups(MediaSSRCGroupMap ssrcGroupsToRemove)
{
this.ssrcGroups.remove(ssrcGroupsToRemove);
}
}