Merge branch 'master' of github.com:bigbluebutton/bigbluebutton into fix-chat-issues
This commit is contained in:
commit
3698c08315
@ -23,8 +23,8 @@ object PermissionCheck {
|
||||
}
|
||||
}
|
||||
|
||||
private def roleToLevel(user: UserState): Int = {
|
||||
if (user.presenter) PRESENTER_LEVEL else VIEWER_LEVEL
|
||||
private def roleToLevel(users: Users2x, user: UserState): Int = {
|
||||
if (Users2x.userIsInPresenterGroup(users, user.intId) || user.presenter) PRESENTER_LEVEL else VIEWER_LEVEL
|
||||
}
|
||||
|
||||
/**
|
||||
@ -42,8 +42,8 @@ object PermissionCheck {
|
||||
case Some(user) =>
|
||||
println("permissionToLevel = " + permissionToLevel(user) + " permissionLevel=" + permissionLevel)
|
||||
val permLevelCheck = permissionToLevel(user) >= permissionLevel
|
||||
println("roleToLevel = " + roleToLevel(user) + " roleLevel=" + roleLevel)
|
||||
val roleLevelCheck = roleToLevel(user) >= roleLevel
|
||||
println("roleToLevel = " + roleToLevel(users, user) + " roleLevel=" + roleLevel)
|
||||
val roleLevelCheck = roleToLevel(users, user) >= roleLevel
|
||||
|
||||
println("PERMLEVELCHECK = " + permLevelCheck + " ROLELEVELCHECK=" + roleLevelCheck)
|
||||
permLevelCheck && roleLevelCheck
|
||||
|
@ -3,13 +3,14 @@ package org.bigbluebutton.core.apps.polls
|
||||
import org.bigbluebutton.common2.domain.PollVO
|
||||
import org.bigbluebutton.common2.msgs._
|
||||
import org.bigbluebutton.core.bus.MessageBus
|
||||
import org.bigbluebutton.core.domain.MeetingState2x
|
||||
import org.bigbluebutton.core.models.Polls
|
||||
import org.bigbluebutton.core.running.{ LiveMeeting }
|
||||
import org.bigbluebutton.core.running.LiveMeeting
|
||||
|
||||
trait GetCurrentPollReqMsgHdlr {
|
||||
this: PollApp2x =>
|
||||
|
||||
def handle(msgIn: GetCurrentPollReqMsg, liveMeeting: LiveMeeting, bus: MessageBus): Unit = {
|
||||
def handle(msgIn: GetCurrentPollReqMsg, state: MeetingState2x, liveMeeting: LiveMeeting, bus: MessageBus): Unit = {
|
||||
|
||||
def broadcastEvent(msg: GetCurrentPollReqMsg, hasPoll: Boolean, pvo: Option[PollVO]): Unit = {
|
||||
val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, liveMeeting.props.meetingProp.intId, msg.header.userId)
|
||||
@ -22,7 +23,7 @@ trait GetCurrentPollReqMsgHdlr {
|
||||
bus.outGW.send(msgEvent)
|
||||
}
|
||||
|
||||
val pollVO = Polls.handleGetCurrentPollReqMsg(msgIn.header.userId, liveMeeting)
|
||||
val pollVO = Polls.handleGetCurrentPollReqMsg(state, msgIn.header.userId, liveMeeting)
|
||||
|
||||
pollVO match {
|
||||
case Some(poll) => {
|
||||
|
@ -3,13 +3,14 @@ package org.bigbluebutton.core.apps.polls
|
||||
import org.bigbluebutton.common2.domain.SimplePollResultOutVO
|
||||
import org.bigbluebutton.common2.msgs._
|
||||
import org.bigbluebutton.core.bus.MessageBus
|
||||
import org.bigbluebutton.core.domain.MeetingState2x
|
||||
import org.bigbluebutton.core.models.Polls
|
||||
import org.bigbluebutton.core.running.{ LiveMeeting }
|
||||
import org.bigbluebutton.core.running.LiveMeeting
|
||||
|
||||
trait ShowPollResultReqMsgHdlr {
|
||||
this: PollApp2x =>
|
||||
|
||||
def handle(msg: ShowPollResultReqMsg, liveMeeting: LiveMeeting, bus: MessageBus): Unit = {
|
||||
def handle(msg: ShowPollResultReqMsg, state: MeetingState2x, liveMeeting: LiveMeeting, bus: MessageBus): Unit = {
|
||||
|
||||
def broadcastEvent(msg: ShowPollResultReqMsg, result: SimplePollResultOutVO, annot: AnnotationVO): Unit = {
|
||||
// PollShowResultEvtMsg
|
||||
@ -34,7 +35,7 @@ trait ShowPollResultReqMsgHdlr {
|
||||
}
|
||||
|
||||
for {
|
||||
(result, annotationProp) <- Polls.handleShowPollResultReqMsg(msg.header.userId, msg.body.pollId, liveMeeting)
|
||||
(result, annotationProp) <- Polls.handleShowPollResultReqMsg(state, msg.header.userId, msg.body.pollId, liveMeeting)
|
||||
} yield {
|
||||
|
||||
broadcastEvent(msg, result, annotationProp)
|
||||
|
@ -3,13 +3,14 @@ package org.bigbluebutton.core.apps.polls
|
||||
import org.bigbluebutton.common2.domain.SimplePollOutVO
|
||||
import org.bigbluebutton.common2.msgs._
|
||||
import org.bigbluebutton.core.bus.MessageBus
|
||||
import org.bigbluebutton.core.domain.MeetingState2x
|
||||
import org.bigbluebutton.core.models.Polls
|
||||
import org.bigbluebutton.core.running.{ LiveMeeting }
|
||||
import org.bigbluebutton.core.running.LiveMeeting
|
||||
|
||||
trait StartCustomPollReqMsgHdlr {
|
||||
this: PollApp2x =>
|
||||
|
||||
def handle(msg: StartCustomPollReqMsg, liveMeeting: LiveMeeting, bus: MessageBus): Unit = {
|
||||
def handle(msg: StartCustomPollReqMsg, state: MeetingState2x, liveMeeting: LiveMeeting, bus: MessageBus): Unit = {
|
||||
def broadcastEvent(msg: StartCustomPollReqMsg, poll: SimplePollOutVO): Unit = {
|
||||
val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, liveMeeting.props.meetingProp.intId, msg.header.userId)
|
||||
val envelope = BbbCoreEnvelope(PollStartedEvtMsg.NAME, routing)
|
||||
@ -22,7 +23,7 @@ trait StartCustomPollReqMsgHdlr {
|
||||
}
|
||||
|
||||
for {
|
||||
pvo <- Polls.handleStartCustomPollReqMsg(msg.header.userId, msg.body.pollId, msg.body.pollType, msg.body.answers, liveMeeting)
|
||||
pvo <- Polls.handleStartCustomPollReqMsg(state, msg.header.userId, msg.body.pollId, msg.body.pollType, msg.body.answers, liveMeeting)
|
||||
} yield {
|
||||
broadcastEvent(msg, pvo)
|
||||
}
|
||||
|
@ -3,13 +3,14 @@ package org.bigbluebutton.core.apps.polls
|
||||
import org.bigbluebutton.common2.domain.SimplePollOutVO
|
||||
import org.bigbluebutton.common2.msgs._
|
||||
import org.bigbluebutton.core.bus.MessageBus
|
||||
import org.bigbluebutton.core.domain.MeetingState2x
|
||||
import org.bigbluebutton.core.models.Polls
|
||||
import org.bigbluebutton.core.running.{ LiveMeeting, MeetingActor, OutMsgRouter }
|
||||
import org.bigbluebutton.core.running.LiveMeeting
|
||||
|
||||
trait StartPollReqMsgHdlr {
|
||||
this: PollApp2x =>
|
||||
|
||||
def handle(msg: StartPollReqMsg, liveMeeting: LiveMeeting, bus: MessageBus): Unit = {
|
||||
def handle(msg: StartPollReqMsg, state: MeetingState2x, liveMeeting: LiveMeeting, bus: MessageBus): Unit = {
|
||||
|
||||
def broadcastEvent(msg: StartPollReqMsg, poll: SimplePollOutVO): Unit = {
|
||||
val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, liveMeeting.props.meetingProp.intId, msg.header.userId)
|
||||
@ -23,7 +24,7 @@ trait StartPollReqMsgHdlr {
|
||||
}
|
||||
|
||||
for {
|
||||
pvo <- Polls.handleStartPollReqMsg(msg.header.userId, msg.body.pollId, msg.body.pollType, liveMeeting)
|
||||
pvo <- Polls.handleStartPollReqMsg(state, msg.header.userId, msg.body.pollId, msg.body.pollType, liveMeeting)
|
||||
} yield {
|
||||
broadcastEvent(msg, pvo)
|
||||
}
|
||||
|
@ -2,6 +2,7 @@ package org.bigbluebutton.core.apps.polls
|
||||
|
||||
import org.bigbluebutton.common2.msgs._
|
||||
import org.bigbluebutton.core.bus.MessageBus
|
||||
import org.bigbluebutton.core.domain.MeetingState2x
|
||||
import org.bigbluebutton.core.models.Polls
|
||||
import org.bigbluebutton.core.running.LiveMeeting
|
||||
|
||||
@ -19,17 +20,13 @@ trait StopPollReqMsgHdlr {
|
||||
bus.outGW.send(msgEvent)
|
||||
}
|
||||
|
||||
def handle(msg: StopPollReqMsg, liveMeeting: LiveMeeting, bus: MessageBus): Unit = {
|
||||
for {
|
||||
stoppedPollId <- Polls.handleStopPollReqMsg(msg.header.userId, liveMeeting)
|
||||
} yield {
|
||||
broadcastPollStoppedEvtMsg(msg.header.userId, stoppedPollId, liveMeeting, bus)
|
||||
}
|
||||
def handle(msg: StopPollReqMsg, state: MeetingState2x, liveMeeting: LiveMeeting, bus: MessageBus): Unit = {
|
||||
stopPoll(state, msg.header.userId, liveMeeting, bus)
|
||||
}
|
||||
|
||||
def stopPoll(requesterId: String, liveMeeting: LiveMeeting, bus: MessageBus): Unit = {
|
||||
def stopPoll(state: MeetingState2x, requesterId: String, liveMeeting: LiveMeeting, bus: MessageBus): Unit = {
|
||||
for {
|
||||
stoppedPollId <- Polls.handleStopPollReqMsg(requesterId, liveMeeting)
|
||||
stoppedPollId <- Polls.handleStopPollReqMsg(state, requesterId, liveMeeting)
|
||||
} yield {
|
||||
broadcastPollStoppedEvtMsg(requesterId, stoppedPollId, liveMeeting, bus)
|
||||
}
|
||||
|
@ -53,19 +53,6 @@ trait RemovePresentationPodPubMsgHdlr {
|
||||
case None => state
|
||||
}
|
||||
|
||||
// TODO check if requesterId == ownerId
|
||||
// TODO check about notifying only the list of authorized?
|
||||
|
||||
// val respMsg = buildRemovePresentationPodEvtMsg(
|
||||
// liveMeeting.props.meetingProp.intId,
|
||||
// ownerId, pod.id
|
||||
// )
|
||||
// bus.outGW.send(respMsg)
|
||||
//
|
||||
// log.warning("RemovePresentationPodPubMsgHdlr new podId=" + pod.id)
|
||||
//
|
||||
// val pods = state.presentationPodManager.removePod(pod)
|
||||
// state.update(pods)
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -13,17 +13,6 @@ trait RemoveUserFromPresenterGroupCmdMsgHdlr {
|
||||
|
||||
def handleRemoveUserFromPresenterGroupCmdMsg(msg: RemoveUserFromPresenterGroupCmdMsg) {
|
||||
|
||||
def broadcastRemoveUserFromPresenterGroup(meetingId: String, userId: String, requesterId: String): Unit = {
|
||||
val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, meetingId, userId)
|
||||
val envelope = BbbCoreEnvelope(UserRemovedFromPresenterGroupEvtMsg.NAME, routing)
|
||||
val header = BbbClientMsgHeader(UserRemovedFromPresenterGroupEvtMsg.NAME, meetingId, userId)
|
||||
val body = UserRemovedFromPresenterGroupEvtMsgBody(userId, requesterId)
|
||||
val event = UserRemovedFromPresenterGroupEvtMsg(header, body)
|
||||
val msgEvent = BbbCommonEnvCoreMsg(envelope, event)
|
||||
|
||||
outGW.send(msgEvent)
|
||||
}
|
||||
|
||||
if (applyPermissionCheck && !PermissionCheck.isAllowed(PermissionCheck.MOD_LEVEL, PermissionCheck.VIEWER_LEVEL, liveMeeting.users2x, msg.header.userId)) {
|
||||
val meetingId = liveMeeting.props.meetingProp.intId
|
||||
val reason = "No permission to remove user from presenter group."
|
||||
@ -37,7 +26,7 @@ trait RemoveUserFromPresenterGroupCmdMsgHdlr {
|
||||
} yield {
|
||||
if (requester.role == Roles.MODERATOR_ROLE) {
|
||||
Users2x.removeUserFromPresenterGroup(liveMeeting.users2x, userId)
|
||||
broadcastRemoveUserFromPresenterGroup(liveMeeting.props.meetingProp.intId, userId, requesterId)
|
||||
outGW.send(buildRemoveUserFromPresenterGroup(liveMeeting.props.meetingProp.intId, userId, requesterId))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -40,7 +40,12 @@ trait UserLeaveReqMsgHdlr {
|
||||
)
|
||||
|
||||
// request ongoing poll to end
|
||||
pollApp.stopPoll(u.intId, liveMeeting, msgBus)
|
||||
pollApp.stopPoll(state, u.intId, liveMeeting, msgBus)
|
||||
}
|
||||
|
||||
if (Users2x.userIsInPresenterGroup(liveMeeting.users2x, u.intId)) {
|
||||
Users2x.removeUserFromPresenterGroup(liveMeeting.users2x, u.intId)
|
||||
outGW.send(buildRemoveUserFromPresenterGroup(liveMeeting.props.meetingProp.intId, u.intId, u.intId))
|
||||
}
|
||||
|
||||
def broadcastEvent(vu: VoiceUserState): Unit = {
|
||||
|
@ -3,6 +3,7 @@ package org.bigbluebutton.core.models
|
||||
import org.bigbluebutton.common2.domain._
|
||||
import org.bigbluebutton.common2.msgs.AnnotationVO
|
||||
import org.bigbluebutton.core.apps.WhiteboardKeyUtil
|
||||
import org.bigbluebutton.core.domain.MeetingState2x
|
||||
|
||||
import scala.collection.mutable.ArrayBuffer
|
||||
import scala.collection.mutable.HashMap
|
||||
@ -10,7 +11,8 @@ import org.bigbluebutton.core.running.LiveMeeting
|
||||
|
||||
object Polls {
|
||||
|
||||
def handleStartPollReqMsg(userId: String, pollId: String, pollType: String, lm: LiveMeeting): Option[SimplePollOutVO] = {
|
||||
def handleStartPollReqMsg(state: MeetingState2x, userId: String, pollId: String, pollType: String,
|
||||
lm: LiveMeeting): Option[SimplePollOutVO] = {
|
||||
def createPoll(pollId: String, numRespondents: Int): Option[Poll] = {
|
||||
for {
|
||||
poll <- PollFactory.createPoll(pollId, pollType, numRespondents, None)
|
||||
@ -21,7 +23,9 @@ object Polls {
|
||||
}
|
||||
|
||||
for {
|
||||
page <- lm.presModel.getCurrentPage()
|
||||
pod <- state.presentationPodManager.getDefaultPod()
|
||||
pres <- pod.getCurrentPresentation()
|
||||
page <- pres.getCurrentPage(pres)
|
||||
pageId: String = if (pollId.contains("deskshare")) "deskshare" else page.id
|
||||
stampedPollId: String = pageId + "/" + System.currentTimeMillis()
|
||||
numRespondents: Int = Users2x.numUsers(lm.users2x) - 1 // subtract the presenter
|
||||
@ -34,9 +38,11 @@ object Polls {
|
||||
}
|
||||
}
|
||||
|
||||
def handleStopPollReqMsg(userId: String, lm: LiveMeeting): Option[String] = {
|
||||
def handleStopPollReqMsg(state: MeetingState2x, userId: String, lm: LiveMeeting): Option[String] = {
|
||||
for {
|
||||
page <- lm.presModel.getCurrentPage()
|
||||
pod <- state.presentationPodManager.getDefaultPod()
|
||||
pres <- pod.getCurrentPresentation()
|
||||
page <- pres.getCurrentPage(pres)
|
||||
curPoll <- getRunningPollThatStartsWith(page.id, lm.polls)
|
||||
} yield {
|
||||
stopPoll(curPoll.id, lm.polls)
|
||||
@ -44,14 +50,16 @@ object Polls {
|
||||
}
|
||||
}
|
||||
|
||||
def handleShowPollResultReqMsg(requesterId: String, pollId: String, lm: LiveMeeting): Option[(SimplePollResultOutVO, AnnotationVO)] = {
|
||||
def handleShowPollResultReqMsg(state: MeetingState2x, requesterId: String, pollId: String, lm: LiveMeeting): Option[(SimplePollResultOutVO, AnnotationVO)] = {
|
||||
def updateWhiteboardAnnotation(annotation: AnnotationVO): AnnotationVO = {
|
||||
lm.wbModel.updateAnnotation(annotation.wbId, annotation.userId, annotation)
|
||||
}
|
||||
|
||||
def send(poll: SimplePollResultOutVO, shape: scala.collection.immutable.Map[String, Object]): Option[AnnotationVO] = {
|
||||
for {
|
||||
page <- lm.presModel.getCurrentPage()
|
||||
pod <- state.presentationPodManager.getDefaultPod()
|
||||
pres <- pod.getCurrentPresentation()
|
||||
page <- pres.getCurrentPage(pres)
|
||||
} yield {
|
||||
val pageId = if (poll.id.contains("deskshare")) "deskshare" else page.id
|
||||
val updatedShape = shape + ("whiteboardId" -> pageId)
|
||||
@ -80,9 +88,11 @@ object Polls {
|
||||
}
|
||||
}
|
||||
|
||||
def handleGetCurrentPollReqMsg(requesterId: String, lm: LiveMeeting): Option[PollVO] = {
|
||||
def handleGetCurrentPollReqMsg(state: MeetingState2x, requesterId: String, lm: LiveMeeting): Option[PollVO] = {
|
||||
val poll = for {
|
||||
page <- lm.presModel.getCurrentPage()
|
||||
pod <- state.presentationPodManager.getDefaultPod()
|
||||
pres <- pod.getCurrentPresentation()
|
||||
page <- pres.getCurrentPage(pres)
|
||||
curPoll <- getRunningPollThatStartsWith(page.id, lm.polls)
|
||||
} yield curPoll
|
||||
|
||||
@ -113,7 +123,7 @@ object Polls {
|
||||
|
||||
}
|
||||
|
||||
def handleStartCustomPollReqMsg(requesterId: String, pollId: String, pollType: String,
|
||||
def handleStartCustomPollReqMsg(state: MeetingState2x, requesterId: String, pollId: String, pollType: String,
|
||||
answers: Seq[String], lm: LiveMeeting): Option[SimplePollOutVO] = {
|
||||
|
||||
def createPoll(pollId: String, numRespondents: Int): Option[Poll] = {
|
||||
@ -126,7 +136,9 @@ object Polls {
|
||||
}
|
||||
|
||||
for {
|
||||
page <- lm.presModel.getCurrentPage()
|
||||
pod <- state.presentationPodManager.getDefaultPod()
|
||||
pres <- pod.getCurrentPresentation()
|
||||
page <- pres.getCurrentPage(pres)
|
||||
pageId: String = if (pollId.contains("deskshare")) "deskshare" else page.id
|
||||
stampedPollId: String = pageId + "/" + System.currentTimeMillis()
|
||||
numRespondents: Int = Users2x.numUsers(lm.users2x) - 1 // subtract the presenter
|
||||
|
@ -15,7 +15,7 @@ object PresentationPodFactory {
|
||||
val currentPresenter = ownerId
|
||||
|
||||
// we hardcode the podId of the default presentation pod for the purposes of having bbb-web know the podId
|
||||
// in advance (so we can fully process default.pdf) // TODO change to a generated podId
|
||||
// in advance (so we can fully process default.pdf)
|
||||
PresentationPod("DEFAULT_PRESENTATION_POD", ownerId, currentPresenter, Map.empty)
|
||||
}
|
||||
}
|
||||
@ -35,6 +35,10 @@ case class PresentationInPod(id: String, name: String, current: Boolean = false,
|
||||
}
|
||||
}
|
||||
|
||||
def getCurrentPage(pres: PresentationInPod): Option[PageVO] = {
|
||||
pres.pages.values find (p => p.current)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
case class PresentationPod(id: String, ownerId: String, currentPresenter: String,
|
||||
@ -116,6 +120,7 @@ case class PresentationPodManager(presentationPods: collection.immutable.Map[Str
|
||||
|
||||
def getNumberOfPods(): Int = presentationPods.size
|
||||
def getPod(podId: String): Option[PresentationPod] = presentationPods.get(podId)
|
||||
def getDefaultPod(): Option[PresentationPod] = presentationPods.get("DEFAULT_PRESENTATION_POD")
|
||||
def getAllPresentationPodsInMeeting(): Vector[PresentationPod] = presentationPods.values.toVector
|
||||
def updatePresentationPod(presPod: PresentationPod): PresentationPodManager = addPod(presPod)
|
||||
|
||||
|
@ -218,4 +218,13 @@ trait HandlerHelpers extends SystemConfiguration {
|
||||
|
||||
BbbCommonEnvCoreMsg(envelope, event)
|
||||
}
|
||||
|
||||
def buildRemoveUserFromPresenterGroup(meetingId: String, userId: String, requesterId: String): BbbCommonEnvCoreMsg = {
|
||||
val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, meetingId, userId)
|
||||
val envelope = BbbCoreEnvelope(UserRemovedFromPresenterGroupEvtMsg.NAME, routing)
|
||||
val header = BbbClientMsgHeader(UserRemovedFromPresenterGroupEvtMsg.NAME, meetingId, userId)
|
||||
val body = UserRemovedFromPresenterGroupEvtMsgBody(userId, requesterId)
|
||||
val event = UserRemovedFromPresenterGroupEvtMsg(header, body)
|
||||
BbbCommonEnvCoreMsg(envelope, event)
|
||||
}
|
||||
}
|
||||
|
@ -243,12 +243,12 @@ class MeetingActor(
|
||||
case m: ClientToServerLatencyTracerMsg => handleClientToServerLatencyTracerMsg(m)
|
||||
|
||||
// Poll
|
||||
case m: StartPollReqMsg => pollApp.handle(m, liveMeeting, msgBus)
|
||||
case m: StartCustomPollReqMsg => pollApp.handle(m, liveMeeting, msgBus)
|
||||
case m: StopPollReqMsg => pollApp.handle(m, liveMeeting, msgBus)
|
||||
case m: ShowPollResultReqMsg => pollApp.handle(m, liveMeeting, msgBus)
|
||||
case m: StartPollReqMsg => pollApp.handle(m, state, liveMeeting, msgBus) // passing state but not modifying it
|
||||
case m: StartCustomPollReqMsg => pollApp.handle(m, state, liveMeeting, msgBus) // passing state but not modifying it
|
||||
case m: StopPollReqMsg => pollApp.handle(m, state, liveMeeting, msgBus) // passing state but not modifying it
|
||||
case m: ShowPollResultReqMsg => pollApp.handle(m, state, liveMeeting, msgBus) // passing state but not modifying it
|
||||
case m: HidePollResultReqMsg => pollApp.handle(m, liveMeeting, msgBus)
|
||||
case m: GetCurrentPollReqMsg => pollApp.handle(m, liveMeeting, msgBus)
|
||||
case m: GetCurrentPollReqMsg => pollApp.handle(m, state, liveMeeting, msgBus) // passing state but not modifying it
|
||||
case m: RespondToPollReqMsg => pollApp.handle(m, liveMeeting, msgBus)
|
||||
|
||||
// Breakout
|
||||
@ -371,7 +371,7 @@ class MeetingActor(
|
||||
|
||||
def handlePresenterChange(msg: AssignPresenterReqMsg): Unit = {
|
||||
// Stop poll if one is running as presenter left
|
||||
pollApp.stopPoll(msg.header.userId, liveMeeting, msgBus)
|
||||
pollApp.stopPoll(state, msg.header.userId, liveMeeting, msgBus)
|
||||
|
||||
// switch user presenter status for old and new presenter
|
||||
usersApp.handleAssignPresenterReqMsg(msg)
|
||||
|
@ -509,6 +509,4 @@
|
||||
<target name="modules" depends="init-ant-contrib, generate-html-wrapper, compile-screenshare-standalone,
|
||||
build-webcam-preview-standalone, build-webcam-view-standalone, compile-bbb" description="Build BBB client without locales" />
|
||||
<target name="cleanandmake" depends="clean-build-all" description="Build BBB client including locales" />
|
||||
|
||||
<target name="build-poll" depends="init-ant-contrib, build-polling" description="Build only the polling module." />
|
||||
</project>
|
||||
|
@ -129,6 +129,7 @@ function stopWebRTCAudioTestJoinConference(){
|
||||
transferTimeout = setTimeout( function() {
|
||||
console.log("Call transfer failed. No response after 3 seconds");
|
||||
webRTCCallback({'status': 'failed', 'errorcode': 1008});
|
||||
releaseUserMedia();
|
||||
currentSession = null;
|
||||
if (userAgent != null) {
|
||||
var userAgentTemp = userAgent;
|
||||
@ -287,7 +288,7 @@ function webrtc_call(username, voiceBridge, callback, isListenOnly) {
|
||||
}
|
||||
// if the user requests to proceed as listen only (does not require media) or media is already acquired,
|
||||
// proceed with making the call
|
||||
if (isListenOnly || userMicMedia !== undefined) {
|
||||
if (isListenOnly || userMicMedia != null) {
|
||||
makeCallFunc();
|
||||
} else {
|
||||
callback({'status':'mediarequest'});
|
||||
@ -387,6 +388,7 @@ function make_call(username, voiceBridge, server, callback, recall, isListenOnly
|
||||
callTimeout = setTimeout(function() {
|
||||
console.log('Ten seconds without updates sending timeout code');
|
||||
callback({'status':'failed', 'errorcode': 1006}); // Failure on call
|
||||
releaseUserMedia();
|
||||
currentSession = null;
|
||||
if (userAgent != null) {
|
||||
var userAgentTemp = userAgent;
|
||||
@ -414,6 +416,7 @@ function make_call(username, voiceBridge, server, callback, recall, isListenOnly
|
||||
iceGatheringTimeout = setTimeout(function() {
|
||||
console.log('Thirty seconds without ICE gathering finishing');
|
||||
callback({'status':'failed', 'errorcode': 1011}); // ICE Gathering Failed
|
||||
releaseUserMedia();
|
||||
currentSession = null;
|
||||
if (userAgent != null) {
|
||||
var userAgentTemp = userAgent;
|
||||
@ -439,6 +442,7 @@ function make_call(username, voiceBridge, server, callback, recall, isListenOnly
|
||||
console.log('call failed with cause: '+ cause);
|
||||
|
||||
if (currentSession) {
|
||||
releaseUserMedia();
|
||||
if (callActive === false) {
|
||||
callback({'status':'failed', 'errorcode': 1004, 'cause': cause}); // Failure on call
|
||||
currentSession = null;
|
||||
@ -463,7 +467,7 @@ function make_call(username, voiceBridge, server, callback, recall, isListenOnly
|
||||
|
||||
if (currentSession) {
|
||||
console.log('call ended ' + currentSession.endTime);
|
||||
|
||||
releaseUserMedia();
|
||||
if (callPurposefullyEnded === true) {
|
||||
callback({'status':'ended'});
|
||||
} else {
|
||||
@ -480,6 +484,7 @@ function make_call(username, voiceBridge, server, callback, recall, isListenOnly
|
||||
|
||||
if (currentSession) {
|
||||
console.log('call canceled');
|
||||
releaseUserMedia();
|
||||
clearTimeout(callTimeout);
|
||||
currentSession = null;
|
||||
} else {
|
||||
@ -498,6 +503,7 @@ function make_call(username, voiceBridge, server, callback, recall, isListenOnly
|
||||
iceConnectedTimeout = setTimeout(function() {
|
||||
console.log('5 seconds without ICE finishing');
|
||||
callback({'status':'failed', 'errorcode': 1010}); // ICE negotiation timeout
|
||||
releaseUserMedia();
|
||||
currentSession = null;
|
||||
if (userAgent != null) {
|
||||
var userAgentTemp = userAgent;
|
||||
@ -511,6 +517,7 @@ function make_call(username, voiceBridge, server, callback, recall, isListenOnly
|
||||
currentSession.mediaHandler.on('iceConnectionFailed', function() {
|
||||
console.log('received ice negotiation failed');
|
||||
callback({'status':'failed', 'errorcode': 1007}); // Failure on call
|
||||
releaseUserMedia();
|
||||
currentSession = null;
|
||||
clearTimeout(iceConnectedTimeout);
|
||||
if (userAgent != null) {
|
||||
@ -564,6 +571,22 @@ function webrtc_hangup(callback) {
|
||||
}
|
||||
}
|
||||
|
||||
function releaseUserMedia() {
|
||||
if (!!userMicMedia) {
|
||||
console.log("Releasing media tracks");
|
||||
|
||||
userMicMedia.getAudioTracks().forEach(function(track) {
|
||||
track.stop();
|
||||
});
|
||||
|
||||
userMicMedia.getVideoTracks().forEach(function(track) {
|
||||
track.stop();
|
||||
});
|
||||
|
||||
userMicMedia = null;
|
||||
}
|
||||
}
|
||||
|
||||
function isWebRTCAvailable() {
|
||||
if (bowser.msedge) {
|
||||
return false;
|
||||
|
@ -7,7 +7,7 @@ package org.bigbluebutton.modules.polling.model
|
||||
|
||||
private var _currentPoll:SimplePoll;
|
||||
|
||||
private var _polls:ArrayCollection
|
||||
private var _polls:ArrayCollection;
|
||||
|
||||
private var _initialized:Boolean = false;
|
||||
|
||||
|
@ -41,10 +41,11 @@ package org.bigbluebutton.modules.polling.service
|
||||
ans.push(new SimpleAnswer(Number(String(a.id)), a.key));
|
||||
}
|
||||
|
||||
model.setCurrentPoll(new SimplePoll(pollId, ans));
|
||||
dispatcher.dispatchEvent(new PollStartedEvent(new SimplePoll(pollId, ans)));
|
||||
var simplePollInstance:SimplePoll = new SimplePoll(pollId, ans);
|
||||
model.setCurrentPoll(simplePollInstance);
|
||||
dispatcher.dispatchEvent(new PollStartedEvent(simplePollInstance));
|
||||
}
|
||||
|
||||
|
||||
public function handlePollStoppedMesage(msg:Object):void {
|
||||
dispatcher.dispatchEvent(new PollStoppedEvent());
|
||||
}
|
||||
|
@ -28,6 +28,7 @@ package org.bigbluebutton.modules.polling.service
|
||||
import org.bigbluebutton.modules.polling.model.PollingModel;
|
||||
import org.bigbluebutton.modules.polling.model.SimplePoll;
|
||||
import org.bigbluebutton.modules.present.model.Presentation;
|
||||
import org.bigbluebutton.modules.present.model.PresentationModel;
|
||||
import org.bigbluebutton.modules.present.model.PresentationPodManager;
|
||||
|
||||
public class PollingService
|
||||
@ -54,16 +55,19 @@ package org.bigbluebutton.modules.polling.service
|
||||
|
||||
|
||||
private function generatePollId():String {
|
||||
// TODO podId is currently not set (the call assumes only one presentation pod
|
||||
// var curPres:Presentation = PresentationPodManager.getPod(this.podId).getCurrentPresentation();
|
||||
// if (curPres != null) {
|
||||
// var date:Date = new Date();
|
||||
//
|
||||
// var pollId:String;
|
||||
// pollId = curPres.id + "/" + curPres.getCurrentPage().num + "/" + date.time;
|
||||
//
|
||||
// return pollId;
|
||||
// }
|
||||
var presentationModel: PresentationModel = PresentationPodManager.getInstance().getDefaultPresentationPod();
|
||||
if (presentationModel == null) {
|
||||
return null;
|
||||
}
|
||||
var curPres:Presentation = presentationModel.getCurrentPresentation();
|
||||
if (curPres != null) {
|
||||
var date:Date = new Date();
|
||||
|
||||
var pollId:String;
|
||||
pollId = curPres.id + "/" + curPres.getCurrentPage().num + "/" + date.time;
|
||||
|
||||
return pollId;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
@ -49,8 +49,6 @@ package org.bigbluebutton.modules.present.managers
|
||||
|
||||
public class PresentManager
|
||||
{
|
||||
private const DEFAULT_POD_ID:String = "DEFAULT_PRESENTATION_POD";
|
||||
|
||||
private var globalDispatcher:Dispatcher;
|
||||
private var winManager:PresentationWindowManager;
|
||||
private var podsManager: PresentationPodManager;
|
||||
@ -82,10 +80,10 @@ package org.bigbluebutton.modules.present.managers
|
||||
var podId: String = e.podId;
|
||||
var ownerId: String = e.ownerId;
|
||||
|
||||
if (podId == DEFAULT_POD_ID && winManager.containsPodId(podId)) {
|
||||
if (podId == PresentationPodManager.DEFAULT_POD_ID && winManager.containsPodId(podId)) {
|
||||
// update model
|
||||
podsManager.updateOwnershipOfDefaultPod(ownerId);
|
||||
var defWindow: PresentationWindow = winManager.findWindowByPodId(DEFAULT_POD_ID);
|
||||
var defWindow: PresentationWindow = winManager.findWindowByPodId(PresentationPodManager.DEFAULT_POD_ID);
|
||||
defWindow.setOwnerId(ownerId);
|
||||
} else {
|
||||
if (ownerId == "") {
|
||||
@ -101,7 +99,7 @@ package org.bigbluebutton.modules.present.managers
|
||||
newWindow.visible = true;
|
||||
newWindow.showControls = presentOptions.showWindowControls;
|
||||
|
||||
var selectedWinId:String = winManager.addWindow(podId, newWindow, podId == DEFAULT_POD_ID);
|
||||
var selectedWinId:String = winManager.addWindow(podId, newWindow, podId == PresentationPodManager.DEFAULT_POD_ID);
|
||||
|
||||
if (selectedWinId != null) {
|
||||
newWindow.setWindowId(selectedWinId);
|
||||
|
@ -11,6 +11,7 @@ package org.bigbluebutton.modules.present.model {
|
||||
import org.bigbluebutton.modules.present.events.NewPresentationPodCreated;
|
||||
import org.bigbluebutton.modules.present.events.PresentationPodRemoved;
|
||||
import org.bigbluebutton.modules.present.events.RequestPresentationInfoPodEvent;
|
||||
import org.bigbluebutton.modules.present.model.PresentationModel;
|
||||
|
||||
|
||||
public class PresentationPodManager {
|
||||
@ -22,6 +23,8 @@ package org.bigbluebutton.modules.present.model {
|
||||
private var globalDispatcher:Dispatcher;
|
||||
private var presentationService: PresentationService;
|
||||
|
||||
public static const DEFAULT_POD_ID:String = "DEFAULT_PRESENTATION_POD";
|
||||
|
||||
|
||||
/**
|
||||
* This class is a singleton. Please initialize it using the getInstance() method.
|
||||
@ -72,6 +75,11 @@ package org.bigbluebutton.modules.present.model {
|
||||
return resultingPod;
|
||||
}
|
||||
|
||||
public function getDefaultPresentationPod(): PresentationModel {
|
||||
var pod: PresentationModel = getPod(DEFAULT_POD_ID);
|
||||
return pod || null;
|
||||
}
|
||||
|
||||
public function handleAddPresentationPod(podId: String, ownerId: String): void {
|
||||
for (var i:int = 0; i < _presentationPods.length; i++) {
|
||||
var pod: PresentationModel = _presentationPods.getItemAt(i) as PresentationModel;
|
||||
@ -122,8 +130,10 @@ package org.bigbluebutton.modules.present.model {
|
||||
}
|
||||
|
||||
public function updateOwnershipOfDefaultPod(ownerId: String): void {
|
||||
var pod: PresentationModel = getPod("DEFAULT_PRESENTATION_POD");
|
||||
pod.setOwnerId(ownerId);
|
||||
var pod: PresentationModel = getDefaultPresentationPod();
|
||||
if (pod != null) {
|
||||
pod.setOwnerId(ownerId);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -148,7 +148,7 @@ package org.bigbluebutton.modules.present.services
|
||||
podManager.getPod(podId).removeAllPresentations();
|
||||
}
|
||||
|
||||
public function removePresentation(podId: String, presentationID:String):void {
|
||||
public function presentationWasRemoved(podId: String, presentationID:String):void {
|
||||
var removedEvent:RemovePresentationEvent = new RemovePresentationEvent(RemovePresentationEvent.PRESENTATION_REMOVED_EVENT, podId);
|
||||
removedEvent.presentationName = presentationID;
|
||||
dispatcher.dispatchEvent(removedEvent);
|
||||
|
@ -175,9 +175,9 @@ package org.bigbluebutton.modules.present.services.messaging
|
||||
}
|
||||
|
||||
private function handleRemovePresentationEvtMsg(msg:Object):void {
|
||||
var podId: String = msg.body.podId as String;
|
||||
var presentationId: String = msg.body.presentationId as String;
|
||||
service.removePresentation(podId, presentationId);
|
||||
var podId: String = msg.body.podId as String;
|
||||
var presentationId: String = msg.body.presentationId as String;
|
||||
service.presentationWasRemoved(podId, presentationId);
|
||||
}
|
||||
|
||||
private function handlePresentationConversionCompletedEvtMsg(msg:Object):void {
|
||||
|
@ -203,7 +203,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
listOfPodControls.push({label: ResourceUtil.getInstance().getString('bbb.presentation.multipod.controls.newPresentationWindowOpen'),
|
||||
icon: getStyle('iconClearStatus'), handler: newPresentationWindowHandler});
|
||||
|
||||
if (this.podId != "DEFAULT_PRESENTATION_POD") {
|
||||
if (this.podId != PresentationPodManager.DEFAULT_POD_ID) {
|
||||
listOfPodControls.push({label: ResourceUtil.getInstance().getString('bbb.presentation.multipod.controls.closePresentationWindowOpen'),
|
||||
icon: getStyle('iconClearStatus'), handler: closePresentationWindowHandler});
|
||||
}
|
||||
@ -295,9 +295,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// show podId
|
||||
// presentationPodControls.selectedItem = presentationPodControls.dataProvider.getItemAt(0);
|
||||
}
|
||||
|
||||
private function handleSetPresenterInPodRespEvent(event: SetPresenterInPodRespEvent): void {
|
||||
@ -875,7 +872,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
// on the bottom right-corner.
|
||||
onResetZoom();
|
||||
var dispatcher:Dispatcher = new Dispatcher();
|
||||
dispatchEvent(new StartPollEvent(pollType));
|
||||
dispatchEvent(new StartPollEvent(pollType));
|
||||
}
|
||||
|
||||
private function menuClickHandler(e:MenuEvent):void {
|
||||
@ -941,6 +938,9 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
}
|
||||
|
||||
private function pollStartedHandler(e:PollStartedEvent):void {
|
||||
if (this.podId != PresentationPodManager.DEFAULT_POD_ID) {
|
||||
return;
|
||||
}
|
||||
// the event for this doesn't exist yet
|
||||
if (amITheCurrentPodPresenter()) {
|
||||
// display the results view
|
||||
@ -996,7 +996,9 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
pollVoteBox.visible = pollVoteBox.includeInLayout = true;
|
||||
|
||||
} else if (state == "presenter" && amITheCurrentPodPresenter()) {
|
||||
pollStartBtn.visible = true;
|
||||
if (this.podId == PresentationPodManager.DEFAULT_POD_ID) { // only allow polling from the default pod
|
||||
pollStartBtn.visible = true;
|
||||
}
|
||||
|
||||
fileAndPollControls.visible = fileAndPollControls.includeInLayout= true;
|
||||
navigationControls.visible = navigationControls.includeInLayout= true;
|
||||
|
@ -418,7 +418,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
}
|
||||
|
||||
public function acceptOverlayCanvas(_podId: String, overlay:WhiteboardCanvas):void{
|
||||
if (_podId != this.podId) {
|
||||
if (_podId != this.podId || PresentationPodManager.getInstance().getPod(_podId) == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user