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 ( + + +