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 b5b3ab65e1c91300750ab194c5f4be04acb0a5a4..ced4ccc8d1da8414c814940fa6c0127a0e21b21f 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 @@ -115,6 +115,12 @@ class LiveMeeting(val mProps: MeetingProperties, def handleEndMeeting(msg: EndMeeting) { meetingModel.meetingHasEnded + + /** + * See if this meeting has breakout rooms. If so, we also need to end them. + */ + handleEndAllBreakoutRooms(new EndAllBreakoutRooms(msg.meetingId)) + outGW.send(new MeetingEnded(msg.meetingId, mProps.recorded, mProps.voiceBridge)) outGW.send(new DisconnectAllUsers(msg.meetingId)) } diff --git a/bigbluebutton-client/resources/prod/lib/bbb_api_bridge.js b/bigbluebutton-client/resources/prod/lib/bbb_api_bridge.js index 90dab66a69a4664863ca8fd09bada0cf0448d180..8cb890fb09bd8a37ff4e3a31067398e199b2d1a2 100755 --- a/bigbluebutton-client/resources/prod/lib/bbb_api_bridge.js +++ b/bigbluebutton-client/resources/prod/lib/bbb_api_bridge.js @@ -126,6 +126,21 @@ } } + /** + * Query user's sessionToken. + * + * Params: + * callback - function if you want a callback as response. + */ + BBB.getSessionToken = function(callback) { + var swfObj = getSwfObj(); + if (swfObj) { + if (typeof callback === 'function') { + callback(swfObj.getSessionToken()); + } + } + } + /** * Eject a user. * diff --git a/bigbluebutton-client/resources/prod/lib/bbb_webrtc_bridge_sip.js b/bigbluebutton-client/resources/prod/lib/bbb_webrtc_bridge_sip.js old mode 100644 new mode 100755 index bb8c39250aee14acb4aa9bb9635e0460579694a2..5c97dc94fc27fbbca2ee10a11ebbc7feea22f900 --- a/bigbluebutton-client/resources/prod/lib/bbb_webrtc_bridge_sip.js +++ b/bigbluebutton-client/resources/prod/lib/bbb_webrtc_bridge_sip.js @@ -144,26 +144,29 @@ function createUA(username, server, callback, makeCallFunc) { console.log("Fetching STUN/TURN server info for user agent"); - $.ajax({ - dataType: 'json', - url: '/bigbluebutton/api/stuns' - }).done(function(data) { - var stunsConfig = {}; - stunsConfig['stunServers'] = ( data['stunServers'] ? data['stunServers'].map(function(data) { - return data['url']; - }) : [] ); - stunsConfig['turnServers'] = ( data['turnServers'] ? data['turnServers'].map(function(data) { - return { - 'urls': data['url'], - 'username': data['username'], - 'password': data['password'] - }; - }) : [] ); - createUAWithStuns(username, server, callback, stunsConfig, makeCallFunc); - }).fail(function(data, textStatus, errorThrown) { - BBBLog.error("Could not fetch stun/turn servers", {error: textStatus, user: callerIdName, voiceBridge: conferenceVoiceBridge}); - callback({'status':'failed', 'errorcode': 1009}); - }); + BBB.getSessionToken(function(sessionToken) { + $.ajax({ + dataType: 'json', + url: '/bigbluebutton/api/stuns', + data: {sessionToken:sessionToken} + }).done(function(data) { + var stunsConfig = {}; + stunsConfig['stunServers'] = ( data['stunServers'] ? data['stunServers'].map(function(data) { + return data['url']; + }) : [] ); + stunsConfig['turnServers'] = ( data['turnServers'] ? data['turnServers'].map(function(data) { + return { + 'urls': data['url'], + 'username': data['username'], + 'password': data['password'] + }; + }) : [] ); + createUAWithStuns(username, server, callback, stunsConfig, makeCallFunc); + }).fail(function(data, textStatus, errorThrown) { + BBBLog.error("Could not fetch stun/turn servers", {error: textStatus, user: callerIdName, voiceBridge: conferenceVoiceBridge}); + callback({'status':'failed', 'errorcode': 1009}); + }); + }); } function createUAWithStuns(username, server, callback, stunsConfig, makeCallFunc) { @@ -181,8 +184,8 @@ function createUAWithStuns(username, server, callback, stunsConfig, makeCallFunc traceSip: true, autostart: false, userAgentString: "BigBlueButton", - //stunServers: stunsConfig['stunServers'], - //turnServers: stunsConfig['turnServers'] + stunServers: stunsConfig['stunServers'], + turnServers: stunsConfig['turnServers'] }; uaConnected = false; diff --git a/bigbluebutton-client/src/org/bigbluebutton/core/TimerUtil.as b/bigbluebutton-client/src/org/bigbluebutton/core/TimerUtil.as index f04cfea57ece935b43d57da9f5039f27b2df93a6..0c9c0e7318f32162d4d5601dbf52155f2544f02c 100644 --- a/bigbluebutton-client/src/org/bigbluebutton/core/TimerUtil.as +++ b/bigbluebutton-client/src/org/bigbluebutton/core/TimerUtil.as @@ -17,23 +17,23 @@ * */ package org.bigbluebutton.core { - + import flash.events.TimerEvent; import flash.utils.Dictionary; import flash.utils.Timer; import mx.controls.Label; import org.bigbluebutton.util.i18n.ResourceUtil; - + public final class TimerUtil { public static var timers:Dictionary = new Dictionary(true); - - public static function setCountDownTimer(label:Label, seconds:int, preLabel:String = ''):void { + + public static function setCountDownTimer(label:Label, seconds:int):void { var timer:Timer = getTimer(label.id, seconds); if (!timer.hasEventListener(TimerEvent.TIMER)) { timer.addEventListener(TimerEvent.TIMER, function():void { var remainingSeconds:int = timer.repeatCount - timer.currentCount; var formattedTime:String = (Math.floor(remainingSeconds / 60)) + ":" + (remainingSeconds % 60 >= 10 ? "" : "0") + (remainingSeconds % 60); - label.text = preLabel + ResourceUtil.getInstance().getString('bbb.users.breakout.remainingTime', [formattedTime]); + label.text = ResourceUtil.getInstance().getString('bbb.users.breakout.remainingTime', [formattedTime]); }); timer.addEventListener(TimerEvent.TIMER_COMPLETE, function():void { label.text = ResourceUtil.getInstance().getString('bbb.users.breakout.remainingTimeEnded'); @@ -44,7 +44,7 @@ package org.bigbluebutton.core { } timer.start(); } - + public static function getTimer(name:String, defaultRepeatCount:Number):Timer { if (timers[name] == undefined) { timers[name] = new Timer(1000, defaultRepeatCount); @@ -52,7 +52,7 @@ package org.bigbluebutton.core { Timer(timers[name]).repeatCount = defaultRepeatCount; return timers[name]; } - + public static function stopTimer(name:String):void { if (timers[name] != undefined) { timers[name].stop(); diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/api/ExternalApiCallbacks.as b/bigbluebutton-client/src/org/bigbluebutton/main/api/ExternalApiCallbacks.as index 629c03fdce21cb945d28fd5399444bae237f5a31..18e7c56d911850134ccc4f4cab4bcd1fe9e15b47 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/api/ExternalApiCallbacks.as +++ b/bigbluebutton-client/src/org/bigbluebutton/main/api/ExternalApiCallbacks.as @@ -21,7 +21,7 @@ package org.bigbluebutton.main.api import com.asfusion.mate.events.Dispatcher; import flash.external.ExternalInterface; - + import org.bigbluebutton.core.BBB; import org.as3commons.logging.api.ILogger; import org.as3commons.logging.api.getClassLogger; import org.bigbluebutton.core.EventConstants; @@ -49,6 +49,7 @@ package org.bigbluebutton.main.api import org.bigbluebutton.modules.videoconf.events.ClosePublishWindowEvent; import org.bigbluebutton.modules.videoconf.events.ShareCameraRequestEvent; import org.bigbluebutton.modules.videoconf.model.VideoConfOptions; + import org.bigbluebutton.util.SessionTokenUtil; public class ExternalApiCallbacks { private static const LOGGER:ILogger = getClassLogger(ExternalApiCallbacks); @@ -104,6 +105,8 @@ package org.bigbluebutton.main.api ExternalInterface.addCallback("webRTCMediaSuccess", handleWebRTCMediaSuccess); ExternalInterface.addCallback("webRTCMediaFail", handleWebRTCMediaFail); ExternalInterface.addCallback("javaAppletLaunched", handleJavaAppletLaunched); + ExternalInterface.addCallback("getSessionToken", handleGetSessionToken); + } // Tell out JS counterpart that we are ready. @@ -246,6 +249,11 @@ package org.bigbluebutton.main.api return UserManager.getInstance().getConference().internalMeetingID; } + private function handleGetSessionToken():String { + return BBB.getSessionTokenUtil().getSessionToken(); + } + + private function handleSendLockLayoutRequest(lock:Boolean):void { if (lock) { var lockEvent:CoreEvent = new CoreEvent(EventConstants.LOCK_LAYOUT_REQ); 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 56eb5aca301c2b52c22d38197d4894d3baacede7..4c852f1d004d65c97af7c18290be0804a75ce207 100644 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/BreakoutRoomSettings.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/BreakoutRoomSettings.mxml @@ -138,27 +138,27 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. id="textArea" text="{ResourceUtil.getInstance().getString('bbb.users.breakout.breakoutRooms')}" styleName="breakoutRoomSettingTitleStyle"/> + <mx:Canvas width="100%" styleName="breakoutTipBox" backgroundColor="0xcccccc"> + <mx:Text horizontalCenter="0" text="{ResourceUtil.getInstance().getString('bbb.users.breakout.dragAndDropToolTip')}"/> + </mx:Canvas> + <mx:HBox id="roomsBox" paddingTop="20" width="100%"> - <mx:HBox width="50%" horizontalAlign="left"> + <mx:HBox width="50%" height="100%" horizontalAlign="left" verticalAlign="middle"> <mx:Label text="{ResourceUtil.getInstance().getString('bbb.users.breakout.rooms')}" /> <mx:ComboBox id="roomsCombo" width="80%" change="{assignUsers()}" dataProvider="{roomsProvider}"/> </mx:HBox> - <mx:HBox width="50%" horizontalAlign="center"> - <mx:Label text="{ResourceUtil.getInstance().getString('bbb.users.breakout.timeLimit')}" /> - <mx:NumericStepper id="durationStepper" value="15" minimum="1" maximum="600"/> - <mx:Label text="{ResourceUtil.getInstance().getString('bbb.users.breakout.minutes')}"/> - </mx:HBox> + <mx:Button paddingLeft="20" width="50%" id="randomAssignBtn" + label="{ResourceUtil.getInstance().getString('bbb.users.breakout.randomAssign')}" click="assignUsers()"/> + </mx:HBox> + + <mx:HBox width="100%" paddingTop="12"> + <mx:Label text="{ResourceUtil.getInstance().getString('bbb.users.breakout.timeLimit')}" /> + <mx:NumericStepper id="durationStepper" value="15" minimum="1" maximum="600"/> + <mx:Label text="{ResourceUtil.getInstance().getString('bbb.users.breakout.minutes')}"/> </mx:HBox> <mx:Tile id="roomsContainer" styleName="roomsContainer" width="100%" height="100%"/> - <mx:VBox width="100%" horizontalAlign="center" verticalGap="12"> - <mx:Button paddingLeft="20" id="randomAssignBtn" label="{ResourceUtil.getInstance().getString('bbb.users.breakout.randomAssign')}" click="assignUsers()"/> - <mx:Canvas width="100%" styleName="breakoutTipBox" backgroundColor="0xcccccc"> - <mx:Text horizontalCenter="0" text="{ResourceUtil.getInstance().getString('bbb.users.breakout.dragAndDropToolTip')}"/> - </mx:Canvas> - </mx:VBox> - <mx:HBox width="100%" horizontalAlign="right" verticalGap="15"> <mx:Button id="startButton" label="{ResourceUtil.getInstance().getString('bbb.users.breakout.start')}" click="onStartClicked()"/> <mx:Button label="{ResourceUtil.getInstance().getString('bbb.users.breakout.close')}" click="onCloseClicked()"/> 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 0d2e3fbdbdcf1d96b12078a44446498ca701a5c4..0ab1c7c7743877807d1d5420afa2dd2c45c770b7 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/UsersWindow.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/UsersWindow.mxml @@ -312,7 +312,7 @@ } private function handleRemainingTimeUpdate(event:BreakoutRoomEvent):void { - TimerUtil.setCountDownTimer(breakoutTimeLabel, event.durationInMinutes, ResourceUtil.getInstance().getString('bbb.users.breakout.breakoutRooms')); + TimerUtil.setCountDownTimer(breakoutTimeLabel, event.durationInMinutes); } private function breakoutRoomsListChangeListener(event:CollectionEvent):void { @@ -585,8 +585,11 @@ <mx:VBox id="roomsBox" styleName="breakoutRoomsBox" visible="{breakoutRoomsList.length > 0 && amIModerator}" includeInLayout="{breakoutRoomsList.length > 0 && amIModerator}" - width="100%" height="50%"> - <mx:Label id="breakoutTimeLabel" text="{ResourceUtil.getInstance().getString('bbb.users.breakout.breakoutRooms')}"/> + width="100%" height="180"> + <mx:HBox width="100%"> + <mx:Label text="{ResourceUtil.getInstance().getString('bbb.users.breakout.breakoutRooms')}"/> + <mx:Label width="100%" textAlign="right" id="breakoutTimeLabel"/> + </mx:HBox> <mx:DataGrid id="roomsGrid" editable="false" sortableColumns="false" dataProvider="{breakoutRoomsList}" dragEnabled="false" width="100%" height="100%" draggableColumns="false">