Merge branch 'master' of https://github.com/bigbluebutton/bigbluebutton into meteor-ui

Conflicts:
	labs/meteor-client/app/client/globals.coffee
This commit is contained in:
Oleksandr Zhurbenko 2015-03-04 16:42:22 -08:00
commit a2e96394ee
46 changed files with 470 additions and 518 deletions

View File

@ -22,6 +22,7 @@ import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import org.bigbluebutton.conference.meeting.messaging.red5.ConnectionInvokerService; import org.bigbluebutton.conference.meeting.messaging.red5.ConnectionInvokerService;
import org.bigbluebutton.conference.service.recorder.RecorderApplication; import org.bigbluebutton.conference.service.recorder.RecorderApplication;
import org.bigbluebutton.core.api.IBigBlueButtonInGW; import org.bigbluebutton.core.api.IBigBlueButtonInGW;
@ -112,25 +113,20 @@ public class BigBlueButtonApplication extends MultiThreadedApplicationAdapter {
String externalUserID = ((String) params[5]).toString(); String externalUserID = ((String) params[5]).toString();
String internalUserID = ((String) params[6]).toString(); String internalUserID = ((String) params[6]).toString();
Boolean locked = false;
if (params.length >= 7 && ((Boolean) params[7])) {
locked = true;
}
Boolean muted = false; Boolean muted = false;
if (params.length >= 8 && ((Boolean) params[8])) { if (params.length >= 7 && ((Boolean) params[7])) {
muted = true; muted = true;
} }
Map<String, Boolean> lsMap = null; Map<String, Boolean> lsMap = null;
if (params.length >= 9) { if (params.length >= 8) {
try { try {
lsMap = (Map<String, Boolean> ) params[9]; lsMap = (Map<String, Boolean> ) params[8];
} catch(Exception e){ } catch(Exception e){
lsMap = new HashMap<String, Boolean>(); lsMap = new HashMap<String, Boolean>();
} }
} }
if (record == true) { if (record == true) {
recorderApplication.createRecordSession(room); recorderApplication.createRecordSession(room);
} }
@ -144,10 +140,12 @@ public class BigBlueButtonApplication extends MultiThreadedApplicationAdapter {
connection.setAttribute("USER_SESSION_ID", sessionId); connection.setAttribute("USER_SESSION_ID", sessionId);
String debugInfo = "internalUserID=" + internalUserID + ",username=" + username + ",role=" + role + "," + String debugInfo = "internalUserID=" + internalUserID + ",username=" + username + ",role=" + role + "," +
",voiceConf=" + voiceBridge + ",room=" + room + ",externalUserid=" + externalUserID; ",voiceConf=" + voiceBridge + ",room=" + room + ",externalUserid=" + externalUserID + ", muted =" + muted;
log.debug("User [{}] connected to room [{}]", debugInfo, room); log.debug("User [{}] connected to room [{}]", debugInfo, room);
bbbGW.initLockSettings(room, locked, lsMap); bbbGW.initLockSettings(room, lsMap);
bbbGW.initAudioSettings(room, internalUserID, muted);
String meetingId = bbbSession.getRoom(); String meetingId = bbbSession.getRoom();

View File

@ -20,9 +20,10 @@
package org.bigbluebutton.conference.service.chat; package org.bigbluebutton.conference.service.chat;
import java.util.Map; import java.util.Map;
import org.slf4j.Logger;
import org.red5.logging.Red5LoggerFactory;
import org.bigbluebutton.core.api.IBigBlueButtonInGW; import org.bigbluebutton.core.api.IBigBlueButtonInGW;
import org.red5.logging.Red5LoggerFactory;
import org.slf4j.Logger;
public class ChatApplication { public class ChatApplication {

View File

@ -20,6 +20,7 @@ package org.bigbluebutton.conference.service.lock;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Map; import java.util.Map;
import org.bigbluebutton.conference.BigBlueButtonSession; import org.bigbluebutton.conference.BigBlueButtonSession;
import org.bigbluebutton.conference.Constants; import org.bigbluebutton.conference.Constants;
import org.bigbluebutton.core.api.IBigBlueButtonInGW; import org.bigbluebutton.core.api.IBigBlueButtonInGW;
@ -66,15 +67,6 @@ public class LockService {
bbbInGW.sendLockSettings(meetingId, userId, newSettings); bbbInGW.sendLockSettings(meetingId, userId, newSettings);
} }
/**
* Method called from client on connect to know if the room is locked or not
* */
public void isRoomLocked(){
String meetingId = getBbbSession().getRoom();
String userId = getMyUserId();
bbbInGW.isMeetingLocked(meetingId, userId);
}
/** /**
* This method locks (or unlocks), based on lock parameter * This method locks (or unlocks), based on lock parameter
* all users but the users listed in array dontLockTheseUsers * all users but the users listed in array dontLockTheseUsers
@ -87,10 +79,15 @@ public class LockService {
/** /**
* This method locks or unlocks a specific user * This method locks or unlocks a specific user
* */ * */
public void setUserLock(Boolean lock, String internalUserID){ public void setUserLock(Map<String, Object> msg) {
log.debug("setUserLock ({}, {}, {})", new Object[] { lock, internalUserID }); String meetingID = Red5.getConnectionLocal().getScope().getName();
String meetingId = getBbbSession().getRoom(); String requesterID = getBbbSession().getInternalUserID();
bbbInGW.lockUser(meetingId, lock, internalUserID);
Boolean lock = (Boolean) msg.get("lock");
String userId = (String) msg.get("userId");
log.info("setUserLock ({}, {})", new Object[] { lock, userId });
bbbInGW.lockUser(meetingID, requesterID, lock, userId);
} }
public String getMyUserId() { public String getMyUserId() {

View File

@ -18,16 +18,15 @@
*/ */
package org.bigbluebutton.conference.service.recorder; package org.bigbluebutton.conference.service.recorder;
import org.slf4j.Logger;
import org.bigbluebutton.service.recording.RedisListRecorder;
import org.red5.logging.Red5LoggerFactory;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.BlockingQueue; import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
import org.bigbluebutton.service.recording.RedisListRecorder;
import org.red5.logging.Red5LoggerFactory;
import org.slf4j.Logger;
/** /**
* *
* The RecorderApplication class is used for setting the record module * The RecorderApplication class is used for setting the record module

View File

@ -2,14 +2,11 @@ package org.bigbluebutton.conference.service.voice;
import org.bigbluebutton.conference.service.messaging.MessagingConstants; import org.bigbluebutton.conference.service.messaging.MessagingConstants;
import org.bigbluebutton.conference.service.messaging.redis.MessageHandler; import org.bigbluebutton.conference.service.messaging.redis.MessageHandler;
import com.google.gson.JsonParser;
import com.google.gson.JsonObject;
import java.util.Map;
import java.util.HashMap;
import org.bigbluebutton.core.api.IBigBlueButtonInGW; import org.bigbluebutton.core.api.IBigBlueButtonInGW;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
public class VoiceMessageListener implements MessageHandler{ public class VoiceMessageListener implements MessageHandler{
private IBigBlueButtonInGW bbbGW; private IBigBlueButtonInGW bbbGW;

View File

@ -17,14 +17,14 @@
* *
*/ */
package org.bigbluebutton.conference.service.voice; package org.bigbluebutton.conference.service.voice;
import org.slf4j.Logger; import java.util.Map;
import org.red5.server.api.Red5;
import org.bigbluebutton.conference.BigBlueButtonSession; import org.bigbluebutton.conference.BigBlueButtonSession;
import org.bigbluebutton.conference.Constants; import org.bigbluebutton.conference.Constants;
import org.bigbluebutton.core.api.IBigBlueButtonInGW; import org.bigbluebutton.core.api.IBigBlueButtonInGW;
import org.red5.logging.Red5LoggerFactory; import org.red5.logging.Red5LoggerFactory;
import java.util.List; import org.red5.server.api.Red5;
import java.util.Map; import org.slf4j.Logger;
public class VoiceService { public class VoiceService {
@ -91,7 +91,7 @@ public class VoiceService {
String meetingID = Red5.getConnectionLocal().getScope().getName(); String meetingID = Red5.getConnectionLocal().getScope().getName();
String requesterID = getBbbSession().getInternalUserID(); String requesterID = getBbbSession().getInternalUserID();
bbbInGW.lockUser(meetingID, requesterID, userid, lock); bbbInGW.lockMuteUser(meetingID, requesterID, userid, lock);
} }
public void ejectUserFromVoice(Map<String, Object> msg) { public void ejectUserFromVoice(Map<String, Object> msg) {

View File

@ -18,8 +18,8 @@
*/ */
package org.bigbluebutton.conference.service.whiteboard; package org.bigbluebutton.conference.service.whiteboard;
import java.util.ArrayList;
import java.util.Map; import java.util.Map;
import org.bigbluebutton.conference.BigBlueButtonSession; import org.bigbluebutton.conference.BigBlueButtonSession;
import org.bigbluebutton.conference.Constants; import org.bigbluebutton.conference.Constants;
import org.red5.logging.Red5LoggerFactory; import org.red5.logging.Red5LoggerFactory;
@ -68,7 +68,7 @@ public class WhiteboardService {
} }
} }
private String pointsToString(ArrayList<Double> points){ /*private String pointsToString(ArrayList<Double> points){
String datapoints = ""; String datapoints = "";
for (Double i : points) { for (Double i : points) {
datapoints += i + ","; datapoints += i + ",";
@ -79,7 +79,7 @@ public class WhiteboardService {
// application.sendShape(shape, type, color, thickness, fill, fillColor, transparency, id, status); // application.sendShape(shape, type, color, thickness, fill, fillColor, transparency, id, status);
} }*/
public void requestAnnotationHistory(Map<String, Object> message) { public void requestAnnotationHistory(Map<String, Object> message) {
log.info("WhiteboardApplication - requestAnnotationHistory"); log.info("WhiteboardApplication - requestAnnotationHistory");

View File

@ -1,6 +1,5 @@
package org.bigbluebutton.core.api; package org.bigbluebutton.core.api;
import java.util.ArrayList;
import java.util.Map; import java.util.Map;
@ -19,12 +18,10 @@ public interface IBigBlueButtonInGW {
// Lock // Lock
void initLockSettings(String meetingID, boolean locked, Map<String, Boolean> settings); void initLockSettings(String meetingID, Map<String, Boolean> settings);
void sendLockSettings(String meetingID, String userId, Map<String, Boolean> settings); void sendLockSettings(String meetingID, String userId, Map<String, Boolean> settings);
void getLockSettings(String meetingId, String userId); void getLockSettings(String meetingId, String userId);
void isMeetingLocked(String meetingId, String userId); void lockUser(String meetingId, String requesterID, boolean lock, String internalUserID);
void lockAllUsers(String meetingId, boolean lock, ArrayList<String> dontLockTheseUsers);
void lockUser(String meetingId, boolean lock, String internalUserID);
// Users // Users
@ -46,11 +43,12 @@ public interface IBigBlueButtonInGW {
void userDisconnectedFromGlobalAudio(String voiceConf, String userid, String name); void userDisconnectedFromGlobalAudio(String voiceConf, String userid, String name);
// Voice // Voice
void initAudioSettings(String meetingID, String requesterID, Boolean muted);
void muteAllExceptPresenter(String meetingID, String requesterID, Boolean mute); void muteAllExceptPresenter(String meetingID, String requesterID, Boolean mute);
void muteAllUsers(String meetingID, String requesterID, Boolean mute); void muteAllUsers(String meetingID, String requesterID, Boolean mute);
void isMeetingMuted(String meetingID, String requesterID); void isMeetingMuted(String meetingID, String requesterID);
void muteUser(String meetingID, String requesterID, String userID, Boolean mute); void muteUser(String meetingID, String requesterID, String userID, Boolean mute);
void lockUser(String meetingID, String requesterID, String userID, Boolean lock); void lockMuteUser(String meetingID, String requesterID, String userID, Boolean lock);
void ejectUserFromVoice(String meetingID, String userId, String ejectedBy); void ejectUserFromVoice(String meetingID, String userId, String ejectedBy);
void ejectUserFromMeeting(String meetingId, String userId, String ejectedBy); void ejectUserFromMeeting(String meetingId, String userId, String ejectedBy);
void voiceUserJoined(String meetingId, String userId, String webUserId, String conference, void voiceUserJoined(String meetingId, String userId, String webUserId, String conference,

View File

@ -5,12 +5,13 @@ import java.util.Map;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import org.bigbluebutton.webconference.voice.events.ConferenceEventListener; import org.bigbluebutton.webconference.voice.events.ConferenceEventListener;
import org.bigbluebutton.webconference.voice.events.VoiceStartRecordingEvent;
import org.bigbluebutton.webconference.voice.events.VoiceUserJoinedEvent; import org.bigbluebutton.webconference.voice.events.VoiceUserJoinedEvent;
import org.bigbluebutton.webconference.voice.events.VoiceUserLeftEvent; import org.bigbluebutton.webconference.voice.events.VoiceUserLeftEvent;
import org.bigbluebutton.webconference.voice.events.VoiceUserMutedEvent; import org.bigbluebutton.webconference.voice.events.VoiceUserMutedEvent;
import org.bigbluebutton.webconference.voice.events.VoiceUserTalkingEvent; import org.bigbluebutton.webconference.voice.events.VoiceUserTalkingEvent;
import org.bigbluebutton.webconference.voice.events.VoiceStartRecordingEvent;
import org.freeswitch.esl.client.IEslEventListener; import org.freeswitch.esl.client.IEslEventListener;
import org.freeswitch.esl.client.transport.event.EslEvent; import org.freeswitch.esl.client.transport.event.EslEvent;
import org.jboss.netty.channel.ExceptionEvent; import org.jboss.netty.channel.ExceptionEvent;
@ -197,9 +198,9 @@ public class ESLEventListener implements IEslEventListener {
return e.getEventHeaders().get("Path"); return e.getEventHeaders().get("Path");
} }
private String getRecordTimestampFromEvent(EslEvent e) { /*private String getRecordTimestampFromEvent(EslEvent e) {
return e.getEventHeaders().get("Event-Date-Timestamp"); return e.getEventHeaders().get("Event-Date-Timestamp");
} }*/
public void setConferenceEventListener(ConferenceEventListener listener) { public void setConferenceEventListener(ConferenceEventListener listener) {
this.conferenceEventListener = listener; this.conferenceEventListener = listener;

View File

@ -18,21 +18,10 @@
*/ */
package org.bigbluebutton.webconference.voice.freeswitch.actions; package org.bigbluebutton.webconference.voice.freeswitch.actions;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.bigbluebutton.webconference.voice.events.ConferenceEventListener; import org.bigbluebutton.webconference.voice.events.ConferenceEventListener;
import org.bigbluebutton.webconference.voice.events.VoiceUserJoinedEvent;
import org.bigbluebutton.webconference.voice.freeswitch.response.ConferenceMember;
import org.bigbluebutton.webconference.voice.freeswitch.response.XMLResponseConferenceListParser;
import org.freeswitch.esl.client.transport.message.EslMessage; import org.freeswitch.esl.client.transport.message.EslMessage;
import org.red5.logging.Red5LoggerFactory; import org.red5.logging.Red5LoggerFactory;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.xml.sax.SAXException;
public class BroadcastConferenceCommand extends FreeswitchCommand { public class BroadcastConferenceCommand extends FreeswitchCommand {

View File

@ -18,21 +18,10 @@
*/ */
package org.bigbluebutton.webconference.voice.freeswitch.actions; package org.bigbluebutton.webconference.voice.freeswitch.actions;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.bigbluebutton.webconference.voice.events.ConferenceEventListener; import org.bigbluebutton.webconference.voice.events.ConferenceEventListener;
import org.bigbluebutton.webconference.voice.events.VoiceUserJoinedEvent;
import org.bigbluebutton.webconference.voice.freeswitch.response.ConferenceMember;
import org.bigbluebutton.webconference.voice.freeswitch.response.XMLResponseConferenceListParser;
import org.freeswitch.esl.client.transport.message.EslMessage; import org.freeswitch.esl.client.transport.message.EslMessage;
import org.red5.logging.Red5LoggerFactory; import org.red5.logging.Red5LoggerFactory;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.xml.sax.SAXException;
public class RecordConferenceCommand extends FreeswitchCommand { public class RecordConferenceCommand extends FreeswitchCommand {

View File

@ -18,20 +18,14 @@
*/ */
package org.bigbluebutton.webconference.voice.freeswitch.response; package org.bigbluebutton.webconference.voice.freeswitch.response;
import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.red5.logging.Red5LoggerFactory; import org.red5.logging.Red5LoggerFactory;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.xml.sax.Attributes; import org.xml.sax.Attributes;
import org.xml.sax.SAXException; import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler; import org.xml.sax.helpers.DefaultHandler;
/** /**

View File

@ -15,7 +15,7 @@ import org.bigbluebutton.core.apps.presentation.Page
import org.bigbluebutton.core.apps.presentation.Presentation import org.bigbluebutton.core.apps.presentation.Presentation
class BigBlueButtonInGW(bbbGW: BigBlueButtonGateway, presUtil: PreuploadedPresentationsUtil) extends IBigBlueButtonInGW { class BigBlueButtonInGW(bbbGW: BigBlueButtonGateway, presUtil: PreuploadedPresentationsUtil) extends IBigBlueButtonInGW {
// Meeting // Meeting
def createMeeting2(meetingID: String, externalMeetingID:String, meetingName: String, record: Boolean, def createMeeting2(meetingID: String, externalMeetingID:String, meetingName: String, record: Boolean,
voiceBridge: String, duration: Long, autoStartRecording: Boolean, voiceBridge: String, duration: Long, autoStartRecording: Boolean,
@ -82,18 +82,21 @@ class BigBlueButtonInGW(bbbGW: BigBlueButtonGateway, presUtil: PreuploadedPresen
val disablePrivChat = s.getOrElse("disablePrivateChat", false) val disablePrivChat = s.getOrElse("disablePrivateChat", false)
val disablePubChat = s.getOrElse("disablePublicChat", false) val disablePubChat = s.getOrElse("disablePublicChat", false)
val lockedLayout = s.getOrElse("lockedLayout", false) val lockedLayout = s.getOrElse("lockedLayout", false)
var lockOnJoin = s.getOrElse("lockOnJoin", false)
val permissions = new Permissions(disableCam = disableCam, val permissions = new Permissions(disableCam = disableCam,
disableMic = disableMic, disableMic = disableMic,
disablePrivChat = disablePrivChat, disablePrivChat = disablePrivChat,
disablePubChat = disablePubChat, disablePubChat = disablePubChat,
lockedLayout = lockedLayout) lockedLayout = lockedLayout,
lockOnJoin = lockOnJoin)
bbbGW.accept(new SetLockSettings(meetingID, userId, permissions)) bbbGW.accept(new SetLockSettings(meetingID, userId, permissions))
} }
def initLockSettings(meetingID: String, locked: Boolean, settings: java.util.Map[String, java.lang.Boolean]) { def initLockSettings(meetingID: String, settings: java.util.Map[String, java.lang.Boolean]) {
// Convert java.util.Map to scala.collection.immutable.Map // Convert java.util.Map to scala.collection.immutable.Map
// settings.mapValues -> convaert java Map to scala mutable Map // settings.mapValues -> convert java Map to scala mutable Map
// v => v.booleanValue() -> convert java Boolean to Scala Boolean // v => v.booleanValue() -> convert java Boolean to Scala Boolean
// toMap -> converts from scala mutable map to scala immutable map // toMap -> converts from scala mutable map to scala immutable map
val s = settings.mapValues (v => v.booleanValue() /* convert java Boolean to Scala Boolean */).toMap val s = settings.mapValues (v => v.booleanValue() /* convert java Boolean to Scala Boolean */).toMap
@ -102,29 +105,29 @@ class BigBlueButtonInGW(bbbGW: BigBlueButtonGateway, presUtil: PreuploadedPresen
val disablePrivChat = s.getOrElse("disablePrivateChat", false) val disablePrivChat = s.getOrElse("disablePrivateChat", false)
val disablePubChat = s.getOrElse("disablePublicChat", false) val disablePubChat = s.getOrElse("disablePublicChat", false)
val lockedLayout = s.getOrElse("lockedLayout", false) val lockedLayout = s.getOrElse("lockedLayout", false)
val lockOnJoin = s.getOrElse("lockOnJoin", false)
val permissions = new Permissions(disableCam = disableCam, val permissions = new Permissions(disableCam = disableCam,
disableMic = disableMic, disableMic = disableMic,
disablePrivChat = disablePrivChat, disablePrivChat = disablePrivChat,
disablePubChat = disablePubChat, disablePubChat = disablePubChat,
lockedLayout = lockedLayout) lockedLayout = lockedLayout,
lockOnJoin = lockOnJoin)
bbbGW.accept(new InitLockSettings(meetingID, locked, permissions)) bbbGW.accept(new InitLockSettings(meetingID, permissions))
}
def initAudioSettings(meetingID: String, requesterID: String, muted: java.lang.Boolean) {
bbbGW.accept(new InitAudioSettings(meetingID, requesterID, muted.booleanValue()))
} }
def getLockSettings(meetingId: String, userId: String) { def getLockSettings(meetingId: String, userId: String) {
bbbGW.accept(new GetLockSettings(meetingId, userId)) bbbGW.accept(new GetLockSettings(meetingId, userId))
} }
def isMeetingLocked(meetingId: String, userId: String) { def lockUser(meetingId: String, requesterID: String, lock: Boolean, userId: String) {
bbbGW.accept(new IsMeetingLocked(meetingId, userId)) bbbGW.accept(new LockUserRequest(meetingId, requesterID, userId, lock))
}
def lockAllUsers(meetingId: String, lock: Boolean, dontLockTheseUsers: ArrayList[String]) {
bbbGW.accept(new LockAllUsers(meetingId, lock, dontLockTheseUsers.toSeq))
}
def lockUser(meetingId: String, lock: Boolean, userId: String) {
bbbGW.accept(new LockUser(meetingId, userId, lock))
} }
def setRecordingStatus(meetingId: String, userId: String, recording: java.lang.Boolean) { def setRecordingStatus(meetingId: String, userId: String, recording: java.lang.Boolean) {
@ -413,7 +416,7 @@ class BigBlueButtonInGW(bbbGW: BigBlueButtonGateway, presUtil: PreuploadedPresen
voiceGW.muteUser(meetingID, requesterID, userID, mute) voiceGW.muteUser(meetingID, requesterID, userID, mute)
} }
def lockUser(meetingID: String, requesterID: String, userID: String, lock: java.lang.Boolean) { def lockMuteUser(meetingID: String, requesterID: String, userID: String, lock: java.lang.Boolean) {
voiceGW.lockUser(meetingID, requesterID, userID, lock) voiceGW.lockUser(meetingID, requesterID, userID, lock)
} }

View File

@ -30,11 +30,10 @@ class CollectorActor(dispatcher: IDispatcher) extends Actor {
case msg: EndMeeting => handleEndMeeting(msg) case msg: EndMeeting => handleEndMeeting(msg)
case msg: LockSetting => handleLockSetting(msg) case msg: LockSetting => handleLockSetting(msg)
case msg: LockUser => handleLockUser(msg) case msg: LockUser => handleLockUser(msg)
case msg: LockAllUsers => handleLockAllUsers(msg)
case msg: InitLockSettings => handleInitLockSettings(msg) case msg: InitLockSettings => handleInitLockSettings(msg)
case msg: InitAudioSettings => handleInitAudioSettings(msg)
case msg: SetLockSettings => handleSetLockSettings(msg) case msg: SetLockSettings => handleSetLockSettings(msg)
case msg: GetLockSettings => handleGetLockSettings(msg) case msg: GetLockSettings => handleGetLockSettings(msg)
case msg: IsMeetingLocked => handleIsMeetingLocked(msg)
case msg: ValidateAuthToken => handleValidateAuthToken(msg) case msg: ValidateAuthToken => handleValidateAuthToken(msg)
case msg: RegisterUser => handleRegisterUser(msg) case msg: RegisterUser => handleRegisterUser(msg)
case msg: UserJoining => handleUserJoining(msg) case msg: UserJoining => handleUserJoining(msg)
@ -114,9 +113,7 @@ class CollectorActor(dispatcher: IDispatcher) extends Actor {
case msg: PermissionsSettingInitialized => handlePermissionsSettingInitialized(msg) case msg: PermissionsSettingInitialized => handlePermissionsSettingInitialized(msg)
case msg: NewPermissionsSetting => handleNewPermissionsSetting(msg) case msg: NewPermissionsSetting => handleNewPermissionsSetting(msg)
case msg: UserLocked => handleUserLocked(msg) case msg: UserLocked => handleUserLocked(msg)
case msg: UsersLocked => handleUsersLocked(msg)
case msg: GetPermissionsSettingReply => handleGetPermissionsSettingReply(msg) case msg: GetPermissionsSettingReply => handleGetPermissionsSettingReply(msg)
case msg: IsMeetingLockedReply => handleIsMeetingLockedReply(msg)
case msg: UserRegistered => handleUserRegistered(msg) case msg: UserRegistered => handleUserRegistered(msg)
case msg: UserLeft => handleUserLeft(msg) case msg: UserLeft => handleUserLeft(msg)
case msg: PresenterAssigned => handlePresenterAssigned(msg) case msg: PresenterAssigned => handlePresenterAssigned(msg)
@ -333,32 +330,30 @@ class CollectorActor(dispatcher: IDispatcher) extends Actor {
dispatcher.dispatch(buildJson(header, payload)) dispatcher.dispatch(buildJson(header, payload))
} }
private def handleLockAllUsers(msg: LockAllUsers) {
val payload = new java.util.HashMap[String, Any]()
payload.put(Constants.MEETING_ID, msg.meetingID)
payload.put(Constants.EXCEPT_USERS, msg.exceptUsers.toString())
payload.put(Constants.LOCK, msg.lock)
val header = new java.util.HashMap[String, Any]()
header.put(Constants.NAME, MessageNames.END_MEETING)
header.put(Constants.TIMESTAMP, TimestampGenerator.generateTimestamp)
header.put(Constants.CURRENT_TIME, TimestampGenerator.getCurrentTime)
// println("***** DISPATCHING LOCK ALL USERS *****************")
dispatcher.dispatch(buildJson(header, payload))
}
private def handleInitLockSettings(msg: InitLockSettings) { private def handleInitLockSettings(msg: InitLockSettings) {
val payload = new java.util.HashMap[String, Any]() val payload = new java.util.HashMap[String, Any]()
payload.put(Constants.MEETING_ID, msg.meetingID) payload.put(Constants.MEETING_ID, msg.meetingID)
payload.put(Constants.SETTINGS, msg.settings.toString()) payload.put(Constants.SETTINGS, msg.settings.toString())
payload.put(Constants.LOCKED, msg.locked)
val header = new java.util.HashMap[String, Any]() val header = new java.util.HashMap[String, Any]()
header.put(Constants.NAME, MessageNames.INIT_LOCK_SETTINGS) header.put(Constants.NAME, MessageNames.INIT_LOCK_SETTINGS)
header.put(Constants.TIMESTAMP, TimestampGenerator.generateTimestamp) header.put(Constants.TIMESTAMP, TimestampGenerator.generateTimestamp)
header.put(Constants.CURRENT_TIME, TimestampGenerator.getCurrentTime) header.put(Constants.CURRENT_TIME, TimestampGenerator.getCurrentTime)
// println("***** DISPATCHING INIT LOCK SETTINGS *****************")
dispatcher.dispatch(buildJson(header, payload))
}
private def handleInitAudioSettings(msg: InitAudioSettings) {
val payload = new java.util.HashMap[String, Any]()
payload.put(Constants.MEETING_ID, msg.meetingID)
payload.put(Constants.MUTED, msg.muted.toString())
val header = new java.util.HashMap[String, Any]()
header.put(Constants.NAME, MessageNames.INIT_AUDIO_SETTINGS)
header.put(Constants.TIMESTAMP, TimestampGenerator.generateTimestamp)
header.put(Constants.CURRENT_TIME, TimestampGenerator.getCurrentTime)
// println("***** DISPATCHING INIT LOCK SETTINGS *****************") // println("***** DISPATCHING INIT LOCK SETTINGS *****************")
dispatcher.dispatch(buildJson(header, payload)) dispatcher.dispatch(buildJson(header, payload))
} }
@ -391,20 +386,6 @@ class CollectorActor(dispatcher: IDispatcher) extends Actor {
dispatcher.dispatch(buildJson(header, payload)) dispatcher.dispatch(buildJson(header, payload))
} }
private def handleIsMeetingLocked(msg: IsMeetingLocked) {
val payload = new java.util.HashMap[String, Any]()
payload.put(Constants.MEETING_ID, msg.meetingID)
payload.put(Constants.USER_ID, msg.userId)
val header = new java.util.HashMap[String, Any]()
header.put(Constants.NAME, MessageNames.IS_MEETING_LOCKED)
header.put(Constants.TIMESTAMP, TimestampGenerator.generateTimestamp)
header.put(Constants.CURRENT_TIME, TimestampGenerator.getCurrentTime)
// println("***** DISPATCHING IS MEETING LOCKED *****************")
dispatcher.dispatch(buildJson(header, payload))
}
private def handleValidateAuthToken(msg: ValidateAuthToken) { private def handleValidateAuthToken(msg: ValidateAuthToken) {
val payload = new java.util.HashMap[String, Any]() val payload = new java.util.HashMap[String, Any]()
payload.put(Constants.MEETING_ID, msg.meetingID) payload.put(Constants.MEETING_ID, msg.meetingID)
@ -1455,7 +1436,6 @@ class CollectorActor(dispatcher: IDispatcher) extends Actor {
private def handlePermissionsSettingInitialized(msg: PermissionsSettingInitialized) { private def handlePermissionsSettingInitialized(msg: PermissionsSettingInitialized) {
val payload = new java.util.HashMap[String, Any]() val payload = new java.util.HashMap[String, Any]()
payload.put(Constants.MEETING_ID, msg.meetingID) payload.put(Constants.MEETING_ID, msg.meetingID)
payload.put(Constants.LOCKED, msg.locked)
payload.put(Constants.SETTINGS, msg.permissions.toString()) //#todo not tested payload.put(Constants.SETTINGS, msg.permissions.toString()) //#todo not tested
val header = new java.util.HashMap[String, Any]() val header = new java.util.HashMap[String, Any]()
@ -1496,21 +1476,6 @@ class CollectorActor(dispatcher: IDispatcher) extends Actor {
dispatcher.dispatch(buildJson(header, payload)) dispatcher.dispatch(buildJson(header, payload))
} }
private def handleUsersLocked(msg: UsersLocked) {
val payload = new java.util.HashMap[String, Any]()
payload.put(Constants.MEETING_ID, msg.meetingID)
payload.put(Constants.EXCEPT_USERS, msg.exceptUsers.toString())
payload.put(Constants.LOCKED, msg.lock)
val header = new java.util.HashMap[String, Any]()
header.put(Constants.NAME, MessageNames.USERS_LOCKED)
header.put(Constants.TIMESTAMP, TimestampGenerator.generateTimestamp)
header.put(Constants.CURRENT_TIME, TimestampGenerator.getCurrentTime)
// println("***** DISPATCHING USERS LOCKED *****************")
dispatcher.dispatch(buildJson(header, payload))
}
private def handleGetPermissionsSettingReply(msg: GetPermissionsSettingReply) { private def handleGetPermissionsSettingReply(msg: GetPermissionsSettingReply) {
val payload = new java.util.HashMap[String, Any]() val payload = new java.util.HashMap[String, Any]()
payload.put(Constants.MEETING_ID, msg.meetingID) payload.put(Constants.MEETING_ID, msg.meetingID)
@ -1524,20 +1489,6 @@ class CollectorActor(dispatcher: IDispatcher) extends Actor {
dispatcher.dispatch(buildJson(header, payload)) dispatcher.dispatch(buildJson(header, payload))
} }
private def handleIsMeetingLockedReply(msg: IsMeetingLockedReply) {
val payload = new java.util.HashMap[String, Any]()
payload.put(Constants.MEETING_ID, msg.meetingID)
payload.put(Constants.USER_ID, msg.userId)
val header = new java.util.HashMap[String, Any]()
header.put(Constants.NAME, MessageNames.IS_MEETING_LOCKED_REPLY)
header.put(Constants.TIMESTAMP, TimestampGenerator.generateTimestamp)
header.put(Constants.CURRENT_TIME, TimestampGenerator.getCurrentTime)
// println("***** DISPATCHING IS MEETING LOCKED REPLY *****************")
dispatcher.dispatch(buildJson(header, payload))
}
private def handleUserRegistered(msg: UserRegistered) { private def handleUserRegistered(msg: UserRegistered) {
val payload = new java.util.HashMap[String, Any]() val payload = new java.util.HashMap[String, Any]()
payload.put(Constants.MEETING_ID, msg.meetingID) payload.put(Constants.MEETING_ID, msg.meetingID)

View File

@ -25,6 +25,7 @@ class MeetingActor(val meetingID: String, val externalMeetingID: String, val mee
with PollApp with LayoutApp with ChatApp with PollApp with LayoutApp with ChatApp
with WhiteboardApp with LogHelper { with WhiteboardApp with LogHelper {
var audioSettingsInited = false
var permissionsInited = false var permissionsInited = false
var permissions = new Permissions() var permissions = new Permissions()
var recording = false; var recording = false;
@ -87,7 +88,9 @@ class MeetingActor(val meetingID: String, val externalMeetingID: String, val mee
case msg: MuteUserRequest => handleMuteUserRequest(msg) case msg: MuteUserRequest => handleMuteUserRequest(msg)
case msg: EjectUserFromVoiceRequest => handleEjectUserRequest(msg) case msg: EjectUserFromVoiceRequest => handleEjectUserRequest(msg)
case msg: SetLockSettings => handleSetLockSettings(msg) case msg: SetLockSettings => handleSetLockSettings(msg)
case msg: LockUserRequest => handleLockUserRequest(msg)
case msg: InitLockSettings => handleInitLockSettings(msg) case msg: InitLockSettings => handleInitLockSettings(msg)
case msg: InitAudioSettings => handleInitAudioSettings(msg)
case msg: GetChatHistoryRequest => handleGetChatHistoryRequest(msg) case msg: GetChatHistoryRequest => handleGetChatHistoryRequest(msg)
case msg: SendPublicMessageRequest => handleSendPublicMessageRequest(msg) case msg: SendPublicMessageRequest => handleSendPublicMessageRequest(msg)
case msg: SendPrivateMessageRequest => handleSendPrivateMessageRequest(msg) case msg: SendPrivateMessageRequest => handleSendPrivateMessageRequest(msg)

View File

@ -51,15 +51,9 @@ case class LockUser(
meetingID: String, meetingID: String,
userId: String, userId: String,
lock: Boolean) extends InMessage lock: Boolean) extends InMessage
case class LockAllUsers(
meetingID: String,
lock: Boolean,
exceptUsers: Seq[String]) extends InMessage
case class InitLockSettings( case class InitLockSettings(
meetingID: String, meetingID: String,
locked: Boolean,
settings: Permissions) extends InMessage settings: Permissions) extends InMessage
case class SetLockSettings( case class SetLockSettings(
@ -73,12 +67,6 @@ case class GetLockSettings(
userId: String userId: String
) extends InMessage ) extends InMessage
case class IsMeetingLocked(
meetingID: String,
userId: String
) extends InMessage
// Users // Users
case class ValidateAuthToken( case class ValidateAuthToken(
meetingID: String, meetingID: String,
@ -393,6 +381,11 @@ case class PresentationConversionCompleted(
) extends InMessage ) extends InMessage
// Voice // Voice
case class InitAudioSettings(
meetingID: String,
requesterID: String,
muted: Boolean) extends InMessage
case class SendVoiceUsersRequest( case class SendVoiceUsersRequest(
meetingID: String, meetingID: String,
requesterID: String) extends InMessage requesterID: String) extends InMessage

View File

@ -9,6 +9,7 @@ object MessageNames {
val LOCK_SETTING = "lock_setting_request" val LOCK_SETTING = "lock_setting_request"
val LOCK_USER = "lock_user_request" val LOCK_USER = "lock_user_request"
val INIT_LOCK_SETTINGS = "init_lock_settings" val INIT_LOCK_SETTINGS = "init_lock_settings"
val INIT_AUDIO_SETTINGS = "init_audio_settings"
val SET_LOCK_SETTINGS = "set_lock_settings" val SET_LOCK_SETTINGS = "set_lock_settings"
val GET_LOCK_SETTINGS = "get_lock_settings" val GET_LOCK_SETTINGS = "get_lock_settings"
val IS_MEETING_LOCKED = "is_meeting_locked" val IS_MEETING_LOCKED = "is_meeting_locked"

View File

@ -107,7 +107,6 @@ case object IsAliveMessage extends IOutMessage
// Permissions // Permissions
case class PermissionsSettingInitialized( case class PermissionsSettingInitialized(
meetingID: String, meetingID: String,
locked: Boolean,
permissions: Permissions, permissions: Permissions,
applyTo: Array[UserVO], applyTo: Array[UserVO],
version:String = Versions.V_0_0_1 version:String = Versions.V_0_0_1
@ -128,24 +127,12 @@ case class UserLocked(
version:String = Versions.V_0_0_1 version:String = Versions.V_0_0_1
) extends IOutMessage ) extends IOutMessage
case class UsersLocked(
meetingID: String,
lock: Boolean,
exceptUsers: Seq[String],
version:String = Versions.V_0_0_1
) extends IOutMessage
case class GetPermissionsSettingReply( case class GetPermissionsSettingReply(
meetingID: String, meetingID: String,
userId: String, userId: String,
version:String = Versions.V_0_0_1 version:String = Versions.V_0_0_1
) extends IOutMessage ) extends IOutMessage
case class IsMeetingLockedReply(
meetingID: String,
userId: String,
version:String = Versions.V_0_0_1
) extends IOutMessage
// Users // Users
case class UserRegistered( case class UserRegistered(

View File

@ -1,5 +1,7 @@
package org.bigbluebutton.core.api package org.bigbluebutton.core.api
import java.lang.Boolean
object Role extends Enumeration { object Role extends Enumeration {
type Role = Value type Role = Value
val MODERATOR = Value("MODERATOR") val MODERATOR = Value("MODERATOR")
@ -36,7 +38,8 @@ case class Permissions(
disableMic: Boolean = false, disableMic: Boolean = false,
disablePrivChat: Boolean = false, disablePrivChat: Boolean = false,
disablePubChat: Boolean = false, disablePubChat: Boolean = false,
lockedLayout:Boolean = false lockedLayout:Boolean = false,
lockOnJoin:Boolean = false
) )
case class RegisteredUser ( case class RegisteredUser (
@ -70,8 +73,7 @@ case class UserVO(
webcamStream: String, webcamStream: String,
phoneUser: Boolean, phoneUser: Boolean,
voiceUser: VoiceUser, voiceUser: VoiceUser,
listenOnly: Boolean, listenOnly: Boolean)
permissions: Permissions = new Permissions())
case class VoiceUser(userId: String, case class VoiceUser(userId: String,
webUserId: String, webUserId: String,

View File

@ -153,43 +153,50 @@ trait UsersApp {
case None => // do nothing case None => // do nothing
} }
} }
def handleLockUser(msg: LockUser) {
}
def handleLockAllUsers(msg: LockAllUsers) {
}
def handleGetLockSettings(msg: GetLockSettings) { def handleGetLockSettings(msg: GetLockSettings) {
logger.info("Not implemented: handleGetLockSettings")
} }
def handleIsMeetingLocked(msg: IsMeetingLocked) {
}
def handleSetLockSettings(msg: SetLockSettings) { def handleSetLockSettings(msg: SetLockSettings) {
// println("*************** Received new lock settings ********************") // println("*************** Received new lock settings ********************")
if (!permissionsEqual(msg.settings)) { if (!permissionsEqual(msg.settings)) {
newPermissions(msg.settings) newPermissions(msg.settings)
val au = affectedUsers(msg.settings) outGW.send(new NewPermissionsSetting(meetingID, msg.setByUser, permissions, users.getUsers))
outGW.send(new NewPermissionsSetting(meetingID, msg.setByUser, permissions, au))
handleLockLayout(msg.settings.lockedLayout, msg.setByUser) handleLockLayout(msg.settings.lockedLayout, msg.setByUser)
} }
} }
def handleLockUserRequest(msg: LockUserRequest) {
users.getUser(msg.userID) match {
case Some(u) => {
val uvo = u.copy(locked=msg.lock)
users.addUser(uvo)
logger.info("Lock user: mid=[" + meetingID + "] uid=[" + u.userID + "] lock=[" + msg.lock + "]")
outGW.send(new UserLocked(meetingID, u.userID, msg.lock))
}
case None => {
logger.info("Could not find user to lock: mid=[" + meetingID + "] uid=[" + msg.userID + "] lock=[" + msg.lock + "]")
}
}
}
def handleInitLockSettings(msg: InitLockSettings) { def handleInitLockSettings(msg: InitLockSettings) {
if (! permissionsInited) { if (! permissionsInited) {
permissionsInited = true permissionsInited = true
if (permissions != msg.settings || locked != msg.locked) { newPermissions(msg.settings)
permissions = msg.settings outGW.send(new PermissionsSettingInitialized(msg.meetingID, msg.settings, users.getUsers))
locked = msg.locked }
val au = affectedUsers(msg.settings) }
outGW.send(new PermissionsSettingInitialized(msg.meetingID, msg.locked, msg.settings, au))
} def handleInitAudioSettings(msg: InitAudioSettings) {
if (! audioSettingsInited) {
audioSettingsInited = true
if(meetingMuted != msg.muted) {
handleMuteAllExceptPresenterRequest(new MuteAllExceptPresenterRequest(meetingID, msg.requesterID, msg.muted));
}
} }
} }
@ -204,19 +211,6 @@ trait UsersApp {
au.toArray au.toArray
} }
def affectedUsers(settings: Permissions):Array[UserVO] = {
val au = ArrayBuffer[UserVO]()
users.getUsers foreach {u =>
val nu = u.copy(permissions=permissions)
users.addUser(nu)
if (! u.presenter && u.role != Role.MODERATOR) {
au += nu
}
}
au.toArray
}
def handleUserRaiseHand(msg: UserRaiseHand) { def handleUserRaiseHand(msg: UserRaiseHand) {
users.getUser(msg.userId) foreach {user => users.getUser(msg.userId) foreach {user =>
val uvo = user.copy(raiseHand=true) val uvo = user.copy(raiseHand=true)
@ -285,12 +279,12 @@ trait UsersApp {
false, false, false, false) false, false, false, false)
val uvo = new UserVO(msg.userID, ru.externId, ru.name, val uvo = new UserVO(msg.userID, ru.externId, ru.name,
ru.role, raiseHand=false, presenter=false, ru.role, raiseHand=false, presenter=false,
hasStream=false, locked=false, webcamStream="", hasStream=false, locked=getInitialLockStatus(ru.role),
phoneUser=false, vu, listenOnly=false, permissions) webcamStream="", phoneUser=false, vu, listenOnly=false)
users.addUser(uvo) users.addUser(uvo)
logger.info("User joined meeting: mid=[" + meetingID + "] uid=[" + uvo.userID + "]") logger.info("User joined meeting: mid=[" + meetingID + "] uid=[" + uvo.userID + "] role=[" + uvo.role + "] locked=[" + uvo.locked + "] permissions.lockOnJoin=[" + permissions.lockOnJoin + "] ")
outGW.send(new UserJoined(meetingID, recorded, uvo)) outGW.send(new UserJoined(meetingID, recorded, uvo))
outGW.send(new MeetingState(meetingID, recorded, uvo.userID, permissions, meetingMuted)) outGW.send(new MeetingState(meetingID, recorded, uvo.userID, permissions, meetingMuted))
@ -319,6 +313,10 @@ trait UsersApp {
} }
} }
def getInitialLockStatus(role: Role.Role):Boolean = {
permissions.lockOnJoin && !role.equals(Role.MODERATOR)
}
def handleUserJoinedVoiceFromPhone(msg: VoiceUserJoined) = { def handleUserJoinedVoiceFromPhone(msg: VoiceUserJoined) = {
val user = users.getUserWithVoiceUserId(msg.voiceUser.userId) match { val user = users.getUserWithVoiceUserId(msg.voiceUser.userId) match {
case Some(user) => { case Some(user) => {
@ -337,8 +335,8 @@ trait UsersApp {
val uvo = new UserVO(webUserId, webUserId, msg.voiceUser.callerName, val uvo = new UserVO(webUserId, webUserId, msg.voiceUser.callerName,
Role.VIEWER, raiseHand=false, presenter=false, Role.VIEWER, raiseHand=false, presenter=false,
hasStream=false, locked=false, webcamStream="", hasStream=false, locked=getInitialLockStatus(Role.VIEWER), webcamStream="",
phoneUser=true, vu, listenOnly=false, permissions) phoneUser=true, vu, listenOnly=false)
users.addUser(uvo) users.addUser(uvo)
logger.info("New user joined voice for user [" + uvo.name + "] userid=[" + msg.voiceUser.webUserId + "]") logger.info("New user joined voice for user [" + uvo.name + "] userid=[" + msg.voiceUser.webUserId + "]")
@ -391,7 +389,7 @@ trait UsersApp {
def handleVoiceUserMuted(msg: VoiceUserMuted) { def handleVoiceUserMuted(msg: VoiceUserMuted) {
users.getUser(msg.userId) foreach {user => users.getUser(msg.userId) foreach {user =>
val talking = if (msg.muted) false else user.voiceUser.talking val talking:Boolean = if (msg.muted) false else user.voiceUser.talking
val nv = user.voiceUser.copy(muted=msg.muted, talking=talking) val nv = user.voiceUser.copy(muted=msg.muted, talking=talking)
val nu = user.copy(voiceUser=nv) val nu = user.copy(voiceUser=nv)
users.addUser(nu) users.addUser(nu)

View File

@ -41,6 +41,7 @@ class UsersClientMessageSender(service: ConnectionInvokerService) extends OutMes
case msg: UserRegistered => handleRegisteredUser(msg) case msg: UserRegistered => handleRegisteredUser(msg)
case msg: UserListeningOnly => handleUserListeningOnly(msg) case msg: UserListeningOnly => handleUserListeningOnly(msg)
case msg: NewPermissionsSetting => handleNewPermissionsSetting(msg) case msg: NewPermissionsSetting => handleNewPermissionsSetting(msg)
case msg: UserLocked => handleUserLocked(msg)
case msg: MeetingMuted => handleMeetingMuted(msg) case msg: MeetingMuted => handleMeetingMuted(msg)
case msg: MeetingState => handleMeetingState(msg) case msg: MeetingState => handleMeetingState(msg)
@ -55,6 +56,7 @@ class UsersClientMessageSender(service: ConnectionInvokerService) extends OutMes
args.put("disablePrivChat", perms.disablePrivChat:java.lang.Boolean); args.put("disablePrivChat", perms.disablePrivChat:java.lang.Boolean);
args.put("disablePubChat", perms.disablePubChat:java.lang.Boolean); args.put("disablePubChat", perms.disablePubChat:java.lang.Boolean);
args.put("lockedLayout", perms.lockedLayout:java.lang.Boolean); args.put("lockedLayout", perms.lockedLayout:java.lang.Boolean);
args.put("lockOnJoin", perms.lockOnJoin:java.lang.Boolean);
args args
} }
@ -83,16 +85,7 @@ class UsersClientMessageSender(service: ConnectionInvokerService) extends OutMes
wuser.put("phoneUser", user.phoneUser:java.lang.Boolean) wuser.put("phoneUser", user.phoneUser:java.lang.Boolean)
wuser.put("voiceUser", vuser) wuser.put("voiceUser", vuser)
wuser.put("listenOnly", user.listenOnly:java.lang.Boolean) wuser.put("listenOnly", user.listenOnly:java.lang.Boolean)
val permissions = new HashMap[String, Object]()
permissions.put("disableCam", user.permissions.disableCam:java.lang.Boolean)
permissions.put("disableMic", user.permissions.disableMic:java.lang.Boolean)
permissions.put("disablePrivChat", user.permissions.disablePrivChat:java.lang.Boolean)
permissions.put("disablePubChat", user.permissions.disablePubChat:java.lang.Boolean)
permissions.put("lockedLayout", user.permissions.lockedLayout:java.lang.Boolean)
wuser.put("permissions", permissions)
wuser wuser
} }
@ -103,6 +96,7 @@ class UsersClientMessageSender(service: ConnectionInvokerService) extends OutMes
args.put("disablePrivChat", msg.permissions.disablePrivChat:java.lang.Boolean); args.put("disablePrivChat", msg.permissions.disablePrivChat:java.lang.Boolean);
args.put("disablePubChat", msg.permissions.disablePubChat:java.lang.Boolean); args.put("disablePubChat", msg.permissions.disablePubChat:java.lang.Boolean);
args.put("lockedLayout", msg.permissions.lockedLayout:java.lang.Boolean); args.put("lockedLayout", msg.permissions.lockedLayout:java.lang.Boolean);
args.put("lockOnJoin", msg.permissions.lockOnJoin:java.lang.Boolean);
var users = new ArrayList[java.util.HashMap[String, Object]]; var users = new ArrayList[java.util.HashMap[String, Object]];
msg.applyTo.foreach(uvo => { msg.applyTo.foreach(uvo => {
@ -120,6 +114,20 @@ class UsersClientMessageSender(service: ConnectionInvokerService) extends OutMes
service.sendMessage(m); service.sendMessage(m);
} }
private def handleUserLocked(msg: UserLocked) {
val args = new java.util.HashMap[String, Object]();
args.put("meetingID", msg.meetingID);
args.put("user", msg.userId)
args.put("lock", msg.lock:java.lang.Boolean)
val message = new java.util.HashMap[String, Object]()
val gson = new Gson();
message.put("msg", gson.toJson(args))
val m = new BroadcastClientMessage(msg.meetingID, "userLocked", message);
service.sendMessage(m);
}
private def handleRegisteredUser(msg: UserRegistered) { private def handleRegisteredUser(msg: UserRegistered) {
val args = new java.util.HashMap[String, Object](); val args = new java.util.HashMap[String, Object]();
args.put("userId", msg.user.id); args.put("userId", msg.user.id);

View File

@ -15,9 +15,7 @@ class UsersEventRedisPublisher(service: MessageSender) extends OutMessageListene
case msg: PermissionsSettingInitialized => handlePermissionsSettingInitialized(msg) case msg: PermissionsSettingInitialized => handlePermissionsSettingInitialized(msg)
case msg: NewPermissionsSetting => handleNewPermissionsSetting(msg) case msg: NewPermissionsSetting => handleNewPermissionsSetting(msg)
case msg: UserLocked => handleUserLocked(msg) case msg: UserLocked => handleUserLocked(msg)
case msg: UsersLocked => handleUsersLocked(msg)
case msg: GetPermissionsSettingReply => handleGetPermissionsSettingReply(msg) case msg: GetPermissionsSettingReply => handleGetPermissionsSettingReply(msg)
case msg: IsMeetingLockedReply => handleIsMeetingLockedReply(msg)
case msg: UserRegistered => handleUserRegistered(msg) case msg: UserRegistered => handleUserRegistered(msg)
case msg: UserLeft => handleUserLeft(msg) case msg: UserLeft => handleUserLeft(msg)
case msg: PresenterAssigned => handlePresenterAssigned(msg) case msg: PresenterAssigned => handlePresenterAssigned(msg)
@ -66,21 +64,11 @@ class UsersEventRedisPublisher(service: MessageSender) extends OutMessageListene
val json = UsersMessageToJsonConverter.userLockedToJson(msg) val json = UsersMessageToJsonConverter.userLockedToJson(msg)
service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) service.send(MessagingConstants.FROM_MEETING_CHANNEL, json)
} }
private def handleUsersLocked(msg: UsersLocked) {
val json = UsersMessageToJsonConverter.usersLockedToJson(msg)
service.send(MessagingConstants.FROM_MEETING_CHANNEL, json)
}
private def handleGetPermissionsSettingReply(msg: GetPermissionsSettingReply) { private def handleGetPermissionsSettingReply(msg: GetPermissionsSettingReply) {
val json = UsersMessageToJsonConverter.getPermissionsSettingReplyToJson(msg) val json = UsersMessageToJsonConverter.getPermissionsSettingReplyToJson(msg)
service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) service.send(MessagingConstants.FROM_MEETING_CHANNEL, json)
} }
private def handleIsMeetingLockedReply(msg: IsMeetingLockedReply) {
val json = UsersMessageToJsonConverter.isMeetingLockedReplyToJson(msg)
service.send(MessagingConstants.FROM_MEETING_CHANNEL, json)
}
private def handleUserRegistered(msg: UserRegistered) { private def handleUserRegistered(msg: UserRegistered) {
val json = UsersMessageToJsonConverter.userRegisteredToJson(msg) val json = UsersMessageToJsonConverter.userRegisteredToJson(msg)

View File

@ -24,15 +24,6 @@ object UsersMessageToJsonConverter {
wuser += "phone_user" -> user.phoneUser wuser += "phone_user" -> user.phoneUser
wuser += "listenOnly" -> user.listenOnly wuser += "listenOnly" -> user.listenOnly
val permissions = new scala.collection.mutable.HashMap[String, Any]
permissions.put("disableCam", user.permissions.disableCam)
permissions.put("disableMic", user.permissions.disableMic)
permissions.put("disablePrivChat", user.permissions.disablePrivChat)
permissions.put("disablePubChat", user.permissions.disablePubChat)
permissions.put("lockedLayout", user.permissions.lockedLayout)
wuser.put("permissions", permissions)
val vuser = new scala.collection.mutable.HashMap[String, Any] val vuser = new scala.collection.mutable.HashMap[String, Any]
vuser += "userid" -> user.voiceUser.userId vuser += "userid" -> user.voiceUser.userId
vuser += "web_userid" -> user.voiceUser.webUserId vuser += "web_userid" -> user.voiceUser.webUserId
@ -79,7 +70,6 @@ object UsersMessageToJsonConverter {
def permissionsSettingInitializedToJson(msg: PermissionsSettingInitialized):String = { def permissionsSettingInitializedToJson(msg: PermissionsSettingInitialized):String = {
val payload = new java.util.HashMap[String, Any]() val payload = new java.util.HashMap[String, Any]()
payload.put(Constants.MEETING_ID, msg.meetingID) payload.put(Constants.MEETING_ID, msg.meetingID)
payload.put(Constants.LOCKED, msg.locked)
payload.put(Constants.SETTINGS, msg.permissions.toString()) //#todo not tested payload.put(Constants.SETTINGS, msg.permissions.toString()) //#todo not tested
val header = Util.buildHeader(MessageNames.PERMISSION_SETTING_INITIALIZED, msg.version, None) val header = Util.buildHeader(MessageNames.PERMISSION_SETTING_INITIALIZED, msg.version, None)
@ -90,10 +80,12 @@ object UsersMessageToJsonConverter {
val payload = new java.util.HashMap[String, Any]() val payload = new java.util.HashMap[String, Any]()
payload.put(Constants.MEETING_ID, msg.meetingID) payload.put(Constants.MEETING_ID, msg.meetingID)
payload.put("disableCam", msg.permissions.disableCam) payload.put("disableCam", msg.permissions.disableCam)
payload.put("disableMic", msg.permissions.disableMic) payload.put("disableMic", msg.permissions.disableMic)
payload.put("disablePrivChat", msg.permissions.disablePrivChat) payload.put("disablePrivChat", msg.permissions.disablePrivChat)
payload.put("disablePubChat", msg.permissions.disablePubChat) payload.put("disablePubChat", msg.permissions.disablePubChat)
payload.put("lockedLayout", msg.permissions.lockedLayout)
payload.put("lockOnJoin", msg.permissions.lockOnJoin)
val users = new java.util.ArrayList[java.util.Map[String, Any]] val users = new java.util.ArrayList[java.util.Map[String, Any]]
msg.applyTo.foreach(uvo => { msg.applyTo.foreach(uvo => {
users.add(userToMap(uvo)) users.add(userToMap(uvo))
@ -115,16 +107,6 @@ object UsersMessageToJsonConverter {
Util.buildJson(header, payload) Util.buildJson(header, payload)
} }
def usersLockedToJson(msg: UsersLocked):String = {
val payload = new java.util.HashMap[String, Any]()
payload.put(Constants.MEETING_ID, msg.meetingID)
payload.put(Constants.EXCEPT_USERS, msg.exceptUsers.toString())
payload.put(Constants.LOCKED, msg.lock)
val header = Util.buildHeader(MessageNames.USERS_LOCKED, msg.version, None)
Util.buildJson(header, payload)
}
def getPermissionsSettingReplyToJson(msg: GetPermissionsSettingReply):String = { def getPermissionsSettingReplyToJson(msg: GetPermissionsSettingReply):String = {
val payload = new java.util.HashMap[String, Any]() val payload = new java.util.HashMap[String, Any]()
payload.put(Constants.MEETING_ID, msg.meetingID) payload.put(Constants.MEETING_ID, msg.meetingID)
@ -133,15 +115,6 @@ object UsersMessageToJsonConverter {
val header = Util.buildHeader(MessageNames.GET_PERMISSION_SETTINGS_REPLY, msg.version, None) val header = Util.buildHeader(MessageNames.GET_PERMISSION_SETTINGS_REPLY, msg.version, None)
Util.buildJson(header, payload) Util.buildJson(header, payload)
} }
def isMeetingLockedReplyToJson(msg: IsMeetingLockedReply):String = {
val payload = new java.util.HashMap[String, Any]()
payload.put(Constants.MEETING_ID, msg.meetingID)
payload.put(Constants.USER_ID, msg.userId)
val header = Util.buildHeader(MessageNames.IS_MEETING_LOCKED_REPLY, msg.version, None)
Util.buildJson(header, payload)
}
def userRegisteredToJson(msg: UserRegistered):String = { def userRegisteredToJson(msg: UserRegistered):String = {
val payload = new java.util.HashMap[String, Any]() val payload = new java.util.HashMap[String, Any]()

View File

@ -14,14 +14,13 @@ class UsersModelTests {
"Asyong Aksaya", "+639175558624", "Asyong Aksaya", "+639175558624",
joined = true, locked = false, joined = true, locked = false,
muted = false, talking = false) muted = false, talking = false)
val perm = new Permissions
val userVo = new UserVO("user1", userID="user1", externUserID = "euser1", name = "Asyong Aksaya",
val userVo = new UserVO("user1", "euser1", name = "Asyong Aksaya",
role = MODERATOR, raiseHand = false, role = MODERATOR, raiseHand = false,
presenter = true, hasStream = false, presenter = true, hasStream = false,
locked = false, webcamStream = "", locked = false, webcamStream = "",
phoneUser = false, voiceUser = voiceUser, phoneUser = false, voiceUser = voiceUser,
listenOnly = false, permissions = perm) listenOnly = false)
@BeforeClass @BeforeClass
def setUp() { def setUp() {

View File

@ -603,4 +603,5 @@ bbb.lockSettings.microphone = Microphone
bbb.lockSettings.layout = Layout bbb.lockSettings.layout = Layout
bbb.lockSettings.title=Lock Viewers bbb.lockSettings.title=Lock Viewers
bbb.lockSettings.feature=Feature bbb.lockSettings.feature=Feature
bbb.lockSettings.enabled=Locked bbb.lockSettings.locked=Locked
bbb.lockSettings.lockOnJoin=Lock On Join

View File

@ -130,7 +130,6 @@ bbb.users.settings.lowerAllHands = Baixar todas as mãos
bbb.users.raiseHandBtn.toolTip = Levantar a mão bbb.users.raiseHandBtn.toolTip = Levantar a mão
bbb.users.raiseHandBtn.toolTip2 = Abaixar a mão bbb.users.raiseHandBtn.toolTip2 = Abaixar a mão
bbb.users.roomMuted.text = Participantes silenciados bbb.users.roomMuted.text = Participantes silenciados
bbb.users.roomLocked.text = Participantes bloqueados
bbb.users.pushToTalk.toolTip = Falar bbb.users.pushToTalk.toolTip = Falar
bbb.users.pushToMute.toolTip = Silenciar você mesmo bbb.users.pushToMute.toolTip = Silenciar você mesmo
bbb.users.muteMeBtnTxt.talk = Falar bbb.users.muteMeBtnTxt.talk = Falar
@ -587,12 +586,13 @@ bbb.users.settings.unlockAll=Liberar todos os participantes
bbb.users.settings.roomIsLocked=Bloqueados por padrão bbb.users.settings.roomIsLocked=Bloqueados por padrão
bbb.users.settings.roomIsMuted=Silenciados por padrão bbb.users.settings.roomIsMuted=Silenciados por padrão
bbb.users.roomLocked.text = Participantes c/ restrições
bbb.lockSettings.save = Aplicar bbb.lockSettings.save = Aplicar
bbb.lockSettings.save.tooltip = Aplicar configurações de restrição bbb.lockSettings.save.toolTip = Aplicar configurações de restrição
bbb.lockSettings.cancel = Cancelar bbb.lockSettings.cancel = Cancelar
bbb.lockSettings.cancel.toolTip = Fecha esta janela sem aplicar bbb.lockSettings.cancel.toolTip = Fecha esta janela sem aplicar
bbb.lockSettings.moderatorLocking = Bloqueio de moderador
bbb.lockSettings.privateChat = Chat privado bbb.lockSettings.privateChat = Chat privado
bbb.lockSettings.publicChat = Chat público bbb.lockSettings.publicChat = Chat público
bbb.lockSettings.webcam = Câmera bbb.lockSettings.webcam = Câmera
@ -600,4 +600,5 @@ bbb.lockSettings.microphone = Microfone
bbb.lockSettings.layout = Layout bbb.lockSettings.layout = Layout
bbb.lockSettings.title=Restringir participantes bbb.lockSettings.title=Restringir participantes
bbb.lockSettings.feature=Recurso bbb.lockSettings.feature=Recurso
bbb.lockSettings.enabled=Bloqueado bbb.lockSettings.locked=Restrito
bbb.lockSettings.lockOnJoin=Restringir ao entrar

View File

@ -94,7 +94,7 @@
glowBlurSize = "30.0" glowBlurSize = "30.0"
/> />
<module name="WhiteboardModule" url="http://HOST/client/WhiteboardModule.swf?v=4105" <module name="WhiteboardModule" url="http://HOST/client/WhiteboardModule.swf?v=VERSION"
uri="rtmp://HOST/bigbluebutton" uri="rtmp://HOST/bigbluebutton"
dependsOn="PresentModule" dependsOn="PresentModule"
baseTabIndex="601" baseTabIndex="601"

View File

@ -24,15 +24,17 @@ package org.bigbluebutton.core.vo
private var disableMic:Boolean; private var disableMic:Boolean;
private var disablePrivateChat:Boolean; private var disablePrivateChat:Boolean;
private var disablePublicChat:Boolean; private var disablePublicChat:Boolean;
private var lockedLayout:Boolean; private var lockedLayout:Boolean;
private var lockOnJoin:Boolean;
public function LockSettingsVO(pDisableCam:Boolean, pDisableMic:Boolean, pDisablePrivateChat:Boolean, pDisablePublicChat:Boolean, pLockLayout: Boolean) public function LockSettingsVO(pDisableCam:Boolean, pDisableMic:Boolean, pDisablePrivateChat:Boolean, pDisablePublicChat:Boolean, pLockLayout: Boolean, pLockOnJoin:Boolean)
{ {
this.disableCam = pDisableCam; this.disableCam = pDisableCam;
this.disableMic = pDisableMic; this.disableMic = pDisableMic;
this.disablePrivateChat = pDisablePrivateChat; this.disablePrivateChat = pDisablePrivateChat;
this.disablePublicChat = pDisablePublicChat; this.disablePublicChat = pDisablePublicChat;
this.lockedLayout = pLockLayout; this.lockedLayout = pLockLayout;
this.lockOnJoin = pLockOnJoin;
} }
public function toMap():Object { public function toMap():Object {
@ -41,7 +43,8 @@ package org.bigbluebutton.core.vo
disableMic: this.disableMic, disableMic: this.disableMic,
disablePrivateChat: this.disablePrivateChat, disablePrivateChat: this.disablePrivateChat,
disablePublicChat: this.disablePublicChat, disablePublicChat: this.disablePublicChat,
lockedLayout: this.lockedLayout lockedLayout: this.lockedLayout,
lockOnJoin: this.lockOnJoin
}; };
return map; return map;
@ -62,9 +65,17 @@ package org.bigbluebutton.core.vo
public function getDisablePublicChat():Boolean { public function getDisablePublicChat():Boolean {
return disablePublicChat; return disablePublicChat;
} }
public function getLockedLayout():Boolean { public function getLockedLayout():Boolean {
return lockedLayout; return lockedLayout;
} }
public function getLockOnJoin():Boolean {
return lockOnJoin;
}
public function isAnythingLocked():Boolean {
return lockedLayout || disableCam || disableMic || disablePrivateChat || disablePublicChat;
}
} }
} }

View File

@ -85,11 +85,6 @@ package org.bigbluebutton.main.model
public var userid:String; public var userid:String;
public var record:Boolean; public var record:Boolean;
/**
* Flag used to start room as locked
* */
public var lockOnStart:Boolean;
/** /**
* Flag used to start room as muted * Flag used to start room as muted
* */ * */

View File

@ -74,6 +74,10 @@ package org.bigbluebutton.main.model.users
public function set presenter(p:Boolean):void { public function set presenter(p:Boolean):void {
_presenter = p; _presenter = p;
verifyUserStatus(); verifyUserStatus();
//As the lock settings are now not applied to presenters, when the presenter flag is changed, we need to apply the lock settings
if(me)
applyLockSettings();
} }
public var raiseHandTime:Date; public var raiseHandTime:Date;
@ -215,23 +219,20 @@ package org.bigbluebutton.main.model.users
} }
public function lockStatusChanged(locked: Boolean):void { public function lockStatusChanged(locked: Boolean):void {
userLocked = locked; trace("lockStatusChanged -> " + locked);
if(me) userLocked = locked;
applyLockSettings(); if(me)
buildStatus(); applyLockSettings();
buildStatus();
} }
public function changeStatus(status:Status):void { public function changeStatus(status:Status):void {
trace("changeStatus -> " + status.name);
//_status.changeStatus(status); //_status.changeStatus(status);
if (status.name == "presenter") { if (status.name == "presenter") {
presenter = status.value presenter = status.value
} }
switch (status.name) { switch (status.name) {
case "locked":
userLocked = status.value as Boolean;
if(me)
applyLockSettings();
break;
case "presenter": case "presenter":
presenter = status.value; presenter = status.value;
break; break;
@ -307,32 +308,31 @@ package org.bigbluebutton.main.model.users
} }
public function applyLockSettings():void { public function applyLockSettings():void {
var lockSettings:LockSettingsVO = UserManager.getInstance().getConference().getLockSettings(); var lockSettings:LockSettingsVO = UserManager.getInstance().getConference().getLockSettings();
var lockAppliesToMe:Boolean = me && role != MODERATOR && !presenter && userLocked;
disableMyCam = lockAppliesToMe && lockSettings.getDisableCam();
disableMyMic = lockAppliesToMe && lockSettings.getDisableMic();
disableMyPrivateChat = lockAppliesToMe && lockSettings.getDisablePrivateChat();
disableMyPublicChat = lockAppliesToMe && lockSettings.getDisablePublicChat();
lockedLayout = lockAppliesToMe && lockSettings.getLockedLayout();
disableMyCam = lockSettings.getDisableCam();
disableMyMic = lockSettings.getDisableMic();
disableMyPrivateChat = lockSettings.getDisablePrivateChat();
disableMyPublicChat = lockSettings.getDisablePublicChat();
lockedLayout = lockSettings.getLockedLayout();
var dispatcher:Dispatcher = new Dispatcher(); var dispatcher:Dispatcher = new Dispatcher();
dispatcher.dispatchEvent(new LockControlEvent(LockControlEvent.CHANGED_LOCK_SETTINGS)); dispatcher.dispatchEvent(new LockControlEvent(LockControlEvent.CHANGED_LOCK_SETTINGS));
if (me && role != MODERATOR && !presenter) { if (lockAppliesToMe) {
//If it's sharing webcam, stop it //If it's sharing webcam, stop it
if (disableMyCam && hasStream){ if (disableMyCam && hasStream){
dispatcher.dispatchEvent(new ClosePublishWindowEvent()); dispatcher.dispatchEvent(new ClosePublishWindowEvent());
} }
//If it's sharing microphone, mute it
//If it's sharing microphone, mute it if (disableMyMic && !UserManager.getInstance().getConference().isMyVoiceMuted()) {
if (disableMyMic && !UserManager.getInstance().getConference().isMyVoiceMuted()) { var e:VoiceConfEvent = new VoiceConfEvent(VoiceConfEvent.MUTE_USER);
var e:VoiceConfEvent = new VoiceConfEvent(VoiceConfEvent.MUTE_USER); e.userid = UserManager.getInstance().getConference().getMyUserId();
e.userid = UserManager.getInstance().getConference().getMyUserId(); e.mute = true;
e.mute = true; dispatcher.dispatchEvent(e);
dispatcher.dispatchEvent(e); }
} }
}
} }
} }
} }

View File

@ -437,12 +437,12 @@ package org.bigbluebutton.main.model.users {
public function configLockSettings():void { public function configLockSettings():void {
var config:Config = BBB.initConfigManager().config; var config:Config = BBB.initConfigManager().config;
var allowModeratorLocking:Boolean, var disableCam:Boolean,
disableCam:Boolean, disableMic:Boolean,
disableMic:Boolean, disablePrivateChat:Boolean,
disablePrivateChat:Boolean, disablePublicChat:Boolean,
disablePublicChat:Boolean, lockedLayout:Boolean,
lockedLayout:Boolean; lockOnJoin:Boolean;
var lockConfig:XML; var lockConfig:XML;
@ -450,45 +450,45 @@ package org.bigbluebutton.main.model.users {
lockConfig = config.lock; lockConfig = config.lock;
} }
try {
allowModeratorLocking = (lockConfig.@allowModeratorLocking.toUpperCase() == "TRUE");
} catch(e:Error) {
allowModeratorLocking = false;
}
try { try {
disableCam = (lockConfig.@disableCamForLockedUsers.toUpperCase() == "TRUE"); disableCam = (lockConfig.@disableCamForLockedUsers.toUpperCase() == "TRUE");
} catch(e:Error) { } catch(e:Error) {
disableCam = false; disableCam = false; //If not set, default to false
} }
try { try {
disableMic = (lockConfig.@disableMicForLockedUsers.toUpperCase() == "TRUE"); disableMic = (lockConfig.@disableMicForLockedUsers.toUpperCase() == "TRUE");
} catch(e:Error) { } catch(e:Error) {
disableMic = false; disableMic = false; //If not set, default to false
} }
try { try {
disablePrivateChat = (lockConfig.@disablePrivateChatForLockedUsers.toUpperCase() == "TRUE"); disablePrivateChat = (lockConfig.@disablePrivateChatForLockedUsers.toUpperCase() == "TRUE");
} catch(e:Error) { } catch(e:Error) {
disablePrivateChat = false; disablePrivateChat = false; //If not set, default to false
} }
try { try {
disablePublicChat = (lockConfig.@disablePublicChatForLockedUsers.toUpperCase() == "TRUE"); disablePublicChat = (lockConfig.@disablePublicChatForLockedUsers.toUpperCase() == "TRUE");
} catch(e:Error) { } catch(e:Error) {
disablePublicChat = false; disablePublicChat = false; //If not set, default to false
} }
try { try {
lockedLayout = (lockConfig.@lockLayoutForLockedUsers.toUpperCase() == "TRUE"); lockedLayout = (lockConfig.@lockLayoutForLockedUsers.toUpperCase() == "TRUE");
} catch(e:Error) { } catch(e:Error) {
lockedLayout = false; lockedLayout = false; //If not set, default to false
} }
try {
lockOnJoin = (lockConfig.@lockOnJoin.toUpperCase() == "TRUE");
} catch(e:Error) {
lockOnJoin = true; //If not set, default to true
}
trace(LOG + " init lock settings from config"); trace(LOG + " init lock settings from config");
lockSettings = new LockSettingsVO(disableCam, disableMic, disablePrivateChat, disablePublicChat, lockedLayout); lockSettings = new LockSettingsVO(disableCam, disableMic, disablePrivateChat, disablePublicChat, lockedLayout, lockOnJoin);
setLockSettings(lockSettings); setLockSettings(lockSettings);
} }
@ -513,7 +513,7 @@ package org.bigbluebutton.main.model.users {
public function setLockSettings(lockSettings:LockSettingsVO):void { public function setLockSettings(lockSettings:LockSettingsVO):void {
this.lockSettings = lockSettings; this.lockSettings = lockSettings;
applyLockSettings(); applyLockSettings();
} }
public function applyLockSettings():void { public function applyLockSettings():void {

View File

@ -221,12 +221,11 @@ package org.bigbluebutton.main.model.users
var uri:String = _applicationURI + "/" + _conferenceParameters.room; var uri:String = _applicationURI + "/" + _conferenceParameters.room;
trace(LOG + "::Connecting to " + uri + " [" + _conferenceParameters.username + "," + _conferenceParameters.role + "," + trace(LOG + "::Connecting to " + uri + " [" + _conferenceParameters.username + "," + _conferenceParameters.role + "," +
_conferenceParameters.conference + "," + _conferenceParameters.record + "," + _conferenceParameters.room + "]"); _conferenceParameters.conference + "," + _conferenceParameters.record + "," + _conferenceParameters.room + ", " + _conferenceParameters.lockSettings.lockOnJoin + "]");
_netConnection.connect(uri, _conferenceParameters.username, _conferenceParameters.role, _netConnection.connect(uri, _conferenceParameters.username, _conferenceParameters.role,
_conferenceParameters.room, _conferenceParameters.voicebridge, _conferenceParameters.room, _conferenceParameters.voicebridge,
_conferenceParameters.record, _conferenceParameters.externUserID, _conferenceParameters.record, _conferenceParameters.externUserID,
_conferenceParameters.internalUserID, _conferenceParameters.lockOnStart, _conferenceParameters.internalUserID, _conferenceParameters.muteOnStart, _conferenceParameters.lockSettings);
_conferenceParameters.muteOnStart, _conferenceParameters.lockSettings);
} catch(e:ArgumentError) { } catch(e:ArgumentError) {
// Invalid parameters. // Invalid parameters.
switch (e.errorID) { switch (e.errorID) {

View File

@ -129,21 +129,15 @@ package org.bigbluebutton.main.model.users
muteOnStart = false; muteOnStart = false;
} }
var lockOnStart:Boolean;
try {
lockOnStart = (config.meeting.@lockOnStart.toUpperCase() == "TRUE");
} catch(e:Error) {
lockOnStart = false;
}
_conferenceParameters.muteOnStart = muteOnStart; _conferenceParameters.muteOnStart = muteOnStart;
_conferenceParameters.lockOnStart = lockOnStart;
_conferenceParameters.lockSettings = UserManager.getInstance().getConference().getLockSettings().toMap(); _conferenceParameters.lockSettings = UserManager.getInstance().getConference().getLockSettings().toMap();
// assign the meeting name to the document title trace("_conferenceParameters.muteOnStart = " + _conferenceParameters.muteOnStart);
ExternalInterface.call("setTitle", _conferenceParameters.meetingName);
// assign the meeting name to the document title
trace(LOG + " Got the user info from web api."); ExternalInterface.call("setTitle", _conferenceParameters.meetingName);
trace(LOG + " Got the user info from web api.");
/** /**
* Temporarily store the parameters in global BBB so we get easy access to it. * Temporarily store the parameters in global BBB so we get easy access to it.
*/ */
@ -153,7 +147,7 @@ package org.bigbluebutton.main.model.users
e.conference = UserManager.getInstance().getConference(); e.conference = UserManager.getInstance().getConference();
dispatcher.dispatchEvent(e); dispatcher.dispatchEvent(e);
connect(); connect();
} }
} }

View File

@ -37,7 +37,10 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
import org.bigbluebutton.core.UsersUtil; import org.bigbluebutton.core.UsersUtil;
import org.bigbluebutton.core.managers.UserManager; import org.bigbluebutton.core.managers.UserManager;
import org.bigbluebutton.core.vo.LockSettingsVO;
import org.bigbluebutton.main.events.MadePresenterEvent; import org.bigbluebutton.main.events.MadePresenterEvent;
import org.bigbluebutton.main.model.users.BBBUser;
import org.bigbluebutton.main.model.users.Conference;
import org.bigbluebutton.modules.phone.PhoneOptions; import org.bigbluebutton.modules.phone.PhoneOptions;
import org.bigbluebutton.modules.phone.events.AudioSelectionWindowEvent; import org.bigbluebutton.modules.phone.events.AudioSelectionWindowEvent;
import org.bigbluebutton.modules.phone.events.JoinVoiceConferenceCommand; import org.bigbluebutton.modules.phone.events.JoinVoiceConferenceCommand;
@ -48,11 +51,17 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
[Bindable] private var baseIndex:int = 1; [Bindable] private var baseIndex:int = 1;
private function init():void { private function init():void {
var conference:Conference = UserManager.getInstance().getConference();
if (!phoneOptions.listenOnlyMode) btnListenOnly.enabled = false; if (!phoneOptions.listenOnlyMode) btnListenOnly.enabled = false;
if (phoneOptions.presenterShareOnly && !UsersUtil.amIPresenter() && !UsersUtil.amIModerator()) btnMicrophone.enabled = false; if (
(phoneOptions.presenterShareOnly && !UsersUtil.amIPresenter() && !UsersUtil.amIModerator())
) {
btnMicrophone.enabled = false;
}
if (phoneOptions.showPhoneOption) { if (phoneOptions.showPhoneOption) {
txtPhone.text=ResourceUtil.getInstance().getString('bbb.audioSelection.txtPhone.text', [UserManager.getInstance().getConference().dialNumber, UserManager.getInstance().getConference().voiceBridge]); txtPhone.text=ResourceUtil.getInstance().getString('bbb.audioSelection.txtPhone.text', [conference.dialNumber, conference.voiceBridge]);
} else { } else {
vrulePhone.visible = vrulePhone.includeInLayout = false; vrulePhone.visible = vrulePhone.includeInLayout = false;
vboxPhone.visible = vboxPhone.includeInLayout = false; vboxPhone.visible = vboxPhone.includeInLayout = false;

View File

@ -42,20 +42,22 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
import org.bigbluebutton.util.i18n.ResourceUtil; import org.bigbluebutton.util.i18n.ResourceUtil;
private var images:Images = new Images(); private var images:Images = new Images();
[Bindable] private var cancelIcon:Class = images.cancel; [Bindable] private var cancelIcon:Class = images.cancel;
[Bindable] private var baseIndex:int = 1; [Bindable] private var baseIndex:int = 1;
[Bindable] public var disableCam:Boolean = false; [Bindable] public var disableCam:Boolean = false;
[Bindable] public var disableMic:Boolean = false; [Bindable] public var disableMic:Boolean = false;
[Bindable] public var disablePubChat:Boolean = false; [Bindable] public var disablePubChat:Boolean = false;
[Bindable] public var disablePrivChat:Boolean = false; [Bindable] public var disablePrivChat:Boolean = false;
[Bindable] public var lockedLayout:Boolean = false; [Bindable] public var lockedLayout:Boolean = false;
[Bindable] public var lockOnJoin:Boolean = false;
override public function move(x:Number, y:Number):void { override public function move(x:Number, y:Number):void {
return; return;
} }
private function handleKeyDown(event:KeyboardEvent):void { private function handleKeyDown(event:KeyboardEvent):void {
if (event.charCode == Keyboard.ESCAPE) { if (event.charCode == Keyboard.ESCAPE) {
this.dispatchEvent(new CloseEvent(CloseEvent.CLOSE)); this.dispatchEvent(new CloseEvent(CloseEvent.CLOSE));
@ -65,15 +67,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
private function onSaveClicked():void { private function onSaveClicked():void {
var event:LockControlEvent = new LockControlEvent(LockControlEvent.SAVE_LOCK_SETTINGS); var event:LockControlEvent = new LockControlEvent(LockControlEvent.SAVE_LOCK_SETTINGS);
var lockSettings:LockSettingsVO = new LockSettingsVO(chkDisableWebcam.selected, chkDisableMicrophone.selected, chkDisablePrivateChat.selected, chkDisablePublicChat.selected, chkDisableLayout.selected, chkLockOnJoin.selected);
var lockSettings:LockSettingsVO = new LockSettingsVO(enableWebcam.selected,
enableMicrophone.selected,
enablePrivateChat.selected,
enablePublicChat.selected,
enableLayout.selected);
event.payload = lockSettings.toMap(); event.payload = lockSettings.toMap();
dispatchEvent(event); dispatchEvent(event);
PopUpManager.removePopUp(this); PopUpManager.removePopUp(this);
@ -85,9 +80,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
protected function creationCompleteHandler(event:FlexEvent):void protected function creationCompleteHandler(event:FlexEvent):void
{ {
}
}
]]> ]]>
</mx:Script> </mx:Script>
<mx:VBox width="100%" height="100%" paddingBottom="5" paddingLeft="5" paddingRight="5" paddingTop="5"> <mx:VBox width="100%" height="100%" paddingBottom="5" paddingLeft="5" paddingRight="5" paddingTop="5">
@ -97,14 +91,14 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
<mx:HBox verticalAlign="top" width="100%" paddingTop="20"> <mx:HBox verticalAlign="top" width="100%" paddingTop="20">
<mx:Label width="70%" styleName="lockSettingsDefaultLabelStyle" text="{ResourceUtil.getInstance().getString('bbb.lockSettings.feature')}" fontWeight="bold" /> <mx:Label width="70%" styleName="lockSettingsDefaultLabelStyle" text="{ResourceUtil.getInstance().getString('bbb.lockSettings.feature')}" fontWeight="bold" />
<mx:Label styleName="lockSettingsDefaultLabelStyle" text="{ResourceUtil.getInstance().getString('bbb.lockSettings.enabled')}" fontWeight="bold" /> <mx:Label styleName="lockSettingsDefaultLabelStyle" text="{ResourceUtil.getInstance().getString('bbb.lockSettings.locked')}" fontWeight="bold" />
</mx:HBox> </mx:HBox>
<mx:HBox verticalAlign="top" width="100%"> <mx:HBox verticalAlign="top" width="100%">
<mx:Label width="70%" styleName="lockSettingsDefaultLabelStyle" <mx:Label width="70%" styleName="lockSettingsDefaultLabelStyle"
text="{ResourceUtil.getInstance().getString('bbb.lockSettings.webcam')}" /> text="{ResourceUtil.getInstance().getString('bbb.lockSettings.webcam')}" />
<mx:HBox width="30%"> <mx:HBox width="30%">
<mx:Spacer width="50%" /> <mx:Spacer width="50%" />
<mx:CheckBox id="enableWebcam" selected="{disableCam}" /> <mx:CheckBox id="chkDisableWebcam" selected="{disableCam}" />
<mx:Spacer width="50%" /> <mx:Spacer width="50%" />
</mx:HBox> </mx:HBox>
</mx:HBox> </mx:HBox>
@ -113,7 +107,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
text="{ResourceUtil.getInstance().getString('bbb.lockSettings.microphone')}" /> text="{ResourceUtil.getInstance().getString('bbb.lockSettings.microphone')}" />
<mx:HBox width="30%"> <mx:HBox width="30%">
<mx:Spacer width="50%" /> <mx:Spacer width="50%" />
<mx:CheckBox id="enableMicrophone" selected="{disableMic}"/> <mx:CheckBox id="chkDisableMicrophone" selected="{disableMic}"/>
<mx:Spacer width="50%" /> <mx:Spacer width="50%" />
</mx:HBox> </mx:HBox>
</mx:HBox> </mx:HBox>
@ -122,7 +116,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
text="{ResourceUtil.getInstance().getString('bbb.lockSettings.publicChat')}" /> text="{ResourceUtil.getInstance().getString('bbb.lockSettings.publicChat')}" />
<mx:HBox width="30%"> <mx:HBox width="30%">
<mx:Spacer width="50%" /> <mx:Spacer width="50%" />
<mx:CheckBox id="enablePublicChat" selected="{disablePubChat}"/> <mx:CheckBox id="chkDisablePublicChat" selected="{disablePubChat}"/>
<mx:Spacer width="50%" /> <mx:Spacer width="50%" />
</mx:HBox> </mx:HBox>
</mx:HBox> </mx:HBox>
@ -131,19 +125,33 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
text="{ResourceUtil.getInstance().getString('bbb.lockSettings.privateChat')}" /> text="{ResourceUtil.getInstance().getString('bbb.lockSettings.privateChat')}" />
<mx:HBox width="30%"> <mx:HBox width="30%">
<mx:Spacer width="50%" /> <mx:Spacer width="50%" />
<mx:CheckBox id="enablePrivateChat" selected="{disablePrivChat}"/> <mx:CheckBox id="chkDisablePrivateChat" selected="{disablePrivChat}"/>
<mx:Spacer width="50%" /> <mx:Spacer width="50%" />
</mx:HBox> </mx:HBox>
</mx:HBox> </mx:HBox>
<mx:HBox verticalAlign="top" width="100%">
<mx:Label width="70%" styleName="lockSettingsDefaultLabelStyle" <mx:HBox verticalAlign="top" width="100%">
text="{ResourceUtil.getInstance().getString('bbb.lockSettings.layout')}" /> <mx:Label width="70%" styleName="lockSettingsDefaultLabelStyle"
<mx:HBox width="30%"> text="{ResourceUtil.getInstance().getString('bbb.lockSettings.layout')}" />
<mx:Spacer width="50%" /> <mx:HBox width="30%">
<mx:CheckBox id="enableLayout" selected="{lockedLayout}"/> <mx:Spacer width="50%" />
<mx:Spacer width="50%" /> <mx:CheckBox id="chkDisableLayout" selected="{lockedLayout}"/>
</mx:HBox> <mx:Spacer width="50%" />
</mx:HBox> </mx:HBox>
</mx:HBox>
<mx:HRule width="100%"/>
<mx:HBox verticalAlign="top" width="100%">
<mx:Label width="70%" styleName="lockSettingsDefaultLabelStyle"
text="{ResourceUtil.getInstance().getString('bbb.lockSettings.lockOnJoin')}" />
<mx:HBox width="30%">
<mx:Spacer width="50%" />
<mx:CheckBox id="chkLockOnJoin" selected="{lockOnJoin}"/>
<mx:Spacer width="50%" />
</mx:HBox>
</mx:HBox>
<mx:HRule width="100%"/> <mx:HRule width="100%"/>
<mx:HBox width="100%" horizontalAlign="right" horizontalGap="18" paddingTop="20"> <mx:HBox width="100%" horizontalAlign="right" horizontalGap="18" paddingTop="20">

View File

@ -387,7 +387,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
* pop-up is opened from another pop-up. I delayed the second open to * pop-up is opened from another pop-up. I delayed the second open to
* avoid this case. - Chad * avoid this case. - Chad
*/ */
this.callLater( function() { this.callLater( function():void {
var micSettings:FlashMicSettings = PopUpManager.createPopUp(mdiCanvas, FlashMicSettings, true) as FlashMicSettings; var micSettings:FlashMicSettings = PopUpManager.createPopUp(mdiCanvas, FlashMicSettings, true) as FlashMicSettings;
micSettings.addEventListener(FlexEvent.CREATION_COMPLETE, function(e:Event):void { micSettings.addEventListener(FlexEvent.CREATION_COMPLETE, function(e:Event):void {
var point1:Point = new Point(); var point1:Point = new Point();
@ -628,22 +628,23 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
} }
private function openLockSettingsWindow(event:LockControlEvent):void { private function openLockSettingsWindow(event:LockControlEvent):void {
var conference:Conference = UserManager.getInstance().getConference(); var conference:Conference = UserManager.getInstance().getConference();
var lsv:LockSettingsVO = conference.getLockSettings(); var lsv:LockSettingsVO = conference.getLockSettings();
var popUp:IFlexDisplayObject = PopUpManager.createPopUp(mdiCanvas, LockSettings, true); var popUp:IFlexDisplayObject = PopUpManager.createPopUp(mdiCanvas, LockSettings, true);
var ls:LockSettings = LockSettings(popUp); var ls:LockSettings = LockSettings(popUp);
ls.disableCam = lsv.getDisableCam(); ls.disableCam = lsv.getDisableCam();
ls.disableMic = lsv.getDisableMic(); ls.disableMic = lsv.getDisableMic();
ls.disablePrivChat = lsv.getDisablePrivateChat(); ls.disablePrivChat = lsv.getDisablePrivateChat();
ls.disablePubChat = lsv.getDisablePublicChat(); ls.disablePubChat = lsv.getDisablePublicChat();
ls.lockedLayout = lsv.getLockedLayout(); ls.lockedLayout = lsv.getLockedLayout();
ls.lockOnJoin = lsv.getLockOnJoin();
var point1:Point = new Point(); var point1:Point = new Point();
point1.x = width/2; point1.x = width/2;
point1.y = height/2; point1.y = height/2;
ls.x = point1.x - (ls.width/2); ls.x = point1.x - (ls.width/2);
ls.y = point1.y - (ls.height/2); ls.y = point1.y - (ls.height/2);
} }
]]> ]]>
</mx:Script> </mx:Script>

View File

@ -645,24 +645,21 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
} }
private function lockSettingsChanged(e:Event):void { private function lockSettingsChanged(e:Event):void {
applyLockSettings(); applyLockSettings();
} }
private function applyLockSettings():void { private function applyLockSettings():void {
var userManager:UserManager = UserManager.getInstance();
if (UsersUtil.amIModerator() || UsersUtil.amIPresenter()) return; // Settings only affect viewers. var conference:Conference = userManager.getConference();
var me:BBBUser = conference.getMyUser();
var userManager:UserManager = UserManager.getInstance();
var conference:Conference = userManager.getConference(); if (publicChat) {
var me:BBBUser = conference.getMyUser(); txtMsgArea.enabled = sendBtn.enabled = !me.disableMyPublicChat;
} else {
if (publicChat) { txtMsgArea.enabled = sendBtn.enabled = !me.disableMyPrivateChat;
txtMsgArea.enabled = sendBtn.enabled = !me.disableMyPublicChat;
} else {
txtMsgArea.enabled = sendBtn.enabled = !me.disableMyPrivateChat;
}
} }
]]> }
]]>
</mx:Script> </mx:Script>

View File

@ -61,6 +61,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
import org.bigbluebutton.core.events.SwitchedLayoutEvent; import org.bigbluebutton.core.events.SwitchedLayoutEvent;
import org.bigbluebutton.core.managers.UserManager; import org.bigbluebutton.core.managers.UserManager;
import org.bigbluebutton.core.vo.LockSettingsVO; import org.bigbluebutton.core.vo.LockSettingsVO;
import org.bigbluebutton.main.model.users.BBBUser;
import org.bigbluebutton.main.model.users.Conference;
import org.bigbluebutton.main.views.MainToolbar; import org.bigbluebutton.main.views.MainToolbar;
import org.bigbluebutton.modules.layout.events.ChangeLayoutEvent; import org.bigbluebutton.modules.layout.events.ChangeLayoutEvent;
import org.bigbluebutton.modules.layout.events.ComboBoxCreatedEvent; import org.bigbluebutton.modules.layout.events.ComboBoxCreatedEvent;
@ -88,10 +90,9 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
} }
private function lockSettingsChanged(e:LockControlEvent):void { private function lockSettingsChanged(e:LockControlEvent):void {
var lockSettings:LockSettingsVO = UserManager.getInstance().getConference().getLockSettings(); var conference:Conference = UserManager.getInstance().getConference();
if (UsersUtil.amIModerator() || UsersUtil.amIPresenter()) return; var thisUser:BBBUser = conference.getMyUser();
this.enabled = ! thisUser.lockedLayout;
this.enabled = ! lockSettings.getLockedLayout();
} }
private function populateLayoutsList(e:LayoutsReadyEvent):void { private function populateLayoutsList(e:LayoutsReadyEvent):void {

View File

@ -38,25 +38,23 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
<mx:Script> <mx:Script>
<![CDATA[ <![CDATA[
import com.asfusion.mate.events.Dispatcher; import com.asfusion.mate.events.Dispatcher;
import flash.system.Security;
import flash.system.SecurityPanel;
import org.bigbluebutton.common.LogUtil;
import org.bigbluebutton.core.BBB;
import org.bigbluebutton.core.UsersUtil; import org.bigbluebutton.core.UsersUtil;
import org.bigbluebutton.core.managers.UserManager;
import org.bigbluebutton.main.events.BBBEvent; import org.bigbluebutton.main.events.BBBEvent;
import org.bigbluebutton.main.events.ShortcutEvent; import org.bigbluebutton.main.events.ShortcutEvent;
import org.bigbluebutton.main.model.users.BBBUser;
import org.bigbluebutton.main.model.users.Conference;
import org.bigbluebutton.main.views.MainToolbar; import org.bigbluebutton.main.views.MainToolbar;
import org.bigbluebutton.modules.phone.PhoneOptions; import org.bigbluebutton.modules.phone.PhoneOptions;
import org.bigbluebutton.modules.phone.events.AudioSelectionWindowEvent; import org.bigbluebutton.modules.phone.events.AudioSelectionWindowEvent;
import org.bigbluebutton.modules.phone.events.FlashJoinedListenOnlyVoiceConferenceEvent; import org.bigbluebutton.modules.phone.events.FlashJoinedListenOnlyVoiceConferenceEvent;
import org.bigbluebutton.modules.phone.events.FlashJoinedVoiceConferenceEvent; import org.bigbluebutton.modules.phone.events.FlashJoinedVoiceConferenceEvent;
import org.bigbluebutton.modules.phone.events.FlashLeftVoiceConferenceEvent; import org.bigbluebutton.modules.phone.events.FlashLeftVoiceConferenceEvent;
import org.bigbluebutton.modules.phone.events.FlashStopEchoTestCommand;
import org.bigbluebutton.modules.phone.events.JoinVoiceConferenceCommand; import org.bigbluebutton.modules.phone.events.JoinVoiceConferenceCommand;
import org.bigbluebutton.modules.phone.events.LeaveVoiceConferenceCommand; import org.bigbluebutton.modules.phone.events.LeaveVoiceConferenceCommand;
import org.bigbluebutton.modules.phone.events.WebRTCCallEvent; import org.bigbluebutton.modules.phone.events.WebRTCCallEvent;
import org.bigbluebutton.modules.phone.views.assets.Images;
import org.bigbluebutton.util.i18n.ResourceUtil; import org.bigbluebutton.util.i18n.ResourceUtil;
private static const LOG:String = "Phone::ToolbarButton - "; private static const LOG:String = "Phone::ToolbarButton - ";
@ -71,16 +69,25 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
[Bindable] public var phoneOptions:PhoneOptions = new PhoneOptions(); [Bindable] public var phoneOptions:PhoneOptions = new PhoneOptions();
private function startPhone():void { private function startPhone():void {
var conference:Conference = UserManager.getInstance().getConference();
var thisUser:BBBUser = conference.getMyUser();
trace(LOG + "startPhone 1 enabled=[" + enabled + "] selected=[" + selected + "]"); trace(LOG + "startPhone 1 enabled=[" + enabled + "] selected=[" + selected + "]");
// Disable the button right away to prevent the user from clicking // Disable the button right away to prevent the user from clicking
// multiple times. // multiple times.
this.enabled = false; this.enabled = false;
trace(LOG + "startPhone 2 enabled=[" + enabled + "] selected=[" + selected + "]"); trace(LOG + "startPhone 2 enabled=[" + enabled + "] selected=[" + selected + "]");
if (this.selected) { if (this.selected) {
//trace(LOG + "Sending Join Conference command"); if(thisUser.disableMyMic){
//dispatcher.dispatchEvent(new JoinVoiceConferenceCommand()); var command:JoinVoiceConferenceCommand = new JoinVoiceConferenceCommand();
trace(LOG + "Sending Show Audio Selection command"); command.mic = false;
dispatcher.dispatchEvent(new AudioSelectionWindowEvent(AudioSelectionWindowEvent.SHOW_AUDIO_SELECTION)); dispatcher.dispatchEvent(command);
} else {
//trace(LOG + "Sending Join Conference command");
//dispatcher.dispatchEvent(new JoinVoiceConferenceCommand());
trace(LOG + "Sending Show Audio Selection command");
dispatcher.dispatchEvent(new AudioSelectionWindowEvent(AudioSelectionWindowEvent.SHOW_AUDIO_SELECTION));
}
} else { } else {
trace(LOG + "Sending Leave Conference command"); trace(LOG + "Sending Leave Conference command");
dispatcher.dispatchEvent(new LeaveVoiceConferenceCommand()); dispatcher.dispatchEvent(new LeaveVoiceConferenceCommand());
@ -108,21 +115,27 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
} }
private function onCreationComplete():void { private function onCreationComplete():void {
var conference:Conference = UserManager.getInstance().getConference();
var thisUser:BBBUser = conference.getMyUser();
// when the button is added to the stage display the audio selection window if auto join is true // when the button is added to the stage display the audio selection window if auto join is true
if (phoneOptions.autoJoin) { if (phoneOptions.autoJoin) {
if (phoneOptions.skipCheck) { if (phoneOptions.skipCheck || thisUser.disableMyMic) {
var command:JoinVoiceConferenceCommand = new JoinVoiceConferenceCommand(); var command:JoinVoiceConferenceCommand = new JoinVoiceConferenceCommand();
if (phoneOptions.presenterShareOnly && !UsersUtil.amIPresenter() && !UsersUtil.amIModerator()) { if (
command.mic = false; (phoneOptions.presenterShareOnly && !UsersUtil.amIPresenter() && !UsersUtil.amIModerator())
} else { || thisUser.disableMyMic
command.mic = true; ) {
} command.mic = false;
} else {
dispatcher.dispatchEvent(command); command.mic = true;
} else { }
trace(LOG + "Sending Show Audio Selection command");
dispatcher.dispatchEvent(new AudioSelectionWindowEvent(AudioSelectionWindowEvent.SHOW_AUDIO_SELECTION)); dispatcher.dispatchEvent(command);
} } else {
trace(LOG + "Sending Show Audio Selection command");
dispatcher.dispatchEvent(new AudioSelectionWindowEvent(AudioSelectionWindowEvent.SHOW_AUDIO_SELECTION));
}
} }
} }

View File

@ -132,10 +132,24 @@ package org.bigbluebutton.modules.users.services
break; break;
case "permissionsSettingsChanged": case "permissionsSettingsChanged":
handlePermissionsSettingsChanged(message); handlePermissionsSettingsChanged(message);
break;
case "userLocked":
handleUserLocked(message);
break; break;
} }
} }
private function handleUserLocked(msg:Object):void {
trace(LOG + "*** handleUserLocked " + msg.msg + " **** \n");
var map:Object = JSON.parse(msg.msg);
var user:BBBUser = UsersUtil.getUser(map.user);
if(user.userLocked != map.lock)
user.lockStatusChanged(map.lock);
return;
}
private function handleMeetingHasEnded(msg: Object):void { private function handleMeetingHasEnded(msg: Object):void {
trace(LOG + "*** handleMeetingHasEnded " + msg.msg + " **** \n"); trace(LOG + "*** handleMeetingHasEnded " + msg.msg + " **** \n");
} }
@ -147,7 +161,8 @@ package org.bigbluebutton.modules.users.services
map.disableMic, map.disableMic,
map.disablePrivChat, map.disablePrivChat,
map.disablePubChat, map.disablePubChat,
map.lockedLayout); map.lockedLayout,
map.lockOnJoin);
UserManager.getInstance().getConference().setLockSettings(lockSettings); UserManager.getInstance().getConference().setLockSettings(lockSettings);
} }
@ -185,7 +200,7 @@ package org.bigbluebutton.modules.users.services
var perm:Object = map.permissions; var perm:Object = map.permissions;
var lockSettings:LockSettingsVO = new LockSettingsVO(perm.disableCam, perm.disableMic, var lockSettings:LockSettingsVO = new LockSettingsVO(perm.disableCam, perm.disableMic,
perm.disablePrivChat, perm.disablePubChat, perm.lockedLayout); perm.disablePrivChat, perm.disablePubChat, perm.lockedLayout, perm.lockOnJoin);
UserManager.getInstance().getConference().setLockSettings(lockSettings); UserManager.getInstance().getConference().setLockSettings(lockSettings);
MeetingModel.getInstance().meetingMuted = map.meetingMuted; MeetingModel.getInstance().meetingMuted = map.meetingMuted;
@ -296,7 +311,7 @@ package org.bigbluebutton.modules.users.services
l.voiceMuted = false; l.voiceMuted = false;
l.voiceJoined = false; l.voiceJoined = false;
l.talking = false; l.talking = false;
l.userLocked = false; //l.userLocked = false;
trace(LOG + "notifying views that user has left voice. id[" + voiceUser.userId + "]"); trace(LOG + "notifying views that user has left voice. id[" + voiceUser.userId + "]");
var bbbEvent:BBBEvent = new BBBEvent(BBBEvent.USER_VOICE_LEFT); var bbbEvent:BBBEvent = new BBBEvent(BBBEvent.USER_VOICE_LEFT);
@ -429,7 +444,7 @@ package org.bigbluebutton.modules.users.services
bu.voiceMuted = voiceUser.muted; bu.voiceMuted = voiceUser.muted;
bu.voiceJoined = voiceUser.joined; bu.voiceJoined = voiceUser.joined;
bu.talking = voiceUser.talking; bu.talking = voiceUser.talking;
bu.userLocked = voiceUser.locked; //bu.userLocked = voiceUser.locked;
} }
} }
@ -524,7 +539,8 @@ package org.bigbluebutton.modules.users.services
user.externUserID = joinedUser.externUserID; user.externUserID = joinedUser.externUserID;
user.isLeavingFlag = false; user.isLeavingFlag = false;
user.listenOnly = joinedUser.listenOnly; user.listenOnly = joinedUser.listenOnly;
user.userLocked = joinedUser.locked;
trace(LOG + "User status: hasStream " + joinedUser.hasStream); trace(LOG + "User status: hasStream " + joinedUser.hasStream);
trace(LOG + "Joined as [" + user.userID + "," + user.name + "," + user.role + "," + joinedUser.hasStream + "]"); trace(LOG + "Joined as [" + user.userID + "," + user.name + "," + user.role + "," + joinedUser.hasStream + "]");

View File

@ -298,8 +298,22 @@ package org.bigbluebutton.modules.users.services
* Set lock state of all users in the room, except the users listed in second parameter * Set lock state of all users in the room, except the users listed in second parameter
* */ * */
public function setUserLock(internalUserID:String, lock:Boolean):void { public function setUserLock(internalUserID:String, lock:Boolean):void {
var message:Object = new Object();
return; message["userId"] = internalUserID;
message["lock"] = lock;
trace("Sending lockRequest");
var _nc:ConnectionManager = BBB.initConnectionManager();
_nc.sendMessage(
"lock.setUserLock",
function(result:String):void { // On successful result
LogUtil.debug(result);
},
function(status:String):void { // status - On error occurred
LogUtil.error(status);
},
message
);
/* /*
var nc:NetConnection = _module.connection; var nc:NetConnection = _module.connection;
nc.call( nc.call(

View File

@ -31,25 +31,17 @@
<mx:Script> <mx:Script>
<![CDATA[ <![CDATA[
import com.asfusion.mate.events.Dispatcher;
import mx.binding.utils.BindingUtils; import mx.binding.utils.BindingUtils;
import mx.controls.Alert;
import mx.events.FlexEvent; import mx.events.FlexEvent;
import mx.events.ListEvent;
import org.bigbluebutton.common.Images; import org.bigbluebutton.common.Images;
import org.bigbluebutton.common.LogUtil;
import org.bigbluebutton.common.Role; import org.bigbluebutton.common.Role;
import org.bigbluebutton.core.events.LockControlEvent; import org.bigbluebutton.core.events.LockControlEvent;
import org.bigbluebutton.core.events.VoiceConfEvent; import org.bigbluebutton.core.events.VoiceConfEvent;
import org.bigbluebutton.core.managers.UserManager; import org.bigbluebutton.core.managers.UserManager;
import org.bigbluebutton.main.events.BBBEvent; import org.bigbluebutton.core.vo.LockSettingsVO;
import org.bigbluebutton.main.events.StoppedViewingWebcamEvent;
import org.bigbluebutton.main.model.users.BBBUser; import org.bigbluebutton.main.model.users.BBBUser;
import org.bigbluebutton.main.model.users.Conference;
import org.bigbluebutton.main.model.users.events.KickUserEvent; import org.bigbluebutton.main.model.users.events.KickUserEvent;
import org.bigbluebutton.main.model.users.events.LowerHandEvent;
import org.bigbluebutton.modules.users.events.UsersRollEvent; import org.bigbluebutton.modules.users.events.UsersRollEvent;
import org.bigbluebutton.modules.users.events.ViewCameraEvent; import org.bigbluebutton.modules.users.events.ViewCameraEvent;
import org.bigbluebutton.modules.users.model.UsersOptions; import org.bigbluebutton.modules.users.model.UsersOptions;
@ -158,10 +150,11 @@
// reset the mute image filter so the talking indicator doesn't stick // reset the mute image filter so the talking indicator doesn't stick
muteImg.filters = null; muteImg.filters = null;
var ls:LockSettingsVO = UserManager.getInstance().getConference().getLockSettings();
if (data != null) { if (data != null) {
kickUserBtn.visible = !data.me && rolledOver && options.allowKickUser; kickUserBtn.visible = !data.me && rolledOver && options.allowKickUser;
if (!data.voiceJoined) { if (!data.voiceJoined) {
if (data.listenOnly) { if (data.listenOnly) {
muteImg.source = images.sound; muteImg.source = images.sound;
@ -173,11 +166,10 @@
muteImg.visible = false; muteImg.visible = false;
muteImg.includeInLayout = false; muteImg.includeInLayout = false;
muteBtn.visible = false; muteBtn.visible = false;
muteBtn.includeInLayout = true; muteBtn.includeInLayout = true;
} }
} else { } else {
if (data.userLocked && UserManager.getInstance().getConference().getLockSettings().getDisableMic()) { if (data.userLocked && ls.getDisableMic()) {
muteImg.visible = true; muteImg.visible = true;
muteImg.includeInLayout = true; muteImg.includeInLayout = true;
muteBtn.visible = false; muteBtn.visible = false;
@ -197,7 +189,7 @@
} }
//If it's not a moderator, it always can be locked. //If it's not a moderator, it always can be locked.
if( data.role != BBBUser.MODERATOR && data.userLocked == true){ if( data.role != BBBUser.MODERATOR && ls.isAnythingLocked() ){
lockImg.visible = !rolledOver; lockImg.visible = !rolledOver;
lockImg.includeInLayout = !rolledOver; lockImg.includeInLayout = !rolledOver;
lockBtn.visible = rolledOver; lockBtn.visible = rolledOver;
@ -240,11 +232,12 @@
} }
if ((data.role != Role.MODERATOR && !data.presenter) && if ( data.userLocked && !data.presenter && ls.isAnythingLocked() ) {
(data.disableMyCam || data.disableMyMic || data.disableMyPrivateChat || data.disableMyPublicChat))
lockImg.source = images.locked_20; lockImg.source = images.locked_20;
else }
else {
lockImg.source = null; lockImg.source = null;
}
} else { } else {
if (data.voiceMuted == rolledOverMute) if (data.voiceMuted == rolledOverMute)
muteBtn.setStyle("icon", images.audio); muteBtn.setStyle("icon", images.audio);

View File

@ -125,8 +125,7 @@
roomMuted = MeetingModel.getInstance().meetingMuted; roomMuted = MeetingModel.getInstance().meetingMuted;
var lockSettings:LockSettingsVO = UserManager.getInstance().getConference().getLockSettings(); var lockSettings:LockSettingsVO = UserManager.getInstance().getConference().getLockSettings();
roomLocked = lockSettings.getDisableCam() || lockSettings.getDisableMic() || lockSettings.getDisablePrivateChat() roomLocked = lockSettings.isAnythingLocked();
|| lockSettings.getDisablePublicChat() || lockSettings.getLockedLayout();
titleBarOverlay.tabIndex = partOptions.baseTabIndex; titleBarOverlay.tabIndex = partOptions.baseTabIndex;
minimizeBtn.tabIndex = partOptions.baseTabIndex+1; minimizeBtn.tabIndex = partOptions.baseTabIndex+1;
@ -275,8 +274,7 @@
private function handleChangedLockSettingsEvent(e:LockControlEvent):void { private function handleChangedLockSettingsEvent(e:LockControlEvent):void {
var lockSettings:LockSettingsVO = UserManager.getInstance().getConference().getLockSettings(); var lockSettings:LockSettingsVO = UserManager.getInstance().getConference().getLockSettings();
roomLocked = lockSettings.getDisableCam() || lockSettings.getDisableMic() || lockSettings.getDisablePrivateChat() roomLocked = lockSettings.isAnythingLocked();
|| lockSettings.getDisablePublicChat() || lockSettings.getLockedLayout();
} }
private function lockSettings():void { private function lockSettings():void {
@ -286,7 +284,7 @@
dispatcher.dispatchEvent(event); dispatcher.dispatchEvent(event);
} }
private function unlockAll():void { /*private function unlockAll():void {
LogUtil.traceObject("Action: unlockAll"); LogUtil.traceObject("Action: unlockAll");
if (amIModerator) { if (amIModerator) {
if (roomLocked) { if (roomLocked) {
@ -325,6 +323,7 @@
} }
} }
} }
*/
private function handleMeetingMuted(e:MeetingMutedEvent):void { private function handleMeetingMuted(e:MeetingMutedEvent):void {
roomMuted = MeetingModel.getInstance().meetingMuted; roomMuted = MeetingModel.getInstance().meetingMuted;

View File

@ -63,36 +63,28 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
private var dispatcher:Dispatcher; private var dispatcher:Dispatcher;
private var _this:Button ;
public function lockSettingsChanged(e:*):void{ public function lockSettingsChanged(e:*):void{
if (UsersUtil.amIModerator() || UsersUtil.amIPresenter()){
// Ignore lock setting changes as
// or presenter we are moderator.
return;
}
var userManager:UserManager = UserManager.getInstance(); var userManager:UserManager = UserManager.getInstance();
var conference:Conference = userManager.getConference(); var conference:Conference = userManager.getConference();
var me:BBBUser = conference.getMyUser(); var me:BBBUser = conference.getMyUser();
this.visible = !me.disableMyCam; _this.visible = !me.disableMyCam;
this.includeInLayout = !me.disableMyCam; _this.includeInLayout = !me.disableMyCam;
} }
private function init():void{ private function init():void{
_this = this;
dispatcher = new Dispatcher(); dispatcher = new Dispatcher();
this.toolTip = ResourceUtil.getInstance().getString('bbb.toolbar.video.toolTip.start'); this.toolTip = ResourceUtil.getInstance().getString('bbb.toolbar.video.toolTip.start');
this.styleName = "webcamDefaultButtonStyle"; this.styleName = "webcamDefaultButtonStyle";
this.enabled = true; this.enabled = true;
this.selected = false; this.selected = false;
_currentState = OFF_STATE; _currentState = OFF_STATE;
lockSettingsChanged(null); lockSettingsChanged(null);
} }
public function set isPresenter(presenter:Boolean):void {
visible = presenter;
}
public function remoteClick(e:ShortcutEvent):void{ public function remoteClick(e:ShortcutEvent):void{
openPublishWindow(); openPublishWindow();
dispatchEvent(new ShortcutEvent(ShortcutEvent.REMOTE_FOCUS_WEBCAM)); dispatchEvent(new ShortcutEvent(ShortcutEvent.REMOTE_FOCUS_WEBCAM));
@ -114,6 +106,9 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
} }
} }
public function set isPresenter (presenter:Boolean):void{
//Nothing
}
private function openPublishWindow():void{ private function openPublishWindow():void{
if(_currentState == ON_STATE) { if(_currentState == ON_STATE) {

View File

@ -221,7 +221,12 @@ Handlebars.registerHelper "visibility", (section) ->
# Meteor.call('userToggleCam', context._id, !context.sharingVideo) # Meteor.call('userToggleCam', context._id, !context.sharingVideo)
@toggleChatbar = -> @toggleChatbar = ->
setInSession "display_chatbar", !getInSession "display_chatbar" if getInSession("display_chatbar") and isOnlyOnePanelOpen()
setInSession "display_usersList", true
setInSession "display_whiteboard", true
setInSession "display_chatbar", true
else
setInSession "display_chatbar", !getInSession "display_chatbar"
setTimeout(redrawWhiteboard, 0) setTimeout(redrawWhiteboard, 0)
@toggleMic = (event) -> @toggleMic = (event) ->
@ -234,7 +239,12 @@ Handlebars.registerHelper "visibility", (section) ->
# toggle state of session variable # toggle state of session variable
@toggleUsersList = -> @toggleUsersList = ->
setInSession "display_usersList", !getInSession "display_usersList" if getInSession("display_usersList") and isOnlyOnePanelOpen()
setInSession "display_usersList", true
setInSession "display_whiteboard", true
setInSession "display_chatbar", true
else
setInSession "display_usersList", !getInSession "display_usersList"
setTimeout(redrawWhiteboard, 0) setTimeout(redrawWhiteboard, 0)
@toggleVoiceCall = (event) -> @toggleVoiceCall = (event) ->
@ -250,7 +260,12 @@ Handlebars.registerHelper "visibility", (section) ->
return false return false
@toggleWhiteBoard = -> @toggleWhiteBoard = ->
setInSession "display_whiteboard", !getInSession "display_whiteboard" if getInSession("display_whiteboard") and isOnlyOnePanelOpen()
setInSession "display_usersList", true
setInSession "display_whiteboard", true
setInSession "display_chatbar", true
else
setInSession "display_whiteboard", !getInSession "display_whiteboard"
setTimeout(redrawWhiteboard, 0) setTimeout(redrawWhiteboard, 0)
@toggleSlidingMenu = -> @toggleSlidingMenu = ->
@ -306,7 +321,10 @@ Handlebars.registerHelper "visibility", (section) ->
# assign the default values for the Session vars # assign the default values for the Session vars
@setDefaultSettings = -> @setDefaultSettings = ->
# console.log "in setDefaultSettings" # console.log "in setDefaultSettings"
setInSession "display_usersList", true if isLandscapeMobile()
setInSession "display_usersList", false
else
setInSession "display_usersList", true
setInSession "display_navbar", true setInSession "display_navbar", true
setInSession "display_chatbar", true setInSession "display_chatbar", true
setInSession "display_whiteboard", true setInSession "display_whiteboard", true
@ -346,6 +364,7 @@ Handlebars.registerHelper "visibility", (section) ->
@listSessionVars = -> @listSessionVars = ->
console.log SessionAmplify.keys console.log SessionAmplify.keys
# Checks if the view is portrait and a mobile device is being used # Checks if the view is portrait and a mobile device is being used
@isPortraitMobile = () -> @isPortraitMobile = () ->
window.matchMedia('(orientation: portrait)').matches and # browser is portrait window.matchMedia('(orientation: portrait)').matches and # browser is portrait
@ -355,4 +374,21 @@ Handlebars.registerHelper "visibility", (section) ->
navigator.userAgent.match(/BlackBerry/i) or navigator.userAgent.match(/BlackBerry/i) or
navigator.userAgent.match(/Opera Mini/i) or navigator.userAgent.match(/Opera Mini/i) or
navigator.userAgent.match(/IEMobile/i) or navigator.userAgent.match(/IEMobile/i) or
navigator.userAgent.match(/webOS/i)) navigator.userAgent.match(/webOS/i))
# Checks if the view is landscape and mobile device is being used
@isLandscapeMobile = () ->
window.matchMedia('(orientation: landscape)').matches and # browser is landscape
window.matchMedia('(min-device-aspect-ratio: 1/1)').matches and # device is landscape
(navigator.userAgent.match(/Android/i) or # device is one of the mobile gadgets
navigator.userAgent.match(/iPad/i) or
navigator.userAgent.match(/iPhone/i) or
navigator.userAgent.match(/iPod/i) or
navigator.userAgent.match(/Windows Phone/i) or
navigator.userAgent.match(/BlackBerry/i) or
navigator.userAgent.match(/webOS/i))
# Checks if only one panel (userlist/whiteboard/chatbar) is currently open
@isOnlyOnePanelOpen = () ->
#(getInSession "display_usersList" ? 1 : 0) + (getInSession "display_whiteboard" ? 1 : 0) + (getInSession "display_chatbar" ? 1 : 0) is 1
getInSession("display_usersList") + getInSession("display_whiteboard") + getInSession("display_chatbar") is 1

View File

@ -18,7 +18,7 @@ config.maxChatLength = 140
config.app = {} config.app = {}
# server ip # server ip
config.app.logOutUrl = "http://192.168.0.119/demo/demoHTML5.jsp" # TODO temporary config.app.logOutUrl = "http://192.168.0.215/demo/demoHTML5.jsp" # TODO temporary
#default font sizes for mobile / desktop #default font sizes for mobile / desktop
config.app.mobileFont = 24 config.app.mobileFont = 24