/*
* Copyright 2007 Sun Microsystems, Inc.
*
* This file is part of jVoiceBridge.
*
* jVoiceBridge is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation and distributed hereunder
* to you.
*
* jVoiceBridge 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Sun designates this particular file as subject to the "Classpath"
* exception as provided by Sun in the License file that accompanied this
* code.
*/
package com.sun.voip.server;
import com.sun.voip.Logger;
import com.sun.voip.MediaInfo;
import com.sun.voip.RtpPacket;
import com.sun.voip.TreatmentManager;
import java.util.ArrayList;
import java.io.IOException;
import java.text.ParseException;
public class WGManager {
private ArrayList whisperGroups = new ArrayList();
private MediaInfo mediaInfo;
private WhisperGroup conferenceWhisperGroup;
public WGManager(String conferenceId, MediaInfo mediaInfo) {
this.mediaInfo = mediaInfo;
int channels = mediaInfo.getChannels();
conferenceWhisperGroup = createWhisperGroup(
conferenceId, WhisperGroup.getDefaultAttenuation());
}
public WhisperGroup getConferenceWhisperGroup() {
return conferenceWhisperGroup;
}
public boolean hasCommonMix() {
return conferenceWhisperGroup.hasCommonMix();
}
public ArrayList getWhisperGroups() {
return whisperGroups;
}
public void setMediaInfo(MediaInfo mediaInfo) {
this.mediaInfo = mediaInfo;
synchronized (whisperGroups) {
for (int i = 0; i < whisperGroups.size(); i++) {
WhisperGroup whisperGroup = (WhisperGroup)
whisperGroups.get(i);
whisperGroup.setMediaInfo(mediaInfo);
}
}
}
public String getWhisperGroups(ConferenceMember member) {
String s = "";
boolean firstTime = true;
synchronized(whisperGroups) {
for (int i = 0; i < whisperGroups.size(); i++) {
WhisperGroup whisperGroup =
(WhisperGroup)whisperGroups.get(i);
if (whisperGroup.isMember(member)) {
if (firstTime) {
firstTime = false;
s += "\tBelongs to Whisper Group\n";
}
s += "\t " + whisperGroup.getId() + "\n";
}
}
}
return s;
}
public WhisperGroup createWhisperGroup(String whisperGroupId,
double attenuation) {
WhisperGroup whisperGroup;
synchronized(whisperGroups) {
for (int i = 0; i < whisperGroups.size(); i++) {
whisperGroup = (WhisperGroup) whisperGroups.get(i);
if (whisperGroupId.equals(whisperGroup.getId())) {
Logger.println("whisper group already exists: "
+ whisperGroupId);
return whisperGroup;
}
}
whisperGroup = new WhisperGroup(whisperGroupId,
attenuation, mediaInfo);
whisperGroups.add(whisperGroup);
if (Logger.logLevel >= Logger.LOG_INFO) {
Logger.println("New Whisper group " + toString());
}
}
return whisperGroup;
}
public boolean isInWhisperGroup(ConferenceMember member) {
synchronized(whisperGroups) {
for (int i = 0; i < whisperGroups.size(); i++) {
WhisperGroup whisperGroup =
(WhisperGroup)whisperGroups.get(i);
if (whisperGroup.isMember(member)) {
return true;
}
}
}
return false;
}
public void migrate(ConferenceMember oldMember,
ConferenceMember newMember) {
synchronized(whisperGroups) {
for (int i = 0; i < whisperGroups.size(); i++) {
WhisperGroup whisperGroup =
(WhisperGroup)whisperGroups.get(i);
if (whisperGroup.isMember(oldMember)) {
whisperGroup.removeCall(oldMember);
whisperGroup.addCall(newMember);
}
}
}
}
public void removeCall(WhisperGroup whisperGroup,
ConferenceMember member) {
whisperGroup.removeCall(member);
if (whisperGroup.isTransient()) {
String id = whisperGroup.getId();
if (whisperGroup.getMembers().size() == 0) {
Logger.println("Removing transient whisper group " + id);
try {
destroyWhisperGroup(whisperGroup.getId());
} catch (ParseException e) {
Logger.println("Failed to destroy whisper group " + id
+ " " + e.getMessage());
}
} else {
if (Logger.logLevel >= Logger.LOG_MOREINFO) {
Logger.println(whisperGroup.getMembers().size()
+ " members remaining in transient whisper group "
+ id);
}
}
}
}
public void destroyWhisperGroup(String id) throws ParseException {
synchronized(whisperGroups) {
WhisperGroup whisperGroup = findWhisperGroup(id);
if (whisperGroup == null) {
Logger.println("can't find whisperGroup " + id);
throw new ParseException("can't find whisperGroup " + id, 0);
}
synchronized(whisperGroup) {
ArrayList members = whisperGroup.getMembers();
/*
* We don't want to be called recursively when we
* remove the last member!
*/
whisperGroup.setTransient(false);
while (members.size() > 0) {
ConferenceMember member = (ConferenceMember)
members.get(0);
member.removeCall(id);
}
}
whisperGroups.remove(whisperGroup);
}
if (Logger.logLevel >= Logger.LOG_INFO) {
Logger.println("Whisper group " + id + " destroyed.");
}
}
public WhisperGroup findWhisperGroup(String id) {
for (int i = 0; i < whisperGroups.size(); i++) {
WhisperGroup whisperGroup =
(WhisperGroup)whisperGroups.get(i);
if (whisperGroup.getId().equals(id)) {
return whisperGroup;
}
}
return null;
}
public void setTransientWhisperGroup(String id, boolean isTransient)
throws ParseException {
synchronized(whisperGroups) {
WhisperGroup whisperGroup = findWhisperGroup(id);
if (whisperGroup == null) {
Logger.println("Whisper group " + id + " doesn't exist");
throw new ParseException("Whisper group "
+ id + " doesn't exist", 0);
}
whisperGroup.setTransient(isTransient);
}
}
public void setLockedWhisperGroup(String id, boolean isLocked)
throws ParseException {
synchronized(whisperGroups) {
WhisperGroup whisperGroup = findWhisperGroup(id);
if (whisperGroup == null) {
Logger.println("Whisper group " + id + " doesn't exist");
throw new ParseException("Whisper group "
+ id + " doesn't exist", 0);
}
whisperGroup.setLocked(isLocked);
}
}
public void setWhisperGroupAttenuation(String id, double attenuation)
throws ParseException {
synchronized(whisperGroups) {
WhisperGroup whisperGroup = findWhisperGroup(id);
if (whisperGroup == null) {
Logger.println("Whisper group " + id + " doesn't exist");
throw new ParseException("Whisper group "
+ id + " doesn't exist", 0);
}
whisperGroup.setAttenuation(attenuation);
}
}
public void setWhisperGroupNoCommonMix(String id, boolean noCommonMix)
throws ParseException {
synchronized(whisperGroups) {
WhisperGroup whisperGroup = findWhisperGroup(id);
if (whisperGroup == null) {
Logger.println("Whisper group " + id + " doesn't exist");
throw new ParseException("Whisper group "
+ id + " doesn't exist", 0);
}
whisperGroup.setNoCommonMix(noCommonMix);
}
}
public void addConferenceTreatment(TreatmentManager treatmentManager) {
conferenceWhisperGroup.addTreatment(treatmentManager);
}
public void pauseConferenceTreatment(String treatment, boolean isPaused) {
conferenceWhisperGroup.pauseTreatment(treatment, isPaused);
}
public void removeConferenceTreatment(String treatment) {
conferenceWhisperGroup.removeTreatment(treatment);
}
public void recordConference(boolean enabled, String recordingFile,
String recordingType) throws IOException {
conferenceWhisperGroup.recordConference(enabled, recordingFile,
recordingType);
}
public String getRecordingFile() {
return conferenceWhisperGroup.getRecordingFile();
}
public String getAbbreviatedWhisperGroupInfo(boolean showMembers) {
String s = "";
synchronized(whisperGroups) {
for (int i = 0; i < whisperGroups.size(); i++) {
WhisperGroup whisperGroup = (WhisperGroup)
whisperGroups.get(i);
s += whisperGroup.toAbbreviatedString(showMembers) + "\n";
}
}
return s;
}
public String getAbbreviatedWhisperGroupInfo(
ConferenceMember member, boolean showMembers) {
synchronized(whisperGroups) {
String s = "";
for (int i = 0; i < whisperGroups.size(); i++) {
WhisperGroup whisperGroup =
(WhisperGroup)whisperGroups.get(i);
if (whisperGroup.isMember(member)) {
s += " " + whisperGroup.toAbbreviatedString(showMembers);
}
}
return s;
}
}
public String getWhisperGroupInfo() {
String s = "";
synchronized(whisperGroups) {
for (int i = 0; i < whisperGroups.size(); i++) {
WhisperGroup whisperGroup = (WhisperGroup)
whisperGroups.get(i);
s += whisperGroup + "\n";
}
}
return s;
}
public String getWhisperGroupInfo(ConferenceMember member) {
synchronized(whisperGroups) {
String s = "";
for (int i = 0; i < whisperGroups.size(); i++) {
WhisperGroup whisperGroup =
(WhisperGroup)whisperGroups.get(i);
if (whisperGroup.isMember(member)) {
s += " " + whisperGroup;
}
}
return s;
}
}
}