diff --git a/akka-bbb-apps/src/main/java/org/bigbluebutton/core/recorders/events/ParticipantJoinRecordEvent.java b/akka-bbb-apps/src/main/java/org/bigbluebutton/core/recorders/events/ParticipantJoinRecordEvent.java
index 7baa42bdf9..abb4121aaa 100755
--- a/akka-bbb-apps/src/main/java/org/bigbluebutton/core/recorders/events/ParticipantJoinRecordEvent.java
+++ b/akka-bbb-apps/src/main/java/org/bigbluebutton/core/recorders/events/ParticipantJoinRecordEvent.java
@@ -28,6 +28,10 @@ public class ParticipantJoinRecordEvent extends AbstractParticipantRecordEvent {
public void setUserId(String userId) {
eventMap.put("userId", userId);
}
+
+ public void setExternalUserId(String externalUserId) {
+ eventMap.put("externalUserId", externalUserId);
+ }
public void setName(String name){
eventMap.put("name",name);
diff --git a/akka-bbb-apps/src/main/resources/application.conf b/akka-bbb-apps/src/main/resources/application.conf
index ebad7b0a98..2d7ca78d60 100755
--- a/akka-bbb-apps/src/main/resources/application.conf
+++ b/akka-bbb-apps/src/main/resources/application.conf
@@ -43,7 +43,6 @@ http {
services {
bbbWebAPI = "http://192.168.23.33/bigbluebutton/api"
sharedSecret = "changeme"
- defaultPresentationURL = "http://localhost/default.pdf"
}
red5 {
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/SystemConfiguration.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/SystemConfiguration.scala
index bab60d2cf6..83d3b7ccee 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/SystemConfiguration.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/SystemConfiguration.scala
@@ -18,7 +18,6 @@ trait SystemConfiguration {
lazy val bbbWebSharedSecret = Try(config.getString("services.sharedSecret")).getOrElse("changeme")
lazy val bbbWebModeratorPassword = Try(config.getString("services.moderatorPassword")).getOrElse("changeme")
lazy val bbbWebViewerPassword = Try(config.getString("services.viewerPassword")).getOrElse("changeme")
- lazy val bbbWebDefaultPresentationURL = Try(config.getString("services.defaultPresentationURL")).getOrElse("changeme")
lazy val keysExpiresInSec = Try(config.getInt("redis.keyExpiry")).getOrElse(14 * 86400) // 14 days
lazy val red5DeskShareIP = Try(config.getString("red5.deskshareip")).getOrElse("127.0.0.1")
lazy val red5DeskShareApp = Try(config.getString("red5.deskshareapp")).getOrElse("")
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/JsonMessageSenderActor.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/JsonMessageSenderActor.scala
index 4cf69b2aea..9ec02759c9 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/JsonMessageSenderActor.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/JsonMessageSenderActor.scala
@@ -94,7 +94,7 @@ class JsonMessageSenderActor(val service: MessageSender)
private def handleCreateBreakoutRoom(msg: CreateBreakoutRoom) {
val payload = new CreateBreakoutRoomRequestPayload(msg.room.breakoutId, msg.room.parentId, msg.room.name,
msg.room.voiceConfId, msg.room.viewerPassword, msg.room.moderatorPassword,
- msg.room.durationInMinutes, msg.room.defaultPresentationURL, msg.room.record)
+ msg.room.durationInMinutes, msg.room.sourcePresentationId, msg.room.sourcePresentationSlide, msg.room.record)
val request = new CreateBreakoutRoomRequest(payload)
service.send(MessagingConstants.FROM_MEETING_CHANNEL, request.toJson())
}
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/LiveMeeting.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/LiveMeeting.scala
index 51da9d7816..9514ab2203 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/LiveMeeting.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/LiveMeeting.scala
@@ -117,7 +117,7 @@ class LiveMeeting(val mProps: MeetingProperties,
meetingModel.meetingHasEnded
/**
- * See if this meeting has breakout rooms. If so, we also need to end them.
+ * Check if this meeting has breakout rooms. If so, we also need to end them.
*/
handleEndAllBreakoutRooms(new EndAllBreakoutRooms(msg.meetingId))
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/Protocol.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/Protocol.scala
index 983d2b3a17..2f74e5b527 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/Protocol.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/Protocol.scala
@@ -33,7 +33,7 @@ object UserMessagesProtocol extends DefaultJsonProtocol {
implicit val inMsgHeaderFormat = jsonFormat1(InMessageHeader)
implicit val outMsgHeaderFormat = jsonFormat1(OutMsgHeader)
implicit val outMsgEnvelopeHeaderFormat = jsonFormat2(OutMsgEnvelopeHeader)
- implicit val createBreakoutRoomOutMsgPayloadFormat = jsonFormat8(CreateBreakoutRoomOutMsgPayload)
+ implicit val createBreakoutRoomOutMsgPayloadFormat = jsonFormat10(CreateBreakoutRoomOutMsgPayload)
implicit val createBreakoutRoomOutMsgEnvelopePayloadFormat = jsonFormat2(CreateBreakoutRoomOutMsgEnvelopePayload)
implicit val createBreakoutRoomOutMsgEnvelopeFormat = jsonFormat2(CreateBreakoutRoomOutMsgEnvelope)
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/ProtocolMessages.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/ProtocolMessages.scala
index d267829b66..35e0601bc9 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/ProtocolMessages.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/ProtocolMessages.scala
@@ -5,12 +5,10 @@ case class OutMsgEnvelopeHeader(`type`: MessageType.MessageType, address: String
trait OutMessage
-case class CreateBreakoutRoomOutMsgEnvelope(header: OutMsgEnvelopeHeader,
- payload: CreateBreakoutRoomOutMsgEnvelopePayload)
-case class CreateBreakoutRoomOutMsgEnvelopePayload(header: OutMsgHeader,
- payload: CreateBreakoutRoomOutMsgPayload)
+case class CreateBreakoutRoomOutMsgEnvelope(header: OutMsgEnvelopeHeader, payload: CreateBreakoutRoomOutMsgEnvelopePayload)
+case class CreateBreakoutRoomOutMsgEnvelopePayload(header: OutMsgHeader, payload: CreateBreakoutRoomOutMsgPayload)
case class CreateBreakoutRoomOutMsgPayload(breakoutId: String, name: String, parentId: String,
voiceConfId: String, durationInMinutes: Int,
moderatorPassword: String, viewerPassword: String,
- defaultPresentationUrl: String)
+ sourcePresentationId: String, sourcePresentationSlide: Int, record: Boolean)
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/RecorderActor.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/RecorderActor.scala
index 514cc5f3a3..0371fe8849 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/RecorderActor.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/RecorderActor.scala
@@ -196,6 +196,7 @@ class RecorderActor(val recorder: RecorderApplication)
val ev = new ParticipantJoinRecordEvent();
ev.setTimestamp(TimestampGenerator.generateTimestamp);
ev.setUserId(msg.user.userID);
+ ev.setExternalUserId(msg.user.externUserID);
ev.setName(msg.user.name);
ev.setMeetingId(msg.meetingID);
ev.setRole(msg.user.role.toString());
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/OutMessages.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/OutMessages.scala
index 8f73e46d3f..a356e84547 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/OutMessages.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/OutMessages.scala
@@ -33,7 +33,7 @@ case class CreateBreakoutRoom(meetingId: String, room: BreakoutRoomOutPayload) e
case class EndBreakoutRoom(breakoutId: String) extends IOutMessage
case class BreakoutRoomOutPayload(breakoutId: String, name: String, parentId: String,
voiceConfId: String, durationInMinutes: Int, moderatorPassword: String, viewerPassword: String,
- defaultPresentationURL: String, record: Boolean)
+ sourcePresentationId: String, sourcePresentationSlide: Int, record: Boolean)
case class BreakoutRoomJoinURLOutMessage(meetingId: String, recorded: Boolean, breakoutId: String, userId: String, joinURL: String) extends IOutMessage
case class BreakoutRoomStartedOutMessage(meetingId: String, recorded: Boolean, breakout: BreakoutRoomBody) extends IOutMessage
case class BreakoutRoomBody(name: String, breakoutId: String)
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/BreakoutRoomApp.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/BreakoutRoomApp.scala
index 223374c1cb..90a1d236a4 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/BreakoutRoomApp.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/BreakoutRoomApp.scala
@@ -20,15 +20,6 @@ trait BreakoutRoomApp extends SystemConfiguration {
val outGW: OutMessageGateway
val eventBus: IncomingEventBus
- def getDefaultPresentationURL(): String = {
- var presURL = bbbWebDefaultPresentationURL
- val page = presModel.getCurrentPage()
- page foreach { p =>
- presURL = BreakoutRoomsUtil.fromSWFtoPDF(p.swfUri)
- }
- presURL
- }
-
def handleBreakoutRoomsList(msg: BreakoutRoomsListMessage) {
val breakoutRooms = breakoutModel.getRooms().toVector map { r => new BreakoutRoomBody(r.name, r.id) }
outGW.send(new BreakoutRoomsListOutMessage(mProps.meetingID, breakoutRooms, breakoutModel.pendingRoomsNumber == 0 && breakoutRooms.length > 0));
@@ -40,17 +31,20 @@ trait BreakoutRoomApp extends SystemConfiguration {
log.warning("CreateBreakoutRooms event received while {} are pending to be created for meeting {}", breakoutModel.pendingRoomsNumber, mProps.meetingID)
return
}
+
var i = 0
+ val sourcePresentationId = presModel.getCurrentPresentation().get.id
+ val sourcePresentationSlide = presModel.getCurrentPage().get.num
breakoutModel.pendingRoomsNumber = msg.rooms.length;
+
for (room <- msg.rooms) {
i += 1
- val presURL = bbbWebDefaultPresentationURL
val breakoutMeetingId = BreakoutRoomsUtil.createMeetingId(mProps.meetingID, i)
val voiceConfId = BreakoutRoomsUtil.createVoiceConfId(mProps.voiceBridge, i)
- val r = breakoutModel.createBreakoutRoom(breakoutMeetingId, room.name, voiceConfId, room.users, presURL)
+ val r = breakoutModel.createBreakoutRoom(breakoutMeetingId, room.name, voiceConfId, room.users)
val p = new BreakoutRoomOutPayload(r.id, r.name, mProps.meetingID,
r.voiceConfId, msg.durationInMinutes, mProps.moderatorPass, mProps.viewerPass,
- r.defaultPresentationURL, msg.record)
+ sourcePresentationId, sourcePresentationSlide, msg.record)
outGW.send(new CreateBreakoutRoom(mProps.meetingID, p))
}
meetingModel.breakoutRoomsdurationInMinutes = msg.durationInMinutes;
@@ -85,7 +79,7 @@ trait BreakoutRoomApp extends SystemConfiguration {
breakoutModel.getRooms().foreach { room =>
breakoutModel.getAssignedUsers(room.id) foreach { users =>
users.foreach { u =>
- log.debug("## Sending Join URL for users: {}", u);
+ log.debug("Sending Join URL for users: {}", u);
sendJoinURL(u, room.id)
}
}
@@ -181,7 +175,7 @@ object BreakoutRoomsUtil {
}
def joinParams(username: String, userId: String, isBreakout: Boolean, breakoutId: String,
- password: String, redirect: Boolean): mutable.Map[String, String] = {
+ password: String, redirect: Boolean): mutable.Map[String, String] = {
val params = new collection.mutable.HashMap[String, String]
params += "fullName" -> urlEncode(username)
params += "userID" -> urlEncode(userId + "-" + breakoutId.substring(breakoutId.lastIndexOf("-") + 1));
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/BreakoutRoomModel.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/BreakoutRoomModel.scala
index 854f4fdbdf..5ec8a3f6d9 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/BreakoutRoomModel.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/BreakoutRoomModel.scala
@@ -5,7 +5,7 @@ import scala.collection.immutable.HashMap
case class BreakoutUser(id: String, name: String)
case class BreakoutRoom(id: String, name: String, voiceConfId: String,
- assignedUsers: Vector[String], users: Vector[BreakoutUser], defaultPresentationURL: String)
+ assignedUsers: Vector[String], users: Vector[BreakoutUser])
class BreakoutRoomModel {
private var rooms = new collection.immutable.HashMap[String, BreakoutRoom]
@@ -22,8 +22,8 @@ class BreakoutRoomModel {
}
def createBreakoutRoom(id: String, name: String, voiceConfId: String,
- assignedUsers: Vector[String], defaultPresentationURL: String): BreakoutRoom = {
- val room = new BreakoutRoom(id, name, voiceConfId, assignedUsers, Vector(), defaultPresentationURL)
+ assignedUsers: Vector[String]): BreakoutRoom = {
+ val room = new BreakoutRoom(id, name, voiceConfId, assignedUsers, Vector())
add(room)
}
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PresentationApp.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PresentationApp.scala
index b3046554c2..3efc4b9c69 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PresentationApp.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PresentationApp.scala
@@ -94,16 +94,10 @@ trait PresentationApp {
}
def handleGotoSlide(msg: GotoSlide) {
- // println("Received GotoSlide for meeting=[" + msg.meetingID + "] page=[" + msg.page + "]")
- // println("*** Before change page ****")
- // printPresentations
presModel.changePage(msg.page) foreach { page =>
- // println("Switching page for meeting=[" + msg.meetingID + "] page=[" + page.id + "]")
+ log.debug("Switching page for meeting=[{}] page=[{}]", msg.meetingID, page.num);
outGW.send(new GotoSlideOutMsg(mProps.meetingID, mProps.recorded, page))
-
}
- // println("*** After change page ****")
- // printPresentations
usersModel.getCurrentPresenter() foreach { pres =>
handleStopPollRequest(StopPollRequest(mProps.meetingID, pres.userID))
diff --git a/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/freeswitch/ConnectionManager.java b/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/freeswitch/ConnectionManager.java
index d428d8d37f..9e0ce5d500 100755
--- a/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/freeswitch/ConnectionManager.java
+++ b/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/freeswitch/ConnectionManager.java
@@ -29,7 +29,7 @@ import org.bigbluebutton.freeswitch.voice.freeswitch.actions.EjectUserCommand;
import org.bigbluebutton.freeswitch.voice.freeswitch.actions.GetAllUsersCommand;
import org.bigbluebutton.freeswitch.voice.freeswitch.actions.MuteUserCommand;
import org.bigbluebutton.freeswitch.voice.freeswitch.actions.RecordConferenceCommand;
-import org.bigbluebutton.freeswitch.voice.freeswitch.actions.TransferUsetToMeetingCommand;
+import org.bigbluebutton.freeswitch.voice.freeswitch.actions.TransferUserToMeetingCommand;
import org.bigbluebutton.freeswitch.voice.freeswitch.actions.*;
import org.freeswitch.esl.client.inbound.Client;
import org.freeswitch.esl.client.inbound.InboundConnectionFailure;
@@ -128,7 +128,7 @@ public class ConnectionManager {
}
}
- public void tranfer(TransferUsetToMeetingCommand tutmc) {
+ public void tranfer(TransferUserToMeetingCommand tutmc) {
Client c = manager.getESLClient();
if (c.canSend()) {
c.sendAsyncApiCommand(tutmc.getCommand(), tutmc.getCommandArgs());
diff --git a/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/freeswitch/FreeswitchApplication.java b/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/freeswitch/FreeswitchApplication.java
index c31f6768ac..3a178e2874 100755
--- a/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/freeswitch/FreeswitchApplication.java
+++ b/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/freeswitch/FreeswitchApplication.java
@@ -31,7 +31,7 @@ import org.bigbluebutton.freeswitch.voice.freeswitch.actions.FreeswitchCommand;
import org.bigbluebutton.freeswitch.voice.freeswitch.actions.GetAllUsersCommand;
import org.bigbluebutton.freeswitch.voice.freeswitch.actions.MuteUserCommand;
import org.bigbluebutton.freeswitch.voice.freeswitch.actions.RecordConferenceCommand;
-import org.bigbluebutton.freeswitch.voice.freeswitch.actions.TransferUsetToMeetingCommand;
+import org.bigbluebutton.freeswitch.voice.freeswitch.actions.TransferUserToMeetingCommand;
import org.bigbluebutton.freeswitch.voice.freeswitch.actions.*;
public class FreeswitchApplication {
@@ -48,9 +48,12 @@ public class FreeswitchApplication {
private final String USER = "0"; /* not used for now */
private volatile boolean sendMessages = false;
+
+ private final String audioProfile;
- public FreeswitchApplication(ConnectionManager manager) {
+ public FreeswitchApplication(ConnectionManager manager, String profile) {
this.manager = manager;
+ this.audioProfile = profile;
}
private void queueMessage(FreeswitchCommand command) {
@@ -62,12 +65,13 @@ public class FreeswitchApplication {
}
}
- public void transferUserToMeeting(String voiceConfId,
- String targetVoiceConfId, String voiceUserId) {
- TransferUsetToMeetingCommand tutmc = new TransferUsetToMeetingCommand(
- voiceConfId, targetVoiceConfId, voiceUserId, USER);
- queueMessage(tutmc);
- }
+ public void transferUserToMeeting(String voiceConfId,
+ String targetVoiceConfId, String voiceUserId) {
+ TransferUserToMeetingCommand tutmc = new TransferUserToMeetingCommand(
+ voiceConfId, targetVoiceConfId, voiceUserId, this.audioProfile,
+ USER);
+ queueMessage(tutmc);
+ }
public void start() {
sendMessages = true;
@@ -153,8 +157,8 @@ public class FreeswitchApplication {
EjectAllUsersCommand cmd = (EjectAllUsersCommand) command;
System.out.println("Sending EjectAllUsersCommand for conference = [" + cmd.getRoom() + "]");
manager.ejectAll(cmd);
- } else if (command instanceof TransferUsetToMeetingCommand) {
- TransferUsetToMeetingCommand cmd = (TransferUsetToMeetingCommand) command;
+ } else if (command instanceof TransferUserToMeetingCommand) {
+ TransferUserToMeetingCommand cmd = (TransferUserToMeetingCommand) command;
System.out.println("Sending TransferUsetToMeetingCommand for conference = ["
+ cmd.getRoom() + "]");
manager.tranfer(cmd);
diff --git a/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/freeswitch/actions/TransferUsetToMeetingCommand.java b/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/freeswitch/actions/TransferUserToMeetingCommand.java
similarity index 58%
rename from akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/freeswitch/actions/TransferUsetToMeetingCommand.java
rename to akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/freeswitch/actions/TransferUserToMeetingCommand.java
index e05bdd8426..c182dbc8cc 100644
--- a/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/freeswitch/actions/TransferUsetToMeetingCommand.java
+++ b/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/freeswitch/actions/TransferUserToMeetingCommand.java
@@ -19,21 +19,23 @@
package org.bigbluebutton.freeswitch.voice.freeswitch.actions;
-public class TransferUsetToMeetingCommand extends FreeswitchCommand {
+public class TransferUserToMeetingCommand extends FreeswitchCommand {
- private final String targetRoom;
- private final String participant;
+ private final String targetRoom;
+ private final String participant;
+ private final String audioProfile;
- public TransferUsetToMeetingCommand(String room, String targetRoom,
- String participant, String requesterId) {
- super(room, requesterId);
- this.targetRoom = targetRoom;
- this.participant = participant;
- }
+ public TransferUserToMeetingCommand(String room, String targetRoom,
+ String participant, String profile, String requesterId) {
+ super(room, requesterId);
+ this.targetRoom = targetRoom;
+ this.participant = participant;
+ this.audioProfile = profile;
+ }
- @Override
- public String getCommandArgs() {
- return room + SPACE + "transfer" + SPACE + targetRoom + SPACE
- + participant;
- }
+ @Override
+ public String getCommandArgs() {
+ return room + SPACE + "transfer" + SPACE + targetRoom + "@"
+ + this.audioProfile + SPACE + participant;
+ }
}
diff --git a/akka-bbb-fsesl/src/main/resources/application.conf b/akka-bbb-fsesl/src/main/resources/application.conf
index 90d4dd6799..37ac46cfee 100755
--- a/akka-bbb-fsesl/src/main/resources/application.conf
+++ b/akka-bbb-fsesl/src/main/resources/application.conf
@@ -24,6 +24,9 @@ freeswitch {
port=8021
password="ClueCon"
}
+ conf {
+ profile="cdquality"
+ }
}
redis {
diff --git a/akka-bbb-fsesl/src/main/scala/org/bigbluebutton/Boot.scala b/akka-bbb-fsesl/src/main/scala/org/bigbluebutton/Boot.scala
index 95e7ff156e..7c6e0d4eb7 100755
--- a/akka-bbb-fsesl/src/main/scala/org/bigbluebutton/Boot.scala
+++ b/akka-bbb-fsesl/src/main/scala/org/bigbluebutton/Boot.scala
@@ -31,7 +31,7 @@ object Boot extends App with SystemConfiguration {
connManager.start()
- val fsApplication = new FreeswitchApplication(connManager)
+ val fsApplication = new FreeswitchApplication(connManager, fsProfile)
fsApplication.start()
val redisMsgReceiver = new RedisMessageReceiver(fsApplication)
diff --git a/akka-bbb-fsesl/src/main/scala/org/bigbluebutton/SystemConfiguration.scala b/akka-bbb-fsesl/src/main/scala/org/bigbluebutton/SystemConfiguration.scala
index cb7a5ac605..8ef716eba5 100755
--- a/akka-bbb-fsesl/src/main/scala/org/bigbluebutton/SystemConfiguration.scala
+++ b/akka-bbb-fsesl/src/main/scala/org/bigbluebutton/SystemConfiguration.scala
@@ -10,6 +10,7 @@ trait SystemConfiguration {
lazy val eslHost = Try(config.getString("freeswitch.esl.host")).getOrElse("127.0.0.1")
lazy val eslPort = Try(config.getInt("freeswitch.esl.port")).getOrElse(8021)
lazy val eslPassword = Try(config.getString("freeswitch.esl.password")).getOrElse("ClueCon")
+ lazy val fsProfile = Try(config.getString("freeswitch.conf.profile")).getOrElse("cdquality")
lazy val redisHost = Try(config.getString("redis.host")).getOrElse("127.0.0.1")
lazy val redisPort = Try(config.getInt("redis.port")).getOrElse(6379)
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/CreateBreakoutRoomRequestPayload.java b/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/CreateBreakoutRoomRequestPayload.java
index 39d0ed3183..b69987cd9d 100755
--- a/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/CreateBreakoutRoomRequestPayload.java
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/CreateBreakoutRoomRequestPayload.java
@@ -1,27 +1,31 @@
package org.bigbluebutton.messages.payload;
public class CreateBreakoutRoomRequestPayload {
- public final String breakoutId;
- public final String parentId; // The main meeting internal id
- public final String name; // The name of the breakout room
- public final String voiceConfId; // The voice conference id
- public final String viewerPassword;
- public final String moderatorPassword;
- public final Integer durationInMinutes; // The duration of the breakout room
- public final String defaultPresentationURL;
- public final Boolean record;
-
- public CreateBreakoutRoomRequestPayload(String breakoutId, String parentId, String name,
- String voiceConfId, String viewerPassword, String moderatorPassword,
- Integer duration, String defaultPresentationURL, Boolean record) {
- this.breakoutId = breakoutId;
- this.parentId = parentId;
- this.name = name;
- this.voiceConfId = voiceConfId;
- this.viewerPassword = viewerPassword;
- this.moderatorPassword = moderatorPassword;
- this.durationInMinutes = duration;
- this.defaultPresentationURL = defaultPresentationURL;
- this.record = record;
- }
+ public final String breakoutId;
+ public final String parentId; // The main meeting internal id
+ public final String name; // The name of the breakout room
+ public final String voiceConfId; // The voice conference id
+ public final String viewerPassword;
+ public final String moderatorPassword;
+ public final Integer durationInMinutes; // The duration of the breakout room
+ public final String sourcePresentationId;
+ public final Integer sourcePresentationSlide;
+ public final Boolean record;
+
+ public CreateBreakoutRoomRequestPayload(String breakoutId, String parentId,
+ String name, String voiceConfId, String viewerPassword,
+ String moderatorPassword, Integer duration,
+ String sourcePresentationId, Integer sourcePresentationSlide,
+ Boolean record) {
+ this.breakoutId = breakoutId;
+ this.parentId = parentId;
+ this.name = name;
+ this.voiceConfId = voiceConfId;
+ this.viewerPassword = viewerPassword;
+ this.moderatorPassword = moderatorPassword;
+ this.durationInMinutes = duration;
+ this.sourcePresentationId = sourcePresentationId;
+ this.sourcePresentationSlide = sourcePresentationSlide;
+ this.record = record;
+ }
}
diff --git a/bbb-common-message/src/test/java/org/bigbluebutton/messages/CreateBreakoutRoomRequestTest.java b/bbb-common-message/src/test/java/org/bigbluebutton/messages/CreateBreakoutRoomRequestTest.java
index 4b71cbc199..e520494a35 100755
--- a/bbb-common-message/src/test/java/org/bigbluebutton/messages/CreateBreakoutRoomRequestTest.java
+++ b/bbb-common-message/src/test/java/org/bigbluebutton/messages/CreateBreakoutRoomRequestTest.java
@@ -9,19 +9,20 @@ import com.google.gson.Gson;
public class CreateBreakoutRoomRequestTest {
@Test
public void testCreateBreakoutRoomRequest() {
- String breakoutId = "abc123";
+ String breakoutId = "183f0bf3a0982a127bdb8161e0c44eb696b3e75c-1474984695664";
String parentId = "abc-123";
Integer durationInMinutes = 20;
String name = "Breakout room 1";
String voiceConfId = "851153";
String viewerPassword = "vp";
String moderatorPassword = "mp";
- String defaultPresentationURL = "http://localhost/foo.pdf";
+ String sourcePresentationId = "d2d9a672040fbde2a47a10bf6c37b6a4b5ae187f-1474984695907";
+ Integer sourePresentationSlide = 5;
Boolean record = false;
CreateBreakoutRoomRequestPayload payload =
new CreateBreakoutRoomRequestPayload(breakoutId, parentId, name, voiceConfId,
- viewerPassword, moderatorPassword, durationInMinutes, defaultPresentationURL, record);
+ viewerPassword, moderatorPassword, durationInMinutes, sourcePresentationId, sourePresentationSlide, record);
CreateBreakoutRoomRequest msg = new CreateBreakoutRoomRequest(payload);
Gson gson = new Gson();
String json = gson.toJson(msg);
@@ -36,7 +37,8 @@ public class CreateBreakoutRoomRequestTest {
Assert.assertEquals(rxMsg.payload.viewerPassword, viewerPassword);
Assert.assertEquals(rxMsg.payload.moderatorPassword, moderatorPassword);
Assert.assertEquals(rxMsg.payload.durationInMinutes, durationInMinutes);
- Assert.assertEquals(rxMsg.payload.defaultPresentationURL, defaultPresentationURL);
+ Assert.assertEquals(rxMsg.payload.sourcePresentationId, sourcePresentationId);
+ Assert.assertEquals(rxMsg.payload.sourcePresentationSlide, sourePresentationSlide);
Assert.assertEquals(rxMsg.payload.record, record);
}
}
diff --git a/bigbluebutton-client/branding/default/style/css/BBBDefault.css b/bigbluebutton-client/branding/default/style/css/BBBDefault.css
index 2f87440696..80da61a02d 100755
--- a/bigbluebutton-client/branding/default/style/css/BBBDefault.css
+++ b/bigbluebutton-client/branding/default/style/css/BBBDefault.css
@@ -1061,6 +1061,10 @@ EmojiGrid {
horizontalGap: 6;
}
+.breakoutRoomUserWindowHeadingStyle {
+ fontWeight: bold;
+}
+
.breakoutRoomSettingTitleStyle {
fontFamily: Arial;
fontSize: 20;
diff --git a/bigbluebutton-client/locale/en_US/bbbResources.properties b/bigbluebutton-client/locale/en_US/bbbResources.properties
index 4ee1ba3075..0fbe0797b8 100755
--- a/bigbluebutton-client/locale/en_US/bbbResources.properties
+++ b/bigbluebutton-client/locale/en_US/bbbResources.properties
@@ -677,11 +677,14 @@ bbb.users.breakout.remainingTimeParent = {1} remaining
bbb.users.breakout.calculatingRemainingTime = Calculating remaining time...
bbb.users.breakout.remainingTimeEnded = Time ended, breakout room will close.
bbb.users.breakout.rooms = Rooms
+bbb.users.breakout.roomsCombo.accessibilityName = Number of rooms to create
bbb.users.breakout.room = Room
bbb.users.breakout.randomAssign = Randomly Assign Users
bbb.users.breakout.timeLimit = Time Limit
+bbb.users.breakout.durationStepper.accessibilityName = Time limit in minutes
bbb.users.breakout.minutes = Minutes
bbb.users.breakout.record = Record
+bbb.users.breakout.recordCheckbox.accessibilityName = Record breakout rooms
bbb.users.breakout.notAssigned = Not Assigned
bbb.users.breakout.dragAndDropToolTip = Tip: You can drag and drop users between rooms
bbb.users.breakout.start = Start
diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/WarningButton.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/WarningButton.mxml
index 519c541aff..7f26f8fed5 100644
--- a/bigbluebutton-client/src/org/bigbluebutton/main/views/WarningButton.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/WarningButton.mxml
@@ -94,6 +94,7 @@ with BigBlueButton; if not, see .
messages.push(obj);
showNotification();
+ LOGGER.warn("ClientNotification:" + e.title + " " + e.message);
}
private function showNotification():void {
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/phone/managers/WebRTCCallManager.as b/bigbluebutton-client/src/org/bigbluebutton/modules/phone/managers/WebRTCCallManager.as
index 82d3f6e7d0..7c0ea79396 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/phone/managers/WebRTCCallManager.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/phone/managers/WebRTCCallManager.as
@@ -309,6 +309,8 @@ package org.bigbluebutton.modules.phone.managers
});
popUpDelayTimer.start();
dispatcher.dispatchEvent(new ClientStatusEvent(ClientStatusEvent.FAIL_MESSAGE_EVENT, title, error));
+
+ LOGGER.warn("WebRTCAlert:" + title + " " + error + " " + message);
}
}
}
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/BreakoutRoomSettings.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/BreakoutRoomSettings.mxml
index 4124aa814d..13075f7fcd 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/BreakoutRoomSettings.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/BreakoutRoomSettings.mxml
@@ -138,7 +138,8 @@ with BigBlueButton; if not, see .
for (var r:int = 0; r < rooms; r++) {
var list:BreakoutList = roomsContainer.addChild(new BreakoutList()) as BreakoutList;
list.users = new ArrayCollection();
- list.roomName = ResourceUtil.getInstance().getString('bbb.users.breakout.room') + " " + (r + 1).toString()
+ list.roomName = ResourceUtil.getInstance().getString('bbb.users.breakout.room') + " " + (r + 1).toString();
+ list.usersList.accessibilityName = ResourceUtil.getInstance().getString('bbb.users.breakout.room') + " " + (r + 1).toString();
for (var i:int = 0; i < perRoom; i++) {
list.users.addItem(users.removeItemAt(Math.floor(Math.random() * users.length)) as BBBUser);
}
@@ -149,6 +150,7 @@ with BigBlueButton; if not, see .
var unassignedList:BreakoutList = roomsContainer.addChild(new BreakoutList()) as BreakoutList;
unassignedList.users = new ArrayCollection([me]);
unassignedList.roomName = ResourceUtil.getInstance().getString('bbb.users.breakout.notAssigned');
+ unassignedList.usersList.accessibilityName = ResourceUtil.getInstance().getString('bbb.users.breakout.notAssigned');
unassignedList.notAssignedUsers = true;
startButton.enabled = true;
}
@@ -165,6 +167,7 @@ with BigBlueButton; if not, see .
var list:BreakoutList = roomsContainer.addChild(new BreakoutList()) as BreakoutList;
list.users = new ArrayCollection();
list.roomName = ResourceUtil.getInstance().getString('bbb.users.breakout.room') + " " + (r).toString();
+ list.usersList.accessibilityName = ResourceUtil.getInstance().getString('bbb.users.breakout.room') + " " + (r).toString();
}
// Load user assignment from the previous action
var unassignedUsers:ArrayCollection = new ArrayCollection();
@@ -194,6 +197,7 @@ with BigBlueButton; if not, see .
for (var r:int = 0; r < rooms; r++) {
var list:BreakoutList = roomsContainer.addChild(new BreakoutList()) as BreakoutList;
list.roomName = ResourceUtil.getInstance().getString('bbb.users.breakout.room') + " " + (r + 1).toString()
+ list.usersList.accessibilityName = ResourceUtil.getInstance().getString('bbb.users.breakout.room') + " " + (r + 1).toString()
list.users = new ArrayCollection();
list.mode = mode;
}
@@ -216,6 +220,7 @@ with BigBlueButton; if not, see .
var unassignedList:BreakoutList = roomsContainer.addChild(new BreakoutList()) as BreakoutList;
unassignedList.users = dataProvider;
unassignedList.roomName = ResourceUtil.getInstance().getString('bbb.users.breakout.notAssigned');
+ unassignedList.usersList.accessibilityName = ResourceUtil.getInstance().getString('bbb.users.breakout.notAssigned');
unassignedList.notAssignedUsers = true;
}
@@ -274,7 +279,8 @@ with BigBlueButton; if not, see .
-
+
@@ -282,13 +288,15 @@ with BigBlueButton; if not, see .
-
+
-
+
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/UsersWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/UsersWindow.mxml
index e19ef0cefb..728d2016de 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/UsersWindow.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/UsersWindow.mxml
@@ -600,11 +600,12 @@
]]>
+
+
-
-
+
+
+ dragEnabled="false" width="100%" height="100%" draggableColumns="false"
+ accessibilityName="{ResourceUtil.getInstance().getString('bbb.users.breakout.breakoutRooms')}">
@@ -645,9 +647,9 @@
+ visible="true" />
+ toolTip="{ResourceUtil.getInstance().getString('bbb.users.settings.buttonTooltip')}" click="openSettings()" visible="true" />
diff --git a/bigbluebutton-config/bin/bbb-record b/bigbluebutton-config/bin/bbb-record
index c472c9a4d8..6adbe52166 100755
--- a/bigbluebutton-config/bin/bbb-record
+++ b/bigbluebutton-config/bin/bbb-record
@@ -19,6 +19,7 @@
# Author(s):
# Fred Dixon
# Gustavo Salazar
+# Ghazi Triki
#
# Changelog:
# 2011-08-18 FFD Inital Version
@@ -32,6 +33,7 @@
# 2013-04-05 GUG Description is optional in bbb-record --watch
# 2013-04-05 GUG Map internal meeting id with external meeting id
# 2016-07-02 FFD Updates for 1.1
+# 2016-09-27 GTR Stricter recording directories names detection to cover breakout rooms recordings
#set -e
#set -x
@@ -406,7 +408,7 @@ if [ $DELETEALL ]; then
rm -f /var/bigbluebutton/screenshare/*.flv
rm -f /var/freeswitch/meetings/*.wav
- for meeting in $(ls /var/bigbluebutton | grep "[0-9]\{13\}$"); do
+ for meeting in $(ls /var/bigbluebutton | grep "^[0-9a-f]\{40\}-[[:digit:]]\{13\}-\?[[:digit:]]\{1\}\?$"); do
echo "deleting: $meeting"
rm -rf /var/bigbluebutton/$meeting
done
@@ -446,10 +448,10 @@ if [ -z $HEAD ]; then
fi
tmp_file=$(mktemp)
-ls -t /var/bigbluebutton | grep "[0-9]\{13\}$" | head -n $HEAD > $tmp_file
-ls -t /var/bigbluebutton/recording/raw | grep "[0-9]\{13\}$" | head -n $HEAD >> $tmp_file
+ls -t /var/bigbluebutton | grep "^[0-9a-f]\{40\}-[[:digit:]]\{13\}-\?[[:digit:]]\{1\}\?$" | head -n $HEAD > $tmp_file
+ls -t /var/bigbluebutton/recording/raw | grep "^[0-9a-f]\{40\}-[[:digit:]]\{13\}-\?[[:digit:]]\{1\}\?$" | head -n $HEAD >> $tmp_file
-#for meeting in $(ls -t /var/bigbluebutton | grep "[0-9]\{13\}$" | head -n $HEAD); do
+#for meeting in $(ls -t /var/bigbluebutton | grep "^[0-9a-f]\{40\}-[[:digit:]]\{13\}-\?[[:digit:]]\{1\}\?$" | head -n $HEAD); do
for meeting in $(cat $tmp_file | sort -t - -k 2 -r| uniq); do
echo -n "$meeting"
timestamp=$(echo $meeting | sed s/.*-//g)
@@ -471,7 +473,7 @@ for meeting in $(cat $tmp_file | sort -t - -k 2 -r| uniq); do
fi
#
- # Check if there area uploaded presentations
+ # Check if there is any uploaded presentations
if [ -d $RAW_PRESENTATION_SRC/$meeting/$meeting ]; then
if [ "$(ls -A $RAW_PRESENTATION_SRC/$meeting/$meeting)" ]; then
echo -n "X"
@@ -548,7 +550,7 @@ for meeting in $(cat $tmp_file | sort -t - -k 2 -r| uniq); do
done
#
- # Numbe rof slides
+ # Number of slides
if [ -d /var/bigbluebutton/$meeting/$meeting ]; then
printf "%7s" $(find /var/bigbluebutton/$meeting/$meeting -name "*.swf" | wc -l)
else
@@ -562,7 +564,7 @@ for meeting in $(cat $tmp_file | sort -t - -k 2 -r| uniq); do
recording=$meeting
#
- # Checka processed
+ # Check processed
processed=""
for type in $TYPES; do
if [ -f $STATUS/processed/$recording-$type.done ]; then
diff --git a/bigbluebutton-html5/imports/locales/en.json b/bigbluebutton-html5/imports/locales/en.json
index 2b7dc33355..be78a5d8bc 100755
--- a/bigbluebutton-html5/imports/locales/en.json
+++ b/bigbluebutton-html5/imports/locales/en.json
@@ -26,17 +26,24 @@
"app.failedMessage": "Apologies, trouble connecting to the server.",
"app.connectingMessage": "Connecting...",
"app.waitingMessage": "Disconnected. Trying to reconnect in {seconds} seconds...",
- "app.dropdown.options": "Options",
- "app.dropdown.fullscreenLabel": "Make fullscreen",
- "app.dropdown.settingsLabel": "Open settings",
- "app.dropdown.leaveSessionLabel": "Logout",
- "app.dropdown.fullscreenDesc": "Make the settings menu fullscreen",
- "app.dropdown.settingsDesc": "Change the general settings",
- "app.dropdown.leaveSessionDesc": "Leave the meeting",
+ "app.navBar.settingsDropdown.optionsLabel": "Options",
+ "app.navBar.settingsDropdown.fullscreenLabel": "Make fullscreen",
+ "app.navBar.settingsDropdown.settingsLabel": "Open settings",
+ "app.navBar.settingsDropdown.leaveSessionLabel": "Logout",
+ "app.navBar.settingsDropdown.fullscreenDesc": "Make the settings menu fullscreen",
+ "app.navBar.settingsDropdown.settingsDesc": "Change the general settings",
+ "app.navBar.settingsDropdown.leaveSessionDesc": "Leave the meeting",
"app.leaveConfirmation.title": "Leave Session",
"app.leaveConfirmation.message": "Do you want to leave this meeting?",
"app.leaveConfirmation.confirmLabel": "Leave",
"app.leaveConfirmation.confirmDesc": "Logs you out of the meeting",
"app.leaveConfirmation.dismissLabel": "Cancel",
- "app.leaveConfirmation.dismissDesc": "Closes and rejects the leave confirmation"
+ "app.leaveConfirmation.dismissDesc": "Closes and rejects the leave confirmation",
+ "app.actionsBar.actionsDropdown.actionsLabel": "Actions",
+ "app.actionsBar.actionsDropdown.presentationLabel": "Upload a presentation",
+ "app.actionsBar.actionsDropdown.initPollLabel": "Initiate a poll",
+ "app.actionsBar.actionsDropdown.desktopShareLabel": "Share your screen",
+ "app.actionsBar.actionsDropdown.presentationDesc": "Upload your presentation",
+ "app.actionsBar.actionsDropdown.initPollDesc": "Initiate a poll",
+ "app.actionsBar.actionsDropdown.desktopShareDesc": "Share your screen with others"
}
diff --git a/bigbluebutton-html5/imports/ui/components/actions-bar/actions-dropdown/component.jsx b/bigbluebutton-html5/imports/ui/components/actions-bar/actions-dropdown/component.jsx
new file mode 100755
index 0000000000..b9312a25d5
--- /dev/null
+++ b/bigbluebutton-html5/imports/ui/components/actions-bar/actions-dropdown/component.jsx
@@ -0,0 +1,97 @@
+import React, { Component, PropTypes } from 'react';
+import { defineMessages, injectIntl } from 'react-intl';
+
+import Button from '/imports/ui/components/button/component';
+import Dropdown from '/imports/ui/components/dropdown/component';
+import DropdownTrigger from '/imports/ui/components/dropdown/trigger/component';
+import DropdownContent from '/imports/ui/components/dropdown/content/component';
+import DropdownList from '/imports/ui/components/dropdown/list/component';
+import DropdownListItem from '/imports/ui/components/dropdown/list/item/component';
+
+const intlMessages = defineMessages({
+ actionsLabel: {
+ id: 'app.actionsBar.actionsDropdown.actionsLabel',
+ defaultMessage: 'Actions',
+ },
+ presentationLabel: {
+ id: 'app.actionsBar.actionsDropdown.presentationLabel',
+ defaultMessage: 'Upload a presentation',
+ },
+ initPollLabel: {
+ id: 'app.actionsBar.actionsDropdown.initPollLabel',
+ defaultMessage: 'Initiate a poll',
+ },
+ desktopShareLabel: {
+ id: 'app.actionsBar.actionsDropdown.desktopShareLabel',
+ defaultMessage: 'Share your screen',
+ },
+ presentationDesc: {
+ id: 'app.actionsBar.actionsDropdown.presentationDesc',
+ defaultMessage: 'Upload your presentation',
+ },
+ initPollDesc: {
+ id: 'app.actionsBar.actionsDropdown.initPollDesc',
+ defaultMessage: 'Initiate a poll',
+ },
+ desktopShareDesc: {
+ id: 'app.actionsBar.actionsDropdown.desktopShareDesc',
+ defaultMessage: 'Share your screen with others',
+ },
+});
+
+const presentation = () => {console.log('Should show the uploader component');};
+
+const polling = () => {console.log('Should initiate a polling');};
+
+const shareScreen = () => {console.log('Should start screen sharing');};
+
+class ActionsDropdown extends Component {
+ constructor(props) {
+ super(props);
+ }
+
+ render() {
+ const { intl } = this.props;
+ return (
+
+
+
+
+
+
+
+ {/* These icons are unaligned because of the font issue
+ Check it later */}
+
+
+
+
+
+ );
+ }
+}
+
+export default injectIntl(ActionsDropdown);
diff --git a/bigbluebutton-html5/imports/ui/components/actions-bar/component.jsx b/bigbluebutton-html5/imports/ui/components/actions-bar/component.jsx
index 6ce573d905..9240c2ddd7 100755
--- a/bigbluebutton-html5/imports/ui/components/actions-bar/component.jsx
+++ b/bigbluebutton-html5/imports/ui/components/actions-bar/component.jsx
@@ -3,6 +3,8 @@ import styles from './styles.scss';
import Button from '../button/component';
+import ActionsDropdown from './actions-dropdown/component';
+
export default class ActionsBar extends Component {
constructor(props) {
super(props);
@@ -15,14 +17,7 @@ export default class ActionsBar extends Component {
return (