diff --git a/README.md b/README.md index 43c49d163d229fc8710bdd8630775994b21bb9da..45da35c3197bdaef811ca36be7856ea22b8899ba 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ BigBlueButton ============= BigBlueButton is an open source web conferencing system. -BigBlueButton supports real-time sharing of audio, video, slides (with witeboard controls), chat, and the screen. Instructors can engage remote students with polling, emojis, and breakout rooms. BigBlueButton can record and playback all content shared in a session. +BigBlueButton supports real-time sharing of audio, video, slides (with whiteboard controls), chat, and the screen. Instructors can engage remote students with polling, emojis, and breakout rooms. BigBlueButton can record and playback all content shared in a session. We designed BigBlueButton for online learning (though it can be used for many [other applications](http://www.c4isrnet.com/story/military-tech/disa/2015/02/11/disa-to-save-12m-defense-collaboration-services/23238997/)). The educational use cases for BigBlueButton are @@ -10,7 +10,7 @@ We designed BigBlueButton for online learning (though it can be used for many [o * Small group collaboration * On-line classes -BigBlueButton runs on a Ubuntu 16.04 64-bit server. If you follow the [installation instructions](http://docs.bigbluebutton.org/install/install.html), we gaurantee you will have BigBlueButton installed and running within 30 minutes (or your money back :-). +BigBlueButton runs on a Ubuntu 16.04 64-bit server. If you follow the [installation instructions](http://docs.bigbluebutton.org/install/install.html), we guarantee you will have BigBlueButton installed and running within 30 minutes (or your money back :-). For full technical documentation BigBlueButton -- including architecture, features, API, and GreenLight (the default front-end) -- see [http://docs.bigbluebutton.org/](http://docs.bigbluebutton.org/). diff --git a/akka-bbb-apps/build.sbt b/akka-bbb-apps/build.sbt index 8b901c7927cd2eb7372892a1d5c730fd6c93e385..65512e0a0062fa570ed6794ea91bde7d811eca42 100755 --- a/akka-bbb-apps/build.sbt +++ b/akka-bbb-apps/build.sbt @@ -25,6 +25,7 @@ resolvers ++= Seq( ) resolvers += Resolver.sonatypeRepo("releases") +resolvers += Resolver.typesafeRepo("releases") publishTo := Some(Resolver.file("file", new File(Path.userHome.absolutePath+"/dev/repo/maven-repo/releases" )) ) @@ -90,9 +91,21 @@ libraryDependencies += "org.scalatest" % "scalatest_2.12" % "3.0.3" % "test" libraryDependencies += "org.mockito" % "mockito-core" % "2.7.22" % "test" -seq(Revolver.settings: _*) -scalariformSettings + +import com.typesafe.sbt.SbtScalariform + +import scalariform.formatter.preferences._ +import com.typesafe.sbt.SbtScalariform.ScalariformKeys + +SbtScalariform.defaultScalariformSettings + +ScalariformKeys.preferences := ScalariformKeys.preferences.value + .setPreference(AlignSingleLineCaseStatements, true) + .setPreference(DoubleIndentClassDeclaration, true) + .setPreference(AlignParameters, true) + + //----------- diff --git a/akka-bbb-apps/project/plugins.sbt b/akka-bbb-apps/project/plugins.sbt index 87ef6448644c23eed22abe7453eefd0054ca02a7..e6f83d0330ac99a8c51c5e89b818435297648324 100755 --- a/akka-bbb-apps/project/plugins.sbt +++ b/akka-bbb-apps/project/plugins.sbt @@ -1,6 +1,8 @@ addSbtPlugin("io.spray" % "sbt-revolver" % "0.7.2") -addSbtPlugin("com.typesafe.sbt" % "sbt-scalariform" % "1.3.0") +//addSbtPlugin("com.typesafe.sbt" % "sbt-scalariform" % "1.3.0") + +addSbtPlugin("org.scalariform" % "sbt-scalariform" % "1.6.0") addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "2.2.0") diff --git a/akka-bbb-apps/src/main/java/org/bigbluebutton/core/api/IBigBlueButtonInGW.java b/akka-bbb-apps/src/main/java/org/bigbluebutton/core/api/IBigBlueButtonInGW.java index f6ff6178ce591c1372cf1de4fc2ed6081f52697e..d58295ab9045496fee6a09e14945195494a38134 100755 --- a/akka-bbb-apps/src/main/java/org/bigbluebutton/core/api/IBigBlueButtonInGW.java +++ b/akka-bbb-apps/src/main/java/org/bigbluebutton/core/api/IBigBlueButtonInGW.java @@ -1,11 +1,9 @@ package org.bigbluebutton.core.api; -import java.util.Map; import org.bigbluebutton.common.messages.*; public interface IBigBlueButtonInGW { - void handleJsonMessage(String json); void handleBigBlueButtonMessage(IBigBlueButtonMessage message); void isAliveAudit(String aliveID); @@ -15,93 +13,11 @@ public interface IBigBlueButtonInGW { void destroyMeeting(String meetingID); void getAllMeetings(String meetingID); - void lockSettings(String meetingID, Boolean locked, Map<String, Boolean> lockSettigs); void activityResponse(String meetingID); - // Polling - void votePoll(String meetingId, String userId, String pollId, Integer questionId, Integer answerId); - void startPoll(String meetingId, String requesterId, String pollId, String pollType); - void stopPoll(String meetingId, String userId, String pollId); - void showPollResult(String meetingId, String requesterId, String pollId, Boolean show); - - // Lock - void initLockSettings(String meetingID, Map<String, Boolean> settings); - void sendLockSettings(String meetingID, String userId, Map<String, Boolean> settings); - void getLockSettings(String meetingId, String userId); - void lockUser(String meetingId, String requesterID, boolean lock, String internalUserID); - - // Users - void validateAuthToken(String meetingId, String userId, String token, String correlationId, String sessionId); - void registerUser(String roomName, String userid, String username, String role, String externUserID, - String authToken, String avatarURL, Boolean guest, Boolean authed); - void userEmojiStatus(String meetingId, String userId, String emojiStatus); - void shareWebcam(String meetingId, String userId, String stream); - void unshareWebcam(String meetingId, String userId, String stream); - void setUserStatus(String meetingID, String userID, String status, Object value); - void setUserRole(String meetingID, String userID, String role); - void getUsers(String meetingID, String requesterID); - void userLeft(String meetingID, String userID, String sessionId); - void userJoin(String meetingID, String userID, String authToken); - void getCurrentPresenter(String meetingID, String requesterID); - void checkIfAllowedToShareDesktop(String meetingID, String userID); - void assignPresenter(String meetingID, String newPresenterID, String newPresenterName, String assignedBy); void setRecordingStatus(String meetingId, String userId, Boolean recording); void getRecordingStatus(String meetingId, String userId); - void userConnectedToGlobalAudio(String voiceConf, String userid, String name); - void userDisconnectedFromGlobalAudio(String voiceConf, String userid, String name); - void getGuestPolicy(String meetingID, String userID); - void setGuestPolicy(String meetingID, String guestPolicy, String setBy); - void responseToGuest(String meetingID, String userID, Boolean response, String requesterID); - void logoutEndMeeting(String meetingID, String userID); - - // Voice - void initAudioSettings(String meetingID, String requesterID, Boolean muted); - void muteAllExceptPresenter(String meetingID, String requesterID, Boolean mute); - void muteAllUsers(String meetingID, String requesterID, Boolean mute); - void isMeetingMuted(String meetingID, String requesterID); - void muteUser(String meetingID, String requesterID, String userID, Boolean mute); - void lockMuteUser(String meetingID, String requesterID, String userID, Boolean lock); - void ejectUserFromVoice(String meetingID, String userId, String ejectedBy); - void ejectUserFromMeeting(String meetingId, String userId, String ejectedBy); - void voiceUserJoined(String voiceConfId, String voiceUserId, String userId, String callerIdName, - String callerIdNum, Boolean muted, String avatarURL, Boolean talking); - void voiceUserLeft(String meetingId, String userId); - void voiceUserLocked(String meetingId, String userId, Boolean locked); - void voiceUserMuted(String meetingId, String userId, Boolean muted); - void voiceUserTalking(String meetingId, String userId, Boolean talking); - void voiceRecording(String meetingId, String recordingFile, - String timestamp, Boolean recording); - - // Presentation - void clear(String meetingID); - void removePresentation(String meetingID, String presentationID); - void getPresentationInfo(String meetingID, String requesterID, String replyTo); - void resizeAndMoveSlide(String meetingID, double xOffset, double yOffset, double widthRatio, double heightRatio); - void gotoSlide(String meetingID, String page); - void sharePresentation(String meetingID, String presentationID, boolean share); - void getSlideInfo(String meetingID, String requesterID, String replyTo); - - void sendConversionUpdate(String messageKey, String meetingId, - String code, String presId, String presName); - - void sendPageCountError(String messageKey, String meetingId, - String code, String presId, int numberOfPages, - int maxNumberPages, String presName); - - void sendSlideGenerated(String messageKey, String meetingId, - String code, String presId, int numberOfPages, - int pagesCompleted, String presName); - - void sendConversionCompleted(String messageKey, String meetingId, - String code, String presId, int numPages, String presName, String presBaseUrl, boolean downloadable); - - // Layout - void getCurrentLayout(String meetingID, String requesterID); - void broadcastLayout(String meetingID, String requesterID, String layout); - void lockLayout(String meetingID, String setById, - boolean lock, boolean viewersOnly, - String layout); - + // DeskShare void deskShareStarted(String confId, String callerId, String callerIdName); void deskShareStopped(String conferenceName, String callerId, String callerIdName); diff --git a/akka-bbb-apps/src/main/java/org/bigbluebutton/core/pubsub/receivers/ConversionUpdatesProcessor.java b/akka-bbb-apps/src/main/java/org/bigbluebutton/core/pubsub/receivers/ConversionUpdatesProcessor.java deleted file mode 100755 index 8726df9da017f391410cdfeb0c5452cf758d059c..0000000000000000000000000000000000000000 --- a/akka-bbb-apps/src/main/java/org/bigbluebutton/core/pubsub/receivers/ConversionUpdatesProcessor.java +++ /dev/null @@ -1,61 +0,0 @@ -/** -* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ -* -* Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below). -* -* This program is free software; you can redistribute it and/or modify it under the -* terms of the GNU Lesser General Public License as published by the Free Software -* Foundation; either version 3.0 of the License, or (at your option) any later -* version. -* -* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY -* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License along -* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. -* -*/ -package org.bigbluebutton.core.pubsub.receivers; - -import org.bigbluebutton.core.api.IBigBlueButtonInGW; - -public class ConversionUpdatesProcessor { - - private IBigBlueButtonInGW bbbInGW; - - public ConversionUpdatesProcessor(IBigBlueButtonInGW bbbInGW) { - this.bbbInGW = bbbInGW; - } - - public void sendConversionUpdate(String messageKey, String conference, - String code, String presId, String presName) { - bbbInGW.sendConversionUpdate(messageKey, conference, - code, presId, presName); - } - - public void sendPageCountError(String messageKey, String conference, - String code, String presId, int numberOfPages, - int maxNumberPages, String presName) { - bbbInGW.sendPageCountError(messageKey, conference, code, presId, numberOfPages, - maxNumberPages, presName); - } - - public void sendSlideGenerated(String messageKey, String conference, - String code, String presId, int numberOfPages, - int pagesCompleted, String presName) { - bbbInGW.sendSlideGenerated(messageKey, conference, - code, presId, numberOfPages, pagesCompleted, presName); - } - - public void sendConversionCompleted(String messageKey, String conference, - String code, String presId, Integer numberOfPages, String presName, - String presBaseUrl, Boolean downloadable) { - bbbInGW.sendConversionCompleted(messageKey, conference, - code, presId, numberOfPages, presName, presBaseUrl, downloadable); - } - - public void setBigBlueButtonInGW(IBigBlueButtonInGW inGW) { - bbbInGW = inGW; -} -} diff --git a/akka-bbb-apps/src/main/java/org/bigbluebutton/core/pubsub/receivers/LockMessageReceiver.java b/akka-bbb-apps/src/main/java/org/bigbluebutton/core/pubsub/receivers/LockMessageReceiver.java deleted file mode 100755 index 87b187d5dfddef6c10eaf5fdeeafe8e829b1fb5a..0000000000000000000000000000000000000000 --- a/akka-bbb-apps/src/main/java/org/bigbluebutton/core/pubsub/receivers/LockMessageReceiver.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.bigbluebutton.core.pubsub.receivers; - -import org.bigbluebutton.common.messages.GetLockSettingsMessage; -import org.bigbluebutton.common.messages.LockUserMessage; -import org.bigbluebutton.common.messages.MessagingConstants; -import org.bigbluebutton.common.messages.SendLockSettingsMessage; -import org.bigbluebutton.core.api.IBigBlueButtonInGW; - -import com.google.gson.JsonParser; -import com.google.gson.JsonObject; - -public class LockMessageReceiver implements MessageHandler { - - private IBigBlueButtonInGW bbbGW; - - public LockMessageReceiver(IBigBlueButtonInGW bbbGW) { - this.bbbGW = bbbGW; - } - - @Override - public void handleMessage(String pattern, String channel, String message) { - if (channel.equalsIgnoreCase(MessagingConstants.TO_MEETING_CHANNEL)) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (GetLockSettingsMessage.GET_LOCK_SETTINGS.equals(messageName)) { - GetLockSettingsMessage msg = GetLockSettingsMessage.fromJson(message); - bbbGW.getLockSettings(msg.meetingId, msg.userId); - } else if(LockUserMessage.LOCK_USER.equals(messageName)) { - LockUserMessage msg = LockUserMessage.fromJson(message); - bbbGW.lockUser(msg.meetingId, msg.requesterId, msg.lock, msg.internalUserId); - } else if(SendLockSettingsMessage.SEND_LOCK_SETTINGS.equals(messageName)) { - SendLockSettingsMessage msg = SendLockSettingsMessage.fromJson(message); - bbbGW.sendLockSettings(msg.meetingId, msg.userId, msg.newSettings); - } - } - } - } - } -} diff --git a/akka-bbb-apps/src/main/java/org/bigbluebutton/core/pubsub/receivers/MeetingMessageReceiver.java b/akka-bbb-apps/src/main/java/org/bigbluebutton/core/pubsub/receivers/MeetingMessageReceiver.java index 5b5464b0b8c4e98f5f905342f1d4c8046e5b3801..9325969418ff9c491987d253fc07a5f08fd88386 100755 --- a/akka-bbb-apps/src/main/java/org/bigbluebutton/core/pubsub/receivers/MeetingMessageReceiver.java +++ b/akka-bbb-apps/src/main/java/org/bigbluebutton/core/pubsub/receivers/MeetingMessageReceiver.java @@ -13,12 +13,8 @@ import org.bigbluebutton.common.messages.MessageFromJsonConverter; import org.bigbluebutton.common.messages.MessagingConstants; import org.bigbluebutton.common.messages.PubSubPingMessage; -import org.bigbluebutton.common.messages.UserConnectedToGlobalAudio; -import org.bigbluebutton.common.messages.UserDisconnectedFromGlobalAudio; -import org.bigbluebutton.common.messages.ValidateAuthTokenMessage; import org.bigbluebutton.core.api.IBigBlueButtonInGW; import org.bigbluebutton.messages.CreateMeetingRequest; -import org.bigbluebutton.messages.RegisterUserMessage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -49,12 +45,6 @@ public class MeetingMessageReceiver implements MessageHandler { Gson gson = new Gson(); CreateMeetingRequest msg = gson.fromJson(message, CreateMeetingRequest.class); bbbGW.handleBigBlueButtonMessage(msg); - } else if (RegisterUserMessage.NAME.equals(messageName)) { - Gson gson = new Gson(); - RegisterUserMessage msg = gson.fromJson(message, RegisterUserMessage.class); - bbbGW.registerUser(msg.payload.meetingId, msg.payload.userId, msg.payload.name, msg.payload.role, - msg.payload.extUserId, msg.payload.authToken, msg.payload.avatarUrl, msg.payload.guest, - msg.payload.authed); } } } @@ -68,44 +58,6 @@ public class MeetingMessageReceiver implements MessageHandler { } else if (msg instanceof DestroyMeetingMessage) { DestroyMeetingMessage dmm = (DestroyMeetingMessage) msg; bbbGW.destroyMeeting(dmm.meetingId); - } else if (msg instanceof ValidateAuthTokenMessage) { - ValidateAuthTokenMessage vam = (ValidateAuthTokenMessage) msg; - String sessionId = "tobeimplemented"; - bbbGW.validateAuthToken(vam.meetingId, vam.userId, vam.token, vam.replyTo, sessionId); - } else if (msg instanceof UserConnectedToGlobalAudio) { - UserConnectedToGlobalAudio ustga = (UserConnectedToGlobalAudio) msg; - - Map<String, Object> logData = new HashMap<String, Object>(); - logData.put("voiceConf", ustga.voiceConf); - logData.put("userId", ustga.userid); - logData.put("username", ustga.name); - logData.put("event", "user_connected_to_global_audio"); - logData.put("description", "User connected to global audio."); - - /* - Gson gson = new Gson(); - String logStr = gson.toJson(logData); - System.out.println("User connected to global audio: data={}", logStr); - */ - bbbGW.userConnectedToGlobalAudio(ustga.voiceConf, ustga.userid, ustga.name); - } else if (msg instanceof UserDisconnectedFromGlobalAudio) { - UserDisconnectedFromGlobalAudio udfga = (UserDisconnectedFromGlobalAudio) msg; - - Map<String, Object> logData = new HashMap<String, Object>(); - logData.put("voiceConf", udfga.voiceConf); - logData.put("userId", udfga.userid); - logData.put("username", udfga.name); - logData.put("event", "user_disconnected_from_global_audio"); - logData.put("description", "User disconnected from global audio."); - - /* - Gson gson = new Gson(); - String logStr = gson.toJson(logData); - System.out.println("User disconnected from global audio: data={}", logStr); - */ - bbbGW.userDisconnectedFromGlobalAudio(udfga.voiceConf, udfga.userid, udfga.name); - } - else if (msg instanceof GetAllMeetingsRequest) { GetAllMeetingsRequest gamr = (GetAllMeetingsRequest) msg; bbbGW.getAllMeetings("no_need_of_a_meeting_id"); } else if (msg instanceof ActivityResponseMessage) { diff --git a/akka-bbb-apps/src/main/java/org/bigbluebutton/core/pubsub/receivers/PollingMessageReceiver.java b/akka-bbb-apps/src/main/java/org/bigbluebutton/core/pubsub/receivers/PollingMessageReceiver.java deleted file mode 100755 index 72cdd2586a7ce59bdad109b2c6a2125c9f768611..0000000000000000000000000000000000000000 --- a/akka-bbb-apps/src/main/java/org/bigbluebutton/core/pubsub/receivers/PollingMessageReceiver.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.bigbluebutton.core.pubsub.receivers; - -import org.bigbluebutton.common.messages.*; - -import com.google.gson.Gson; -import com.google.gson.JsonParser; -import com.google.gson.JsonObject; - -import org.bigbluebutton.core.api.IBigBlueButtonInGW; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class PollingMessageReceiver implements MessageHandler{ - private static final Logger log = LoggerFactory.getLogger(PollingMessageReceiver.class); - private IBigBlueButtonInGW bbbGW; - - public PollingMessageReceiver(IBigBlueButtonInGW bbbGW) { - this.bbbGW = bbbGW; - } - - @Override - public void handleMessage(String pattern, String channel, String message) { - if (channel.equalsIgnoreCase(MessagingConstants.TO_POLLING_CHANNEL)) { - log.debug("Polling message: " + channel + " " + message); - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (VotePollUserRequestMessage.VOTE_POLL_REQUEST.equals(messageName)) { - VotePollUserRequestMessage msg = VotePollUserRequestMessage.fromJson(message); - bbbGW.votePoll(msg.meetingId, msg.userId, msg.pollId, msg.questionId, msg.answerId); - } else if (StartPollRequestMessage.START_POLL_REQUEST.equals(messageName)){ - log.debug("Received StartPollRequest message"); - StartPollRequestMessage msg = StartPollRequestMessage.fromJson(message); - bbbGW.startPoll(msg.meetingId, msg.requesterId, msg.pollId, msg.pollType); - } else if (StopPollRequestMessage.STOP_POLL_REQUEST.equals(messageName)){ - StopPollRequestMessage msg = StopPollRequestMessage.fromJson(message); - bbbGW.stopPoll(msg.meetingId, msg.requesterId, msg.pollId); - } else if (ShowPollResultRequestMessage.SHOW_POLL_RESULT_REQUEST.equals(messageName)){ - ShowPollResultRequestMessage msg = ShowPollResultRequestMessage.fromJson(message); - bbbGW.showPollResult(msg.meetingId, msg.requesterId, msg.pollId, msg.show); - } else if (StartCustomPollRequestMessage.START_CUSTOM_POLL_REQUEST.equals(messageName)){ - Gson gson = new Gson(); - StartCustomPollRequestMessage msg = gson.fromJson(message, StartCustomPollRequestMessage.class); - bbbGW.handleBigBlueButtonMessage(msg); - } - } - } - } - } -} diff --git a/akka-bbb-apps/src/main/java/org/bigbluebutton/core/pubsub/receivers/PresentationMessageListener.java b/akka-bbb-apps/src/main/java/org/bigbluebutton/core/pubsub/receivers/PresentationMessageListener.java deleted file mode 100755 index d930296e22e74918d9011633ef222433030fbfd8..0000000000000000000000000000000000000000 --- a/akka-bbb-apps/src/main/java/org/bigbluebutton/core/pubsub/receivers/PresentationMessageListener.java +++ /dev/null @@ -1,179 +0,0 @@ -package org.bigbluebutton.core.pubsub.receivers; - -import java.util.HashMap; - -import org.bigbluebutton.common.messages.GetPresentationInfoMessage; -import org.bigbluebutton.common.messages.GetSlideInfoMessage; -import org.bigbluebutton.common.messages.GoToSlideMessage; -import org.bigbluebutton.common.messages.MessagingConstants; -import org.bigbluebutton.common.messages.RemovePresentationMessage; -import org.bigbluebutton.common.messages.ResizeAndMoveSlideMessage; -import org.bigbluebutton.common.messages.SendConversionCompletedMessage; -import org.bigbluebutton.common.messages.SendConversionUpdateMessage; -import org.bigbluebutton.common.messages.SendPageCountErrorMessage; -import org.bigbluebutton.common.messages.SendSlideGeneratedMessage; -import org.bigbluebutton.common.messages.SharePresentationMessage; -import org.bigbluebutton.core.api.IBigBlueButtonInGW; - -import com.google.gson.Gson; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import com.google.gson.reflect.TypeToken; - -public class PresentationMessageListener implements MessageHandler { - - public static final String OFFICE_DOC_CONVERSION_SUCCESS_KEY = "OFFICE_DOC_CONVERSION_SUCCESS"; - public static final String OFFICE_DOC_CONVERSION_FAILED_KEY = "OFFICE_DOC_CONVERSION_FAILED"; - public static final String OFFICE_DOC_CONVERSION_INVALID_KEY = "OFFICE_DOC_CONVERSION_INVALID"; - public static final String SUPPORTED_DOCUMENT_KEY = "SUPPORTED_DOCUMENT"; - public static final String UNSUPPORTED_DOCUMENT_KEY = "UNSUPPORTED_DOCUMENT"; - public static final String PAGE_COUNT_FAILED_KEY = "PAGE_COUNT_FAILED"; - public static final String PAGE_COUNT_EXCEEDED_KEY = "PAGE_COUNT_EXCEEDED"; - public static final String GENERATED_SLIDE_KEY = "GENERATED_SLIDE"; - public static final String GENERATING_THUMBNAIL_KEY = "GENERATING_THUMBNAIL"; - public static final String GENERATED_THUMBNAIL_KEY = "GENERATED_THUMBNAIL"; - public static final String CONVERSION_COMPLETED_KEY = "CONVERSION_COMPLETED"; - - private ConversionUpdatesProcessor conversionUpdatesProcessor; - private IBigBlueButtonInGW bbbInGW; - - public PresentationMessageListener(IBigBlueButtonInGW inGW) { - bbbInGW = inGW; - conversionUpdatesProcessor = new ConversionUpdatesProcessor(bbbInGW); - } - - private void sendConversionUpdate(String messageKey, String conference, - String code, String presId, String filename) { - - conversionUpdatesProcessor.sendConversionUpdate(messageKey, conference, - code, presId, filename); - } - - public void sendPageCountError(String messageKey, String conference, - String code, String presId, Integer numberOfPages, - Integer maxNumberPages, String filename) { - - conversionUpdatesProcessor.sendPageCountError(messageKey, conference, - code, presId, numberOfPages, - maxNumberPages, filename); - } - - private void sendSlideGenerated(String messageKey, String conference, - String code, String presId, Integer numberOfPages, - Integer pagesCompleted, String filename) { - - conversionUpdatesProcessor.sendSlideGenerated(messageKey, conference, - code, presId, numberOfPages, - pagesCompleted, filename); - } - - private void sendConversionCompleted(String messageKey, String conference, - String code, String presId, Integer numberOfPages, - String filename, String presBaseUrl, Boolean downloadable) { - - conversionUpdatesProcessor.sendConversionCompleted(messageKey, conference, - code, presId, numberOfPages, filename, presBaseUrl, downloadable); - } - - @Override - public void handleMessage(String pattern, String channel, String message) { - if (channel.equalsIgnoreCase(MessagingConstants.TO_PRESENTATION_CHANNEL)) { - System.out.println("Presentation message: " + channel + " " + message); - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (SendConversionUpdateMessage.SEND_CONVERSION_UPDATE.equals(messageName)) { - SendConversionUpdateMessage msg = SendConversionUpdateMessage.fromJson(message); -// sendConversionUpdate(msg.messageKey, msg.meetingId, msg.code, -// msg.presId, msg.presName); - bbbInGW.sendConversionUpdate(msg.messageKey, msg.meetingId, - msg.code, msg.presId, msg.presName); - } else if (ResizeAndMoveSlideMessage.RESIZE_AND_MOVE_SLIDE.equals(messageName)) { - ResizeAndMoveSlideMessage msg = ResizeAndMoveSlideMessage.fromJson(message); - bbbInGW.resizeAndMoveSlide(msg.meetingId, msg.xOffset, msg.yOffset, - msg.widthRatio, msg.heightRatio); - } else if (GetPresentationInfoMessage.GET_PRESENTATION_INFO.equals(messageName)) { - GetPresentationInfoMessage msg = GetPresentationInfoMessage.fromJson(message); - bbbInGW.getPresentationInfo(msg.meetingId, msg.requesterId, msg.replyTo); - } else if (SendConversionCompletedMessage.SEND_CONVERSION_COMPLETED.equals(messageName)) { - SendConversionCompletedMessage msg = SendConversionCompletedMessage.fromJson(message); -// sendConversionCompleted(msg.messageKey, msg.meetingId, msg.code, -// msg.presId, msg.numPages, msg.presName, msg.presBaseUrl); - bbbInGW.sendConversionCompleted(msg.messageKey, msg.meetingId, msg.code, - msg.presId, msg.numPages, msg.presName, msg.presBaseUrl, msg.downloadable); - } else if (SendPageCountErrorMessage.SEND_PAGE_COUNT_ERROR.equals(messageName)) { - SendPageCountErrorMessage msg = SendPageCountErrorMessage.fromJson(message); -// sendPageCountError(msg.messageKey, msg.meetingId, msg.code, -// msg.presId, msg.numberOfPages, msg.maxNumberPages, msg.presName); - bbbInGW.sendPageCountError(msg.messageKey, msg.meetingId, msg.code, - msg.presId, msg.numberOfPages, msg.maxNumberPages, msg.presName); - } else if (GoToSlideMessage.GO_TO_SLIDE.equals(messageName)) { - GoToSlideMessage msg = GoToSlideMessage.fromJson(message); - bbbInGW.gotoSlide(msg.meetingId, msg.page); - } else if (RemovePresentationMessage.REMOVE_PRESENTATION.equals(messageName)) { - RemovePresentationMessage msg = RemovePresentationMessage.fromJson(message); - bbbInGW.removePresentation(msg.meetingId, msg.presentationId); - } else if (SharePresentationMessage.SHARE_PRESENTATION.equals(messageName)) { - SharePresentationMessage msg = SharePresentationMessage.fromJson(message); - bbbInGW.sharePresentation(msg.meetingId, msg.presentationId, msg.share); - } else if (GetSlideInfoMessage.GET_SLIDE_INFO.equals(messageName)) { - GetSlideInfoMessage msg = GetSlideInfoMessage.fromJson(message); - bbbInGW.getSlideInfo(msg.meetingId, msg.requesterId, msg.replyTo); - } else if (SendSlideGeneratedMessage.SEND_SLIDE_GENERATED.equals(messageName)) { - - SendSlideGeneratedMessage msg = SendSlideGeneratedMessage.fromJson(message); - bbbInGW.sendSlideGenerated(msg.messageKey, msg.meetingId, msg.code, - msg.presId, msg.numberOfPages, msg.pagesCompleted, msg.presName); - } - } - } - else { - HashMap<String,String> map = new Gson().fromJson(message, new TypeToken<HashMap<String, String>>() {}.getType()); - String code = (String) map.get("returnCode"); - String presId = (String) map.get("presentationId"); - String filename = (String) map.get("filename"); - String conference = (String) map.get("conference"); - String messageKey = (String) map.get("messageKey"); - - if (messageKey.equalsIgnoreCase(OFFICE_DOC_CONVERSION_SUCCESS_KEY) || - messageKey.equalsIgnoreCase(OFFICE_DOC_CONVERSION_FAILED_KEY) || - messageKey.equalsIgnoreCase(OFFICE_DOC_CONVERSION_INVALID_KEY) || - messageKey.equalsIgnoreCase(SUPPORTED_DOCUMENT_KEY) || - messageKey.equalsIgnoreCase(UNSUPPORTED_DOCUMENT_KEY) || - messageKey.equalsIgnoreCase(GENERATING_THUMBNAIL_KEY) || - messageKey.equalsIgnoreCase(GENERATED_THUMBNAIL_KEY) || - messageKey.equalsIgnoreCase(PAGE_COUNT_FAILED_KEY)){ - - sendConversionUpdate(messageKey, conference, code, presId, filename); - } else if(messageKey.equalsIgnoreCase(PAGE_COUNT_EXCEEDED_KEY)){ - - Integer numberOfPages = new Integer((String) map.get("numberOfPages")); - Integer maxNumberPages = new Integer((String) map.get("maxNumberPages")); - sendPageCountError(messageKey, conference, code, - presId, numberOfPages, maxNumberPages, filename); - - } else if(messageKey.equalsIgnoreCase(GENERATED_SLIDE_KEY)){ - Integer numberOfPages = new Integer((String) map.get("numberOfPages")); - Integer pagesCompleted = new Integer((String) map.get("pagesCompleted")); - - sendSlideGenerated(messageKey, conference, code, - presId, numberOfPages, pagesCompleted, filename); - - } else if(messageKey.equalsIgnoreCase(CONVERSION_COMPLETED_KEY)){ - Integer numberOfPages = new Integer((String) map.get("numberOfPages")); - String presBaseUrl = (String) map.get("presentationBaseUrl"); - Boolean downloadable = new Boolean((String) map.get("downloadable")); - - sendConversionCompleted(messageKey, conference, code, - presId, numberOfPages, filename, presBaseUrl, downloadable); - } - } - } - } -} - diff --git a/akka-bbb-apps/src/main/java/org/bigbluebutton/core/pubsub/receivers/PreuploadedPresentation.java b/akka-bbb-apps/src/main/java/org/bigbluebutton/core/pubsub/receivers/PreuploadedPresentation.java deleted file mode 100755 index d864921355972be49884f4176a15083ad7843e73..0000000000000000000000000000000000000000 --- a/akka-bbb-apps/src/main/java/org/bigbluebutton/core/pubsub/receivers/PreuploadedPresentation.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.bigbluebutton.core.pubsub.receivers; - -public class PreuploadedPresentation { - - public final String id; - public final int numPages; - - public PreuploadedPresentation(String id, int numPages) { - this.id = id; - this.numPages = numPages; - } -} diff --git a/akka-bbb-apps/src/main/java/org/bigbluebutton/core/pubsub/receivers/RedisMessageReceiver.java b/akka-bbb-apps/src/main/java/org/bigbluebutton/core/pubsub/receivers/RedisMessageReceiver.java index d4c5bc1be3d782743eac4085ff28df43ad5bcc31..bdf67ff497c466c64a3c89a32cabd46b1cde3138 100755 --- a/akka-bbb-apps/src/main/java/org/bigbluebutton/core/pubsub/receivers/RedisMessageReceiver.java +++ b/akka-bbb-apps/src/main/java/org/bigbluebutton/core/pubsub/receivers/RedisMessageReceiver.java @@ -31,18 +31,9 @@ public class RedisMessageReceiver { } private void setupReceivers() { - LockMessageReceiver lockRx = new LockMessageReceiver(bbbGW); - receivers.add(lockRx); - - PresentationMessageListener presRx = new PresentationMessageListener(bbbGW); - receivers.add(presRx); - UsersMessageReceiver usersRx = new UsersMessageReceiver(bbbGW); receivers.add(usersRx); - PollingMessageReceiver pollRx = new PollingMessageReceiver(bbbGW); - receivers.add(pollRx); - MeetingMessageReceiver meetingRx = new MeetingMessageReceiver(bbbGW); receivers.add(meetingRx); } diff --git a/akka-bbb-apps/src/main/java/org/bigbluebutton/core/pubsub/receivers/UsersMessageReceiver.java b/akka-bbb-apps/src/main/java/org/bigbluebutton/core/pubsub/receivers/UsersMessageReceiver.java index c33b6de9fb6849ee59b7919a00771a41c610c6e5..444dc09ae71ed0e49463bb27f028be280eebbce5 100755 --- a/akka-bbb-apps/src/main/java/org/bigbluebutton/core/pubsub/receivers/UsersMessageReceiver.java +++ b/akka-bbb-apps/src/main/java/org/bigbluebutton/core/pubsub/receivers/UsersMessageReceiver.java @@ -30,234 +30,15 @@ public class UsersMessageReceiver implements MessageHandler{ if (header.has("name")) { String messageName = header.get("name").getAsString(); switch (messageName) { - case UserLeavingMessage.USER_LEAVING: - processUserLeavingMessage(message); - break; - case AllowUserToShareDesktopRequest.NAME: - processAllowUserToShareDesktopRequest(message); - break; - case AssignPresenterRequestMessage.ASSIGN_PRESENTER_REQUEST: - processAssignPresenterRequestMessage(message); - break; - case UserEmojiStatusMessage.USER_EMOJI_STATUS: - processUserEmojiStatusMessage(message); - break; - case EjectUserFromMeetingRequestMessage.EJECT_USER_FROM_MEETING_REQUEST: - processEjectUserFromMeetingRequestMessage(message); - break; - case UserShareWebcamRequestMessage.USER_SHARE_WEBCAM_REQUEST: - processUserShareWebcamRequestMessage(message); - break; - case UserUnshareWebcamRequestMessage.USER_UNSHARE_WEBCAM_REQUEST: - processUserUnshareWebcamRequestMessage(message); - break; - case SetUserStatusRequestMessage.SET_USER_STATUS_REQUEST: - processSetUserStatusRequestMessage(message); - break; case SetRecordingStatusRequestMessage.SET_RECORDING_STATUS_REQUEST: processSetRecordingStatusRequestMessage(message); break; case GetRecordingStatusRequestMessage.GET_RECORDING_STATUS_REQUEST: processGetRecordingStatusRequestMessage(message); break; - case GetUsersRequestMessage.GET_USERS_REQUEST: - processGetUsersRequestMessage(message); - break; - case InitPermissionsSettingMessage.INIT_PERMISSIONS_SETTING: - processInitPermissionsSettingMessage(message); - break; - case InitAudioSettingsMessage.INIT_AUDIO_SETTING: - processInitAudioSettingsMessage(message); - break; - case BroadcastLayoutRequestMessage.BROADCAST_LAYOUT_REQUEST: - processBroadcastLayoutRequestMessage(message); - break; - case LockLayoutRequestMessage.LOCK_LAYOUT_REQUEST: - processLockLayoutRequestMessage(message); - break; - case GetCurrentLayoutRequestMessage.GET_CURRENT_LAYOUT_REQUEST: - processGetCurrentLayoutRequestMessage(message); - break; - case MuteAllExceptPresenterRequestMessage.MUTE_ALL_EXCEPT_PRESENTER_REQUEST: - processMuteAllExceptPresenterRequestMessage(message); - break; - case MuteAllRequestMessage.MUTE_ALL_REQUEST: - processMuteAllRequestMessage(message); - break; - case IsMeetingMutedRequestMessage.IS_MEETING_MUTED_REQUEST: - processIsMeetingMutedRequestMessage(message); - break; - case MuteUserRequestMessage.MUTE_USER_REQUEST: - processMuteUserRequestMessage(message); - break; - case LockMuteUserRequestMessage.LOCK_MUTE_USER_REQUEST: - processLockMuteUserRequestMessage(message); - break; - case EjectUserFromVoiceRequestMessage.EJECT_USER_FROM_VOICE_REQUEST: - processEjectUserFromVoiceRequestMessage(message); - break; - case GetBreakoutRoomsList.NAME: - bbbInGW.handleJsonMessage(message); - break; - case CreateBreakoutRoomsRequest.NAME: - bbbInGW.handleJsonMessage(message); - break; - case ListenInOnBreakout.NAME: - bbbInGW.handleJsonMessage(message); - break; - case RequestBreakoutJoinURL.NAME: - bbbInGW.handleJsonMessage(message); - break; - case EndAllBreakoutRoomsRequest.NAME: - bbbInGW.handleJsonMessage(message); - break; - case ChangeUserRoleMessage.CHANGE_USER_ROLE: - processChangeUserRoleMessage(message); - break; - case GetGuestPolicyMessage.GET_GUEST_POLICY: - processGetGuestPolicyMessage(message); - break; - case SetGuestPolicyMessage.SET_GUEST_POLICY: - processSetGuestPolicyMessage(message); - break; - case RespondToGuestMessage.RESPOND_TO_GUEST: - processRespondToGuestMessage(message); - break; - case LogoutEndMeetingRequestMessage.LOGOUT_END_MEETING_REQUEST_MESSAGE: - processLogoutEndMeetingRequestMessage(message); - break; } } } - } else if (channel.equalsIgnoreCase(MessagingConstants.FROM_VOICE_CONF_SYSTEM_CHAN)) { - //System.out.println("Voice message: " + channel + " " + message); - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - switch (messageName) { - case UserJoinedVoiceConfMessage.USER_JOINED_VOICE_CONF: - processUserJoinedVoiceConfMessage(message); - break; - case UserLeftVoiceConfMessage.USER_LEFT_VOICE_CONF: - processUserLeftVoiceConfMessage(message); - break; - case UserLockedInVoiceConfMessage.USER_LOCKED_IN_VOICE_CONF: - processUserLockedInVoiceConfMessage(message); - break; - case UserMutedInVoiceConfMessage.USER_MUTED_IN_VOICE_CONF: - processUserMutedInVoiceConfMessage(message); - break; - case UserTalkingInVoiceConfMessage.USER_TALKING_IN_VOICE_CONF: - processUserTalkingInVoiceConfMessage(message); - break; - case VoiceConfRecordingStartedMessage.VOICE_CONF_RECORDING_STARTED: - processVoiceConfRecordingStartedMessage(message); - break; - } - } - } - } - } - - private void processUserJoinedVoiceConfMessage(String json) { - UserJoinedVoiceConfMessage msg = UserJoinedVoiceConfMessage.fromJson(json); - if (msg != null) { - bbbInGW.voiceUserJoined(msg.voiceConfId, msg.voiceUserId, msg.userId, msg.callerIdName, msg.callerIdNum, msg.muted, msg.avatarURL, msg.talking); - } - } - - private void processUserLeftVoiceConfMessage(String json) { - UserLeftVoiceConfMessage msg = UserLeftVoiceConfMessage.fromJson(json); - if (msg != null) { - bbbInGW.voiceUserLeft(msg.voiceConfId, msg.voiceUserId); - } - } - - private void processUserLockedInVoiceConfMessage(String json) { - UserLockedInVoiceConfMessage msg = UserLockedInVoiceConfMessage.fromJson(json); - if (msg != null) { - bbbInGW.voiceUserLocked(msg.voiceConfId, msg.voiceUserId, msg.locked); - } - } - - private void processUserMutedInVoiceConfMessage(String json) { - UserMutedInVoiceConfMessage msg = UserMutedInVoiceConfMessage.fromJson(json); - if (msg != null) { - bbbInGW.voiceUserMuted(msg.voiceConfId, msg.voiceUserId, msg.muted); - } - } - - private void processUserTalkingInVoiceConfMessage(String json) { - UserTalkingInVoiceConfMessage msg = UserTalkingInVoiceConfMessage.fromJson(json); - if (msg != null) { - bbbInGW.voiceUserTalking(msg.voiceConfId, msg.voiceUserId, msg.talking); - } - } - - private void processVoiceConfRecordingStartedMessage(String json) { - VoiceConfRecordingStartedMessage msg = VoiceConfRecordingStartedMessage.fromJson(json); - if (msg != null) { - bbbInGW.voiceRecording(msg.voiceConfId, msg.recordStream, msg.timestamp, msg.recording); - } - } - - private void processUserLeavingMessage(String message) { - UserLeavingMessage ulm = UserLeavingMessage.fromJson(message); - if (ulm != null) { - bbbInGW.userLeft(ulm.meetingId, ulm.userId, ulm.meetingId); - } - } - - private void processAllowUserToShareDesktopRequest(String message) { - AllowUserToShareDesktopRequest msg = AllowUserToShareDesktopRequest.fromJson(message); - if (msg != null) { - bbbInGW.checkIfAllowedToShareDesktop(msg.meetingId, msg.userId); - } - } - - private void processAssignPresenterRequestMessage(String message) { - AssignPresenterRequestMessage apm = AssignPresenterRequestMessage.fromJson(message); - if (apm != null) { - bbbInGW.assignPresenter(apm.meetingId, apm.newPresenterId, apm.newPresenterName, apm.assignedBy); - } - } - - private void processUserEmojiStatusMessage(String message) { - UserEmojiStatusMessage uesm = UserEmojiStatusMessage.fromJson(message); - if (uesm != null) { - bbbInGW.userEmojiStatus(uesm.meetingId, uesm.userId, uesm.emojiStatus); - } - } - - private void processEjectUserFromMeetingRequestMessage(String message) { - EjectUserFromMeetingRequestMessage eufm = EjectUserFromMeetingRequestMessage.fromJson(message); - if (eufm != null) { - bbbInGW.ejectUserFromMeeting(eufm.meetingId, eufm.userId, eufm.ejectedBy); - } - } - - private void processUserShareWebcamRequestMessage(String message) { - UserShareWebcamRequestMessage msg = UserShareWebcamRequestMessage.fromJson(message); - if (msg != null) { - bbbInGW.shareWebcam(msg.meetingId, msg.userId, msg.stream); - } - } - - private void processUserUnshareWebcamRequestMessage(String message) { - UserUnshareWebcamRequestMessage msg = UserUnshareWebcamRequestMessage.fromJson(message); - if (msg != null) { - bbbInGW.unshareWebcam(msg.meetingId, msg.userId, msg.stream); - } - } - - private void processSetUserStatusRequestMessage(String message) { - SetUserStatusRequestMessage msg = SetUserStatusRequestMessage.fromJson(message); - if (msg != null) { - bbbInGW.setUserStatus(msg.meetingId, msg.userId, msg.status, msg.value); } } @@ -274,123 +55,4 @@ public class UsersMessageReceiver implements MessageHandler{ bbbInGW.getRecordingStatus(msg.meetingId, msg.userId); } } - - private void processGetUsersRequestMessage(String message) { - GetUsersRequestMessage msg = GetUsersRequestMessage.fromJson(message); - if (msg != null) { - bbbInGW.getUsers(msg.meetingId, msg.requesterId); - } - } - - private void processInitPermissionsSettingMessage(String message) { - InitPermissionsSettingMessage msg = InitPermissionsSettingMessage.fromJson(message); - if (msg != null) { - bbbInGW.initLockSettings(msg.meetingId, msg.permissions); - } - } - - private void processInitAudioSettingsMessage(String message) { - InitAudioSettingsMessage msg = InitAudioSettingsMessage.fromJson(message); - if (msg != null) { - bbbInGW.initAudioSettings(msg.meetingId, msg.userId, msg.muted); - } - } - - private void processBroadcastLayoutRequestMessage(String message) { - BroadcastLayoutRequestMessage msg = BroadcastLayoutRequestMessage.fromJson(message); - if (msg != null) { - bbbInGW.broadcastLayout(msg.meetingId, msg.userId, msg.layout); - } - } - - private void processLockLayoutRequestMessage(String message) { - LockLayoutRequestMessage msg = LockLayoutRequestMessage.fromJson(message); - if (msg != null) { - bbbInGW.lockLayout(msg.meetingId, msg.userId, msg.lock, msg.viewersOnly, msg.layout); - } - } - - private void processGetCurrentLayoutRequestMessage(String message) { - GetCurrentLayoutRequestMessage msg = GetCurrentLayoutRequestMessage.fromJson(message); - if (msg != null) { - bbbInGW.getCurrentLayout(msg.meetingId, msg.userId); - } - } - - private void processMuteAllExceptPresenterRequestMessage(String message) { - MuteAllExceptPresenterRequestMessage msg = MuteAllExceptPresenterRequestMessage.fromJson(message); - if (msg != null) { - bbbInGW.muteAllExceptPresenter(msg.meetingId, msg.requesterId, msg.mute); - } - } - - private void processMuteAllRequestMessage(String message) { - MuteAllRequestMessage msg = MuteAllRequestMessage.fromJson(message); - if (msg != null) { - bbbInGW.muteAllUsers(msg.meetingId, msg.requesterId, msg.mute); - } - } - - private void processIsMeetingMutedRequestMessage(String message) { - IsMeetingMutedRequestMessage msg = IsMeetingMutedRequestMessage.fromJson(message); - if (msg != null) { - bbbInGW.isMeetingMuted(msg.meetingId, msg.requesterId); - } - } - - private void processMuteUserRequestMessage(String message) { - MuteUserRequestMessage msg = MuteUserRequestMessage.fromJson(message); - if (msg != null) { - bbbInGW.muteUser(msg.meetingId, msg.requesterId, msg.userId, msg.mute); - } - } - - private void processLockMuteUserRequestMessage(String message) { - LockMuteUserRequestMessage msg = LockMuteUserRequestMessage.fromJson(message); - if (msg != null) { - bbbInGW.lockMuteUser(msg.meetingId, msg.requesterId, msg.userId, msg.lock); - } - } - - private void processEjectUserFromVoiceRequestMessage(String message) { - EjectUserFromVoiceRequestMessage msg = EjectUserFromVoiceRequestMessage.fromJson(message); - if (msg != null) { - bbbInGW.ejectUserFromVoice(msg.meetingId, msg.userId, msg.requesterId); - } - } - - private void processChangeUserRoleMessage(String message) { - ChangeUserRoleMessage msg = ChangeUserRoleMessage.fromJson(message); - if (msg != null) { - bbbInGW.setUserRole(msg.meetingId, msg.userId, msg.role); - } - } - - private void processGetGuestPolicyMessage(String message) { - GetGuestPolicyMessage msg = GetGuestPolicyMessage.fromJson(message); - if (msg != null) { - bbbInGW.getGuestPolicy(msg.meetingId, msg.requesterId); - } - } - - private void processSetGuestPolicyMessage(String message) { - SetGuestPolicyMessage msg = SetGuestPolicyMessage.fromJson(message); - if (msg != null) { - bbbInGW.setGuestPolicy(msg.meetingId, msg.guestPolicy, msg.setBy); - } - } - - private void processRespondToGuestMessage(String message) { - RespondToGuestMessage msg = RespondToGuestMessage.fromJson(message); - if (msg != null) { - bbbInGW.responseToGuest(msg.meetingId, msg.userId, msg.response, msg.requesterId); - } - } - - private void processLogoutEndMeetingRequestMessage(String message) { - LogoutEndMeetingRequestMessage lemm = LogoutEndMeetingRequestMessage.fromJson(message); - if (lemm != null) { - bbbInGW.logoutEndMeeting(lemm.meetingId, lemm.userId); - } - } } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/Boot.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/Boot.scala index c0c4aba5f6c52762aeca0b77b40e9923a0179899..179dbb5f6e4c733bfa8944e10a2b726b0eb0579e 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/Boot.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/Boot.scala @@ -3,13 +3,9 @@ package org.bigbluebutton import akka.event.Logging import akka.actor.ActorSystem import org.bigbluebutton.endpoint.redis.{ AppsRedisSubscriberActor, KeepAliveRedisPublisher, RedisPublisher, RedisRecorderActor } -import org.bigbluebutton.core.BigBlueButtonInGW -import org.bigbluebutton.core.MessageSender -import org.bigbluebutton.core.OutMessageGateway -import org.bigbluebutton.core.MessageSenderActor +import org.bigbluebutton.core._ import org.bigbluebutton.core.pubsub.receivers.RedisMessageReceiver import org.bigbluebutton.core.bus._ -import org.bigbluebutton.core.JsonMessageSenderActor import org.bigbluebutton.core.pubsub.senders.ReceivedJsonMsgHandlerActor import org.bigbluebutton.core2.FromAkkaAppsMsgSenderActor @@ -19,24 +15,19 @@ object Boot extends App with SystemConfiguration { implicit val executor = system.dispatcher val logger = Logging(system, getClass) - val eventBus = new IncomingEventBus - val outgoingEventBus = new OutgoingEventBus + val eventBus = new InMsgBusGW(new IncomingEventBusImp()) + val outBus2 = new OutEventBus2 val recordingEventBus = new RecordingEventBus - val outGW = new OutMessageGateway(outgoingEventBus, outBus2, recordingEventBus) + + val outGW = new OutMessageGatewayImp(outBus2) val redisPublisher = new RedisPublisher(system) val msgSender = new MessageSender(redisPublisher) val redisRecorderActor = system.actorOf(RedisRecorderActor.props(system), "redisRecorderActor") - val messageSenderActor = system.actorOf(MessageSenderActor.props(msgSender), "messageSenderActor") - val newMessageSenderActor = system.actorOf(JsonMessageSenderActor.props(msgSender), "newMessageSenderActor") - - outgoingEventBus.subscribe(messageSenderActor, outMessageChannel) - - outgoingEventBus.subscribe(redisRecorderActor, outMessageChannel) - outgoingEventBus.subscribe(newMessageSenderActor, outMessageChannel) + recordingEventBus.subscribe(redisRecorderActor, outMessageChannel) val incomingJsonMessageBus = new IncomingJsonMessageBus val bbbMsgBus = new BbbMsgRouterEventBus diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/BigBlueButtonActor.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/BigBlueButtonActor.scala index 8ee63eb09283035aeed75379ab9863f2d4b82650..cff9aba653dcf4265717ae98239f529688411ec6 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/BigBlueButtonActor.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/BigBlueButtonActor.scala @@ -19,16 +19,20 @@ import org.bigbluebutton.core2.RunningMeetings import org.bigbluebutton.core2.message.senders.MsgBuilder object BigBlueButtonActor extends SystemConfiguration { - def props(system: ActorSystem, - eventBus: IncomingEventBus, + def props( + system: ActorSystem, + eventBus: InternalEventBus, bbbMsgBus: BbbMsgRouterEventBus, - outGW: OutMessageGateway): Props = + outGW: OutMessageGateway + ): Props = Props(classOf[BigBlueButtonActor], system, eventBus, bbbMsgBus, outGW) } -class BigBlueButtonActor(val system: ActorSystem, - val eventBus: IncomingEventBus, val bbbMsgBus: BbbMsgRouterEventBus, - val outGW: OutMessageGateway) extends Actor +class BigBlueButtonActor( + val system: ActorSystem, + val eventBus: InternalEventBus, val bbbMsgBus: BbbMsgRouterEventBus, + val outGW: OutMessageGateway +) extends Actor with ActorLogging with SystemConfiguration { implicit def executionContext = system.dispatcher @@ -55,28 +59,21 @@ class BigBlueButtonActor(val system: ActorSystem, } def receive = { + // Internal messages + case msg: DestroyMeetingInternalMsg => handleDestroyMeeting(msg) + // 2x messages - case msg: BbbCommonEnvCoreMsg => handleBbbCommonEnvCoreMsg(msg) - - // 1x messages - case msg: ValidateAuthToken => handleValidateAuthToken(msg) - case msg: UserJoinedVoiceConfMessage => handleUserJoinedVoiceConfMessage(msg) - case msg: UserLeftVoiceConfMessage => handleUserLeftVoiceConfMessage(msg) - case msg: UserLockedInVoiceConfMessage => handleUserLockedInVoiceConfMessage(msg) - case msg: UserMutedInVoiceConfMessage => handleUserMutedInVoiceConfMessage(msg) - case msg: UserTalkingInVoiceConfMessage => handleUserTalkingInVoiceConfMessage(msg) - case msg: VoiceConfRecordingStartedMessage => handleVoiceConfRecordingStartedMessage(msg) - case _ => // do nothing + case msg: BbbCommonEnvCoreMsg => handleBbbCommonEnvCoreMsg(msg) + case _ => // do nothing } private def handleBbbCommonEnvCoreMsg(msg: BbbCommonEnvCoreMsg): Unit = { msg.core match { - case m: CreateMeetingReqMsg => handleCreateMeetingReqMsg(m) - case m: RegisterUserReqMsg => handleRegisterUserReqMsg(m) + case m: CreateMeetingReqMsg => handleCreateMeetingReqMsg(m) + case m: RegisterUserReqMsg => handleRegisterUserReqMsg(m) case m: GetAllMeetingsReqMsg => handleGetAllMeetingsReqMsg(m) - case m: PubSubPingSysReqMsg => handlePubSubPingSysReqMsg(m) - case m: DestroyMeetingSysCmdMsg => handleDestroyMeeting(m) - case _ => log.warning("Cannot handle " + msg.envelope.name) + case m: PubSubPingSysReqMsg => handlePubSubPingSysReqMsg(m) + case _ => log.warning("Cannot handle " + msg.envelope.name) } } @@ -94,7 +91,7 @@ class BigBlueButtonActor(val system: ActorSystem, log.debug("****** RECEIVED CreateMeetingReqMsg msg {}", msg) RunningMeetings.findWithId(meetings, msg.body.props.meetingProp.intId) match { - case None => { + case None => log.info("Create meeting request. meetingId={}", msg.body.props.meetingProp.intId) val m = RunningMeeting(msg.body.props, outGW, eventBus) @@ -110,16 +107,14 @@ class BigBlueButtonActor(val system: ActorSystem, RunningMeetings.add(meetings, m) - m.actorRef ! new InitializeMeeting(m.props.meetingProp.intId, m.props.recordProp.record) - // Send new 2x message val msgEvent = MsgBuilder.buildMeetingCreatedEvtMsg(m.props.meetingProp.intId, msg.body.props) - outGW.send(msgEvent) - } - case Some(m) => { + m.outMsgRouter.send(msgEvent) + + case Some(m) => log.info("Meeting already created. meetingID={}", msg.body.props.meetingProp.intId) - // do nothing - } + // do nothing + } } @@ -130,112 +125,42 @@ class BigBlueButtonActor(val system: ActorSystem, }) } - private def findMeetingWithVoiceConfId(voiceConfId: String): Option[RunningMeeting] = { - RunningMeetings.findMeetingWithVoiceConfId(meetings, voiceConfId) - } - - private def handleUserJoinedVoiceConfMessage(msg: UserJoinedVoiceConfMessage) { - findMeetingWithVoiceConfId(msg.voiceConfId) foreach { m => m.actorRef ! msg } - } - - private def handleUserLeftVoiceConfMessage(msg: UserLeftVoiceConfMessage) { - findMeetingWithVoiceConfId(msg.voiceConfId) foreach { m => - m.actorRef ! msg - } - } - - private def handleUserLockedInVoiceConfMessage(msg: UserLockedInVoiceConfMessage) { - findMeetingWithVoiceConfId(msg.voiceConfId) foreach { m => - m.actorRef ! msg - } - } - - private def handleUserMutedInVoiceConfMessage(msg: UserMutedInVoiceConfMessage) { - findMeetingWithVoiceConfId(msg.voiceConfId) foreach { m => - m.actorRef ! msg - } - } - - private def handleVoiceConfRecordingStartedMessage(msg: VoiceConfRecordingStartedMessage) { - findMeetingWithVoiceConfId(msg.voiceConfId) foreach { m => - m.actorRef ! msg - } - - } - - private def handleUserTalkingInVoiceConfMessage(msg: UserTalkingInVoiceConfMessage) { - findMeetingWithVoiceConfId(msg.voiceConfId) foreach { m => - m.actorRef ! msg - } - } - - private def handleValidateAuthToken(msg: ValidateAuthToken) { - for { - m <- RunningMeetings.findWithId(meetings, msg.meetingID) - } yield { - m.actorRef forward (msg) - } - - //meetings.get(msg.meetingID) foreach { m => - // m.actorRef ! msg - - // val future = m.actorRef.ask(msg)(5 seconds) - // future onComplete { - // case Success(result) => { - // log.info("Validate auth token response. meetingId=" + msg.meetingID + " userId=" + msg.userId + " token=" + msg.token) - // /** - // * Received a reply from MeetingActor which means hasn't hung! - // * Sometimes, the actor seems to hang and doesn't anymore accept messages. This is a simple - // * audit to check whether the actor is still alive. (ralam feb 25, 2015) - // */ - // } - // case Failure(failure) => { - // log.warning("Validate auth token timeout. meetingId=" + msg.meetingID + " userId=" + msg.userId + " token=" + msg.token) - // outGW.send(new ValidateAuthTokenTimedOut(msg.meetingID, msg.userId, msg.token, false, msg.correlationId)) - // } - // } - //} - } - private def handlePubSubPingSysReqMsg(msg: PubSubPingSysReqMsg): Unit = { val event = MsgBuilder.buildPubSubPongSysRespMsg(msg.body.system, msg.body.timestamp) outGW.send(event) } - private def handleDestroyMeeting(msg: DestroyMeetingSysCmdMsg): Unit = { + private def handleDestroyMeeting(msg: DestroyMeetingInternalMsg): Unit = { for { - m <- RunningMeetings.findWithId(meetings, msg.body.meetingId) - m2 <- RunningMeetings.remove(meetings, msg.body.meetingId) + m <- RunningMeetings.findWithId(meetings, msg.meetingId) + m2 <- RunningMeetings.remove(meetings, msg.meetingId) } yield { - // send the message for MeetingActor to handle too - m.actorRef ! msg + /** Unsubscribe to meeting and voice events. **/ + eventBus.unsubscribe(m.actorRef, m.props.meetingProp.intId) + eventBus.unsubscribe(m.actorRef, m.props.voiceProp.voiceConf) + eventBus.unsubscribe(m.actorRef, m.props.screenshareProps.screenshareConf) + + bbbMsgBus.unsubscribe(m.actorRef, m.props.meetingProp.intId) + bbbMsgBus.unsubscribe(m.actorRef, m.props.voiceProp.voiceConf) + bbbMsgBus.unsubscribe(m.actorRef, m.props.screenshareProps.screenshareConf) - // Delay sending DisconnectAllUsers because of RTMPT connection being dropped before UserEject message arrives to the client + // Delay sending DisconnectAllUsers to allow messages to reach the client + // before the connections are closed. context.system.scheduler.scheduleOnce(Duration.create(2500, TimeUnit.MILLISECONDS)) { // Disconnect all clients - val disconnectEvnt = MsgBuilder.buildDisconnectAllClientsSysMsg(msg.body.meetingId) - outGW.send(disconnectEvnt) - - log.info("Destroyed meetingId={}", msg.body.meetingId) - val destroyedEvent = MsgBuilder.buildMeetingDestroyedEvtMsg(msg.body.meetingId) - outGW.send(destroyedEvent) + val disconnectEvnt = MsgBuilder.buildDisconnectAllClientsSysMsg(msg.meetingId) + m2.outMsgRouter.send(disconnectEvnt) - /** Unsubscribe to meeting and voice events. **/ - eventBus.unsubscribe(m.actorRef, m.props.meetingProp.intId) - eventBus.unsubscribe(m.actorRef, m.props.voiceProp.voiceConf) - eventBus.unsubscribe(m.actorRef, m.props.screenshareProps.screenshareConf) - - bbbMsgBus.unsubscribe(m.actorRef, m.props.meetingProp.intId) - bbbMsgBus.unsubscribe(m.actorRef, m.props.voiceProp.voiceConf) - bbbMsgBus.unsubscribe(m.actorRef, m.props.screenshareProps.screenshareConf) + log.info("Destroyed meetingId={}", msg.meetingId) + val destroyedEvent = MsgBuilder.buildMeetingDestroyedEvtMsg(msg.meetingId) + m2.outMsgRouter.send(destroyedEvent) // Stop the meeting actor. context.stop(m.actorRef) } } - } } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/BigBlueButtonInGW.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/BigBlueButtonInGW.scala index 45ba0ee954d71edf8b9e7853e9b2cbad88e4713f..35ba4d4ace7c8b58fcc5490f7c23ac20369ac533 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/BigBlueButtonInGW.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/BigBlueButtonInGW.scala @@ -4,24 +4,21 @@ import org.bigbluebutton.core.bus._ import org.bigbluebutton.core.api._ import scala.collection.JavaConversions._ -import org.bigbluebutton.core.apps.{ Presentation } import akka.actor.ActorSystem import org.bigbluebutton.common.messages.IBigBlueButtonMessage -import org.bigbluebutton.common.messages.StartCustomPollRequestMessage import org.bigbluebutton.common.messages.PubSubPingMessage import org.bigbluebutton.messages._ import akka.event.Logging import org.bigbluebutton.SystemConfiguration -import org.bigbluebutton.common2.domain.PageVO -import org.bigbluebutton.core.models.{ GuestPolicyType, Roles } import scala.collection.JavaConverters class BigBlueButtonInGW( val system: ActorSystem, - eventBus: IncomingEventBus, - bbbMsgBus: BbbMsgRouterEventBus, - outGW: OutMessageGateway) extends IBigBlueButtonInGW with SystemConfiguration { + eventBus: InternalEventBus, + bbbMsgBus: BbbMsgRouterEventBus, + outGW: OutMessageGateway +) extends IBigBlueButtonInGW with SystemConfiguration { val log = Logging(system, getClass) val bbbActor = system.actorOf(BigBlueButtonActor.props(system, eventBus, bbbMsgBus, outGW), "bigbluebutton-actor") @@ -32,25 +29,20 @@ class BigBlueButtonInGW( def handleBigBlueButtonMessage(message: IBigBlueButtonMessage) { message match { - case msg: StartCustomPollRequestMessage => { - eventBus.publish( - BigBlueButtonEvent(msg.payload.meetingId, - new StartCustomPollRequest(msg.payload.meetingId, msg.payload.requesterId, - msg.payload.pollId, msg.payload.pollType, msg.payload.answers))) - } case msg: PubSubPingMessage => { eventBus.publish( - BigBlueButtonEvent("meeting-manager", new PubSubPing(msg.payload.system, msg.payload.timestamp))) + BigBlueButtonEvent("meeting-manager", new PubSubPing(msg.payload.system, msg.payload.timestamp)) + ) } case msg: CreateMeetingRequest => { - val policy = msg.payload.guestPolicy.toUpperCase() match { + /*val policy = msg.payload.guestPolicy.toUpperCase() match { case "ALWAYS_ACCEPT" => GuestPolicyType.ALWAYS_ACCEPT - case "ALWAYS_DENY" => GuestPolicyType.ALWAYS_DENY + case "ALWAYS_DENY" => GuestPolicyType.ALWAYS_DENY case "ASK_MODERATOR" => GuestPolicyType.ASK_MODERATOR //default - case undef => GuestPolicyType.ASK_MODERATOR - } + case undef => GuestPolicyType.ASK_MODERATOR + }*/ /* val mProps = new MeetingProperties( msg.payload.id, @@ -81,31 +73,15 @@ class BigBlueButtonInGW( } } - def handleJsonMessage(json: String) { - JsonMessageDecoder.decode(json) match { - case Some(validMsg) => forwardMessage(validMsg) - case None => log.error("Unhandled json message: {}", json) - } - } - - def forwardMessage(msg: InMessage) = { - msg match { - case m: BreakoutRoomsListMessage => eventBus.publish(BigBlueButtonEvent(m.meetingId, m)) - case m: CreateBreakoutRooms => eventBus.publish(BigBlueButtonEvent(m.meetingId, m)) - case m: RequestBreakoutJoinURLInMessage => eventBus.publish(BigBlueButtonEvent(m.meetingId, m)) - case m: TransferUserToMeetingRequest => eventBus.publish(BigBlueButtonEvent(m.meetingId, m)) - case m: EndAllBreakoutRooms => eventBus.publish(BigBlueButtonEvent(m.meetingId, m)) - case _ => log.error("Unhandled message: {}", msg) - } - } - def destroyMeeting(meetingID: String) { - forwardMessage(new EndAllBreakoutRooms(meetingID)) eventBus.publish( BigBlueButtonEvent( "meeting-manager", - new DestroyMeeting( - meetingID))) + new DestroyMeetingInternalMsg( + meetingID + ) + ) + ) } def getAllMeetings(meetingID: String) { @@ -116,10 +92,6 @@ class BigBlueButtonInGW( eventBus.publish(BigBlueButtonEvent("meeting-manager", new KeepAliveMessage(aliveId))) } - def lockSettings(meetingID: String, locked: java.lang.Boolean, - lockSettings: java.util.Map[String, java.lang.Boolean]) { - } - def statusMeetingAudit(meetingID: String) { } @@ -141,77 +113,6 @@ class BigBlueButtonInGW( * Message Interface for Users * *********************************************************** */ - def validateAuthToken(meetingId: String, userId: String, token: String, correlationId: String, sessionId: String) { - eventBus.publish(BigBlueButtonEvent(meetingId, new ValidateAuthToken(meetingId, userId, token, correlationId, sessionId))) - } - - def registerUser(meetingID: String, userID: String, name: String, role: String, extUserID: String, - authToken: String, avatarURL: String, guest: java.lang.Boolean, authed: java.lang.Boolean): Unit = { - val userRole = if (role == "MODERATOR") Roles.MODERATOR_ROLE else Roles.VIEWER_ROLE - eventBus.publish(BigBlueButtonEvent(meetingID, new RegisterUser(meetingID, userID, name, userRole, - extUserID, authToken, avatarURL, guest, authed))) - } - - def sendLockSettings(meetingID: String, userId: String, settings: java.util.Map[String, java.lang.Boolean]) { - // Convert java.util.Map to scala.collection.immutable.Map - // settings.mapValues -> convaert java Map to scala mutable Map - // v => v.booleanValue() -> convert java Boolean to Scala Boolean - // toMap -> converts from scala mutable map to scala immutable map - val s = settings.mapValues(v => v.booleanValue() /* convert java Boolean to Scala Boolean */ ).toMap - val disableCam = s.getOrElse("disableCam", false) - val disableMic = s.getOrElse("disableMic", false) - val disablePrivChat = s.getOrElse("disablePrivateChat", false) - val disablePubChat = s.getOrElse("disablePublicChat", false) - val lockedLayout = s.getOrElse("lockedLayout", false) - val lockOnJoin = s.getOrElse("lockOnJoin", false) - val lockOnJoinConfigurable = s.getOrElse("lockOnJoinConfigurable", false) - - val permissions = new Permissions(disableCam = disableCam, - disableMic = disableMic, - disablePrivChat = disablePrivChat, - disablePubChat = disablePubChat, - lockedLayout = lockedLayout, - lockOnJoin = lockOnJoin, - lockOnJoinConfigurable = lockOnJoinConfigurable) - - eventBus.publish(BigBlueButtonEvent(meetingID, new SetLockSettings(meetingID, userId, permissions))) - } - - def initLockSettings(meetingID: String, settings: java.util.Map[String, java.lang.Boolean]) { - // Convert java.util.Map to scala.collection.immutable.Map - // settings.mapValues -> convert java Map to scala mutable Map - // v => v.booleanValue() -> convert java Boolean to Scala Boolean - // toMap -> converts from scala mutable map to scala immutable map - val s = settings.mapValues(v => v.booleanValue() /* convert java Boolean to Scala Boolean */ ).toMap - val disableCam = s.getOrElse("disableCam", false) - val disableMic = s.getOrElse("disableMic", false) - val disablePrivChat = s.getOrElse("disablePrivateChat", false) - val disablePubChat = s.getOrElse("disablePublicChat", false) - val lockedLayout = s.getOrElse("lockedLayout", false) - val lockOnJoin = s.getOrElse("lockOnJoin", false) - val lockOnJoinConfigurable = s.getOrElse("lockOnJoinConfigurable", false) - val permissions = new Permissions(disableCam = disableCam, - disableMic = disableMic, - disablePrivChat = disablePrivChat, - disablePubChat = disablePubChat, - lockedLayout = lockedLayout, - lockOnJoin = lockOnJoin, - lockOnJoinConfigurable = lockOnJoinConfigurable) - - eventBus.publish(BigBlueButtonEvent(meetingID, new InitLockSettings(meetingID, permissions))) - } - - def initAudioSettings(meetingID: String, requesterID: String, muted: java.lang.Boolean) { - eventBus.publish(BigBlueButtonEvent(meetingID, new InitAudioSettings(meetingID, requesterID, muted.booleanValue()))) - } - - def getLockSettings(meetingId: String, userId: String) { - eventBus.publish(BigBlueButtonEvent(meetingId, new GetLockSettings(meetingId, userId))) - } - - def lockUser(meetingId: String, requesterID: String, lock: Boolean, userId: String) { - eventBus.publish(BigBlueButtonEvent(meetingId, new LockUserRequest(meetingId, requesterID, userId, lock))) - } def setRecordingStatus(meetingId: String, userId: String, recording: java.lang.Boolean) { eventBus.publish(BigBlueButtonEvent(meetingId, new SetRecordingStatus(meetingId, userId, recording.booleanValue()))) @@ -221,252 +122,6 @@ class BigBlueButtonInGW( eventBus.publish(BigBlueButtonEvent(meetingId, new GetRecordingStatus(meetingId, userId))) } - // Users - def userEmojiStatus(meetingId: String, userId: String, emojiStatus: String) { - eventBus.publish(BigBlueButtonEvent(meetingId, new UserEmojiStatus(meetingId, userId, emojiStatus))) - } - - def ejectUserFromMeeting(meetingId: String, userId: String, ejectedBy: String) { - - } - - def logoutEndMeeting(meetingId: String, userId: String) { - eventBus.publish(BigBlueButtonEvent(meetingId, new LogoutEndMeeting(meetingId, userId))) - } - - def shareWebcam(meetingId: String, userId: String, stream: String) { - eventBus.publish(BigBlueButtonEvent(meetingId, new UserShareWebcam(meetingId, userId, stream))) - } - - def unshareWebcam(meetingId: String, userId: String, stream: String) { - eventBus.publish(BigBlueButtonEvent(meetingId, new UserUnshareWebcam(meetingId, userId, stream))) - } - - def setUserStatus(meetingID: String, userID: String, status: String, value: Object) { - eventBus.publish(BigBlueButtonEvent(meetingID, new ChangeUserStatus(meetingID, userID, status, value))) - } - - def setUserRole(meetingID: String, userID: String, role: String) { - - } - - def getUsers(meetingID: String, requesterID: String) { - eventBus.publish(BigBlueButtonEvent(meetingID, new GetUsers(meetingID, requesterID))) - } - - def userLeft(meetingID: String, userID: String, sessionId: String): Unit = { - eventBus.publish(BigBlueButtonEvent(meetingID, new UserLeaving(meetingID, userID, sessionId))) - } - - def userJoin(meetingID: String, userID: String, authToken: String): Unit = { - eventBus.publish(BigBlueButtonEvent(meetingID, new UserJoining(meetingID, userID, authToken))) - } - - def checkIfAllowedToShareDesktop(meetingID: String, userID: String): Unit = { - eventBus.publish(BigBlueButtonEvent(meetingID, AllowUserToShareDesktop(meetingID: String, - userID: String))) - } - - def assignPresenter(meetingID: String, newPresenterID: String, newPresenterName: String, assignedBy: String): Unit = { - eventBus.publish(BigBlueButtonEvent(meetingID, new AssignPresenter(meetingID, newPresenterID, newPresenterName, assignedBy))) - } - - def getCurrentPresenter(meetingID: String, requesterID: String): Unit = { - // do nothing - } - - def userConnectedToGlobalAudio(voiceConf: String, userid: String, name: String) { - // we are required to pass the meeting_id as first parameter (just to satisfy trait) - // but it's not used anywhere. That's why we pass voiceConf twice instead - eventBus.publish(BigBlueButtonEvent(voiceConf, new UserConnectedToGlobalAudio(voiceConf, voiceConf, userid, name))) - } - - def userDisconnectedFromGlobalAudio(voiceConf: String, userid: String, name: String) { - // we are required to pass the meeting_id as first parameter (just to satisfy trait) - // but it's not used anywhere. That's why we pass voiceConf twice instead - eventBus.publish(BigBlueButtonEvent(voiceConf, new UserDisconnectedFromGlobalAudio(voiceConf, voiceConf, userid, name))) - } - - /** - * *********************************************************************** - * Message Interface for Guest - * ******************************************************************* - */ - - def getGuestPolicy(meetingId: String, requesterId: String) { - eventBus.publish(BigBlueButtonEvent(meetingId, new GetGuestPolicy(meetingId, requesterId))) - } - - def setGuestPolicy(meetingId: String, guestPolicy: String, requesterId: String) { - val policy = guestPolicy.toUpperCase() match { - case "ALWAYS_ACCEPT" => GuestPolicyType.ALWAYS_ACCEPT - case "ALWAYS_DENY" => GuestPolicyType.ALWAYS_DENY - case "ASK_MODERATOR" => GuestPolicyType.ASK_MODERATOR - //default - case undef => GuestPolicyType.ASK_MODERATOR - } - eventBus.publish(BigBlueButtonEvent(meetingId, new SetGuestPolicy(meetingId, policy, requesterId))) - } - - def responseToGuest(meetingId: String, userId: String, response: java.lang.Boolean, requesterId: String) { - eventBus.publish(BigBlueButtonEvent(meetingId, new RespondToGuest(meetingId, userId, response, requesterId))) - } - - /** - * ************************************************************************************ - * Message Interface for Presentation - * ************************************************************************************ - */ - - def clear(meetingID: String) { - eventBus.publish(BigBlueButtonEvent(meetingID, new ClearPresentation(meetingID))) - } - - def sendConversionUpdate(messageKey: String, meetingId: String, code: String, presentationId: String, presName: String) { - eventBus.publish(BigBlueButtonEvent(meetingId, new PresentationConversionUpdate(meetingId, messageKey, code, presentationId, presName))) - } - - def sendPageCountError(messageKey: String, meetingId: String, code: String, presentationId: String, numberOfPages: Int, maxNumberPages: Int, presName: String) { - eventBus.publish(BigBlueButtonEvent(meetingId, new PresentationPageCountError(meetingId, messageKey, code, presentationId, numberOfPages, maxNumberPages, presName))) - } - - def sendSlideGenerated(messageKey: String, meetingId: String, code: String, presentationId: String, numberOfPages: Int, pagesCompleted: Int, presName: String) { - eventBus.publish(BigBlueButtonEvent(meetingId, new PresentationSlideGenerated(meetingId, messageKey, code, presentationId, numberOfPages, pagesCompleted, presName))) - } - - def generatePresentationPages(presId: String, numPages: Int, presBaseUrl: String): scala.collection.immutable.Map[String, PageVO] = { - var pages = new scala.collection.mutable.HashMap[String, PageVO] - for (i <- 1 to numPages) { - val id = presId + "/" + i - val num = i; - val current = if (i == 1) true else false - val thumbnail = presBaseUrl + "/thumbnail/" + i - val swfUri = presBaseUrl + "/slide/" + i - - val txtUri = presBaseUrl + "/textfiles/" + i - val svgUri = presBaseUrl + "/svg/" + i - - val p = new PageVO(id = id, num = num, thumbUri = thumbnail, swfUri = swfUri, - txtUri = txtUri, svgUri = svgUri, - current = current) - pages += p.id -> p - } - - pages.toMap - } - - def sendConversionCompleted(messageKey: String, meetingId: String, code: String, presentationId: String, numPages: Int, presName: String, presBaseUrl: String, downloadable: Boolean) { - - val pages = generatePresentationPages(presentationId, numPages, presBaseUrl) - val presentation = new Presentation(id = presentationId, name = presName, current = true, pages = pages, downloadable = downloadable) - eventBus.publish(BigBlueButtonEvent(meetingId, new PresentationConversionCompleted(meetingId, messageKey, code, presentation))) - - } - - def removePresentation(meetingID: String, presentationID: String) { - eventBus.publish(BigBlueButtonEvent(meetingID, new RemovePresentation(meetingID, presentationID))) - } - - def getPresentationInfo(meetingID: String, requesterID: String, replyTo: String) { - eventBus.publish(BigBlueButtonEvent(meetingID, new GetPresentationInfo(meetingID, requesterID, replyTo))) - } - - def resizeAndMoveSlide(meetingID: String, xOffset: Double, yOffset: Double, widthRatio: Double, heightRatio: Double) { - eventBus.publish(BigBlueButtonEvent(meetingID, new ResizeAndMoveSlide(meetingID, xOffset, yOffset, widthRatio, heightRatio))) - } - - def gotoSlide(meetingID: String, pageId: String) { - // println("**** Forwarding GotoSlide for meeting[" + meetingID + "] ****") - eventBus.publish(BigBlueButtonEvent(meetingID, new GotoSlide(meetingID, pageId))) - } - - def sharePresentation(meetingID: String, presentationID: String, share: Boolean) { - eventBus.publish(BigBlueButtonEvent(meetingID, new SharePresentation(meetingID, presentationID, share))) - } - - def getSlideInfo(meetingID: String, requesterID: String, replyTo: String) { - eventBus.publish(BigBlueButtonEvent(meetingID, new GetSlideInfo(meetingID, requesterID, replyTo))) - } - - /** - * *********************************************************************** - * Message Interface for Layout - * ******************************************************************* - */ - - def getCurrentLayout(meetingID: String, requesterID: String) { - eventBus.publish(BigBlueButtonEvent(meetingID, new GetCurrentLayoutRequest(meetingID, requesterID))) - } - - def broadcastLayout(meetingID: String, requesterID: String, layout: String) { - eventBus.publish(BigBlueButtonEvent(meetingID, new BroadcastLayoutRequest(meetingID, requesterID, layout))) - } - - def lockLayout(meetingId: String, setById: String, lock: Boolean, viewersOnly: Boolean, layout: String) { - if (layout != null) { - eventBus.publish(BigBlueButtonEvent(meetingId, new LockLayoutRequest(meetingId, setById, lock, viewersOnly, Some(layout)))) - } else { - eventBus.publish(BigBlueButtonEvent(meetingId, new LockLayoutRequest(meetingId, setById, lock, viewersOnly, None))) - } - - } - - /** - * ******************************************************************* - * Message Interface for Voice - * ***************************************************************** - */ - - def muteAllExceptPresenter(meetingID: String, requesterID: String, mute: java.lang.Boolean) { - eventBus.publish(BigBlueButtonEvent(meetingID, new MuteAllExceptPresenterRequest(meetingID, requesterID, mute))) - } - - def muteAllUsers(meetingID: String, requesterID: String, mute: java.lang.Boolean) { - eventBus.publish(BigBlueButtonEvent(meetingID, new MuteMeetingRequest(meetingID, requesterID, mute))) - } - - def isMeetingMuted(meetingID: String, requesterID: String) { - eventBus.publish(BigBlueButtonEvent(meetingID, new IsMeetingMutedRequest(meetingID, requesterID))) - } - - def muteUser(meetingID: String, requesterID: String, userID: String, mute: java.lang.Boolean) { - eventBus.publish(BigBlueButtonEvent(meetingID, new MuteUserRequest(meetingID, requesterID, userID, mute))) - } - - def lockMuteUser(meetingID: String, requesterID: String, userID: String, lock: java.lang.Boolean) { - eventBus.publish(BigBlueButtonEvent(meetingID, new LockUserRequest(meetingID, requesterID, userID, lock))) - } - - def ejectUserFromVoice(meetingId: String, userId: String, ejectedBy: String) { - eventBus.publish(BigBlueButtonEvent(meetingId, new EjectUserFromVoiceRequest(meetingId, userId, ejectedBy))) - } - - def voiceUserJoined(voiceConfId: String, voiceUserId: String, userId: String, callerIdName: String, - callerIdNum: String, muted: java.lang.Boolean, avatarURL: String, talking: java.lang.Boolean) { - eventBus.publish(BigBlueButtonEvent(voiceConfId, new UserJoinedVoiceConfMessage(voiceConfId, voiceUserId, userId, userId, callerIdName, - callerIdNum, muted, talking, avatarURL, false /*hardcode listenOnly to false as the message for listenOnly is ConnectedToGlobalAudio*/ ))) - } - - def voiceUserLeft(voiceConfId: String, voiceUserId: String) { - eventBus.publish(BigBlueButtonEvent(voiceConfId, new UserLeftVoiceConfMessage(voiceConfId, voiceUserId))) - } - - def voiceUserLocked(voiceConfId: String, voiceUserId: String, locked: java.lang.Boolean) { - eventBus.publish(BigBlueButtonEvent(voiceConfId, new UserLockedInVoiceConfMessage(voiceConfId, voiceUserId, locked))) - } - - def voiceUserMuted(voiceConfId: String, voiceUserId: String, muted: java.lang.Boolean) { - eventBus.publish(BigBlueButtonEvent(voiceConfId, new UserMutedInVoiceConfMessage(voiceConfId, voiceUserId, muted))) - } - - def voiceUserTalking(voiceConfId: String, voiceUserId: String, talking: java.lang.Boolean) { - eventBus.publish(BigBlueButtonEvent(voiceConfId, new UserTalkingInVoiceConfMessage(voiceConfId, voiceUserId, talking))) - } - - def voiceRecording(voiceConfId: String, recordingFile: String, timestamp: String, recording: java.lang.Boolean) { - eventBus.publish(BigBlueButtonEvent(voiceConfId, new VoiceConfRecordingStartedMessage(voiceConfId, recordingFile, recording, timestamp))) - } - /** * ******************************************************************* * Message Interface for DeskShare @@ -494,25 +149,4 @@ class BigBlueButtonInGW( def deskShareGetInfoRequest(meetingId: String, requesterId: String, replyTo: String): Unit = { eventBus.publish(BigBlueButtonEvent(meetingId, new DeskShareGetDeskShareInfoRequest(meetingId, requesterId, replyTo))) } - - // Polling - def votePoll(meetingId: String, userId: String, pollId: String, questionId: Integer, answerId: Integer) { - eventBus.publish(BigBlueButtonEvent(meetingId, new RespondToPollRequest(meetingId, userId, pollId, questionId, answerId))) - } - - def startPoll(meetingId: String, requesterId: String, pollId: String, pollType: String) { - eventBus.publish(BigBlueButtonEvent(meetingId, new StartPollRequest(meetingId, requesterId, pollId, pollType))) - } - - def stopPoll(meetingId: String, userId: String, pollId: String) { - eventBus.publish(BigBlueButtonEvent(meetingId, new StopPollRequest(meetingId, userId))) - } - - def showPollResult(meetingId: String, requesterId: String, pollId: String, show: java.lang.Boolean) { - if (show) { - eventBus.publish(BigBlueButtonEvent(meetingId, new ShowPollResultRequest(meetingId, requesterId, pollId))) - } else { - eventBus.publish(BigBlueButtonEvent(meetingId, new HidePollResultRequest(meetingId, requesterId, pollId))) - } - } } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/JsonMessageDecoder.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/JsonMessageDecoder.scala deleted file mode 100755 index 643b3e18ec9bfff1055c5b508214b4f2dfbaf9f2..0000000000000000000000000000000000000000 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/JsonMessageDecoder.scala +++ /dev/null @@ -1,77 +0,0 @@ -package org.bigbluebutton.core - -import scala.util.{ Try, Success, Failure } -import org.parboiled.errors.ParsingException -import org.bigbluebutton.core.api._ -import org.bigbluebutton.messages._ - -object JsonMessageDecoder { - import org.bigbluebutton.core.UserMessagesProtocol._ - import spray.json._ - - def header(msg: JsObject): InMessageHeader = { - msg.fields.get("header") match { - case Some(header) => - header.convertTo[InMessageHeader] - case None => - throw MessageProcessException("Cannot get payload information: [" + msg + "]") - } - } - - def payload(msg: JsObject): JsObject = { - msg.fields.get("payload") match { - case Some(payload) => - payload.asJsObject - case None => - throw MessageProcessException("Cannot get payload information: [" + msg + "]") - } - } - - def toJsObject(msg: String): JsObject = { - try { - JsonParser(msg).asJsObject - } catch { - case e: ParsingException => { - throw MessageProcessException("Cannot parse JSON message: [" + msg + "]") - } - } - } - - def unmarshall(jsonMsg: String): Try[InMessage] = { - for { - jsonObj <- Try(toJsObject(jsonMsg)) - header <- Try(header(jsonObj)) - payload <- Try(payload(jsonObj)) - msg = InHeaderAndJsonPayload(header, payload) - inmsg <- Try(convertMessage(msg)) - } yield inmsg - } - - def decode(json: String): Option[InMessage] = { - unmarshall(json) match { - case Success(validMsg) => Some(validMsg) - case Failure(ex) => None - } - } - - def convertMessage(msg: InHeaderAndJsonPayload): InMessage = { - msg.header.name match { - case GetBreakoutRoomsList.NAME => { - msg.payload.convertTo[BreakoutRoomsListMessage] - } - case CreateBreakoutRoomsRequest.NAME => { - msg.payload.convertTo[CreateBreakoutRooms] - } - case RequestBreakoutJoinURL.NAME => { - msg.payload.convertTo[RequestBreakoutJoinURLInMessage] - } - case ListenInOnBreakout.NAME => { - msg.payload.convertTo[TransferUserToMeetingRequest] - } - case EndAllBreakoutRoomsRequest.NAME => { - msg.payload.convertTo[EndAllBreakoutRooms] - } - case _ => throw MessageProcessException("Cannot parse JSON message: [" + msg + "]") - } - } -} 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 deleted file mode 100755 index 730e0d50c5bdb07cb03a7ab31fd7a7451d133d29..0000000000000000000000000000000000000000 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/JsonMessageSenderActor.scala +++ /dev/null @@ -1,95 +0,0 @@ -package org.bigbluebutton.core - -import akka.actor.Actor -import akka.actor.ActorLogging -import akka.actor.Props -import org.bigbluebutton.core.api._ -import org.bigbluebutton.common.messages.MessagingConstants -import org.bigbluebutton.messages.payload._ -import org.bigbluebutton.messages._ - -object JsonMessageSenderActor { - def props(msgSender: MessageSender): Props = - Props(classOf[JsonMessageSenderActor], msgSender) -} - -class JsonMessageSenderActor(val service: MessageSender) - extends Actor with ActorLogging { - - def receive = { - - // Breakout - case msg: CreateBreakoutRoom => handleCreateBreakoutRoom(msg) - case msg: EndBreakoutRoom => handleEndBreakoutRoom(msg) - case msg: BreakoutRoomsListOutMessage => handleBreakoutRoomsList(msg) - case msg: BreakoutRoomJoinURLOutMessage => handleBreakoutRoomJoinURL(msg) - case msg: BreakoutRoomStartedOutMessage => handleBreakoutRoomStarted(msg) - case msg: BreakoutRoomEndedOutMessage => handleBreakoutRoomEnded(msg) - case msg: UpdateBreakoutUsersOutMessage => handleUpdateBreakoutUsers(msg) - case msg: MeetingTimeRemainingUpdate => handleMeetingTimeRemainingUpdate(msg) - - case _ => // do nothing - } - - // Breakout - private def handleBreakoutRoomStarted(msg: BreakoutRoomStartedOutMessage) { - val payload = new BreakoutRoomPayload(msg.parentMeetingId, msg.breakout.meetingId, msg.breakout.externalMeetingId, msg.breakout.name, msg.breakout.sequence) - val request = new BreakoutRoomStarted(payload) - service.send(MessagingConstants.FROM_MEETING_CHANNEL, request.toJson) - } - - private def handleBreakoutRoomEnded(msg: BreakoutRoomEndedOutMessage) { - val payload = new BreakoutRoomPayload(msg.parentMeetingId, msg.meetingId, "", "", 0) - val request = new BreakoutRoomClosed(payload) - service.send(MessagingConstants.FROM_MEETING_CHANNEL, request.toJson) - } - - private def handleUpdateBreakoutUsers(msg: UpdateBreakoutUsersOutMessage) { - val users = new java.util.ArrayList[BreakoutUserPayload]() - msg.users.foreach(x => users.add(new BreakoutUserPayload(x.id, x.name))) - val payload = new UpdateBreakoutUsersPayload(msg.parentMeetingId, msg.breakoutMeetingId, users) - val request = new UpdateBreakoutUsers(payload) - service.send(MessagingConstants.FROM_MEETING_CHANNEL, request.toJson()) - } - - private def handleMeetingTimeRemainingUpdate(msg: MeetingTimeRemainingUpdate) { - val payload = new MeetingTimeRemainingPayload(msg.meetingId, msg.timeRemaining) - val request = new TimeRemainingUpdate(payload) - service.send(MessagingConstants.FROM_MEETING_CHANNEL, request.toJson()) - } - - private def handleMeetingTimeRemainingUpdate(msg: BreakoutRoomsTimeRemainingUpdateOutMessage) { - val payload = new BreakoutRoomsTimeRemainingPayload(msg.meetingId, msg.timeRemaining) - val request = new BreakoutRoomsTimeRemainingUpdate(payload) - service.send(MessagingConstants.FROM_MEETING_CHANNEL, request.toJson()) - } - - private def handleBreakoutRoomsList(msg: BreakoutRoomsListOutMessage) { - val rooms = new java.util.ArrayList[BreakoutRoomPayload]() - msg.rooms.foreach(r => rooms.add(new BreakoutRoomPayload(msg.meetingId, r.meetingId, r.externalMeetingId, r.name, r.sequence))) - val payload = new BreakoutRoomsListPayload(msg.meetingId, rooms, msg.roomsReady) - val request = new BreakoutRoomsList(payload) - service.send(MessagingConstants.FROM_MEETING_CHANNEL, request.toJson()) - } - - private def handleCreateBreakoutRoom(msg: CreateBreakoutRoom) { - val payload = new CreateBreakoutRoomRequestPayload(msg.room.breakoutMeetingId, msg.room.parentId, msg.room.name, - msg.room.sequence, msg.room.voiceConfId, msg.room.viewerPassword, msg.room.moderatorPassword, - 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()) - } - - private def handleEndBreakoutRoom(msg: EndBreakoutRoom) { - val payload = new EndBreakoutRoomRequestPayload(msg.breakoutMeetingId) - val request = new EndBreakoutRoomRequest(payload) - service.send(MessagingConstants.FROM_MEETING_CHANNEL, request.toJson()) - } - - def handleBreakoutRoomJoinURL(msg: BreakoutRoomJoinURLOutMessage) { - val payload = new BreakoutRoomJoinURLPayload(msg.parentMeetingId, - msg.breakoutMeetingId, msg.userId, msg.redirectJoinURL, msg.noRedirectJoinURL) - val request = new BreakoutRoomJoinURL(payload) - service.send(MessagingConstants.FROM_MEETING_CHANNEL, request.toJson) - } -} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MeetingModel.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MeetingModel.scala index a35afa7bfd1df0311e42ab7b12cb7bd813e667ff..d532e27ac377e6d80dbb5a00d1e9177960707dbf 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MeetingModel.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MeetingModel.scala @@ -5,15 +5,14 @@ import org.bigbluebutton.core.api.Permissions case object StopMeetingActor case class MeetingExtensionProp(maxExtensions: Int = 2, numExtensions: Int = 0, extendByMinutes: Int = 20, - sendNotice: Boolean = true, sent15MinNotice: Boolean = false, - sent10MinNotice: Boolean = false, sent5MinNotice: Boolean = false) + sendNotice: Boolean = true, sent15MinNotice: Boolean = false, + sent10MinNotice: Boolean = false, sent5MinNotice: Boolean = false) class MeetingModel { private var audioSettingsInited = false private var permissionsInited = false private var permissions = new Permissions() private var recording = false - private var broadcastingRTMP = false private var muted = false private var meetingEnded = false private var meetingMuted = false @@ -23,70 +22,11 @@ class MeetingModel { private var lastWebUserLeftOnTimestamp: Long = 0 private var voiceRecordingFilename: String = "" - private var rtmpBroadcastingUrl: String = "" - private var deskShareStarted = false - private var desktopShareVideoWidth = 0 - private var desktopShareVideoHeight = 0 private var extension = new MeetingExtensionProp /* val startedOn = timeNowInSeconds; - var breakoutRoomsStartedOn: Long = 0 - var breakoutRoomsdurationInMinutes: Int = 0 - - def resetDesktopSharingParams() = { - broadcastingRTMP = false - deskShareStarted = false - rtmpBroadcastingUrl = "" - desktopShareVideoWidth = 0 - desktopShareVideoHeight = 0 - } - - def getDeskShareStarted(): Boolean = { - return deskShareStarted - } - - def setDeskShareStarted(b: Boolean) { - deskShareStarted = b - } - - def setDesktopShareVideoWidth(videoWidth: Int) { - desktopShareVideoWidth = videoWidth - } - - def setDesktopShareVideoHeight(videoHeight: Int) { - desktopShareVideoHeight = videoHeight - } - - def getDesktopShareVideoWidth(): Int = { - desktopShareVideoWidth - } - - def getDesktopShareVideoHeight(): Int = { - desktopShareVideoHeight - } - - def broadcastingRTMPStarted() { - broadcastingRTMP = true - } - - def isBroadcastingRTMP(): Boolean = { - broadcastingRTMP - } - - def broadcastingRTMPStopped() { - broadcastingRTMP = false - } - - def setRTMPBroadcastingUrl(path: String) { - rtmpBroadcastingUrl = path - } - - def getRTMPBroadcastingUrl(): String = { - rtmpBroadcastingUrl - } - def isExtensionAllowed(): Boolean = extension.numExtensions < extension.maxExtensions def incNumExtension(): Int = { if (extension.numExtensions < extension.maxExtensions) { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MessageRecorder.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MessageRecorder.scala deleted file mode 100755 index 6ee6599f51810db6117d1f2d92d6ba430180b803..0000000000000000000000000000000000000000 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MessageRecorder.scala +++ /dev/null @@ -1,11 +0,0 @@ -package org.bigbluebutton.core - -import org.bigbluebutton.common2.msgs.BbbCoreMsg - -object MessageRecorder { - def record(outGW: OutMessageGateway, record: Boolean, msg: BbbCoreMsg): Unit = { - if (record) { - outGW.record(msg) - } - } -} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MessageSenderActor.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MessageSenderActor.scala index f090a6a5bfafb1aa9c924172ead0c2906dead601..d952ba77a89c46de4e29a679df10af225521a547 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MessageSenderActor.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MessageSenderActor.scala @@ -8,28 +8,11 @@ import akka.actor.SupervisorStrategy.Resume import java.io.{ PrintWriter, StringWriter } import org.bigbluebutton.core.api._ import org.bigbluebutton.common.messages.MessagingConstants -import org.bigbluebutton.common.messages.StartRecordingVoiceConfRequestMessage -import org.bigbluebutton.common.messages.StopRecordingVoiceConfRequestMessage import org.bigbluebutton.core.pubsub.senders.MeetingMessageToJsonConverter -import org.bigbluebutton.core.pubsub.senders.PesentationMessageToJsonConverter -import org.bigbluebutton.common.messages.GetPresentationInfoReplyMessage -import org.bigbluebutton.common.messages.PresentationRemovedMessage -import org.bigbluebutton.common.messages.AllowUserToShareDesktopReply -import org.bigbluebutton.core.apps.Page import scala.collection.JavaConversions._ import scala.concurrent.duration._ -import org.bigbluebutton.core.apps.SimplePollResultOutVO -import org.bigbluebutton.core.apps.SimplePollOutVO import org.bigbluebutton.core.pubsub.senders.UsersMessageToJsonConverter -import org.bigbluebutton.common.messages.GetUsersFromVoiceConfRequestMessage -import org.bigbluebutton.common.messages.MuteUserInVoiceConfRequestMessage -import org.bigbluebutton.common.messages.EjectUserFromVoiceConfRequestMessage -import org.bigbluebutton.common.messages.GetCurrentLayoutReplyMessage -import org.bigbluebutton.common.messages.BroadcastLayoutMessage -import org.bigbluebutton.common.messages.UserEjectedFromMeetingMessage -import org.bigbluebutton.common.messages.LockLayoutMessage import org.bigbluebutton.common.converters.ToJsonEncoder -import org.bigbluebutton.common.messages.TransferUserToVoiceConfRequestMessage import scala.collection.JavaConverters object MessageSenderActor { @@ -52,104 +35,23 @@ class MessageSenderActor(val service: MessageSender) val encoder = new ToJsonEncoder() def receive = { - case msg: UserEjectedFromMeeting => handleUserEjectedFromMeeting(msg) - case msg: MeetingCreated => handleMeetingCreated(msg) - case msg: VoiceRecordingStarted => handleVoiceRecordingStarted(msg) - case msg: VoiceRecordingStopped => handleVoiceRecordingStopped(msg) - case msg: RecordingStatusChanged => handleRecordingStatusChanged(msg) + case msg: MeetingCreated => handleMeetingCreated(msg) + case msg: RecordingStatusChanged => handleRecordingStatusChanged(msg) case msg: GetRecordingStatusReply => handleGetRecordingStatusReply(msg) - case msg: MeetingEnding => handleMeetingEnding(msg) - case msg: MeetingEnded => handleMeetingEnded(msg) - case msg: MeetingHasEnded => handleMeetingHasEnded(msg) - case msg: MeetingDestroyed => handleMeetingDestroyed(msg) - case msg: KeepAliveMessageReply => handleKeepAliveMessageReply(msg) - case msg: PubSubPong => handlePubSubPong(msg) - case msg: InactivityWarning => handleInactivityWarning(msg) - case msg: MeetingIsActive => handleMeetingIsActive(msg) - case msg: StartRecording => handleStartRecording(msg) - case msg: StopRecording => handleStopRecording(msg) - case msg: GetAllMeetingsReply => handleGetAllMeetingsReply(msg) - case msg: StartRecordingVoiceConf => handleStartRecordingVoiceConf(msg) - case msg: StopRecordingVoiceConf => handleStopRecordingVoiceConf(msg) - case msg: ClearPresentationOutMsg => handleClearPresentationOutMsg(msg) - case msg: RemovePresentationOutMsg => handleRemovePresentationOutMsg(msg) - case msg: GetPresentationInfoOutMsg => handleGetPresentationInfoOutMsg(msg) - case msg: ResizeAndMoveSlideOutMsg => handleResizeAndMoveSlideOutMsg(msg) - case msg: GotoSlideOutMsg => handleGotoSlideOutMsg(msg) - case msg: SharePresentationOutMsg => handleSharePresentationOutMsg(msg) - case msg: GetSlideInfoOutMsg => handleGetSlideInfoOutMsg(msg) - case msg: PresentationConversionProgress => handlePresentationConversionProgress(msg) - case msg: PresentationConversionError => handlePresentationConversionError(msg) - case msg: PresentationPageGenerated => handlePresentationPageGenerated(msg) - case msg: PresentationConversionDone => handlePresentationConversionDone(msg) - case msg: PollStartedMessage => handlePollStartedMessage(msg) - case msg: PollStoppedMessage => handlePollStoppedMessage(msg) - case msg: PollShowResultMessage => handlePollShowResultMessage(msg) - case msg: PollHideResultMessage => handlePollHideResultMessage(msg) - case msg: UserRespondedToPollMessage => handleUserRespondedToPollMessage(msg) - case msg: MeetingMuted => handleMeetingMuted(msg) - case msg: MeetingState => handleMeetingState(msg) - case msg: DisconnectAllUsers => handleDisconnectAllUsers(msg) - case msg: AllowUserToShareDesktopOut => handleAllowUserToShareDesktopOut(msg) - case msg: DisconnectUser => handleDisconnectUser(msg) - case msg: PermissionsSettingInitialized => handlePermissionsSettingInitialized(msg) - case msg: NewPermissionsSetting => handleNewPermissionsSetting(msg) - case msg: UserLocked => handleUserLocked(msg) - case msg: GetPermissionsSettingReply => handleGetPermissionsSettingReply(msg) - case msg: UserRegistered => handleUserRegistered(msg) - case msg: UserLeft => handleUserLeft(msg) - case msg: PresenterAssigned => handlePresenterAssigned(msg) - case msg: EndAndKickAll => handleEndAndKickAll(msg) - case msg: GetUsersReply => handleGetUsersReply(msg) - case msg: ValidateAuthTokenReply => handleValidateAuthTokenReply(msg) - case msg: ValidateAuthTokenTimedOut => handleValidateAuthTokenTimedOut(msg) - case msg: UserJoined => handleUserJoined(msg) - case msg: UserChangedEmojiStatus => handleChangedUserEmojiStatus(msg) - case msg: UserSharedWebcam => handleUserSharedWebcam(msg) - case msg: UserUnsharedWebcam => handleUserUnsharedWebcam(msg) - case msg: UserStatusChange => handleUserStatusChange(msg) - case msg: UserRoleChange => handleUserRoleChange(msg) - case msg: UserVoiceMuted => handleUserVoiceMuted(msg) - case msg: UserVoiceTalking => handleUserVoiceTalking(msg) - case msg: MuteVoiceUser => handleMuteVoiceUser(msg) - case msg: EjectVoiceUser => handleEjectVoiceUser(msg) - case msg: TransferUserToMeeting => handleTransferUserToMeeting(msg) - case msg: GetUsersInVoiceConference => handleGetUsersFromVoiceConference(msg) - case msg: UserJoinedVoice => handleUserJoinedVoice(msg) - case msg: UserLeftVoice => handleUserLeftVoice(msg) - case msg: IsMeetingMutedReply => handleIsMeetingMutedReply(msg) - case msg: UserListeningOnly => handleUserListeningOnly(msg) - case msg: GetCurrentLayoutReply => handleGetCurrentLayoutReply(msg) - case msg: BroadcastLayoutEvent => handleBroadcastLayoutEvent(msg) - case msg: LockLayoutEvent => handleLockLayoutEvent(msg) - // breakout room cases - case msg: BreakoutRoomsListOutMessage => handleBreakoutRoomsListOutMessage(msg) - case msg: BreakoutRoomStartedOutMessage => handleBreakoutRoomStartedOutMessage(msg) - case msg: BreakoutRoomEndedOutMessage => handleBreakoutRoomEndedOutMessage(msg) - case msg: BreakoutRoomJoinURLOutMessage => handleBreakoutRoomJoinURLOutMessage(msg) - case msg: UpdateBreakoutUsersOutMessage => handleUpdateBreakoutUsersOutMessage(msg) - case msg: MeetingTimeRemainingUpdate => handleMeetingTimeRemainingUpdate(msg) - case msg: BreakoutRoomsTimeRemainingUpdateOutMessage => handleBreakoutRoomsTimeRemainingUpdate(msg) - - case msg: GetGuestPolicyReply => handleGetGuestPolicyReply(msg) - case msg: GuestPolicyChanged => handleGuestPolicyChanged(msg) - case msg: GuestAccessDenied => handleGuestAccessDenied(msg) - case _ => // do nothing - } - - private def handleUserEjectedFromMeeting(msg: UserEjectedFromMeeting) { - val m = new UserEjectedFromMeetingMessage(msg.meetingID, msg.userId, msg.ejectedBy) - service.send(MessagingConstants.FROM_USERS_CHANNEL, m.toJson) - } - - private def handleStartRecordingVoiceConf(msg: StartRecordingVoiceConf) { - val m = new StartRecordingVoiceConfRequestMessage(msg.meetingID, msg.voiceConfId) - service.send(MessagingConstants.TO_VOICE_CONF_SYSTEM_CHAN, m.toJson()) - } - - private def handleStopRecordingVoiceConf(msg: StopRecordingVoiceConf) { - val m = new StopRecordingVoiceConfRequestMessage(msg.meetingID, msg.voiceConfId, msg.recordedStream) - service.send(MessagingConstants.TO_VOICE_CONF_SYSTEM_CHAN, m.toJson()) + case msg: MeetingEnding => handleMeetingEnding(msg) + case msg: MeetingEnded => handleMeetingEnded(msg) + case msg: MeetingHasEnded => handleMeetingHasEnded(msg) + case msg: MeetingDestroyed => handleMeetingDestroyed(msg) + case msg: KeepAliveMessageReply => handleKeepAliveMessageReply(msg) + case msg: PubSubPong => handlePubSubPong(msg) + case msg: InactivityWarning => handleInactivityWarning(msg) + case msg: MeetingIsActive => handleMeetingIsActive(msg) + case msg: GetAllMeetingsReply => handleGetAllMeetingsReply(msg) + case msg: MeetingMuted => handleMeetingMuted(msg) + case msg: MeetingState => handleMeetingState(msg) + case msg: DisconnectAllUsers => handleDisconnectAllUsers(msg) + case msg: DisconnectUser => handleDisconnectUser(msg) + case _ => // do nothing } private def handleMeetingDestroyed(msg: MeetingDestroyed) { @@ -185,26 +87,6 @@ class MessageSenderActor(val service: MessageSender) service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) } - private def handleStartRecording(msg: StartRecording) { - val json = MeetingMessageToJsonConverter.startRecordingToJson(msg) - service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) - } - - private def handleStopRecording(msg: StopRecording) { - val json = MeetingMessageToJsonConverter.stopRecordingToJson(msg) - service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) - } - - private def handleVoiceRecordingStarted(msg: VoiceRecordingStarted) { - val json = MeetingMessageToJsonConverter.voiceRecordingStartedToJson(msg) - service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) - } - - private def handleVoiceRecordingStopped(msg: VoiceRecordingStopped) { - val json = MeetingMessageToJsonConverter.voiceRecordingStoppedToJson(msg) - service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) - } - private def handleRecordingStatusChanged(msg: RecordingStatusChanged) { val json = MeetingMessageToJsonConverter.recordingStatusChangedToJson(msg) service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) @@ -244,200 +126,6 @@ class MessageSenderActor(val service: MessageSender) service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) } - private def handleClearPresentationOutMsg(msg: ClearPresentationOutMsg) { - val json = PesentationMessageToJsonConverter.clearPresentationOutMsgToJson(msg) - service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) - } - - private def handleRemovePresentationOutMsg(msg: RemovePresentationOutMsg) { - val m = new PresentationRemovedMessage(msg.meetingID, msg.presentationID) - service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, m.toJson()) - } - - private def handleGetPresentationInfoOutMsg(msg: GetPresentationInfoOutMsg) { - - } - - private def handleResizeAndMoveSlideOutMsg(msg: ResizeAndMoveSlideOutMsg) { - val json = PesentationMessageToJsonConverter.resizeAndMoveSlideOutMsgToJson(msg) - service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) - } - - private def handleGotoSlideOutMsg(msg: GotoSlideOutMsg) { - val json = PesentationMessageToJsonConverter.gotoSlideOutMsgToJson(msg) - service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) - } - - private def handleSharePresentationOutMsg(msg: SharePresentationOutMsg) { - val json = PesentationMessageToJsonConverter.sharePresentationOutMsgToJson(msg) - service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) - } - - private def handleGetSlideInfoOutMsg(msg: GetSlideInfoOutMsg) { - val json = PesentationMessageToJsonConverter.getSlideInfoOutMsgToJson(msg) - service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) - } - - private def handleGetPreuploadedPresentationsOutMsg(msg: GetPreuploadedPresentationsOutMsg) { - val json = PesentationMessageToJsonConverter.getPreuploadedPresentationsOutMsgToJson(msg) - service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) - } - - private def handlePresentationConversionProgress(msg: PresentationConversionProgress) { - val json = PesentationMessageToJsonConverter.presentationConversionProgressToJson(msg) - service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) - } - - private def handlePresentationConversionError(msg: PresentationConversionError) { - val json = PesentationMessageToJsonConverter.presentationConversionErrorToJson(msg) - service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) - } - - private def handlePresentationPageGenerated(msg: PresentationPageGenerated) { - val json = PesentationMessageToJsonConverter.presentationPageGenerated(msg) - service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) - } - - private def handlePresentationConversionDone(msg: PresentationConversionDone) { - val json = PesentationMessageToJsonConverter.presentationConversionDoneToJson(msg) - service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) - } - - private def handlePresentationChanged(msg: PresentationChanged) { - val json = PesentationMessageToJsonConverter.presentationChangedToJson(msg) - service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) - } - - private def handleGetPresentationStatusReply(msg: GetPresentationStatusReply) { - val json = PesentationMessageToJsonConverter.getPresentationStatusReplyToJson(msg) - service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) - } - - private def handlePresentationRemoved(msg: PresentationRemoved) { - val json = PesentationMessageToJsonConverter.presentationRemovedToJson(msg) - service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) - } - - private def handlePageChanged(msg: PageChanged) { - val json = PesentationMessageToJsonConverter.pageChangedToJson(msg) - service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) - } - - private def handlePollStartedMessage(msg: PollStartedMessage) { - val json = pollStartedMessageToJson(msg) - service.send(MessagingConstants.FROM_POLLING_CHANNEL, json) - } - - private def handlePollStoppedMessage(msg: PollStoppedMessage) { - val json = pollStoppedMessageToJson(msg) - service.send(MessagingConstants.FROM_POLLING_CHANNEL, json) - } - - private def handlePollShowResultMessage(msg: PollShowResultMessage) { - val json = pollShowResultMessageToJson(msg) - service.send(MessagingConstants.FROM_POLLING_CHANNEL, json) - } - - private def handlePollHideResultMessage(msg: PollHideResultMessage) { - val json = pollHideResultMessageToJson(msg) - service.send(MessagingConstants.FROM_POLLING_CHANNEL, json) - } - - private def handleUserRespondedToPollMessage(msg: UserRespondedToPollMessage) { - val json = UserRespondedToPollMessageTpJson(msg) - service.send(MessagingConstants.FROM_POLLING_CHANNEL, json) - } - - private def pollVOtoMap(msg: SimplePollOutVO): java.util.HashMap[String, Object] = { - val pollVO = new java.util.HashMap[String, Object]() - pollVO.put("id", msg.id) - - val answers = new java.util.ArrayList[java.util.Map[String, Any]]; - msg.answers.foreach(ans => { - val amap = new java.util.HashMap[String, Any]() - amap.put("id", ans.id) - amap.put("key", ans.key) - answers.add(amap) - }) - - pollVO.put("answers", answers) - - pollVO - } - - private def pollStartedMessageToJson(msg: PollStartedMessage): String = { - val pollVO = pollVOtoMap(msg.poll) - val psm = new org.bigbluebutton.common.messages.PollStartedMessage(msg.meetingID, msg.requesterId, pollVO) - psm.toJson - } - - private def pollStoppedMessageToJson(msg: PollStoppedMessage): String = { - val psm = new org.bigbluebutton.common.messages.PollStoppedMessage(msg.meetingID, msg.requesterId, msg.pollId) - psm.toJson - } - - private def pollResultVOtoMap(msg: SimplePollResultOutVO): java.util.HashMap[String, Object] = { - val pollVO = new java.util.HashMap[String, Object]() - pollVO.put("id", msg.id) - pollVO.put("num_respondents", msg.numRespondents: java.lang.Integer) - pollVO.put("num_responders", msg.numResponders: java.lang.Integer) - val answers = new java.util.ArrayList[java.util.Map[String, Any]]; - msg.answers.foreach(ans => { - val amap = new java.util.HashMap[String, Any]() - amap.put("id", ans.id) - amap.put("key", ans.key) - amap.put("num_votes", ans.numVotes) - answers.add(amap) - }) - - pollVO.put("answers", answers) - - pollVO - } - - private def pollShowResultMessageToJson(msg: PollShowResultMessage): String = { - val pollResultVO = pollResultVOtoMap(msg.poll) - - val psm = new org.bigbluebutton.common.messages.PollShowResultMessage(msg.meetingID, pollResultVO) - psm.toJson - } - - private def pollHideResultMessageToJson(msg: PollHideResultMessage): String = { - val psm = new org.bigbluebutton.common.messages.PollHideResultMessage(msg.meetingID, msg.pollId) - psm.toJson - } - - private def UserRespondedToPollMessageTpJson(msg: UserRespondedToPollMessage): String = { - val pollResultVO = pollResultVOtoMap(msg.poll) - val psm = new org.bigbluebutton.common.messages.UserVotedPollMessage(msg.meetingID, msg.presenterId, pollResultVO) - psm.toJson - } - - private def handleLockLayoutEvent(msg: LockLayoutEvent) { - val users = new java.util.ArrayList[String]; - msg.applyTo.foreach(uvo => { - users.add(uvo.id) - }) - - val evt = new LockLayoutMessage(msg.meetingID, msg.setById, msg.locked, users) - service.send(MessagingConstants.FROM_USERS_CHANNEL, evt.toJson()) - } - - private def handleBroadcastLayoutEvent(msg: BroadcastLayoutEvent) { - val users = new java.util.ArrayList[String]; - msg.applyTo.foreach(uvo => { - users.add(uvo.id) - }) - - val evt = new BroadcastLayoutMessage(msg.meetingID, msg.setByUserID, msg.layoutID, msg.locked, users) - service.send(MessagingConstants.FROM_USERS_CHANNEL, evt.toJson()) - } - - private def handleGetCurrentLayoutReply(msg: GetCurrentLayoutReply) { - val reply = new GetCurrentLayoutReplyMessage(msg.meetingID, msg.requesterID, msg.setByUserID, msg.layoutID, msg.locked) - service.send(MessagingConstants.FROM_USERS_CHANNEL, reply.toJson()) - } - private def handleMeetingState(msg: MeetingState) { val json = UsersMessageToJsonConverter.meetingState(msg) service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) @@ -457,207 +145,4 @@ class MessageSenderActor(val service: MessageSender) val json = UsersMessageToJsonConverter.disconnectUserToJson(msg) service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) } - - private def handleAllowUserToShareDesktopOut(msg: AllowUserToShareDesktopOut): Unit = { - val obj = new AllowUserToShareDesktopReply(msg.meetingID, msg.userID, msg.allowed, - TimestampGenerator.generateTimestamp) - val json = obj.toJson() - service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) - } - - private def handlePermissionsSettingInitialized(msg: PermissionsSettingInitialized) { - val json = UsersMessageToJsonConverter.permissionsSettingInitializedToJson(msg) - service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) - } - - private def handleNewPermissionsSetting(msg: NewPermissionsSetting) { - val json = UsersMessageToJsonConverter.newPermissionsSettingToJson(msg) - service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) - } - - private def handleUserLocked(msg: UserLocked) { - val json = UsersMessageToJsonConverter.userLockedToJson(msg) - service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) - } - - private def handleGetPermissionsSettingReply(msg: GetPermissionsSettingReply) { - val json = UsersMessageToJsonConverter.getPermissionsSettingReplyToJson(msg) - service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) - } - - private def handleUserRegistered(msg: UserRegistered) { - val json = UsersMessageToJsonConverter.userRegisteredToJson(msg) - service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) - handleRegisteredUser(msg); - } - - private def handleUserStatusChange(msg: UserStatusChange) { - val json = UsersMessageToJsonConverter.userStatusChangeToJson(msg) - service.send(MessagingConstants.FROM_USERS_CHANNEL, json) - } - - private def handleUserRoleChange(msg: UserRoleChange) { - val json = UsersMessageToJsonConverter.userRoleChangeToJson(msg) - service.send(MessagingConstants.FROM_USERS_CHANNEL, json) - } - - private def handleChangedUserEmojiStatus(msg: UserChangedEmojiStatus) { - val json = UsersMessageToJsonConverter.userChangedEmojiStatusToJson(msg) - service.send(MessagingConstants.FROM_USERS_CHANNEL, json) - } - - private def handleUserSharedWebcam(msg: UserSharedWebcam) { - val json = UsersMessageToJsonConverter.userSharedWebcamToJson(msg) - service.send(MessagingConstants.FROM_USERS_CHANNEL, json) - } - - private def handleUserUnsharedWebcam(msg: UserUnsharedWebcam) { - val json = UsersMessageToJsonConverter.userUnsharedWebcamToJson(msg) - service.send(MessagingConstants.FROM_USERS_CHANNEL, json) - } - - private def handleGetUsersReply(msg: GetUsersReply) { - val json = UsersMessageToJsonConverter.getUsersReplyToJson(msg) - service.send(MessagingConstants.FROM_USERS_CHANNEL, json) - } - - private def handleUserJoinedVoice(msg: UserJoinedVoice) { - val json = UsersMessageToJsonConverter.userJoinedVoice(msg) - service.send(MessagingConstants.FROM_USERS_CHANNEL, json) - } - - private def handleUserVoiceMuted(msg: UserVoiceMuted) { - val json = UsersMessageToJsonConverter.userVoiceMuted(msg) - service.send(MessagingConstants.FROM_USERS_CHANNEL, json) - } - - private def handleUserVoiceTalking(msg: UserVoiceTalking) { - val json = UsersMessageToJsonConverter.userVoiceTalking(msg) - service.send(MessagingConstants.FROM_USERS_CHANNEL, json) - } - - private def handleMuteVoiceUser(msg: MuteVoiceUser) { - val m = new MuteUserInVoiceConfRequestMessage(msg.meetingID, msg.voiceConfId, msg.voiceUserId, msg.mute) - service.send(MessagingConstants.TO_VOICE_CONF_SYSTEM_CHAN, m.toJson()) - } - - private def handleGetUsersFromVoiceConference(msg: GetUsersInVoiceConference) { - val m = new GetUsersFromVoiceConfRequestMessage(msg.meetingID, msg.voiceConfId) - service.send(MessagingConstants.TO_VOICE_CONF_SYSTEM_CHAN, m.toJson()) - } - - private def handleEjectVoiceUser(msg: EjectVoiceUser) { - val m = new EjectUserFromVoiceConfRequestMessage(msg.meetingID, msg.voiceConfId, msg.voiceUserId) - service.send(MessagingConstants.TO_VOICE_CONF_SYSTEM_CHAN, m.toJson()) - } - - private def handleTransferUserToMeeting(msg: TransferUserToMeeting) { - val m = new TransferUserToVoiceConfRequestMessage(msg.voiceConfId, msg.targetVoiceConfId, msg.userId); - service.send(MessagingConstants.TO_VOICE_CONF_SYSTEM_CHAN, m.toJson()) - } - - private def handleUserLeftVoice(msg: UserLeftVoice) { - val json = UsersMessageToJsonConverter.userLeftVoiceToJson(msg) - service.send(MessagingConstants.FROM_USERS_CHANNEL, json) - } - - private def handleIsMeetingMutedReply(msg: IsMeetingMutedReply) { - val json = UsersMessageToJsonConverter.isMeetingMutedReplyToJson(msg) - service.send(MessagingConstants.FROM_USERS_CHANNEL, json) - } - - private def handleValidateAuthTokenReply(msg: ValidateAuthTokenReply) { - println("**** handleValidateAuthTokenReply *****") - val json = UsersMessageToJsonConverter.validateAuthTokenReplyToJson(msg) - //println("************** Publishing [" + json + "] *******************") - service.send(MessagingConstants.FROM_USERS_CHANNEL, json) - } - - private def handleValidateAuthTokenTimedOut(msg: ValidateAuthTokenTimedOut) { - println("**** handleValidateAuthTokenTimedOut *****") - val json = UsersMessageToJsonConverter.validateAuthTokenTimeoutToJson(msg) - //println("************** Publishing [" + json + "] *******************") - service.send(MessagingConstants.FROM_USERS_CHANNEL, json) - } - - private def handleUserJoined(msg: UserJoined) { - val json = UsersMessageToJsonConverter.userJoinedToJson(msg) - //println("************** Publishing [" + json + "] *******************") - service.send(MessagingConstants.FROM_USERS_CHANNEL, json) - } - - private def handleRegisteredUser(msg: UserRegistered) { - val json = UsersMessageToJsonConverter.userRegisteredToJson(msg) - service.send(MessagingConstants.FROM_USERS_CHANNEL, json) - } - - private def handleUserLeft(msg: UserLeft) { - val json = UsersMessageToJsonConverter.userLeftToJson(msg) - service.send(MessagingConstants.FROM_USERS_CHANNEL, json) - } - - private def handlePresenterAssigned(msg: PresenterAssigned) { - val json = UsersMessageToJsonConverter.presenterAssignedToJson(msg) - service.send(MessagingConstants.FROM_USERS_CHANNEL, json) - } - - private def handleEndAndKickAll(msg: EndAndKickAll) { - val json = UsersMessageToJsonConverter.endAndKickAllToJson(msg) - service.send(MessagingConstants.FROM_USERS_CHANNEL, json) - } - - private def handleUserListeningOnly(msg: UserListeningOnly) { - val json = UsersMessageToJsonConverter.userListeningOnlyToJson(msg) - service.send(MessagingConstants.FROM_USERS_CHANNEL, json) - } - - private def handleBreakoutRoomsListOutMessage(msg: BreakoutRoomsListOutMessage) { - val json = MeetingMessageToJsonConverter.breakoutRoomsListOutMessageToJson(msg) - service.send(MessagingConstants.FROM_USERS_CHANNEL, json) - } - - private def handleBreakoutRoomStartedOutMessage(msg: BreakoutRoomStartedOutMessage) { - val json = MeetingMessageToJsonConverter.breakoutRoomStartedOutMessageToJson(msg) - service.send(MessagingConstants.FROM_USERS_CHANNEL, json) - } - - private def handleBreakoutRoomEndedOutMessage(msg: BreakoutRoomEndedOutMessage) { - val json = MeetingMessageToJsonConverter.breakoutRoomEndedOutMessageToJson(msg) - service.send(MessagingConstants.FROM_USERS_CHANNEL, json) - } - - private def handleBreakoutRoomJoinURLOutMessage(msg: BreakoutRoomJoinURLOutMessage) { - val json = MeetingMessageToJsonConverter.breakoutRoomJoinURLOutMessageToJson(msg) - service.send(MessagingConstants.FROM_USERS_CHANNEL, json) - } - - private def handleUpdateBreakoutUsersOutMessage(msg: UpdateBreakoutUsersOutMessage) { - val json = MeetingMessageToJsonConverter.updateBreakoutUsersOutMessageToJson(msg) - service.send(MessagingConstants.FROM_USERS_CHANNEL, json) - } - - private def handleMeetingTimeRemainingUpdate(msg: MeetingTimeRemainingUpdate) { - val json = MeetingMessageToJsonConverter.meetingTimeRemainingUpdateToJson(msg) - service.send(MessagingConstants.FROM_USERS_CHANNEL, json) - } - - private def handleBreakoutRoomsTimeRemainingUpdate(msg: BreakoutRoomsTimeRemainingUpdateOutMessage) { - val json = MeetingMessageToJsonConverter.breakoutRoomsTimeRemainingUpdateToJson(msg) - service.send(MessagingConstants.FROM_USERS_CHANNEL, json) - } - - private def handleGetGuestPolicyReply(msg: GetGuestPolicyReply) { - val json = UsersMessageToJsonConverter.getGuestPolicyReplyToJson(msg) - service.send(MessagingConstants.FROM_USERS_CHANNEL, json) - } - - private def handleGuestPolicyChanged(msg: GuestPolicyChanged) { - val json = UsersMessageToJsonConverter.guestPolicyChangedToJson(msg) - service.send(MessagingConstants.FROM_USERS_CHANNEL, json) - } - - private def handleGuestAccessDenied(msg: GuestAccessDenied) { - val json = UsersMessageToJsonConverter.guestAccessDeniedToJson(msg) - service.send(MessagingConstants.FROM_USERS_CHANNEL, json) - } } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/OutMessageGateway.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/OutMessageGateway.scala index 97652d8a8c42d04db63af780b0998e560fb64a3c..a8900835d4eb82bf2303f1d4ac3ab7b915b21d10 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/OutMessageGateway.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/OutMessageGateway.scala @@ -1,30 +1,10 @@ package org.bigbluebutton.core -import org.bigbluebutton.SystemConfiguration -import org.bigbluebutton.common2.msgs.{ BbbCommonEnvCoreMsg, BbbCoreMsg } -import org.bigbluebutton.core.bus._ -import org.bigbluebutton.core.api.IOutMessage +import org.bigbluebutton.common2.msgs.{ BbbCommonEnvCoreMsg } -object OutMessageGateway { - def apply(outgoingEventBus: OutgoingEventBus, - outBus2: OutEventBus2, - recordBus: RecordingEventBus) = - new OutMessageGateway(outgoingEventBus, outBus2, recordBus) -} - -class OutMessageGateway(outgoingEventBus: OutgoingEventBus, - outBus2: OutEventBus2, - recordBus: RecordingEventBus) extends SystemConfiguration { - - def send1(msg: IOutMessage) { - outgoingEventBus.publish(BigBlueButtonOutMessage(outMessageChannel, msg)) - } +trait OutMessageGateway { - def send(msg: BbbCommonEnvCoreMsg): Unit = { - outBus2.publish(BbbOutMessage(outBbbMsgMsgChannel, msg)) - } + def send(msg: BbbCommonEnvCoreMsg): Unit - def record(msg: BbbCoreMsg): Unit = { - recordBus.publish(BbbRecordMessage(recordServiceMessageChannel, msg)) - } + def record(msg: BbbCommonEnvCoreMsg): Unit } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/OutMessageGatewayImp.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/OutMessageGatewayImp.scala new file mode 100755 index 0000000000000000000000000000000000000000..686da2286d7a0d9d74b1ffa9999484190bf4b8d0 --- /dev/null +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/OutMessageGatewayImp.scala @@ -0,0 +1,27 @@ +package org.bigbluebutton.core + +import org.bigbluebutton.SystemConfiguration +import org.bigbluebutton.common2.msgs.{ BbbCommonEnvCoreMsg, BbbCoreMsg } +import org.bigbluebutton.core.api.IOutMessage +import org.bigbluebutton.core.bus._ + +object OutMessageGatewayImp { + def apply( + outBus2: OutEventBus2 + ) = + new OutMessageGatewayImp(outBus2) +} + +class OutMessageGatewayImp( + outBus2: OutEventBus2 +) extends OutMessageGateway + with SystemConfiguration { + + def send(msg: BbbCommonEnvCoreMsg): Unit = { + outBus2.publish(BbbOutMessage(outBbbMsgMsgChannel, msg)) + } + + def record(msg: BbbCommonEnvCoreMsg): Unit = { + outBus2.publish(BbbOutMessage(recordServiceMessageChannel, msg)) + } +} 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 deleted file mode 100755 index a948c43d8295d6c8ba7785d302116cd05debfa36..0000000000000000000000000000000000000000 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/Protocol.scala +++ /dev/null @@ -1,39 +0,0 @@ -package org.bigbluebutton.core - -import spray.json.{ DefaultJsonProtocol, JsValue, JsString, DeserializationException, JsonFormat } -import org.bigbluebutton.core.api._ - -object UserMessagesProtocol extends DefaultJsonProtocol { - /* - implicit object RoleJsonFormat extends JsonFormat[Role.RoleType] { - def write(obj: Role.RoleType): JsValue = JsString(obj.toString) - - def read(json: JsValue): Role.RoleType = json match { - case JsString(str) => Role.withName(str) - case _ => throw new DeserializationException("Enum string expected") - } - } -*/ - - implicit object MessageTypeFormat extends JsonFormat[MessageType.MessageType] { - def write(obj: MessageType.MessageType): JsValue = JsString(obj.toString) - - def read(json: JsValue): MessageType.MessageType = json match { - case JsString(str) => MessageType.withName(str) - case _ => throw new DeserializationException("Enum string expected") - } - } - - implicit val breakoutRoomInPayloadFormat = jsonFormat3(BreakoutRoomInPayload) - implicit val createBreakoutRoomsFormat = jsonFormat4(CreateBreakoutRooms) - implicit val breakoutRoomsListMessageFormat = jsonFormat1(BreakoutRoomsListMessage) - implicit val requestBreakoutJoinURLInMessageFormat = jsonFormat3(RequestBreakoutJoinURLInMessage) - implicit val transferUserToMeetingRequestFormat = jsonFormat3(TransferUserToMeetingRequest) - implicit val endBreakoutRoomsFormat = jsonFormat1(EndAllBreakoutRooms) - implicit val inMsgHeaderFormat = jsonFormat1(InMessageHeader) - implicit val outMsgHeaderFormat = jsonFormat1(OutMsgHeader) - implicit val outMsgEnvelopeHeaderFormat = jsonFormat2(OutMsgEnvelopeHeader) - implicit val createBreakoutRoomOutMsgPayloadFormat = jsonFormat11(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 deleted file mode 100755 index 8b010ca2bbe3e6aad262c7a4a081ce460b40b38a..0000000000000000000000000000000000000000 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/ProtocolMessages.scala +++ /dev/null @@ -1,13 +0,0 @@ -package org.bigbluebutton.core - -case class OutMsgHeader(name: String) -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 CreateBreakoutRoomOutMsgPayload(meetingId: String, parentId: String, name: String, - voiceConfId: String, moderatorPassword: String, viewerPassword: String, - durationInMinutes: Int, sourcePresentationId: String, sourcePresentationSlide: Int, - record: Boolean, sequence: Int) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/InMessages.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/InMessages.scala index 74e9f0804d373e7ca4e33caff02ad2dd15fea5b8..03cde0637d335487c6d48527a470f3bedbfc0773 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/InMessages.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/InMessages.scala @@ -1,7 +1,5 @@ package org.bigbluebutton.core.api -import org.bigbluebutton.common2.msgs.BreakoutUserVO -import org.bigbluebutton.core.apps.Presentation import spray.json.JsObject case class InMessageHeader(name: String) case class InHeaderAndJsonPayload(header: InMessageHeader, payload: JsObject) @@ -9,11 +7,6 @@ case class MessageProcessException(message: String) extends Exception(message) trait InMessage -////////////////////////////////////////////// -// -////////////////////////////////////////////// -case class SendDirectChatMsgCmd() extends InMessage - ////////////////////////////////////////////////////////////////////////////// // System ///////////////////////////////////////////////////////////////////////////// @@ -23,159 +16,30 @@ case class IsMeetingActorAliveMessage(meetingId: String) extends InMessage case class KeepAliveMessage(aliveID: String) extends InMessage ////////////////////////////////////////////////////////////////////////////// -// Meeting +// Internal Messages ///////////////////////////////////////////////////////////////////////////// -case class MonitorNumberOfUsers(meetingID: String) extends InMessage +case class MonitorNumberOfUsersInternalMsg(meetingID: String) extends InMessage case class SendTimeRemainingUpdate(meetingId: String) extends InMessage case class ExtendMeetingDuration(meetingId: String, userId: String) extends InMessage -case class InitializeMeeting(meetingID: String, recorded: Boolean) extends InMessage -case class DestroyMeeting(meetingID: String) extends InMessage +case class DestroyMeetingInternalMsg(meetingId: String) extends InMessage +case class BreakoutRoomEndedInternalMsg(meetingId: String) extends InMessage + +////////////////////////////////////////////////////////////////////////////// +// Meeting +///////////////////////////////////////////////////////////////////////////// case class StartMeeting(meetingID: String) extends InMessage case class EndMeeting(meetingId: String) extends InMessage case class LockSetting(meetingID: String, locked: Boolean, settings: Map[String, Boolean]) extends InMessage case class UpdateMeetingExpireMonitor(meetingID: String, hasUser: Boolean) extends InMessage -////////////////////////////////////////////////////////////////////////////////////// -// Breakout room -///////////////////////////////////////////////////////////////////////////////////// - -// Sent by user to request the breakout rooms list of a room -case class BreakoutRoomsListMessage(meetingId: String) extends InMessage -// Sent by user to request creation of breakout rooms -case class CreateBreakoutRooms(meetingId: String, durationInMinutes: Int, record: Boolean, rooms: Vector[BreakoutRoomInPayload]) extends InMessage -case class BreakoutRoomInPayload(name: String, sequence: Int, users: Vector[String]) -// Sent by user to request for a join URL in order to be able to join a breakout room -case class RequestBreakoutJoinURLInMessage(meetingId: String, breakoutMeetingId: String, userId: String) extends InMessage -// Sent by breakout actor to tell meeting actor that breakout room has been created. -case class BreakoutRoomCreated(meetingId: String, breakoutRoomId: String) extends InMessage -// Sent by breakout actor to tell meeting actor the list of users in the breakout room. -case class BreakoutRoomUsersUpdate(meetingId: String, breakoutMeetingId: String, users: Vector[BreakoutUserVO]) extends InMessage -// Send by internal actor to tell the breakout actor to send it's list of users to the main meeting actor. -case class SendBreakoutUsersUpdate(meetingId: String) extends InMessage -// Sent by user to request ending all the breakout rooms -case class EndAllBreakoutRooms(meetingId: String) extends InMessage -// Sent by breakout actor to tell meeting actor that breakout room has been ended -case class BreakoutRoomEnded(meetingId: String, breakoutRoomId: String) extends InMessage -// Sent by user actor to ask for voice conference transfer -case class TransferUserToMeetingRequest(meetingId: String, targetMeetingId: String, userId: String) extends InMessage - -//////////////////////////////////////////////////////////////////////////////////// -// Lock -/////////////////////////////////////////////////////////////////////////////////// - -case class LockUser(meetingID: String, userId: String, lock: Boolean) extends InMessage -case class InitLockSettings(meetingID: String, settings: Permissions) extends InMessage -case class SetLockSettings(meetingID: String, setByUser: String, settings: Permissions) extends InMessage -case class GetLockSettings(meetingID: String, userId: String) extends InMessage - ////////////////////////////////////////////////////////////////////////////////// // Users ///////////////////////////////////////////////////////////////////////////////// -case class ValidateAuthToken(meetingID: String, userId: String, token: String, - correlationId: String, sessionId: String) extends InMessage -case class RegisterUser(meetingID: String, userID: String, name: String, role: String, - extUserID: String, authToken: String, avatarURL: String, guest: Boolean, authed: Boolean) extends InMessage -case class UserJoining(meetingID: String, userID: String, authToken: String) extends InMessage -case class UserLeaving(meetingID: String, userID: String, sessionId: String) extends InMessage -case class GetUsers(meetingID: String, requesterID: String) extends InMessage -case class UserEmojiStatus(meetingID: String, userId: String, emojiStatus: String) extends InMessage - -case class UserShareWebcam(meetingID: String, userId: String, stream: String) extends InMessage -case class UserUnshareWebcam(meetingID: String, userId: String, stream: String) extends InMessage -case class ChangeUserStatus(meetingID: String, userID: String, status: String, value: Object) extends InMessage - -case class AssignPresenter(meetingID: String, newPresenterID: String, newPresenterName: String, assignedBy: String) extends InMessage case class SetRecordingStatus(meetingID: String, userId: String, recording: Boolean) extends InMessage case class GetRecordingStatus(meetingID: String, userId: String) extends InMessage -case class AllowUserToShareDesktop(meetingID: String, userID: String) extends InMessage case class ActivityResponse(meetingID: String) extends InMessage -case class LogoutEndMeeting(meetingID: String, userID: String) extends InMessage - -////////////////////////////////////////////////////////////////////////////////// -// Global Audio -///////////////////////////////////////////////////////////////////////////////// - -case class UserConnectedToGlobalAudio(meetingID: String, /** Not used. Just to satisfy trait **/ voiceConf: String, - userid: String, name: String) extends InMessage -case class UserDisconnectedFromGlobalAudio(meetingID: String, /** Not used. Just to satisfy trait **/ voiceConf: String, - userid: String, name: String) extends InMessage - -/////////////////////////////////////////////////////////////////////////////////////// -// Guest support -/////////////////////////////////////////////////////////////////////////////////////// - -case class GetGuestPolicy(meetingID: String, requesterID: String) extends InMessage -case class SetGuestPolicy(meetingID: String, policy: String, setBy: String) extends InMessage -case class RespondToGuest(meetingID: String, userId: String, response: Boolean, requesterID: String) extends InMessage - -/////////////////////////////////////////////////////////////////////////////////////// -// Layout -////////////////////////////////////////////////////////////////////////////////////// - -case class GetCurrentLayoutRequest(meetingID: String, requesterID: String) extends InMessage -case class LockLayoutRequest(meetingID: String, setById: String, lock: Boolean, viewersOnly: Boolean, - layout: Option[String]) extends InMessage -case class BroadcastLayoutRequest(meetingID: String, requesterID: String, layout: String) extends InMessage - -////////////////////////////////////////////////////////////////////////////////////// -// Presentation -///////////////////////////////////////////////////////////////////////////////////// - -case class ClearPresentation(meetingID: String) extends InMessage -case class RemovePresentation(meetingID: String, presentationID: String) extends InMessage -case class GetPresentationInfo(meetingID: String, requesterID: String, replyTo: String) extends InMessage -case class ResizeAndMoveSlide(meetingID: String, xOffset: Double, yOffset: Double, - widthRatio: Double, heightRatio: Double) extends InMessage -case class GotoSlide(meetingID: String, page: String) extends InMessage -case class SharePresentation(meetingID: String, presentationID: String, share: Boolean) extends InMessage -case class GetSlideInfo(meetingID: String, requesterID: String, replyTo: String) extends InMessage -case class PreuploadedPresentations(meetingID: String, presentations: Seq[Presentation]) extends InMessage -case class PresentationConversionUpdate(meetingID: String, messageKey: String, code: String, - presentationId: String, presName: String) extends InMessage -case class PresentationPageCountError(meetingID: String, messageKey: String, code: String, presentationId: String, - numberOfPages: Int, maxNumberPages: Int, presName: String) extends InMessage -case class PresentationSlideGenerated(meetingID: String, messageKey: String, code: String, presentationId: String, - numberOfPages: Int, pagesCompleted: Int, presName: String) extends InMessage -case class PresentationConversionCompleted(meetingID: String, messageKey: String, code: String, - presentation: Presentation) extends InMessage - -///////////////////////////////////////////////////////////////////////////////////// -// Polling -//////////////////////////////////////////////////////////////////////////////////// - -//case class CreatePollRequest(meetingID: String, requesterId: String, pollId: String, pollType: String) extends InMessage -case class StartCustomPollRequest(meetingID: String, requesterId: String, pollId: String, pollType: String, answers: Seq[String]) extends InMessage -case class StartPollRequest(meetingID: String, requesterId: String, pollId: String, pollType: String) extends InMessage -case class StopPollRequest(meetingID: String, requesterId: String) extends InMessage -case class ShowPollResultRequest(meetingID: String, requesterId: String, pollId: String) extends InMessage -case class HidePollResultRequest(meetingID: String, requesterId: String, pollId: String) extends InMessage -case class RespondToPollRequest(meetingID: String, requesterId: String, pollId: String, questionId: Int, answerId: Int) extends InMessage -case class GetPollRequest(meetingID: String, requesterId: String, pollId: String) extends InMessage -case class GetCurrentPollRequest(meetingID: String, requesterId: String) extends InMessage - -/////////////////////////////////////////////////////////////////////////////////// -// Voice -/////////////////////////////////////////////////////////////////////////////////// - -case class InitAudioSettings(meetingID: String, requesterID: String, muted: Boolean) extends InMessage -case class SendVoiceUsersRequest(meetingID: String, requesterID: String) extends InMessage -case class MuteAllExceptPresenterRequest(meetingID: String, requesterID: String, mute: Boolean) extends InMessage -case class MuteMeetingRequest(meetingID: String, requesterID: String, mute: Boolean) extends InMessage -case class IsMeetingMutedRequest(meetingID: String, requesterID: String) extends InMessage -case class MuteUserRequest(meetingID: String, requesterID: String, userID: String, mute: Boolean) extends InMessage -case class LockUserRequest(meetingID: String, requesterID: String, userID: String, lock: Boolean) extends InMessage -case class EjectUserFromVoiceRequest(meetingID: String, userId: String, ejectedBy: String) extends InMessage -case class VoiceUserJoinedMessage(meetingID: String, user: String, voiceConfId: String, - callerIdNum: String, callerIdName: String, muted: Boolean, talking: Boolean) extends InMessage -case class UserJoinedVoiceConfMessage(voiceConfId: String, voiceUserId: String, userId: String, externUserId: String, - callerIdName: String, callerIdNum: String, muted: Boolean, talking: Boolean, avatarURL: String, listenOnly: Boolean) extends InMessage -case class UserLeftVoiceConfMessage(voiceConfId: String, voiceUserId: String) extends InMessage -case class UserLockedInVoiceConfMessage(voiceConfId: String, voiceUserId: String, locked: Boolean) extends InMessage -case class UserMutedInVoiceConfMessage(voiceConfId: String, voiceUserId: String, muted: Boolean) extends InMessage -case class UserTalkingInVoiceConfMessage(voiceConfId: String, voiceUserId: String, talking: Boolean) extends InMessage -case class VoiceConfRecordingStartedMessage(voiceConfId: String, recordStream: String, recording: Boolean, timestamp: String) extends InMessage // No idea what part this is for case class GetAllMeetingsRequest(meetingID: String /** Not used. Just to satisfy trait **/ ) extends InMessage 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 f5b2703ffab11e9120226f02a99894964d12c0ed..6c21452d4714a87bc13f7ffaa9adb0e5254cddf9 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 @@ -2,15 +2,11 @@ package org.bigbluebutton.core.api import org.bigbluebutton.core.apps._ import org.bigbluebutton.core.models._ -import org.bigbluebutton.common2.domain.UserVO -import org.bigbluebutton.common2.msgs.{ BreakoutRoomInfo, BreakoutUserVO } -case class VoiceRecordingStarted(meetingID: String, recorded: Boolean, recordingFile: String, timestamp: String, confNum: String) extends IOutMessage -case class VoiceRecordingStopped(meetingID: String, recorded: Boolean, recordingFile: String, timestamp: String, confNum: String) extends IOutMessage case class RecordingStatusChanged(meetingID: String, recorded: Boolean, userId: String, recording: Boolean) extends IOutMessage case class GetRecordingStatusReply(meetingID: String, recorded: Boolean, userId: String, recording: Boolean) extends IOutMessage case class MeetingCreated(meetingID: String, externalMeetingID: String, parentMeetingID: String, recorded: Boolean, name: String, - voiceBridge: String, duration: Int, moderatorPass: String, viewerPass: String, createTime: Long, createDate: String, isBreakout: Boolean) extends IOutMessage + voiceBridge: String, duration: Int, moderatorPass: String, viewerPass: String, createTime: Long, createDate: String, isBreakout: Boolean) extends IOutMessage case class MeetingMuted(meetingID: String, recorded: Boolean, meetingMuted: Boolean) extends IOutMessage case class MeetingEnding(meetingID: String) extends IOutMessage case class MeetingEnded(meetingID: String, recorded: Boolean, voiceBridge: String) extends IOutMessage @@ -25,107 +21,6 @@ case class KeepAliveMessageReply(aliveID: String) extends IOutMessage case class PubSubPong(system: String, timestamp: Long) extends IOutMessage case object IsAliveMessage extends IOutMessage -// Breakout Rooms -case class BreakoutRoomsListOutMessage(meetingId: String, rooms: Vector[BreakoutRoomInfo], roomsReady: Boolean) extends IOutMessage -case class CreateBreakoutRoom(meetingId: String, room: BreakoutRoomOutPayload) extends IOutMessage -case class EndBreakoutRoom(breakoutMeetingId: String) extends IOutMessage -case class BreakoutRoomOutPayload(breakoutMeetingId: String, name: String, parentId: String, sequence: Integer, - voiceConfId: String, durationInMinutes: Int, moderatorPassword: String, viewerPassword: String, - sourcePresentationId: String, sourcePresentationSlide: Int, record: Boolean) -case class BreakoutRoomJoinURLOutMessage(parentMeetingId: String, recorded: Boolean, breakoutMeetingId: String, userId: String, redirectJoinURL: String, noRedirectJoinURL: String) extends IOutMessage -case class BreakoutRoomStartedOutMessage(parentMeetingId: String, recorded: Boolean, breakout: BreakoutRoomInfo) extends IOutMessage -case class UpdateBreakoutUsersOutMessage(parentMeetingId: String, recorded: Boolean, breakoutMeetingId: String, users: Vector[BreakoutUserVO]) extends IOutMessage -case class MeetingTimeRemainingUpdate(meetingId: String, recorded: Boolean, timeRemaining: Int) extends IOutMessage -case class BreakoutRoomsTimeRemainingUpdateOutMessage(meetingId: String, recorded: Boolean, timeRemaining: Int) extends IOutMessage -case class BreakoutRoomEndedOutMessage(parentMeetingId: String, meetingId: String) extends IOutMessage - -// Permissions -case class PermissionsSettingInitialized(meetingID: String, permissions: Permissions, applyTo: Array[UserVO]) extends IOutMessage -case class NewPermissionsSetting(meetingID: String, setByUser: String, permissions: Permissions, applyTo: Vector[UserState]) extends IOutMessage -case class UserLocked(meetingID: String, userId: String, lock: Boolean) extends IOutMessage -case class GetPermissionsSettingReply(meetingID: String, userId: String) extends IOutMessage - -// Users -case class UserRegistered(meetingID: String, recorded: Boolean, user: RegisteredUser) extends IOutMessage -case class UserLeft(meetingID: String, recorded: Boolean, user: UserVO) extends IOutMessage -case class UserEjectedFromMeeting(meetingID: String, recorded: Boolean, userId: String, ejectedBy: String) extends IOutMessage -case class PresenterAssigned(meetingID: String, recorded: Boolean, presenter: Presenter) extends IOutMessage -case class EjectAllVoiceUsers(meetingID: String, recorded: Boolean, voiceBridge: String) extends IOutMessage -case class EndAndKickAll(meetingID: String, recorded: Boolean) extends IOutMessage -case class GetUsersReply(meetingID: String, requesterID: String, users: Array[UserVO]) extends IOutMessage -case class ValidateAuthTokenTimedOut(meetingID: String, requesterId: String, token: String, valid: Boolean, correlationId: String) extends IOutMessage -case class ValidateAuthTokenReply(meetingID: String, requesterId: String, token: String, valid: Boolean, correlationId: String) extends IOutMessage -case class UserJoined(meetingID: String, recorded: Boolean, user: UserVO) extends IOutMessage -case class UserChangedEmojiStatus(meetingID: String, recorded: Boolean, emojiStatus: String, userID: String) extends IOutMessage -case class UserListeningOnly(meetingID: String, recorded: Boolean, userID: String, listenOnly: Boolean) extends IOutMessage -case class UserSharedWebcam(meetingID: String, recorded: Boolean, userID: String, stream: String) extends IOutMessage -case class UserUnsharedWebcam(meetingID: String, recorded: Boolean, userID: String, stream: String) extends IOutMessage -case class UserStatusChange(meetingID: String, recorded: Boolean, userID: String, status: String, value: Object) extends IOutMessage -case class UserRoleChange(meetingID: String, recorded: Boolean, userID: String, role: String) extends IOutMessage -case class GetUsersInVoiceConference(meetingID: String, recorded: Boolean, voiceConfId: String) extends IOutMessage -case class MuteVoiceUser(meetingID: String, recorded: Boolean, requesterID: String, - userId: String, voiceConfId: String, voiceUserId: String, mute: Boolean) extends IOutMessage -case class UserVoiceMuted(meetingID: String, recorded: Boolean, confNum: String, user: UserVO) extends IOutMessage -case class UserVoiceTalking(meetingID: String, recorded: Boolean, confNum: String, user: UserVO) extends IOutMessage -case class EjectVoiceUser(meetingID: String, recorded: Boolean, requesterID: String, userId: String, voiceConfId: String, voiceUserId: String) extends IOutMessage -case class TransferUserToMeeting(voiceConfId: String, targetVoiceConfId: String, userId: String) extends IOutMessage -case class UserJoinedVoice(meetingID: String, recorded: Boolean, confNum: String, user: UserVO) extends IOutMessage -case class UserLeftVoice(meetingID: String, recorded: Boolean, confNum: String, user: UserVO) extends IOutMessage -case class AllowUserToShareDesktopOut(meetingID: String, userID: String, allowed: Boolean) extends IOutMessage - -// Voice -case class IsMeetingMutedReply(meetingID: String, recorded: Boolean, requesterID: String, meetingMuted: Boolean) extends IOutMessage -case class StartRecording(meetingID: String, recorded: Boolean, requesterID: String) extends IOutMessage -case class StartRecordingVoiceConf(meetingID: String, recorded: Boolean, voiceConfId: String) extends IOutMessage -case class StopRecordingVoiceConf(meetingID: String, recorded: Boolean, voiceConfId: String, recordedStream: String) extends IOutMessage -case class StopRecording(meetingID: String, recorded: Boolean, requesterID: String) extends IOutMessage - -// Layout -case class GetCurrentLayoutReply(meetingID: String, recorded: Boolean, requesterID: String, layoutID: String, - locked: Boolean, setByUserID: String) extends IOutMessage -case class BroadcastLayoutEvent(meetingID: String, recorded: Boolean, requesterID: String, - layoutID: String, locked: Boolean, setByUserID: String, applyTo: Array[UserVO]) extends IOutMessage -case class LockLayoutEvent(meetingID: String, recorded: Boolean, setById: String, locked: Boolean, - applyTo: Array[UserVO]) extends IOutMessage - -// Presentation -case class ClearPresentationOutMsg(meetingID: String, recorded: Boolean) extends IOutMessage -case class RemovePresentationOutMsg(meetingID: String, recorded: Boolean, presentationID: String) extends IOutMessage -case class GetPresentationInfoOutMsg(meetingID: String, recorded: Boolean, requesterID: String, - info: CurrentPresentationInfo, replyTo: String) extends IOutMessage -case class ResizeAndMoveSlideOutMsg(meetingID: String, recorded: Boolean, page: Page) extends IOutMessage -case class GotoSlideOutMsg(meetingID: String, recorded: Boolean, page: Page) extends IOutMessage -case class SharePresentationOutMsg(meetingID: String, recorded: Boolean, presentation: Presentation) extends IOutMessage -case class GetSlideInfoOutMsg(meetingID: String, recorded: Boolean, requesterID: String, page: Page, replyTo: String) extends IOutMessage -case class GetPreuploadedPresentationsOutMsg(meetingID: String, recorded: Boolean) extends IOutMessage -case class PresentationConversionProgress(meetingID: String, messageKey: String, code: String, - presentationId: String, presentationName: String) extends IOutMessage -case class PresentationConversionError(meetingID: String, messageKey: String, code: String, - presentationId: String, numberOfPages: Int, maxNumberPages: Int, presentationName: String) extends IOutMessage -case class PresentationPageGenerated(meetingID: String, messageKey: String, code: String, presentationId: String, - numberOfPages: Int, pagesCompleted: Int, presentationName: String) extends IOutMessage -case class PresentationConversionDone(meetingID: String, recorded: Boolean, messageKey: String, code: String, - presentation: Presentation) extends IOutMessage -case class PresentationChanged(meetingID: String, presentation: Presentation) extends IOutMessage -case class GetPresentationStatusReply(meetingID: String, presentations: Seq[Presentation], current: Presentation, replyTo: String) extends IOutMessage -case class PresentationRemoved(meetingID: String, presentationId: String) extends IOutMessage -case class PageChanged(meetingID: String, page: Page) extends IOutMessage - -// Polling -//case class PollCreatedMessage(meetingID: String, recorded: Boolean, requesterId: String, pollId: String, poll: PollVO) extends IOutMessage -//case class CreatePollReplyMessage(meetingID: String, recorded: Boolean, result: RequestResult, requesterId: String, pollId: String, pollType: String) extends IOutMessage -case class PollStartedMessage(meetingID: String, recorded: Boolean, requesterId: String, pollId: String, poll: SimplePollOutVO) extends IOutMessage -case class StartPollReplyMessage(meetingID: String, recorded: Boolean, result: RequestResult, requesterId: String, pollId: String) extends IOutMessage -case class PollStoppedMessage(meetingID: String, recorded: Boolean, requesterId: String, pollId: String) extends IOutMessage -case class StopPollReplyMessage(meetingID: String, recorded: Boolean, result: RequestResult, requesterId: String) extends IOutMessage -case class PollShowResultMessage(meetingID: String, recorded: Boolean, requesterId: String, pollId: String, poll: SimplePollResultOutVO) extends IOutMessage -case class ShowPollResultReplyMessage(meetingID: String, recorded: Boolean, result: RequestResult, requesterId: String, pollId: String) extends IOutMessage -case class PollHideResultMessage(meetingID: String, recorded: Boolean, requesterId: String, pollId: String) extends IOutMessage -case class HidePollResultReplyMessage(meetingID: String, recorded: Boolean, result: RequestResult, requesterId: String, pollId: String) extends IOutMessage -case class UserRespondedToPollMessage(meetingID: String, recorded: Boolean, presenterId: String, pollId: String, poll: SimplePollResultOutVO) extends IOutMessage -case class RespondToPollReplyMessage(meetingID: String, recorded: Boolean, result: RequestResult, requesterId: String, pollId: String) extends IOutMessage -case class GetCurrentPollReplyMessage(meetingID: String, recorded: Boolean, requesterId: String, hasPoll: Boolean, poll: Option[PollVO]) extends IOutMessage - // No idea what part this is for case class GetAllMeetingsReply(meetings: Array[MeetingInfo]) extends IOutMessage @@ -136,10 +31,8 @@ case class DeskShareNotifyViewersRTMP(meetingID: String, streamPath: String, vid case class DeskShareNotifyASingleViewer(meetingID: String, userID: String, streamPath: String, videoWidth: Int, videoHeight: Int, broadcasting: Boolean) extends IOutMessage case class DeskShareHangUp(meetingID: String, fsConferenceName: String) extends IOutMessage -// Guest -case class GetGuestPolicyReply(meetingID: String, recorded: Boolean, requesterID: String, policy: String) extends IOutMessage -case class GuestPolicyChanged(meetingID: String, recorded: Boolean, policy: String) extends IOutMessage -case class GuestAccessDenied(meetingID: String, recorded: Boolean, userId: String) extends IOutMessage +//Transcode +case class StopMeetingTranscoders(meetingID: String) extends IOutMessage // Value Objects case class MeetingVO(id: String, recorded: Boolean) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/ValueObjects.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/ValueObjects.scala index 5f30ee8791e614a7e77d6ac7ad531e9720e47301..f6499020fcc6934e8a366a492183f3f69973e53a 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/ValueObjects.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/ValueObjects.scala @@ -35,58 +35,65 @@ object ErrorCodes { case class RequestResult(status: StatusCode, errors: Option[Array[ErrorCode]]) case class Presenter( - presenterID: String, + presenterID: String, presenterName: String, - assignedBy: String) + assignedBy: String +) case class User( - id: String, - externId: String, - name: String, - moderator: Boolean, - avatarUrl: String, - logoutUrl: String, - presenter: Boolean, - callerId: CallerId, + id: String, + externId: String, + name: String, + moderator: Boolean, + avatarUrl: String, + logoutUrl: String, + presenter: Boolean, + callerId: CallerId, phoneCaller: Boolean, emojiStatus: String, - muted: Boolean, - talking: Boolean) + muted: Boolean, + talking: Boolean +) case class CallerId( - name: String, - number: String) + name: String, + number: String +) case class Permissions( - disableCam: Boolean = false, - disableMic: Boolean = false, - disablePrivChat: Boolean = false, - disablePubChat: Boolean = false, - lockedLayout: Boolean = false, - lockOnJoin: Boolean = false, - lockOnJoinConfigurable: Boolean = false) + disableCam: Boolean = false, + disableMic: Boolean = false, + disablePrivChat: Boolean = false, + disablePubChat: Boolean = false, + lockedLayout: Boolean = false, + lockOnJoin: Boolean = false, + lockOnJoinConfigurable: Boolean = false +) case class Voice( - id: String, - webId: String, - callId: CallerId, + id: String, + webId: String, + callId: CallerId, phoningIn: Boolean, - joined: Boolean, - locked: Boolean, - muted: Boolean, - talking: Boolean) - -case class MeetingConfig(name: String, - id: MeetingID, - passwords: MeetingPasswords, - welcomeMsg: String, - logoutUrl: String, - maxUsers: Int, - record: Boolean = false, - duration: MeetingDuration, - defaultAvatarURL: String, + joined: Boolean, + locked: Boolean, + muted: Boolean, + talking: Boolean +) + +case class MeetingConfig( + name: String, + id: MeetingID, + passwords: MeetingPasswords, + welcomeMsg: String, + logoutUrl: String, + maxUsers: Int, + record: Boolean = false, + duration: MeetingDuration, + defaultAvatarURL: String, defaultConfigToken: String, - guestPolicy: String = GuestPolicyType.ASK_MODERATOR) + guestPolicy: String = GuestPolicyType.ASK_MODERATOR +) case class MeetingName(name: String) @@ -97,11 +104,12 @@ case class VoiceConfig(telVoice: String, webVoice: String, dialNumber: String) case class MeetingPasswords(moderatorPass: String, viewerPass: String) case class MeetingDuration(duration: Int = 0, createdTime: Long = 0, - startTime: Long = 0, endTime: Long = 0) + startTime: Long = 0, endTime: Long = 0) case class MeetingInfo( - meetingID: String, + meetingID: String, meetingName: String, - recorded: Boolean, + recorded: Boolean, voiceBridge: String, - duration: Long) + duration: Long +) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/GuestsApp.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/GuestsApp.scala index 30d5d634654629c671bf67fe7dd85ef41208f876..b540b32228d51b5f5ccb69cb182185ab322ffc71 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/GuestsApp.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/GuestsApp.scala @@ -1,11 +1,12 @@ package org.bigbluebutton.core.apps import org.bigbluebutton.core.running.MeetingActor -import org.bigbluebutton.core2.message.handlers.guests.{ GetGuestsWaitingApprovalReqMsgHdlr, GuestsWaitingApprovedMsgHdlr, SetGuestPolicyMsgHdlr } +import org.bigbluebutton.core2.message.handlers.guests.{ GetGuestPolicyReqMsgHdlr, GetGuestsWaitingApprovalReqMsgHdlr, GuestsWaitingApprovedMsgHdlr, SetGuestPolicyMsgHdlr } trait GuestsApp extends GetGuestsWaitingApprovalReqMsgHdlr with GuestsWaitingApprovedMsgHdlr - with SetGuestPolicyMsgHdlr { + with SetGuestPolicyMsgHdlr + with GetGuestPolicyReqMsgHdlr { this: MeetingActor => diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/Poll.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/Poll.scala deleted file mode 100755 index c152421631b6ef2603591554813528c7c24c8a74..0000000000000000000000000000000000000000 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/Poll.scala +++ /dev/null @@ -1,280 +0,0 @@ -package org.bigbluebutton.core.apps - -import scala.collection.mutable.ArrayBuffer - -object PollType { - val YesNoPollType = "YN" - val TrueFalsePollType = "TF" - val CustomPollType = "CUSTOM" - val LetterPollType = "A-" - val NumberPollType = "1-" -} - -object PollFactory { - - val LetterArray = Array("A", "B", "C", "D", "E", "F") - val NumberArray = Array("1", "2", "3", "4", "5", "6") - - private def processYesNoPollType(qType: String): Question = { - val answers = new Array[Answer](2) - - answers(0) = new Answer(0, "Yes", Some("Yes")) - answers(1) = new Answer(1, "No", Some("No")) - - new Question(0, PollType.YesNoPollType, false, None, answers) - } - - private def processTrueFalsePollType(qType: String): Question = { - val answers = new Array[Answer](2) - - answers(0) = new Answer(0, "True", Some("True")) - answers(1) = new Answer(1, "False", Some("False")) - - new Question(0, PollType.TrueFalsePollType, false, None, answers) - } - - private def processLetterPollType(qType: String, multiResponse: Boolean): Option[Question] = { - val q = qType.split('-') - val numQs = q(1).toInt - - var questionOption: Option[Question] = None - - if (numQs > 0 && numQs <= 6) { - val answers = new Array[Answer](numQs) - - for (i <- 0 until numQs) { - answers(i) = new Answer(i, LetterArray(i), Some(LetterArray(i))) - val question = new Question(0, PollType.LetterPollType, multiResponse, None, answers) - questionOption = Some(question) - } - } - - questionOption - } - - private def processNumberPollType(qType: String, multiResponse: Boolean): Option[Question] = { - val q = qType.split('-') - val numQs = q(1).toInt - - var questionOption: Option[Question] = None - - if (numQs > 0 && numQs <= 6) { - val answers = new Array[Answer](numQs) - var i = 0 - for (i <- 0 until numQs) { - answers(i) = new Answer(i, NumberArray(i), Some(NumberArray(i))) - val question = new Question(0, PollType.NumberPollType, multiResponse, None, answers) - questionOption = Some(question) - } - } - questionOption - } - - private def buildAnswers(answers: Seq[String]): Array[Answer] = { - val ans = new Array[Answer](answers.length) - for (i <- 0 until answers.length) { - ans(i) = new Answer(i, answers(i), Some(answers(i))) - } - - ans - } - - private def processCustomPollType(qType: String, multiResponse: Boolean, answers: Option[Seq[String]]): Option[Question] = { - var questionOption: Option[Question] = None - - answers.foreach { ans => - val someAnswers = buildAnswers(ans) - val question = new Question(0, PollType.CustomPollType, multiResponse, None, someAnswers) - questionOption = Some(question) - } - - questionOption - } - - private def createQuestion(qType: String, answers: Option[Seq[String]]): Option[Question] = { - println("**** Creating quesion") - - val qt = qType.toUpperCase() - var questionOption: Option[Question] = None - - if (qt.matches(PollType.YesNoPollType)) { - questionOption = Some(processYesNoPollType(qt)) - } else if (qt.matches(PollType.TrueFalsePollType)) { - questionOption = Some(processTrueFalsePollType(qt)) - } else if (qt.matches(PollType.CustomPollType)) { - questionOption = processCustomPollType(qt, false, answers) - } else if (qt.startsWith(PollType.LetterPollType)) { - questionOption = processLetterPollType(qt, false) - } else if (qt.startsWith(PollType.NumberPollType)) { - questionOption = processNumberPollType(qt, false) - } - - questionOption - } - - def createPoll(id: String, pollType: String, numRespondents: Int, answers: Option[Seq[String]]): Option[Poll] = { - var poll: Option[Poll] = None - - createQuestion(pollType, answers) match { - case Some(question) => { - poll = Some(new Poll(id, Array(question), numRespondents, None)) - } - case None => poll = None - } - - poll - } -} - -case class QuestionResponsesVO(val questionID: String, val responseIDs: Array[String]) -case class PollResponseVO(val pollID: String, val responses: Array[QuestionResponsesVO]) -case class ResponderVO(responseID: String, user: Responder) - -case class AnswerVO(val id: Int, val key: String, val text: Option[String], val responders: Option[Array[Responder]]) -case class QuestionVO(val id: Int, val questionType: String, val multiResponse: Boolean, val questionText: Option[String], val answers: Option[Array[AnswerVO]]) -case class PollVO(val id: String, val questions: Array[QuestionVO], val title: Option[String], val started: Boolean, val stopped: Boolean, val showResult: Boolean) - -case class Responder(val userId: String, name: String) - -case class ResponseOutVO(id: String, text: String, responders: Array[Responder] = Array[Responder]()) -case class QuestionOutVO(id: String, multiResponse: Boolean, question: String, responses: Array[ResponseOutVO]) - -case class SimpleAnswerOutVO(id: Int, key: String) -case class SimplePollOutVO(id: String, answers: Array[SimpleAnswerOutVO]) - -case class SimpleVoteOutVO(id: Int, key: String, numVotes: Int) -case class SimplePollResultOutVO(id: String, answers: Array[SimpleVoteOutVO], numRespondents: Int, numResponders: Int) - -class Poll(val id: String, val questions: Array[Question], val numRespondents: Int, val title: Option[String]) { - private var _started: Boolean = false - private var _stopped: Boolean = false - private var _showResult: Boolean = false - private var _numResponders: Int = 0 - - def showingResult() { _showResult = true } - def hideResult() { _showResult = false } - def showResult(): Boolean = { _showResult } - def start() { _started = true } - def stop() { _stopped = true } - def isStarted(): Boolean = { return _started } - def isStopped(): Boolean = { return _stopped } - def isRunning(): Boolean = { return isStarted() && !isStopped() } - def clear() { - questions.foreach(q => { q.clear }) - _started = false - _stopped = false - } - - def hasResponses(): Boolean = { - questions.foreach(q => { - if (q.hasResponders) return true - }) - - return false - } - - def respondToQuestion(questionID: Int, responseID: Int, responder: Responder) { - questions.foreach(q => { - if (q.id == questionID) { - q.respondToQuestion(responseID, responder) - _numResponders += 1 - } - }) - } - - def toPollVO(): PollVO = { - val qvos = new ArrayBuffer[QuestionVO] - questions.foreach(q => { - qvos += q.toQuestionVO - }) - - new PollVO(id, qvos.toArray, title, _started, _stopped, _showResult) - } - - def toSimplePollOutVO(): SimplePollOutVO = { - new SimplePollOutVO(id, questions(0).toSimpleAnswerOutVO()) - } - - def toSimplePollResultOutVO(): SimplePollResultOutVO = { - new SimplePollResultOutVO(id, questions(0).toSimpleVotesOutVO(), numRespondents, _numResponders) - } -} - -class Question(val id: Int, val questionType: String, val multiResponse: Boolean, val text: Option[String], val answers: Array[Answer]) { - - def clear() { - answers.foreach(r => r.clear) - } - - def hasResponders(): Boolean = { - answers.foreach(r => { - if (r.numResponders > 0) return true - }) - - return false - } - - def respondToQuestion(id: Int, responder: Responder) { - answers.foreach(r => { - if (r.id == id) r.addResponder(responder) - }) - } - - def toQuestionVO(): QuestionVO = { - val rvos = new ArrayBuffer[AnswerVO] - answers.foreach(answer => { - val r = new AnswerVO(answer.id, answer.key, answer.text, Some(answer.getResponders)) - rvos += r - }) - - new QuestionVO(id, questionType, multiResponse, text, Some(rvos.toArray)) - } - - def toSimpleAnswerOutVO(): Array[SimpleAnswerOutVO] = { - val rvos = new ArrayBuffer[SimpleAnswerOutVO] - answers.foreach(answer => { - rvos += answer.toSimpleAnswerOutVO() - }) - - rvos.toArray - } - - def toSimpleVotesOutVO(): Array[SimpleVoteOutVO] = { - val rvos = new ArrayBuffer[SimpleVoteOutVO] - answers.foreach(answer => { - rvos += answer.toSimpleVoteOutVO() - }) - - rvos.toArray - } -} - -class Answer(val id: Int, val key: String, val text: Option[String]) { - - val responders = new ArrayBuffer[Responder]() - - def clear() { - responders.clear - } - def addResponder(responder: Responder) { - responders += responder - } - - def numResponders(): Int = { - responders.length; - } - - def getResponders(): Array[Responder] = { - var r = new Array[Responder](responders.length) - responders.copyToArray(r) - return r - } - - def toSimpleAnswerOutVO(): SimpleAnswerOutVO = { - new SimpleAnswerOutVO(id, key) - } - - def toSimpleVoteOutVO(): SimpleVoteOutVO = { - new SimpleVoteOutVO(id, key, numResponders) - } -} \ No newline at end of file diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PollModel.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PollModel.scala deleted file mode 100755 index eacc36140bd6a18101acd49c01b975af9a533dac..0000000000000000000000000000000000000000 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PollModel.scala +++ /dev/null @@ -1,132 +0,0 @@ -package org.bigbluebutton.core.apps - -import scala.collection.mutable.ArrayBuffer -import scala.collection.mutable.HashMap - -object PollModel { - def getRunningPollThatStartsWith(pollId: String, model: PollModel): Option[PollVO] = { - for { - poll <- model.polls.values find { poll => poll.id.startsWith(pollId) && poll.isRunning() } - } yield poll.toPollVO() - - } - - def numPolls(model: PollModel): Int = { - model.polls.size - } - - def addPoll(poll: Poll, model: PollModel) { - model.polls += poll.id -> poll - } - - def hasCurrentPoll(model: PollModel): Boolean = { - model.currentPoll != None - } - - def getCurrentPoll(model: PollModel): Option[PollVO] = { - model.currentPoll - } - - def getPolls(model: PollModel): Array[PollVO] = { - val poll = new ArrayBuffer[PollVO] - model.polls.values.foreach(p => { - poll += p.toPollVO - }) - - poll.toArray - } - - def clearPoll(pollID: String, model: PollModel): Boolean = { - var success = false - model.polls.get(pollID) match { - case Some(p) => { - p.clear - success = true - } - case None => success = false - } - - success - } - - def startPoll(pollId: String, model: PollModel) { - model.polls.get(pollId) foreach { - p => - p.start() - model.currentPoll = Some(p.toPollVO()) - } - } - - def removePoll(pollID: String, model: PollModel): Boolean = { - var success = false - model.polls.get(pollID) match { - case Some(p) => { - model.polls -= p.id - success = true - } - case None => success = false - } - - success - } - - def stopPoll(pollId: String, model: PollModel) { - model.polls.get(pollId) foreach (p => p.stop()) - } - - def hasPoll(pollId: String, model: PollModel): Boolean = { - model.polls.get(pollId) != None - } - - def getSimplePoll(pollId: String, model: PollModel): Option[SimplePollOutVO] = { - var pvo: Option[SimplePollOutVO] = None - model.polls.get(pollId) foreach (p => pvo = Some(p.toSimplePollOutVO())) - pvo - } - - def getSimplePollResult(pollId: String, model: PollModel): Option[SimplePollResultOutVO] = { - var pvo: Option[SimplePollResultOutVO] = None - model.polls.get(pollId) foreach (p => pvo = Some(p.toSimplePollResultOutVO())) - pvo - } - - def getPoll(pollId: String, model: PollModel): Option[PollVO] = { - var pvo: Option[PollVO] = None - model.polls.get(pollId) foreach (p => pvo = Some(p.toPollVO())) - pvo - } - - def hidePollResult(pollId: String, model: PollModel) { - model.polls.get(pollId) foreach { - p => - p.hideResult() - model.currentPoll = None - } - } - - def showPollResult(pollId: String, model: PollModel) { - model.polls.get(pollId) foreach { - p => - p.showResult - model.currentPoll = Some(p.toPollVO()) - } - } - - def respondToQuestion(pollId: String, questionID: Int, responseID: Int, responder: Responder, model: PollModel) { - model.polls.get(pollId) match { - case Some(p) => { - p.respondToQuestion(questionID, responseID, responder) - } - case None => - } - } - -} - -class PollModel { - - private val polls = new HashMap[String, Poll]() - - private var currentPoll: Option[PollVO] = None - -} 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 deleted file mode 100755 index 1b991f8368a2a30f5a059f7d9964ca71c50deaa7..0000000000000000000000000000000000000000 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PresentationApp.scala +++ /dev/null @@ -1,143 +0,0 @@ -package org.bigbluebutton.core.apps - -import org.bigbluebutton.core.api._ -import org.bigbluebutton.core.OutMessageGateway -import org.bigbluebutton.core.running.MeetingActor -import org.bigbluebutton.core2.MeetingStatus2x - -trait PresentationApp { - this: MeetingActor => - - val outGW: OutMessageGateway - - def handlePreuploadedPresentations(msg: PreuploadedPresentations) { - // val pres = msg.presentations - // - // msg.presentations.foreach(presentation => { - // liveMeeting.presModel.addPresentation(presentation) - // - // sharePresentation(presentation.id, true) - // }) - } - - def handleInitializeMeeting(msg: InitializeMeeting) { - - } - - def handleClearPresentation(msg: ClearPresentation) { - // outGW.send(new ClearPresentationOutMsg(props.meetingProp.intId, props.recordProp.record)) - } - - def handlePresentationConversionUpdate(msg: PresentationConversionUpdate) { - // outGW.send(new PresentationConversionProgress(props.meetingProp.intId, msg.messageKey, - // msg.code, msg.presentationId, msg.presName)) - } - - def handlePresentationPageCountError(msg: PresentationPageCountError) { - // outGW.send(new PresentationConversionError(props.meetingProp.intId, msg.messageKey, - // msg.code, msg.presentationId, - // msg.numberOfPages, - // msg.maxNumberPages, msg.presName)) - } - - def handlePresentationSlideGenerated(msg: PresentationSlideGenerated) { - // outGW.send(new PresentationPageGenerated(props.meetingProp.intId, msg.messageKey, - // msg.code, msg.presentationId, - // msg.numberOfPages, - // msg.pagesCompleted, msg.presName)) - } - - def handlePresentationConversionCompleted(msg: PresentationConversionCompleted) { - - liveMeeting.presModel.addPresentation(msg.presentation) - // - // outGW.send(new PresentationConversionDone(props.meetingProp.intId, props.recordProp.record, msg.messageKey, - // msg.code, msg.presentation)) - // - // sharePresentation(msg.presentation.id, true) - } - - def handleRemovePresentation(msg: RemovePresentation) { - // val curPres = liveMeeting.presModel.getCurrentPresentation - // - // val removedPresentation = liveMeeting.presModel.remove(msg.presentationID) - // - // curPres foreach (cp => { - // if (cp.id == msg.presentationID) { - // sharePresentation(msg.presentationID, false); - // } - // }) - // - // outGW.send(new RemovePresentationOutMsg(msg.meetingID, props.recordProp.record, msg.presentationID)) - - } - - def handleGetPresentationInfo(msg: GetPresentationInfo) { - // val curPresenter = MeetingStatus2x.getCurrentPresenterInfo(liveMeeting.status) - // val presenter = new CurrentPresenter(curPresenter.presenterID, curPresenter.presenterName, curPresenter.assignedBy) - // val presentations = liveMeeting.presModel.getPresentations - // val presentationInfo = new CurrentPresentationInfo(presenter, presentations) - // outGW.send(new GetPresentationInfoOutMsg(props.meetingProp.intId, props.recordProp.record, msg.requesterID, presentationInfo, msg.replyTo)) - } - - def handleResizeAndMoveSlide(msg: ResizeAndMoveSlide) { - // // Force coordinate that are out-of-bounds inside valid values - // val xOffset = if (msg.xOffset <= 0) msg.xOffset else 0 - // val yOffset = if (msg.yOffset <= 0) msg.yOffset else 0 - // val width = if (msg.widthRatio <= 100) msg.widthRatio else 100 - // val height = if (msg.heightRatio <= 100) msg.heightRatio else 100 - // - // val page = liveMeeting.presModel.resizePage(xOffset, yOffset, width, height); - // page foreach (p => outGW.send(new ResizeAndMoveSlideOutMsg(props.meetingProp.intId, props.recordProp.record, p))) - } - - def handleGotoSlide(msg: GotoSlide) { - // liveMeeting.presModel.changePage(msg.page) foreach { page => - // log.debug("Switching page for meeting=[{}] page=[{}]", msg.meetingID, page.num); - // outGW.send(new GotoSlideOutMsg(props.meetingProp.intId, props.recordProp.record, page)) - // } - // - // Users.getCurrentPresenter(liveMeeting.users) foreach { pres => - // handleStopPollRequest(StopPollRequest(props.meetingProp.intId, pres.id)) - // } - - } - - def handleSharePresentation(msg: SharePresentation) { - sharePresentation(msg.presentationID, msg.share) - } - - def sharePresentation(presentationID: String, share: Boolean) { - /* - val pres = liveMeeting.presModel.sharePresentation(presentationID) - - pres foreach { p => - outGW.send(new SharePresentationOutMsg(props.meetingProp.intId, props.recordProp.record, p)) - - liveMeeting.presModel.getCurrentPage(p) foreach { page => - outGW.send(new GotoSlideOutMsg(props.meetingProp.intId, props.recordProp.record, page)) - } - } - */ - } - - def handleGetSlideInfo(msg: GetSlideInfo) { - // liveMeeting.presModel.getCurrentPresentation foreach { pres => - // liveMeeting.presModel.getCurrentPage(pres) foreach { page => - // outGW.send(new GetSlideInfoOutMsg(props.meetingProp.intId, props.recordProp.record, msg.requesterID, page, msg.replyTo)) - // } - // } - - } - - def printPresentations() { - liveMeeting.presModel.getPresentations foreach { pres => - println("presentation id=[" + pres.id + "] current=[" + pres.current + "]") - pres.pages.values foreach { page => - println("page id=[" + page.id + "] current=[" + page.current + "]") - } - } - - } - -} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PresentationModel.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PresentationModel.scala index 0aa82c805d75663fd4be695accc2943e4a1f39eb..0cf5ee018b84977fbb388b1c3b154701fcabdd8e 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PresentationModel.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PresentationModel.scala @@ -6,11 +6,11 @@ import org.bigbluebutton.common2.domain.PageVO case class CurrentPresenter(userId: String, name: String, assignedBy: String) case class CurrentPresentationInfo(presenter: CurrentPresenter, presentations: Seq[Presentation]) case class Presentation(id: String, name: String, current: Boolean = false, - pages: scala.collection.immutable.Map[String, PageVO], downloadable: Boolean) + pages: scala.collection.immutable.Map[String, PageVO], downloadable: Boolean) case class Page(id: String, num: Int, thumbUri: String = "", swfUri: String, - txtUri: String, svgUri: String, current: Boolean = false, xOffset: Double = 0, yOffset: Double = 0, - widthRatio: Double = 100D, heightRatio: Double = 100D) + txtUri: String, svgUri: String, current: Boolean = false, xOffset: Double = 0, yOffset: Double = 0, + widthRatio: Double = 100D, heightRatio: Double = 100D) class PresentationModel { private var presentations = new scala.collection.immutable.HashMap[String, Presentation] @@ -70,8 +70,8 @@ class PresentationModel { } def resizePage(presentationId: String, pageId: String, - xOffset: Double, yOffset: Double, widthRatio: Double, - heightRatio: Double): Option[PageVO] = { + xOffset: Double, yOffset: Double, widthRatio: Double, + heightRatio: Double): Option[PageVO] = { for { pres <- presentations.get(presentationId) page <- pres.pages.get(pageId) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/ScreenshareModel.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/ScreenshareModel.scala index 1790dff16eedad9c3c7f58eab2f3d12b15042735..cae06abb02763bff02e2584313f7484d8f9c4e6b 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/ScreenshareModel.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/ScreenshareModel.scala @@ -7,6 +7,9 @@ object ScreenshareModel { status.rtmpBroadcastingUrl = "" status.screenshareVideoWidth = 0 status.screenshareVideoHeight = 0 + status.voiceConf = "" + status.screenshareConf = "" + status.timestamp = "" } def getScreenshareStarted(status: ScreenshareModel): Boolean = { @@ -52,64 +55,39 @@ object ScreenshareModel { def getRTMPBroadcastingUrl(status: ScreenshareModel): String = { status.rtmpBroadcastingUrl } -} - -class ScreenshareModel { - private var rtmpBroadcastingUrl: String = "" - private var screenshareStarted = false - private var screenshareVideoWidth = 0 - private var screenshareVideoHeight = 0 - private var broadcastingRTMP = false - - private def resetDesktopSharingParams() = { - broadcastingRTMP = false - screenshareStarted = false - rtmpBroadcastingUrl = "" - screenshareVideoWidth = 0 - screenshareVideoHeight = 0 - } - - private def getScreenshareStarted(): Boolean = { - return screenshareStarted - } - - private def setScreenshareStarted(b: Boolean) { - screenshareStarted = b - } - - private def setScreenshareVideoWidth(videoWidth: Int) { - screenshareVideoWidth = videoWidth - } - private def setScreenshareVideoHeight(videoHeight: Int) { - screenshareVideoHeight = videoHeight + def setVoiceConf(status: ScreenshareModel, voiceConf: String): Unit = { + status.voiceConf = voiceConf } - private def getScreenshareVideoWidth(): Int = { - screenshareVideoWidth + def getVoiceConf(status: ScreenshareModel): String = { + status.voiceConf } - private def getScreenshareVideoHeight(): Int = { - screenshareVideoHeight + def setScreenshareConf(status: ScreenshareModel, screenshareConf: String): Unit = { + status.screenshareConf = screenshareConf } - private def broadcastingRTMPStarted() { - broadcastingRTMP = true + def getScreenshareConf(status: ScreenshareModel): String = { + status.screenshareConf } - private def isBroadcastingRTMP(): Boolean = { - broadcastingRTMP + def setTimestamp(status: ScreenshareModel, timestamp: String): Unit = { + status.timestamp = timestamp } - private def broadcastingRTMPStopped() { - broadcastingRTMP = false - } - - private def setRTMPBroadcastingUrl(path: String) { - rtmpBroadcastingUrl = path + def getTimestamp(status: ScreenshareModel): String = { + status.timestamp } +} - private def getRTMPBroadcastingUrl(): String = { - rtmpBroadcastingUrl - } +class ScreenshareModel { + private var rtmpBroadcastingUrl: String = "" + private var screenshareStarted = false + private var screenshareVideoWidth = 0 + private var screenshareVideoHeight = 0 + private var broadcastingRTMP = false + private var voiceConf: String = "" + private var screenshareConf: String = "" + private var timestamp: String = "" } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/SharedNotesModel.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/SharedNotesModel.scala index 80e9e750d25449201abd0a397c2cee17a152e256..fb33304846352917c5468b0e2e082dd7c78640e2 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/SharedNotesModel.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/SharedNotesModel.scala @@ -103,7 +103,7 @@ class SharedNotesModel { def getNoteReport(noteId: String): Option[NoteReport] = { notes.get(noteId) match { case Some(note) => Some(noteToReport(note)) - case None => None + case None => None } } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/WhiteboardModel.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/WhiteboardModel.scala index 1a6937c88449b7b6a520e9311b9c38ef64f43654..5de3b8b46bef57565f15c5f7f2745e3e2ee94a36 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/WhiteboardModel.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/WhiteboardModel.scala @@ -5,7 +5,8 @@ import org.bigbluebutton.core.util.jhotdraw.BezierWrapper import scala.collection.immutable.List import scala.collection.immutable.HashMap import scala.collection.JavaConverters._ -import org.bigbluebutton.common2.domain.AnnotationVO +import org.bigbluebutton.common2.msgs.AnnotationVO +import org.bigbluebutton.core.apps.whiteboard.Whiteboard class WhiteboardModel { private var _whiteboards = new HashMap[String, Whiteboard]() @@ -218,16 +219,15 @@ class WhiteboardModel { def cleansePointsInAnnotation(ann: AnnotationVO): AnnotationVO = { var updatedAnnotationInfo = ann.annotationInfo ann.annotationInfo.get("points").foreach(points => - updatedAnnotationInfo = (ann.annotationInfo + ("points" -> convertListNumbersToFloat(points.asInstanceOf[List[_]]))) - ) + updatedAnnotationInfo = (ann.annotationInfo + ("points" -> convertListNumbersToFloat(points.asInstanceOf[List[_]])))) ann.copy(annotationInfo = updatedAnnotationInfo) } def convertListNumbersToFloat(list: List[_]): List[Float] = { list.map { case f: Double => f.toFloat - case f: Float => f - case f: Int => f.toFloat + case f: Float => f + case f: Int => f.toFloat }.asInstanceOf[List[Float]] } } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/BreakoutApp2x.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/BreakoutApp2x.scala index 115d4caffe919b0dda61162cd537fe53c209472d..1462291de2881107666fd005f23ad10ed4a89748 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/BreakoutApp2x.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/BreakoutApp2x.scala @@ -51,13 +51,14 @@ object BreakoutRoomsUtil { } def joinParams(username: String, userId: String, isBreakout: Boolean, breakoutMeetingId: String, - password: String): (mutable.Map[String, String], mutable.Map[String, String]) = { + password: String): (mutable.Map[String, String], mutable.Map[String, String]) = { val params = collection.mutable.HashMap( "fullName" -> urlEncode(username), "userID" -> urlEncode(userId), "isBreakout" -> urlEncode(isBreakout.toString()), "meetingID" -> urlEncode(breakoutMeetingId), - "password" -> urlEncode(password)) + "password" -> urlEncode(password) + ) (params += "redirect" -> urlEncode("true"), mutable.Map[String, String]() ++= params += "redirect" -> urlEncode("false")) } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/BreakoutRoomCreatedMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/BreakoutRoomCreatedMsgHdlr.scala index 72dd7cb03bfa806effbda3a212bb84ebc72819b4..9b4ff738c6148761ba21baed89da007205246608 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/BreakoutRoomCreatedMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/BreakoutRoomCreatedMsgHdlr.scala @@ -2,15 +2,14 @@ package org.bigbluebutton.core.apps.breakout import org.bigbluebutton.SystemConfiguration import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.core.models.{ BreakoutRooms, Users2x } -import org.bigbluebutton.core.running.{ BaseMeetingActor, LiveMeeting, MeetingActor } +import org.bigbluebutton.core.running.{ BaseMeetingActor, LiveMeeting, MeetingActor, OutMsgRouter } trait BreakoutRoomCreatedMsgHdlr extends SystemConfiguration { this: BaseMeetingActor => val liveMeeting: LiveMeeting - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleBreakoutRoomCreatedMsg(msg: BreakoutRoomCreatedMsg): Unit = { @@ -61,12 +60,14 @@ trait BreakoutRoomCreatedMsgHdlr extends SystemConfiguration { } def sendBreakoutRoomStarted(meetingId: String, breakoutName: String, externalMeetingId: String, - breakoutMeetingId: String, sequence: Int, voiceConfId: String) { + breakoutMeetingId: String, sequence: Int, voiceConfId: String) { log.info("Sending breakout room started {} for parent meeting {} ", breakoutMeetingId, meetingId) def build(meetingId: String, breakout: BreakoutRoomInfo): BbbCommonEnvCoreMsg = { - val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, - liveMeeting.props.meetingProp.intId, "not-used") + val routing = Routing.addMsgToClientRouting( + MessageTypes.BROADCAST_TO_MEETING, + liveMeeting.props.meetingProp.intId, "not-used" + ) val envelope = BbbCoreEnvelope(BreakoutRoomStartedEvtMsg.NAME, routing) val header = BbbClientMsgHeader(BreakoutRoomStartedEvtMsg.NAME, liveMeeting.props.meetingProp.intId, "not-used") @@ -97,7 +98,7 @@ trait BreakoutRoomCreatedMsgHdlr extends SystemConfiguration { BreakoutRoomsUtil.calculateChecksum(apiCall, noRedirectBaseString, bbbWebSharedSecret)) } yield { def build(meetingId: String, breakoutMeetingId: String, - userId: String, redirectJoinURL: String, noRedirectJoinURL: String): BbbCommonEnvCoreMsg = { + userId: String, redirectJoinURL: String, noRedirectJoinURL: String): BbbCommonEnvCoreMsg = { val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, meetingId, "not-used") val envelope = BbbCoreEnvelope(BreakoutRoomJoinURLEvtMsg.NAME, routing) val header = BbbClientMsgHeader(BreakoutRoomJoinURLEvtMsg.NAME, meetingId, "not-used") diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/BreakoutRoomEndedMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/BreakoutRoomEndedMsgHdlr.scala index 5c30b2681513346d1e400eaec24e71335cc3a7ed..51b641a04a041d651d92c0b6139185fbfc9e22fb 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/BreakoutRoomEndedMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/BreakoutRoomEndedMsgHdlr.scala @@ -1,15 +1,14 @@ package org.bigbluebutton.core.apps.breakout import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.core.models.BreakoutRooms -import org.bigbluebutton.core.running.MeetingActor +import org.bigbluebutton.core.running.{ MeetingActor, OutMsgRouter } import org.bigbluebutton.core2.message.senders.MsgBuilder trait BreakoutRoomEndedMsgHdlr { this: MeetingActor => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleBreakoutRoomEndedMsg(msg: BreakoutRoomEndedMsg): Unit = { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/BreakoutRoomUsersUpdateMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/BreakoutRoomUsersUpdateMsgHdlr.scala index 7f143f2cc0d475d8a113e00fc6e00017d6603b7b..b2177d7dcfb4a3aa72c333a6ba91c8cdce8b7d45 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/BreakoutRoomUsersUpdateMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/BreakoutRoomUsersUpdateMsgHdlr.scala @@ -1,14 +1,13 @@ package org.bigbluebutton.core.apps.breakout import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.core.models.BreakoutRooms -import org.bigbluebutton.core.running.MeetingActor +import org.bigbluebutton.core.running.{ MeetingActor, OutMsgRouter } trait BreakoutRoomUsersUpdateMsgHdlr { this: MeetingActor => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleBreakoutRoomUsersUpdateMsg(msg: BreakoutRoomUsersUpdateMsg): Unit = { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/BreakoutRoomsListMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/BreakoutRoomsListMsgHdlr.scala index a2b73cb6460e2612561c8e11b64e9ecdd38bb17a..5769c36e25e8f5b70c24a6ca95ed7e9d6e14ed09 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/BreakoutRoomsListMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/BreakoutRoomsListMsgHdlr.scala @@ -1,14 +1,13 @@ package org.bigbluebutton.core.apps.breakout import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.core.models.BreakoutRooms -import org.bigbluebutton.core.running.MeetingActor +import org.bigbluebutton.core.running.{ MeetingActor, OutMsgRouter } trait BreakoutRoomsListMsgHdlr { this: MeetingActor => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleBreakoutRoomsListMsg(msg: BreakoutRoomsListMsg): Unit = { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/CreateBreakoutRoomsCmdMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/CreateBreakoutRoomsCmdMsgHdlr.scala index e73877a869a6bc3fb4254b752ec024dea0eed1cb..87b24c5da2314f1bedab31925d6f2013e282e138 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/CreateBreakoutRoomsCmdMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/CreateBreakoutRoomsCmdMsgHdlr.scala @@ -1,24 +1,27 @@ package org.bigbluebutton.core.apps.breakout import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.core.models.BreakoutRooms -import org.bigbluebutton.core.running.{ BaseMeetingActor, LiveMeeting } +import org.bigbluebutton.core.running.{ BaseMeetingActor, LiveMeeting, OutMsgRouter } trait CreateBreakoutRoomsCmdMsgHdlr { this: BaseMeetingActor => val liveMeeting: LiveMeeting - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleCreateBreakoutRoomsCmdMsg(msg: CreateBreakoutRoomsCmdMsg): Unit = { // If breakout rooms are being created we ignore the coming message if (liveMeeting.breakoutRooms.pendingRoomsNumber > 0) { - log.warning("CreateBreakoutRooms event received while {} are pending to be created for meeting {}", - liveMeeting.breakoutRooms.pendingRoomsNumber, liveMeeting.props.meetingProp.intId) + log.warning( + "CreateBreakoutRooms event received while {} are pending to be created for meeting {}", + liveMeeting.breakoutRooms.pendingRoomsNumber, liveMeeting.props.meetingProp.intId + ) } else if (BreakoutRooms.getNumberOfRooms(liveMeeting.breakoutRooms) > 0) { - log.warning("CreateBreakoutRooms event received while {} breakout rooms running for meeting {}", - BreakoutRooms.getNumberOfRooms(liveMeeting.breakoutRooms), liveMeeting.props.meetingProp.intId) + log.warning( + "CreateBreakoutRooms event received while {} breakout rooms running for meeting {}", + BreakoutRooms.getNumberOfRooms(liveMeeting.breakoutRooms), liveMeeting.props.meetingProp.intId + ) } else { var i = 0 // in very rare cases the presentation conversion generates an error, what should we do? diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/EndAllBreakoutRoomsMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/EndAllBreakoutRoomsMsgHdlr.scala index 88251f247a9177adfafaacc5492e4ae38a9c257d..8204b2bd66f41dcd16d7a41e357a76fa4aebef99 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/EndAllBreakoutRoomsMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/EndAllBreakoutRoomsMsgHdlr.scala @@ -1,14 +1,13 @@ package org.bigbluebutton.core.apps.breakout import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.core.models.BreakoutRooms -import org.bigbluebutton.core.running.MeetingActor +import org.bigbluebutton.core.running.{ MeetingActor, OutMsgRouter } trait EndAllBreakoutRoomsMsgHdlr { this: MeetingActor => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleEndAllBreakoutRoomsMsg(msg: EndAllBreakoutRoomsMsg): Unit = { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/RequestBreakoutJoinURLReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/RequestBreakoutJoinURLReqMsgHdlr.scala index 060d3b4d443e713a16cfc8a9a40f70e12cf3c356..5f8ee6fa9505a246a2cd290141ceb2c8cede2adf 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/RequestBreakoutJoinURLReqMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/RequestBreakoutJoinURLReqMsgHdlr.scala @@ -1,14 +1,13 @@ package org.bigbluebutton.core.apps.breakout import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.core.models.{ BreakoutRooms, Users2x } -import org.bigbluebutton.core.running.MeetingActor +import org.bigbluebutton.core.running.{ MeetingActor, OutMsgRouter } trait RequestBreakoutJoinURLReqMsgHdlr { this: MeetingActor => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleRequestBreakoutJoinURLReqMsg(msg: RequestBreakoutJoinURLReqMsg): Unit = { @@ -38,8 +37,10 @@ trait RequestBreakoutJoinURLReqMsgHdlr { val envelope = BbbCoreEnvelope(RequestBreakoutJoinURLRespMsg.NAME, routing) val header = BbbClientMsgHeader(RequestBreakoutJoinURLRespMsg.NAME, props.meetingProp.intId, msg.header.userId) - val body = RequestBreakoutJoinURLRespMsgBody(props.meetingProp.intId, - externalMeetingId, userId, redirectJoinURL, noRedirectJoinURL) + val body = RequestBreakoutJoinURLRespMsgBody( + props.meetingProp.intId, + externalMeetingId, userId, redirectJoinURL, noRedirectJoinURL + ) val event = RequestBreakoutJoinURLRespMsg(header, body) val msgEvent = BbbCommonEnvCoreMsg(envelope, event) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/SendBreakoutUsersUpdateMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/SendBreakoutUsersUpdateMsgHdlr.scala index d074359bac4f23597858682ee6b55de8a3005ef0..2c80de76e2a6791d91260284dbfc48e805014f35 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/SendBreakoutUsersUpdateMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/SendBreakoutUsersUpdateMsgHdlr.scala @@ -1,22 +1,21 @@ package org.bigbluebutton.core.apps.breakout import org.bigbluebutton.common2.msgs.{ BreakoutUserVO, SendBreakoutUsersUpdateMsg } -import org.bigbluebutton.core.OutMessageGateway -import org.bigbluebutton.core.api.BreakoutRoomUsersUpdate -import org.bigbluebutton.core.bus.BigBlueButtonEvent -import org.bigbluebutton.core.models.{ Users2x } -import org.bigbluebutton.core.running.MeetingActor +import org.bigbluebutton.core.models.Users2x +import org.bigbluebutton.core.running.{ MeetingActor, OutMsgRouter } trait SendBreakoutUsersUpdateMsgHdlr { this: MeetingActor => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleSendBreakoutUsersUpdateMsg(msg: SendBreakoutUsersUpdateMsg): Unit = { val users = Users2x.findAll(liveMeeting.users2x) val breakoutUsers = users map { u => new BreakoutUserVO(u.extId, u.name) } - eventBus.publish(BigBlueButtonEvent(props.breakoutProps.parentId, - new BreakoutRoomUsersUpdate(props.breakoutProps.parentId, props.meetingProp.intId, breakoutUsers))) + /** TODO Need to figure out how to do this in a 2.0 way */ + log.error("**** SendBreakoutUsersUpdateMsgHdlr isn't finished and needs a new part *****") + //eventBus.publish(BigBlueButtonEvent(props.breakoutProps.parentId, + // new BreakoutRoomUsersUpdate(props.breakoutProps.parentId, props.meetingProp.intId, breakoutUsers))) } } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/TransferUserToMeetingRequestHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/TransferUserToMeetingRequestHdlr.scala index 3d3c8a5c6c5688a476886c38dd0c6e50b20c25fb..9772153d0c68f2242d26663be8dd649192489784 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/TransferUserToMeetingRequestHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/TransferUserToMeetingRequestHdlr.scala @@ -1,14 +1,13 @@ package org.bigbluebutton.core.apps.breakout import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway -import org.bigbluebutton.core.models.{ BreakoutRooms, Users2x, VoiceUser2x, VoiceUsers } -import org.bigbluebutton.core.running.MeetingActor +import org.bigbluebutton.core.models.{ BreakoutRooms, VoiceUsers } +import org.bigbluebutton.core.running.{ MeetingActor, OutMsgRouter } trait TransferUserToMeetingRequestHdlr { this: MeetingActor => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleTransferUserToMeetingRequestMsg(msg: TransferUserToMeetingRequestMsg): Unit = { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/caption/CaptionApp2x.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/caption/CaptionApp2x.scala index acb3bcd4eec0313352461714f5a1ae55bb8cc6a1..4c034563e932a01531f0658bd0d12b224ebd21aa 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/caption/CaptionApp2x.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/caption/CaptionApp2x.scala @@ -3,11 +3,12 @@ package org.bigbluebutton.core.apps.caption import akka.actor.ActorContext import akka.event.Logging import org.bigbluebutton.common2.msgs.TranscriptVO -import org.bigbluebutton.core.OutMessageGateway -import org.bigbluebutton.core.running.LiveMeeting +import org.bigbluebutton.core.running.{ LiveMeeting, OutMsgRouter } -class CaptionApp2x(val liveMeeting: LiveMeeting, - val outGW: OutMessageGateway)(implicit val context: ActorContext) +class CaptionApp2x( + val liveMeeting: LiveMeeting, + val outGW: OutMsgRouter +)(implicit val context: ActorContext) extends UserLeavingHdlr with EditCaptionHistoryPubMsgHdlr with UpdateCaptionOwnerPubMsgHdlr diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/caption/EditCaptionHistoryPubMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/caption/EditCaptionHistoryPubMsgHdlr.scala index 9d8d7bccf7565e4970eceeba709f3e872133aa66..cbc4d517e10605b6ae88e620dddba2679a57726f 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/caption/EditCaptionHistoryPubMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/caption/EditCaptionHistoryPubMsgHdlr.scala @@ -1,12 +1,12 @@ package org.bigbluebutton.core.apps.caption -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.common2.msgs._ +import org.bigbluebutton.core.running.OutMsgRouter trait EditCaptionHistoryPubMsgHdlr { this: CaptionApp2x => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleEditCaptionHistoryPubMsg(msg: EditCaptionHistoryPubMsg): Unit = { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/caption/SendCaptionHistoryReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/caption/SendCaptionHistoryReqMsgHdlr.scala index 40ac70ca8ea1879d9062ee0790e546e59885566e..20b9fe3dede099c88a7f2621d654ebe70cfe1ce5 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/caption/SendCaptionHistoryReqMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/caption/SendCaptionHistoryReqMsgHdlr.scala @@ -1,12 +1,12 @@ package org.bigbluebutton.core.apps.caption -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.common2.msgs._ +import org.bigbluebutton.core.running.OutMsgRouter trait SendCaptionHistoryReqMsgHdlr { this: CaptionApp2x => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleSendCaptionHistoryReqMsg(msg: SendCaptionHistoryReqMsg): Unit = { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/caption/UpdateCaptionOwnerPubMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/caption/UpdateCaptionOwnerPubMsgHdlr.scala index 3507566d4a5a5f481f98d6eb211ec860b3bef42a..93d1c48979310da0be45b63863c84f0594e59525 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/caption/UpdateCaptionOwnerPubMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/caption/UpdateCaptionOwnerPubMsgHdlr.scala @@ -1,12 +1,12 @@ package org.bigbluebutton.core.apps.caption -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.common2.msgs._ +import org.bigbluebutton.core.running.OutMsgRouter trait UpdateCaptionOwnerPubMsgHdlr { this: CaptionApp2x => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleUpdateCaptionOwnerPubMsg(msg: UpdateCaptionOwnerPubMsg): Unit = { updateCaptionOwner(msg.body.locale, msg.body.localeCode, msg.body.ownerId).foreach(f => { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/caption/UserLeavingHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/caption/UserLeavingHdlr.scala index 19581d748a69d900065c444851f3c2c573f22cc5..29f9406a121e3dbab0d341219c0f3b15663fc29b 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/caption/UserLeavingHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/caption/UserLeavingHdlr.scala @@ -1,12 +1,11 @@ package org.bigbluebutton.core.apps.caption -import org.bigbluebutton.core.OutMessageGateway -import org.bigbluebutton.core.running.MeetingActor +import org.bigbluebutton.core.running.{ OutMsgRouter } trait UserLeavingHdlr { this: CaptionApp2x => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleUserLeavingMsg(userId: String): Unit = { for { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/chat/ChatApp2x.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/chat/ChatApp2x.scala index ccbaf5d82a41dae110220522ae23da7389ca0660..1acfd2733582cece552f60689762a2e6d74d2909 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/chat/ChatApp2x.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/chat/ChatApp2x.scala @@ -2,12 +2,12 @@ package org.bigbluebutton.core.apps.chat import akka.actor.ActorContext import akka.event.Logging -import org.bigbluebutton.common2.msgs.TranscriptVO -import org.bigbluebutton.core.OutMessageGateway -import org.bigbluebutton.core.running.LiveMeeting +import org.bigbluebutton.core.running.{ LiveMeeting, OutMsgRouter } -class ChatApp2x(val liveMeeting: LiveMeeting, - val outGW: OutMessageGateway)(implicit val context: ActorContext) +class ChatApp2x( + val liveMeeting: LiveMeeting, + val outGW: OutMsgRouter +)(implicit val context: ActorContext) extends GetChatHistoryReqMsgHdlr with SendPublicMessagePubMsgHdlr with SendPrivateMessagePubMsgHdlr diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/chat/ClearPublicChatHistoryPubMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/chat/ClearPublicChatHistoryPubMsgHdlr.scala index 8f700f99b7a466008386ab5ee0aa7a31559fb922..7681dcb7cdce6f866ee4b833f6bfd8e6e5c9afc6 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/chat/ClearPublicChatHistoryPubMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/chat/ClearPublicChatHistoryPubMsgHdlr.scala @@ -1,13 +1,13 @@ package org.bigbluebutton.core.apps.chat -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.common2.msgs._ import org.bigbluebutton.core.apps.ChatModel +import org.bigbluebutton.core.running.OutMsgRouter trait ClearPublicChatHistoryPubMsgHdlr { this: ChatApp2x => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleClearPublicChatHistoryPubMsg(msg: ClearPublicChatHistoryPubMsg): Unit = { def broadcastEvent(msg: ClearPublicChatHistoryPubMsg): Unit = { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/chat/GetChatHistoryReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/chat/GetChatHistoryReqMsgHdlr.scala index cbdc44863d9ab15a4c369259eb8ac820a31eb350..56ae23936adaa68b05dd61b19073ca76a0fed5a0 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/chat/GetChatHistoryReqMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/chat/GetChatHistoryReqMsgHdlr.scala @@ -1,13 +1,13 @@ package org.bigbluebutton.core.apps.chat -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.common2.msgs._ import org.bigbluebutton.core.apps.ChatModel +import org.bigbluebutton.core.running.OutMsgRouter trait GetChatHistoryReqMsgHdlr { this: ChatApp2x => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleGetChatHistoryReqMsg(msg: GetChatHistoryReqMsg): Unit = { def broadcastEvent(msg: GetChatHistoryReqMsg, history: Array[ChatMessageVO]): Unit = { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/chat/SendPrivateMessagePubMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/chat/SendPrivateMessagePubMsgHdlr.scala index 3ccd5c6ad252fa1da2fb27b05fe1fa81893b8cee..935a84155ca7f5b79f3cd6f73f9198b3cc880e6b 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/chat/SendPrivateMessagePubMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/chat/SendPrivateMessagePubMsgHdlr.scala @@ -1,12 +1,12 @@ package org.bigbluebutton.core.apps.chat -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.common2.msgs._ +import org.bigbluebutton.core.running.OutMsgRouter trait SendPrivateMessagePubMsgHdlr { this: ChatApp2x => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleSendPrivateMessagePubMsg(msg: SendPrivateMessagePubMsg): Unit = { def broadcastEvent(message: ChatMessageVO, userId: String): Unit = { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/chat/SendPublicMessagePubMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/chat/SendPublicMessagePubMsgHdlr.scala index 773a0cbed5e8112904fa3c9265b7b19a886f61fd..b9182cc47914eafe9fcc62c34ed5d24bf9780bfb 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/chat/SendPublicMessagePubMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/chat/SendPublicMessagePubMsgHdlr.scala @@ -1,13 +1,13 @@ package org.bigbluebutton.core.apps.chat -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.common2.msgs._ import org.bigbluebutton.core.apps.ChatModel +import org.bigbluebutton.core.running.OutMsgRouter trait SendPublicMessagePubMsgHdlr { this: ChatApp2x => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleSendPublicMessagePubMsg(msg: SendPublicMessagePubMsg): Unit = { def broadcastEvent(msg: SendPublicMessagePubMsg, message: ChatMessageVO): Unit = { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/layout/BroadcastLayoutMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/layout/BroadcastLayoutMsgHdlr.scala index 5866c2d93427b87468132405a25eca5bae5d0675..0f9177af103b2b630c4b4db4857c561f7ffc06af 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/layout/BroadcastLayoutMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/layout/BroadcastLayoutMsgHdlr.scala @@ -1,14 +1,14 @@ package org.bigbluebutton.core.apps.layout import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.core.models.Layouts +import org.bigbluebutton.core.running.OutMsgRouter import org.bigbluebutton.core2.MeetingStatus2x trait BroadcastLayoutMsgHdlr { this: LayoutApp2x => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleBroadcastLayoutMsg(msg: BroadcastLayoutMsg): Unit = { Layouts.setCurrentLayout(msg.body.layout) @@ -24,7 +24,8 @@ trait BroadcastLayoutMsgHdlr { val body = BroadcastLayoutEvtMsgBody( Layouts.getCurrentLayout(), MeetingStatus2x.getPermissions(liveMeeting.status).lockedLayout, - Layouts.getLayoutSetter(), affectedUsers) + Layouts.getLayoutSetter(), affectedUsers + ) val event = BroadcastLayoutEvtMsg(header, body) val msgEvent = BbbCommonEnvCoreMsg(envelope, event) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/layout/GetCurrentLayoutReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/layout/GetCurrentLayoutReqMsgHdlr.scala index f1b2b328c37ed1c4815a9654e4c2604f881e5f40..de4bba19a8925e7c101e11d6724220c962c24454 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/layout/GetCurrentLayoutReqMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/layout/GetCurrentLayoutReqMsgHdlr.scala @@ -2,15 +2,14 @@ package org.bigbluebutton.core.apps.layout import org.bigbluebutton.common2.msgs._ import org.bigbluebutton.core2.MeetingStatus2x -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.core.models.Layouts -import org.bigbluebutton.core.running.LiveMeeting +import org.bigbluebutton.core.running.{ LiveMeeting, OutMsgRouter } trait GetCurrentLayoutReqMsgHdlr { this: LayoutApp2x => val liveMeeting: LiveMeeting - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleGetCurrentLayoutReqMsg(msg: GetCurrentLayoutReqMsg): Unit = { @@ -20,9 +19,11 @@ trait GetCurrentLayoutReqMsgHdlr { val envelope = BbbCoreEnvelope(GetCurrentLayoutRespMsg.NAME, routing) val header = BbbClientMsgHeader(GetCurrentLayoutRespMsg.NAME, liveMeeting.props.meetingProp.intId, msg.header.userId) - val body = GetCurrentLayoutRespMsgBody(Layouts.getCurrentLayout(), + val body = GetCurrentLayoutRespMsgBody( + Layouts.getCurrentLayout(), MeetingStatus2x.getPermissions(liveMeeting.status).lockedLayout, - Layouts.getLayoutSetter()) + Layouts.getLayoutSetter() + ) val event = GetCurrentLayoutRespMsg(header, body) val msgEvent = BbbCommonEnvCoreMsg(envelope, event) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/layout/LockLayoutMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/layout/LockLayoutMsgHdlr.scala index c7f5bc2f8d2f90a01eb91f133f24d072143275dd..75e09a5277ab656e5c5bc205f5c6b5b372c2a399 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/layout/LockLayoutMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/layout/LockLayoutMsgHdlr.scala @@ -1,13 +1,13 @@ package org.bigbluebutton.core.apps.layout import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.core.models.Layouts +import org.bigbluebutton.core.running.OutMsgRouter trait LockLayoutMsgHdlr { this: LayoutApp2x => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleLockLayoutMsg(msg: LockLayoutMsg): Unit = { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/meeting/SyncGetMeetingInfoRespMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/meeting/SyncGetMeetingInfoRespMsgHdlr.scala old mode 100644 new mode 100755 index ddf2e2dea0498a80a5329b303b64210c0e7ae90f..6d51ac8887ef7c381d9ddef645f8f8c234a2ae1b --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/meeting/SyncGetMeetingInfoRespMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/meeting/SyncGetMeetingInfoRespMsgHdlr.scala @@ -1,12 +1,12 @@ package org.bigbluebutton.core.apps.meeting import org.bigbluebutton.common2.domain.DefaultProps -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.common2.msgs._ +import org.bigbluebutton.core.running.OutMsgRouter trait SyncGetMeetingInfoRespMsgHdlr { - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleSyncGetMeetingInfoRespMsg(props: DefaultProps): Unit = { val routing = Routing.addMsgToClientRouting(MessageTypes.DIRECT, props.meetingProp.intId, "nodeJSapp") diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/polls/GetCurrentPollReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/polls/GetCurrentPollReqMsgHdlr.scala index fdd41dbc900d8d727c77b2cb7fc065a1c16fed19..4833c19eaabb6f5ad52c97091430efa04179c9de 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/polls/GetCurrentPollReqMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/polls/GetCurrentPollReqMsgHdlr.scala @@ -2,14 +2,13 @@ package org.bigbluebutton.core.apps.polls import org.bigbluebutton.common2.domain.PollVO import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.core.models.Polls -import org.bigbluebutton.core.running.MeetingActor +import org.bigbluebutton.core.running.{ MeetingActor, OutMsgRouter } trait GetCurrentPollReqMsgHdlr { this: MeetingActor => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleGetCurrentPollReqMsg(msgIn: GetCurrentPollReqMsg): Unit = { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/polls/HidePollResultReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/polls/HidePollResultReqMsgHdlr.scala index 1ba25729fd76afdedc850cc9c047cf49a21a606f..e8fc756421904ad104a84672620807c17092f68a 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/polls/HidePollResultReqMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/polls/HidePollResultReqMsgHdlr.scala @@ -1,14 +1,13 @@ package org.bigbluebutton.core.apps.polls import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.core.models.Polls -import org.bigbluebutton.core.running.MeetingActor +import org.bigbluebutton.core.running.{ MeetingActor, OutMsgRouter } trait HidePollResultReqMsgHdlr { this: MeetingActor => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleHidePollResultReqMsg(msg: HidePollResultReqMsg): Unit = { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/polls/RespondToPollReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/polls/RespondToPollReqMsgHdlr.scala index b3b7d37e841beae08952b5a26fd9ed3a30362186..996a2351c70b6bdffa18a67628ada8b6acba69cd 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/polls/RespondToPollReqMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/polls/RespondToPollReqMsgHdlr.scala @@ -2,14 +2,13 @@ package org.bigbluebutton.core.apps.polls import org.bigbluebutton.common2.domain.SimplePollResultOutVO import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.core.models.Polls -import org.bigbluebutton.core.running.MeetingActor +import org.bigbluebutton.core.running.{ MeetingActor, OutMsgRouter } trait RespondToPollReqMsgHdlr { this: MeetingActor => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleRespondToPollReqMsg(msg: RespondToPollReqMsg): Unit = { log.debug("Received RespondToPollReqMsg {}", RespondToPollReqMsg) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/polls/ShowPollResultReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/polls/ShowPollResultReqMsgHdlr.scala index 3d60a7b4d88977813cffc5aa0701624cd8bc4fcf..3789249fb4177f94794590911f24d247f67d98e5 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/polls/ShowPollResultReqMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/polls/ShowPollResultReqMsgHdlr.scala @@ -1,15 +1,14 @@ package org.bigbluebutton.core.apps.polls -import org.bigbluebutton.common2.domain.{ AnnotationVO, SimplePollResultOutVO } +import org.bigbluebutton.common2.domain.SimplePollResultOutVO import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.core.models.Polls -import org.bigbluebutton.core.running.MeetingActor +import org.bigbluebutton.core.running.{ MeetingActor, OutMsgRouter } trait ShowPollResultReqMsgHdlr { this: MeetingActor => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleShowPollResultReqMsg(msg: ShowPollResultReqMsg): Unit = { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/polls/StartCustomPollReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/polls/StartCustomPollReqMsgHdlr.scala index 52c3da3ab15f08f1be203f4f5f9539262d22e2c0..11b41470c849c0f8a304da5270fcc862e26e29e5 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/polls/StartCustomPollReqMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/polls/StartCustomPollReqMsgHdlr.scala @@ -2,14 +2,13 @@ package org.bigbluebutton.core.apps.polls import org.bigbluebutton.common2.domain.SimplePollOutVO import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.core.models.Polls -import org.bigbluebutton.core.running.MeetingActor +import org.bigbluebutton.core.running.{ MeetingActor, OutMsgRouter } trait StartCustomPollReqMsgHdlr { this: MeetingActor => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleStartCustomPollReqMsg(msg: StartCustomPollReqMsg): Unit = { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/polls/StartPollReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/polls/StartPollReqMsgHdlr.scala index f4730393772527f1c8f8106b170aec8282d158eb..21817cfcd8fefc13f62f57ac680ea2d3b55d2bcc 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/polls/StartPollReqMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/polls/StartPollReqMsgHdlr.scala @@ -2,14 +2,13 @@ package org.bigbluebutton.core.apps.polls import org.bigbluebutton.common2.domain.SimplePollOutVO import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.core.models.Polls -import org.bigbluebutton.core.running.MeetingActor +import org.bigbluebutton.core.running.{ MeetingActor, OutMsgRouter } trait StartPollReqMsgHdlr { this: MeetingActor => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleStartPollReqMsg(msg: StartPollReqMsg): Unit = { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/polls/StopPollReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/polls/StopPollReqMsgHdlr.scala index b6f5709c81642e3911587ae0fb415fbab9e8ff4b..9d18cb64953a201a8de510383522daf562e67722 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/polls/StopPollReqMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/polls/StopPollReqMsgHdlr.scala @@ -1,14 +1,13 @@ package org.bigbluebutton.core.apps.polls import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.core.models.Polls -import org.bigbluebutton.core.running.MeetingActor +import org.bigbluebutton.core.running.{ MeetingActor, OutMsgRouter } trait StopPollReqMsgHdlr { this: MeetingActor => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def broadcastEvent(requesterId: String, stoppedPollId: String): Unit = { val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, props.meetingProp.intId, requesterId) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/GetPresentationInfoReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/GetPresentationInfoReqMsgHdlr.scala index d02dc5cbc2897f3f83fb4449eb2dab4a55ad9b78..b1e3476155ed05693875b53f5358580879bb1440 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/GetPresentationInfoReqMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/GetPresentationInfoReqMsgHdlr.scala @@ -1,14 +1,14 @@ package org.bigbluebutton.core.apps.presentation -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.common2.msgs._ import org.bigbluebutton.common2.domain.PresentationVO import org.bigbluebutton.core.apps.Presentation +import org.bigbluebutton.core.running.OutMsgRouter trait GetPresentationInfoReqMsgHdlr { this: PresentationApp2x => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleGetPresentationInfoReqMsg(msg: GetPresentationInfoReqMsg): Unit = { log.debug("Received GetPresentationInfoReqMsg") diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/NewPresentationMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/NewPresentationMsgHdlr.scala index 2ca0c1705bae19112c19428f833d3fbf75e1d4b5..71cbcaf57b08f7f9907576f7fcd24f31058a2fc6 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/NewPresentationMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/NewPresentationMsgHdlr.scala @@ -1,13 +1,13 @@ package org.bigbluebutton.core.apps.presentation -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.common2.msgs._ import org.bigbluebutton.common2.domain.PresentationVO +import org.bigbluebutton.core.running.OutMsgRouter trait NewPresentationMsgHdlr { this: PresentationApp2x => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def broadcastNewPresentationEvent(userId: String, presentation: PresentationVO): Unit = { val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, liveMeeting.props.meetingProp.intId, userId) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/PresentationApp2x.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/PresentationApp2x.scala index 5ff8bd3b553a6c2919ed9aee563ec99a7036b0a9..22bf62cae6f89e72575d25f075b48e2979596242 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/PresentationApp2x.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/PresentationApp2x.scala @@ -2,14 +2,14 @@ package org.bigbluebutton.core.apps.presentation import akka.actor.ActorContext import akka.event.Logging -import org.bigbluebutton.common2.domain.PresentationVO -import org.bigbluebutton.core.OutMessageGateway -import org.bigbluebutton.core.running.LiveMeeting +import org.bigbluebutton.core.running.{ LiveMeeting, OutMsgRouter } import org.bigbluebutton.common2.domain.PageVO import org.bigbluebutton.core.apps.Presentation -class PresentationApp2x(val liveMeeting: LiveMeeting, - val outGW: OutMessageGateway)(implicit val context: ActorContext) +class PresentationApp2x( + val liveMeeting: LiveMeeting, + val outGW: OutMsgRouter +)(implicit val context: ActorContext) extends NewPresentationMsgHdlr with SetCurrentPresentationPubMsgHdlr with GetPresentationInfoReqMsgHdlr @@ -54,15 +54,15 @@ class PresentationApp2x(val liveMeeting: LiveMeeting, } def resizeAndMovePage(presentationId: String, pageId: String, - xOffset: Double, yOffset: Double, widthRatio: Double, - heightRatio: Double): Option[PageVO] = { + xOffset: Double, yOffset: Double, widthRatio: Double, + heightRatio: Double): Option[PageVO] = { // Force coordinate that are out-of-bounds inside valid values // 0.25D is 400% zoom // 100D-checkedWidth is the maximum the page can be moved over val checkedWidth = Math.min(Math.max(widthRatio, 25D), 100D) //if (widthRatio <= 100D) widthRatio else 100D val checkedHeight = Math.min(Math.max(heightRatio, 25D), 100D) - val checkedXOffset = Math.min(Math.max(xOffset, 0D), 100D - checkedWidth) - val checkedYOffset = Math.min(Math.max(yOffset, 0D), 100D - checkedHeight) + val checkedXOffset = Math.min(xOffset, 0D) + val checkedYOffset = Math.min(yOffset, 0D) liveMeeting.presModel.resizePage(presentationId, pageId, checkedXOffset, checkedYOffset, checkedWidth, checkedHeight); } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/PresentationConversionCompletedPubMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/PresentationConversionCompletedPubMsgHdlr.scala index 5d4448699d1852c6502e64ae4415d3ac890fee64..f9497fa4e171e8c531ba27b3565e1a1343337d27 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/PresentationConversionCompletedPubMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/PresentationConversionCompletedPubMsgHdlr.scala @@ -2,17 +2,15 @@ package org.bigbluebutton.core.apps.presentation import org.bigbluebutton.common2.domain.PageVO import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.core.apps.Presentation +import org.bigbluebutton.core.running.OutMsgRouter trait PresentationConversionCompletedPubMsgHdlr { this: PresentationApp2x => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handlePresentationConversionCompletedPubMsg(msg: PresentationConversionCompletedSysPubMsg): Unit = { - log.debug("**************** !!!!!PresentationConversionCompletedPubMsg ") - def broadcastEvent(msg: PresentationConversionCompletedSysPubMsg): Unit = { val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, liveMeeting.props.meetingProp.intId, msg.header.userId) val envelope = BbbCoreEnvelope(PresentationConversionCompletedEvtMsg.NAME, routing) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/PresentationConversionUpdatePubMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/PresentationConversionUpdatePubMsgHdlr.scala index 4f19b754ab628853c277ab5ba914ae0dbb3b4cbb..d9ffdbf4b658a7cb68d81d360b49242964e86134 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/PresentationConversionUpdatePubMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/PresentationConversionUpdatePubMsgHdlr.scala @@ -1,15 +1,15 @@ package org.bigbluebutton.core.apps.presentation import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway +import org.bigbluebutton.core.running.OutMsgRouter trait PresentationConversionUpdatePubMsgHdlr { this: PresentationApp2x => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handlePresentationConversionUpdatePubMsg(msg: PresentationConversionUpdateSysPubMsg): Unit = { - log.debug("**************** !!!!!PresentationConversionUpdateSysPubMsg " + msg.body.messageKey) + def broadcastEvent(msg: PresentationConversionUpdateSysPubMsg): Unit = { val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, liveMeeting.props.meetingProp.intId, msg.header.userId) val envelope = BbbCoreEnvelope(PresentationConversionUpdateEvtMsg.NAME, routing) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/PresentationPageCountErrorPubMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/PresentationPageCountErrorPubMsgHdlr.scala index d967da22c22cbb5c9dbf35b01d9926fb79c98cdf..84dc1d137bd88bbb11e455e7c1931832ee21980b 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/PresentationPageCountErrorPubMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/PresentationPageCountErrorPubMsgHdlr.scala @@ -1,12 +1,12 @@ package org.bigbluebutton.core.apps.presentation -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.common2.msgs._ +import org.bigbluebutton.core.running.OutMsgRouter trait PresentationPageCountErrorPubMsgHdlr { this: PresentationApp2x => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handlePresentationPageCountErrorPubMsg(msg: PresentationPageCountErrorSysPubMsg): Unit = { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/PresentationPageGeneratedPubMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/PresentationPageGeneratedPubMsgHdlr.scala index 710fa66dbf3c06298c8b22ee024dc3b730e00f08..83fc8cfd68635ea0c8b84a83b044ef7af60ab055 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/PresentationPageGeneratedPubMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/PresentationPageGeneratedPubMsgHdlr.scala @@ -1,15 +1,14 @@ package org.bigbluebutton.core.apps.presentation -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.common2.msgs._ +import org.bigbluebutton.core.running.OutMsgRouter trait PresentationPageGeneratedPubMsgHdlr { this: PresentationApp2x => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handlePresentationPageGeneratedPubMsg(msg: PresentationPageGeneratedSysPubMsg): Unit = { - log.debug("**************** !!!!!PresentationPageGeneratedSysPubMsg " + msg.body.messageKey) def broadcastEvent(msg: PresentationPageGeneratedSysPubMsg): Unit = { val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, liveMeeting.props.meetingProp.intId, msg.header.userId) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/PreuploadedPresentationsPubMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/PreuploadedPresentationsPubMsgHdlr.scala index a9f0a1f0a22315c9a00b3a1d442a6ac9ee7027a8..4c44b90de585af35cf20781092f804950280ae99 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/PreuploadedPresentationsPubMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/PreuploadedPresentationsPubMsgHdlr.scala @@ -2,13 +2,13 @@ package org.bigbluebutton.core.apps.presentation import org.bigbluebutton.common2.domain.PageVO import org.bigbluebutton.common2.msgs.PreuploadedPresentationsSysPubMsg -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.core.apps.Presentation +import org.bigbluebutton.core.running.OutMsgRouter trait PreuploadedPresentationsPubMsgHdlr { this: PresentationApp2x => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handlePreuploadedPresentationsPubMsg(msg: PreuploadedPresentationsSysPubMsg): Unit = { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/RemovePresentationPubMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/RemovePresentationPubMsgHdlr.scala index 50bfe2bb3a885eaf2c8771900c4e7c8575b2e7d2..4fff15989cc2a14411f1c1280f5199c7303115e6 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/RemovePresentationPubMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/RemovePresentationPubMsgHdlr.scala @@ -1,12 +1,12 @@ package org.bigbluebutton.core.apps.presentation import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway +import org.bigbluebutton.core.running.OutMsgRouter trait RemovePresentationPubMsgHdlr { this: PresentationApp2x => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleRemovePresentationPubMsg(msg: RemovePresentationPubMsg): Unit = { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/ResizeAndMovePagePubMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/ResizeAndMovePagePubMsgHdlr.scala index 2cd05508c6aa2d78af57fe3e82f66a7135ea0fdd..f0694832a6586af47a4a8b34460dfabce6611afc 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/ResizeAndMovePagePubMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/ResizeAndMovePagePubMsgHdlr.scala @@ -1,13 +1,13 @@ package org.bigbluebutton.core.apps.presentation -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.common2.msgs._ import org.bigbluebutton.common2.domain.PageVO +import org.bigbluebutton.core.running.OutMsgRouter trait ResizeAndMovePagePubMsgHdlr { this: PresentationApp2x => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleResizeAndMovePagePubMsg(msg: ResizeAndMovePagePubMsg): Unit = { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/SetCurrentPagePubMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/SetCurrentPagePubMsgHdlr.scala index c8c8c567d8f8e9bde2a9e4a66770d86b98c52d9e..0e7861ceb35f901182f71fdeeeabbf23bde958ae 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/SetCurrentPagePubMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/SetCurrentPagePubMsgHdlr.scala @@ -1,12 +1,12 @@ package org.bigbluebutton.core.apps.presentation -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.common2.msgs._ +import org.bigbluebutton.core.running.OutMsgRouter trait SetCurrentPagePubMsgHdlr { this: PresentationApp2x => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleSetCurrentPagePubMsg(msg: SetCurrentPagePubMsg): Unit = { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/SetCurrentPresentationPubMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/SetCurrentPresentationPubMsgHdlr.scala index b89546fed2f9e59edd0ba73ee9b8e9c7a674e3d3..319bdaf1b4b304ef58dd548b3ce203fc38de5b2f 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/SetCurrentPresentationPubMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/SetCurrentPresentationPubMsgHdlr.scala @@ -1,12 +1,12 @@ package org.bigbluebutton.core.apps.presentation -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.common2.msgs._ +import org.bigbluebutton.core.running.OutMsgRouter trait SetCurrentPresentationPubMsgHdlr { this: PresentationApp2x => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleSetCurrentPresentationPubMsg(msg: SetCurrentPresentationPubMsg): Unit = { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/SyncGetPresentationInfoRespMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/SyncGetPresentationInfoRespMsgHdlr.scala old mode 100644 new mode 100755 index 94ce4f9dde56ccd53bfa3c3b8d1df97d6d41a511..fe4c6413720266c242022e7e4ab7f706e4ffe7a5 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/SyncGetPresentationInfoRespMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentation/SyncGetPresentationInfoRespMsgHdlr.scala @@ -1,13 +1,13 @@ package org.bigbluebutton.core.apps.presentation -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.common2.msgs._ import org.bigbluebutton.common2.domain.PresentationVO +import org.bigbluebutton.core.running.OutMsgRouter trait SyncGetPresentationInfoRespMsgHdlr { this: PresentationApp2x => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleSyncGetPresentationInfoRespMsg(): Unit = { log.debug("Handling SyncGetPresentationInfo") diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/screenshare/GetScreenshareStatusReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/screenshare/GetScreenshareStatusReqMsgHdlr.scala new file mode 100755 index 0000000000000000000000000000000000000000..31fac5f63db5a664608ec8225a140a0945d94c5c --- /dev/null +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/screenshare/GetScreenshareStatusReqMsgHdlr.scala @@ -0,0 +1,48 @@ +package org.bigbluebutton.core.apps.screenshare + +import org.bigbluebutton.core.running.OutMsgRouter +import org.bigbluebutton.common2.msgs._ +import org.bigbluebutton.core.apps.ScreenshareModel + +trait GetScreenshareStatusReqMsgHdlr { + this: ScreenshareApp2x => + + // val liveMeeting: LiveMeeting + val outGW: OutMsgRouter + + def handleGetScreenshareStatusReqMsg(msg: GetScreenshareStatusReqMsg) { + + def broadcastEvent(meetingId: String, userId: String): BbbCommonEnvCoreMsg = { + + val routing = Routing.addMsgToClientRouting(MessageTypes.DIRECT, meetingId, userId) + val envelope = BbbCoreEnvelope(ScreenshareRtmpBroadcastStartedEvtMsg.NAME, routing) + val header = BbbClientMsgHeader( + ScreenshareRtmpBroadcastStartedEvtMsg.NAME, + liveMeeting.props.meetingProp.intId, "not-used" + ) + + val voiceConf = ScreenshareModel.getVoiceConf(liveMeeting.screenshareModel) + val screenshareConf = ScreenshareModel.getScreenshareConf(liveMeeting.screenshareModel) + val stream = ScreenshareModel.getRTMPBroadcastingUrl(liveMeeting.screenshareModel) + val vidWidth = ScreenshareModel.getScreenshareVideoWidth(liveMeeting.screenshareModel) + val vidHeight = ScreenshareModel.getScreenshareVideoHeight(liveMeeting.screenshareModel) + val timestamp = ScreenshareModel.getTimestamp(liveMeeting.screenshareModel) + + val body = ScreenshareRtmpBroadcastStartedEvtMsgBody(voiceConf, screenshareConf, + stream, vidWidth, vidHeight, timestamp) + val event = ScreenshareRtmpBroadcastStartedEvtMsg(header, body) + BbbCommonEnvCoreMsg(envelope, event) + } + + log.info("handleGetScreenshareStatusReqMsg: isBroadcastingRTMP=" + + ScreenshareModel.isBroadcastingRTMP(liveMeeting.screenshareModel) + + " URL:" + ScreenshareModel.getRTMPBroadcastingUrl(liveMeeting.screenshareModel)) + + // only reply if there is an ongoing stream + if (ScreenshareModel.isBroadcastingRTMP(liveMeeting.screenshareModel)) { + + val msgEvent = broadcastEvent(liveMeeting.props.meetingProp.intId, msg.body.requestedBy) + outGW.send(msgEvent) + } + } +} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/screenshare/ScreenshareApp2x.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/screenshare/ScreenshareApp2x.scala index 37aa6d0147086e0b966510172e3d6d4fddae6535..bc4572a44f161e6889ccfe29ff26399b406c597f 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/screenshare/ScreenshareApp2x.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/screenshare/ScreenshareApp2x.scala @@ -2,13 +2,15 @@ package org.bigbluebutton.core.apps.screenshare import akka.actor.ActorContext import akka.event.Logging -import org.bigbluebutton.core.OutMessageGateway -import org.bigbluebutton.core.running.LiveMeeting +import org.bigbluebutton.core.running.{ LiveMeeting, OutMsgRouter } -class ScreenshareApp2x(val liveMeeting: LiveMeeting, - val outGW: OutMessageGateway)(implicit val context: ActorContext) +class ScreenshareApp2x( + val liveMeeting: LiveMeeting, + val outGW: OutMsgRouter +)(implicit val context: ActorContext) extends ScreenshareStartedVoiceConfEvtMsgHdlr with ScreenshareStoppedVoiceConfEvtMsgHdlr + with GetScreenshareStatusReqMsgHdlr with ScreenshareRtmpBroadcastStartedVoiceConfEvtMsgHdlr with ScreenshareRtmpBroadcastStoppedVoiceConfEvtMsgHdlr { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/screenshare/ScreenshareRtmpBroadcastStartedVoiceConfEvtMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/screenshare/ScreenshareRtmpBroadcastStartedVoiceConfEvtMsgHdlr.scala index dd26e3c6d6577388fcf627a2c3c8a6baba0d42f5..2d65bb0d0ddf462487a1717150f85396c5eb355e 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/screenshare/ScreenshareRtmpBroadcastStartedVoiceConfEvtMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/screenshare/ScreenshareRtmpBroadcastStartedVoiceConfEvtMsgHdlr.scala @@ -1,23 +1,27 @@ package org.bigbluebutton.core.apps.screenshare -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.common2.msgs._ import org.bigbluebutton.core.apps.ScreenshareModel +import org.bigbluebutton.core.running.OutMsgRouter trait ScreenshareRtmpBroadcastStartedVoiceConfEvtMsgHdlr { this: ScreenshareApp2x => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleScreenshareRtmpBroadcastStartedVoiceConfEvtMsg(msg: ScreenshareRtmpBroadcastStartedVoiceConfEvtMsg): Unit = { def broadcastEvent(voiceConf: String, screenshareConf: String, stream: String, vidWidth: Int, vidHeight: Int, - timestamp: String): BbbCommonEnvCoreMsg = { + timestamp: String): BbbCommonEnvCoreMsg = { - val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, - liveMeeting.props.meetingProp.intId, "not-used") + val routing = Routing.addMsgToClientRouting( + MessageTypes.BROADCAST_TO_MEETING, + liveMeeting.props.meetingProp.intId, "not-used" + ) val envelope = BbbCoreEnvelope(ScreenshareRtmpBroadcastStartedEvtMsg.NAME, routing) - val header = BbbClientMsgHeader(ScreenshareRtmpBroadcastStartedEvtMsg.NAME, - liveMeeting.props.meetingProp.intId, "not-used") + val header = BbbClientMsgHeader( + ScreenshareRtmpBroadcastStartedEvtMsg.NAME, + liveMeeting.props.meetingProp.intId, "not-used" + ) val body = ScreenshareRtmpBroadcastStartedEvtMsgBody(voiceConf, screenshareConf, stream, vidWidth, vidHeight, timestamp) @@ -35,6 +39,10 @@ trait ScreenshareRtmpBroadcastStartedVoiceConfEvtMsgHdlr { ScreenshareModel.broadcastingRTMPStarted(liveMeeting.screenshareModel) ScreenshareModel.setScreenshareVideoWidth(liveMeeting.screenshareModel, msg.body.vidWidth) ScreenshareModel.setScreenshareVideoHeight(liveMeeting.screenshareModel, msg.body.vidHeight) + ScreenshareModel.setVoiceConf(liveMeeting.screenshareModel, msg.body.voiceConf) + ScreenshareModel.setScreenshareConf(liveMeeting.screenshareModel, msg.body.screenshareConf) + ScreenshareModel.setTimestamp(liveMeeting.screenshareModel, msg.body.timestamp) + log.info("START broadcast ALLOWED when isBroadcastingRTMP=false") // Notify viewers in the meeting that there's an rtmp stream to view diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/screenshare/ScreenshareRtmpBroadcastStoppedVoiceConfEvtMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/screenshare/ScreenshareRtmpBroadcastStoppedVoiceConfEvtMsgHdlr.scala index 5c96ef688e89d4db6d00d6d2a14d4bbe5490cf3c..19ea3565ecb06929318a3288c1eb2e91587ac17d 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/screenshare/ScreenshareRtmpBroadcastStoppedVoiceConfEvtMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/screenshare/ScreenshareRtmpBroadcastStoppedVoiceConfEvtMsgHdlr.scala @@ -1,25 +1,29 @@ package org.bigbluebutton.core.apps.screenshare -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.common2.msgs._ import org.bigbluebutton.core.apps.ScreenshareModel +import org.bigbluebutton.core.running.OutMsgRouter trait ScreenshareRtmpBroadcastStoppedVoiceConfEvtMsgHdlr { this: ScreenshareApp2x => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleScreenshareRtmpBroadcastStoppedVoiceConfEvtMsg(msg: ScreenshareRtmpBroadcastStoppedVoiceConfEvtMsg): Unit = { def broadcastEvent(voiceConf: String, screenshareConf: String, - stream: String, vidWidth: Int, vidHeight: Int, - timestamp: String): BbbCommonEnvCoreMsg = { + stream: String, vidWidth: Int, vidHeight: Int, + timestamp: String): BbbCommonEnvCoreMsg = { - val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, - liveMeeting.props.meetingProp.intId, "not-used") + val routing = Routing.addMsgToClientRouting( + MessageTypes.BROADCAST_TO_MEETING, + liveMeeting.props.meetingProp.intId, "not-used" + ) val envelope = BbbCoreEnvelope(ScreenshareRtmpBroadcastStoppedEvtMsg.NAME, routing) - val header = BbbClientMsgHeader(ScreenshareRtmpBroadcastStoppedEvtMsg.NAME, - liveMeeting.props.meetingProp.intId, "not-used") + val header = BbbClientMsgHeader( + ScreenshareRtmpBroadcastStoppedEvtMsg.NAME, + liveMeeting.props.meetingProp.intId, "not-used" + ) val body = ScreenshareRtmpBroadcastStoppedEvtMsgBody(voiceConf, screenshareConf, stream, vidWidth, vidHeight, timestamp) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/screenshare/ScreenshareStartedVoiceConfEvtMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/screenshare/ScreenshareStartedVoiceConfEvtMsgHdlr.scala index b791310e9bfb038ac261d899150816e71993d68d..9003b30d9bc255af57b12d2e9a9cc51538f0d72b 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/screenshare/ScreenshareStartedVoiceConfEvtMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/screenshare/ScreenshareStartedVoiceConfEvtMsgHdlr.scala @@ -1,13 +1,13 @@ package org.bigbluebutton.core.apps.screenshare -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.common2.msgs._ import org.bigbluebutton.core.apps.ScreenshareModel +import org.bigbluebutton.core.running.OutMsgRouter trait ScreenshareStartedVoiceConfEvtMsgHdlr { this: ScreenshareApp2x => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleScreenshareStartedVoiceConfEvtMsg(msg: ScreenshareStartedVoiceConfEvtMsg): Unit = { @@ -15,8 +15,10 @@ trait ScreenshareStartedVoiceConfEvtMsgHdlr { val routing = collection.immutable.HashMap("sender" -> "bbb-apps-akka") val envelope = BbbCoreEnvelope(ScreenshareStartRtmpBroadcastVoiceConfMsg.NAME, routing) - val header = BbbCoreHeaderWithMeetingId(ScreenshareStartRtmpBroadcastVoiceConfMsg.NAME, - liveMeeting.props.meetingProp.intId) + val header = BbbCoreHeaderWithMeetingId( + ScreenshareStartRtmpBroadcastVoiceConfMsg.NAME, + liveMeeting.props.meetingProp.intId + ) val body = ScreenshareStartRtmpBroadcastVoiceConfMsgBody(voiceConf: String, screenshareConf: String, url: String, timestamp: String) val event = ScreenshareStartRtmpBroadcastVoiceConfMsg(header, body) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/screenshare/ScreenshareStoppedVoiceConfEvtMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/screenshare/ScreenshareStoppedVoiceConfEvtMsgHdlr.scala index 941da8a3c1e0b48c6d5838eb51673d9b2f227219..6c46fb127e7c610719b2949f684ed2ddc5c8e2ce 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/screenshare/ScreenshareStoppedVoiceConfEvtMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/screenshare/ScreenshareStoppedVoiceConfEvtMsgHdlr.scala @@ -1,21 +1,23 @@ package org.bigbluebutton.core.apps.screenshare -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.common2.msgs._ import org.bigbluebutton.core.apps.ScreenshareModel +import org.bigbluebutton.core.running.OutMsgRouter trait ScreenshareStoppedVoiceConfEvtMsgHdlr { this: ScreenshareApp2x => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleScreenshareStoppedVoiceConfEvtMsg(msg: ScreenshareStoppedVoiceConfEvtMsg): Unit = { def broadcastEvent(voiceConf: String, screenshareConf: String, url: String, timestamp: String): BbbCommonEnvCoreMsg = { val routing = collection.immutable.HashMap("sender" -> "bbb-apps-akka") val envelope = BbbCoreEnvelope(ScreenshareStopRtmpBroadcastVoiceConfMsg.NAME, routing) - val header = BbbCoreHeaderWithMeetingId(ScreenshareStopRtmpBroadcastVoiceConfMsg.NAME, - liveMeeting.props.meetingProp.intId) + val header = BbbCoreHeaderWithMeetingId( + ScreenshareStopRtmpBroadcastVoiceConfMsg.NAME, + liveMeeting.props.meetingProp.intId + ) val body = ScreenshareStopRtmpBroadcastVoiceConfMsgBody(voiceConf, screenshareConf, url, timestamp) val event = ScreenshareStopRtmpBroadcastVoiceConfMsg(header, body) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/sharednotes/CreateSharedNoteReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/sharednotes/CreateSharedNoteReqMsgHdlr.scala old mode 100644 new mode 100755 index 186995bf21ccf1d0e1a42e1c77e7350678df63a6..282b4f64ef7ead91f6f6acddbc14871cc8babdff --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/sharednotes/CreateSharedNoteReqMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/sharednotes/CreateSharedNoteReqMsgHdlr.scala @@ -1,12 +1,12 @@ package org.bigbluebutton.core.apps.sharednotes -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.common2.msgs._ +import org.bigbluebutton.core.running.OutMsgRouter trait CreateSharedNoteReqMsgHdlr { this: SharedNotesApp2x => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleCreateSharedNoteReqMsg(msg: CreateSharedNoteReqMsg): Unit = { @@ -24,4 +24,4 @@ trait CreateSharedNoteReqMsgHdlr { val noteId = liveMeeting.notesModel.createNote(msg.body.noteName) broadcastEvent(msg, noteId) } -} \ No newline at end of file +} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/sharednotes/DestroySharedNoteReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/sharednotes/DestroySharedNoteReqMsgHdlr.scala old mode 100644 new mode 100755 index e666282ac4a271b894a168dbfcd8572123602b49..d4e3c5ec9fa8a130a4106ae7311bf1972c8c817f --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/sharednotes/DestroySharedNoteReqMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/sharednotes/DestroySharedNoteReqMsgHdlr.scala @@ -1,12 +1,12 @@ package org.bigbluebutton.core.apps.sharednotes -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.common2.msgs._ +import org.bigbluebutton.core.running.OutMsgRouter trait DestroySharedNoteReqMsgHdlr { this: SharedNotesApp2x => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleDestroySharedNoteReqMsg(msg: DestroySharedNoteReqMsg): Unit = { @@ -24,4 +24,4 @@ trait DestroySharedNoteReqMsgHdlr { liveMeeting.notesModel.destroyNote(msg.body.noteId) broadcastEvent(msg) } -} \ No newline at end of file +} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/sharednotes/GetSharedNotesPubMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/sharednotes/GetSharedNotesPubMsgHdlr.scala old mode 100644 new mode 100755 index 859a52d5056251947a2dbb7ad14841cce75a44a1..3a0abedbda21aea31cabba893214bb72884d76cc --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/sharednotes/GetSharedNotesPubMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/sharednotes/GetSharedNotesPubMsgHdlr.scala @@ -1,12 +1,12 @@ package org.bigbluebutton.core.apps.sharednotes -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.common2.msgs._ +import org.bigbluebutton.core.running.OutMsgRouter trait GetSharedNotesPubMsgHdlr { this: SharedNotesApp2x => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleGetSharedNotesPubMsg(msg: GetSharedNotesPubMsg): Unit = { @@ -24,4 +24,4 @@ trait GetSharedNotesPubMsgHdlr { val notesReport = liveMeeting.notesModel.notesReport.toMap broadcastEvent(msg, notesReport) } -} \ No newline at end of file +} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/sharednotes/SharedNotesApp2x.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/sharednotes/SharedNotesApp2x.scala old mode 100644 new mode 100755 index df3fcb5eda9286f77352d16d9fa42bb2ca8cc0f5..579b1e8e10d6c09d2d5109957da4ddac974e3404 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/sharednotes/SharedNotesApp2x.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/sharednotes/SharedNotesApp2x.scala @@ -2,11 +2,12 @@ package org.bigbluebutton.core.apps.sharednotes import akka.actor.ActorContext import akka.event.Logging -import org.bigbluebutton.core.OutMessageGateway -import org.bigbluebutton.core.running.LiveMeeting +import org.bigbluebutton.core.running.{ LiveMeeting, OutMsgRouter } -class SharedNotesApp2x(val liveMeeting: LiveMeeting, - val outGW: OutMessageGateway)(implicit val context: ActorContext) +class SharedNotesApp2x( + val liveMeeting: LiveMeeting, + val outGW: OutMsgRouter +)(implicit val context: ActorContext) extends GetSharedNotesPubMsgHdlr with SyncSharedNotePubMsgHdlr with UpdateSharedNoteReqMsgHdlr @@ -14,4 +15,4 @@ class SharedNotesApp2x(val liveMeeting: LiveMeeting, with DestroySharedNoteReqMsgHdlr { val log = Logging(context.system, getClass) -} \ No newline at end of file +} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/sharednotes/SyncSharedNotePubMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/sharednotes/SyncSharedNotePubMsgHdlr.scala old mode 100644 new mode 100755 index 9b8951a8017443f12f7dfb7d7ad0143dc74e0812..35fa8a393a72b737da0195110c48196d0bf1c99a --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/sharednotes/SyncSharedNotePubMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/sharednotes/SyncSharedNotePubMsgHdlr.scala @@ -1,12 +1,12 @@ package org.bigbluebutton.core.apps.sharednotes -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.common2.msgs._ +import org.bigbluebutton.core.running.OutMsgRouter trait SyncSharedNotePubMsgHdlr { this: SharedNotesApp2x => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleSyncSharedNotePubMsg(msg: SyncSharedNotePubMsg): Unit = { @@ -23,7 +23,7 @@ trait SyncSharedNotePubMsgHdlr { liveMeeting.notesModel.getNoteReport(msg.body.noteId) match { case Some(noteReport) => broadcastEvent(msg, noteReport) - case None => log.warning("Could not find note " + msg.body.noteId) + case None => log.warning("Could not find note " + msg.body.noteId) } } -} \ No newline at end of file +} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/sharednotes/UpdateSharedNoteReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/sharednotes/UpdateSharedNoteReqMsgHdlr.scala old mode 100644 new mode 100755 index 14fee8e8b487e4dce0e37ebb309e4e842bacf4b4..505e7847fbc51514db8910884587ce70195e714e --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/sharednotes/UpdateSharedNoteReqMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/sharednotes/UpdateSharedNoteReqMsgHdlr.scala @@ -1,12 +1,12 @@ package org.bigbluebutton.core.apps.sharednotes -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.common2.msgs._ +import org.bigbluebutton.core.running.OutMsgRouter trait UpdateSharedNoteReqMsgHdlr { this: SharedNotesApp2x => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleUpdateSharedNoteReqMsg(msg: UpdateSharedNoteReqMsg): Unit = { @@ -23,9 +23,9 @@ trait UpdateSharedNoteReqMsgHdlr { val userId = msg.body.operation match { case "PATCH" => msg.header.userId - case "UNDO" => liveMeeting.notesModel.SYSTEM_ID - case "REDO" => liveMeeting.notesModel.SYSTEM_ID - case _ => return + case "UNDO" => liveMeeting.notesModel.SYSTEM_ID + case "REDO" => liveMeeting.notesModel.SYSTEM_ID + case _ => return } val (patchId, patch, undo, redo) = liveMeeting.notesModel.patchNote(msg.body.noteId, msg.body.patch, msg.body.operation) @@ -36,4 +36,4 @@ trait UpdateSharedNoteReqMsgHdlr { log.warning("Could not patch note " + msg.body.noteId) } } -} \ No newline at end of file +} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/AssignPresenterReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/AssignPresenterReqMsgHdlr.scala index 1879a17a69e736d880628683f685430a84f3ce98..bd20ff54869c29fc75fc1e704881bdef53275f26 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/AssignPresenterReqMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/AssignPresenterReqMsgHdlr.scala @@ -2,16 +2,22 @@ package org.bigbluebutton.core.apps.users import org.bigbluebutton.common2.msgs._ import org.bigbluebutton.core.models.{ UserState, Users2x } +import org.bigbluebutton.core.running.{ LiveMeeting, OutMsgRouter } trait AssignPresenterReqMsgHdlr { - this: UsersApp2x => + this: UsersApp => + + val liveMeeting: LiveMeeting + val outGW: OutMsgRouter def handleAssignPresenterReqMsg(msg: AssignPresenterReqMsg) { def broadcastPresenterChange(oldPres: UserState, newPres: UserState): Unit = { // unassign old presenter - val routingUnassign = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, - this.liveMeeting.props.meetingProp.intId, oldPres.intId) + val routingUnassign = Routing.addMsgToClientRouting( + MessageTypes.BROADCAST_TO_MEETING, + this.liveMeeting.props.meetingProp.intId, oldPres.intId + ) val envelopeUnassign = BbbCoreEnvelope(PresenterUnassignedEvtMsg.NAME, routingUnassign) val headerUnassign = BbbClientMsgHeader(PresenterUnassignedEvtMsg.NAME, this.liveMeeting.props.meetingProp.intId, oldPres.intId) @@ -22,8 +28,10 @@ trait AssignPresenterReqMsgHdlr { outGW.send(msgEventUnassign) // set new presenter - val routingAssign = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, - this.liveMeeting.props.meetingProp.intId, newPres.intId) + val routingAssign = Routing.addMsgToClientRouting( + MessageTypes.BROADCAST_TO_MEETING, + this.liveMeeting.props.meetingProp.intId, newPres.intId + ) val envelopeAssign = BbbCoreEnvelope(PresenterAssignedEvtMsg.NAME, routingAssign) val headerAssign = BbbClientMsgHeader(PresenterAssignedEvtMsg.NAME, this.liveMeeting.props.meetingProp.intId, newPres.intId) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/ChangeUserEmojiCmdMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/ChangeUserEmojiCmdMsgHdlr.scala similarity index 77% rename from akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/ChangeUserEmojiCmdMsgHdlr.scala rename to akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/ChangeUserEmojiCmdMsgHdlr.scala index 82aa9f6400610435dd8badaf39ea9fefb081637d..f8ed292a05738cda7450ccec579b44168a03f25e 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/ChangeUserEmojiCmdMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/ChangeUserEmojiCmdMsgHdlr.scala @@ -1,15 +1,14 @@ -package org.bigbluebutton.core2.message.handlers.users +package org.bigbluebutton.core.apps.users import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.core.models.Users2x -import org.bigbluebutton.core.running.{ BaseMeetingActor, LiveMeeting, MeetingActor } +import org.bigbluebutton.core.running.{ BaseMeetingActor, LiveMeeting, OutMsgRouter } trait ChangeUserEmojiCmdMsgHdlr { this: BaseMeetingActor => val liveMeeting: LiveMeeting - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleChangeUserEmojiCmdMsg(msg: ChangeUserEmojiCmdMsg) { log.debug("handling " + msg) @@ -20,7 +19,7 @@ trait ChangeUserEmojiCmdMsgHdlr { } } - def sendUserEmojiChangedEvtMsg(outGW: OutMessageGateway, meetingId: String, userId: String, emoji: String): Unit = { + def sendUserEmojiChangedEvtMsg(outGW: OutMsgRouter, meetingId: String, userId: String, emoji: String): Unit = { val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, meetingId, userId) val envelope = BbbCoreEnvelope(UserEmojiChangedEvtMsg.NAME, routing) val header = BbbClientMsgHeader(UserEmojiChangedEvtMsg.NAME, meetingId, userId) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/ChangeUserRoleCmdMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/ChangeUserRoleCmdMsgHdlr.scala index af8c6d1ded52cde36a3aa3e54e14b328f838e393..bd2fec1ca763762cac4bac4b6ea4b6f93e11b681 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/ChangeUserRoleCmdMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/ChangeUserRoleCmdMsgHdlr.scala @@ -2,9 +2,13 @@ package org.bigbluebutton.core.apps.users import org.bigbluebutton.common2.msgs._ import org.bigbluebutton.core.models.{ Roles, Users2x } +import org.bigbluebutton.core.running.{ LiveMeeting, OutMsgRouter } trait ChangeUserRoleCmdMsgHdlr { - this: UsersApp2x => + this: UsersApp => + + val liveMeeting: LiveMeeting + val outGW: OutMsgRouter def handleChangeUserRoleCmdMsg(msg: ChangeUserRoleCmdMsg) { for { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/EjectUserFromMeetingCmdMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/EjectUserFromMeetingCmdMsgHdlr.scala index d6d28495e482971f0f3784b9e52bbe8a0c0e2fe3..72a7bc0c850610a4c80f91975462c56ebf397455 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/EjectUserFromMeetingCmdMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/EjectUserFromMeetingCmdMsgHdlr.scala @@ -1,16 +1,15 @@ package org.bigbluebutton.core.apps.users import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.core.models._ -import org.bigbluebutton.core.running.{ BaseMeetingActor, LiveMeeting } +import org.bigbluebutton.core.running.{ LiveMeeting, OutMsgRouter } import org.bigbluebutton.core2.message.senders.MsgBuilder trait EjectUserFromMeetingCmdMsgHdlr { - this: BaseMeetingActor => + this: UsersApp => val liveMeeting: LiveMeeting - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleEjectUserFromMeetingCmdMsg(msg: EjectUserFromMeetingCmdMsg) { for { @@ -19,8 +18,10 @@ trait EjectUserFromMeetingCmdMsgHdlr { RegisteredUsers.remove(msg.body.userId, liveMeeting.registeredUsers) // send a message to client - val ejectFromMeetingClientEvent = MsgBuilder.buildUserEjectedFromMeetingEvtMsg(liveMeeting.props.meetingProp.intId, - user.intId, msg.body.ejectedBy) + val ejectFromMeetingClientEvent = MsgBuilder.buildUserEjectedFromMeetingEvtMsg( + liveMeeting.props.meetingProp.intId, + user.intId, msg.body.ejectedBy + ) outGW.send(ejectFromMeetingClientEvent) log.info("Ejecting user from meeting (client msg). meetingId=" + liveMeeting.props.meetingProp.intId + " userId=" + msg.body.userId) @@ -39,8 +40,10 @@ trait EjectUserFromMeetingCmdMsgHdlr { for { vu <- VoiceUsers.findWithIntId(liveMeeting.voiceUsers, msg.body.userId) } yield { - val ejectFromVoiceEvent = MsgBuilder.buildEjectUserFromVoiceConfSysMsg(liveMeeting.props.meetingProp.intId, - liveMeeting.props.voiceProp.voiceConf, vu.voiceUserId) + val ejectFromVoiceEvent = MsgBuilder.buildEjectUserFromVoiceConfSysMsg( + liveMeeting.props.meetingProp.intId, + liveMeeting.props.voiceProp.voiceConf, vu.voiceUserId + ) outGW.send(ejectFromVoiceEvent) log.info("Ejecting user from voice. meetingId=" + liveMeeting.props.meetingProp.intId + " userId=" + vu.intId) } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/GetRecordingStatusReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/GetRecordingStatusReqMsgHdlr.scala index 583a7f70ad96518a1706874d2f43565eb3526e46..31b42343dec7e4d6302617e4c9d4bf6749f5807b 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/GetRecordingStatusReqMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/GetRecordingStatusReqMsgHdlr.scala @@ -1,15 +1,14 @@ package org.bigbluebutton.core.apps.users import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway -import org.bigbluebutton.core.running.{ BaseMeetingActor, LiveMeeting } +import org.bigbluebutton.core.running.{ LiveMeeting, OutMsgRouter } import org.bigbluebutton.core2.MeetingStatus2x trait GetRecordingStatusReqMsgHdlr { - this: BaseMeetingActor => + this: UsersApp => val liveMeeting: LiveMeeting - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleGetRecordingStatusReqMsg(msg: GetRecordingStatusReqMsg) { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/GetUsersMeetingReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/GetUsersMeetingReqMsgHdlr.scala new file mode 100755 index 0000000000000000000000000000000000000000..a1aaa97b5913a3404d5c50fe86ca6a98433320af --- /dev/null +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/GetUsersMeetingReqMsgHdlr.scala @@ -0,0 +1,17 @@ +package org.bigbluebutton.core.apps.users + +import org.bigbluebutton.common2.msgs.GetUsersMeetingReqMsg +import org.bigbluebutton.core.running.{ HandlerHelpers, LiveMeeting, OutMsgRouter } + +trait GetUsersMeetingReqMsgHdlr extends HandlerHelpers { + this: UsersApp => + + val liveMeeting: LiveMeeting + val outGW: OutMsgRouter + + def handleGetUsersMeetingReqMsg(msg: GetUsersMeetingReqMsg): Unit = { + sendAllUsersInMeeting(msg.body.userId) + sendAllVoiceUsersInMeeting(msg.body.userId, liveMeeting.voiceUsers, liveMeeting.props.meetingProp.intId) + sendAllWebcamStreams(outGW, msg.body.userId, liveMeeting.webcams, liveMeeting.props.meetingProp.intId) + } +} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/LockUserInMeetingCmdMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/LockUserInMeetingCmdMsgHdlr.scala similarity index 83% rename from akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/LockUserInMeetingCmdMsgHdlr.scala rename to akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/LockUserInMeetingCmdMsgHdlr.scala index bf49e47fc4be66734bd58835b5bd74b6d027d8fd..a34ad40b1381bca125c065d212bf7c65859d0ed8 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/LockUserInMeetingCmdMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/LockUserInMeetingCmdMsgHdlr.scala @@ -1,14 +1,13 @@ -package org.bigbluebutton.core2.message.handlers.users +package org.bigbluebutton.core.apps.users import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.core.models.Users2x -import org.bigbluebutton.core.running.MeetingActor +import org.bigbluebutton.core.running.{ MeetingActor, OutMsgRouter } trait LockUserInMeetingCmdMsgHdlr { this: MeetingActor => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handle(msg: LockUserInMeetingCmdMsg) { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/LogoutAndEndMeetingCmdMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/LogoutAndEndMeetingCmdMsgHdlr.scala index b3d37e67832c047c756bd2e3d11f5e9e060cd141..b11935f1a4e410e515be4fd42611a13ad58f4ad0 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/LogoutAndEndMeetingCmdMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/LogoutAndEndMeetingCmdMsgHdlr.scala @@ -1,57 +1,25 @@ package org.bigbluebutton.core.apps.users import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway -import org.bigbluebutton.core.api.{ EndMeeting, LogoutEndMeeting } +import org.bigbluebutton.core.bus.InternalEventBus +import org.bigbluebutton.core.domain.MeetingEndReason import org.bigbluebutton.core.models.{ Roles, Users2x } -import org.bigbluebutton.core.running.{ BaseMeetingActor, LiveMeeting } -import org.bigbluebutton.core2.MeetingStatus2x +import org.bigbluebutton.core.running.{ LiveMeeting, OutMsgRouter } trait LogoutAndEndMeetingCmdMsgHdlr { - this: BaseMeetingActor => + this: UsersApp => val liveMeeting: LiveMeeting - val outGW: OutMessageGateway + val outGW: OutMsgRouter + val eventBus: InternalEventBus def handleLogoutAndEndMeetingCmdMsg(msg: LogoutAndEndMeetingCmdMsg) { for { u <- Users2x.findWithIntId(liveMeeting.users2x, msg.body.userId) } yield { if (u.role == Roles.MODERATOR_ROLE) { - endMeeting() + sendEndMeetingDueToExpiry(MeetingEndReason.ENDED_AFTER_USER_LOGGED_OUT, eventBus, outGW, liveMeeting) } } - - def endMeeting(): Unit = { - def buildMeetingEndingEvtMsg(meetingId: String): BbbCommonEnvCoreMsg = { - val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, meetingId, "not-used") - val envelope = BbbCoreEnvelope(MeetingEndingEvtMsg.NAME, routing) - val body = MeetingEndingEvtMsgBody(meetingId) - val header = BbbClientMsgHeader(MeetingEndingEvtMsg.NAME, meetingId, "not-used") - val event = MeetingEndingEvtMsg(header, body) - - BbbCommonEnvCoreMsg(envelope, event) - } - - val endingEvent = buildMeetingEndingEvtMsg(liveMeeting.props.meetingProp.intId) - - // Broadcast users the meeting will end - outGW.send(endingEvent) - - MeetingStatus2x.meetingHasEnded(liveMeeting.status) - - def buildMeetingEndedEvtMsg(meetingId: String): BbbCommonEnvCoreMsg = { - val routing = collection.immutable.HashMap("sender" -> "bbb-apps-akka") - val envelope = BbbCoreEnvelope(MeetingEndedEvtMsg.NAME, routing) - val body = MeetingEndedEvtMsgBody(meetingId) - val header = BbbCoreBaseHeader(MeetingEndedEvtMsg.NAME) - val event = MeetingEndedEvtMsg(header, body) - - BbbCommonEnvCoreMsg(envelope, event) - } - - val endedEvnt = buildMeetingEndedEvtMsg(liveMeeting.props.meetingProp.intId) - outGW.send(endedEvnt) - } } } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/MeetingActivityResponseCmdMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/MeetingActivityResponseCmdMsgHdlr.scala index c493c265702f9aa0b4c8093a7cff52b4ce1062d9..9959c25f06a8b419241e4fdca93f896050ad3980 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/MeetingActivityResponseCmdMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/MeetingActivityResponseCmdMsgHdlr.scala @@ -1,16 +1,30 @@ package org.bigbluebutton.core.apps.users +import org.bigbluebutton.common2.domain.DefaultProps import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway -import org.bigbluebutton.core.running.{ BaseMeetingActor, LiveMeeting } +import org.bigbluebutton.core.domain.{ MeetingInactivityTracker, MeetingState2x } +import org.bigbluebutton.core.running.{ LiveMeeting, OutMsgRouter } trait MeetingActivityResponseCmdMsgHdlr { - this: BaseMeetingActor => + this: UsersApp => val liveMeeting: LiveMeeting - val outGW: OutMessageGateway + val outGW: OutMsgRouter + + def handleMeetingActivityResponseCmdMsg( + msg: MeetingActivityResponseCmdMsg, + state: MeetingState2x + ): MeetingState2x = { + processMeetingActivityResponse(liveMeeting.props, outGW, msg) + MeetingInactivityTracker.resetWarningSentAndTimestamp(state) + } + + def processMeetingActivityResponse( + props: DefaultProps, + outGW: OutMsgRouter, + msg: MeetingActivityResponseCmdMsg + ): Unit = { - def handleMeetingActivityResponseCmdMsg(msg: MeetingActivityResponseCmdMsg) { def buildMeetingIsActiveEvtMsg(meetingId: String): BbbCommonEnvCoreMsg = { val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, meetingId, "not-used") val envelope = BbbCoreEnvelope(MeetingIsActiveEvtMsg.NAME, routing) @@ -21,8 +35,8 @@ trait MeetingActivityResponseCmdMsgHdlr { BbbCommonEnvCoreMsg(envelope, event) } - log.info("User endorsed that meeting {} is active", liveMeeting.props.meetingProp.intId) - val event = buildMeetingIsActiveEvtMsg(liveMeeting.props.meetingProp.intId) + val event = buildMeetingIsActiveEvtMsg(props.meetingProp.intId) outGW.send(event) + } } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/MuteUserCmdMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/MuteUserCmdMsgHdlr.scala similarity index 74% rename from akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/MuteUserCmdMsgHdlr.scala rename to akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/MuteUserCmdMsgHdlr.scala index 01beebe6bbbe6c1557c651ee912e3e1d0ecb093f..2c6673797b8c578b457ad98c95702d3cbab817e3 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/MuteUserCmdMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/MuteUserCmdMsgHdlr.scala @@ -1,16 +1,14 @@ -package org.bigbluebutton.core2.message.handlers.users +package org.bigbluebutton.core.apps.users import org.bigbluebutton.common2.msgs.MuteUserCmdMsg -import org.bigbluebutton.core.OutMessageGateway -import org.bigbluebutton.core.api.{ MuteUserRequest, MuteVoiceUser } import org.bigbluebutton.core.models.VoiceUsers -import org.bigbluebutton.core.running.MeetingActor +import org.bigbluebutton.core.running.{ MeetingActor, OutMsgRouter } import org.bigbluebutton.core2.message.senders.MsgBuilder trait MuteUserCmdMsgHdlr { this: MeetingActor => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleMuteUserCmdMsg(msg: MuteUserCmdMsg) { log.info("Received mute user request. meetingId=" + props.meetingProp.intId + " userId=" diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/RegisterUserReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/RegisterUserReqMsgHdlr.scala index 0f80a442c0910a5150d3a0a937bb5dc2fb716271..91539cec16b578f6be7d0a6e1b48cc2d9ffe7b36 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/RegisterUserReqMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/RegisterUserReqMsgHdlr.scala @@ -1,34 +1,17 @@ package org.bigbluebutton.core.apps.users import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.core.models.RegisteredUsers -import org.bigbluebutton.core.running.{ BaseMeetingActor, LiveMeeting } -import org.bigbluebutton.core2.MeetingStatus2x +import org.bigbluebutton.core.running.{ LiveMeeting, OutMsgRouter } trait RegisterUserReqMsgHdlr { - this: BaseMeetingActor => + this: UsersApp => val liveMeeting: LiveMeeting - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleRegisterUserReqMsg(msg: RegisterUserReqMsg): Unit = { - log.debug("****** RECEIVED RegisterUserReqMsg msg {}", msg) - if (MeetingStatus2x.hasMeetingEnded(liveMeeting.status)) { - // Check first if the meeting has ended and the user refreshed the client to re-connect. - log.info("Register user failed. Mmeeting has ended. meetingId=" + liveMeeting.props.meetingProp.intId + - " userId=" + msg.body.intUserId) - } else { - val regUser = RegisteredUsers.create(msg.body.intUserId, msg.body.extUserId, - msg.body.name, msg.body.role, msg.body.authToken, - msg.body.avatarURL, msg.body.guest, msg.body.authed, msg.body.guest, liveMeeting.registeredUsers) - - log.info("Register user success. meetingId=" + liveMeeting.props.meetingProp.intId - + " userId=" + msg.body.extUserId + " user=" + regUser) - - val event = buildUserRegisteredRespMsg(liveMeeting.props.meetingProp.intId, regUser.id, regUser.name, regUser.role) - outGW.send(event) - } + log.debug("RECEIVED RegisterUserReqMsg msg {}", msg) def buildUserRegisteredRespMsg(meetingId: String, userId: String, name: String, role: String): BbbCommonEnvCoreMsg = { val routing = collection.immutable.HashMap("sender" -> "bbb-apps-akka") @@ -38,5 +21,18 @@ trait RegisterUserReqMsgHdlr { val event = UserRegisteredRespMsg(header, body) BbbCommonEnvCoreMsg(envelope, event) } + + val regUser = RegisteredUsers.create(msg.body.intUserId, msg.body.extUserId, + msg.body.name, msg.body.role, msg.body.authToken, + msg.body.avatarURL, msg.body.guest, msg.body.authed, msg.body.guest) + + RegisteredUsers.add(liveMeeting.registeredUsers, regUser) + + log.info("Register user success. meetingId=" + liveMeeting.props.meetingProp.intId + + " userId=" + msg.body.extUserId + " user=" + regUser) + + val event = buildUserRegisteredRespMsg(liveMeeting.props.meetingProp.intId, regUser.id, regUser.name, regUser.role) + outGW.send(event) + } } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/SetRecordingStatusCmdMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/SetRecordingStatusCmdMsgHdlr.scala index b366ef44354c0049e0d27ec326f3caf5bb5d93ba..135285709243597b4d800dcc86ffdf4961187b3f 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/SetRecordingStatusCmdMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/SetRecordingStatusCmdMsgHdlr.scala @@ -1,15 +1,14 @@ package org.bigbluebutton.core.apps.users import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway -import org.bigbluebutton.core.running.{ BaseMeetingActor, LiveMeeting } +import org.bigbluebutton.core.running.{ LiveMeeting, OutMsgRouter } import org.bigbluebutton.core2.MeetingStatus2x trait SetRecordingStatusCmdMsgHdlr { - this: BaseMeetingActor => + this: UsersApp => val liveMeeting: LiveMeeting - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleSetRecordingStatusCmdMsg(msg: SetRecordingStatusCmdMsg) { log.info("Change recording status. meetingId=" + liveMeeting.props.meetingProp.intId + " recording=" + msg.body.recording) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/SyncGetUsersMeetingRespMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/SyncGetUsersMeetingRespMsgHdlr.scala index 98e19595334fd212535d1a2b8c013a02773b8a48..9e8e036da595d10df32138311e99d3002e9fb012 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/SyncGetUsersMeetingRespMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/SyncGetUsersMeetingRespMsgHdlr.scala @@ -1,15 +1,14 @@ package org.bigbluebutton.core.apps.users -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.common2.msgs._ import org.bigbluebutton.core.models.Users2x -import org.bigbluebutton.core.running.{ BaseMeetingActor, LiveMeeting } +import org.bigbluebutton.core.running.{ LiveMeeting, OutMsgRouter } trait SyncGetUsersMeetingRespMsgHdlr { - this: BaseMeetingActor => + this: UsersApp => val liveMeeting: LiveMeeting - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleSyncGetUsersMeetingRespMsg(): Unit = { log.debug("Handling SyncGetUsersMeetingRespMsg") diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/UserBroadcastCamStartMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UserBroadcastCamStartMsgHdlr.scala similarity index 83% rename from akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/UserBroadcastCamStartMsgHdlr.scala rename to akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UserBroadcastCamStartMsgHdlr.scala index 9c3d1fa29c88bb3c835d217ff95f75738a0fa437..ad5e4c5f64cf5520b61f66a409315d4a791565d9 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/UserBroadcastCamStartMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UserBroadcastCamStartMsgHdlr.scala @@ -1,14 +1,13 @@ -package org.bigbluebutton.core2.message.handlers.users +package org.bigbluebutton.core.apps.users import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.core.models.{ MediaStream, WebcamStream, Webcams } -import org.bigbluebutton.core.running.MeetingActor +import org.bigbluebutton.core.running.{ MeetingActor, OutMsgRouter } trait UserBroadcastCamStartMsgHdlr { this: MeetingActor => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleUserBroadcastCamStartMsg(msg: UserBroadcastCamStartMsg): Unit = { @@ -21,8 +20,6 @@ trait UserBroadcastCamStartMsgHdlr { val event = UserBroadcastCamStartedEvtMsg(header, body) val msgEvent = BbbCommonEnvCoreMsg(envelope, event) outGW.send(msgEvent) - - record(event) } val stream = new MediaStream(msg.body.stream, msg.body.stream, msg.header.userId, Map.empty, Set.empty) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/UserBroadcastCamStopMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UserBroadcastCamStopMsgHdlr.scala similarity index 80% rename from akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/UserBroadcastCamStopMsgHdlr.scala rename to akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UserBroadcastCamStopMsgHdlr.scala index c72c60bb9bab3f0b663b8600cea897008de12349..665836d4536efc7eba3da56a7208e6fce7ffcd36 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/UserBroadcastCamStopMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UserBroadcastCamStopMsgHdlr.scala @@ -1,14 +1,13 @@ -package org.bigbluebutton.core2.message.handlers.users +package org.bigbluebutton.core.apps.users import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.core.models.Webcams -import org.bigbluebutton.core.running.MeetingActor +import org.bigbluebutton.core.running.{ MeetingActor, OutMsgRouter } trait UserBroadcastCamStopMsgHdlr { this: MeetingActor => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleUserBroadcastCamStopMsg(msg: UserBroadcastCamStopMsg): Unit = { @@ -21,8 +20,6 @@ trait UserBroadcastCamStopMsgHdlr { val event = UserBroadcastCamStoppedEvtMsg(header, body) val msgEvent = BbbCommonEnvCoreMsg(envelope, event) outGW.send(msgEvent) - - record(event) } for { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/UserConnectedToGlobalAudioMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UserConnectedToGlobalAudioMsgHdlr.scala similarity index 86% rename from akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/UserConnectedToGlobalAudioMsgHdlr.scala rename to akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UserConnectedToGlobalAudioMsgHdlr.scala index daebb70decf5135b087fec6e89e69f82d4e101f8..70671bae64bb33ebaa158460d9ad1141b30e45c9 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/UserConnectedToGlobalAudioMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UserConnectedToGlobalAudioMsgHdlr.scala @@ -1,14 +1,13 @@ -package org.bigbluebutton.core2.message.handlers.users +package org.bigbluebutton.core.apps.users import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.core.models.{ Users2x, VoiceUserState, VoiceUsers } -import org.bigbluebutton.core.running.MeetingActor +import org.bigbluebutton.core.running.{ MeetingActor, OutMsgRouter } trait UserConnectedToGlobalAudioMsgHdlr { this: MeetingActor => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleUserConnectedToGlobalAudioMsg(msg: UserConnectedToGlobalAudioMsg) { log.info("Handling UserConnectedToGlobalAudio: meetingId=" + props.meetingProp.intId + " userId=" + msg.body.userId) @@ -25,8 +24,6 @@ trait UserConnectedToGlobalAudioMsgHdlr { val event = UserJoinedVoiceConfToClientEvtMsg(header, body) val msgEvent = BbbCommonEnvCoreMsg(envelope, event) outGW.send(msgEvent) - - record(event) } for { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/UserDisconnectedFromGlobalAudioMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UserDisconnectedFromGlobalAudioMsgHdlr.scala similarity index 83% rename from akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/UserDisconnectedFromGlobalAudioMsgHdlr.scala rename to akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UserDisconnectedFromGlobalAudioMsgHdlr.scala index 19aa749e931304312b7151e8f8ab9299425c5698..705e07b9d6528b469e1038ee5861a767433a02f8 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/UserDisconnectedFromGlobalAudioMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UserDisconnectedFromGlobalAudioMsgHdlr.scala @@ -1,14 +1,13 @@ -package org.bigbluebutton.core2.message.handlers.users +package org.bigbluebutton.core.apps.users import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.core.models.{ VoiceUserState, VoiceUsers } -import org.bigbluebutton.core.running.MeetingActor +import org.bigbluebutton.core.running.{ MeetingActor, OutMsgRouter } trait UserDisconnectedFromGlobalAudioMsgHdlr { this: MeetingActor => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleUserDisconnectedFromGlobalAudioMsg(msg: UserDisconnectedFromGlobalAudioMsg) { log.info("Handling UserDisconnectedToGlobalAudio: meetingId=" + props.meetingProp.intId + " userId=" + msg.body.userId) @@ -24,8 +23,6 @@ trait UserDisconnectedFromGlobalAudioMsgHdlr { val event = UserLeftVoiceConfToClientEvtMsg(header, body) val msgEvent = BbbCommonEnvCoreMsg(envelope, event) outGW.send(msgEvent) - - record(event) } for { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UserJoinMeetingReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UserJoinMeetingReqMsgHdlr.scala new file mode 100755 index 0000000000000000000000000000000000000000..995861e2a9e4e9408e744f125a177c4c892e4896 --- /dev/null +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UserJoinMeetingReqMsgHdlr.scala @@ -0,0 +1,18 @@ +package org.bigbluebutton.core.apps.users + +import org.bigbluebutton.common2.msgs.UserJoinMeetingReqMsg +import org.bigbluebutton.core.domain.MeetingState2x +import org.bigbluebutton.core.running.{ BaseMeetingActor, HandlerHelpers, LiveMeeting, OutMsgRouter } + +trait UserJoinMeetingReqMsgHdlr extends HandlerHelpers { + this: BaseMeetingActor => + + val liveMeeting: LiveMeeting + val outGW: OutMsgRouter + + def handleUserJoinMeetingReqMsg(msg: UserJoinMeetingReqMsg, state: MeetingState2x): MeetingState2x = { + userJoinMeeting(outGW, msg.body.authToken, liveMeeting, state) + } + +} + diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UserLeaveReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UserLeaveReqMsgHdlr.scala index 7bc3c936cb848c623af956d742a6525f415f2c95..b1192c021578cc230bd6cb8fcc819501aa6ec693 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UserLeaveReqMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UserLeaveReqMsgHdlr.scala @@ -1,30 +1,37 @@ package org.bigbluebutton.core.apps.users import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway +import org.bigbluebutton.core.domain.{ MeetingExpiryTracker, MeetingState2x } import org.bigbluebutton.core.models.Users2x -import org.bigbluebutton.core.running.MeetingActor +import org.bigbluebutton.core.running.{ MeetingActor, OutMsgRouter } +import org.bigbluebutton.core.util.TimeUtil import org.bigbluebutton.core2.message.senders.MsgBuilder trait UserLeaveReqMsgHdlr { this: MeetingActor => - val outGW: OutMessageGateway + val outGW: OutMsgRouter - def handleUserLeaveReqMsg(msg: UserLeaveReqMsg): Unit = { + def handleUserLeaveReqMsg(msg: UserLeaveReqMsg, state: MeetingState2x): MeetingState2x = { for { u <- Users2x.remove(liveMeeting.users2x, msg.body.userId) } yield { log.info("User left meeting. meetingId=" + props.meetingProp.intId + " userId=" + u.intId + " user=" + u) captionApp2x.handleUserLeavingMsg(msg.body.userId) - liveMeeting.startCheckingIfWeNeedToEndVoiceConf() stopAutoStartedRecording() // send a user left event for the clients to update val userLeftMeetingEvent = MsgBuilder.buildUserLeftMeetingEvtMsg(liveMeeting.props.meetingProp.intId, u.intId) outGW.send(userLeftMeetingEvent) log.info("User left meetingId=" + liveMeeting.props.meetingProp.intId + " userId=" + msg.body.userId) + + } + + if (Users2x.numUsers(liveMeeting.users2x) == 0) { + MeetingExpiryTracker.setLastUserLeftOn(state, TimeUtil.timeNowInSeconds()) + } else { + state } } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UsersApp.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UsersApp.scala new file mode 100755 index 0000000000000000000000000000000000000000..8bb0e15f5354ceabc6d1e035300c7938bcdfb430 --- /dev/null +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UsersApp.scala @@ -0,0 +1,27 @@ +package org.bigbluebutton.core.apps.users + +import akka.actor.ActorContext +import akka.event.Logging +import org.bigbluebutton.core.bus.InternalEventBus +import org.bigbluebutton.core.running.{ LiveMeeting, OutMsgRouter } + +class UsersApp( + val liveMeeting: LiveMeeting, + val outGW: OutMsgRouter, + val eventBus: InternalEventBus +)(implicit val context: ActorContext) + + extends ValidateAuthTokenReqMsgHdlr + with GetUsersMeetingReqMsgHdlr + with RegisterUserReqMsgHdlr + with ChangeUserRoleCmdMsgHdlr + with SyncGetUsersMeetingRespMsgHdlr + with LogoutAndEndMeetingCmdMsgHdlr + with MeetingActivityResponseCmdMsgHdlr + with SetRecordingStatusCmdMsgHdlr + with GetRecordingStatusReqMsgHdlr + with AssignPresenterReqMsgHdlr + with EjectUserFromMeetingCmdMsgHdlr { + + val log = Logging(context.system, getClass) +} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UsersApp2x.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UsersApp2x.scala index 88935ad47959adcda2e1d370e84bfbcd068884d4..389ac48df16e7530a8ac1c0e08f45543f316b2fd 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UsersApp2x.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UsersApp2x.scala @@ -1,20 +1,10 @@ package org.bigbluebutton.core.apps.users import org.bigbluebutton.core.running.MeetingActor -import org.bigbluebutton.core2.message.handlers.users.{ ChangeUserEmojiCmdMsgHdlr, ValidateAuthTokenReqMsgHdlr } trait UsersApp2x - extends RegisterUserReqMsgHdlr - with ChangeUserRoleCmdMsgHdlr - with SyncGetUsersMeetingRespMsgHdlr - with ValidateAuthTokenReqMsgHdlr - with UserLeaveReqMsgHdlr - with LogoutAndEndMeetingCmdMsgHdlr - with MeetingActivityResponseCmdMsgHdlr - with SetRecordingStatusCmdMsgHdlr - with GetRecordingStatusReqMsgHdlr - with AssignPresenterReqMsgHdlr - with EjectUserFromMeetingCmdMsgHdlr + extends UserLeaveReqMsgHdlr + with ChangeUserEmojiCmdMsgHdlr { this: MeetingActor => diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/ValidateAuthTokenReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/ValidateAuthTokenReqMsgHdlr.scala new file mode 100755 index 0000000000000000000000000000000000000000..b1f9fd1620b2ce2bf8d5321b2947a2498c34b4d7 --- /dev/null +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/ValidateAuthTokenReqMsgHdlr.scala @@ -0,0 +1,134 @@ +package org.bigbluebutton.core.apps.users + +import org.bigbluebutton.common2.msgs._ +import org.bigbluebutton.core.bus.InternalEventBus +import org.bigbluebutton.core.domain.MeetingState2x +import org.bigbluebutton.core.models._ +import org.bigbluebutton.core.running.{ HandlerHelpers, LiveMeeting, OutMsgRouter } +import org.bigbluebutton.core2.message.senders.{ MsgBuilder } + +trait ValidateAuthTokenReqMsgHdlr extends HandlerHelpers { + this: UsersApp => + + val liveMeeting: LiveMeeting + val outGW: OutMsgRouter + val eventBus: InternalEventBus + + def handleValidateAuthTokenReqMsg(msg: ValidateAuthTokenReqMsg, state: MeetingState2x): MeetingState2x = { + log.debug("RECEIVED ValidateAuthTokenReqMsg msg {}", msg) + + val regUser = RegisteredUsers.getRegisteredUserWithToken(msg.body.authToken, msg.body.userId, liveMeeting.registeredUsers) + + regUser match { + case Some(u) => + if (noNeedForApproval(u)) { + userValidatedAndNoNeedToWaitForApproval(u, state) + } else { + goThroughGuestPolicy(liveMeeting.guestsWaiting, u, state) + } + case None => + validateTokenFailed(outGW, meetingId = liveMeeting.props.meetingProp.intId, + userId = msg.body.userId, authToken = msg.body.authToken, valid = false, waitForApproval = false, state) + } + } + + def noNeedForApproval(user: RegisteredUser): Boolean = { + !user.guest || (user.guest && !user.waitingForAcceptance) + } + + def goThroughGuestPolicy(guestsWaiting: GuestsWaiting, user: RegisteredUser, state: MeetingState2x): MeetingState2x = { + if (doesNotHaveToWaitForApproval(guestsWaiting, user)) { + userValidatedAndNoNeedToWaitForApproval(user, state) + } else { + userValidatedButNeedToWaitForApproval(user, state) + } + } + + def doesNotHaveToWaitForApproval(guestsWaiting: GuestsWaiting, user: RegisteredUser): Boolean = { + val guestPolicyType = GuestsWaiting.getGuestPolicy(guestsWaiting).policy + (guestPolicyType == GuestPolicyType.ALWAYS_ACCEPT) || + (guestPolicyType == GuestPolicyType.ASK_MODERATOR && user.guest && !user.waitingForAcceptance) + } + + def validateTokenFailed(outGW: OutMsgRouter, meetingId: String, userId: String, authToken: String, + valid: Boolean, waitForApproval: Boolean, state: MeetingState2x): MeetingState2x = { + val event = MsgBuilder.buildValidateAuthTokenRespMsg(meetingId, userId, authToken, valid, waitForApproval) + outGW.send(event) + + // TODO: Should disconnect user here. + + state + } + + def sendValidateAuthTokenRespMsg(meetingId: String, userId: String, authToken: String, + valid: Boolean, waitForApproval: Boolean): Unit = { + val event = MsgBuilder.buildValidateAuthTokenRespMsg(meetingId, userId, authToken, valid, waitForApproval) + outGW.send(event) + } + + def userValidatedButNeedToWaitForApproval(user: RegisteredUser, state: MeetingState2x): MeetingState2x = { + val meetingId = liveMeeting.props.meetingProp.intId + sendValidateAuthTokenRespMsg(meetingId, user.id, user.authToken, valid = true, waitForApproval = false) + + val guest = GuestWaiting(user.id, user.name, user.role) + addGuestToWaitingForApproval(guest, liveMeeting.guestsWaiting) + notifyModeratorsOfGuestWaiting(Vector(guest), liveMeeting.users2x, meetingId) + + state + } + + def addGuestToWaitingForApproval(guest: GuestWaiting, guestsWaitingList: GuestsWaiting): Unit = { + GuestsWaiting.add(guestsWaitingList, guest) + } + + def userValidatedAndNoNeedToWaitForApproval(user: RegisteredUser, state: MeetingState2x): MeetingState2x = { + + val meetingId = liveMeeting.props.meetingProp.intId + sendValidateAuthTokenRespMsg( + meetingId, + userId = user.id, authToken = user.authToken, valid = true, waitForApproval = false + ) + + // TODO: REMOVE Temp only so we can implement user handling in client. (ralam june 21, 2017) + + sendAllUsersInMeeting(user.id) + sendAllVoiceUsersInMeeting(user.id, liveMeeting.voiceUsers, meetingId) + sendAllWebcamStreams(outGW, user.id, liveMeeting.webcams, meetingId) + val newState = userJoinMeeting(outGW, user.authToken, liveMeeting, state) + if (!Users2x.hasPresenter(liveMeeting.users2x)) { + automaticallyAssignPresenter(outGW, liveMeeting) + } + newState + } + + def sendAllUsersInMeeting(requesterId: String): Unit = { + val meetingId = liveMeeting.props.meetingProp.intId + val users = Users2x.findAll(liveMeeting.users2x) + val webUsers = users.map { u => + WebUser(intId = u.intId, extId = u.extId, name = u.name, role = u.role, + guest = u.guest, authed = u.authed, waitingForAcceptance = u.waitingForAcceptance, emoji = u.emoji, + locked = u.locked, presenter = u.presenter, avatar = u.avatar) + } + + val event = MsgBuilder.buildGetUsersMeetingRespMsg(meetingId, requesterId, webUsers) + outGW.send(event) + } + + def sendAllVoiceUsersInMeeting(requesterId: String, voiceUsers: VoiceUsers, meetingId: String): Unit = { + val vu = VoiceUsers.findAll(voiceUsers).map { u => + VoiceConfUser(intId = u.intId, voiceUserId = u.voiceUserId, callingWith = u.callingWith, callerName = u.callerName, + callerNum = u.callerNum, muted = u.muted, talking = u.talking, listenOnly = u.listenOnly) + } + + val event = MsgBuilder.buildGetVoiceUsersMeetingRespMsg(meetingId, requesterId, vu) + outGW.send(event) + } + + def notifyModeratorsOfGuestWaiting(guests: Vector[GuestWaiting], users: Users2x, meetingId: String): Unit = { + val mods = Users2x.findAll(users).filter(p => p.role == Roles.MODERATOR_ROLE) + mods foreach { m => + val event = MsgBuilder.buildGuestsWaitingForApprovalEvtMsg(meetingId, m.intId, guests) + outGW.send(event) + } + } +} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/UserJoinedVoiceConfEvtMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/UserJoinedVoiceConfEvtMsgHdlr.scala index 5c76b436161d4764c7ecaaaec762878e3c1f5bfd..4163427b06d7e9f7232910fc8dad5403e11c76d6 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/UserJoinedVoiceConfEvtMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/UserJoinedVoiceConfEvtMsgHdlr.scala @@ -1,27 +1,29 @@ package org.bigbluebutton.core.apps.voice import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway -import org.bigbluebutton.core.api.StartRecordingVoiceConf import org.bigbluebutton.core.models.{ VoiceUser2x, VoiceUserState, VoiceUsers } -import org.bigbluebutton.core.running.{ BaseMeetingActor, LiveMeeting, MeetingActor } +import org.bigbluebutton.core.running.{ BaseMeetingActor, LiveMeeting, OutMsgRouter } import org.bigbluebutton.core2.MeetingStatus2x trait UserJoinedVoiceConfEvtMsgHdlr { this: BaseMeetingActor => val liveMeeting: LiveMeeting - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleUserJoinedVoiceConfEvtMsg(msg: UserJoinedVoiceConfEvtMsg): Unit = { log.warning("Received user joined voice conference " + msg) def broadcastEvent(voiceUserState: VoiceUserState): Unit = { - val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, - liveMeeting.props.meetingProp.intId, voiceUserState.intId) + val routing = Routing.addMsgToClientRouting( + MessageTypes.BROADCAST_TO_MEETING, + liveMeeting.props.meetingProp.intId, voiceUserState.intId + ) val envelope = BbbCoreEnvelope(UserJoinedVoiceConfToClientEvtMsg.NAME, routing) - val header = BbbClientMsgHeader(UserJoinedVoiceConfToClientEvtMsg.NAME, - liveMeeting.props.meetingProp.intId, voiceUserState.intId) + val header = BbbClientMsgHeader( + UserJoinedVoiceConfToClientEvtMsg.NAME, + liveMeeting.props.meetingProp.intId, voiceUserState.intId + ) val body = UserJoinedVoiceConfToClientEvtMsgBody(intId = voiceUserState.intId, voiceUserId = voiceUserState.voiceUserId, callerName = voiceUserState.callerName, callerNum = voiceUserState.callerNum, muted = voiceUserState.muted, diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/UserJoinedVoiceConfMessageHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/UserJoinedVoiceConfMessageHdlr.scala index 9c17f501be53683e9d9b8a68371b057ac4917478..1e21f196eabbb9f6a968300860249617eb3dd6d2 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/UserJoinedVoiceConfMessageHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/UserJoinedVoiceConfMessageHdlr.scala @@ -1,12 +1,11 @@ package org.bigbluebutton.core.apps.voice -import org.bigbluebutton.core.OutMessageGateway -import org.bigbluebutton.core.running.MeetingActor +import org.bigbluebutton.core.running.{ MeetingActor, OutMsgRouter } trait UserJoinedVoiceConfMessageHdlr { this: MeetingActor => - val outGW: OutMessageGateway + val outGW: OutMsgRouter /* def startRecordingVoiceConference() { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/UserLeftVoiceConfEvtMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/UserLeftVoiceConfEvtMsgHdlr.scala index 05ed35d3cf4114512c826e9308288b635cf3866c..2a21a5bcad79f1fc152f66665f0a879190e7be9c 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/UserLeftVoiceConfEvtMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/UserLeftVoiceConfEvtMsgHdlr.scala @@ -1,16 +1,15 @@ package org.bigbluebutton.core.apps.voice import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.core.models.{ VoiceUserState, VoiceUsers } -import org.bigbluebutton.core.running.{ BaseMeetingActor, LiveMeeting, MeetingActor } +import org.bigbluebutton.core.running.{ BaseMeetingActor, LiveMeeting, MeetingActor, OutMsgRouter } import org.bigbluebutton.core2.MeetingStatus2x trait UserLeftVoiceConfEvtMsgHdlr { this: BaseMeetingActor => val liveMeeting: LiveMeeting - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleUserLeftVoiceConfEvtMsg(msg: UserLeftVoiceConfEvtMsg): Unit = { log.debug("Received UserLeftVoiceConfEvtMsg from FS {} ", msg.body.voiceUserId) @@ -46,8 +45,10 @@ trait UserLeftVoiceConfEvtMsgHdlr { log.info("Send STOP RECORDING voice conf. meetingId=" + liveMeeting.props.meetingProp.intId + " voice conf=" + liveMeeting.props.voiceProp.voiceConf) - val event = buildStopRecordingVoiceConfSysMsg(liveMeeting.props.meetingProp.intId, - liveMeeting.props.voiceProp.voiceConf, MeetingStatus2x.getVoiceRecordingFilename(liveMeeting.status)) + val event = buildStopRecordingVoiceConfSysMsg( + liveMeeting.props.meetingProp.intId, + liveMeeting.props.voiceProp.voiceConf, MeetingStatus2x.getVoiceRecordingFilename(liveMeeting.status) + ) outGW.send(event) } } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/UserMutedInVoiceConfEvtMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/UserMutedInVoiceConfEvtMsgHdlr.scala index 01a7a5cef1b4363a12cba0aad3629d843a31171e..367b450a0704bf2718c1f4a8d512cf87dad95bb6 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/UserMutedInVoiceConfEvtMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/UserMutedInVoiceConfEvtMsgHdlr.scala @@ -1,25 +1,28 @@ package org.bigbluebutton.core.apps.voice import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.core.models.{ VoiceUserState, VoiceUsers } -import org.bigbluebutton.core.running.{ BaseMeetingActor, LiveMeeting, MeetingActor } +import org.bigbluebutton.core.running.{ BaseMeetingActor, LiveMeeting, MeetingActor, OutMsgRouter } trait UserMutedInVoiceConfEvtMsgHdlr { this: BaseMeetingActor => val liveMeeting: LiveMeeting - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleUserMutedInVoiceConfEvtMsg(msg: UserMutedInVoiceConfEvtMsg): Unit = { def broadcastEvent(vu: VoiceUserState): Unit = { - val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, + val routing = Routing.addMsgToClientRouting( + MessageTypes.BROADCAST_TO_MEETING, liveMeeting.props.meetingProp.intId, - vu.intId) + vu.intId + ) val envelope = BbbCoreEnvelope(UserMutedVoiceEvtMsg.NAME, routing) - val header = BbbClientMsgHeader(UserMutedVoiceEvtMsg.NAME, - liveMeeting.props.meetingProp.intId, vu.intId) + val header = BbbClientMsgHeader( + UserMutedVoiceEvtMsg.NAME, + liveMeeting.props.meetingProp.intId, vu.intId + ) val body = UserMutedVoiceEvtMsgBody(intId = vu.intId, voiceUserId = vu.intId, vu.muted) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/UserTalkingInVoiceConfEvtMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/UserTalkingInVoiceConfEvtMsgHdlr.scala index c39c4384b36087b5ae89b3202ffd3df3472ccfd3..89e3dfaf932f0f1990900fdca4cf8e5ca466eb57 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/UserTalkingInVoiceConfEvtMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/UserTalkingInVoiceConfEvtMsgHdlr.scala @@ -1,25 +1,28 @@ package org.bigbluebutton.core.apps.voice import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.core.models.{ VoiceUserState, VoiceUsers } -import org.bigbluebutton.core.running.{ BaseMeetingActor, LiveMeeting, MeetingActor } +import org.bigbluebutton.core.running.{ BaseMeetingActor, LiveMeeting, OutMsgRouter } trait UserTalkingInVoiceConfEvtMsgHdlr { this: BaseMeetingActor => val liveMeeting: LiveMeeting - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleUserTalkingInVoiceConfEvtMsg(msg: UserTalkingInVoiceConfEvtMsg): Unit = { def broadcastEvent(vu: VoiceUserState): Unit = { - val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, + val routing = Routing.addMsgToClientRouting( + MessageTypes.BROADCAST_TO_MEETING, liveMeeting.props.meetingProp.intId, - vu.intId) + vu.intId + ) val envelope = BbbCoreEnvelope(UserTalkingVoiceEvtMsg.NAME, routing) - val header = BbbClientMsgHeader(UserTalkingVoiceEvtMsg.NAME, - liveMeeting.props.meetingProp.intId, vu.intId) + val header = BbbClientMsgHeader( + UserTalkingVoiceEvtMsg.NAME, + liveMeeting.props.meetingProp.intId, vu.intId + ) val body = UserTalkingVoiceEvtMsgBody(intId = vu.intId, voiceUserId = vu.intId, vu.talking) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/whiteboard/ClearWhiteboardPubMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/whiteboard/ClearWhiteboardPubMsgHdlr.scala similarity index 85% rename from akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/whiteboard/ClearWhiteboardPubMsgHdlr.scala rename to akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/whiteboard/ClearWhiteboardPubMsgHdlr.scala index 281c1437dc228009022cfca720867481d8434f77..343e774bfe1c87dc5396f991832de9b5734f2558 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/whiteboard/ClearWhiteboardPubMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/whiteboard/ClearWhiteboardPubMsgHdlr.scala @@ -1,13 +1,13 @@ -package org.bigbluebutton.core2.message.handlers.whiteboard +package org.bigbluebutton.core.apps.whiteboard -import org.bigbluebutton.core.running.MeetingActor -import org.bigbluebutton.core.OutMessageGateway +import org.bigbluebutton.core.running.{ OutMsgRouter } import org.bigbluebutton.common2.msgs._ +import org.bigbluebutton.core.running.MeetingActor trait ClearWhiteboardPubMsgHdlr { this: MeetingActor => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleClearWhiteboardPubMsg(msg: ClearWhiteboardPubMsg): Unit = { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/whiteboard/GetWhiteboardAccessReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/whiteboard/GetWhiteboardAccessReqMsgHdlr.scala similarity index 84% rename from akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/whiteboard/GetWhiteboardAccessReqMsgHdlr.scala rename to akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/whiteboard/GetWhiteboardAccessReqMsgHdlr.scala index f6b24f59fe9cac2026fdfbe81ec68ccbb0e4baae..6f647f30ed3d51fb63296c89e3895b0a4800347f 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/whiteboard/GetWhiteboardAccessReqMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/whiteboard/GetWhiteboardAccessReqMsgHdlr.scala @@ -1,13 +1,13 @@ -package org.bigbluebutton.core2.message.handlers.whiteboard +package org.bigbluebutton.core.apps.whiteboard -import org.bigbluebutton.core.running.MeetingActor -import org.bigbluebutton.core.OutMessageGateway +import org.bigbluebutton.core.running.{ OutMsgRouter } import org.bigbluebutton.common2.msgs._ +import org.bigbluebutton.core.running.MeetingActor trait GetWhiteboardAccessReqMsgHdlr { this: MeetingActor => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleGetWhiteboardAccessReqMsg(msg: GetWhiteboardAccessReqMsg): Unit = { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/whiteboard/GetWhiteboardAnnotationsReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/whiteboard/GetWhiteboardAnnotationsReqMsgHdlr.scala similarity index 82% rename from akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/whiteboard/GetWhiteboardAnnotationsReqMsgHdlr.scala rename to akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/whiteboard/GetWhiteboardAnnotationsReqMsgHdlr.scala index b184048c2cd91ff546263ad16f2f21420c4150f5..b0ba18eba272a375c6dbac36f1aa4e266249b4fa 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/whiteboard/GetWhiteboardAnnotationsReqMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/whiteboard/GetWhiteboardAnnotationsReqMsgHdlr.scala @@ -1,14 +1,13 @@ -package org.bigbluebutton.core2.message.handlers.whiteboard +package org.bigbluebutton.core.apps.whiteboard -import org.bigbluebutton.core.running.MeetingActor -import org.bigbluebutton.core.OutMessageGateway +import org.bigbluebutton.core.running.{ OutMsgRouter } import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.common2.domain.AnnotationVO +import org.bigbluebutton.core.running.MeetingActor trait GetWhiteboardAnnotationsReqMsgHdlr { this: MeetingActor => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleGetWhiteboardAnnotationsReqMsg(msg: GetWhiteboardAnnotationsReqMsg): Unit = { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/whiteboard/ModifyWhiteboardAccessPubMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/whiteboard/ModifyWhiteboardAccessPubMsgHdlr.scala similarity index 85% rename from akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/whiteboard/ModifyWhiteboardAccessPubMsgHdlr.scala rename to akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/whiteboard/ModifyWhiteboardAccessPubMsgHdlr.scala index 7626b794220bc887b544745f8cb3af78550fb07d..361b833714b8ff035e9e56a6fe2eefa41826d901 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/whiteboard/ModifyWhiteboardAccessPubMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/whiteboard/ModifyWhiteboardAccessPubMsgHdlr.scala @@ -1,13 +1,13 @@ -package org.bigbluebutton.core2.message.handlers.whiteboard +package org.bigbluebutton.core.apps.whiteboard -import org.bigbluebutton.core.running.MeetingActor -import org.bigbluebutton.core.OutMessageGateway +import org.bigbluebutton.core.running.{ OutMsgRouter } import org.bigbluebutton.common2.msgs._ +import org.bigbluebutton.core.running.MeetingActor trait ModifyWhiteboardAccessPubMsgHdlr { this: MeetingActor => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleModifyWhiteboardAccessPubMsg(msg: ModifyWhiteboardAccessPubMsg): Unit = { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/whiteboard/SendCursorPositionPubMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/whiteboard/SendCursorPositionPubMsgHdlr.scala similarity index 84% rename from akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/whiteboard/SendCursorPositionPubMsgHdlr.scala rename to akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/whiteboard/SendCursorPositionPubMsgHdlr.scala index 99ea8a23eb1bcfb3dcd50ea3f4eb783bc1761730..119517625db78c7c04580fb40baf02d91b776e94 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/whiteboard/SendCursorPositionPubMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/whiteboard/SendCursorPositionPubMsgHdlr.scala @@ -1,13 +1,13 @@ -package org.bigbluebutton.core2.message.handlers.whiteboard +package org.bigbluebutton.core.apps.whiteboard -import org.bigbluebutton.core.running.MeetingActor -import org.bigbluebutton.core.OutMessageGateway +import org.bigbluebutton.core.running.{ OutMsgRouter } import org.bigbluebutton.common2.msgs._ +import org.bigbluebutton.core.running.MeetingActor trait SendCursorPositionPubMsgHdlr { this: MeetingActor => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleSendCursorPositionPubMsg(msg: SendCursorPositionPubMsg): Unit = { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/whiteboard/SendWhiteboardAnnotationPubMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/whiteboard/SendWhiteboardAnnotationPubMsgHdlr.scala similarity index 80% rename from akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/whiteboard/SendWhiteboardAnnotationPubMsgHdlr.scala rename to akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/whiteboard/SendWhiteboardAnnotationPubMsgHdlr.scala index adef6166ad40db3f4f818e4d255df42b235f2471..81f6a292c0142eb2384ff823b386be0c89e568f3 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/whiteboard/SendWhiteboardAnnotationPubMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/whiteboard/SendWhiteboardAnnotationPubMsgHdlr.scala @@ -1,14 +1,13 @@ -package org.bigbluebutton.core2.message.handlers.whiteboard +package org.bigbluebutton.core.apps.whiteboard -import org.bigbluebutton.core.running.MeetingActor -import org.bigbluebutton.core.OutMessageGateway +import org.bigbluebutton.core.running.{ OutMsgRouter } import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.common2.domain.AnnotationVO +import org.bigbluebutton.core.running.MeetingActor trait SendWhiteboardAnnotationPubMsgHdlr { this: MeetingActor => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleSendWhiteboardAnnotationPubMsg(msg: SendWhiteboardAnnotationPubMsg): Unit = { @@ -21,8 +20,6 @@ trait SendWhiteboardAnnotationPubMsgHdlr { val event = SendWhiteboardAnnotationEvtMsg(header, body) val msgEvent = BbbCommonEnvCoreMsg(envelope, event) outGW.send(msgEvent) - - record(event) } val annotation = sendWhiteboardAnnotation(msg.body.annotation) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/whiteboard/UndoWhiteboardPubMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/whiteboard/UndoWhiteboardPubMsgHdlr.scala similarity index 86% rename from akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/whiteboard/UndoWhiteboardPubMsgHdlr.scala rename to akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/whiteboard/UndoWhiteboardPubMsgHdlr.scala index 1e6c33fba2e876c12271b443fbeedd8c36dd1fb2..63aa68c82c6e553a9ac6b1e6d8f125fefe76a33e 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/whiteboard/UndoWhiteboardPubMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/whiteboard/UndoWhiteboardPubMsgHdlr.scala @@ -1,13 +1,13 @@ -package org.bigbluebutton.core2.message.handlers.whiteboard +package org.bigbluebutton.core.apps.whiteboard -import org.bigbluebutton.core.running.MeetingActor -import org.bigbluebutton.core.OutMessageGateway +import org.bigbluebutton.core.running.{ OutMsgRouter } import org.bigbluebutton.common2.msgs._ +import org.bigbluebutton.core.running.MeetingActor trait UndoWhiteboardPubMsgHdlr { this: MeetingActor => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleUndoWhiteboardPubMsg(msg: UndoWhiteboardPubMsg): Unit = { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/WhiteboardApp.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/whiteboard/WhiteboardApp2x.scala similarity index 72% rename from akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/WhiteboardApp.scala rename to akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/whiteboard/WhiteboardApp2x.scala index 38a58bbdb7e67c7c8185b5481cd46a114a3a6a90..771b239ddfc2380a6b9bf3898dc05a144808ab11 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/WhiteboardApp.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/whiteboard/WhiteboardApp2x.scala @@ -1,20 +1,12 @@ -package org.bigbluebutton.core.apps +package org.bigbluebutton.core.apps.whiteboard -import org.bigbluebutton.core.api._ -import org.bigbluebutton.core.OutMessageGateway -import org.bigbluebutton.core.running.{ MeetingActor } -import org.bigbluebutton.core2.message.handlers.whiteboard.SendCursorPositionPubMsgHdlr -import org.bigbluebutton.core2.message.handlers.whiteboard.ClearWhiteboardPubMsgHdlr -import org.bigbluebutton.core2.message.handlers.whiteboard.UndoWhiteboardPubMsgHdlr -import org.bigbluebutton.core2.message.handlers.whiteboard.ModifyWhiteboardAccessPubMsgHdlr -import org.bigbluebutton.core2.message.handlers.whiteboard.GetWhiteboardAccessReqMsgHdlr -import org.bigbluebutton.core2.message.handlers.whiteboard.SendWhiteboardAnnotationPubMsgHdlr -import org.bigbluebutton.common2.domain.AnnotationVO -import org.bigbluebutton.core2.message.handlers.whiteboard.GetWhiteboardAnnotationsReqMsgHdlr +import org.bigbluebutton.core.running.{ MeetingActor, OutMsgRouter } +import org.bigbluebutton.common2.msgs.AnnotationVO +import org.bigbluebutton.core.apps.WhiteboardKeyUtil case class Whiteboard(id: String, annotationCount: Int, annotationsMap: scala.collection.immutable.Map[String, scala.collection.immutable.List[AnnotationVO]]) -trait WhiteboardApp +trait WhiteboardApp2x extends SendCursorPositionPubMsgHdlr with ClearWhiteboardPubMsgHdlr with UndoWhiteboardPubMsgHdlr @@ -24,7 +16,7 @@ trait WhiteboardApp with GetWhiteboardAnnotationsReqMsgHdlr { this: MeetingActor => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def sendWhiteboardAnnotation(annotation: AnnotationVO): AnnotationVO = { // println("Received whiteboard annotation. status=[" + status + "], annotationType=[" + annotationType + "]") diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/bus/InMsgBusGW.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/bus/InMsgBusGW.scala new file mode 100755 index 0000000000000000000000000000000000000000..acf44ee55f8ce17efa02a11dfe29287ac7cd98df --- /dev/null +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/bus/InMsgBusGW.scala @@ -0,0 +1,16 @@ +package org.bigbluebutton.core.bus +import akka.actor.ActorRef + +class InMsgBusGW(bus: IncomingEventBusImp) extends InternalEventBus { + override def publish(event: BigBlueButtonEvent): Unit = { + bus.publish(event) + } + + override def subscribe(actorRef: ActorRef, topic: String): Unit = { + bus.subscribe(actorRef, topic) + } + + override def unsubscribe(actorRef: ActorRef, topic: String): Unit = { + bus.unsubscribe(actorRef, topic) + } +} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/bus/IncomingEventBus.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/bus/IncomingEventBusImp.scala similarity index 81% rename from akka-bbb-apps/src/main/scala/org/bigbluebutton/core/bus/IncomingEventBus.scala rename to akka-bbb-apps/src/main/scala/org/bigbluebutton/core/bus/IncomingEventBusImp.scala index b46cf1ca80add5a1245be43569f8bc240c6a5cdb..c940656662fbf9ea29497d336b6f46c6d38afcfb 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/bus/IncomingEventBus.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/bus/IncomingEventBusImp.scala @@ -3,16 +3,13 @@ package org.bigbluebutton.core.bus import akka.actor.ActorRef import akka.event.EventBus import akka.event.LookupClassification -import org.bigbluebutton.core.api.InMessage -case class BigBlueButtonEvent(val topic: String, val payload: InMessage) - -class IncomingEventBus extends EventBus with LookupClassification { +class IncomingEventBusImp extends EventBus with LookupClassification { type Event = BigBlueButtonEvent type Classifier = String type Subscriber = ActorRef - // is used for extracting the classifier from the incoming events + // is used for extracting the classifier from the incoming events override protected def classify(event: Event): Classifier = event.topic // will be invoked for each event for all subscribers which registered themselves @@ -29,5 +26,5 @@ class IncomingEventBus extends EventBus with LookupClassification { // determines the initial size of the index data structure // used internally (i.e. the expected number of different classifiers) override protected def mapSize: Int = 128 -} +} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/bus/InternalEventBus.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/bus/InternalEventBus.scala new file mode 100755 index 0000000000000000000000000000000000000000..a420ad8b6b73aaa9ea9fd613c9bc8479c50f635f --- /dev/null +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/bus/InternalEventBus.scala @@ -0,0 +1,14 @@ +package org.bigbluebutton.core.bus + +import akka.actor.ActorRef +import org.bigbluebutton.core.api.InMessage + +case class BigBlueButtonEvent(val topic: String, val payload: InMessage) + +trait InternalEventBus { + + def publish(event: BigBlueButtonEvent): Unit + def subscribe(actorRef: ActorRef, topic: String) + def unsubscribe(actorRef: ActorRef, topic: String) +} + diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/domain/MeetingInactivityTracker.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/domain/MeetingInactivityTracker.scala new file mode 100755 index 0000000000000000000000000000000000000000..9f6ef48476b9965962572b285cf96086aaf2ec71 --- /dev/null +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/domain/MeetingInactivityTracker.scala @@ -0,0 +1,122 @@ +package org.bigbluebutton.core.domain + +import com.softwaremill.quicklens._ +import org.bigbluebutton.core.util.TimeUtil + +case class MeetingInactivityTracker( + val maxInactivityTimeoutMinutes: Int, + val warningMinutesBeforeMax: Int, + lastActivityTimestamp: Long, + warningSent: Boolean, + warningSentOnTimestamp: Long +) + +object MeetingInactivityTracker { + + def warningHasBeenSent(state: MeetingState2x): Boolean = { + state.inactivityTracker.warningSent + } + + def setWarningSentAndTimestamp(state: MeetingState2x, nowInSeconds: Long): MeetingState2x = { + val tracker = state.inactivityTracker.modify(_.warningSent).setTo(true) + .modify(_.warningSentOnTimestamp).setTo(nowInSeconds) + state.modify(_.inactivityTracker).setTo(tracker) + } + + def resetWarningSentAndTimestamp(state: MeetingState2x): MeetingState2x = { + val tracker = state.inactivityTracker.modify(_.warningSent).setTo(false) + .modify(_.warningSentOnTimestamp).setTo(0L) + state.modify(_.inactivityTracker).setTo(tracker) + } + + def updateLastActivityTimestamp(state: MeetingState2x, nowInSeconds: Long): MeetingState2x = { + val tracker = state.inactivityTracker.modify(_.lastActivityTimestamp).setTo(nowInSeconds) + state.modify(_.inactivityTracker).setTo(tracker) + } + + def hasRecentActivity(state: MeetingState2x, nowInSeconds: Long): Boolean = { + nowInSeconds - state.inactivityTracker.lastActivityTimestamp < + TimeUtil.minutesToSeconds(state.inactivityTracker.maxInactivityTimeoutMinutes) - + TimeUtil.minutesToSeconds(state.inactivityTracker.warningMinutesBeforeMax) + } + + def isMeetingInactive(state: MeetingState2x, nowInSeconds: Long): Boolean = { + state.inactivityTracker.warningSent && + (nowInSeconds - state.inactivityTracker.lastActivityTimestamp) > + TimeUtil.minutesToSeconds(state.inactivityTracker.maxInactivityTimeoutMinutes) + } + + def timeLeftInSeconds(state: MeetingState2x, nowInSeconds: Long): Long = { + state.inactivityTracker.lastActivityTimestamp + + TimeUtil.minutesToSeconds(state.inactivityTracker.maxInactivityTimeoutMinutes) - nowInSeconds + } +} + +case class MeetingExpiryTracker( + startedOn: Long, + userHasJoined: Boolean, + lastUserLeftOn: Option[Long], + durationInMinutes: Int, + meetingExpireIfNoUserJoinedInMinutes: Int, + meetingExpireWhenLastUserLeftInMinutes: Int +) + +object MeetingExpiryTracker { + def setMeetingStartedOn(state: MeetingState2x, timestampInSeconds: Long): MeetingState2x = { + val tracker = state.expiryTracker.modify(_.startedOn).setTo(timestampInSeconds) + state.modify(_.expiryTracker).setTo(tracker) + } + + def setUserHasJoined(state: MeetingState2x): MeetingState2x = { + val tracker = state.expiryTracker.modify(_.userHasJoined).setTo(true) + .modify(_.lastUserLeftOn).setTo(None) + state.modify(_.expiryTracker).setTo(tracker) + } + + def hasMeetingExpiredAfterLastUserLeft(state: MeetingState2x, timestampInSeconds: Long): Boolean = { + val expire = for { + lastUserLeftOn <- state.expiryTracker.lastUserLeftOn + } yield { + timestampInSeconds - lastUserLeftOn > + TimeUtil.minutesToSeconds(state.expiryTracker.meetingExpireWhenLastUserLeftInMinutes) + } + + expire.getOrElse(false) + } + + def setLastUserLeftOn(state: MeetingState2x, timestampInSeconds: Long): MeetingState2x = { + val tracker = state.expiryTracker.modify(_.lastUserLeftOn).setTo(Some(timestampInSeconds)) + state.modify(_.expiryTracker).setTo(tracker) + } + + def hasMeetingExpired(state: MeetingState2x, timestampInSeconds: Long): (Boolean, Option[String]) = { + if (MeetingExpiryTracker.hasMeetingExpiredNeverBeenJoined(state, timestampInSeconds)) { + (true, Some(MeetingEndReason.ENDED_WHEN_NOT_JOINED)) + } else if (MeetingExpiryTracker.meetingOverDuration(state, timestampInSeconds)) { + (true, Some(MeetingEndReason.ENDED_AFTER_EXCEEDING_DURATION)) + } else if (MeetingExpiryTracker.hasMeetingExpiredAfterLastUserLeft(state, timestampInSeconds)) { + (true, Some(MeetingEndReason.ENDED_WHEN_LAST_USER_LEFT)) + } else { + (false, None) + } + } + + def hasMeetingExpiredNeverBeenJoined(state: MeetingState2x, nowInSeconds: Long): Boolean = { + !state.expiryTracker.userHasJoined && + (nowInSeconds - state.expiryTracker.startedOn > + TimeUtil.minutesToSeconds(state.expiryTracker.meetingExpireIfNoUserJoinedInMinutes)) + } + + def meetingOverDuration(state: MeetingState2x, nowInSeconds: Long): Boolean = { + if (state.expiryTracker.durationInMinutes == 0) { + false + } else { + nowInSeconds > state.expiryTracker.startedOn + TimeUtil.minutesToSeconds(state.expiryTracker.durationInMinutes) + } + } + + def endMeetingTime(state: MeetingState2x): Int = { + (state.expiryTracker.startedOn + TimeUtil.minutesToSeconds(state.expiryTracker.durationInMinutes)).toInt + } +} + diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/domain/MeetingState2x.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/domain/MeetingState2x.scala new file mode 100755 index 0000000000000000000000000000000000000000..bb880efc732898dfc3f730d8f03b20372049a386 --- /dev/null +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/domain/MeetingState2x.scala @@ -0,0 +1,19 @@ +package org.bigbluebutton.core.domain + +object MeetingState2x { + +} + +case class MeetingState2x( + inactivityTracker: MeetingInactivityTracker, + expiryTracker: MeetingExpiryTracker +) + +object MeetingEndReason { + val ENDED_FROM_API = "ENDED_FROM_API" + val ENDED_DUE_TO_INACTIVITY = "ENDED_DUE_TO_ACTIVITY" + val ENDED_WHEN_NOT_JOINED = "ENDED_WHEN_NOT_JOINED" + val ENDED_WHEN_LAST_USER_LEFT = "ENDED_WHEN_LAST_USER_LEFT" + val ENDED_AFTER_USER_LOGGED_OUT = "ENDED_AFTER_USER_LOGGED_OUT" + val ENDED_AFTER_EXCEEDING_DURATION = "ENDED_AFTER_USER_LOGGED_OUT" +} \ No newline at end of file diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/domain/MeetingStatus.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/domain/MeetingStatus.scala index 91864626eea66d0607894f84f1aab8e39bf67263..3add2b72adc9da4ba18909ccc3daec7a9cd03bee 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/domain/MeetingStatus.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/domain/MeetingStatus.scala @@ -4,71 +4,80 @@ import com.softwaremill.quicklens._ import org.bigbluebutton.core.api.Permissions case class MeetingProperties( - id: String, - extId: String, - name: String, - recorded: Boolean, - voiceConf: String, - duration: Int, - autoStartRecording: Boolean, + id: String, + extId: String, + name: String, + recorded: Boolean, + voiceConf: String, + duration: Int, + autoStartRecording: Boolean, allowStartStopRecording: Boolean, - moderatorPass: String, - viewerPass: String, - createTime: Long, - createDate: String, - isBreakout: Boolean) + moderatorPass: String, + viewerPass: String, + createTime: Long, + createDate: String, + isBreakout: Boolean +) case class MeetingProperties2x( - id: String, - extId: String, - name: String, - voiceConf: String, - duration: Int, - maxUsers: Int, + id: String, + extId: String, + name: String, + voiceConf: String, + duration: Int, + maxUsers: Int, allowVoiceOnly: Boolean, - isBreakout: Boolean, - extensionProp: MeetingExtensionProp, - recordingProp: MeetingRecordingProp) + isBreakout: Boolean, + extensionProp: MeetingExtensionProp, + recordingProp: MeetingRecordingProp +) case class MeetingRecordingProp( - recorded: Boolean = false, - autoStartRecording: Boolean = false, - allowStartStopRecording: Boolean = true) + recorded: Boolean = false, + autoStartRecording: Boolean = false, + allowStartStopRecording: Boolean = true +) case class MeetingExtensionProp( - maxExtensions: Int = 0, - extendByMinutes: Int = 20, - sendNotice: Boolean = true) + maxExtensions: Int = 0, + extendByMinutes: Int = 20, + sendNotice: Boolean = true +) case class MeetingRecordingStatus( - recording: Boolean = false, - voiceRecordingFilename: String = "") + recording: Boolean = false, + voiceRecordingFilename: String = "" +) case class MeetingExtensionStatus( - numExtensions: Int = 0, + numExtensions: Int = 0, sent15MinNotice: Boolean = false, sent10MinNotice: Boolean = false, - sent5MinNotice: Boolean = false) - -case class Meeting3x(permissions: Permissions, - isRecording: Boolean = false, - muted: Boolean = false, - ended: Boolean = false, - hasLastWebUserLeft: Boolean = false, - lastWebUserLeftOnTimestamp: Long = 0L, - voiceRecordingFilename: String = "", - startedOn: Long = 0L, - pinNumbers: Set[String] = Set.empty, - lastGeneratedPin: Int = 0, - breakoutRoomsStartedOn: Long = 0L, - breakoutRoomsDurationInMinutes: Int = 120, - extensionStatus: MeetingExtensionStatus = new MeetingExtensionStatus, - recordingStatus: MeetingRecordingStatus = new MeetingRecordingStatus) + sent5MinNotice: Boolean = false +) + +case class Meeting3x( + permissions: Permissions, + isRecording: Boolean = false, + muted: Boolean = false, + ended: Boolean = false, + hasLastWebUserLeft: Boolean = false, + lastWebUserLeftOnTimestamp: Long = 0L, + voiceRecordingFilename: String = "", + startedOn: Long = 0L, + pinNumbers: Set[String] = Set.empty, + lastGeneratedPin: Int = 0, + breakoutRoomsStartedOn: Long = 0L, + breakoutRoomsDurationInMinutes: Int = 120, + extensionStatus: MeetingExtensionStatus = new MeetingExtensionStatus, + recordingStatus: MeetingRecordingStatus = new MeetingRecordingStatus +) object Meeting3x { def isExtensionAllowed( extension: MeetingExtensionProp, - status: MeetingExtensionStatus): Boolean = status.numExtensions < extension.maxExtensions + status: MeetingExtensionStatus + ): Boolean = status.numExtensions < extension.maxExtensions def incNumExtension(extension: MeetingExtensionProp, status: MeetingExtensionStatus): MeetingExtensionStatus = { if (status.numExtensions < extension.maxExtensions) { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/messaging/Util.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/messaging/Util.scala index 618c9379163ee3060dfc43d5b92c6af49d12a72a..c852b154c60c056641223a6cabd5a1b543ca76f6 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/messaging/Util.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/messaging/Util.scala @@ -18,8 +18,10 @@ object Util { header } - def buildJson(header: java.util.HashMap[String, Any], - payload: java.util.HashMap[String, Any]): String = { + def buildJson( + header: java.util.HashMap[String, Any], + payload: java.util.HashMap[String, Any] + ): String = { val message = new java.util.HashMap[String, java.util.HashMap[String, Any]]() message.put(Constants.HEADER, header) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/BreakoutRooms.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/BreakoutRooms.scala index ede87e3d21be8e6ab25e51c53694f93a424bc94f..4dd78a926443e925b042e6dc66fcc04b4b984d44 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/BreakoutRooms.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/BreakoutRooms.scala @@ -10,7 +10,7 @@ object BreakoutRooms { def breakoutRoomsdurationInMinutes(status: BreakoutRooms, duration: Int) = status.breakoutRoomsdurationInMinutes = duration def newBreakoutRoom(parentRoomId: String, id: String, externalMeetingId: String, name: String, sequence: Integer, voiceConfId: String, - assignedUsers: Vector[String], breakoutRooms: BreakoutRooms): Option[BreakoutRoomVO] = { + assignedUsers: Vector[String], breakoutRooms: BreakoutRooms): Option[BreakoutRoomVO] = { val brvo = new BreakoutRoomVO(id, externalMeetingId, name, parentRoomId, sequence, voiceConfId, assignedUsers, Vector()) breakoutRooms.add(brvo) Some(brvo) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/Polls.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/Polls.scala index 0a607e255bfa7e75ed225c290eabe6143dae51c0..65d43e4256e09ebc483e88414b6818f03d085a83 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/Polls.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/Polls.scala @@ -1,6 +1,7 @@ package org.bigbluebutton.core.models import org.bigbluebutton.common2.domain._ +import org.bigbluebutton.common2.msgs.AnnotationVO import org.bigbluebutton.core.apps.WhiteboardKeyUtil import scala.collection.mutable.ArrayBuffer @@ -45,19 +46,18 @@ object Polls { } def handleShowPollResultReqMsg(requesterId: String, pollId: String, lm: LiveMeeting): Option[(SimplePollResultOutVO, AnnotationVO)] = { - def sendWhiteboardAnnotation(annotation: AnnotationVO): Unit = { + def updateWhiteboardAnnotation(annotation: AnnotationVO): AnnotationVO = { lm.wbModel.updateAnnotation(annotation.wbId, annotation.userId, annotation) - annotation } def send(poll: SimplePollResultOutVO, shape: scala.collection.immutable.Map[String, Object]): Option[AnnotationVO] = { for { page <- lm.presModel.getCurrentPage() - pageId = if (poll.id.contains("deskshare")) "deskshare" else page.id - annotation = new AnnotationVO(poll.id, WhiteboardKeyUtil.DRAW_END_STATUS, WhiteboardKeyUtil.POLL_RESULT_TYPE, shape, pageId, requesterId, -1) } yield { - sendWhiteboardAnnotation(annotation) - annotation + val pageId = if (poll.id.contains("deskshare")) "deskshare" else page.id + val updatedShape = shape + ("whiteboardId" -> pageId) + val annotation = new AnnotationVO(poll.id, WhiteboardKeyUtil.DRAW_END_STATUS, WhiteboardKeyUtil.POLL_RESULT_TYPE, updatedShape, pageId, requesterId, -1) + updateWhiteboardAnnotation(annotation) } } @@ -101,7 +101,7 @@ object Polls { } def handleRespondToPollReqMsg(requesterId: String, pollId: String, questionId: Int, answerId: Int, - lm: LiveMeeting): Option[(String, String, SimplePollResultOutVO)] = { + lm: LiveMeeting): Option[(String, String, SimplePollResultOutVO)] = { for { curPres <- Users2x.findPresenter(lm.users2x) @@ -114,7 +114,7 @@ object Polls { } def handleStartCustomPollReqMsg(requesterId: String, pollId: String, pollType: String, - answers: Seq[String], lm: LiveMeeting): Option[SimplePollOutVO] = { + answers: Seq[String], lm: LiveMeeting): Option[SimplePollOutVO] = { def createPoll(pollId: String, numRespondents: Int): Option[Poll] = { for { @@ -142,7 +142,7 @@ object Polls { // Helper methods: // private def handleRespondToPoll(poll: SimplePollResultOutVO, requesterId: String, pollId: String, questionId: Int, - answerId: Int, lm: LiveMeeting): Option[SimplePollResultOutVO] = { + answerId: Int, lm: LiveMeeting): Option[SimplePollResultOutVO] = { /* * Hardcode to zero as we are assuming the poll has only one question. * Our data model supports multiple question polls but for this @@ -563,9 +563,7 @@ class Answer(val id: Int, val key: String, val text: Option[String]) { } def getResponders(): Array[Responder] = { - var r = new Array[Responder](responders.length) - responders.copyToArray(r) - return r + return responders.toArray } def toSimpleAnswerOutVO(): SimpleAnswerOutVO = { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/RegisteredUsers.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/RegisteredUsers.scala index 3a560ad21875395339ac8f7e92725f089b6d66fd..8521900d296dc5b9bab736d2366591cff1ca88c5 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/RegisteredUsers.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/RegisteredUsers.scala @@ -5,11 +5,9 @@ import com.softwaremill.quicklens._ object RegisteredUsers { def create(userId: String, extId: String, name: String, roles: String, - token: String, avatar: String, guest: Boolean, authenticated: Boolean, - waitingForAcceptance: Boolean, users: RegisteredUsers): RegisteredUser = { - val ru = new RegisteredUser(userId, extId, name, roles, token, avatar, guest, authenticated, waitingForAcceptance) - users.save(ru) - ru + token: String, avatar: String, guest: Boolean, authenticated: Boolean, + waitingForAcceptance: Boolean): RegisteredUser = { + new RegisteredUser(userId, extId, name, roles, token, avatar, guest, authenticated, waitingForAcceptance) } def findWithToken(token: String, users: RegisteredUsers): Option[RegisteredUser] = { @@ -43,12 +41,16 @@ object RegisteredUsers { } yield users.save(regUser) } + def add(users: RegisteredUsers, user: RegisteredUser): Vector[RegisteredUser] = { + users.save(user) + } + def remove(id: String, users: RegisteredUsers): Option[RegisteredUser] = { users.delete(id) } def setWaitingForApproval(users: RegisteredUsers, user: RegisteredUser, - waitingForApproval: Boolean): RegisteredUser = { + waitingForApproval: Boolean): RegisteredUser = { val u = user.modify(_.waitingForAcceptance).setTo(waitingForApproval) users.save(u) u @@ -74,6 +76,6 @@ class RegisteredUsers { } case class RegisteredUser(id: String, externId: String, name: String, role: String, - authToken: String, avatarURL: String, guest: Boolean, - authed: Boolean, waitingForAcceptance: Boolean) + authToken: String, avatarURL: String, guest: Boolean, + authed: Boolean, waitingForAcceptance: Boolean) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/Users2x.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/Users2x.scala index fbd105df3611502f41d9931c4f0495e029b1976c..78c4848169c3e3b10ec1f75012fb9a8f06a1a9db 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/Users2x.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/Users2x.scala @@ -88,7 +88,7 @@ object Users2x { def hasPresenter(users: Users2x): Boolean = { findPresenter(users) match { case Some(p) => true - case None => false + case None => false } } @@ -144,8 +144,8 @@ class Users2x { } case class UserState(intId: String, extId: String, name: String, role: String, - guest: Boolean, authed: Boolean, waitingForAcceptance: Boolean, emoji: String, locked: Boolean, - presenter: Boolean, avatar: String) + guest: Boolean, authed: Boolean, waitingForAcceptance: Boolean, emoji: String, locked: Boolean, + presenter: Boolean, avatar: String) case class UserIdAndName(id: String, name: String) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/Values.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/Values.scala index fc1ebd32537a530828dd0b29cdaa0cbeb594c148..7668b03f98993f6fb6f274f38b2551e340af1e56 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/Values.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/Values.scala @@ -5,17 +5,19 @@ case class Status(isPresenter: Boolean = false, emojiStatus: String = "none") case class CallerId(num: String = "", name: String = "") case class Voice( - hasJoined: Boolean = false, - id: String = "", - callerId: CallerId = CallerId(), - muted: Boolean = false, - talking: Boolean = false, - locked: Boolean = false) + hasJoined: Boolean = false, + id: String = "", + callerId: CallerId = CallerId(), + muted: Boolean = false, + talking: Boolean = false, + locked: Boolean = false +) case class UserV( - id: String, - extId: String, - name: String, - role: String = Roles.VIEWER_ROLE, + id: String, + extId: String, + name: String, + role: String = Roles.VIEWER_ROLE, status: Status = Status(), - voice: Voice = Voice()) \ No newline at end of file + voice: Voice = Voice() +) \ No newline at end of file diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/VoiceUsers.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/VoiceUsers.scala index 53c13e69eaf7dd599a8e4d81a2eecc3d58927fdb..53b3988cf139d9a50637fcc2bbf9236d2d2dd31a 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/VoiceUsers.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/VoiceUsers.scala @@ -118,8 +118,8 @@ class VoiceUsers { case class VoiceUser2x(intId: String, voiceUserId: String) case class VoiceUserVO2x(intId: String, voiceUserId: String, callerName: String, - callerNum: String, joined: Boolean, locked: Boolean, muted: Boolean, - talking: Boolean, callingWith: String, listenOnly: Boolean) + callerNum: String, joined: Boolean, locked: Boolean, muted: Boolean, + talking: Boolean, callingWith: String, listenOnly: Boolean) case class VoiceUserState(intId: String, voiceUserId: String, callingWith: String, callerName: String, - callerNum: String, muted: Boolean, talking: Boolean, listenOnly: Boolean) \ No newline at end of file + callerNum: String, muted: Boolean, talking: Boolean, listenOnly: Boolean) \ No newline at end of file diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/MeetingMessageToJsonConverter.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/MeetingMessageToJsonConverter.scala index 83c6d05b0681ae620d1afe1cac19f77e96fe82a0..c0e6555d37d4a12f67f0b838cd1e95a8cf470e9d 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/MeetingMessageToJsonConverter.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/MeetingMessageToJsonConverter.scala @@ -56,30 +56,6 @@ object MeetingMessageToJsonConverter { Util.buildJson(header, payload) } - def voiceRecordingStartedToJson(msg: VoiceRecordingStarted): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.RECORDED, msg.recorded) - payload.put(Constants.RECORDING_FILE, msg.recordingFile) - payload.put(Constants.VOICE_CONF, msg.confNum) - payload.put(Constants.TIMESTAMP, msg.timestamp) - - val header = Util.buildHeader(MessageNames.VOICE_RECORDING_STARTED, None) - Util.buildJson(header, payload) - } - - def voiceRecordingStoppedToJson(msg: VoiceRecordingStopped): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.RECORDED, msg.recorded) - payload.put(Constants.RECORDING_FILE, msg.recordingFile) - payload.put(Constants.VOICE_CONF, msg.confNum) - payload.put(Constants.TIMESTAMP, msg.timestamp) - - val header = Util.buildHeader(MessageNames.VOICE_RECORDING_STOPPED, None) - Util.buildJson(header, payload) - } - def recordingStatusChangedToJson(msg: RecordingStatusChanged): String = { val payload = new java.util.HashMap[String, Any]() payload.put(Constants.MEETING_ID, msg.meetingID) @@ -111,26 +87,6 @@ object MeetingMessageToJsonConverter { Util.buildJson(header, payload) } - def startRecordingToJson(msg: StartRecording): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.RECORDED, msg.recorded) - payload.put(Constants.REQUESTER_ID, msg.requesterID) - - val header = Util.buildHeader(MessageNames.START_RECORDING, None) - Util.buildJson(header, payload) - } - - def stopRecordingToJson(msg: StopRecording): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.RECORDED, msg.recorded) - payload.put(Constants.REQUESTER_ID, msg.requesterID) - - val header = Util.buildHeader(MessageNames.STOP_RECORDING, None) - Util.buildJson(header, payload) - } - def getAllMeetingsReplyToJson(msg: GetAllMeetingsReply): String = { val payload = new java.util.HashMap[String, Any]() payload.put("meetings", msg.meetings) @@ -139,80 +95,6 @@ object MeetingMessageToJsonConverter { Util.buildJson(header, payload) } - def breakoutRoomsListOutMessageToJson(msg: BreakoutRoomsListOutMessage): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put("meetingId", msg.meetingId) - payload.put("rooms", msg.rooms.toArray) - payload.put("roomsReady", msg.roomsReady) - - val header = Util.buildHeader(BreakoutRoomsList.NAME, None) - Util.buildJson(header, payload) - } - - def breakoutRoomStartedOutMessageToJson(msg: BreakoutRoomStartedOutMessage): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put("meetingId", msg.breakout.meetingId) - payload.put("externalMeetingId", msg.breakout.externalMeetingId) - payload.put("parentMeetingId", msg.parentMeetingId) - payload.put("sequence", msg.breakout.sequence) - payload.put("name", msg.breakout.name) - - val header = Util.buildHeader(BreakoutRoomStarted.NAME, None) - Util.buildJson(header, payload) - } - - def breakoutRoomEndedOutMessageToJson(msg: BreakoutRoomEndedOutMessage): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put("parentMeetingId", msg.parentMeetingId) - payload.put("meetingId", msg.meetingId) - - val header = Util.buildHeader(BreakoutRoomClosed.NAME, None) - Util.buildJson(header, payload) - } - - def breakoutRoomJoinURLOutMessageToJson(msg: BreakoutRoomJoinURLOutMessage): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put("parentMeetingId", msg.parentMeetingId) - payload.put("breakoutMeetingId", msg.breakoutMeetingId) - payload.put("userId", msg.userId) - payload.put("redirectJoinURL", msg.redirectJoinURL) - payload.put("noRedirectJoinURL", msg.noRedirectJoinURL) - - val header = Util.buildHeader(BreakoutRoomJoinURL.NAME, None) - Util.buildJson(header, payload) - } - - def updateBreakoutUsersOutMessageToJson(msg: UpdateBreakoutUsersOutMessage): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put("parentMeetingId", msg.parentMeetingId) - payload.put("breakoutMeetingId", msg.breakoutMeetingId) - payload.put("recorded", msg.recorded) - payload.put("users", msg.users.toArray) - - val header = Util.buildHeader(UpdateBreakoutUsers.NAME, None) - Util.buildJson(header, payload) - } - - def meetingTimeRemainingUpdateToJson(msg: MeetingTimeRemainingUpdate): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put("meetingId", msg.meetingId) - payload.put("recorded", msg.recorded) - payload.put("timeRemaining", msg.timeRemaining) - - val header = Util.buildHeader(TimeRemainingUpdate.NAME, None) - Util.buildJson(header, payload) - } - - def breakoutRoomsTimeRemainingUpdateToJson(msg: BreakoutRoomsTimeRemainingUpdateOutMessage): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put("meetingId", msg.meetingId) - payload.put("recorded", msg.recorded) - payload.put("timeRemaining", msg.timeRemaining) - - val header = Util.buildHeader(BreakoutRoomsTimeRemainingUpdate.NAME, None) - Util.buildJson(header, payload) - } - def inactivityWarningToJson(msg: InactivityWarning): String = { val payload = new java.util.HashMap[String, Any]() payload.put(Constants.MEETING_ID, msg.meetingID) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/PesentationMessageToJsonConverter.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/PesentationMessageToJsonConverter.scala deleted file mode 100755 index 906c593c001623721ff00a2d2e6d0bb1bd1c3259..0000000000000000000000000000000000000000 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/PesentationMessageToJsonConverter.scala +++ /dev/null @@ -1,275 +0,0 @@ -package org.bigbluebutton.core.pubsub.senders - -import org.bigbluebutton.core.api._ -import org.bigbluebutton.core.messaging.Util -import org.bigbluebutton.core.apps.Page -import scala.collection.JavaConverters -object PesentationMessageToJsonConverter { - /* - private def pageToMap(page: Page): java.util.Map[String, Any] = { - val res = new scala.collection.mutable.Map[String, Any] - res += "id" -> page.id - res += "num" -> page.num - res += "thumb_uri" -> page.thumbUri - res += "swf_uri" -> page.swfUri - res += "txt_uri" -> page.txtUri - res += "svg_uri" -> page.svgUri - res += "current" -> page.current - res += "x_offset" -> page.xOffset - res += "y_offset" -> page.yOffset - res += "width_ratio" -> page.widthRatio - res += "height_ratio" -> page.heightRatio - - JavaConverters.mapAsScalaMap(res) - } -*/ - def clearPresentationOutMsgToJson(msg: ClearPresentationOutMsg): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - - val header = Util.buildHeader(MessageNames.PRESENTATION_CLEARED, None) - Util.buildJson(header, payload) - } - - def removePresentationOutMsgToJson(msg: RemovePresentationOutMsg): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.PRESENTATION_ID, msg.presentationID) - - val header = Util.buildHeader(MessageNames.PRESENTATION_REMOVED, None) - Util.buildJson(header, payload) - } - - def getPresentationInfoOutMsgToJson(msg: GetPresentationInfoOutMsg): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.PRESENTATION_INFO, msg.info) - payload.put(Constants.REQUESTER_ID, msg.requesterID) - - val info = msg.info - - // Create a map for our current presenter - val presenter = new java.util.HashMap[String, String]() - presenter.put(Constants.USER_ID, info.presenter.userId) - presenter.put(Constants.NAME, info.presenter.name) - presenter.put(Constants.ASSIGNED_BY, info.presenter.assignedBy) - - payload.put(Constants.PRESENTER, presenter) - - // Create an array for our presentations - val presentations = new java.util.ArrayList[java.util.HashMap[String, Object]] - info.presentations.foreach { pres => - val presentation = new java.util.HashMap[String, Object]() - presentation.put(Constants.ID, pres.id) - presentation.put(Constants.NAME, pres.name) - presentation.put(Constants.CURRENT, pres.current: java.lang.Boolean) - presentation.put(Constants.DOWNLOADABLE, pres.downloadable: java.lang.Boolean) - - // Get the pages for a presentation - val pages = new java.util.ArrayList[java.util.Map[String, Any]]() - // pres.pages.values foreach { p => - // pages.add(p) - // } - // store the pages in the presentation - presentation.put(Constants.PAGES, pages) - - // add this presentation into our presentations list - presentations.add(presentation); - } - - // add the presentation to our map to complete our json - payload.put(Constants.PRESENTATIONS, presentations) - - val header = Util.buildHeader(MessageNames.GET_PRESENTATION_INFO_REPLY, Some(msg.replyTo)) - Util.buildJson(header, payload) - } - - def resizeAndMoveSlideOutMsgToJson(msg: ResizeAndMoveSlideOutMsg): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - // payload.put(Constants.PAGE, pageToMap(msg.page)) - - val header = Util.buildHeader(MessageNames.PRESENTATION_PAGE_RESIZED, None) - Util.buildJson(header, payload) - } - - def gotoSlideOutMsgToJson(msg: GotoSlideOutMsg): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - // payload.put(Constants.PAGE, pageToMap(msg.page)) - - val header = Util.buildHeader(MessageNames.PRESENTATION_PAGE_CHANGED, None) - Util.buildJson(header, payload) - } - - def sharePresentationOutMsgToJson(msg: SharePresentationOutMsg): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - - val presentation = new java.util.HashMap[String, Object](); - presentation.put(Constants.ID, msg.presentation.id) - presentation.put(Constants.NAME, msg.presentation.name) - presentation.put(Constants.CURRENT, msg.presentation.current: java.lang.Boolean) - presentation.put(Constants.DOWNLOADABLE, msg.presentation.downloadable: java.lang.Boolean) - - // Get the pages for a presentation - val pages = new java.util.ArrayList[java.util.Map[String, Any]]() - // msg.presentation.pages.values foreach { p => - // pages.add(pageToMap(p)) - // } - - // store the pages in the presentation - presentation.put(Constants.PAGES, pages) - - payload.put(Constants.PRESENTATION, presentation); - - val header = Util.buildHeader(MessageNames.PRESENTATION_SHARED, None) - Util.buildJson(header, payload) - } - - def getSlideInfoOutMsgToJson(msg: GetSlideInfoOutMsg): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.REQUESTER_ID, msg.requesterID) - // payload.put(Constants.PAGE, pageToMap(msg.page)) - - val header = Util.buildHeader(MessageNames.GET_SLIDE_INFO_REPLY, None) - Util.buildJson(header, payload) - } - - def getPreuploadedPresentationsOutMsgToJson(msg: GetPreuploadedPresentationsOutMsg): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - - val header = Util.buildHeader(MessageNames.GET_PREUPLOADED_PRESENTATIONS, None) - Util.buildJson(header, payload) - } - - def presentationConversionProgressToJson(msg: PresentationConversionProgress): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.MESSAGE_KEY, msg.messageKey) - payload.put(Constants.CODE, msg.code) - payload.put(Constants.PRESENTATION_ID, msg.presentationId) - payload.put(Constants.PRESENTATION_NAME, msg.presentationName) - - val header = Util.buildHeader(MessageNames.PRESENTATION_CONVERSION_PROGRESS, None) - Util.buildJson(header, payload) - } - - def presentationConversionErrorToJson(msg: PresentationConversionError): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.MESSAGE_KEY, msg.messageKey) - payload.put(Constants.CODE, msg.code) - payload.put(Constants.PRESENTATION_ID, msg.presentationId) - payload.put(Constants.PRESENTATION_NAME, msg.presentationName) - payload.put(Constants.NUM_PAGES, msg.numberOfPages) - payload.put(Constants.MAX_NUM_PAGES, msg.maxNumberPages) - - val header = Util.buildHeader(MessageNames.PRESENTATION_CONVERSION_ERROR, None) - Util.buildJson(header, payload) - } - - def presentationPageGenerated(msg: PresentationPageGenerated): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.MESSAGE_KEY, msg.messageKey) - payload.put(Constants.CODE, msg.code) - payload.put(Constants.PRESENTATION_ID, msg.presentationId) - payload.put(Constants.PRESENTATION_NAME, msg.presentationName) - payload.put(Constants.NUM_PAGES, msg.numberOfPages) - payload.put(Constants.PAGES_COMPLETED, msg.pagesCompleted) - - val header = Util.buildHeader(MessageNames.PRESENTATION_PAGE_GENERATED, None) - Util.buildJson(header, payload) - } - - def presentationConversionDoneToJson(msg: PresentationConversionDone): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.MESSAGE_KEY, msg.messageKey) - payload.put(Constants.CODE, msg.code) - - val presentation = new java.util.HashMap[String, Object](); - presentation.put(Constants.ID, msg.presentation.id) - presentation.put(Constants.NAME, msg.presentation.name) - presentation.put(Constants.CURRENT, msg.presentation.current: java.lang.Boolean) - presentation.put(Constants.DOWNLOADABLE, msg.presentation.downloadable: java.lang.Boolean) - - val pages = new java.util.ArrayList[java.util.Map[String, Any]]() - // msg.presentation.pages.values foreach { p => - // pages.add(pageToMap(p)) - // } - - presentation.put(Constants.PAGES, pages) - - payload.put(Constants.PRESENTATION, presentation); - - val header = Util.buildHeader(MessageNames.PRESENTATION_CONVERSION_DONE, None) - Util.buildJson(header, payload) - } - - def presentationChangedToJson(msg: PresentationChanged): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - val presentation = new java.util.HashMap[String, Object](); - presentation.put(Constants.ID, msg.presentation.id) - presentation.put(Constants.NAME, msg.presentation.name) - presentation.put(Constants.CURRENT, msg.presentation.current: java.lang.Boolean) - presentation.put(Constants.DOWNLOADABLE, msg.presentation.downloadable: java.lang.Boolean) - - val pages = new java.util.ArrayList[java.util.Map[String, Any]]() - // msg.presentation.pages.values foreach { p => - // pages.add(pageToMap(p)) - // } - - presentation.put(Constants.PAGES, pages) - payload.put(Constants.PRESENTATION, presentation); - - val header = Util.buildHeader(MessageNames.PRESENTATION_CHANGED, None) - Util.buildJson(header, payload) - } - - def getPresentationStatusReplyToJson(msg: GetPresentationStatusReply): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - val presentation = new java.util.HashMap[String, Object](); - - presentation.put(Constants.ID, msg.current.id) - presentation.put(Constants.NAME, msg.current.name) - presentation.put(Constants.CURRENT, msg.current.current: java.lang.Boolean) - presentation.put(Constants.DOWNLOADABLE, msg.current.downloadable: java.lang.Boolean) - - val pages = new java.util.ArrayList[java.util.Map[String, Any]]() - - // msg.current.pages.values foreach { p => - // pages.add(pageToMap(p)) - // } - - presentation.put(Constants.PAGES, pages) - - payload.put(Constants.PRESENTATION, presentation); - - val header = Util.buildHeader(MessageNames.GET_PRESENTATION_STATUS_REPLY, Some(msg.replyTo)) - Util.buildJson(header, payload) - } - - def presentationRemovedToJson(msg: PresentationRemoved): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.PRESENTATION_ID, msg.presentationId) - - val header = Util.buildHeader(MessageNames.PRESENTATION_REMOVED, None) - Util.buildJson(header, payload) - } - - def pageChangedToJson(msg: PageChanged): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - // payload.put(Constants.PAGE, pageToMap(msg.page)) - - val header = Util.buildHeader(MessageNames.PRESENTATION_PAGE_CHANGED, None) - Util.buildJson(header, payload) - } -} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/ReceivedJsonMsgHandlerActor.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/ReceivedJsonMsgHandlerActor.scala index 17576fd22fb6d0c26cc2ec61c136d7f579a06762..2d7021cdff04122abce465ec13abbd693a534b99 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/ReceivedJsonMsgHandlerActor.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/ReceivedJsonMsgHandlerActor.scala @@ -14,8 +14,9 @@ object ReceivedJsonMsgHandlerActor { } class ReceivedJsonMsgHandlerActor( - val eventBus: BbbMsgRouterEventBus, - val incomingJsonMessageBus: IncomingJsonMessageBus) + val eventBus: BbbMsgRouterEventBus, + val incomingJsonMessageBus: IncomingJsonMessageBus +) extends Actor with ActorLogging with SystemConfiguration with ReceivedJsonMsgDeserializer @@ -70,6 +71,19 @@ class ReceivedJsonMsgHandlerActor( case DestroyMeetingSysCmdMsg.NAME => route[DestroyMeetingSysCmdMsg](meetingManagerChannel, envelope, jsonNode) + // Guests + case GetGuestsWaitingApprovalReqMsg.NAME => + routeGenericMsg[GetGuestsWaitingApprovalReqMsg](envelope, jsonNode) + case GuestsWaitingApprovedMsg.NAME => + routeGenericMsg[GuestsWaitingApprovedMsg](envelope, jsonNode) + case SetGuestPolicyCmdMsg.NAME => + routeGenericMsg[SetGuestPolicyCmdMsg](envelope, jsonNode) + case GetGuestPolicyReqMsg.NAME => + routeGenericMsg[GetGuestPolicyReqMsg](envelope, jsonNode) + + // Users + case GetUsersMeetingReqMsg.NAME => + routeGenericMsg[GetUsersMeetingReqMsg](envelope, jsonNode) // Poll case StartCustomPollReqMsg.NAME => routeGenericMsg[StartCustomPollReqMsg](envelope, jsonNode) @@ -262,6 +276,8 @@ class ReceivedJsonMsgHandlerActor( routeGenericMsg[SetRecordingStatusCmdMsg](envelope, jsonNode) case GetRecordingStatusReqMsg.NAME => routeGenericMsg[GetRecordingStatusReqMsg](envelope, jsonNode) + case GetScreenshareStatusReqMsg.NAME => + routeGenericMsg[GetScreenshareStatusReqMsg](envelope, jsonNode) // Lock settings case LockUserInMeetingCmdMsg.NAME => diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/UsersMessageToJsonConverter.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/UsersMessageToJsonConverter.scala index c643d7d7bf67a5460096ee7572032234ae51531f..2c894be75e22dd7098544794865157f38b74f7d3 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/UsersMessageToJsonConverter.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/UsersMessageToJsonConverter.scala @@ -2,75 +2,14 @@ package org.bigbluebutton.core.pubsub.senders import scala.collection.JavaConverters._ -import org.bigbluebutton.common2.domain.UserVO import org.bigbluebutton.core.api._ import org.bigbluebutton.core.messaging.Util -import org.bigbluebutton.core.models.RegisteredUser object UsersMessageToJsonConverter { - private def userToMap(user: UserVO): java.util.Map[String, Any] = { - - val wuser = new scala.collection.mutable.HashMap[String, Any] - wuser += "userid" -> user.id - wuser += "extern_userid" -> user.externalId - wuser += "name" -> user.name - wuser += "role" -> user.role.toString() - wuser += "guest" -> user.guest - wuser += "waiting_for_acceptance" -> user.waitingForAcceptance - wuser += "emoji_status" -> user.emojiStatus - wuser += "presenter" -> user.presenter - wuser += "has_stream" -> user.hasStream - wuser += "locked" -> user.locked - wuser += "webcam_stream" -> user.webcamStreams.toArray - wuser += "phone_user" -> user.phoneUser - wuser += "listenOnly" -> user.listenOnly - wuser += "avatarURL" -> user.avatarURL - - val vuser = new scala.collection.mutable.HashMap[String, Any] - vuser += "userid" -> user.voiceUser.userId - vuser += "web_userid" -> user.voiceUser.webUserId - vuser += "callername" -> user.voiceUser.callerName - vuser += "callernum" -> user.voiceUser.callerNum - vuser += "joined" -> user.voiceUser.joined - vuser += "locked" -> user.voiceUser.locked - vuser += "muted" -> user.voiceUser.muted - vuser += "talking" -> user.voiceUser.talking - - wuser.put("voiceUser", mapAsJavaMapConverter(vuser).asJava) - - mapAsJavaMapConverter(wuser).asJava - } - - private def registeredUserToMap(user: RegisteredUser): java.util.Map[String, Any] = { - val wuser = new scala.collection.mutable.HashMap[String, Any] - wuser += "userid" -> user.id - wuser += "extern_userid" -> user.externId - wuser += "name" -> user.name - wuser += "role" -> user.role.toString() - wuser += "authToken" -> user.authToken - wuser += "avatarURL" -> user.avatarURL - wuser += "guest" -> user.guest - wuser += "waiting_for_acceptance" -> user.waitingForAcceptance - - mapAsJavaMapConverter(wuser).asJava - } - - private def buildPermissionsHashMap(perms: Permissions): java.util.HashMap[String, java.lang.Boolean] = { - val args = new java.util.HashMap[String, java.lang.Boolean](); - args.put("disableCam", perms.disableCam: java.lang.Boolean); - args.put("disableMic", perms.disableMic: java.lang.Boolean); - args.put("disablePrivateChat", perms.disablePrivChat: java.lang.Boolean); - args.put("disablePublicChat", perms.disablePubChat: java.lang.Boolean); - args.put("lockedLayout", perms.lockedLayout: java.lang.Boolean); - args.put("lockOnJoin", perms.lockOnJoin: java.lang.Boolean); - args.put("lockOnJoinConfigurable", perms.lockOnJoinConfigurable: java.lang.Boolean); - args - } def meetingState(msg: MeetingState): String = { val payload = new java.util.HashMap[String, Any]() payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.PERMISSIONS, buildPermissionsHashMap(msg.permissions)) payload.put(Constants.MEETING_MUTED, msg.meetingMuted: java.lang.Boolean); payload.put(Constants.USER_ID, msg.userId); @@ -120,236 +59,6 @@ object UsersMessageToJsonConverter { Util.buildJson(header, payload) } - def sendUserEjectedFromMeetingToJson(msg: UserEjectedFromMeeting) { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.USER_ID, msg.userId) - payload.put(Constants.EJECTED_BY, msg.ejectedBy) - - val header = Util.buildHeader(MessageNames.USER_EJECTED_FROM_MEETING, None) - Util.buildJson(header, payload) - } - - def permissionsSettingInitializedToJson(msg: PermissionsSettingInitialized): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.SETTINGS, msg.permissions.toString()) //#todo not tested - - val header = Util.buildHeader(MessageNames.PERMISSION_SETTING_INITIALIZED, None) - Util.buildJson(header, payload) - } - - def newPermissionsSettingToJson(msg: NewPermissionsSetting): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.PERMISSIONS, buildPermissionsHashMap(msg.permissions)) - - val users = new java.util.ArrayList[java.util.Map[String, Any]] - //msg.applyTo.foreach(uvo => { - // users.add(userToMap(uvo)) - //}) - - payload.put("users", users) - - val header = Util.buildHeader(MessageNames.NEW_PERMISSION_SETTINGS, None) - Util.buildJson(header, payload) - } - - def userLockedToJson(msg: UserLocked): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.USER_ID, msg.userId) - payload.put(Constants.LOCKED, msg.lock) - - val header = Util.buildHeader(MessageNames.USER_LOCKED, None) - Util.buildJson(header, payload) - } - - def getPermissionsSettingReplyToJson(msg: GetPermissionsSettingReply): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.USER_ID, msg.userId) - - val header = Util.buildHeader(MessageNames.GET_PERMISSION_SETTINGS_REPLY, None) - Util.buildJson(header, payload) - } - - def userRegisteredToJson(msg: UserRegistered): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.USER, registeredUserToMap(msg.user)) - payload.put(Constants.RECORDED, msg.recorded) - - val header = Util.buildHeader(MessageNames.USER_REGISTERED, None) - Util.buildJson(header, payload) - } - - def userChangedEmojiStatusToJson(msg: UserChangedEmojiStatus): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.EMOJI_STATUS, msg.emojiStatus) - payload.put(Constants.USER_ID, msg.userID) - - val header = Util.buildHeader(MessageNames.USER_EMOJI_STATUS, None) - Util.buildJson(header, payload) - } - - def userStatusChangeToJson(msg: UserStatusChange): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.USER_ID, msg.userID) - payload.put(Constants.STATUS, msg.status) - payload.put(Constants.VALUE, msg.value.toString) - - val header = Util.buildHeader(MessageNames.USER_STATUS_CHANGED, None) - Util.buildJson(header, payload) - } - - def userRoleChangeToJson(msg: UserRoleChange): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.USER_ID, msg.userID) - payload.put(Constants.ROLE, msg.role) - - val header = Util.buildHeader(MessageNames.USER_ROLE_CHANGED, None) - Util.buildJson(header, payload) - } - - def userSharedWebcamToJson(msg: UserSharedWebcam): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.RECORDED, msg.recorded) - payload.put(Constants.USER_ID, msg.userID) - payload.put(Constants.STREAM, msg.stream) - - val header = Util.buildHeader(MessageNames.USER_SHARED_WEBCAM, None) - Util.buildJson(header, payload) - } - - def userUnsharedWebcamToJson(msg: UserUnsharedWebcam): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.RECORDED, msg.recorded) - payload.put(Constants.USER_ID, msg.userID) - payload.put(Constants.STREAM, msg.stream) - - val header = Util.buildHeader(MessageNames.USER_UNSHARED_WEBCAM, None) - Util.buildJson(header, payload) - } - - def broadcastLayout(msg: BroadcastLayoutEvent): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.REQUESTER_ID, msg.requesterID) - - val users = new java.util.ArrayList[String]; - msg.applyTo.foreach(uvo => { - users.add(uvo.id) - }) - - payload.put(Constants.USERS, users) - - val header = Util.buildHeader(MessageNames.GET_USERS_REPLY, None) - Util.buildJson(header, payload) - } - - def getUsersReplyToJson(msg: GetUsersReply): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.REQUESTER_ID, msg.requesterID) - - val users = new java.util.ArrayList[java.util.Map[String, Any]]; - msg.users.foreach(uvo => { - users.add(userToMap(uvo)) - }) - - payload.put(Constants.USERS, users) - - val header = Util.buildHeader(MessageNames.GET_USERS_REPLY, None) - Util.buildJson(header, payload) - } - - def userJoinedVoice(msg: UserJoinedVoice): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.RECORDED, msg.recorded) - payload.put(Constants.USER, userToMap(msg.user)) - payload.put(Constants.VOICE_CONF, msg.confNum) - - val header = Util.buildHeader(MessageNames.USER_JOINED_VOICE, None) - Util.buildJson(header, payload) - } - - def userVoiceMuted(msg: UserVoiceMuted): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.RECORDED, msg.recorded) - payload.put(Constants.USER, userToMap(msg.user)) - payload.put(Constants.VOICE_CONF, msg.confNum) - - val header = Util.buildHeader(MessageNames.USER_VOICE_MUTED, None) - Util.buildJson(header, payload) - } - - def userVoiceTalking(msg: UserVoiceTalking): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.RECORDED, msg.recorded) - payload.put(Constants.USER, userToMap(msg.user)) - payload.put(Constants.VOICE_CONF, msg.confNum) - - val header = Util.buildHeader(MessageNames.USER_VOICE_TALKING, None) - Util.buildJson(header, payload) - } - - def muteVoiceUserToJson(msg: MuteVoiceUser): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.MUTE, msg.mute) - payload.put(Constants.USER_ID, msg.userId) - payload.put(Constants.REQUESTER_ID, msg.requesterID) - payload.put(Constants.VOICE_CONF_ID, msg.voiceConfId) - payload.put(Constants.VOICE_USER_ID, msg.voiceUserId) - - val header = Util.buildHeader(MessageNames.EJECT_VOICE_USER, None) - Util.buildJson(header, payload) - } - - def ejectVoiceUserToJson(msg: EjectVoiceUser): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.RECORDED, msg.recorded) - payload.put(Constants.USER_ID, msg.userId) - payload.put(Constants.REQUESTER_ID, msg.requesterID) - payload.put(Constants.VOICE_CONF_ID, msg.voiceConfId) - payload.put(Constants.VOICE_USER_ID, msg.voiceUserId) - - val header = Util.buildHeader(MessageNames.EJECT_VOICE_USER, None) - Util.buildJson(header, payload) - } - - def userLeftVoiceToJson(msg: UserLeftVoice): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.RECORDED, msg.recorded) - payload.put(Constants.USER, userToMap(msg.user)) - payload.put(Constants.VOICE_CONF, msg.confNum) - - val header = Util.buildHeader(MessageNames.USER_LEFT_VOICE, None) - Util.buildJson(header, payload) - } - - def isMeetingMutedReplyToJson(msg: IsMeetingMutedReply): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.RECORDED, msg.recorded) - payload.put(Constants.REQUESTER_ID, msg.requesterID) - payload.put(Constants.MUTED, msg.meetingMuted) - - val header = Util.buildHeader(MessageNames.IS_MEETING_MUTED_REPLY, None) - Util.buildJson(header, payload) - } - def recordingStatusChangedToJson(msg: RecordingStatusChanged): String = { val payload = new java.util.HashMap[String, Any]() payload.put(Constants.MEETING_ID, msg.meetingID) @@ -371,134 +80,4 @@ object UsersMessageToJsonConverter { val header = Util.buildHeader(MessageNames.GET_RECORDING_STATUS_REPLY, None) Util.buildJson(header, payload) } - - def validateAuthTokenReplyToJson(msg: ValidateAuthTokenReply): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.REPLY_TO, msg.correlationId) - payload.put(Constants.VALID, msg.valid.toString) - payload.put(Constants.USER_ID, msg.requesterId) - payload.put(Constants.AUTH_TOKEN, msg.token) - payload.put(Constants.MEETING_ID, msg.meetingID) - - val header = Util.buildHeader(MessageNames.VALIDATE_AUTH_TOKEN_REPLY, None) - Util.buildJson(header, payload) - } - - def validateAuthTokenTimeoutToJson(msg: ValidateAuthTokenTimedOut): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.REPLY_TO, msg.correlationId) - payload.put(Constants.VALID, msg.valid.toString) - payload.put(Constants.AUTH_TOKEN, msg.token) - payload.put(Constants.USER_ID, msg.requesterId) - payload.put(Constants.MEETING_ID, msg.meetingID) - - val header = Util.buildHeader(MessageNames.VALIDATE_AUTH_TOKEN_TIMEOUT, None) - Util.buildJson(header, payload) - } - - def userJoinedToJson(msg: UserJoined): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put("user", userToMap(msg.user)) - - val header = Util.buildHeader(MessageNames.USER_JOINED, None) - Util.buildJson(header, payload) - } - - def userLeftToJson(msg: UserLeft): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put("user", userToMap(msg.user)) - - val header = Util.buildHeader(MessageNames.USER_LEFT, None) - Util.buildJson(header, payload) - } - - def presenterAssignedToJson(msg: PresenterAssigned): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.NEW_PRESENTER_ID, msg.presenter.presenterID); - payload.put(Constants.NEW_PRESENTER_NAME, msg.presenter.presenterName); - payload.put(Constants.ASSIGNED_BY, msg.presenter.assignedBy); - payload.put(Constants.RECORDED, msg.recorded) - - val header = Util.buildHeader(MessageNames.PRESENTER_ASSIGNED, None) - Util.buildJson(header, payload) - } - - def endAndKickAllToJson(msg: EndAndKickAll): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.RECORDED, msg.recorded) - - val header = Util.buildHeader(MessageNames.END_AND_KICK_ALL, None) - Util.buildJson(header, payload) - } - - def userListeningOnlyToJson(msg: UserListeningOnly): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.USER_ID, msg.userID) - payload.put(Constants.LISTEN_ONLY, msg.listenOnly) - - val header = Util.buildHeader(MessageNames.USER_LISTEN_ONLY, None) - Util.buildJson(header, payload) - } - - def getGuestPolicyToJson(msg: GetGuestPolicy): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.REQUESTER_ID, msg.requesterID) - - val header = Util.buildHeader(MessageNames.GET_GUEST_POLICY, None) - Util.buildJson(header, payload) - } - - def setGuestPolicyToJson(msg: SetGuestPolicy): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.GUEST_POLICY, msg.policy.toString()) - - val header = Util.buildHeader(MessageNames.SET_GUEST_POLICY, None) - Util.buildJson(header, payload) - } - - def respondToGuestToJson(msg: RespondToGuest): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.USER_ID, msg.userId) - payload.put(Constants.RESPONSE, msg.response.toString()) - payload.put(Constants.REQUESTER_ID, msg.requesterID) - - val header = Util.buildHeader(MessageNames.RESPOND_TO_GUEST, None) - Util.buildJson(header, payload) - } - - def getGuestPolicyReplyToJson(msg: GetGuestPolicyReply): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.REQUESTER_ID, msg.requesterID) - payload.put(Constants.GUEST_POLICY, msg.policy) - - val header = Util.buildHeader(MessageNames.GET_GUEST_POLICY_REPLY, None) - Util.buildJson(header, payload) - } - - def guestPolicyChangedToJson(msg: GuestPolicyChanged): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.GUEST_POLICY, msg.policy) - - val header = Util.buildHeader(MessageNames.GUEST_POLICY_CHANGED, None) - Util.buildJson(header, payload) - } - - def guestAccessDeniedToJson(msg: GuestAccessDenied): String = { - val payload = new java.util.HashMap[String, Any]() - payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.USER_ID, msg.userId) - - val header = Util.buildHeader(MessageNames.GUEST_ACCESS_DENIED, None) - Util.buildJson(header, payload) - } } \ No newline at end of file diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/AuditHelpers.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/AuditHelpers.scala new file mode 100755 index 0000000000000000000000000000000000000000..5a4e825082b91d175612b7128ec5cce05169b83a --- /dev/null +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/AuditHelpers.scala @@ -0,0 +1,37 @@ +package org.bigbluebutton.core.running + +import org.bigbluebutton.common2.domain.DefaultProps +import org.bigbluebutton.common2.msgs._ +import org.bigbluebutton.core.bus.{ InternalEventBus } + +trait AuditHelpers { + + def getUsersInVoiceConf( + props: DefaultProps, + outGW: OutMsgRouter + ): Unit = { + def buildGetUsersInVoiceConfSysMsg(meetingId: String): BbbCommonEnvCoreMsg = { + val routing = collection.immutable.HashMap("sender" -> "bbb-apps-akka") + val envelope = BbbCoreEnvelope(GetUsersInVoiceConfSysMsg.NAME, routing) + val body = GetUsersInVoiceConfSysMsgBody(props.voiceProp.voiceConf) + val header = BbbCoreHeaderWithMeetingId(GetUsersInVoiceConfSysMsg.NAME, meetingId) + val event = GetUsersInVoiceConfSysMsg(header, body) + + BbbCommonEnvCoreMsg(envelope, event) + } + + val event = buildGetUsersInVoiceConfSysMsg(props.meetingProp.intId) + outGW.send(event) + } + + def sendBreakoutRoomCreatedToParent( + props: DefaultProps, + eventBus: InternalEventBus + ): Unit = { + // eventBus.publish(BigBlueButtonEvent( + // props.breakoutProps.parentId, + // BreakoutRoomCreated(props.breakoutProps.parentId, props.meetingProp.intId) + // )) + } + +} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/HandlerHelpers.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/HandlerHelpers.scala index 6e2286ff517633f5c055c4629acc374873b6b4e6..bca7fe27e07045eef58a572d6b07b55029f8ff7a 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/HandlerHelpers.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/HandlerHelpers.scala @@ -1,157 +1,191 @@ -package org.bigbluebutton.core.running - -import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.api.RecordingStatusChanged -import org.bigbluebutton.core.{ MessageRecorder, OutMessageGateway } -import org.bigbluebutton.core.models._ -import org.bigbluebutton.core2.MeetingStatus2x -import org.bigbluebutton.core2.message.senders.{ MsgBuilder, Sender, UserJoinedMeetingEvtMsgBuilder } - -trait HandlerHelpers { - this: BaseMeetingActor => - - def validateTokenFailed(outGW: OutMessageGateway, meetingId: String, userId: String, authToken: String, - valid: Boolean, waitForApproval: Boolean): Unit = { - val event = MsgBuilder.buildValidateAuthTokenRespMsg(meetingId, - userId, authToken, valid, waitForApproval) - Sender.send(outGW, event) - - // TODO: Should disconnect user here. - } - - def sendValidateAuthTokenRespMsg(outGW: OutMessageGateway, meetingId: String, userId: String, authToken: String, - valid: Boolean, waitForApproval: Boolean): Unit = { - val event = MsgBuilder.buildValidateAuthTokenRespMsg(meetingId, - userId, authToken, valid, waitForApproval) - Sender.send(outGW, event) - } - - def userValidatedButNeedToWaitForApproval(outGW: OutMessageGateway, liveMeeting: LiveMeeting, - user: RegisteredUser): Unit = { - val meetingId = liveMeeting.props.meetingProp.intId - sendValidateAuthTokenRespMsg(outGW, meetingId, user.id, user.authToken, valid = true, waitForApproval = false) - - val guest = GuestWaiting(user.id, user.name, user.role) - addGuestToWaitingForApproval(guest, liveMeeting.guestsWaiting) - notifyModeratorsOfGuestWaiting(outGW, Vector(guest), liveMeeting.users2x, meetingId) - } - - def addGuestToWaitingForApproval(guest: GuestWaiting, guestsWaitingList: GuestsWaiting): Unit = { - GuestsWaiting.add(guestsWaitingList, guest) - } - - def userValidatedAndNoNeedToWaitForApproval(outGW: OutMessageGateway, liveMeeting: LiveMeeting, - user: RegisteredUser): Unit = { - val meetingId = liveMeeting.props.meetingProp.intId - sendValidateAuthTokenRespMsg(outGW, meetingId, - userId = user.id, authToken = user.authToken, valid = true, waitForApproval = false) - - // TODO: REMOVE Temp only so we can implement user handling in client. (ralam june 21, 2017) - - sendAllUsersInMeeting(outGW, user.id, liveMeeting) - sendAllVoiceUsersInMeeting(outGW, user.id, liveMeeting.voiceUsers, meetingId) - sendAllWebcamStreams(outGW, user.id, liveMeeting.webcams, meetingId) - userJoinMeeting(outGW, user.authToken, liveMeeting) - if (!Users2x.hasPresenter(liveMeeting.users2x)) { - automaticallyAssignPresenter(outGW, liveMeeting) - } - } - - def notifyModeratorsOfGuestWaiting(outGW: OutMessageGateway, guests: Vector[GuestWaiting], users: Users2x, meetingId: String): Unit = { - val mods = Users2x.findAll(users).filter(p => p.role == Roles.MODERATOR_ROLE) - mods foreach { m => - val event = MsgBuilder.buildGuestsWaitingForApprovalEvtMsg(meetingId, m.intId, guests) - Sender.send(outGW, event) - } - } - - def sendAllUsersInMeeting(outGW: OutMessageGateway, requesterId: String, liveMeeting: LiveMeeting): Unit = { - val meetingId = liveMeeting.props.meetingProp.intId - val users = Users2x.findAll(liveMeeting.users2x) - val webUsers = users.map { u => - WebUser(intId = u.intId, extId = u.extId, name = u.name, role = u.role, - guest = u.guest, authed = u.authed, waitingForAcceptance = u.waitingForAcceptance, emoji = u.emoji, - locked = u.locked, presenter = u.presenter, avatar = u.avatar) - } - - val event = MsgBuilder.buildGetUsersMeetingRespMsg(meetingId, requesterId, webUsers) - Sender.send(outGW, event) - } - - def sendAllWebcamStreams(outGW: OutMessageGateway, requesterId: String, webcams: Webcams, meetingId: String): Unit = { - val streams = org.bigbluebutton.core.models.Webcams.findAll(webcams) - val webcamStreams = streams.map { u => - val msVO = MediaStreamVO(id = u.stream.id, url = u.stream.url, userId = u.stream.userId, - attributes = u.stream.attributes, viewers = u.stream.viewers) - - WebcamStreamVO(streamId = msVO.id, stream = msVO) - } - - val event = MsgBuilder.buildGetWebcamStreamsMeetingRespMsg(meetingId, requesterId, webcamStreams) - Sender.send(outGW, event) - } - - def sendAllVoiceUsersInMeeting(outGW: OutMessageGateway, requesterId: String, - voiceUsers: VoiceUsers, - meetingId: String): Unit = { - - val vu = VoiceUsers.findAll(voiceUsers).map { u => - VoiceConfUser(intId = u.intId, voiceUserId = u.voiceUserId, callingWith = u.callingWith, callerName = u.callerName, - callerNum = u.callerNum, muted = u.muted, talking = u.talking, listenOnly = u.listenOnly) - } - - val event = MsgBuilder.buildGetVoiceUsersMeetingRespMsg(meetingId, requesterId, vu) - Sender.send(outGW, event) - } - - def userJoinMeeting(outGW: OutMessageGateway, authToken: String, liveMeeting: LiveMeeting): Unit = { - for { - regUser <- RegisteredUsers.findWithToken(authToken, liveMeeting.registeredUsers) - } yield { - val userState = UserState(intId = regUser.id, - extId = regUser.externId, - name = regUser.name, - role = regUser.role, - guest = regUser.guest, - authed = regUser.authed, - waitingForAcceptance = regUser.waitingForAcceptance, - emoji = "none", - presenter = false, - locked = false, - avatar = regUser.avatarURL) - - Users2x.add(liveMeeting.users2x, userState) - - val event = UserJoinedMeetingEvtMsgBuilder.build(liveMeeting.props.meetingProp.intId, userState) - Sender.send(outGW, event) - - MessageRecorder.record(outGW, liveMeeting.props.recordProp.record, event.core) - startRecordingIfAutoStart2x(liveMeeting) - } - } - - def startRecordingIfAutoStart2x(liveMeeting: LiveMeeting): Unit = { - if (liveMeeting.props.recordProp.record && !MeetingStatus2x.isRecording(liveMeeting.status) && - liveMeeting.props.recordProp.autoStartRecording && Users2x.numUsers(liveMeeting.users2x) == 1) { - - MeetingStatus2x.recordingStarted(liveMeeting.status) - // outGW.send(new RecordingStatusChanged(props.meetingProp.intId, props.recordProp.record, - // "system", MeetingStatus2x.isRecording(liveMeeting.status))) - } - } - - def automaticallyAssignPresenter(outGW: OutMessageGateway, liveMeeting: LiveMeeting): Unit = { - val meetingId = liveMeeting.props.meetingProp.intId - for { - moderator <- Users2x.findModerator(liveMeeting.users2x) - newPresenter <- Users2x.makePresenter(liveMeeting.users2x, moderator.intId) - } yield { - sendPresenterAssigned(outGW, meetingId, newPresenter.intId, newPresenter.name, newPresenter.name) - } - } - - def sendPresenterAssigned(outGW: OutMessageGateway, meetingId: String, intId: String, name: String, assignedBy: String): Unit = { - def event = MsgBuilder.buildPresenterAssignedEvtMsg(meetingId, intId, name, assignedBy) - outGW.send(event) - } -} +package org.bigbluebutton.core.running + +import org.bigbluebutton.SystemConfiguration +import org.bigbluebutton.common2.msgs._ +import org.bigbluebutton.core.api.{ BreakoutRoomEndedInternalMsg, DestroyMeetingInternalMsg, RecordingStatusChanged } +import org.bigbluebutton.core.bus.{ BigBlueButtonEvent, InternalEventBus } +import org.bigbluebutton.core.domain.{ MeetingExpiryTracker, MeetingState2x } +import org.bigbluebutton.core.models._ +import org.bigbluebutton.core2.MeetingStatus2x +import org.bigbluebutton.core2.message.senders.{ MsgBuilder, Sender, UserJoinedMeetingEvtMsgBuilder } + +trait HandlerHelpers extends SystemConfiguration { + + def sendAllWebcamStreams(outGW: OutMsgRouter, requesterId: String, webcams: Webcams, meetingId: String): Unit = { + val streams = org.bigbluebutton.core.models.Webcams.findAll(webcams) + val webcamStreams = streams.map { u => + val msVO = MediaStreamVO(id = u.stream.id, url = u.stream.url, userId = u.stream.userId, + attributes = u.stream.attributes, viewers = u.stream.viewers) + + WebcamStreamVO(streamId = msVO.id, stream = msVO) + } + + val event = MsgBuilder.buildGetWebcamStreamsMeetingRespMsg(meetingId, requesterId, webcamStreams) + outGW.send(event) + } + + def userJoinMeeting(outGW: OutMsgRouter, authToken: String, + liveMeeting: LiveMeeting, state: MeetingState2x): MeetingState2x = { + val nu = for { + regUser <- RegisteredUsers.findWithToken(authToken, liveMeeting.registeredUsers) + } yield { + UserState( + intId = regUser.id, + extId = regUser.externId, + name = regUser.name, + role = regUser.role, + guest = regUser.guest, + authed = regUser.authed, + waitingForAcceptance = regUser.waitingForAcceptance, + emoji = "none", + presenter = false, + locked = false, + avatar = regUser.avatarURL + ) + } + + nu match { + case Some(newUser) => + Users2x.add(liveMeeting.users2x, newUser) + + val event = UserJoinedMeetingEvtMsgBuilder.build(liveMeeting.props.meetingProp.intId, newUser) + outGW.send(event) + startRecordingIfAutoStart2x(liveMeeting) + + if (!state.expiryTracker.userHasJoined) { + MeetingExpiryTracker.setUserHasJoined(state) + } else { + state + } + + case None => + state + } + } + + def startRecordingIfAutoStart2x(liveMeeting: LiveMeeting): Unit = { + if (liveMeeting.props.recordProp.record && !MeetingStatus2x.isRecording(liveMeeting.status) && + liveMeeting.props.recordProp.autoStartRecording && Users2x.numUsers(liveMeeting.users2x) == 1) { + + MeetingStatus2x.recordingStarted(liveMeeting.status) + // outGW.send(new RecordingStatusChanged(props.meetingProp.intId, props.recordProp.record, + // "system", MeetingStatus2x.isRecording(liveMeeting.status))) + } + } + + def automaticallyAssignPresenter(outGW: OutMsgRouter, liveMeeting: LiveMeeting): Unit = { + val meetingId = liveMeeting.props.meetingProp.intId + for { + moderator <- Users2x.findModerator(liveMeeting.users2x) + newPresenter <- Users2x.makePresenter(liveMeeting.users2x, moderator.intId) + } yield { + sendPresenterAssigned(outGW, meetingId, newPresenter.intId, newPresenter.name, newPresenter.name) + } + } + + def sendPresenterAssigned(outGW: OutMsgRouter, meetingId: String, intId: String, name: String, assignedBy: String): Unit = { + def event = MsgBuilder.buildPresenterAssignedEvtMsg(meetingId, intId, name, assignedBy) + outGW.send(event) + } + + def endMeeting(outGW: OutMsgRouter, liveMeeting: LiveMeeting, reason: String): Unit = { + def buildMeetingEndingEvtMsg(meetingId: String): BbbCommonEnvCoreMsg = { + val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, meetingId, "not-used") + val envelope = BbbCoreEnvelope(MeetingEndingEvtMsg.NAME, routing) + val body = MeetingEndingEvtMsgBody(meetingId, reason) + val header = BbbClientMsgHeader(MeetingEndingEvtMsg.NAME, meetingId, "not-used") + val event = MeetingEndingEvtMsg(header, body) + + BbbCommonEnvCoreMsg(envelope, event) + } + + val endingEvent = buildMeetingEndingEvtMsg(liveMeeting.props.meetingProp.intId) + + // Broadcast users the meeting will end + outGW.send(endingEvent) + + MeetingStatus2x.meetingHasEnded(liveMeeting.status) + + def buildMeetingEndedEvtMsg(meetingId: String): BbbCommonEnvCoreMsg = { + val routing = collection.immutable.HashMap("sender" -> "bbb-apps-akka") + val envelope = BbbCoreEnvelope(MeetingEndedEvtMsg.NAME, routing) + val body = MeetingEndedEvtMsgBody(meetingId) + val header = BbbCoreBaseHeader(MeetingEndedEvtMsg.NAME) + val event = MeetingEndedEvtMsg(header, body) + + BbbCommonEnvCoreMsg(envelope, event) + } + + val endedEvnt = buildMeetingEndedEvtMsg(liveMeeting.props.meetingProp.intId) + outGW.send(endedEvnt) + } + + def destroyMeeting(eventBus: InternalEventBus, meetingId: String): Unit = { + eventBus.publish(BigBlueButtonEvent(meetingManagerChannel, new DestroyMeetingInternalMsg(meetingId))) + } + + def notifyParentThatBreakoutEnded(eventBus: InternalEventBus, liveMeeting: LiveMeeting): Unit = { + if (liveMeeting.props.meetingProp.isBreakout) { + eventBus.publish(BigBlueButtonEvent( + liveMeeting.props.breakoutProps.parentId, + new BreakoutRoomEndedInternalMsg(liveMeeting.props.meetingProp.intId) + )) + } + } + + def ejectAllUsersFromVoiceConf(outGW: OutMsgRouter, liveMeeting: LiveMeeting): Unit = { + val event = MsgBuilder.buildEjectAllFromVoiceConfMsg(liveMeeting.props.meetingProp.intId, liveMeeting.props.voiceProp.voiceConf) + outGW.send(event) + } + + def sendEndMeetingDueToExpiry(reason: String, eventBus: InternalEventBus, outGW: OutMsgRouter, liveMeeting: LiveMeeting): Unit = { + endMeeting(outGW, liveMeeting, reason) + notifyParentThatBreakoutEnded(eventBus, liveMeeting) + ejectAllUsersFromVoiceConf(outGW, liveMeeting) + destroyMeeting(eventBus, liveMeeting.props.meetingProp.intId) + } + + def sendEndMeetingDueToExpiry2(reason: String, eventBus: InternalEventBus, outGW: OutMsgRouter, liveMeeting: LiveMeeting): Unit = { + val meetingId = liveMeeting.props.meetingProp.intId + + val endMeetingEvt = buildMeetingEndingEvtMsg(reason, meetingId) + outGW.send(endMeetingEvt) + + val endedEvt = buildMeetingEndedEvtMsg(meetingId) + outGW.send(endedEvt) + + if (liveMeeting.props.meetingProp.isBreakout) { + eventBus.publish(BigBlueButtonEvent( + liveMeeting.props.breakoutProps.parentId, + new BreakoutRoomEndedInternalMsg(meetingId) + )) + } + + val event = MsgBuilder.buildEjectAllFromVoiceConfMsg(meetingId, liveMeeting.props.voiceProp.voiceConf) + outGW.send(event) + + eventBus.publish(BigBlueButtonEvent(meetingManagerChannel, new DestroyMeetingInternalMsg(meetingId))) + + MeetingStatus2x.meetingHasEnded(liveMeeting.status) + } + + def buildMeetingEndingEvtMsg(reason: String, meetingId: String): BbbCommonEnvCoreMsg = { + val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, meetingId, "not-used") + val envelope = BbbCoreEnvelope(MeetingEndingEvtMsg.NAME, routing) + val body = MeetingEndingEvtMsgBody(meetingId, reason) + val header = BbbClientMsgHeader(MeetingEndingEvtMsg.NAME, meetingId, "not-used") + val event = MeetingEndingEvtMsg(header, body) + + BbbCommonEnvCoreMsg(envelope, event) + } + + def buildMeetingEndedEvtMsg(meetingId: String): BbbCommonEnvCoreMsg = { + val routing = collection.immutable.HashMap("sender" -> "bbb-apps-akka") + val envelope = BbbCoreEnvelope(MeetingEndedEvtMsg.NAME, routing) + val body = MeetingEndedEvtMsgBody(meetingId) + val header = BbbCoreBaseHeader(MeetingEndedEvtMsg.NAME) + val event = MeetingEndedEvtMsg(header, body) + + BbbCommonEnvCoreMsg(envelope, event) + } +} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/LiveMeeting.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/LiveMeeting.scala index 0c8a257d4774e0ea7f997b5b488266ee4972398c..7330004088d0b1625b6862c97e3cdb97b39c2de1 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/LiveMeeting.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/LiveMeeting.scala @@ -1,58 +1,30 @@ package org.bigbluebutton.core.running -import java.util.concurrent.TimeUnit - import org.bigbluebutton.common2.domain.DefaultProps import org.bigbluebutton.core.api._ import org.bigbluebutton.core.apps._ -import org.bigbluebutton.core.domain.Meeting3x import org.bigbluebutton.core.models._ import org.bigbluebutton.core2.MeetingStatus2x -class LiveMeeting(val props: DefaultProps, - val status: MeetingStatus2x, +class LiveMeeting( + val props: DefaultProps, + val status: MeetingStatus2x, val screenshareModel: ScreenshareModel, - val chatModel: ChatModel, - val layoutModel: LayoutModel, - val layouts: Layouts, - val registeredUsers: RegisteredUsers, - val polls: Polls, // 2x - val pollModel: PollModel, // 1.1x - val wbModel: WhiteboardModel, - val presModel: PresentationModel, - val breakoutRooms: BreakoutRooms, - val captionModel: CaptionModel, - val notesModel: SharedNotesModel, - val webcams: Webcams, - val voiceUsers: VoiceUsers, - val users2x: Users2x, - val guestsWaiting: GuestsWaiting) { - - def hasMeetingEnded(): Boolean = { - MeetingStatus2x.hasMeetingEnded(status) - } - - def startCheckingIfWeNeedToEndVoiceConf() { - if (Users2x.numUsers(users2x) == 0 && !props.meetingProp.isBreakout) { - MeetingStatus2x.lastWebUserLeft(status) - } - } - - def sendTimeRemainingNotice() { - val now = timeNowInSeconds - - if (props.durationProps.duration > 0 && (((MeetingStatus2x.startedOn(status) + props.durationProps.duration) - now) < 15)) { - // log.warning("MEETING WILL END IN 15 MINUTES!!!!") - } - } - - def timeNowInMinutes(): Long = { - TimeUnit.NANOSECONDS.toMinutes(System.nanoTime()) - } - - def timeNowInSeconds(): Long = { - TimeUnit.NANOSECONDS.toSeconds(System.nanoTime()) - } + val chatModel: ChatModel, + val layoutModel: LayoutModel, + val layouts: Layouts, + val registeredUsers: RegisteredUsers, + val polls: Polls, // 2x + val wbModel: WhiteboardModel, + val presModel: PresentationModel, + val breakoutRooms: BreakoutRooms, + val captionModel: CaptionModel, + val notesModel: SharedNotesModel, + val webcams: Webcams, + val voiceUsers: VoiceUsers, + val users2x: Users2x, + val guestsWaiting: GuestsWaiting +) { def lockLayout(lock: Boolean) { MeetingStatus2x.lockLayout(status, lock) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala index 39c96ffd709e3a9fe05968fe73f9aa0417df3b5b..69458586dc6ab6cc77c74e42b0ccf327795f6e4b 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala @@ -1,400 +1,375 @@ -package org.bigbluebutton.core.running - -import java.io.{ PrintWriter, StringWriter } -//import java.util.concurrent.TimeUnit - -import akka.actor._ -import akka.actor.SupervisorStrategy.Resume -import org.bigbluebutton.common2.domain.DefaultProps -import org.bigbluebutton.core._ -import org.bigbluebutton.core.api._ -import org.bigbluebutton.core.apps._ -import org.bigbluebutton.core.apps.caption.CaptionApp2x -import org.bigbluebutton.core.apps.chat.ChatApp2x -import org.bigbluebutton.core.apps.screenshare.ScreenshareApp2x -import org.bigbluebutton.core.apps.presentation.PresentationApp2x -import org.bigbluebutton.core.apps.meeting._ -import org.bigbluebutton.core.apps.users.UsersApp2x -import org.bigbluebutton.core.apps.sharednotes.SharedNotesApp2x -import org.bigbluebutton.core.bus._ -import org.bigbluebutton.core.models._ -import org.bigbluebutton.core2.MeetingStatus2x -import org.bigbluebutton.core2.message.handlers._ -import org.bigbluebutton.core2.message.handlers.users._ -import org.bigbluebutton.core2.message.handlers.meeting._ -import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.apps.breakout._ -import org.bigbluebutton.core.apps.polls._ -import org.bigbluebutton.core.apps.voice._ - -import scala.concurrent.duration._ -import org.bigbluebutton.core2.testdata.FakeTestData -import org.bigbluebutton.core.apps.layout.LayoutApp2x -import org.bigbluebutton.core.apps.meeting.SyncGetMeetingInfoRespMsgHdlr - -object MeetingActor { - def props(props: DefaultProps, - eventBus: IncomingEventBus, - outGW: OutMessageGateway, liveMeeting: LiveMeeting): Props = - Props(classOf[MeetingActor], props, eventBus, outGW, liveMeeting) -} - -class MeetingActor(val props: DefaultProps, - val eventBus: IncomingEventBus, - val outGW: OutMessageGateway, - val liveMeeting: LiveMeeting) - extends BaseMeetingActor - with GuestsApp - with LayoutApp2x - with VoiceApp2x - with PollApp2x - with BreakoutApp2x - with UsersApp2x - - with PresentationApp - with WhiteboardApp - with PermisssionCheck - with UserBroadcastCamStartMsgHdlr - with UserJoinMeetingReqMsgHdlr - with UserBroadcastCamStopMsgHdlr - with UserConnectedToGlobalAudioMsgHdlr - with UserDisconnectedFromGlobalAudioMsgHdlr - with MuteAllExceptPresentersCmdMsgHdlr - with MuteMeetingCmdMsgHdlr - with IsMeetingMutedReqMsgHdlr - with MuteUserCmdMsgHdlr - with EjectUserFromVoiceCmdMsgHdlr - with EndMeetingSysCmdMsgHdlr - with DestroyMeetingSysCmdMsgHdlr - with SendTimeRemainingUpdateHdlr - with SyncGetMeetingInfoRespMsgHdlr { - - override val supervisorStrategy = OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 minute) { - case e: Exception => { - val sw: StringWriter = new StringWriter() - sw.write("An exception has been thrown on MeetingActor, exception message [" + e.getMessage() + "] (full stacktrace below)\n") - e.printStackTrace(new PrintWriter(sw)) - log.error(sw.toString()) - Resume - } - } - - /** - * Put the internal message injector into another actor so this - * actor is easy to test. - */ - var actorMonitor = context.actorOf(MeetingActorInternal.props(props, eventBus, outGW), - "actorMonitor-" + props.meetingProp.intId) - - /** Subscribe to meeting and voice events. **/ - eventBus.subscribe(actorMonitor, props.meetingProp.intId) - eventBus.subscribe(actorMonitor, props.voiceProp.voiceConf) - eventBus.subscribe(actorMonitor, props.screenshareProps.screenshareConf) - - val presentationApp2x = new PresentationApp2x(liveMeeting, outGW = outGW) - val screenshareApp2x = new ScreenshareApp2x(liveMeeting, outGW = outGW) - val captionApp2x = new CaptionApp2x(liveMeeting, outGW = outGW) - val sharedNotesApp2x = new SharedNotesApp2x(liveMeeting, outGW = outGW) - val chatApp2x = new ChatApp2x(liveMeeting, outGW = outGW) - - /*******************************************************************/ - //object FakeTestData extends FakeTestData - //FakeTestData.createFakeUsers(liveMeeting) - /*******************************************************************/ - - def receive = { - //============================= - // 2x messages - case msg: BbbCommonEnvCoreMsg => handleBbbCommonEnvCoreMsg(msg) - - // Handling RegisterUserReqMsg as it is forwarded from BBBActor and - // its type is not BbbCommonEnvCoreMsg - case m: RegisterUserReqMsg => handleRegisterUserReqMsg(m) - case m: GetAllMeetingsReqMsg => handleGetAllMeetingsReqMsg(m) - - // Meeting - case m: DestroyMeetingSysCmdMsg => handleDestroyMeetingSysCmdMsg(m) - - //====================================== - - //======================================= - // old messages - case msg: MonitorNumberOfUsers => handleMonitorNumberOfUsers(msg) - - case msg: AllowUserToShareDesktop => handleAllowUserToShareDesktop(msg) - case msg: InitializeMeeting => handleInitializeMeeting(msg) - case msg: ExtendMeetingDuration => handleExtendMeetingDuration(msg) - case msg: SendTimeRemainingUpdate => handleSendTimeRemainingUpdate(msg) - - // Screenshare - case msg: DeskShareGetDeskShareInfoRequest => handleDeskShareGetDeskShareInfoRequest(msg) - - // Guest - case msg: GetGuestPolicy => handleGetGuestPolicy(msg) - case msg: SetGuestPolicy => handleSetGuestPolicy(msg) - - case _ => // do nothing - } - - private def handleBbbCommonEnvCoreMsg(msg: BbbCommonEnvCoreMsg): Unit = { - - msg.core match { - // Users - case m: ValidateAuthTokenReqMsg => handleValidateAuthTokenReqMsg(m) - case m: UserJoinMeetingReqMsg => handleUserJoinMeetingReqMsg(m) - case m: UserLeaveReqMsg => handleUserLeaveReqMsg(m) - case m: UserBroadcastCamStartMsg => handleUserBroadcastCamStartMsg(m) - case m: UserBroadcastCamStopMsg => handleUserBroadcastCamStopMsg(m) - case m: UserJoinedVoiceConfEvtMsg => handleUserJoinedVoiceConfEvtMsg(m) - case m: MeetingActivityResponseCmdMsg => handleMeetingActivityResponseCmdMsg(m) - case m: LogoutAndEndMeetingCmdMsg => handleLogoutAndEndMeetingCmdMsg(m) - case m: SetRecordingStatusCmdMsg => handleSetRecordingStatusCmdMsg(m) - case m: GetRecordingStatusReqMsg => handleGetRecordingStatusReqMsg(m) - case m: ChangeUserEmojiCmdMsg => handleChangeUserEmojiCmdMsg(m) - case m: EjectUserFromMeetingCmdMsg => handleEjectUserFromMeetingCmdMsg(m) - - // Whiteboard - case m: SendCursorPositionPubMsg => handleSendCursorPositionPubMsg(m) - case m: ClearWhiteboardPubMsg => handleClearWhiteboardPubMsg(m) - case m: UndoWhiteboardPubMsg => handleUndoWhiteboardPubMsg(m) - case m: ModifyWhiteboardAccessPubMsg => handleModifyWhiteboardAccessPubMsg(m) - case m: GetWhiteboardAccessReqMsg => handleGetWhiteboardAccessReqMsg(m) - case m: SendWhiteboardAnnotationPubMsg => handleSendWhiteboardAnnotationPubMsg(m) - case m: GetWhiteboardAnnotationsReqMsg => handleGetWhiteboardAnnotationsReqMsg(m) - - // Poll - case m: StartPollReqMsg => handleStartPollReqMsg(m) - case m: StartCustomPollReqMsg => handleStartCustomPollReqMsg(m) - case m: StopPollReqMsg => handleStopPollReqMsg(m) - case m: ShowPollResultReqMsg => handleShowPollResultReqMsg(m) - case m: HidePollResultReqMsg => handleHidePollResultReqMsg(m) - case m: GetCurrentPollReqMsg => handleGetCurrentPollReqMsg(m) - case m: RespondToPollReqMsg => handleRespondToPollReqMsg(m) - - // Breakout - case m: BreakoutRoomsListMsg => handleBreakoutRoomsListMsg(m) - case m: CreateBreakoutRoomsCmdMsg => handleCreateBreakoutRoomsCmdMsg(m) - case m: EndAllBreakoutRoomsMsg => handleEndAllBreakoutRoomsMsg(m) - case m: RequestBreakoutJoinURLReqMsg => handleRequestBreakoutJoinURLReqMsg(m) - case m: BreakoutRoomCreatedMsg => handleBreakoutRoomCreatedMsg(m) - case m: BreakoutRoomEndedMsg => handleBreakoutRoomEndedMsg(m) - case m: BreakoutRoomUsersUpdateMsg => handleBreakoutRoomUsersUpdateMsg(m) - case m: SendBreakoutUsersUpdateMsg => handleSendBreakoutUsersUpdateMsg(m) - case m: TransferUserToMeetingRequestMsg => handleTransferUserToMeetingRequestMsg(m) - - // Voice - case m: UserLeftVoiceConfEvtMsg => handleUserLeftVoiceConfEvtMsg(m) - case m: UserMutedInVoiceConfEvtMsg => handleUserMutedInVoiceConfEvtMsg(m) - case m: UserTalkingInVoiceConfEvtMsg => handleUserTalkingInVoiceConfEvtMsg(m) - case m: RecordingStartedVoiceConfEvtMsg => handleRecordingStartedVoiceConfEvtMsg(m) - case m: MuteUserCmdMsg => handleMuteUserCmdMsg(m) - case m: MuteAllExceptPresentersCmdMsg => handleMuteAllExceptPresentersCmdMsg(m) - case m: EjectUserFromVoiceCmdMsg => handleEjectUserFromVoiceCmdMsg(m) - case m: IsMeetingMutedReqMsg => handleIsMeetingMutedReqMsg(m) - case m: MuteMeetingCmdMsg => handleMuteMeetingCmdMsg(m) - case m: UserConnectedToGlobalAudioMsg => handleUserConnectedToGlobalAudioMsg(m) - case m: UserDisconnectedFromGlobalAudioMsg => handleUserDisconnectedFromGlobalAudioMsg(m) - - // Layout - case m: GetCurrentLayoutReqMsg => handleGetCurrentLayoutReqMsg(m) - case m: LockLayoutMsg => handleLockLayoutMsg(m) - case m: BroadcastLayoutMsg => handleBroadcastLayoutMsg(m) - - // Presentation - case m: SetCurrentPresentationPubMsg => presentationApp2x.handleSetCurrentPresentationPubMsg(m) - case m: GetPresentationInfoReqMsg => presentationApp2x.handleGetPresentationInfoReqMsg(m) - case m: SetCurrentPagePubMsg => presentationApp2x.handleSetCurrentPagePubMsg(m) - case m: ResizeAndMovePagePubMsg => presentationApp2x.handleResizeAndMovePagePubMsg(m) - case m: RemovePresentationPubMsg => presentationApp2x.handleRemovePresentationPubMsg(m) - case m: PreuploadedPresentationsSysPubMsg => presentationApp2x.handlePreuploadedPresentationsPubMsg(m) - case m: PresentationConversionUpdateSysPubMsg => presentationApp2x.handlePresentationConversionUpdatePubMsg(m) - case m: PresentationPageCountErrorSysPubMsg => presentationApp2x.handlePresentationPageCountErrorPubMsg(m) - case m: PresentationPageGeneratedSysPubMsg => presentationApp2x.handlePresentationPageGeneratedPubMsg(m) - case m: PresentationConversionCompletedSysPubMsg => presentationApp2x.handlePresentationConversionCompletedPubMsg(m) - case m: AssignPresenterReqMsg => handlePresenterChange(m) - - // Caption - case m: EditCaptionHistoryPubMsg => captionApp2x.handleEditCaptionHistoryPubMsg(m) - case m: UpdateCaptionOwnerPubMsg => captionApp2x.handleUpdateCaptionOwnerPubMsg(m) - case m: SendCaptionHistoryReqMsg => captionApp2x.handleSendCaptionHistoryReqMsg(m) - - // SharedNotes - case m: GetSharedNotesPubMsg => sharedNotesApp2x.handleGetSharedNotesPubMsg(m) - case m: SyncSharedNotePubMsg => sharedNotesApp2x.handleSyncSharedNotePubMsg(m) - case m: UpdateSharedNoteReqMsg => sharedNotesApp2x.handleUpdateSharedNoteReqMsg(m) - case m: CreateSharedNoteReqMsg => sharedNotesApp2x.handleCreateSharedNoteReqMsg(m) - case m: DestroySharedNoteReqMsg => sharedNotesApp2x.handleDestroySharedNoteReqMsg(m) - - // Guests - case m: GetGuestsWaitingApprovalReqMsg => handleGetGuestsWaitingApprovalReqMsg(m) - case m: SetGuestPolicyMsg => handleSetGuestPolicyMsg(m) - case m: GuestsWaitingApprovedMsg => handleGuestsWaitingApprovedMsg(m) - - // Chat - case m: GetChatHistoryReqMsg => chatApp2x.handleGetChatHistoryReqMsg(m) - case m: SendPublicMessagePubMsg => chatApp2x.handleSendPublicMessagePubMsg(m) - case m: SendPrivateMessagePubMsg => chatApp2x.handleSendPrivateMessagePubMsg(m) - case m: ClearPublicChatHistoryPubMsg => chatApp2x.handleClearPublicChatHistoryPubMsg(m) - - // Screenshare - case m: ScreenshareStartedVoiceConfEvtMsg => screenshareApp2x.handleScreenshareStartedVoiceConfEvtMsg(m) - case m: ScreenshareStoppedVoiceConfEvtMsg => screenshareApp2x.handleScreenshareStoppedVoiceConfEvtMsg(m) - case m: ScreenshareRtmpBroadcastStartedVoiceConfEvtMsg => screenshareApp2x.handleScreenshareRtmpBroadcastStartedVoiceConfEvtMsg(m) - case m: ScreenshareRtmpBroadcastStoppedVoiceConfEvtMsg => screenshareApp2x.handleScreenshareRtmpBroadcastStoppedVoiceConfEvtMsg(m) - - case _ => log.warning("***** Cannot handle " + msg.envelope.name) - } - } - - def handleGetAllMeetingsReqMsg(msg: GetAllMeetingsReqMsg): Unit = { - // sync all meetings - handleSyncGetMeetingInfoRespMsg(liveMeeting.props) - - // sync all users - handleSyncGetUsersMeetingRespMsg() - - // sync all presentations - presentationApp2x.handleSyncGetPresentationInfoRespMsg() - - // TODO send all chat - // TODO send all lock settings - // TODO send all screen sharing info - } - - def handlePresenterChange(msg: AssignPresenterReqMsg): Unit = { - // Stop poll if one is running as presenter left - handleStopPollReqMsg(msg.header.userId) - - // switch user presenter status for old and new presenter - handleAssignPresenterReqMsg(msg) - - // TODO stop current screen sharing session (initiated by the old presenter) - - } - - def handleDeskShareGetDeskShareInfoRequest(msg: DeskShareGetDeskShareInfoRequest): Unit = { - - log.info("handleDeskShareGetDeskShareInfoRequest: " + msg.conferenceName + "isBroadcasting=" - + ScreenshareModel.isBroadcastingRTMP(liveMeeting.screenshareModel) + " URL:" + - ScreenshareModel.getRTMPBroadcastingUrl(liveMeeting.screenshareModel)) - - if (ScreenshareModel.isBroadcastingRTMP(liveMeeting.screenshareModel)) { - // if the meeting has an ongoing WebRTC Deskshare session, send a notification - //outGW.send(new DeskShareNotifyASingleViewer(props.meetingProp.intId, msg.requesterID, - // DeskshareModel.getRTMPBroadcastingUrl(liveMeeting.deskshareModel), - // DeskshareModel.getDesktopShareVideoWidth(liveMeeting.deskshareModel), - // DeskshareModel.getDesktopShareVideoHeight(liveMeeting.deskshareModel), true)) - } - } - - def handleGetGuestPolicy(msg: GetGuestPolicy) { - // outGW.send(new GetGuestPolicyReply(msg.meetingID, props.recordProp.record, - // msg.requesterID, MeetingStatus2x.getGuestPolicy(liveMeeting.status).toString())) - } - - def handleSetGuestPolicy(msg: SetGuestPolicy) { - // MeetingStatus2x.setGuestPolicy(liveMeeting.status, msg.policy) - // MeetingStatus2x.setGuestPolicySetBy(liveMeeting.status, msg.setBy) - // outGW.send(new GuestPolicyChanged(msg.meetingID, props.recordProp.record, - // MeetingStatus2x.getGuestPolicy(liveMeeting.status).toString())) - } - - def handleAllowUserToShareDesktop(msg: AllowUserToShareDesktop): Unit = { - Users2x.findPresenter(liveMeeting.users2x) match { - case Some(curPres) => { - val allowed = msg.userID equals (curPres.intId) - // outGW.send(AllowUserToShareDesktopOut(msg.meetingID, msg.userID, allowed)) - } - case None => // do nothing - } - } - - def handleMonitorNumberOfUsers(msg: MonitorNumberOfUsers) { - monitorNumberOfWebUsers() - monitorNumberOfUsers() - } - - def monitorNumberOfWebUsers() { - - def buildEjectAllFromVoiceConfMsg(meetingId: String, voiceConf: String): BbbCommonEnvCoreMsg = { - val routing = collection.immutable.HashMap("sender" -> "bbb-apps-akka") - val envelope = BbbCoreEnvelope(EjectAllFromVoiceConfMsg.NAME, routing) - val body = EjectAllFromVoiceConfMsgBody(voiceConf) - val header = BbbCoreHeaderWithMeetingId(EjectAllFromVoiceConfMsg.NAME, meetingId) - val event = EjectAllFromVoiceConfMsg(header, body) - - BbbCommonEnvCoreMsg(envelope, event) - } - - if (Users2x.numUsers(liveMeeting.users2x) == 0 && - MeetingStatus2x.lastWebUserLeftOn(liveMeeting.status) > 0) { - if (liveMeeting.timeNowInMinutes - MeetingStatus2x.lastWebUserLeftOn(liveMeeting.status) > 2) { - log.info("Empty meeting. Ejecting all users from voice. meetingId={}", props.meetingProp.intId) - val event = buildEjectAllFromVoiceConfMsg(props.meetingProp.intId, props.voiceProp.voiceConf) - outGW.send(event) - } - } - } - - def monitorNumberOfUsers() { - val hasUsers = Users2x.numUsers(liveMeeting.users2x) != 0 - // TODO: We could use a better control over this message to send it just when it really matters :) - eventBus.publish(BigBlueButtonEvent(props.meetingProp.intId, UpdateMeetingExpireMonitor(props.meetingProp.intId, hasUsers))) - } - - def handleExtendMeetingDuration(msg: ExtendMeetingDuration) { - - } - - def startRecordingIfAutoStart() { - if (props.recordProp.record && !MeetingStatus2x.isRecording(liveMeeting.status) && - props.recordProp.autoStartRecording && Users2x.numUsers(liveMeeting.users2x) == 1) { - log.info("Auto start recording. meetingId={}", props.meetingProp.intId) - MeetingStatus2x.recordingStarted(liveMeeting.status) - - def buildRecordingStatusChangedEvtMsg(meetingId: String, userId: String, recording: Boolean): BbbCommonEnvCoreMsg = { - val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, meetingId, userId) - val envelope = BbbCoreEnvelope(RecordingStatusChangedEvtMsg.NAME, routing) - val body = RecordingStatusChangedEvtMsgBody(recording, userId) - val header = BbbClientMsgHeader(RecordingStatusChangedEvtMsg.NAME, meetingId, userId) - val event = RecordingStatusChangedEvtMsg(header, body) - - BbbCommonEnvCoreMsg(envelope, event) - } - - val event = buildRecordingStatusChangedEvtMsg(liveMeeting.props.meetingProp.intId, - "system", MeetingStatus2x.isRecording(liveMeeting.status)) - outGW.send(event) - - } - } - - def stopAutoStartedRecording() { - if (props.recordProp.record && MeetingStatus2x.isRecording(liveMeeting.status) && - props.recordProp.autoStartRecording && Users2x.numUsers(liveMeeting.users2x) == 0) { - log.info("Last web user left. Auto stopping recording. meetingId={}", props.meetingProp.intId) - MeetingStatus2x.recordingStopped(liveMeeting.status) - - def buildRecordingStatusChangedEvtMsg(meetingId: String, userId: String, recording: Boolean): BbbCommonEnvCoreMsg = { - val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, meetingId, userId) - val envelope = BbbCoreEnvelope(RecordingStatusChangedEvtMsg.NAME, routing) - val body = RecordingStatusChangedEvtMsgBody(recording, userId) - val header = BbbClientMsgHeader(RecordingStatusChangedEvtMsg.NAME, meetingId, userId) - val event = RecordingStatusChangedEvtMsg(header, body) - - BbbCommonEnvCoreMsg(envelope, event) - } - - val event = buildRecordingStatusChangedEvtMsg(liveMeeting.props.meetingProp.intId, - "system", MeetingStatus2x.isRecording(liveMeeting.status)) - outGW.send(event) - - } - } - - def record(msg: BbbCoreMsg): Unit = { - if (liveMeeting.props.recordProp.record) { - outGW.record(msg) - } - } -} +package org.bigbluebutton.core.running + +import java.io.{ PrintWriter, StringWriter } + +import org.bigbluebutton.core.apps.users._ +import org.bigbluebutton.core.domain.{ MeetingExpiryTracker, MeetingInactivityTracker, MeetingState2x } +import org.bigbluebutton.core.util.TimeUtil +//import java.util.concurrent.TimeUnit + +import akka.actor._ +import akka.actor.SupervisorStrategy.Resume +import org.bigbluebutton.common2.domain.DefaultProps +import org.bigbluebutton.core._ +import org.bigbluebutton.core.api._ +import org.bigbluebutton.core.apps._ +import org.bigbluebutton.core.apps.caption.CaptionApp2x +import org.bigbluebutton.core.apps.chat.ChatApp2x +import org.bigbluebutton.core.apps.screenshare.ScreenshareApp2x +import org.bigbluebutton.core.apps.presentation.PresentationApp2x +import org.bigbluebutton.core.apps.meeting._ +import org.bigbluebutton.core.apps.users.UsersApp2x +import org.bigbluebutton.core.apps.sharednotes.SharedNotesApp2x +import org.bigbluebutton.core.apps.whiteboard.WhiteboardApp2x +import org.bigbluebutton.core.bus._ +import org.bigbluebutton.core.models._ +import org.bigbluebutton.core2.MeetingStatus2x +import org.bigbluebutton.core2.message.handlers._ +import org.bigbluebutton.core2.message.handlers.meeting._ +import org.bigbluebutton.common2.msgs._ +import org.bigbluebutton.core.apps.breakout._ +import org.bigbluebutton.core.apps.polls._ +import org.bigbluebutton.core.apps.voice._ +import scala.concurrent.duration._ +import org.bigbluebutton.core2.testdata.FakeTestData +import org.bigbluebutton.core.apps.layout.LayoutApp2x +import org.bigbluebutton.core.apps.meeting.SyncGetMeetingInfoRespMsgHdlr + +object MeetingActor { + def props( + props: DefaultProps, + eventBus: InternalEventBus, + outGW: OutMsgRouter, + liveMeeting: LiveMeeting + ): Props = + Props(classOf[MeetingActor], props, eventBus, outGW, liveMeeting) +} + +class MeetingActor( + val props: DefaultProps, + val eventBus: InternalEventBus, + val outGW: OutMsgRouter, + val liveMeeting: LiveMeeting +) + extends BaseMeetingActor + with GuestsApp + with LayoutApp2x + with VoiceApp2x + with PollApp2x + with BreakoutApp2x + with UsersApp2x + with WhiteboardApp2x + + with PermisssionCheck + with UserBroadcastCamStartMsgHdlr + with UserJoinMeetingReqMsgHdlr + with UserBroadcastCamStopMsgHdlr + with UserConnectedToGlobalAudioMsgHdlr + with UserDisconnectedFromGlobalAudioMsgHdlr + with MuteAllExceptPresentersCmdMsgHdlr + with MuteMeetingCmdMsgHdlr + with IsMeetingMutedReqMsgHdlr + with MuteUserCmdMsgHdlr + with EjectUserFromVoiceCmdMsgHdlr + with EndMeetingSysCmdMsgHdlr + with DestroyMeetingSysCmdMsgHdlr + with SendTimeRemainingUpdateHdlr + with SyncGetMeetingInfoRespMsgHdlr { + + override val supervisorStrategy = OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 minute) { + case e: Exception => { + val sw: StringWriter = new StringWriter() + sw.write("An exception has been thrown on MeetingActor, exception message [" + e.getMessage() + "] (full stacktrace below)\n") + e.printStackTrace(new PrintWriter(sw)) + log.error(sw.toString()) + Resume + } + } + + /** + * Put the internal message injector into another actor so this + * actor is easy to test. + */ + var actorMonitor = context.actorOf( + MeetingActorAudit.props(props, eventBus, outGW), + "actorMonitor-" + props.meetingProp.intId + ) + + val presentationApp2x = new PresentationApp2x(liveMeeting, outGW) + val screenshareApp2x = new ScreenshareApp2x(liveMeeting, outGW) + val captionApp2x = new CaptionApp2x(liveMeeting, outGW) + val sharedNotesApp2x = new SharedNotesApp2x(liveMeeting, outGW) + val chatApp2x = new ChatApp2x(liveMeeting, outGW) + val usersApp = new UsersApp(liveMeeting, outGW, eventBus) + + val expiryTrackerHelper = new MeetingExpiryTrackerHelper(liveMeeting, outGW, eventBus) + + val inactivityTracker = new MeetingInactivityTracker( + props.durationProps.maxInactivityTimeoutMinutes, + props.durationProps.warnMinutesBeforeMax, + lastActivityTimestamp = TimeUtil.timeNowInSeconds(), + warningSent = false, + warningSentOnTimestamp = 0L + ) + + val expiryTracker = new MeetingExpiryTracker( + startedOn = TimeUtil.timeNowInSeconds(), + userHasJoined = false, + lastUserLeftOn = None, + durationInMinutes = props.durationProps.duration, + meetingExpireIfNoUserJoinedInMinutes = props.durationProps.meetingExpireIfNoUserJoinedInMinutes, + meetingExpireWhenLastUserLeftInMinutes = props.durationProps.meetingExpireWhenLastUserLeftInMinutes + ) + + var state = new MeetingState2x(inactivityTracker, expiryTracker) + + /*******************************************************************/ + //object FakeTestData extends FakeTestData + //FakeTestData.createFakeUsers(liveMeeting) + /*******************************************************************/ + + def receive = { + //============================= + // 2x messages + case msg: BbbCommonEnvCoreMsg => handleBbbCommonEnvCoreMsg(msg) + + // Handling RegisterUserReqMsg as it is forwarded from BBBActor and + // its type is not BbbCommonEnvCoreMsg + case m: RegisterUserReqMsg => usersApp.handleRegisterUserReqMsg(m) + case m: GetAllMeetingsReqMsg => handleGetAllMeetingsReqMsg(m) + + // Meeting + case m: DestroyMeetingSysCmdMsg => handleDestroyMeetingSysCmdMsg(m) + + //====================================== + + //======================================= + // old messages + case msg: MonitorNumberOfUsersInternalMsg => handleMonitorNumberOfUsers(msg) + + case msg: ExtendMeetingDuration => handleExtendMeetingDuration(msg) + case msg: SendTimeRemainingUpdate => state = handleSendTimeRemainingUpdate(msg, state) + + // Screenshare + case msg: DeskShareGetDeskShareInfoRequest => handleDeskShareGetDeskShareInfoRequest(msg) + + case _ => // do nothing + } + + private def handleBbbCommonEnvCoreMsg(msg: BbbCommonEnvCoreMsg): Unit = { + state = MeetingInactivityTracker.updateLastActivityTimestamp(state, TimeUtil.timeNowInSeconds()) + + msg.core match { + // Users + case m: ValidateAuthTokenReqMsg => + state = usersApp.handleValidateAuthTokenReqMsg(m, state) + case m: UserJoinMeetingReqMsg => + state = handleUserJoinMeetingReqMsg(m, state) + case m: UserLeaveReqMsg => + state = handleUserLeaveReqMsg(m, state) + case m: UserBroadcastCamStartMsg => handleUserBroadcastCamStartMsg(m) + case m: UserBroadcastCamStopMsg => handleUserBroadcastCamStopMsg(m) + case m: UserJoinedVoiceConfEvtMsg => handleUserJoinedVoiceConfEvtMsg(m) + case m: MeetingActivityResponseCmdMsg => + state = usersApp.handleMeetingActivityResponseCmdMsg(m, state) + case m: LogoutAndEndMeetingCmdMsg => usersApp.handleLogoutAndEndMeetingCmdMsg(m) + case m: SetRecordingStatusCmdMsg => usersApp.handleSetRecordingStatusCmdMsg(m) + case m: GetRecordingStatusReqMsg => usersApp.handleGetRecordingStatusReqMsg(m) + case m: ChangeUserEmojiCmdMsg => handleChangeUserEmojiCmdMsg(m) + case m: EjectUserFromMeetingCmdMsg => usersApp.handleEjectUserFromMeetingCmdMsg(m) + case m: GetUsersMeetingReqMsg => usersApp.handleGetUsersMeetingReqMsg(m) + + // Whiteboard + case m: SendCursorPositionPubMsg => handleSendCursorPositionPubMsg(m) + case m: ClearWhiteboardPubMsg => handleClearWhiteboardPubMsg(m) + case m: UndoWhiteboardPubMsg => handleUndoWhiteboardPubMsg(m) + case m: ModifyWhiteboardAccessPubMsg => handleModifyWhiteboardAccessPubMsg(m) + case m: GetWhiteboardAccessReqMsg => handleGetWhiteboardAccessReqMsg(m) + case m: SendWhiteboardAnnotationPubMsg => handleSendWhiteboardAnnotationPubMsg(m) + case m: GetWhiteboardAnnotationsReqMsg => handleGetWhiteboardAnnotationsReqMsg(m) + + // Poll + case m: StartPollReqMsg => handleStartPollReqMsg(m) + case m: StartCustomPollReqMsg => handleStartCustomPollReqMsg(m) + case m: StopPollReqMsg => handleStopPollReqMsg(m) + case m: ShowPollResultReqMsg => handleShowPollResultReqMsg(m) + case m: HidePollResultReqMsg => handleHidePollResultReqMsg(m) + case m: GetCurrentPollReqMsg => handleGetCurrentPollReqMsg(m) + case m: RespondToPollReqMsg => handleRespondToPollReqMsg(m) + + // Breakout + case m: BreakoutRoomsListMsg => handleBreakoutRoomsListMsg(m) + case m: CreateBreakoutRoomsCmdMsg => handleCreateBreakoutRoomsCmdMsg(m) + case m: EndAllBreakoutRoomsMsg => handleEndAllBreakoutRoomsMsg(m) + case m: RequestBreakoutJoinURLReqMsg => handleRequestBreakoutJoinURLReqMsg(m) + case m: BreakoutRoomCreatedMsg => handleBreakoutRoomCreatedMsg(m) + case m: BreakoutRoomEndedMsg => handleBreakoutRoomEndedMsg(m) + case m: BreakoutRoomUsersUpdateMsg => handleBreakoutRoomUsersUpdateMsg(m) + case m: SendBreakoutUsersUpdateMsg => handleSendBreakoutUsersUpdateMsg(m) + case m: TransferUserToMeetingRequestMsg => handleTransferUserToMeetingRequestMsg(m) + + // Voice + case m: UserLeftVoiceConfEvtMsg => handleUserLeftVoiceConfEvtMsg(m) + case m: UserMutedInVoiceConfEvtMsg => handleUserMutedInVoiceConfEvtMsg(m) + case m: UserTalkingInVoiceConfEvtMsg => handleUserTalkingInVoiceConfEvtMsg(m) + case m: RecordingStartedVoiceConfEvtMsg => handleRecordingStartedVoiceConfEvtMsg(m) + case m: MuteUserCmdMsg => handleMuteUserCmdMsg(m) + case m: MuteAllExceptPresentersCmdMsg => handleMuteAllExceptPresentersCmdMsg(m) + case m: EjectUserFromVoiceCmdMsg => handleEjectUserFromVoiceCmdMsg(m) + case m: IsMeetingMutedReqMsg => handleIsMeetingMutedReqMsg(m) + case m: MuteMeetingCmdMsg => handleMuteMeetingCmdMsg(m) + case m: UserConnectedToGlobalAudioMsg => handleUserConnectedToGlobalAudioMsg(m) + case m: UserDisconnectedFromGlobalAudioMsg => handleUserDisconnectedFromGlobalAudioMsg(m) + + // Layout + case m: GetCurrentLayoutReqMsg => handleGetCurrentLayoutReqMsg(m) + case m: LockLayoutMsg => handleLockLayoutMsg(m) + case m: BroadcastLayoutMsg => handleBroadcastLayoutMsg(m) + + // Presentation + case m: SetCurrentPresentationPubMsg => presentationApp2x.handleSetCurrentPresentationPubMsg(m) + case m: GetPresentationInfoReqMsg => presentationApp2x.handleGetPresentationInfoReqMsg(m) + case m: SetCurrentPagePubMsg => presentationApp2x.handleSetCurrentPagePubMsg(m) + case m: ResizeAndMovePagePubMsg => presentationApp2x.handleResizeAndMovePagePubMsg(m) + case m: RemovePresentationPubMsg => presentationApp2x.handleRemovePresentationPubMsg(m) + case m: PreuploadedPresentationsSysPubMsg => presentationApp2x.handlePreuploadedPresentationsPubMsg(m) + case m: PresentationConversionUpdateSysPubMsg => presentationApp2x.handlePresentationConversionUpdatePubMsg(m) + case m: PresentationPageCountErrorSysPubMsg => presentationApp2x.handlePresentationPageCountErrorPubMsg(m) + case m: PresentationPageGeneratedSysPubMsg => presentationApp2x.handlePresentationPageGeneratedPubMsg(m) + case m: PresentationConversionCompletedSysPubMsg => presentationApp2x.handlePresentationConversionCompletedPubMsg(m) + case m: AssignPresenterReqMsg => handlePresenterChange(m) + + // Caption + case m: EditCaptionHistoryPubMsg => captionApp2x.handleEditCaptionHistoryPubMsg(m) + case m: UpdateCaptionOwnerPubMsg => captionApp2x.handleUpdateCaptionOwnerPubMsg(m) + case m: SendCaptionHistoryReqMsg => captionApp2x.handleSendCaptionHistoryReqMsg(m) + + // SharedNotes + case m: GetSharedNotesPubMsg => sharedNotesApp2x.handleGetSharedNotesPubMsg(m) + case m: SyncSharedNotePubMsg => sharedNotesApp2x.handleSyncSharedNotePubMsg(m) + case m: UpdateSharedNoteReqMsg => sharedNotesApp2x.handleUpdateSharedNoteReqMsg(m) + case m: CreateSharedNoteReqMsg => sharedNotesApp2x.handleCreateSharedNoteReqMsg(m) + case m: DestroySharedNoteReqMsg => sharedNotesApp2x.handleDestroySharedNoteReqMsg(m) + + // Guests + case m: GetGuestsWaitingApprovalReqMsg => handleGetGuestsWaitingApprovalReqMsg(m) + case m: SetGuestPolicyCmdMsg => handleSetGuestPolicyMsg(m) + case m: GuestsWaitingApprovedMsg => handleGuestsWaitingApprovedMsg(m) + case m: GetGuestPolicyReqMsg => handleGetGuestPolicyReqMsg(m) + // Chat + case m: GetChatHistoryReqMsg => chatApp2x.handleGetChatHistoryReqMsg(m) + case m: SendPublicMessagePubMsg => chatApp2x.handleSendPublicMessagePubMsg(m) + case m: SendPrivateMessagePubMsg => chatApp2x.handleSendPrivateMessagePubMsg(m) + case m: ClearPublicChatHistoryPubMsg => chatApp2x.handleClearPublicChatHistoryPubMsg(m) + + // Screenshare + case m: ScreenshareStartedVoiceConfEvtMsg => screenshareApp2x.handleScreenshareStartedVoiceConfEvtMsg(m) + case m: ScreenshareStoppedVoiceConfEvtMsg => screenshareApp2x.handleScreenshareStoppedVoiceConfEvtMsg(m) + case m: ScreenshareRtmpBroadcastStartedVoiceConfEvtMsg => screenshareApp2x.handleScreenshareRtmpBroadcastStartedVoiceConfEvtMsg(m) + case m: ScreenshareRtmpBroadcastStoppedVoiceConfEvtMsg => screenshareApp2x.handleScreenshareRtmpBroadcastStoppedVoiceConfEvtMsg(m) + case m: GetScreenshareStatusReqMsg => screenshareApp2x.handleGetScreenshareStatusReqMsg(m) + + case _ => log.warning("***** Cannot handle " + msg.envelope.name) + } + } + + def handleGetAllMeetingsReqMsg(msg: GetAllMeetingsReqMsg): Unit = { + // sync all meetings + handleSyncGetMeetingInfoRespMsg(liveMeeting.props) + + // sync all users + usersApp.handleSyncGetUsersMeetingRespMsg() + + // sync all presentations + presentationApp2x.handleSyncGetPresentationInfoRespMsg() + + // TODO send all chat + // TODO send all lock settings + // TODO send all screen sharing info + } + + def handlePresenterChange(msg: AssignPresenterReqMsg): Unit = { + // Stop poll if one is running as presenter left + handleStopPollReqMsg(msg.header.userId) + + // switch user presenter status for old and new presenter + usersApp.handleAssignPresenterReqMsg(msg) + + // TODO stop current screen sharing session (initiated by the old presenter) + + } + + def handleDeskShareGetDeskShareInfoRequest(msg: DeskShareGetDeskShareInfoRequest): Unit = { + + log.info("handleDeskShareGetDeskShareInfoRequest: " + msg.conferenceName + "isBroadcasting=" + + ScreenshareModel.isBroadcastingRTMP(liveMeeting.screenshareModel) + " URL:" + + ScreenshareModel.getRTMPBroadcastingUrl(liveMeeting.screenshareModel)) + + if (ScreenshareModel.isBroadcastingRTMP(liveMeeting.screenshareModel)) { + // if the meeting has an ongoing WebRTC Deskshare session, send a notification + //outGW.send(new DeskShareNotifyASingleViewer(props.meetingProp.intId, msg.requesterID, + // DeskshareModel.getRTMPBroadcastingUrl(liveMeeting.deskshareModel), + // DeskshareModel.getDesktopShareVideoWidth(liveMeeting.deskshareModel), + // DeskshareModel.getDesktopShareVideoHeight(liveMeeting.deskshareModel), true)) + } + } + + def handleMonitorNumberOfUsers(msg: MonitorNumberOfUsersInternalMsg) { + state = expiryTrackerHelper.processMeetingInactivityAudit(state) + state = expiryTrackerHelper.processMeetingExpiryAudit(state) + } + + def handleExtendMeetingDuration(msg: ExtendMeetingDuration) { + + } + + def startRecordingIfAutoStart() { + if (props.recordProp.record && !MeetingStatus2x.isRecording(liveMeeting.status) && + props.recordProp.autoStartRecording && Users2x.numUsers(liveMeeting.users2x) == 1) { + log.info("Auto start recording. meetingId={}", props.meetingProp.intId) + MeetingStatus2x.recordingStarted(liveMeeting.status) + + def buildRecordingStatusChangedEvtMsg(meetingId: String, userId: String, recording: Boolean): BbbCommonEnvCoreMsg = { + val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, meetingId, userId) + val envelope = BbbCoreEnvelope(RecordingStatusChangedEvtMsg.NAME, routing) + val body = RecordingStatusChangedEvtMsgBody(recording, userId) + val header = BbbClientMsgHeader(RecordingStatusChangedEvtMsg.NAME, meetingId, userId) + val event = RecordingStatusChangedEvtMsg(header, body) + + BbbCommonEnvCoreMsg(envelope, event) + } + + val event = buildRecordingStatusChangedEvtMsg( + liveMeeting.props.meetingProp.intId, + "system", MeetingStatus2x.isRecording(liveMeeting.status) + ) + outGW.send(event) + + } + } + + def stopAutoStartedRecording() { + if (props.recordProp.record && MeetingStatus2x.isRecording(liveMeeting.status) && + props.recordProp.autoStartRecording && Users2x.numUsers(liveMeeting.users2x) == 0) { + log.info("Last web user left. Auto stopping recording. meetingId={}", props.meetingProp.intId) + MeetingStatus2x.recordingStopped(liveMeeting.status) + + def buildRecordingStatusChangedEvtMsg(meetingId: String, userId: String, recording: Boolean): BbbCommonEnvCoreMsg = { + val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, meetingId, userId) + val envelope = BbbCoreEnvelope(RecordingStatusChangedEvtMsg.NAME, routing) + val body = RecordingStatusChangedEvtMsgBody(recording, userId) + val header = BbbClientMsgHeader(RecordingStatusChangedEvtMsg.NAME, meetingId, userId) + val event = RecordingStatusChangedEvtMsg(header, body) + + BbbCommonEnvCoreMsg(envelope, event) + } + + val event = buildRecordingStatusChangedEvtMsg( + liveMeeting.props.meetingProp.intId, + "system", MeetingStatus2x.isRecording(liveMeeting.status) + ) + outGW.send(event) + + } + } +} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActorAudit.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActorAudit.scala new file mode 100755 index 0000000000000000000000000000000000000000..bc6ffc98e0b93db5e3f46b6a0656b02b6d155762 --- /dev/null +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActorAudit.scala @@ -0,0 +1,86 @@ +package org.bigbluebutton.core.running + +import java.io.{ PrintWriter, StringWriter } + +import akka.actor.Actor +import akka.actor.ActorLogging +import akka.actor.Props +import akka.actor.OneForOneStrategy +import akka.actor.SupervisorStrategy.Resume +import scala.concurrent.duration._ +import org.bigbluebutton.SystemConfiguration +import org.bigbluebutton.common2.domain.DefaultProps +import org.bigbluebutton.core.api._ +import org.bigbluebutton.core.bus.{ BigBlueButtonEvent, InternalEventBus } +import scala.concurrent.ExecutionContext.Implicits.global + +object MeetingActorAudit { + def props( + props: DefaultProps, + eventBus: InternalEventBus, + outGW: OutMsgRouter + ): Props = + Props(classOf[MeetingActorAudit], props, eventBus, outGW) +} + +// This actor is an internal audit actor for each meeting actor that +// periodically sends messages to the meeting actor +class MeetingActorAudit( + val props: DefaultProps, + val eventBus: InternalEventBus, val outGW: OutMsgRouter +) + extends Actor with ActorLogging with SystemConfiguration with AuditHelpers { + + object AuditMonitorInternalMsg + + override val supervisorStrategy = OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 minute) { + case e: Exception => { + val sw: StringWriter = new StringWriter() + sw.write("An exception has been thrown on MeetingActorInternal, exception message [" + e.getMessage() + "] (full stacktrace below)\n") + e.printStackTrace(new PrintWriter(sw)) + log.error(sw.toString()) + Resume + } + } + + private val MonitorFrequency = 10 seconds + + context.system.scheduler.schedule(5 seconds, MonitorFrequency, self, AuditMonitorInternalMsg) + + // Query to get voice conference users + getUsersInVoiceConf(props, outGW) + + if (props.meetingProp.isBreakout) { + // This is a breakout room. Inform our parent meeting that we have been successfully created. + /**TODO Need to add a 2.0 notification somehow */ + log.error("****** MeetingActorInternal still needs to be fixed with 2.0 breakout messages ******") + /*eventBus.publish(BigBlueButtonEvent( + props.breakoutProps.parentId, + BreakoutRoomCreated(props.breakoutProps.parentId, props.meetingProp.intId))) + */ + } + + def receive = { + case AuditMonitorInternalMsg => handleMonitor() + } + + def handleMonitor() { + handleMonitorNumberOfWebUsers() + } + + def handleMonitorNumberOfWebUsers() { + eventBus.publish(BigBlueButtonEvent(props.meetingProp.intId, MonitorNumberOfUsersInternalMsg(props.meetingProp.intId))) + + // Trigger updating users of time remaining on meeting. + eventBus.publish(BigBlueButtonEvent(props.meetingProp.intId, SendTimeRemainingUpdate(props.meetingProp.intId))) + + if (props.meetingProp.isBreakout) { + /**TODO Need to add a 2.0 notification somehow */ + log.error("******* MeetingActorInternal still needs to be fixed with 2.0 breakout messages *******") + // This is a breakout room. Update the main meeting with list of users in this breakout room. + //eventBus.publish(BigBlueButtonEvent(props.meetingProp.intId, SendBreakoutUsersUpdate(props.meetingProp.intId))) + } + + } + +} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActorInternal.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActorInternal.scala deleted file mode 100755 index f61a0d803b6f46d54dfe6262a6a37250c17bb1fd..0000000000000000000000000000000000000000 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActorInternal.scala +++ /dev/null @@ -1,314 +0,0 @@ -package org.bigbluebutton.core.running - -import java.io.{ PrintWriter, StringWriter } - -import akka.actor.Actor -import akka.actor.ActorLogging -import akka.actor.Props -import akka.actor.OneForOneStrategy -import akka.actor.SupervisorStrategy.Resume - -import scala.concurrent.duration._ -import org.bigbluebutton.SystemConfiguration -import org.bigbluebutton.common2.domain.DefaultProps -import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway -import org.bigbluebutton.core.api._ -import org.bigbluebutton.core.bus.{ BigBlueButtonEvent, IncomingEventBus } - -import scala.concurrent.ExecutionContext.Implicits.global -import scala.concurrent.duration.{ Deadline, FiniteDuration } - -object MeetingActorInternal { - def props(props: DefaultProps, - eventBus: IncomingEventBus, - outGW: OutMessageGateway): Props = - Props(classOf[MeetingActorInternal], props, eventBus, outGW) -} - -// This actor is an internal audit actor for each meeting actor that -// periodically sends messages to the meeting actor -class MeetingActorInternal(val props: DefaultProps, - val eventBus: IncomingEventBus, val outGW: OutMessageGateway) - extends Actor with ActorLogging with SystemConfiguration { - - override val supervisorStrategy = OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 minute) { - case e: Exception => { - val sw: StringWriter = new StringWriter() - sw.write("An exception has been thrown on MeetingActorInternal, exception message [" + e.getMessage() + "] (full stacktrace below)\n") - e.printStackTrace(new PrintWriter(sw)) - log.error(sw.toString()) - Resume - } - } - - private def getInactivityDeadline(): Int = { - val time = getMetadata(Metadata.INACTIVITY_DEADLINE, props.metadataProp.metadata) match { - case Some(result) => result.asInstanceOf[Int] - case None => inactivityDeadline - } - log.debug("InactivityDeadline: {} seconds", time) - time - } - - private def getInactivityTimeLeft(): Int = { - val time = getMetadata(Metadata.INACTIVITY_TIMELEFT, props.metadataProp.metadata) match { - case Some(result) => result.asInstanceOf[Int] - case None => inactivityTimeLeft - } - log.debug("InactivityTimeLeft: {} seconds", time) - time - } - - private def getExpireNeverJoined(): Int = { - val time = expireNeverJoined - log.debug("ExpireNeverJoined: {} seconds", time) - time - } - - private def getExpireLastUserLeft(): Int = { - val time = expireLastUserLeft - log.debug("ExpireLastUserLeft: {} seconds", time) - time - } - - private val MonitorFrequency = 10 seconds - - private val InactivityDeadline = FiniteDuration(getInactivityDeadline(), "seconds") - private val InactivityTimeLeft = FiniteDuration(getInactivityTimeLeft(), "seconds") - private var inactivity = InactivityDeadline.fromNow - private var inactivityWarning: Option[Deadline] = None - - private val ExpireMeetingDuration = FiniteDuration(props.durationProps.duration, "minutes") - private val ExpireMeetingNeverJoined = FiniteDuration(getExpireNeverJoined(), "seconds") - private val ExpireMeetingLastUserLeft = FiniteDuration(getExpireLastUserLeft(), "seconds") - private var meetingExpire: Option[Deadline] = Some(ExpireMeetingNeverJoined.fromNow) - // Zero minutes means the meeting has no duration control - private var meetingDuration: Option[Deadline] = if (ExpireMeetingDuration > (0 minutes)) Some(ExpireMeetingDuration.fromNow) else None - - context.system.scheduler.schedule(5 seconds, MonitorFrequency, self, "Monitor") - - // Query to get voice conference users - def build(meetingId: String): BbbCommonEnvCoreMsg = { - val routing = collection.immutable.HashMap("sender" -> "bbb-apps-akka") - val envelope = BbbCoreEnvelope(GetUsersInVoiceConfSysMsg.NAME, routing) - val body = GetUsersInVoiceConfSysMsgBody(props.voiceProp.voiceConf) - val header = BbbCoreHeaderWithMeetingId(GetUsersInVoiceConfSysMsg.NAME, meetingId) - val event = GetUsersInVoiceConfSysMsg(header, body) - - BbbCommonEnvCoreMsg(envelope, event) - } - - val event = build(props.meetingProp.intId) - outGW.send(event) - - if (props.meetingProp.isBreakout) { - // This is a breakout room. Inform our parent meeting that we have been successfully created. - eventBus.publish(BigBlueButtonEvent( - props.breakoutProps.parentId, - BreakoutRoomCreated(props.breakoutProps.parentId, props.meetingProp.intId))) - } - - def receive = { - case "Monitor" => handleMonitor() - case msg: UpdateMeetingExpireMonitor => handleUpdateMeetingExpireMonitor(msg) - case msg: Object => handleMessage(msg) - } - - def handleMonitor() { - // handleMonitorActivity() - handleMonitorNumberOfWebUsers() - // handleMonitorExpiration() - } - - def handleMessage(msg: Object) { - if (isMeetingActivity(msg)) { - notifyActivity() - } - } - - def handleMonitorNumberOfWebUsers() { - eventBus.publish(BigBlueButtonEvent(props.meetingProp.intId, MonitorNumberOfUsers(props.meetingProp.intId))) - - // Trigger updating users of time remaining on meeting. - eventBus.publish(BigBlueButtonEvent(props.meetingProp.intId, SendTimeRemainingUpdate(props.meetingProp.intId))) - - if (props.meetingProp.isBreakout) { - // This is a breakout room. Update the main meeting with list of users in this breakout room. - eventBus.publish(BigBlueButtonEvent(props.meetingProp.intId, SendBreakoutUsersUpdate(props.meetingProp.intId))) - } - - } - - private def handleMonitorActivity() { - - inactivityWarning match { - case Some(iw) => - if (inactivity.isOverdue() && iw.isOverdue()) { - log.info("Closing meeting {} due to inactivity for {} seconds", props.meetingProp.intId, InactivityDeadline.toSeconds) - updateInactivityMonitors() - eventBus.publish(BigBlueButtonEvent(props.meetingProp.intId, EndMeeting(props.meetingProp.intId))) - // Or else make sure to send only one warning message - } - case None => - if (inactivity.isOverdue()) { - log.info("Sending inactivity warning to meeting {}", props.meetingProp.intId) - - def build(meetingId: String, timeLeftInSec: Long): BbbCommonEnvCoreMsg = { - val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, meetingId, "not-used") - val envelope = BbbCoreEnvelope(MeetingInactivityWarningEvtMsg.NAME, routing) - val body = MeetingInactivityWarningEvtMsgBody(timeLeftInSec) - val header = BbbClientMsgHeader(MeetingInactivityWarningEvtMsg.NAME, meetingId, "not-used") - val event = MeetingInactivityWarningEvtMsg(header, body) - - BbbCommonEnvCoreMsg(envelope, event) - } - - val event = build(props.meetingProp.intId, InactivityTimeLeft.toSeconds) - outGW.send(event) - - // We add 5 seconds so clients will have enough time to process the message - inactivityWarning = Some((InactivityTimeLeft + (5 seconds)).fromNow) - } - } - - } - - private def handleMonitorExpiration() { - for { - mExpire <- meetingExpire - } yield { - if (mExpire.isOverdue()) { - // User related meeting expiration methods - log.debug("Meeting {} expired. No users", props.meetingProp.intId) - meetingExpire = None - eventBus.publish(BigBlueButtonEvent(props.meetingProp.intId, EndMeeting(props.meetingProp.intId))) - } - } - - for { - mDuration <- meetingDuration - } yield { - if (mDuration.isOverdue()) { - // Default meeting duration - meetingDuration = None - log.debug("Meeting {} expired. Reached it's fixed duration of {}", props.meetingProp.intId, ExpireMeetingDuration.toString()) - eventBus.publish(BigBlueButtonEvent(props.meetingProp.intId, EndMeeting(props.meetingProp.intId))) - } - } - - } - - private def handleUpdateMeetingExpireMonitor(msg: UpdateMeetingExpireMonitor) { - if (msg.hasUser) { - meetingExpire match { - case Some(mExpire) => - log.debug("Meeting has users. Stopping expiration for meeting {}", props.meetingProp.intId) - meetingExpire = None - case None => - // User list is empty. Start this meeting expiration method - log.debug("Meeting has no users. Starting {} expiration for meeting {}", ExpireMeetingLastUserLeft.toString(), props.meetingProp.intId) - meetingExpire = Some(ExpireMeetingLastUserLeft.fromNow) - } - } - } - - private def updateInactivityMonitors() { - inactivity = InactivityDeadline.fromNow - inactivityWarning = None - } - - private def notifyActivity() { - for { - _ <- inactivityWarning - } yield { - val event = buildMeetingIsActiveEvtMsg(props.meetingProp.intId) - outGW.send(event) - } - - updateInactivityMonitors() - } - - def buildMeetingIsActiveEvtMsg(meetingId: String): BbbCommonEnvCoreMsg = { - val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, meetingId, "not-used") - val envelope = BbbCoreEnvelope(MeetingIsActiveEvtMsg.NAME, routing) - val body = MeetingIsActiveEvtMsgBody(meetingId) - val header = BbbClientMsgHeader(MeetingIsActiveEvtMsg.NAME, meetingId, "not-used") - val event = MeetingIsActiveEvtMsg(header, body) - - BbbCommonEnvCoreMsg(envelope, event) - } - - private def handleActivityResponse(msg: ActivityResponse) { - log.info("User endorsed that meeting {} is active", props.meetingProp.intId) - updateInactivityMonitors() - val event = buildMeetingIsActiveEvtMsg(props.meetingProp.intId) - outGW.send(event) - } - - private def isMeetingActivity(msg: Object): Boolean = { - // We need to avoid all internal system's messages - msg match { - case msg: MonitorNumberOfUsers => false - case msg: SendTimeRemainingUpdate => false - case msg: SendBreakoutUsersUpdate => false - case msg: BreakoutRoomCreated => false - case _ => true - } - } - - def getMetadata(key: String, metadata: collection.immutable.Map[String, String]): Option[Object] = { - var value: Option[String] = None - if (metadata.contains(key)) { - value = metadata.get(key) - } - - value match { - case Some(v) => { - key match { - case Metadata.INACTIVITY_DEADLINE => { - // Can be defined between 1 minute to 6 hours - metadataIntegerValueOf(v, 60, 21600) match { - case Some(r) => Some(r.asInstanceOf[Object]) - case None => None - } - } - case Metadata.INACTIVITY_TIMELEFT => { - // Can be defined between 30 seconds to 30 minutes - metadataIntegerValueOf(v, 30, 1800) match { - case Some(r) => Some(r.asInstanceOf[Object]) - case None => None - } - } - case _ => None - } - } - case None => None - } - } - - private def metadataIntegerValueOf(value: String, lowerBound: Int, upperBound: Int): Option[Int] = { - stringToInt(value) match { - case Some(r) => { - if (lowerBound <= r && r <= upperBound) { - Some(r) - } else { - None - } - } - case None => None - } - } - - private def stringToInt(value: String): Option[Int] = { - var result: Option[Int] = None - try { - result = Some(Integer.parseInt(value)) - } catch { - case e: Exception => { - result = None - } - } - result - } -} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingExpiryTrackerHelper.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingExpiryTrackerHelper.scala new file mode 100755 index 0000000000000000000000000000000000000000..831d36af2d2b79da0168f80163e0fd0927cc21fd --- /dev/null +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingExpiryTrackerHelper.scala @@ -0,0 +1,68 @@ +package org.bigbluebutton.core.running + +import akka.actor.ActorContext +import akka.event.Logging +import org.bigbluebutton.common2.msgs._ +import org.bigbluebutton.core.bus.InternalEventBus +import org.bigbluebutton.core.domain.{ MeetingEndReason, MeetingExpiryTracker, MeetingInactivityTracker, MeetingState2x } +import org.bigbluebutton.core.util.TimeUtil + +class MeetingExpiryTrackerHelper( + val liveMeeting: LiveMeeting, + val outGW: OutMsgRouter, + val eventBus: InternalEventBus +)(implicit val context: ActorContext) extends HandlerHelpers { + + val log = Logging(context.system, getClass) + + def processMeetingExpiryAudit(state: MeetingState2x): MeetingState2x = { + val nowInSeconds = TimeUtil.timeNowInSeconds() + + val (expired, reason) = MeetingExpiryTracker.hasMeetingExpired(state, nowInSeconds) + if (expired) { + for { + expireReason <- reason + } yield { + sendEndMeetingDueToExpiry(expireReason, eventBus, outGW, liveMeeting) + } + } + + state + } + + def processMeetingInactivityAudit(state: MeetingState2x): MeetingState2x = { + + val nowInSeconds = TimeUtil.timeNowInSeconds() + if (!MeetingInactivityTracker.hasRecentActivity(state, nowInSeconds)) { + if (MeetingInactivityTracker.isMeetingInactive(state, nowInSeconds)) { + sendEndMeetingDueToExpiry(MeetingEndReason.ENDED_DUE_TO_INACTIVITY, eventBus, outGW, liveMeeting) + state + } else { + if (!MeetingInactivityTracker.warningHasBeenSent(state)) { + warnOfMeetingInactivity(nowInSeconds, state) + MeetingInactivityTracker.setWarningSentAndTimestamp(state, nowInSeconds) + } else { + state + } + } + } else { + state + } + } + + def warnOfMeetingInactivity(nowInSeconds: Long, state: MeetingState2x): Unit = { + val timeLeftSeconds = MeetingInactivityTracker.timeLeftInSeconds(state, nowInSeconds) + val event = buildMeetingInactivityWarningEvtMsg(liveMeeting.props.meetingProp.intId, timeLeftSeconds) + outGW.send(event) + } + + def buildMeetingInactivityWarningEvtMsg(meetingId: String, timeLeftInSec: Long): BbbCommonEnvCoreMsg = { + val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, meetingId, "not-used") + val envelope = BbbCoreEnvelope(MeetingInactivityWarningEvtMsg.NAME, routing) + val body = MeetingInactivityWarningEvtMsgBody(timeLeftInSec) + val header = BbbClientMsgHeader(MeetingInactivityWarningEvtMsg.NAME, meetingId, "not-used") + val event = MeetingInactivityWarningEvtMsg(header, body) + + BbbCommonEnvCoreMsg(envelope, event) + } +} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/OutMsgRouter.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/OutMsgRouter.scala new file mode 100755 index 0000000000000000000000000000000000000000..0571eb7839d843a9dd791365aff816c978123481 --- /dev/null +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/OutMsgRouter.scala @@ -0,0 +1,17 @@ +package org.bigbluebutton.core.running + +import org.bigbluebutton.common2.msgs.{ BbbCommonEnvCoreMsg, UserBroadcastCamStartMsg } +import org.bigbluebutton.core.OutMessageGateway + +class OutMsgRouter(record: Boolean, outGW: OutMessageGateway) { + def send(msg: BbbCommonEnvCoreMsg): Unit = { + outGW.send(msg) + if (record) outGW.record(msg) + } + + private def record(msg: BbbCommonEnvCoreMsg): Unit = { + msg.core match { + case m: UserBroadcastCamStartMsg => outGW.record(msg) + } + } +} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/RunningMeeting.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/RunningMeeting.scala index 4523a62818d86e895b87dc067ca733a78bd4d866..e8d489f002968422b24cd06dd12f248f4e7527da 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/RunningMeeting.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/RunningMeeting.scala @@ -1,7 +1,7 @@ package org.bigbluebutton.core.running import akka.actor.ActorContext -import org.bigbluebutton.common2.domain.{ DefaultProps } +import org.bigbluebutton.common2.domain.DefaultProps import org.bigbluebutton.core.apps._ import org.bigbluebutton.core.bus._ import org.bigbluebutton.core.models._ @@ -10,39 +10,40 @@ import org.bigbluebutton.core2.MeetingStatus2x object RunningMeeting { def apply(props: DefaultProps, outGW: OutMessageGateway, - eventBus: IncomingEventBus)(implicit context: ActorContext) = + eventBus: InternalEventBus)(implicit context: ActorContext) = new RunningMeeting(props, outGW, eventBus)(context) } -class RunningMeeting(val props: DefaultProps, val outGW: OutMessageGateway, - val eventBus: IncomingEventBus)(implicit val context: ActorContext) { - - val chatModel = new ChatModel() - val layoutModel = new LayoutModel() - val layouts = new Layouts() - val pollModel = new PollModel() - val wbModel = new WhiteboardModel() - val presModel = new PresentationModel() - val breakoutRooms = new BreakoutRooms() - val captionModel = new CaptionModel() - val notesModel = new SharedNotesModel() - val registeredUsers = new RegisteredUsers - val meetingStatux2x = new MeetingStatus2x - val webcams = new Webcams - val voiceUsers = new VoiceUsers - val users2x = new Users2x - val polls2x = new Polls - val guestsWaiting = new GuestsWaiting - val deskshareModel = new ScreenshareModel +class RunningMeeting(val props: DefaultProps, outGW: OutMessageGateway, + eventBus: InternalEventBus)(implicit val context: ActorContext) { + + private val chatModel = new ChatModel() + private val layoutModel = new LayoutModel() + private val layouts = new Layouts() + private val wbModel = new WhiteboardModel() + private val presModel = new PresentationModel() + private val breakoutRooms = new BreakoutRooms() + private val captionModel = new CaptionModel() + private val notesModel = new SharedNotesModel() + private val registeredUsers = new RegisteredUsers + private val meetingStatux2x = new MeetingStatus2x + private val webcams = new Webcams + private val voiceUsers = new VoiceUsers + private val users2x = new Users2x + private val polls2x = new Polls + private val guestsWaiting = new GuestsWaiting + private val deskshareModel = new ScreenshareModel // meetingModel.setGuestPolicy(props.usersProp.guestPolicy) // We extract the meeting handlers into this class so it is // easy to test. - val liveMeeting = new LiveMeeting(props, meetingStatux2x, deskshareModel, chatModel, layoutModel, layouts, - registeredUsers, polls2x, pollModel, wbModel, presModel, breakoutRooms, captionModel, + private val liveMeeting = new LiveMeeting(props, meetingStatux2x, deskshareModel, chatModel, layoutModel, layouts, + registeredUsers, polls2x, wbModel, presModel, breakoutRooms, captionModel, notesModel, webcams, voiceUsers, users2x, guestsWaiting) - val actorRef = context.actorOf(MeetingActor.props(props, eventBus, outGW, liveMeeting), props.meetingProp.intId) + val outMsgRouter = new OutMsgRouter(props.recordProp.record, outGW) + + val actorRef = context.actorOf(MeetingActor.props(props, eventBus, outMsgRouter, liveMeeting), props.meetingProp.intId) } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/util/Model1x2xConverter.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/util/Model1x2xConverter.scala index 6ca69757e7454572a0c5a275820a3480363ca8a6..2374bdfe837b1b934f6933c37305861ed1457be6 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/util/Model1x2xConverter.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/util/Model1x2xConverter.scala @@ -12,7 +12,7 @@ object Model1x2xConverter { } def defaultUserVO(intId: String, extId: String, name: String, role: String, guest: Boolean, authed: Boolean, - waitingForAcceptance: Boolean, lockStatus: Boolean, vu: VoiceUserVO): UserVO = { + waitingForAcceptance: Boolean, lockStatus: Boolean, vu: VoiceUserVO): UserVO = { new UserVO(intId, extId, name, role, guest, authed, waitingForAcceptance = waitingForAcceptance, emojiStatus = "none", presenter = false, hasStream = false, locked = lockStatus, diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/util/TimeUtil.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/util/TimeUtil.scala new file mode 100755 index 0000000000000000000000000000000000000000..74dfc7688fb1afee323ed3efa8efe8cf2cac6043 --- /dev/null +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/util/TimeUtil.scala @@ -0,0 +1,21 @@ +package org.bigbluebutton.core.util + +import java.util.concurrent.TimeUnit + +object TimeUtil { + + def minutesToMillis(minutes: Long): Long = { + TimeUnit.MINUTES.toMillis(minutes) + } + + def millisToMinutes(millis: Long): Long = { + TimeUnit.MILLISECONDS.toMinutes(millis) + } + + def minutesToSeconds(minutes: Long): Long = { + TimeUnit.MINUTES.toSeconds(minutes) + } + + def timeNowInMinutes(): Long = TimeUnit.NANOSECONDS.toMinutes(System.nanoTime()) + def timeNowInSeconds(): Long = TimeUnit.NANOSECONDS.toSeconds(System.nanoTime()) +} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/FromAkkaAppsMsgSenderActor.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/FromAkkaAppsMsgSenderActor.scala index 1e4ff03f65f4924ad54af2487fdb3ebd5d6cce5d..ac642b4ecbbcdc4f278310ca1fd87c872e976062 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/FromAkkaAppsMsgSenderActor.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/FromAkkaAppsMsgSenderActor.scala @@ -15,7 +15,7 @@ class FromAkkaAppsMsgSenderActor(msgSender: MessageSender) def receive = { case msg: BbbCommonEnvCoreMsg => handleBbbCommonEnvCoreMsg(msg) - case _ => log.warning("Cannot handle message ") + case _ => log.warning("Cannot handle message ") } def handleBbbCommonEnvCoreMsg(msg: BbbCommonEnvCoreMsg): Unit = { @@ -23,8 +23,8 @@ class FromAkkaAppsMsgSenderActor(msgSender: MessageSender) msg.envelope.name match { case SyncGetPresentationInfoRespMsg.NAME => msgSender.send(toHTML5RedisChannel, json) - case SyncGetMeetingInfoRespMsg.NAME => msgSender.send(toHTML5RedisChannel, json) - case SyncGetUsersMeetingRespMsg.NAME => msgSender.send(toHTML5RedisChannel, json) + case SyncGetMeetingInfoRespMsg.NAME => msgSender.send(toHTML5RedisChannel, json) + case SyncGetUsersMeetingRespMsg.NAME => msgSender.send(toHTML5RedisChannel, json) // Sent to FreeSWITCH case ScreenshareStartRtmpBroadcastVoiceConfMsg.NAME => diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/MeetingStatus2x.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/MeetingStatus2x.scala index dc3842d2bdc7311f9d2fc9df6955aadeb907ab24..1bd918e1ca215cd1707b804a86356a82fb5b0b4c 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/MeetingStatus2x.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/MeetingStatus2x.scala @@ -39,9 +39,6 @@ object MeetingStatus2x { def recordingStarted(status: MeetingStatus2x) = status.recording = true def recordingStopped(status: MeetingStatus2x) = status.recording = false def isRecording(status: MeetingStatus2x): Boolean = status.recording - def lastWebUserLeft(status: MeetingStatus2x) = status.lastWebUserLeftOnTimestamp = MeetingStatus2x.timeNowInMinutes - def lastWebUserLeftOn(status: MeetingStatus2x): Long = status.lastWebUserLeftOnTimestamp - def resetLastWebUserLeftOn(status: MeetingStatus2x) = status.lastWebUserLeftOnTimestamp = 0 def setVoiceRecordingFilename(status: MeetingStatus2x, path: String) = status.voiceRecordingFilename = path def getVoiceRecordingFilename(status: MeetingStatus2x): String = status.voiceRecordingFilename def permisionsInitialized(status: MeetingStatus2x): Boolean = status.permissionsInited @@ -57,10 +54,6 @@ object MeetingStatus2x { def timeNowInMinutes(status: MeetingStatus2x): Long = TimeUnit.NANOSECONDS.toMinutes(System.nanoTime()) def timeNowInSeconds(status: MeetingStatus2x): Long = TimeUnit.NANOSECONDS.toSeconds(System.nanoTime()) - def startedOn(status: MeetingStatus2x): Long = status.startedOn - - def timeNowInMinutes(): Long = TimeUnit.NANOSECONDS.toMinutes(System.nanoTime()) - def timeNowInSeconds(): Long = TimeUnit.NANOSECONDS.toSeconds(System.nanoTime()) } class MeetingStatus2x { @@ -75,15 +68,10 @@ class MeetingStatus2x { private var meetingEnded = false private var meetingMuted = false - private var hasLastWebUserLeft = false - private var lastWebUserLeftOnTimestamp: Long = 0 - private var voiceRecordingFilename: String = "" private var extension = new MeetingExtensionProp - private val startedOn = MeetingStatus2x.timeNowInSeconds; - private def startRecordingVoice() { recordingVoice = true } @@ -115,9 +103,7 @@ class MeetingStatus2x { private def recordingStarted() = recording = true private def recordingStopped() = recording = false private def isRecording(): Boolean = recording - private def lastWebUserLeft() = lastWebUserLeftOnTimestamp = MeetingStatus2x.timeNowInMinutes - private def lastWebUserLeftOn(): Long = lastWebUserLeftOnTimestamp - private def resetLastWebUserLeftOn() = lastWebUserLeftOnTimestamp = 0 + private def setVoiceRecordingFilename(path: String) = voiceRecordingFilename = path private def getVoiceRecordingFilename(): String = voiceRecordingFilename private def permisionsInitialized(): Boolean = permissionsInited diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/ChangeLockSettingsInMeetingCmdMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/ChangeLockSettingsInMeetingCmdMsgHdlr.scala index 4ab889bf969bfbf07251eddbdc476fed08325bb1..737793e1e4a51fe878d8f5066fefa87938a6a7c1 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/ChangeLockSettingsInMeetingCmdMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/ChangeLockSettingsInMeetingCmdMsgHdlr.scala @@ -1,23 +1,24 @@ package org.bigbluebutton.core2.message.handlers import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.core.api.Permissions -import org.bigbluebutton.core.running.MeetingActor +import org.bigbluebutton.core.running.{ MeetingActor, OutMsgRouter } trait ChangeLockSettingsInMeetingCmdMsgHdlr { this: MeetingActor => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleSetLockSettings(msg: ChangeLockSettingsInMeetingCmdMsg) { - val settings = Permissions(disableCam = msg.body.disableCam, + val settings = Permissions( + disableCam = msg.body.disableCam, disableMic = msg.body.disableMic, disablePrivChat = msg.body.disablePrivChat, disablePubChat = msg.body.disablePubChat, lockedLayout = msg.body.lockedLayout, lockOnJoin = msg.body.lockOnJoin, - lockOnJoinConfigurable = msg.body.lockOnJoinConfigurable) + lockOnJoinConfigurable = msg.body.lockOnJoinConfigurable + ) if (!liveMeeting.permissionsEqual(settings)) { liveMeeting.newPermissions(settings) @@ -25,11 +26,13 @@ trait ChangeLockSettingsInMeetingCmdMsgHdlr { def build(meetingId: String, userId: String, settings: Permissions, setBy: String): BbbCommonEnvCoreMsg = { val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, meetingId, userId) val envelope = BbbCoreEnvelope(LockSettingsInMeetingChangedEvtMsg.NAME, routing) - val body = LockSettingsInMeetingChangedEvtMsgBody(disableCam = settings.disableCam, + val body = LockSettingsInMeetingChangedEvtMsgBody( + disableCam = settings.disableCam, disableMic = settings.disableMic, disablePrivChat = settings.disablePrivChat, disablePubChat = settings.disablePubChat, lockedLayout = settings.lockedLayout, lockOnJoin = settings.lockOnJoin, lockOnJoinConfigurable = settings.lockOnJoinConfigurable, - setBy) + setBy + ) val header = BbbClientMsgHeader(LockSettingsInMeetingChangedEvtMsg.NAME, meetingId, userId) val event = LockSettingsInMeetingChangedEvtMsg(header, body) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/EjectUserFromVoiceCmdMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/EjectUserFromVoiceCmdMsgHdlr.scala index a17425135efb068aa0dd5ca4c76c821cb531d20f..7260180948251449a495edb588615b777368d197 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/EjectUserFromVoiceCmdMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/EjectUserFromVoiceCmdMsgHdlr.scala @@ -1,15 +1,14 @@ package org.bigbluebutton.core2.message.handlers import org.bigbluebutton.common2.msgs.EjectUserFromVoiceCmdMsg -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.core.models.VoiceUsers -import org.bigbluebutton.core.running.MeetingActor +import org.bigbluebutton.core.running.{ MeetingActor, OutMsgRouter } import org.bigbluebutton.core2.message.senders.MsgBuilder trait EjectUserFromVoiceCmdMsgHdlr { this: MeetingActor => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleEjectUserFromVoiceCmdMsg(msg: EjectUserFromVoiceCmdMsg) { log.info("Received eject user request. meetingId=" + msg.header.meetingId + " userId=" + msg.body.userId) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/IsMeetingMutedReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/IsMeetingMutedReqMsgHdlr.scala index 2acee81600d4b1a8782ba002f34818bb954ec1ab..788f8b296e91eadb67fb016b7dbe0022c2711e47 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/IsMeetingMutedReqMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/IsMeetingMutedReqMsgHdlr.scala @@ -2,13 +2,13 @@ package org.bigbluebutton.core2.message.handlers import org.bigbluebutton.common2.msgs._ import org.bigbluebutton.core.OutMessageGateway -import org.bigbluebutton.core.running.MeetingActor +import org.bigbluebutton.core.running.{ MeetingActor, OutMsgRouter } import org.bigbluebutton.core2.MeetingStatus2x trait IsMeetingMutedReqMsgHdlr { this: MeetingActor => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleIsMeetingMutedReqMsg(msg: IsMeetingMutedReqMsg) { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/MuteAllExceptPresentersCmdMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/MuteAllExceptPresentersCmdMsgHdlr.scala index 5ab771f75de8a5cc6fdd1f6566b015524854f5dd..3f777b271cc5647013d59d09628e1d118a2f0032 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/MuteAllExceptPresentersCmdMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/MuteAllExceptPresentersCmdMsgHdlr.scala @@ -1,16 +1,14 @@ package org.bigbluebutton.core2.message.handlers import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway -import org.bigbluebutton.core.api.{ MeetingMuted, MuteVoiceUser } import org.bigbluebutton.core.models.{ UserState, Users2x, VoiceUserState, VoiceUsers } -import org.bigbluebutton.core.running.MeetingActor +import org.bigbluebutton.core.running.{ MeetingActor, OutMsgRouter } import org.bigbluebutton.core2.MeetingStatus2x trait MuteAllExceptPresentersCmdMsgHdlr { this: MeetingActor => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleMuteAllExceptPresentersCmdMsg(msg: MuteAllExceptPresentersCmdMsg) { if (MeetingStatus2x.isMeetingMuted(liveMeeting.status)) { @@ -30,7 +28,7 @@ trait MuteAllExceptPresentersCmdMsgHdlr { if (!vu.listenOnly) { Users2x.findWithIntId(liveMeeting.users2x, vu.intId) match { case Some(u) => if (!u.presenter) muteUserInVoiceConf(vu) - case None => muteUserInVoiceConf(vu) + case None => muteUserInVoiceConf(vu) } } } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/MuteMeetingCmdMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/MuteMeetingCmdMsgHdlr.scala index b146416c4ab98c95b746f5f65e64e6498e0109e8..9a42885670c59be259fa4e944914f90180a9fc39 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/MuteMeetingCmdMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/MuteMeetingCmdMsgHdlr.scala @@ -3,13 +3,13 @@ package org.bigbluebutton.core2.message.handlers import org.bigbluebutton.common2.msgs._ import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.core.models.{ VoiceUserState, VoiceUsers } -import org.bigbluebutton.core.running.MeetingActor +import org.bigbluebutton.core.running.{ MeetingActor, OutMsgRouter } import org.bigbluebutton.core2.MeetingStatus2x trait MuteMeetingCmdMsgHdlr { this: MeetingActor => - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleMuteMeetingCmdMsg(msg: MuteMeetingCmdMsg) { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/RecordingStartedVoiceConfEvtMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/RecordingStartedVoiceConfEvtMsgHdlr.scala index 06644392d91df5537b69493e15e5afda6e29d093..9e50aded6d9e814d8936ff6c7034e6566553f83f 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/RecordingStartedVoiceConfEvtMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/RecordingStartedVoiceConfEvtMsgHdlr.scala @@ -1,22 +1,21 @@ package org.bigbluebutton.core2.message.handlers import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway -import org.bigbluebutton.core.running.{ BaseMeetingActor, LiveMeeting } +import org.bigbluebutton.core.running.{ BaseMeetingActor, LiveMeeting, OutMsgRouter } import org.bigbluebutton.core2.MeetingStatus2x trait RecordingStartedVoiceConfEvtMsgHdlr { this: BaseMeetingActor => val liveMeeting: LiveMeeting - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleRecordingStartedVoiceConfEvtMsg(msg: RecordingStartedVoiceConfEvtMsg) { if (msg.body.recording) { MeetingStatus2x.setVoiceRecordingFilename(liveMeeting.status, msg.body.stream) def buildVoiceRecordingStartedEvtMsg(meetingId: String, stream: String, timestamp: String, - voiceConf: String): BbbCommonEnvCoreMsg = { + voiceConf: String): BbbCommonEnvCoreMsg = { val routing = collection.immutable.HashMap("sender" -> "bbb-apps-akka") val envelope = BbbCoreEnvelope(VoiceRecordingStartedEvtMsg.NAME, routing) @@ -34,7 +33,7 @@ trait RecordingStartedVoiceConfEvtMsgHdlr { MeetingStatus2x.setVoiceRecordingFilename(liveMeeting.status, "") def buildVoiceRecordingStoppedEvtMsg(meetingId: String, stream: String, timestamp: String, - voiceConf: String): BbbCommonEnvCoreMsg = { + voiceConf: String): BbbCommonEnvCoreMsg = { val routing = collection.immutable.HashMap("sender" -> "bbb-apps-akka") val envelope = BbbCoreEnvelope(VoiceRecordingStoppedEvtMsg.NAME, routing) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/SendTimeRemainingUpdateHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/SendTimeRemainingUpdateHdlr.scala index e55c46571b59ff692d452a676f200424c8166352..cf8b8acac58cc826b007a0cc0e93741fe1047f4b 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/SendTimeRemainingUpdateHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/SendTimeRemainingUpdateHdlr.scala @@ -2,21 +2,23 @@ package org.bigbluebutton.core2.message.handlers import org.bigbluebutton.common2.msgs._ import org.bigbluebutton.core.OutMessageGateway -import org.bigbluebutton.core.api.{ BreakoutRoomsTimeRemainingUpdateOutMessage, MeetingTimeRemainingUpdate, SendTimeRemainingUpdate } +import org.bigbluebutton.core.api.SendTimeRemainingUpdate +import org.bigbluebutton.core.domain.{ MeetingExpiryTracker, MeetingState2x } import org.bigbluebutton.core.models.BreakoutRooms -import org.bigbluebutton.core.running.{ BaseMeetingActor, LiveMeeting } -import org.bigbluebutton.core2.MeetingStatus2x +import org.bigbluebutton.core.running.{ BaseMeetingActor, LiveMeeting, OutMsgRouter } +import org.bigbluebutton.core.util.TimeUtil trait SendTimeRemainingUpdateHdlr { this: BaseMeetingActor => val liveMeeting: LiveMeeting - val outGW: OutMessageGateway + val outGW: OutMsgRouter + + def handleSendTimeRemainingUpdate(msg: SendTimeRemainingUpdate, state: MeetingState2x): MeetingState2x = { - def handleSendTimeRemainingUpdate(msg: SendTimeRemainingUpdate) { if (liveMeeting.props.durationProps.duration > 0) { - val endMeetingTime = MeetingStatus2x.startedOn(liveMeeting.status) + (liveMeeting.props.durationProps.duration * 60) - val timeRemaining = endMeetingTime - liveMeeting.timeNowInSeconds + val endMeetingTime = MeetingExpiryTracker.endMeetingTime(state) + val timeRemaining = endMeetingTime - TimeUtil.timeNowInSeconds def buildMeetingTimeRemainingUpdateEvtMsg(meetingId: String, timeLeftInSec: Long): BbbCommonEnvCoreMsg = { val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, meetingId, "not-used") @@ -34,7 +36,7 @@ trait SendTimeRemainingUpdateHdlr { if (!liveMeeting.props.meetingProp.isBreakout && !BreakoutRooms.getRooms(liveMeeting.breakoutRooms).isEmpty) { val endMeetingTime = BreakoutRooms.breakoutRoomsStartedOn(liveMeeting.breakoutRooms) + (BreakoutRooms.breakoutRoomsdurationInMinutes(liveMeeting.breakoutRooms) * 60) - val timeRemaining = endMeetingTime - liveMeeting.timeNowInSeconds + val timeRemaining = endMeetingTime - TimeUtil.timeNowInSeconds def buildBreakoutRoomsTimeRemainingUpdateEvtMsg(meetingId: String, timeLeftInSec: Long): BbbCommonEnvCoreMsg = { val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, meetingId, "not-used") @@ -53,6 +55,8 @@ trait SendTimeRemainingUpdateHdlr { BreakoutRooms.breakoutRoomsdurationInMinutes(liveMeeting.breakoutRooms, 0) BreakoutRooms.breakoutRoomsStartedOn(liveMeeting.breakoutRooms, 0) } + + state } } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/guests/GetGuestPolicyReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/guests/GetGuestPolicyReqMsgHdlr.scala new file mode 100755 index 0000000000000000000000000000000000000000..16796f5fd22d8a232fb572a5329235899dcb12aa --- /dev/null +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/guests/GetGuestPolicyReqMsgHdlr.scala @@ -0,0 +1,26 @@ +package org.bigbluebutton.core2.message.handlers.guests + +import org.bigbluebutton.common2.msgs._ +import org.bigbluebutton.core.running.{ BaseMeetingActor, LiveMeeting, OutMsgRouter } + +trait GetGuestPolicyReqMsgHdlr { + this: BaseMeetingActor => + + val liveMeeting: LiveMeeting + val outGW: OutMsgRouter + + def handleGetGuestPolicyReqMsg(msg: GetGuestPolicyReqMsg): Unit = { + val event = buildGetGuestPolicyRespMsg(liveMeeting.props.meetingProp.intId, msg.body.requestedBy, + liveMeeting.guestsWaiting.getGuestPolicy().policy) + outGW.send(event) + } + + def buildGetGuestPolicyRespMsg(meetingId: String, userId: String, policy: String): BbbCommonEnvCoreMsg = { + val routing = Routing.addMsgToClientRouting(MessageTypes.DIRECT, meetingId, userId) + val envelope = BbbCoreEnvelope(GetGuestPolicyRespMsg.NAME, routing) + val header = BbbClientMsgHeader(GetGuestPolicyRespMsg.NAME, meetingId, userId) + val body = GetGuestPolicyRespMsgBody(policy) + val event = GetGuestPolicyRespMsg(header, body) + BbbCommonEnvCoreMsg(envelope, event) + } +} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/guests/GetGuestsWaitingApprovalReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/guests/GetGuestsWaitingApprovalReqMsgHdlr.scala index 7a5766e1e37bb8f5c631514e327235a541b4c75f..c80ee993ba948fa84caea49f53fc671a0042e26c 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/guests/GetGuestsWaitingApprovalReqMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/guests/GetGuestsWaitingApprovalReqMsgHdlr.scala @@ -1,25 +1,25 @@ package org.bigbluebutton.core2.message.handlers.guests import org.bigbluebutton.common2.msgs.GetGuestsWaitingApprovalReqMsg -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.core.models.GuestsWaiting -import org.bigbluebutton.core.running.{ BaseMeetingActor, HandlerHelpers, LiveMeeting } +import org.bigbluebutton.core.running.{ BaseMeetingActor, HandlerHelpers, LiveMeeting, OutMsgRouter } import org.bigbluebutton.core2.message.senders.{ MsgBuilder, Sender } trait GetGuestsWaitingApprovalReqMsgHdlr extends HandlerHelpers { this: BaseMeetingActor => val liveMeeting: LiveMeeting - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleGetGuestsWaitingApprovalReqMsg(msg: GetGuestsWaitingApprovalReqMsg): Unit = { val guests = GuestsWaiting.findAll(liveMeeting.guestsWaiting) val event = MsgBuilder.buildGetGuestsWaitingApprovalRespMsg( liveMeeting.props.meetingProp.intId, msg.body.requesterId, - guests) + guests + ) - Sender.send(outGW, event) + outGW.send(event) } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/guests/GuestsWaitingApprovedMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/guests/GuestsWaitingApprovedMsgHdlr.scala index 01526327c7afa0b442a8ca068dbde42b1e1181e4..b028d732f4174f70be2fbfb9f3edfe713006fac8 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/guests/GuestsWaitingApprovedMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/guests/GuestsWaitingApprovedMsgHdlr.scala @@ -1,16 +1,15 @@ package org.bigbluebutton.core2.message.handlers.guests import org.bigbluebutton.common2.msgs.{ GuestApprovedVO, GuestsWaitingApprovedMsg } -import org.bigbluebutton.core.OutMessageGateway import org.bigbluebutton.core.models.{ GuestsWaiting, RegisteredUsers, Roles, Users2x } -import org.bigbluebutton.core.running.{ BaseMeetingActor, HandlerHelpers, LiveMeeting } +import org.bigbluebutton.core.running.{ BaseMeetingActor, HandlerHelpers, LiveMeeting, OutMsgRouter } import org.bigbluebutton.core2.message.senders.{ MsgBuilder, Sender } trait GuestsWaitingApprovedMsgHdlr extends HandlerHelpers { this: BaseMeetingActor => val liveMeeting: LiveMeeting - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleGuestsWaitingApprovedMsg(msg: GuestsWaitingApprovedMsg): Unit = { msg.body.guests foreach { g => @@ -30,10 +29,12 @@ trait GuestsWaitingApprovedMsgHdlr extends HandlerHelpers { RegisteredUsers.setWaitingForApproval(liveMeeting.registeredUsers, u, false) // send message to user that he has been approved } - val event = MsgBuilder.buildGuestApprovedEvtMsg(liveMeeting.props.meetingProp.intId, - g.intId, guest.approved, approvedBy) + val event = MsgBuilder.buildGuestApprovedEvtMsg( + liveMeeting.props.meetingProp.intId, + g.intId, guest.approved, approvedBy + ) - Sender.send(outGW, event) + outGW.send(event) } } @@ -41,9 +42,11 @@ trait GuestsWaitingApprovedMsgHdlr extends HandlerHelpers { def notifyModeratorsOfGuestsApproval(guests: Vector[GuestApprovedVO], approvedBy: String): Unit = { val mods = Users2x.findAll(liveMeeting.users2x).filter(p => p.role == Roles.MODERATOR_ROLE) mods foreach { m => - val event = MsgBuilder.buildGuestsWaitingApprovedEvtMsg(liveMeeting.props.meetingProp.intId, - m.intId, guests, approvedBy) - Sender.send(outGW, event) + val event = MsgBuilder.buildGuestsWaitingApprovedEvtMsg( + liveMeeting.props.meetingProp.intId, + m.intId, guests, approvedBy + ) + outGW.send(event) } } } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/guests/SetGuestPolicyMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/guests/SetGuestPolicyMsgHdlr.scala index 5a02697a5e335489329990e1d648dea98acdce7f..519a08f5ac73083208a6ffbd8409330fcbecae93 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/guests/SetGuestPolicyMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/guests/SetGuestPolicyMsgHdlr.scala @@ -1,25 +1,25 @@ package org.bigbluebutton.core2.message.handlers.guests -import org.bigbluebutton.common2.msgs.SetGuestPolicyMsg -import org.bigbluebutton.core.OutMessageGateway -import org.bigbluebutton.core.models.{ GuestPolicy, GuestPolicyType, GuestWaiting, GuestsWaiting } -import org.bigbluebutton.core.running.{ BaseMeetingActor, HandlerHelpers, LiveMeeting } +import org.bigbluebutton.common2.msgs.SetGuestPolicyCmdMsg +import org.bigbluebutton.core.models.{ GuestPolicy, GuestPolicyType, GuestsWaiting } +import org.bigbluebutton.core.running.{ BaseMeetingActor, LiveMeeting, OutMsgRouter } import org.bigbluebutton.core2.message.senders.{ MsgBuilder, Sender } trait SetGuestPolicyMsgHdlr { this: BaseMeetingActor => val liveMeeting: LiveMeeting - val outGW: OutMessageGateway + val outGW: OutMsgRouter - def handleSetGuestPolicyMsg(msg: SetGuestPolicyMsg): Unit = { + def handleSetGuestPolicyMsg(msg: SetGuestPolicyCmdMsg): Unit = { val newPolicy = msg.body.policy.toUpperCase() if (GuestPolicyType.policyTypes.contains(newPolicy)) { val policy = GuestPolicy(newPolicy, msg.body.setBy) GuestsWaiting.setGuestPolicy(liveMeeting.guestsWaiting, policy) val event = MsgBuilder.buildGuestPolicyChangedEvtMsg( - liveMeeting.props.meetingProp.intId, msg.header.userId, newPolicy, msg.body.setBy) - Sender.send(outGW, event) + liveMeeting.props.meetingProp.intId, msg.header.userId, newPolicy, msg.body.setBy + ) + outGW.send(event) } } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/meeting/DestroyMeetingSysCmdMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/meeting/DestroyMeetingSysCmdMsgHdlr.scala old mode 100644 new mode 100755 index 17486bcb4635b64985cef636b4312fc5e9e11c9c..f9d19aeb1a3178e0994e56123299a931ffbde80c --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/meeting/DestroyMeetingSysCmdMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/meeting/DestroyMeetingSysCmdMsgHdlr.scala @@ -1,23 +1,23 @@ package org.bigbluebutton.core2.message.handlers.meeting import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway -import org.bigbluebutton.core.running.{ BaseMeetingActor, LiveMeeting } -import org.bigbluebutton.core2.MeetingStatus2x +import org.bigbluebutton.core.running.{ BaseMeetingActor, LiveMeeting, OutMsgRouter } import org.bigbluebutton.core2.message.senders.MsgBuilder trait DestroyMeetingSysCmdMsgHdlr { this: BaseMeetingActor => val liveMeeting: LiveMeeting - val outGW: OutMessageGateway + val outGW: OutMsgRouter def handleDestroyMeetingSysCmdMsg(msg: DestroyMeetingSysCmdMsg) { log.info("Handling DestroyMeeting message for meetingId={}", msg.body.meetingId) if (liveMeeting.props.meetingProp.isBreakout) { - log.info("Informing parent meeting {} that a breakout room has been ended {}", - liveMeeting.props.breakoutProps.parentId, liveMeeting.props.meetingProp.intId) + log.info( + "Informing parent meeting {} that a breakout room has been ended {}", + liveMeeting.props.breakoutProps.parentId, liveMeeting.props.meetingProp.intId + ) // send out BreakoutRoomEndedEvtMsg to inform clients the breakout has ended outGW.send(MsgBuilder.buildBreakoutRoomEndedEvtMsg(liveMeeting.props.meetingProp.intId, "not-used", @@ -28,8 +28,10 @@ trait DestroyMeetingSysCmdMsgHdlr { outGW.send(MsgBuilder.buildEndAndKickAllSysMsg(liveMeeting.props.meetingProp.intId, "not-used")) // Eject all users from the voice conference - outGW.send(MsgBuilder.buildEjectAllFromVoiceConfMsg(liveMeeting.props.meetingProp.intId, - liveMeeting.props.voiceProp.voiceConf)) + outGW.send(MsgBuilder.buildEjectAllFromVoiceConfMsg( + liveMeeting.props.meetingProp.intId, + liveMeeting.props.voiceProp.voiceConf + )) // send a system message to force disconnection outGW.send(MsgBuilder.buildDisconnectAllClientsSysMsg(liveMeeting.props.meetingProp.intId)) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/meeting/EndMeetingSysCmdMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/meeting/EndMeetingSysCmdMsgHdlr.scala index 91e543b789b1c9b8be9105b04aff7dae4d856c5c..131d779a382b34b2a7a6bebee94f6ac9413568ac 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/meeting/EndMeetingSysCmdMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/meeting/EndMeetingSysCmdMsgHdlr.scala @@ -1,25 +1,19 @@ package org.bigbluebutton.core2.message.handlers.meeting import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway -import org.bigbluebutton.core.running.{ BaseMeetingActor, LiveMeeting } -import org.bigbluebutton.core2.MeetingStatus2x -import org.bigbluebutton.core2.message.senders.MsgBuilder +import org.bigbluebutton.core.bus.InternalEventBus +import org.bigbluebutton.core.domain.MeetingEndReason +import org.bigbluebutton.core.running.{ BaseMeetingActor, HandlerHelpers, LiveMeeting, OutMsgRouter } -trait EndMeetingSysCmdMsgHdlr { +trait EndMeetingSysCmdMsgHdlr extends HandlerHelpers { this: BaseMeetingActor => val liveMeeting: LiveMeeting - val outGW: OutMessageGateway + val outGW: OutMsgRouter + val eventBus: InternalEventBus def handleEndMeeting(msg: EndMeetingSysCmdMsg) { - // Broadcast users the meeting will end - outGW.send(MsgBuilder.buildMeetingEndingEvtMsg(liveMeeting.props.meetingProp.intId)) - - MeetingStatus2x.meetingHasEnded(liveMeeting.status) - - // Sent from akka-apps to bbb-web to inform about end of meeting - outGW.send(MsgBuilder.buildMeetingEndedEvtMsg(liveMeeting.props.meetingProp.intId)) + sendEndMeetingDueToExpiry(MeetingEndReason.ENDED_FROM_API, eventBus, outGW, liveMeeting) } } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/GetLockSettingsHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/GetLockSettingsHdlr.scala deleted file mode 100755 index 9ba3350fe9d22f56bf786fc0a5f597116eb18b75..0000000000000000000000000000000000000000 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/GetLockSettingsHdlr.scala +++ /dev/null @@ -1,19 +0,0 @@ -package org.bigbluebutton.core2.message.handlers.users - -import org.bigbluebutton.core.OutMessageGateway -import org.bigbluebutton.core.api.{ GetLockSettings, NewPermissionsSetting } -import org.bigbluebutton.core.running.MeetingActor -import org.bigbluebutton.core2.MeetingStatus2x - -trait GetLockSettingsHdlr { - this: MeetingActor => - - val outGW: OutMessageGateway - - def handleGetLockSettings(msg: GetLockSettings) { - - // outGW.send(new NewPermissionsSetting(props.meetingProp.intId, msg.userId, - // MeetingStatus2x.getPermissions(liveMeeting.status), - // Users.getUsers(liveMeeting.users).toArray)) - } -} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/GetUsersHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/GetUsersHdlr.scala deleted file mode 100755 index 402002f6ca04cbd9cc05ed236c98cbf696590ee7..0000000000000000000000000000000000000000 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/GetUsersHdlr.scala +++ /dev/null @@ -1,16 +0,0 @@ -package org.bigbluebutton.core2.message.handlers.users - -import org.bigbluebutton.core.OutMessageGateway -import org.bigbluebutton.core.api.GetUsers -import org.bigbluebutton.core.running.{ HandlerHelpers, MeetingActor } - -trait GetUsersHdlr extends HandlerHelpers { - this: MeetingActor => - - val outGW: OutMessageGateway - - def handleGetUsers(msg: GetUsers): Unit = { - sendAllUsersInMeeting(outGW, msg.requesterID, liveMeeting) - } - -} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/InitLockSettingsHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/InitLockSettingsHdlr.scala deleted file mode 100755 index 7c943ef9d1284a3e949323f6aad7ab975468b256..0000000000000000000000000000000000000000 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/InitLockSettingsHdlr.scala +++ /dev/null @@ -1,19 +0,0 @@ -package org.bigbluebutton.core2.message.handlers.users - -import org.bigbluebutton.core.OutMessageGateway -import org.bigbluebutton.core.api.{ InitLockSettings, PermissionsSettingInitialized } -import org.bigbluebutton.core.running.MeetingActor -import org.bigbluebutton.core2.MeetingStatus2x - -trait InitLockSettingsHdlr { - this: MeetingActor => - - val outGW: OutMessageGateway - - def handleInitLockSettings(msg: InitLockSettings) { - if (!MeetingStatus2x.permisionsInitialized(liveMeeting.status)) { - MeetingStatus2x.initializePermissions(liveMeeting.status) - liveMeeting.newPermissions(msg.settings) - } - } -} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/UserJoinMeetingReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/UserJoinMeetingReqMsgHdlr.scala deleted file mode 100755 index f2ade60ac97eab216c1729f5ff758a99752154df..0000000000000000000000000000000000000000 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/UserJoinMeetingReqMsgHdlr.scala +++ /dev/null @@ -1,18 +0,0 @@ -package org.bigbluebutton.core2.message.handlers.users - -import org.bigbluebutton.common2.msgs.UserJoinMeetingReqMsg -import org.bigbluebutton.core.{ OutMessageGateway } -import org.bigbluebutton.core.running.{ HandlerHelpers, LiveMeeting, BaseMeetingActor } - -trait UserJoinMeetingReqMsgHdlr extends HandlerHelpers { - this: BaseMeetingActor => - - val liveMeeting: LiveMeeting - val outGW: OutMessageGateway - - def handleUserJoinMeetingReqMsg(msg: UserJoinMeetingReqMsg): Unit = { - userJoinMeeting(outGW, msg.body.authToken, liveMeeting) - } - -} - diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/UserJoiningHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/UserJoiningHdlr.scala deleted file mode 100755 index cb7f9a5f1b1459d4d37512645481ed8dcffc0df0..0000000000000000000000000000000000000000 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/UserJoiningHdlr.scala +++ /dev/null @@ -1,49 +0,0 @@ -package org.bigbluebutton.core2.message.handlers.users - -import org.bigbluebutton.common2.domain.VoiceUserVO -import org.bigbluebutton.core.OutMessageGateway -import org.bigbluebutton.core.api._ -import org.bigbluebutton.core.models._ -import org.bigbluebutton.core.running.MeetingActor -import org.bigbluebutton.core2.MeetingStatus2x - -trait UserJoiningHdlr { - this: MeetingActor => - - val outGW: OutMessageGateway - def handleUserJoin(msg: UserJoining): Unit = { - log.debug("Received user joined meeting. metingId=" + props.meetingProp.intId + " userId=" + msg.userID) - - /* - - for { - uvo <- Users.newUser(msg.userID, lockStatus, ru, waitingForAcceptance, vu, liveMeeting.users) - } yield { - log.info("User joined meeting. metingId=" + props.meetingProp.intId + " userId=" + uvo.id + " user=" + uvo) - - if (uvo.guest && MeetingStatus2x.getGuestPolicy(liveMeeting.status) == GuestPolicy.ALWAYS_DENY) { - outGW.send(new GuestAccessDenied(props.meetingProp.intId, props.recordProp.record, uvo.id)) - } else { - outGW.send(new UserJoined(props.meetingProp.intId, props.recordProp.record, uvo)) - outGW.send(new MeetingState(props.meetingProp.intId, props.recordProp.record, uvo.id, - MeetingStatus2x.getPermissions(liveMeeting.status), MeetingStatus2x.isMeetingMuted(liveMeeting.status))) - - if (!waitingForAcceptance) { - // Become presenter if the only moderator - if ((Users.numModerators(liveMeeting.users) == 1) || (Users.hasNoPresenter(liveMeeting.users))) { - if (ru.role == Roles.MODERATOR_ROLE) { - log.info("Assigning presenter to lone moderator. metingId=" + props.meetingProp.intId + " userId=" + uvo.id) - assignNewPresenter(msg.userID, ru.name, msg.userID) - } - } - } else { - log.info("User waiting for acceptance. metingId=" + props.meetingProp.intId + " userId=" + uvo.id) - } - liveMeeting.webUserJoined - startRecordingIfAutoStart() - } - } - */ - - } -} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/ValidateAuthTokenReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/ValidateAuthTokenReqMsgHdlr.scala deleted file mode 100755 index afa5eebcc9b731ff243540f52348f499d4fcf253..0000000000000000000000000000000000000000 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/users/ValidateAuthTokenReqMsgHdlr.scala +++ /dev/null @@ -1,39 +0,0 @@ -package org.bigbluebutton.core2.message.handlers.users - -import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway -import org.bigbluebutton.core.models._ -import org.bigbluebutton.core.running.{ HandlerHelpers, LiveMeeting, BaseMeetingActor } - -trait ValidateAuthTokenReqMsgHdlr extends HandlerHelpers { - this: BaseMeetingActor => - - val liveMeeting: LiveMeeting - val outGW: OutMessageGateway - - def handleValidateAuthTokenReqMsg(msg: ValidateAuthTokenReqMsg): Unit = { - log.debug("RECEIVED ValidateAuthTokenReqMsg msg {}", msg) - - RegisteredUsers.getRegisteredUserWithToken(msg.body.authToken, msg.body.userId, liveMeeting.registeredUsers) match { - case Some(u) => - val guestPolicyType = GuestsWaiting.getGuestPolicy(liveMeeting.guestsWaiting).policy - if (guestPolicyType == GuestPolicyType.ALWAYS_ACCEPT) { - userValidatedAndNoNeedToWaitForApproval(outGW, liveMeeting, u) - } else if (guestPolicyType == GuestPolicyType.ASK_MODERATOR) { - if (u.guest && u.waitingForAcceptance) { - userValidatedButNeedToWaitForApproval(outGW, liveMeeting, u) - } else { - userValidatedAndNoNeedToWaitForApproval(outGW, liveMeeting, u) - } - } else { - validateTokenFailed(outGW, meetingId = liveMeeting.props.meetingProp.intId, - userId = msg.body.userId, authToken = msg.body.authToken, valid = false, waitForApproval = false) - // TODO: Disconnect user - } - case None => - validateTokenFailed(outGW, meetingId = liveMeeting.props.meetingProp.intId, - userId = msg.body.userId, authToken = msg.body.authToken, valid = false, waitForApproval = false) - // TODO: Disconnect user - } - } -} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/senders/MsgBuilder.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/senders/MsgBuilder.scala index 4a230602e9333e951abbd6c7de591866e5c31df9..928ba490a3b32952620ba9b48b61933593b4a144 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/senders/MsgBuilder.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/senders/MsgBuilder.scala @@ -28,7 +28,7 @@ object MsgBuilder { } def buildGuestsWaitingApprovedEvtMsg(meetingId: String, userId: String, - guests: Vector[GuestApprovedVO], approvedBy: String): BbbCommonEnvCoreMsg = { + guests: Vector[GuestApprovedVO], approvedBy: String): BbbCommonEnvCoreMsg = { val routing = Routing.addMsgToClientRouting(MessageTypes.DIRECT, meetingId, userId) val envelope = BbbCoreEnvelope(GuestsWaitingApprovedEvtMsg.NAME, routing) val header = BbbClientMsgHeader(GuestsWaitingApprovedEvtMsg.NAME, meetingId, userId) @@ -64,7 +64,7 @@ object MsgBuilder { } def buildValidateAuthTokenRespMsg(meetingId: String, userId: String, authToken: String, - valid: Boolean, waitForApproval: Boolean): BbbCommonEnvCoreMsg = { + valid: Boolean, waitForApproval: Boolean): BbbCommonEnvCoreMsg = { val routing = Routing.addMsgToClientRouting(MessageTypes.DIRECT, meetingId, userId) val envelope = BbbCoreEnvelope(ValidateAuthTokenRespMsg.NAME, routing) val header = BbbClientMsgHeader(ValidateAuthTokenRespMsg.NAME, meetingId, userId) @@ -227,26 +227,6 @@ object MsgBuilder { BbbCommonEnvCoreMsg(envelope, event) } - def buildMeetingEndingEvtMsg(meetingId: String): BbbCommonEnvCoreMsg = { - val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, meetingId, "not-used") - val envelope = BbbCoreEnvelope(MeetingEndingEvtMsg.NAME, routing) - val body = MeetingEndingEvtMsgBody(meetingId) - val header = BbbClientMsgHeader(MeetingEndingEvtMsg.NAME, meetingId, "not-used") - val event = MeetingEndingEvtMsg(header, body) - - BbbCommonEnvCoreMsg(envelope, event) - } - - def buildMeetingEndedEvtMsg(meetingId: String): BbbCommonEnvCoreMsg = { - val routing = collection.immutable.HashMap("sender" -> "bbb-apps-akka") - val envelope = BbbCoreEnvelope(MeetingEndedEvtMsg.NAME, routing) - val body = MeetingEndedEvtMsgBody(meetingId) - val header = BbbCoreBaseHeader(MeetingEndedEvtMsg.NAME) - val event = MeetingEndedEvtMsg(header, body) - - BbbCommonEnvCoreMsg(envelope, event) - } - def buildBreakoutRoomEndedEvtMsg(meetingId: String, userId: String, breakoutRoomId: String): BbbCommonEnvCoreMsg = { val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, meetingId, userId) val envelope = BbbCoreEnvelope(BreakoutRoomEndedEvtMsg.NAME, routing) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/senders/ValidateAuthTokenRespMsgSender.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/senders/ValidateAuthTokenRespMsgSender.scala index 31a53b1ff996fb5053cac2a92f6e58589126d511..ab2ae44a5830675722d6dc814f72712af12a839b 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/senders/ValidateAuthTokenRespMsgSender.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/senders/ValidateAuthTokenRespMsgSender.scala @@ -1,12 +1,12 @@ package org.bigbluebutton.core2.message.senders import org.bigbluebutton.common2.msgs._ -import org.bigbluebutton.core.OutMessageGateway +import org.bigbluebutton.core.running.OutMsgRouter object ValidateAuthTokenRespMsgSender { - def send(outGW: OutMessageGateway, meetingId: String, userId: String, authToken: String, - valid: Boolean, waitForApproval: Boolean): Unit = { + def send(outGW: OutMsgRouter, meetingId: String, userId: String, authToken: String, + valid: Boolean, waitForApproval: Boolean): Unit = { val routing = Routing.addMsgToClientRouting(MessageTypes.DIRECT, meetingId, userId) val envelope = BbbCoreEnvelope(ValidateAuthTokenRespMsg.NAME, routing) val header = BbbClientMsgHeader(ValidateAuthTokenRespMsg.NAME, meetingId, userId) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/testdata/FakeTestData.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/testdata/FakeTestData.scala index c31645bc119e7817ebd900241f3181dd5f9d1710..a1fe5a21c5da64e15996bac698705bffd429eb0d 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/testdata/FakeTestData.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/testdata/FakeTestData.scala @@ -9,14 +9,25 @@ import org.bigbluebutton.core.running.LiveMeeting trait FakeTestData { def createFakeUsers(liveMeeting: LiveMeeting): Unit = { - createUserVoiceAndCam(liveMeeting, Roles.MODERATOR_ROLE, false, false, CallingWith.WEBRTC, muted = false, + val mod1 = createUserVoiceAndCam(liveMeeting, Roles.MODERATOR_ROLE, false, false, CallingWith.WEBRTC, muted = false, talking = true, listenOnly = false) - createUserVoiceAndCam(liveMeeting, Roles.MODERATOR_ROLE, guest = true, authed = true, CallingWith.WEBRTC, muted = false, + Users2x.add(liveMeeting.users2x, mod1) + + val mod2 = createUserVoiceAndCam(liveMeeting, Roles.MODERATOR_ROLE, guest = false, authed = true, CallingWith.WEBRTC, muted = false, talking = false, listenOnly = false) - createUserVoiceAndCam(liveMeeting, Roles.VIEWER_ROLE, guest = true, authed = true, CallingWith.WEBRTC, muted = false, + Users2x.add(liveMeeting.users2x, mod2) + + val guest1 = createUserVoiceAndCam(liveMeeting, Roles.VIEWER_ROLE, guest = true, authed = true, CallingWith.WEBRTC, muted = false, talking = false, listenOnly = false) - createUserVoiceAndCam(liveMeeting, Roles.VIEWER_ROLE, guest = true, authed = true, CallingWith.FLASH, muted = false, + Users2x.add(liveMeeting.users2x, guest1) + val guestWait1 = GuestWaiting(guest1.intId, guest1.name, guest1.role) + GuestsWaiting.add(liveMeeting.guestsWaiting, guestWait1) + + val guest2 = createUserVoiceAndCam(liveMeeting, Roles.VIEWER_ROLE, guest = true, authed = true, CallingWith.FLASH, muted = false, talking = false, listenOnly = false) + Users2x.add(liveMeeting.users2x, guest2) + val guestWait2 = GuestWaiting(guest2.intId, guest2.name, guest2.role) + GuestsWaiting.add(liveMeeting.guestsWaiting, guestWait2) val vu1 = FakeUserGenerator.createFakeVoiceOnlyUser(CallingWith.PHONE, muted = false, talking = false, listenOnly = false) VoiceUsers.add(liveMeeting.voiceUsers, vu1) @@ -33,7 +44,7 @@ trait FakeTestData { } def createUserVoiceAndCam(liveMeeting: LiveMeeting, role: String, guest: Boolean, authed: Boolean, callingWith: String, - muted: Boolean, talking: Boolean, listenOnly: Boolean): Unit = { + muted: Boolean, talking: Boolean, listenOnly: Boolean): UserState = { val ruser1 = FakeUserGenerator.createFakeRegisteredUser(liveMeeting.registeredUsers, Roles.MODERATOR_ROLE, true, false) @@ -49,10 +60,10 @@ trait FakeTestData { createFakeUser(liveMeeting, ruser1) } - def createFakeUser(liveMeeting: LiveMeeting, regUser: RegisteredUser): Unit = { - val u = UserState(intId = regUser.id, extId = regUser.externId, name = regUser.name, role = regUser.role, + def createFakeUser(liveMeeting: LiveMeeting, regUser: RegisteredUser): UserState = { + UserState(intId = regUser.id, extId = regUser.externId, name = regUser.name, role = regUser.role, guest = regUser.guest, authed = regUser.authed, waitingForAcceptance = regUser.waitingForAcceptance, emoji = "none", locked = false, presenter = false, avatar = regUser.avatarURL) - Users2x.add(liveMeeting.users2x, u) + } } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/testdata/FakeUserGenerator.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/testdata/FakeUserGenerator.scala index f44ad992e0701428af9847258d7d444d444ca7a5..407b09546562e701fc20aa5ff5d258f7a1e42784 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/testdata/FakeUserGenerator.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/testdata/FakeUserGenerator.scala @@ -26,8 +26,7 @@ object FakeUserGenerator { "Jake", "James", "Jason", "Joe", "John", "Jonathan", "Joseph", "Joshua", "Julian", "Justin", "Keith", "Kevin", "Leonard", "Liam", "Lucas", "Luke", "Matt", "Max", "Michael", "Nathan", "Neil", "Nicholas", "Oliver", "Owen", "Paul", "Peter", "Phil", "Piers", "Richard", "Robert", "Ryan", "Sam", "Sean", "Sebastian", "Simon", "Stephen", - "Steven", "Stewart", "Thomas", "Tim", "Trevor", "Victor", "Warren", "William" - ) + "Steven", "Stewart", "Thomas", "Tim", "Trevor", "Victor", "Warren", "William") private val lastNames = Seq("Abraham", "Allan", "Alsop", "Anderson", "Arnold", "Avery", "Bailey", "Baker", "Ball", "Bell", "Berry", "Black", "Blake", "Bond", "Bower", "Brown", "Buckland", "Burgess", "Butler", "Cameron", "Campbell", @@ -42,8 +41,7 @@ object FakeUserGenerator { "Piper", "Poole", "Powell", "Pullman", "Quinn", "Rampling", "Randall", "Rees", "Reid", "Roberts", "Robertson", "Ross", "Russell", "Rutherford", "Sanderson", "Scott", "Sharp", "Short", "Simpson", "Skinner", "Slater", "Smith", "Springer", "Stewart", "Sutherland", "Taylor", "Terry", "Thomson", "Tucker", "Turner", "Underwood", "Vance", - "Vaughan", "Walker", "Wallace", "Walsh", "Watson", "Welch", "White", "Wilkins", "Wilson", "Wright", "Young" - ) + "Vaughan", "Walker", "Wallace", "Walsh", "Watson", "Welch", "White", "Wilkins", "Wilson", "Wright", "Young") private def getRandomElement(list: Seq[String], random: Random): String = list(random.nextInt(list.length)) @@ -55,19 +53,21 @@ object FakeUserGenerator { val avatarURL = "https://www." + RandomStringGenerator.randomAlphanumericString(32) + ".com/" + RandomStringGenerator.randomAlphanumericString(10) + ".png" - RegisteredUsers.create(userId = id, extId, name, role, - authToken, avatarURL, guest, authed, waitingForAcceptance = true, users) + val ru = RegisteredUsers.create(userId = id, extId, name, role, + authToken, avatarURL, guest, authed, waitingForAcceptance = true) + RegisteredUsers.add(users, ru) + ru } def createFakeVoiceUser(user: RegisteredUser, callingWith: String, muted: Boolean, talking: Boolean, - listenOnly: Boolean): VoiceUserState = { + listenOnly: Boolean): VoiceUserState = { val voiceUserId = RandomStringGenerator.randomAlphanumericString(8) VoiceUserState(intId = user.id, voiceUserId = voiceUserId, callingWith, callerName = user.name, callerNum = user.name, muted, talking, listenOnly) } def createFakeVoiceOnlyUser(callingWith: String, muted: Boolean, talking: Boolean, - listenOnly: Boolean): VoiceUserState = { + listenOnly: Boolean): VoiceUserState = { val voiceUserId = RandomStringGenerator.randomAlphanumericString(8) val intId = "v_" + RandomStringGenerator.randomAlphanumericString(16) val name = getRandomElement(firstNames, random) + " " + getRandomElement(lastNames, random) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/endpoint/redis/AppsRedisSubscriberActor.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/endpoint/redis/AppsRedisSubscriberActor.scala index ec59779540624b16ecaffe632842b78b2962ac6c..a501e4a113902025ecc616737313ab1e196aec71 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/endpoint/redis/AppsRedisSubscriberActor.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/endpoint/redis/AppsRedisSubscriberActor.scala @@ -19,7 +19,7 @@ object AppsRedisSubscriberActor extends SystemConfiguration { val TO_AKKA_APPS = "bbb:to-akka-apps" val channels = Seq(toAkkaAppsRedisChannel, fromVoiceConfRedisChannel) - val patterns = Seq("bigbluebutton:to-bbb-apps:*", "bigbluebutton:from-voice-conf:*") + val patterns = Seq("bigbluebutton:to-bbb-apps:*", "bigbluebutton:from-voice-conf:*", "bigbluebutton:from-bbb-transcode:*") def props(msgReceiver: RedisMessageReceiver, jsonMsgBus: IncomingJsonMessageBus): Props = Props(classOf[AppsRedisSubscriberActor], msgReceiver, jsonMsgBus, @@ -28,10 +28,12 @@ object AppsRedisSubscriberActor extends SystemConfiguration { } class AppsRedisSubscriberActor(msgReceiver: RedisMessageReceiver, jsonMsgBus: IncomingJsonMessageBus, redisHost: String, - redisPort: Int, - channels: Seq[String] = Nil, patterns: Seq[String] = Nil) - extends RedisSubscriberActor(new InetSocketAddress(redisHost, redisPort), - channels, patterns, onConnectStatus = connected => { println(s"connected: $connected") }) with SystemConfiguration { + redisPort: Int, + channels: Seq[String] = Nil, patterns: Seq[String] = Nil) + extends RedisSubscriberActor( + new InetSocketAddress(redisHost, redisPort), + channels, patterns, onConnectStatus = connected => { println(s"connected: $connected") } + ) with SystemConfiguration { override val supervisorStrategy = OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 minute) { case e: Exception => { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/endpoint/redis/RedisRecorderActor.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/endpoint/redis/RedisRecorderActor.scala index 1b42ed33e7620565266629b4fc0f81e7d528a16e..7e86be809ccc300a769abeaf2173e3242c50bccb 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/endpoint/redis/RedisRecorderActor.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/endpoint/redis/RedisRecorderActor.scala @@ -40,34 +40,34 @@ class RedisRecorderActor(val system: ActorSystem) def receive = { //case msg: SendPublicMessageEvent => handleSendPublicMessageEvent(msg) //case msg: ClearPublicChatHistoryReply => handleClearPublicChatHistoryReply(msg) - case msg: ClearPresentationOutMsg => handleClearPresentationOutMsg(msg) - case msg: RemovePresentationOutMsg => handleRemovePresentationOutMsg(msg) - case msg: ResizeAndMoveSlideOutMsg => handleResizeAndMoveSlideOutMsg(msg) - case msg: GotoSlideOutMsg => handleGotoSlideOutMsg(msg) - case msg: SharePresentationOutMsg => handleSharePresentationOutMsg(msg) - case msg: EndAndKickAll => handleEndAndKickAll(msg) - case msg: PresenterAssigned => handleAssignPresenter(msg) - case msg: UserJoined => handleUserJoined(msg) - case msg: UserLeft => handleUserLeft(msg) - case msg: UserStatusChange => handleUserStatusChange(msg) - case msg: UserVoiceMuted => handleUserVoiceMuted(msg) - case msg: UserVoiceTalking => handleUserVoiceTalking(msg) - case msg: UserJoinedVoice => handleUserJoinedVoice(msg) - case msg: UserLeftVoice => handleUserLeftVoice(msg) - case msg: RecordingStatusChanged => handleRecordingStatusChanged(msg) - case msg: UserChangedEmojiStatus => handleChangedUserEmojiStatus(msg) - case msg: UserSharedWebcam => handleUserSharedWebcam(msg) - case msg: UserUnsharedWebcam => handleUserUnsharedWebcam(msg) - case msg: VoiceRecordingStarted => handleVoiceRecordingStarted(msg) - case msg: VoiceRecordingStopped => handleVoiceRecordingStopped(msg) + //case msg: EndAndKickAll => handleEndAndKickAll(msg) + //case msg: PresenterAssigned => handleAssignPresenter(msg) + //case msg: UserJoined => handleUserJoined(msg) + //case msg: UserLeft => handleUserLeft(msg) + //case msg: UserStatusChange => handleUserStatusChange(msg) + // case msg: UserVoiceMuted => handleUserVoiceMuted(msg) + // case msg: UserVoiceTalking => handleUserVoiceTalking(msg) + // case msg: UserJoinedVoice => handleUserJoinedVoice(msg) + // case msg: UserLeftVoice => handleUserLeftVoice(msg) + //case msg: RecordingStatusChanged => handleRecordingStatusChanged(msg) + //case msg: UserChangedEmojiStatus => handleChangedUserEmojiStatus(msg) + //case msg: UserSharedWebcam => handleUserSharedWebcam(msg) + //case msg: UserUnsharedWebcam => handleUserUnsharedWebcam(msg) + // case msg: VoiceRecordingStarted => handleVoiceRecordingStarted(msg) + // case msg: VoiceRecordingStopped => handleVoiceRecordingStopped(msg) + //case msg: ClearPresentationOutMsg => handleClearPresentationOutMsg(msg) + //case msg: RemovePresentationOutMsg => handleRemovePresentationOutMsg(msg) + //case msg: ResizeAndMoveSlideOutMsg => handleResizeAndMoveSlideOutMsg(msg) + //case msg: GotoSlideOutMsg => handleGotoSlideOutMsg(msg) + //case msg: SharePresentationOutMsg => handleSharePresentationOutMsg(msg) // case msg: SendWhiteboardAnnotationEvtMsg => handleSendWhiteboardAnnotationEvent(msg) // case msg: CursorPositionUpdatedEvent => handleCursorPositionUpdatedEvent(msg) // case msg: ClearWhiteboardEvent => handleClearWhiteboardEvent(msg) // case msg: UndoWhiteboardEvent => handleUndoWhiteboardEvent(msg) // case msg: EditCaptionHistoryReply => handleEditCaptionHistoryReply(msg) - case msg: DeskShareStartRTMPBroadcast => handleDeskShareStartRTMPBroadcast(msg) - case msg: DeskShareStopRTMPBroadcast => handleDeskShareStopRTMPBroadcast(msg) - case msg: DeskShareNotifyViewersRTMP => handleDeskShareNotifyViewersRTMP(msg) + //case msg: DeskShareStartRTMPBroadcast => handleDeskShareStartRTMPBroadcast(msg) + //case msg: DeskShareStopRTMPBroadcast => handleDeskShareStopRTMPBroadcast(msg) + //case msg: DeskShareNotifyViewersRTMP => handleDeskShareNotifyViewersRTMP(msg) case _ => // do nothing } @@ -96,6 +96,7 @@ class RedisRecorderActor(val system: ActorSystem) } }*/ + /* private def handleClearPresentationOutMsg(msg: ClearPresentationOutMsg) { } @@ -173,7 +174,8 @@ class RedisRecorderActor(val system: ActorSystem) record(msg.meetingID, JavaConverters.mapAsScalaMap(event.toMap).toMap) } } - + */ + /* private def handleEndAndKickAll(msg: EndAndKickAll): Unit = { if (msg.recorded) { val ev = new ParticipantEndAndKickAllRecordEvent() @@ -196,7 +198,8 @@ class RedisRecorderActor(val system: ActorSystem) record(msg.meetingID, JavaConverters.mapAsScalaMap(ev.toMap).toMap) } } - +*/ + /* def handleVoiceRecordingStarted(msg: VoiceRecordingStarted) { if (msg.recorded) { val evt = new StartRecordingVoiceRecordEvent(true) @@ -273,7 +276,8 @@ class RedisRecorderActor(val system: ActorSystem) record(msg.meetingID, JavaConverters.mapAsScalaMap(evt.toMap).toMap) } } - + */ + /* def handleRecordingStatusChanged(msg: RecordingStatusChanged) { if (msg.recorded) { val evt = new RecordStatusRecordEvent() @@ -350,8 +354,9 @@ class RedisRecorderActor(val system: ActorSystem) record(msg.meetingID, JavaConverters.mapAsScalaMap(event.toMap).toMap) } - } + }*/ + /* private def getPresentationId(whiteboardId: String): String = { // Need to split the whiteboard id into presenation id and page num as the old // recording expects them @@ -374,6 +379,7 @@ class RedisRecorderActor(val system: ActorSystem) } pageNum } + */ /* private def handleSendWhiteboardAnnotationEvent(msg: SendWhiteboardAnnotationEvent) { @@ -467,7 +473,7 @@ class RedisRecorderActor(val system: ActorSystem) } } */ - + /* private def handleDeskShareStartRTMPBroadcast(msg: DeskShareStartRTMPBroadcast) { val event = new DeskShareStartRTMPRecordEvent() event.setMeetingId(msg.conferenceName) @@ -494,5 +500,5 @@ class RedisRecorderActor(val system: ActorSystem) event.setTimestamp(TimestampGenerator.generateTimestamp()) record(msg.meetingID, JavaConverters.mapAsScalaMap(event.toMap).toMap) - } + }*/ } diff --git a/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/AppsTestFixtures.scala b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/AppsTestFixtures.scala index 280c7df13fc2ac0dc0301bb76587d97dae2e6952..7ff40fbdc6513f9a3beb539ed87b91da810f4fb3 100755 --- a/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/AppsTestFixtures.scala +++ b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/AppsTestFixtures.scala @@ -17,6 +17,8 @@ trait AppsTestFixtures { val voiceConfId = "85115" val deskshareConfId = "85115-DESKSHARE" val durationInMinutes = 10 + val maxInactivityTimeoutMinutes = 120 + val warnMinutesBeforeMax = 5 val autoStartRecording = false val allowStartStopRecording = false val webcamsOnlyForModerator = false; @@ -42,7 +44,12 @@ trait AppsTestFixtures { val meetingProp = MeetingProp(name = meetingName, extId = externalMeetingId, intId = meetingId, isBreakout = isBreakout.booleanValue()) - val durationProps = DurationProps(duration = durationInMinutes, createdTime = createTime, createdDate = createDate) + val durationProps = DurationProps( + duration = durationInMinutes, + createdTime = createTime, createdDate = createDate, + maxInactivityTimeoutMinutes = maxInactivityTimeoutMinutes, + warnMinutesBeforeMax = warnMinutesBeforeMax + ) val password = PasswordProp(moderatorPass = moderatorPassword, viewerPass = viewerPassword) val recordProp = RecordProp(record = record, autoStartRecording = autoStartRecording, allowStartStopRecording = allowStartStopRecording) @@ -59,13 +66,11 @@ trait AppsTestFixtures { val chatModel = new ChatModel() val layoutModel = new LayoutModel() val layouts = new Layouts() - val pollModel = new PollModel() val wbModel = new WhiteboardModel() val presModel = new PresentationModel() val breakoutRooms = new BreakoutRooms() val captionModel = new CaptionModel() val notesModel = new SharedNotesModel() - val users = new Users1x val registeredUsers = new RegisteredUsers val meetingStatux2x = new MeetingStatus2x val webcams = new Webcams @@ -73,13 +78,34 @@ trait AppsTestFixtures { val users2x = new Users2x val polls2x = new Polls val guestsWaiting = new GuestsWaiting + val deskshareModel = new ScreenshareModel // meetingModel.setGuestPolicy(props.usersProp.guestPolicy) - // We extract the meeting handlers into this class so it is - // easy to test. - val liveMeeting = new LiveMeeting(defaultProps, meetingStatux2x, chatModel, layoutModel, layouts, - users, registeredUsers, polls2x, pollModel, wbModel, presModel, breakoutRooms, captionModel, - notesModel, webcams, voiceUsers, users2x, guestsWaiting) + def newLiveMeeting(): LiveMeeting = { + val chatModel = new ChatModel() + val layoutModel = new LayoutModel() + val layouts = new Layouts() + val wbModel = new WhiteboardModel() + val presModel = new PresentationModel() + val breakoutRooms = new BreakoutRooms() + val captionModel = new CaptionModel() + val notesModel = new SharedNotesModel() + val registeredUsers = new RegisteredUsers + val meetingStatux2x = new MeetingStatus2x + val webcams = new Webcams + val voiceUsers = new VoiceUsers + val users2x = new Users2x + val polls2x = new Polls + val guestsWaiting = new GuestsWaiting + val deskshareModel = new ScreenshareModel + // meetingModel.setGuestPolicy(props.usersProp.guestPolicy) + + // We extract the meeting handlers into this class so it is + // easy to test. + new LiveMeeting(defaultProps, meetingStatux2x, deskshareModel, chatModel, layoutModel, layouts, + registeredUsers, polls2x, wbModel, presModel, breakoutRooms, captionModel, + notesModel, webcams, voiceUsers, users2x, guestsWaiting) + } } diff --git a/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/BigBlueButtonActorTestsSpec.scala b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/BigBlueButtonActorTestsSpec.scala index af2bcbe194f3fa89b8b2428499e7987befc0e278..91c9f3bc5e0eb2b5076b9569f34be96a02ffd231 100755 --- a/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/BigBlueButtonActorTestsSpec.scala +++ b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/BigBlueButtonActorTestsSpec.scala @@ -11,8 +11,10 @@ import org.scalatest.{ Matchers, WordSpecLike } import scala.concurrent.duration._ -class BigBlueButtonActorTestsSpec extends TestKit(ActorSystem("BigBlueButtonActorTestsSpec", - ConfigFactory.parseString(TestKitUsageSpec.config))) +class BigBlueButtonActorTestsSpec extends TestKit(ActorSystem( + "BigBlueButtonActorTestsSpec", + ConfigFactory.parseString(TestKitUsageSpec.config) +)) with DefaultTimeout with ImplicitSender with WordSpecLike with Matchers with StopSystemAfterAll with AppsTestFixtures with SystemConfiguration { @@ -20,12 +22,12 @@ class BigBlueButtonActorTestsSpec extends TestKit(ActorSystem("BigBlueButtonActo // Setup dependencies val bbbMsgBus = new BbbMsgRouterEventBus - val eventBus = new IncomingEventBus + val eventBus = new InMsgBusGW(new IncomingEventBusImp()) val outgoingEventBus = new OutgoingEventBus val outBus2 = new OutEventBus2 val recordBus = new RecordingEventBus - val outGW = OutMessageGateway(outgoingEventBus, outBus2, recordBus) + //val outGW = OutMessageGatewayImp(outgoingEventBus, outBus2, recordBus) // Have the build in testActor receive messages coming from class under test (BigBlueButtonActor) outBus2.subscribe(testActor, outBbbMsgMsgChannel) @@ -34,22 +36,27 @@ class BigBlueButtonActorTestsSpec extends TestKit(ActorSystem("BigBlueButtonActo "Send a MeetingCreatedEvtMsg when receiving CreateMeetingReqMsg" in { within(500 millis) { + val outGWSeq = new OutMsgGWSeq() // Create BigBlueButton Actor - val bbbActorRef = system.actorOf(BigBlueButtonActor.props(system, - eventBus, bbbMsgBus, outGW)) + val bbbActorRef = system.actorOf(BigBlueButtonActor.props( + system, + eventBus, bbbMsgBus, outGWSeq + )) // Send our create meeting request message val msg = buildCreateMeetingReqMsg(defaultProps) bbbActorRef ! msg + //assert(outGWSeq.msgs.length == 2) + // Expect a message from BigBlueButtonActor as a result of handling // the create meeting request message. //expectMsgClass(classOf[BbbCommonEnvCoreMsg]) - expectMsgPF() { - case event: BbbCommonEnvCoreMsg => - assert(event.envelope.name == MeetingCreatedEvtMsg.NAME) - // Can do more assertions here - } + // expectMsgPF() { + // case event: BbbCommonEnvCoreMsg => + // assert(event.envelope.name == MeetingCreatedEvtMsg.NAME) + // Can do more assertions here + // } } } } diff --git a/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/JsonMessageDecoderTests.scala b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/JsonMessageDecoderTests.scala deleted file mode 100755 index 7e83d884dfc8e09286a9eefa43e1598f0dffdb35..0000000000000000000000000000000000000000 --- a/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/JsonMessageDecoderTests.scala +++ /dev/null @@ -1,28 +0,0 @@ -package org.bigbluebutton.core - -import scala.util.Success -import scala.util.Failure -import org.scalatest._ -import org.bigbluebutton.core.api.CreateBreakoutRooms - -class JsonMessageDecoderTests extends UnitSpec with JsonMessageFixtures { - - it should "return a CreateBreakoutRoomsRequestMessage" in { - JsonMessageDecoder.decode(createBreakoutRoomsRequestMessage) match { - case Some(validMsg) => { - val vm = validMsg.asInstanceOf[CreateBreakoutRooms] - //assert(vm.durationInMinutes == 20) - assert(true) - } - case None => assert(true) //fail("Failed to decode message") - } - } - - it should "fail to decode CreateBreakoutRoomsRequestMessage" in { - JsonMessageDecoder.decode(invalidCreateBreakoutRoomsRequestMessage) match { - case Some(validMsg) => fail("Should have failed to decode message") - case None => assert(true) - } - } - -} \ No newline at end of file diff --git a/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/MockTestActor.scala b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/MockTestActor.scala new file mode 100755 index 0000000000000000000000000000000000000000..c2fe5aec12d7f040b4f08188930c9510c23eea93 --- /dev/null +++ b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/MockTestActor.scala @@ -0,0 +1,15 @@ +package org.bigbluebutton.core + +import akka.actor.Props +import org.bigbluebutton.core.running.BaseMeetingActor + +object MockTestActor { + def props(): Props = Props(classOf[MockTestActor]) +} + +class MockTestActor extends BaseMeetingActor { + + def receive = { + case _ => log.error("Shouldn't receive anything as this is just an actor stand in.") + } +} diff --git a/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/OutMsgGWSeq.scala b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/OutMsgGWSeq.scala new file mode 100755 index 0000000000000000000000000000000000000000..c8f30c6c3a669a328ae04987fed704fa8de67dcf --- /dev/null +++ b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/OutMsgGWSeq.scala @@ -0,0 +1,21 @@ +package org.bigbluebutton.core +import org.bigbluebutton.common2.msgs.{ BbbCommonEnvCoreMsg, BbbCoreMsg } +import org.bigbluebutton.core.api.IOutMessage + +class OutMsgGWSeq extends OutMessageGateway { + val msgs = new collection.mutable.Queue[BbbCoreMsg] + + override def send1(msg: IOutMessage): Unit = { + + } + + override def send(msg: BbbCommonEnvCoreMsg): Unit = { + println(" Adding message " + msg) + msgs += msg.core + println(" Adding message length " + msgs.length) + } + + override def record(msg: BbbCoreMsg): Unit = { + + } +} diff --git a/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/TestKitUsageSpec.scala b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/TestKitUsageSpec.scala index 21790dda628eaa3db49a6bda6174f9538001de91..95f8c17c07769140667352c1b35f975e3377e7ac 100755 --- a/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/TestKitUsageSpec.scala +++ b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/TestKitUsageSpec.scala @@ -18,8 +18,10 @@ import org.scalatest.Matchers /** * a Test to show some TestKit examples */ -class TestKitUsageSpec extends TestKit(ActorSystem("TestKitUsageSpec", - ConfigFactory.parseString(TestKitUsageSpec.config))) +class TestKitUsageSpec extends TestKit(ActorSystem( + "TestKitUsageSpec", + ConfigFactory.parseString(TestKitUsageSpec.config) +)) with DefaultTimeout with ImplicitSender with WordSpecLike with Matchers with BeforeAndAfterAll { @@ -130,7 +132,7 @@ object TestKitUsageSpec { class FilteringActor(next: ActorRef) extends Actor { def receive = { case msg: String => next ! msg - case _ => None + case _ => None } } @@ -141,7 +143,7 @@ object TestKitUsageSpec { * be bothered with the rest */ class SequencingActor(next: ActorRef, head: immutable.Seq[String], - tail: immutable.Seq[String]) extends Actor { + tail: immutable.Seq[String]) extends Actor { def receive = { case msg => { head foreach { next ! _ } diff --git a/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/apps/BreakoutRoomsUtilSpec.scala b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/apps/BreakoutRoomsUtilSpec.scala index fd94c630479770bf46e4e22ffd815f60436ec1db..a3d8a8aaacb628e6635aa261c0ab958050c0f17a 100755 --- a/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/apps/BreakoutRoomsUtilSpec.scala +++ b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/apps/BreakoutRoomsUtilSpec.scala @@ -1,6 +1,7 @@ package org.bigbluebutton.core.apps import org.bigbluebutton.core.UnitSpec +import org.bigbluebutton.core.apps.breakout.BreakoutRoomsUtil class BreakoutRoomsUtilSpec extends UnitSpec { diff --git a/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/models/DirectChatModelTest.scala b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/models/DirectChatModelTest.scala index 3a7b6766e3d79673b7a5c3798497bb8fc944da7a..9d2bdf0f839594f4a702a48616d4a0c4f7da6f5c 100755 --- a/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/models/DirectChatModelTest.scala +++ b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/models/DirectChatModelTest.scala @@ -26,7 +26,7 @@ class DirectChatModelTest extends UnitSpec { val dc2 = DirectChats.find(between, directChats) dc2 match { case Some(directChat) => assert(directChat.messages.length == 2) - case None => fail("No direct chat found!") + case None => fail("No direct chat found!") } // Append a third message and make sure there are three messages @@ -37,7 +37,7 @@ class DirectChatModelTest extends UnitSpec { val dc3 = DirectChats.find(between, directChats) dc3 match { case Some(directChat) => assert(directChat.messages.length == 3) - case None => fail("No direct chat found!") + case None => fail("No direct chat found!") } } diff --git a/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/running/MeetingInactivityTrackerHelperTests.scala b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/running/MeetingInactivityTrackerHelperTests.scala new file mode 100755 index 0000000000000000000000000000000000000000..97ec2e62d084d7b79049b6979a0b79277a07084f --- /dev/null +++ b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/running/MeetingInactivityTrackerHelperTests.scala @@ -0,0 +1,32 @@ +package org.bigbluebutton.core.running + +import org.bigbluebutton.core.UnitSpec +import org.bigbluebutton.core.domain.MeetingInactivityTracker + +class MeetingInactivityTrackerHelperTests extends UnitSpec { + + "A MeetingInactivityTrackerHelper" should "be return meeting is inactive" in { + val nowInMinutes = 25 + val lastActivityTimeInMinutes = 10 + val maxInactivityTimeoutMinutes = 12 + val active = MeetingInactivityTrackerHelper.isMeetingActive( + nowInMinutes, + lastActivityTimeInMinutes, + maxInactivityTimeoutMinutes + ) + assert(active == false) + } + + "A MeetingInactivityTrackerHelper" should "be return meeting is active" in { + val warningSent = true + val nowInMinutes = 25 + val lastActivityTimeInMinutes = 10 + val maxInactivityTimeoutMinutes = 12 + val active = MeetingInactivityTrackerHelper.isMeetingInactive( + warningSent, + nowInMinutes, lastActivityTimeInMinutes, maxInactivityTimeoutMinutes + ) + assert(active) + } + +} diff --git a/akka-bbb-apps/src/test/scala/org/bigbluebutton/core2/message/handlers/ValidateAuthTokenReqMsgHdlrTestsSpec.scala b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core2/message/handlers/ValidateAuthTokenReqMsgHdlrTestsSpec.scala index 4368fc0f019afbf67819da8349b48f571ae311bd..7e0c5bd005014e3271e56da1f0f27464e397e56e 100755 --- a/akka-bbb-apps/src/test/scala/org/bigbluebutton/core2/message/handlers/ValidateAuthTokenReqMsgHdlrTestsSpec.scala +++ b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core2/message/handlers/ValidateAuthTokenReqMsgHdlrTestsSpec.scala @@ -1,22 +1,24 @@ package org.bigbluebutton.core2.message.handlers -import akka.actor.{ ActorSystem, Props } +import akka.actor.{ ActorContext, ActorSystem, Props } import akka.testkit.{ DefaultTimeout, ImplicitSender, TestKit } import com.typesafe.config.ConfigFactory import org.bigbluebutton.SystemConfiguration import org.bigbluebutton.common2.msgs._ import org.bigbluebutton.core._ +import org.bigbluebutton.core.apps.users.UsersApp import org.bigbluebutton.core.bus._ import org.bigbluebutton.core.models._ -import org.bigbluebutton.core.running.{ BaseMeetingActor, LiveMeeting } -import org.bigbluebutton.core2.message.handlers.users.ValidateAuthTokenReqMsgHdlr +import org.bigbluebutton.core.running.LiveMeeting import org.bigbluebutton.core2.testdata.TestDataGen import org.scalatest.{ Matchers, WordSpecLike } - +import akka.testkit.TestActorRef import scala.concurrent.duration._ -class ValidateAuthTokenReqMsgHdlrTestsSpec extends TestKit(ActorSystem("ValidateAuthTokenReqMsgHdlrTestsSpec", - ConfigFactory.parseString(TestKitUsageSpec.config))) +class ValidateAuthTokenReqMsgHdlrTestsSpec extends TestKit(ActorSystem( + "ValidateAuthTokenReqMsgHdlrTestsSpec", + ConfigFactory.parseString(TestKitUsageSpec.config) +)) with DefaultTimeout with ImplicitSender with WordSpecLike with Matchers with StopSystemAfterAll with AppsTestFixtures with SystemConfiguration { @@ -26,37 +28,29 @@ class ValidateAuthTokenReqMsgHdlrTestsSpec extends TestKit(ActorSystem("Validate val outBus2 = new OutEventBus2 val recordBus = new RecordingEventBus - val outGW = OutMessageGateway(outgoingEventBus, outBus2, recordBus) - - // Have the build in testActor receive messages coming from class under test - outBus2.subscribe(testActor, outBbbMsgMsgChannel) - "A MeetingActor" should { "Reject an invalid authToken because there is no registered users in the meeting" in { within(500 millis) { + val state = newLiveMeeting() + val outGW = new OutMsgGWSeq() + + // Need to get an ActorContext + val actorRef = TestActorRef[MockTestActor] + val actor = actorRef.underlyingActor // Create actor under test Actor - val meetingActorRef = system.actorOf(ValidateAuthTokenRespMsgTestActor.props(outGW, liveMeeting)) + val meetingActorRef = new UsersApp(state, outGW)(actor.context) - def build(meetingId: String, userId: String, authToken: String): BbbCommonEnvCoreMsg = { - val routing = collection.immutable.HashMap("sender" -> "bbb-apps") - val envelope = BbbCoreEnvelope(CreateMeetingReqMsg.NAME, routing) - val req = ValidateAuthTokenReqMsg(meetingId, userId, authToken) - BbbCommonEnvCoreMsg(envelope, req) + def build(meetingId: String, userId: String, authToken: String): ValidateAuthTokenReqMsg = { + ValidateAuthTokenReqMsg(meetingId, userId, authToken) } // Send our message - val msg = build(liveMeeting.props.meetingProp.intId, "unknown user", "fake auth token") - meetingActorRef ! msg + val msg = build(state.props.meetingProp.intId, "unknown user", "fake auth token") + meetingActorRef.handleValidateAuthTokenReqMsg(msg) // Handle message expectations - expectMsgPF() { - case event: BbbCommonEnvCoreMsg => - assert(event.envelope.name == ValidateAuthTokenRespMsg.NAME) - val outMsg = event.core.asInstanceOf[ValidateAuthTokenRespMsg] - assert(outMsg.body.valid == false) - // Can do more assertions here - } + assert(outGW.msgs.length == 1) } } } @@ -65,31 +59,27 @@ class ValidateAuthTokenReqMsgHdlrTestsSpec extends TestKit(ActorSystem("Validate "Reject an invalid authToken for a registered users in the meeting" in { within(500 millis) { - val richard = TestDataGen.createRegisteredUser(liveMeeting.registeredUsers, "Richard", Roles.MODERATOR_ROLE, + val state = newLiveMeeting() + val outGW = new OutMsgGWSeq() + val richard = TestDataGen.createRegisteredUser(state.registeredUsers, "Richard", Roles.MODERATOR_ROLE, guest = false, authed = false, waitForApproval = false) + // Need to get an ActorContext + val actorRef = TestActorRef[MockTestActor] + val actor = actorRef.underlyingActor // Create actor under test Actor - val meetingActorRef = system.actorOf(ValidateAuthTokenRespMsgTestActor.props(outGW, liveMeeting)) + val meetingActorRef = new UsersApp(state, outGW)(actor.context) - def build(meetingId: String, userId: String, authToken: String): BbbCommonEnvCoreMsg = { - val routing = collection.immutable.HashMap("sender" -> "bbb-apps") - val envelope = BbbCoreEnvelope(CreateMeetingReqMsg.NAME, routing) - val req = ValidateAuthTokenReqMsg(meetingId, userId, authToken) - BbbCommonEnvCoreMsg(envelope, req) + def build(meetingId: String, userId: String, authToken: String): ValidateAuthTokenReqMsg = { + ValidateAuthTokenReqMsg(meetingId, userId, authToken) } // Send our message - val msg = build(liveMeeting.props.meetingProp.intId, richard.id, "wrong token") - meetingActorRef ! msg + val msg = build(state.props.meetingProp.intId, richard.id, "wrong token") + meetingActorRef.handleValidateAuthTokenReqMsg(msg) // Handle message expectations - expectMsgPF() { - case event: BbbCommonEnvCoreMsg => - assert(event.envelope.name == ValidateAuthTokenRespMsg.NAME) - val outMsg = event.core.asInstanceOf[ValidateAuthTokenRespMsg] - assert(outMsg.body.valid == false) - // Can do more assertions here - } + assert(outGW.msgs.length == 1) } } } @@ -97,32 +87,28 @@ class ValidateAuthTokenReqMsgHdlrTestsSpec extends TestKit(ActorSystem("Validate "A MeetingActor" should { "Accept a valid authToken for a registered users in the meeting" in { within(500 millis) { + val state = newLiveMeeting() + val outGW = new OutMsgGWSeq() - val richard = TestDataGen.createRegisteredUser(liveMeeting.registeredUsers, "Richard", Roles.MODERATOR_ROLE, + val richard = TestDataGen.createRegisteredUser(state.registeredUsers, "Richard", Roles.MODERATOR_ROLE, guest = false, authed = false, waitForApproval = false) + // Need to get an ActorContext + val actorRef = TestActorRef[MockTestActor] + val actor = actorRef.underlyingActor // Create actor under test Actor - val meetingActorRef = system.actorOf(ValidateAuthTokenRespMsgTestActor.props(outGW, liveMeeting)) + val meetingActorRef = new UsersApp(state, outGW)(actor.context) - def build(meetingId: String, userId: String, authToken: String): BbbCommonEnvCoreMsg = { - val routing = collection.immutable.HashMap("sender" -> "bbb-apps") - val envelope = BbbCoreEnvelope(CreateMeetingReqMsg.NAME, routing) - val req = ValidateAuthTokenReqMsg(meetingId, userId, authToken) - BbbCommonEnvCoreMsg(envelope, req) + def build(meetingId: String, userId: String, authToken: String): ValidateAuthTokenReqMsg = { + ValidateAuthTokenReqMsg(meetingId, userId, authToken) } // Send our message - val msg = build(liveMeeting.props.meetingProp.intId, richard.id, richard.authToken) - meetingActorRef ! msg + val msg = build(state.props.meetingProp.intId, richard.id, richard.authToken) + meetingActorRef.handleValidateAuthTokenReqMsg(msg) // Handle message expectations - expectMsgPF() { - case event: BbbCommonEnvCoreMsg => - assert(event.envelope.name == ValidateAuthTokenRespMsg.NAME) - val outMsg = event.core.asInstanceOf[ValidateAuthTokenRespMsg] - assert(outMsg.body.valid == true) - // Can do more assertions here - } + assert(outGW.msgs.length == 6) } } } @@ -130,37 +116,34 @@ class ValidateAuthTokenReqMsgHdlrTestsSpec extends TestKit(ActorSystem("Validate "A MeetingActor" should { "Accept a valid authToken for a registered users in the meeting and not wait for approval for none guests" in { within(500 millis) { + val state = newLiveMeeting() + val outGW = new OutMsgGWSeq() // Set the guest policy to ask moderator - GuestsWaiting.setGuestPolicy(liveMeeting.guestsWaiting, GuestPolicy(GuestPolicyType.ASK_MODERATOR, "SYSTEM")) + GuestsWaiting.setGuestPolicy(state.guestsWaiting, GuestPolicy(GuestPolicyType.ASK_MODERATOR, "SYSTEM")) // Register a user that is not a guest - val richard = TestDataGen.createRegisteredUser(liveMeeting.registeredUsers, "Richard", Roles.MODERATOR_ROLE, + val richard = TestDataGen.createRegisteredUser(state.registeredUsers, "Richard", Roles.MODERATOR_ROLE, guest = false, authed = false, waitForApproval = false) + // Need to get an ActorContext + val actorRef = TestActorRef[MockTestActor] + val actor = actorRef.underlyingActor // Create actor under test Actor - val meetingActorRef = system.actorOf(ValidateAuthTokenRespMsgTestActor.props(outGW, liveMeeting)) + val meetingActorRef = new UsersApp(state, outGW)(actor.context) - def build(meetingId: String, userId: String, authToken: String): BbbCommonEnvCoreMsg = { - val routing = collection.immutable.HashMap("sender" -> "bbb-apps") - val envelope = BbbCoreEnvelope(CreateMeetingReqMsg.NAME, routing) - val req = ValidateAuthTokenReqMsg(meetingId, userId, authToken) - BbbCommonEnvCoreMsg(envelope, req) + def build(meetingId: String, userId: String, authToken: String): ValidateAuthTokenReqMsg = { + ValidateAuthTokenReqMsg(meetingId, userId, authToken) } // Send our message - val msg = build(liveMeeting.props.meetingProp.intId, richard.id, richard.authToken) - meetingActorRef ! msg + val msg = build(state.props.meetingProp.intId, richard.id, richard.authToken) + meetingActorRef.handleValidateAuthTokenReqMsg(msg) // Handle message expectations - expectMsgPF() { - case event: BbbCommonEnvCoreMsg => - assert(event.envelope.name == ValidateAuthTokenRespMsg.NAME) - val outMsg = event.core.asInstanceOf[ValidateAuthTokenRespMsg] - assert(outMsg.body.valid == true) - assert(outMsg.body.waitForApproval == false) - // Can do more assertions here - } + // Handle message expectations + assert(outGW.msgs.length == 6) + } } } @@ -169,47 +152,50 @@ class ValidateAuthTokenReqMsgHdlrTestsSpec extends TestKit(ActorSystem("Validate "Accept a valid authToken for a registered users in the meeting and wait for approval for guests" in { within(500 millis) { + val registeredUsers = new RegisteredUsers + val users2x = new Users2x + val state = new LiveMeeting(defaultProps, meetingStatux2x, deskshareModel, chatModel, layoutModel, layouts, + registeredUsers, polls2x, wbModel, presModel, breakoutRooms, captionModel, + notesModel, webcams, voiceUsers, users2x, guestsWaiting) + // Set the guest policy to ask moderator - GuestsWaiting.setGuestPolicy(liveMeeting.guestsWaiting, GuestPolicy(GuestPolicyType.ASK_MODERATOR, "SYSTEM")) + GuestsWaiting.setGuestPolicy(state.guestsWaiting, GuestPolicy(GuestPolicyType.ASK_MODERATOR, "SYSTEM")) // Register a user that is not a guest - val richard = TestDataGen.createRegisteredUser(liveMeeting.registeredUsers, "Richard", Roles.MODERATOR_ROLE, + val richard = TestDataGen.createRegisteredUser(state.registeredUsers, "Richard", Roles.MODERATOR_ROLE, guest = false, authed = false, waitForApproval = false) - val fred = TestDataGen.createRegisteredUser(liveMeeting.registeredUsers, "Fred", Roles.MODERATOR_ROLE, + val fred = TestDataGen.createRegisteredUser(state.registeredUsers, "Fred", Roles.MODERATOR_ROLE, guest = false, authed = false, waitForApproval = false) - val anton = TestDataGen.createRegisteredUser(liveMeeting.registeredUsers, "Anton", Roles.VIEWER_ROLE, + val anton = TestDataGen.createRegisteredUser(state.registeredUsers, "Anton", Roles.VIEWER_ROLE, guest = false, authed = false, waitForApproval = false) - val richardUser = TestDataGen.createUserFor(liveMeeting, richard, presenter = false) - val fredUser = TestDataGen.createUserFor(liveMeeting, fred, presenter = false) - val antonUser = TestDataGen.createUserFor(liveMeeting, anton, presenter = false) + val richardUser = TestDataGen.createUserFor(state, richard, presenter = false) + val fredUser = TestDataGen.createUserFor(state, fred, presenter = false) + val antonUser = TestDataGen.createUserFor(state, anton, presenter = false) - val chad = TestDataGen.createRegisteredUser(liveMeeting.registeredUsers, "Chad", Roles.VIEWER_ROLE, + val chad = TestDataGen.createRegisteredUser(state.registeredUsers, "Chad", Roles.VIEWER_ROLE, guest = true, authed = false, waitForApproval = true) + val outGW = new OutMsgGWSeq() + + // Need to get an ActorContext + val actorRef = TestActorRef[MockTestActor] + val actor = actorRef.underlyingActor // Create actor under test Actor - val meetingActorRef = system.actorOf(ValidateAuthTokenRespMsgTestActor.props(outGW, liveMeeting)) + val meetingActorRef = new UsersApp(state, outGW)(actor.context) - def build(meetingId: String, userId: String, authToken: String): BbbCommonEnvCoreMsg = { - val routing = collection.immutable.HashMap("sender" -> "bbb-apps") - val envelope = BbbCoreEnvelope(CreateMeetingReqMsg.NAME, routing) - val req = ValidateAuthTokenReqMsg(meetingId, userId, authToken) - BbbCommonEnvCoreMsg(envelope, req) + def build(meetingId: String, userId: String, authToken: String): ValidateAuthTokenReqMsg = { + ValidateAuthTokenReqMsg(meetingId, userId, authToken) } - // Send our message - val msg = build(liveMeeting.props.meetingProp.intId, chad.id, chad.authToken) - meetingActorRef ! msg + println("****** Sending validate msg test") + + val msg = build(state.props.meetingProp.intId, chad.id, chad.authToken) + meetingActorRef.handleValidateAuthTokenReqMsg(msg) + + println("******* Asserting message length ") + assert(outGW.msgs.length == 3) - // Handle message expectations - expectMsgPF() { - case event: BbbCommonEnvCoreMsg => - assert(event.envelope.name == ValidateAuthTokenRespMsg.NAME) - val outMsg = event.core.asInstanceOf[ValidateAuthTokenRespMsg] - assert(outMsg.body.valid == true) - assert(outMsg.body.waitForApproval == false) - // Can do more assertions here - } } } } @@ -229,22 +215,3 @@ class ValidateAuthTokenReqMsgHdlrTestsSpec extends TestKit(ActorSystem("Validate } } -class ValidateAuthTokenRespMsgTestActor(val outGW: OutMessageGateway, - val liveMeeting: LiveMeeting) - extends BaseMeetingActor with ValidateAuthTokenReqMsgHdlr { - - def receive = { - case msg: BbbCommonEnvCoreMsg => handleBbbCommonEnvCoreMsg(msg) - } - - private def handleBbbCommonEnvCoreMsg(msg: BbbCommonEnvCoreMsg): Unit = { - msg.core match { - case m: ValidateAuthTokenReqMsg => handleValidateAuthTokenReqMsg(m) - } - } -} - -object ValidateAuthTokenRespMsgTestActor { - def props(outGW: OutMessageGateway, liveMeeting: LiveMeeting): Props = - Props(classOf[ValidateAuthTokenRespMsgTestActor], outGW, liveMeeting) -} diff --git a/akka-bbb-apps/src/test/scala/org/bigbluebutton/core2/testdata/TestDataGen.scala b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core2/testdata/TestDataGen.scala index fab465c3f28cf609b8901e02081506bb3bc65df4..55bf7362eb5a38b05470c259e0d0a6467aa27d72 100755 --- a/akka-bbb-apps/src/test/scala/org/bigbluebutton/core2/testdata/TestDataGen.scala +++ b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core2/testdata/TestDataGen.scala @@ -6,7 +6,7 @@ import org.bigbluebutton.core.util.RandomStringGenerator object TestDataGen { def createRegisteredUser(users: RegisteredUsers, name: String, role: String, - guest: Boolean, authed: Boolean, waitForApproval: Boolean): RegisteredUser = { + guest: Boolean, authed: Boolean, waitForApproval: Boolean): RegisteredUser = { val id = "w_" + RandomStringGenerator.randomAlphanumericString(16) val extId = RandomStringGenerator.randomAlphanumericString(16) val authToken = RandomStringGenerator.randomAlphanumericString(16) @@ -18,14 +18,14 @@ object TestDataGen { } def createVoiceUserForUser(user: RegisteredUser, callingWith: String, muted: Boolean, talking: Boolean, - listenOnly: Boolean): VoiceUserState = { + listenOnly: Boolean): VoiceUserState = { val voiceUserId = RandomStringGenerator.randomAlphanumericString(8) VoiceUserState(intId = user.id, voiceUserId = voiceUserId, callingWith, callerName = user.name, callerNum = user.name, muted, talking, listenOnly) } def createFakeVoiceOnlyUser(callingWith: String, muted: Boolean, talking: Boolean, - listenOnly: Boolean, name: String): VoiceUserState = { + listenOnly: Boolean, name: String): VoiceUserState = { val voiceUserId = RandomStringGenerator.randomAlphanumericString(8) val intId = "v_" + RandomStringGenerator.randomAlphanumericString(16) VoiceUserState(intId, voiceUserId = voiceUserId, callingWith, callerName = name, diff --git a/akka-bbb-transcode/.gitignore b/akka-bbb-transcode/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..1c0e395724135e398ce522ad03e88032ccb35e76 --- /dev/null +++ b/akka-bbb-transcode/.gitignore @@ -0,0 +1,49 @@ +.metadata +.project +.classpath +.settings +.history +.worksheet +gen +**/*.swp +**/*~.nib +**/build/ +**/*.pbxuser +**/*.perspective +**/*.perspectivev3 +*.xcworkspace +*.xcuserdatad +*.iml +project/*.ipr +project/*.iml +project/*.iws +project/out +project/*/target +project/target +project/*/bin +project/*/build +project/*.iml +project/*/*.iml +project/.idea +project/.idea/* +.idea/ +.DS_Store +project/.DS_Store +project/*/.DS_Store +tm.out +tmlog*.log +*.tm*.epoch +out/ +provisioning/.vagrant +provisioning/*/.vagrant +provisioning/*/*.known +/sbt/akka-patterns-store/ +/daemon/src/build/ +*.lock +logs/ +tmp/ +build/ +akka-patterns-store/ +lib_managed/ +.cache +bin/ diff --git a/akka-bbb-transcode/README.md b/akka-bbb-transcode/README.md new file mode 100644 index 0000000000000000000000000000000000000000..2c5213836807b15e841d9ce2cdf40fd527ac7801 --- /dev/null +++ b/akka-bbb-transcode/README.md @@ -0,0 +1,12 @@ + +# akka-bbb-transcode + +This app implements a simple mechanism for media transcoding, acting as a relay between endpoints. This uses [FFmpeg](http://ffmpeg.org/) for transcoding between media formats and exchanging protocols. + +building and running +--- +```bash +cd akka-bbb-transcode/ +sbt clean +sbt run +``` diff --git a/akka-bbb-transcode/build.sbt b/akka-bbb-transcode/build.sbt new file mode 100755 index 0000000000000000000000000000000000000000..68d5a5305231278a5f2c82bcee430e54b9a31415 --- /dev/null +++ b/akka-bbb-transcode/build.sbt @@ -0,0 +1,97 @@ +enablePlugins(JavaServerAppPackaging) + +name := "bbb-transcode-akka" + +organization := "org.bigbluebutton" + +version := "0.0.1" + +scalaVersion := "2.11.6" + +scalacOptions ++= Seq( + "-unchecked", + "-deprecation", + "-Xlint", + "-Ywarn-dead-code", + "-language:_", + "-target:jvm-1.7", + "-encoding", "UTF-8" +) + +resolvers ++= Seq( + "spray repo" at "http://repo.spray.io/", + "rediscala" at "http://dl.bintray.com/etaty/maven", + "blindside-repos" at "http://blindside.googlecode.com/svn/repository/" +) + +publishTo := Some(Resolver.file("file", new File(Path.userHome.absolutePath+"/dev/repo/maven-repo/releases" )) ) + +// We want to have our jar files in lib_managed dir. +// This way we'll have the right path when we import +// into eclipse. +retrieveManaged := true + +testOptions in Test += Tests.Argument(TestFrameworks.Specs2, "html", "console", "junitxml") + +testOptions in Test += Tests.Argument(TestFrameworks.ScalaTest, "-h", "target/scalatest-reports") + +libraryDependencies ++= { + val akkaVersion = "2.3.11" + Seq( + "com.typesafe.akka" %% "akka-actor" % akkaVersion, + "com.typesafe.akka" %% "akka-testkit" % akkaVersion % "test", + "com.typesafe.akka" %% "akka-slf4j" % akkaVersion, + "ch.qos.logback" % "logback-classic" % "1.0.3", + "org.pegdown" % "pegdown" % "1.4.0", + "junit" % "junit" % "4.11", + "com.etaty.rediscala" %% "rediscala" % "1.4.0", + "commons-codec" % "commons-codec" % "1.8", + "joda-time" % "joda-time" % "2.3", + "com.google.code.gson" % "gson" % "1.7.1", + "redis.clients" % "jedis" % "2.1.0", + "org.apache.commons" % "commons-lang3" % "3.2", + "org.bigbluebutton" % "bbb-common-message_2.12" % "0.0.19-SNAPSHOT" + )} + +seq(Revolver.settings: _*) + +scalariformSettings + +//----------- +// Packaging +// +// Reference: +// https://github.com/muuki88/sbt-native-packager-examples/tree/master/akka-server-app +// http://www.scala-sbt.org/sbt-native-packager/index.html +//----------- +mainClass := Some("org.bigbluebutton.Boot") + +maintainer in Linux := "Mario Gasparoni <mariogasparoni@gmail.com>" + +packageSummary in Linux := "BigBlueButton Transcoder" + +packageDescription := """BigBlueButton FFmpeg transcoder.""" + +val user = "bigbluebutton" + +val group = "bigbluebutton" + +// user which will execute the application +daemonUser in Linux := user + +// group which will execute the application +daemonGroup in Linux := group + +mappings in Universal <+= (packageBin in Compile, sourceDirectory ) map { (_, src) => + // Move the application.conf so the user can override settings here + val appConf = src / "main" / "resources" / "application.conf" + appConf -> "conf/application.conf" +} + +mappings in Universal <+= (packageBin in Compile, sourceDirectory ) map { (_, src) => + // Move logback.xml so the user can override settings here + val logConf = src / "main" / "resources" / "logback.xml" + logConf -> "conf/logback.xml" +} + +debianPackageDependencies in Debian ++= Seq("java7-runtime-headless", "bash") diff --git a/akka-bbb-transcode/project/Build.scala b/akka-bbb-transcode/project/Build.scala new file mode 100755 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/akka-bbb-transcode/project/build.properties b/akka-bbb-transcode/project/build.properties new file mode 100755 index 0000000000000000000000000000000000000000..a6e117b61042ee81c62ba3a0fc5210d9502944df --- /dev/null +++ b/akka-bbb-transcode/project/build.properties @@ -0,0 +1 @@ +sbt.version=0.13.8 diff --git a/akka-bbb-transcode/project/plugins.sbt b/akka-bbb-transcode/project/plugins.sbt new file mode 100755 index 0000000000000000000000000000000000000000..87ef6448644c23eed22abe7453eefd0054ca02a7 --- /dev/null +++ b/akka-bbb-transcode/project/plugins.sbt @@ -0,0 +1,7 @@ +addSbtPlugin("io.spray" % "sbt-revolver" % "0.7.2") + +addSbtPlugin("com.typesafe.sbt" % "sbt-scalariform" % "1.3.0") + +addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "2.2.0") + +addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.0.0") diff --git a/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/DestroyVideoTranscoderReply.java b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/DestroyVideoTranscoderReply.java new file mode 100644 index 0000000000000000000000000000000000000000..5894a96dfd4713b03edd9fb7574f8efe1cd3b1e5 --- /dev/null +++ b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/DestroyVideoTranscoderReply.java @@ -0,0 +1,20 @@ +package org.bigbluebutton.transcode.api; + +public class DestroyVideoTranscoderReply extends InternalMessage { + private final String meetingId; + private final String transcoderId; + + public DestroyVideoTranscoderReply(String meetingId, String transcoderId) { + this.meetingId = meetingId; + this.transcoderId = transcoderId; + } + + public String getMeetingId() { + return meetingId; + } + + public String getTranscoderId() { + return transcoderId; + } + +} diff --git a/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/DestroyVideoTranscoderRequest.java b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/DestroyVideoTranscoderRequest.java new file mode 100644 index 0000000000000000000000000000000000000000..b11005906fac4ee48b2bd12c13972a3619e09d51 --- /dev/null +++ b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/DestroyVideoTranscoderRequest.java @@ -0,0 +1,6 @@ +package org.bigbluebutton.transcode.api; + +public class DestroyVideoTranscoderRequest extends InternalMessage { + public DestroyVideoTranscoderRequest() {} + +} diff --git a/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/InternalMessage.java b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/InternalMessage.java new file mode 100644 index 0000000000000000000000000000000000000000..a0115ba6d6d8da82258857da2d9f9ad0cfbfab0d --- /dev/null +++ b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/InternalMessage.java @@ -0,0 +1,3 @@ +package org.bigbluebutton.transcode.api; + +public class InternalMessage {} diff --git a/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/RestartVideoTranscoderReply.java b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/RestartVideoTranscoderReply.java new file mode 100644 index 0000000000000000000000000000000000000000..e0c9d7702ae7d6759cc87521611475d6252da72c --- /dev/null +++ b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/RestartVideoTranscoderReply.java @@ -0,0 +1,26 @@ +package org.bigbluebutton.transcode.api; + +public class RestartVideoTranscoderReply extends InternalMessage { + private final String meetingId; + private final String transcoderId; + private final String output; + + public RestartVideoTranscoderReply(String meetingId, String transcoderId, String output) { + this.meetingId = meetingId; + this.transcoderId = transcoderId; + this.output = output; + } + + public String getMeetingId() { + return meetingId; + } + + public String getTranscoderId() { + return transcoderId; + } + + public String getOutput() { + return output; + } + +} diff --git a/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/RestartVideoTranscoderRequest.java b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/RestartVideoTranscoderRequest.java new file mode 100644 index 0000000000000000000000000000000000000000..d3a821cc121ce4524c10c97224cd3d41407546c9 --- /dev/null +++ b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/RestartVideoTranscoderRequest.java @@ -0,0 +1,5 @@ +package org.bigbluebutton.transcode.api; + +public class RestartVideoTranscoderRequest extends InternalMessage { + public RestartVideoTranscoderRequest() {} +} diff --git a/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/StartVideoProbingReply.java b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/StartVideoProbingReply.java new file mode 100644 index 0000000000000000000000000000000000000000..6c5937d24eacf20b41bcf6e74ac58d7d415a7b00 --- /dev/null +++ b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/StartVideoProbingReply.java @@ -0,0 +1,27 @@ +package org.bigbluebutton.transcode.api; + +import java.util.Map; + +public class StartVideoProbingReply extends InternalMessage { + private final String meetingId; + private final String transcoderId; + private final Map<String,String> probingData; + + public StartVideoProbingReply (String meetingId, String transcoderId, Map<String,String> probingData) { + this.meetingId = meetingId; + this.transcoderId = transcoderId; + this.probingData = probingData; + } + + public String getMeetingId() { + return meetingId; + } + + public String getTranscoderId() { + return transcoderId; + } + + public Map<String,String> getProbingData(){ + return probingData; + } +} diff --git a/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/StartVideoProbingRequest.java b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/StartVideoProbingRequest.java new file mode 100644 index 0000000000000000000000000000000000000000..db4e21767e720b9e35dc2e95a3d15a6b95a865d9 --- /dev/null +++ b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/StartVideoProbingRequest.java @@ -0,0 +1,5 @@ +package org.bigbluebutton.transcode.api; + +public class StartVideoProbingRequest extends InternalMessage { + public StartVideoProbingRequest() {} +} diff --git a/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/StartVideoTranscoderReply.java b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/StartVideoTranscoderReply.java new file mode 100644 index 0000000000000000000000000000000000000000..c840e22460e67c84ee0e159bf85a2fd304bf75e6 --- /dev/null +++ b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/StartVideoTranscoderReply.java @@ -0,0 +1,26 @@ +package org.bigbluebutton.transcode.api; + +public class StartVideoTranscoderReply extends InternalMessage { + private final String meetingId; + private final String transcoderId; + private final String output; + + public StartVideoTranscoderReply(String meetingId, String transcoderId, String output) { + this.meetingId = meetingId; + this.transcoderId = transcoderId; + this.output = output; + } + + public String getMeetingId() { + return meetingId; + } + + public String getTranscoderId() { + return transcoderId; + } + + public String getOutput() { + return output; + } + +} diff --git a/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/StartVideoTranscoderRequest.java b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/StartVideoTranscoderRequest.java new file mode 100644 index 0000000000000000000000000000000000000000..2beaf5163afe36602c6813cde948cf651087fe3c --- /dev/null +++ b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/StartVideoTranscoderRequest.java @@ -0,0 +1,5 @@ +package org.bigbluebutton.transcode.api; + +public class StartVideoTranscoderRequest extends InternalMessage { + public StartVideoTranscoderRequest() {} +} diff --git a/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/StopVideoTranscoderReply.java b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/StopVideoTranscoderReply.java new file mode 100644 index 0000000000000000000000000000000000000000..8b7544010d0790dea84ed299b27e2f79d15b3d64 --- /dev/null +++ b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/StopVideoTranscoderReply.java @@ -0,0 +1,20 @@ +package org.bigbluebutton.transcode.api; + +public class StopVideoTranscoderReply extends InternalMessage { + private final String meetingId; + private final String transcoderId; + + public StopVideoTranscoderReply(String meetingId, String transcoderId) { + this.meetingId = meetingId; + this.transcoderId = transcoderId; + } + + public String getMeetingId() { + return meetingId; + } + + public String getTranscoderId() { + return transcoderId; + } + +} diff --git a/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/StopVideoTranscoderRequest.java b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/StopVideoTranscoderRequest.java new file mode 100644 index 0000000000000000000000000000000000000000..1902077ebdc4225854eee2a765ba77cec83aec3a --- /dev/null +++ b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/StopVideoTranscoderRequest.java @@ -0,0 +1,5 @@ +package org.bigbluebutton.transcode.api; + +public class StopVideoTranscoderRequest extends InternalMessage { + public StopVideoTranscoderRequest() {} +} diff --git a/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/TranscodingFinishedSuccessfully.java b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/TranscodingFinishedSuccessfully.java new file mode 100644 index 0000000000000000000000000000000000000000..02c91c1c7fe8d01c154f37f8af649d5c40da44f1 --- /dev/null +++ b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/TranscodingFinishedSuccessfully.java @@ -0,0 +1,19 @@ +package org.bigbluebutton.transcode.api; + +public class TranscodingFinishedSuccessfully extends InternalMessage { + private final String meetingId; + private final String transcoderId; + + public TranscodingFinishedSuccessfully (String meetingId, String transcoderId) { + this.meetingId = meetingId; + this.transcoderId = transcoderId; + } + + public String getMeetingId() { + return meetingId; + } + + public String getTranscoderId() { + return transcoderId; + } +} diff --git a/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/TranscodingFinishedUnsuccessfully.java b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/TranscodingFinishedUnsuccessfully.java new file mode 100644 index 0000000000000000000000000000000000000000..e2c7b45272fd5de9ab6826b830bb9f304fe5a281 --- /dev/null +++ b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/TranscodingFinishedUnsuccessfully.java @@ -0,0 +1,19 @@ +package org.bigbluebutton.transcode.api; + +public class TranscodingFinishedUnsuccessfully extends InternalMessage { + private final String meetingId; + private final String transcoderId; + + public TranscodingFinishedUnsuccessfully (String meetingId, String transcoderId) { + this.meetingId = meetingId; + this.transcoderId = transcoderId; + } + + public String getMeetingId() { + return meetingId; + } + + public String getTranscoderId() { + return transcoderId; + } +} diff --git a/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/UpdateVideoTranscoderReply.java b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/UpdateVideoTranscoderReply.java new file mode 100644 index 0000000000000000000000000000000000000000..8a2a5540c91387c3cf3257466e46caa0e5f5f149 --- /dev/null +++ b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/UpdateVideoTranscoderReply.java @@ -0,0 +1,26 @@ +package org.bigbluebutton.transcode.api; + +import java.util.Map; + +public class UpdateVideoTranscoderReply extends InternalMessage { + private final String meetingId; + private final String transcoderId; + private final String output; + + public UpdateVideoTranscoderReply(String meetingId, String transcoderId, String output) { + this.meetingId = meetingId; + this.transcoderId = transcoderId; + this.output = output; + } + + public String getMeetingId() { + return meetingId; + } + public String getTranscoderId() { + return transcoderId; + } + + public String getOutput() { + return output; + } +} diff --git a/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/UpdateVideoTranscoderRequest.java b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/UpdateVideoTranscoderRequest.java new file mode 100644 index 0000000000000000000000000000000000000000..68341ceb47a18818e3e3352553d51d35b0abee36 --- /dev/null +++ b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/api/UpdateVideoTranscoderRequest.java @@ -0,0 +1,15 @@ +package org.bigbluebutton.transcode.api; + +import java.util.Map; + +public class UpdateVideoTranscoderRequest extends InternalMessage { + private final Map<String,String> params; + + public UpdateVideoTranscoderRequest(Map<String,String> params) { + this.params = params; + } + + public Map<String,String> getParams() { + return params; + } +} diff --git a/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/core/VideoTranscoder.java b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/core/VideoTranscoder.java new file mode 100644 index 0000000000000000000000000000000000000000..27c47bc00b6f600e0aab4a7fd51cfc2e7ba3e39c --- /dev/null +++ b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/core/VideoTranscoder.java @@ -0,0 +1,933 @@ + +package org.bigbluebutton.transcode.core; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.StringReader; +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.bigbluebutton.transcode.core.ffprobe.FFProbeCommand; +import org.bigbluebutton.transcode.core.ffmpeg.FFmpegCommand; +import org.bigbluebutton.transcode.core.ffmpeg.FFmpegConstants; +import org.bigbluebutton.transcode.core.ffmpeg.FFmpegUtils; +import org.bigbluebutton.transcode.core.processmonitor.ProcessMonitor; +import org.bigbluebutton.transcode.core.processmonitor.ProcessMonitorObserver; +import org.bigbluebutton.common.messages.Constants; + +import akka.actor.UntypedActor; +import akka.actor.ActorRef; +import akka.actor.Props; +import akka.japi.Creator; +import org.bigbluebutton.transcode.api.InternalMessage; +import org.bigbluebutton.transcode.api.DestroyVideoTranscoderRequest; +import org.bigbluebutton.transcode.api.DestroyVideoTranscoderReply; +import org.bigbluebutton.transcode.api.RestartVideoTranscoderRequest; +import org.bigbluebutton.transcode.api.RestartVideoTranscoderReply; +import org.bigbluebutton.transcode.api.StartVideoProbingRequest; +import org.bigbluebutton.transcode.api.StartVideoProbingReply; +import org.bigbluebutton.transcode.api.StartVideoTranscoderRequest; +import org.bigbluebutton.transcode.api.StartVideoTranscoderReply; +import org.bigbluebutton.transcode.api.StopVideoTranscoderRequest; +import org.bigbluebutton.transcode.api.StopVideoTranscoderReply; +import org.bigbluebutton.transcode.api.UpdateVideoTranscoderRequest; +import org.bigbluebutton.transcode.api.UpdateVideoTranscoderReply; +import org.bigbluebutton.transcode.api.TranscodingFinishedSuccessfully; +import org.bigbluebutton.transcode.api.TranscodingFinishedUnsuccessfully; + +public class VideoTranscoder extends UntypedActor implements ProcessMonitorObserver { + + public static enum Type{ + TRANSCODE_RTP_TO_RTMP, + TRANSCODE_RTMP_TO_RTP, + TRANSCODE_FILE_TO_RTP, + TRANSCODE_FILE_TO_RTMP, + TRANSCODE_H264_TO_H263, + TRANSCODE_ROTATE_RIGHT, + TRANSCODE_ROTATE_LEFT, + TRANSCODE_ROTATE_UPSIDE_DOWN, + PROBE_RTMP + }; + public static enum Status{RUNNING, STOPPED, UPDATING} + public static final String VIDEO_CONF_LOGO_PATH = FFmpegUtils.videoconfLogoPath; + public static final String FFMPEG_PATH = FFmpegUtils.ffmpegPath; + public static final String FFPROBE_PATH = FFmpegUtils.ffprobePath; + + //if ffmpeg restarts 5 times in less than 5 seconds, we will not restart it anymore + //this is to prevent a infinite loop of ffmpeg restartings + private static final int MAX_RESTARTINGS_NUMBER = 5; + private static final long MIN_RESTART_TIME = 5000; //5 seconds + private int currentFFmpegRestartNumber = 0; + private long lastFFmpegRestartTime = 0; + + private ActorRef parentActor; + private Type type; + private Status status = Status.STOPPED; + private ProcessMonitor ffmpegProcessMonitor; + private ProcessMonitor ffprobeProcessMonitor; + private FFmpegCommand ffmpeg; + private String transcoderId; + private String username; + private String callername; //used to create rtp-> (any) SDP + private String videoStreamName; + private String input; + private String outputLive; + private String output; //output of transcoder + private String meetingId; + private String voiceBridge; + private String sourceIp; + private String destinationIp; + private String localVideoPort; + private String remoteVideoPort; + private String sdpPath; + private String sourceModule; + private VideoTranscoderObserver observer; + private String globalVideoWidth = "640";// get this from properties (Stored in FFmpegUtils) + private String globalVideoHeight = "480";// get this from properties + public static final String FFMPEG_NAME = "FFMPEG"; + public static final String FFPROBE_NAME = "FFPROBE"; + + public static Props props(final ActorRef parentActor, final String meetingId, final String transcoderId, final Map<String,String> params) { + return Props.create(new Creator<VideoTranscoder>() { + private static final long serialVersionUID = 1L; + + @Override + public VideoTranscoder create() throws Exception { + return new VideoTranscoder(parentActor, meetingId, transcoderId, params); + } + }); + } + + @Override + public void onReceive(Object msg) { + if (msg instanceof StartVideoTranscoderRequest) { + start(); + } else if (msg instanceof StopVideoTranscoderRequest) { + stop(); + } else if (msg instanceof UpdateVideoTranscoderRequest) { + UpdateVideoTranscoderRequest uvtr = (UpdateVideoTranscoderRequest) msg; + update(uvtr.getParams()); + } else if (msg instanceof DestroyVideoTranscoderRequest) { + destroyTranscoder(); + } else if (msg instanceof RestartVideoTranscoderRequest) { + restart(); + } else if (msg instanceof StartVideoProbingRequest) { + probeVideoStream(); + } + } + + private void stopActor() { + if (context() != null) + context().stop(getSelf()); + } + + private void sendMessage(InternalMessage msg) { + if ((parentActor != null) && (msg != null)) + parentActor.tell(msg,getSelf()); + } + + public VideoTranscoder(ActorRef parentActor, String meetingId, String transcoderId, Map<String,String> params){ + this.parentActor = parentActor; + this.meetingId = meetingId; + this.transcoderId = transcoderId; + if (params != null) + switch (params.get(Constants.TRANSCODER_TYPE)){ + case Constants.TRANSCODE_RTP_TO_RTMP: + this.type = Type.TRANSCODE_RTP_TO_RTMP; + this.sourceIp = params.get(Constants.LOCAL_IP_ADDRESS); + this.localVideoPort = params.get(Constants.LOCAL_VIDEO_PORT); + this.remoteVideoPort = params.get(Constants.REMOTE_VIDEO_PORT); + this.destinationIp = params.get(Constants.DESTINATION_IP_ADDRESS); + this.voiceBridge = params.get(Constants.VOICE_CONF); + this.callername = params.get(Constants.CALLERNAME); + break; + + case Constants.TRANSCODE_RTMP_TO_RTP: + this.type = Type.TRANSCODE_RTMP_TO_RTP; + this.sourceIp = params.get(Constants.LOCAL_IP_ADDRESS); + this.localVideoPort = params.get(Constants.LOCAL_VIDEO_PORT); + this.remoteVideoPort = params.get(Constants.REMOTE_VIDEO_PORT); + this.destinationIp = params.get(Constants.DESTINATION_IP_ADDRESS); + this.voiceBridge = params.get(Constants.VOICE_CONF); + this.callername = params.get(Constants.CALLERNAME); + this.videoStreamName = params.get(Constants.INPUT); + break; + + case Constants.TRANSCODE_FILE_TO_RTP: + this.type = Type.TRANSCODE_FILE_TO_RTP; + this.sourceIp = params.get(Constants.LOCAL_IP_ADDRESS); + this.localVideoPort = params.get(Constants.LOCAL_VIDEO_PORT); + this.remoteVideoPort = params.get(Constants.REMOTE_VIDEO_PORT); + this.destinationIp = params.get(Constants.DESTINATION_IP_ADDRESS); + this.voiceBridge = params.get(Constants.VOICE_CONF); + this.callername = params.get(Constants.CALLERNAME); + break; + + case Constants.TRANSCODE_FILE_TO_RTMP: + this.type = Type.TRANSCODE_FILE_TO_RTMP; + this.sourceIp = params.get(Constants.LOCAL_IP_ADDRESS); + this.localVideoPort = params.get(Constants.LOCAL_VIDEO_PORT); + this.remoteVideoPort = params.get(Constants.REMOTE_VIDEO_PORT); + this.destinationIp = params.get(Constants.DESTINATION_IP_ADDRESS); + this.voiceBridge = params.get(Constants.VOICE_CONF); + this.callername = params.get(Constants.CALLERNAME); + break; + + case Constants.TRANSCODE_H264_TO_H263: + this.type = Type.TRANSCODE_H264_TO_H263; + this.sourceModule = params.get(Constants.MODULE); + this.sourceIp = params.get(Constants.LOCAL_IP_ADDRESS); + this.destinationIp = params.get(Constants.DESTINATION_IP_ADDRESS); + this.videoStreamName = params.get(Constants.INPUT); + break; + + case Constants.TRANSCODE_ROTATE_RIGHT: + this.type = Type.TRANSCODE_ROTATE_RIGHT; + this.sourceIp = params.get(Constants.LOCAL_IP_ADDRESS); + this.destinationIp = params.get(Constants.DESTINATION_IP_ADDRESS); + this.videoStreamName = params.get(Constants.INPUT); + break; + + case Constants.TRANSCODE_ROTATE_LEFT: + this.type = Type.TRANSCODE_ROTATE_LEFT; + this.sourceIp = params.get(Constants.LOCAL_IP_ADDRESS); + this.destinationIp = params.get(Constants.DESTINATION_IP_ADDRESS); + this.videoStreamName = params.get(Constants.INPUT); + break; + + case Constants.TRANSCODE_ROTATE_UPSIDE_DOWN: + this.type = Type.TRANSCODE_ROTATE_UPSIDE_DOWN; + this.sourceIp = params.get(Constants.LOCAL_IP_ADDRESS); + this.destinationIp = params.get(Constants.DESTINATION_IP_ADDRESS); + this.videoStreamName = params.get(Constants.INPUT); + break; + + case Constants.PROBE_RTMP: + this.type = Type.PROBE_RTMP; + this.videoStreamName = params.get(Constants.INPUT); + break; + + default: + break; + } + } + + private synchronized void start() { + switch (status){ + case RUNNING: + System.out.println(" > Transcoder already running, sending it's output"); + break; + case UPDATING: + System.out.println(" > Transcoder is being updated, returning it's current output"); + break; + default: + status = Status.RUNNING; + startTranscoder(); + break; + } + sendMessage(new StartVideoTranscoderReply(meetingId, transcoderId, output)); + } + + private boolean startTranscoder(){ + if ((ffmpegProcessMonitor != null) &&(ffmpeg != null)) { + return false; + } + + String[] command; + + if(!canFFmpegRun()) { + //log.debug("***TRANSCODER WILL NOT START: ffmpeg cannot run"); + return false; + } + + //log.debug("Starting Video Transcoder..."); + + switch(type){ + case TRANSCODE_RTMP_TO_RTP: + + if(!areRtmpToRtpParametersValid()) { + System.out.println(" > ***TRANSCODER WILL NOT START: Rtmp to Rtp Parameters are invalid"); + return false; + } + + + input = "rtmp://" + sourceIp + "/video/" + meetingId + "/" + + videoStreamName + " live=1"; //the full input is composed by the videoStreamName + outputLive = "rtp://" + destinationIp + ":" + remoteVideoPort + "?localport=" + localVideoPort; + output = ""; + + ffmpeg = new FFmpegCommand(); + ffmpeg.setFFmpegPath(FFMPEG_PATH); + ffmpeg.setInput(input); + ffmpeg.addRtmpInputConnectionParameter(meetingId); + ffmpeg.addRtmpInputConnectionParameter("transcoder-"+transcoderId); + ffmpeg.setFrameRate(15); + ffmpeg.setBufSize(1024); + ffmpeg.setGop(1); //MCU compatibility + ffmpeg.setCodec("libopenh264"); + ffmpeg.setMaxRate(1024); + ffmpeg.setSliceMode("dyn"); + ffmpeg.setMaxNalSize("1024"); + ffmpeg.setRtpFlags("h264_mode0"); //RTP's packetization mode 0 + ffmpeg.setProfile("baseline"); + ffmpeg.setFormat("rtp"); + ffmpeg.setPayloadType(FFmpegConstants.CODEC_ID_H264); + ffmpeg.setLoglevel("verbose"); + ffmpeg.setOutput(outputLive); + ffmpeg.setAnalyzeDuration("1000"); // 1ms + ffmpeg.setProbeSize("32"); // 1ms + System.out.println("Preparing FFmpeg process monitor"); + command = ffmpeg.getFFmpegCommand(true); + break; + + case TRANSCODE_RTP_TO_RTMP: + + if(!areRtpToRtmpParametersValid()) { + System.out.println(" > ***TRANSCODER WILL NOT START: Rtp to Rtmp Parameters are invalid"); + return false; + } + + //Create SDP FILE + sdpPath = FFmpegUtils.createSDPVideoFile(callername, sourceIp, localVideoPort, FFmpegConstants.CODEC_NAME_H264, FFmpegConstants.CODEC_ID_H264, FFmpegConstants.SAMPLE_RATE_H264, voiceBridge); + input = sdpPath; + + //Generate video stream name + videoStreamName = generateVideoStreamName(type); + // TODO make stream path dynamic by turning it into a param + outputLive = "rtmp://" + destinationIp + "/video-broadcast/" + meetingId + "/" + + videoStreamName+" live=1"; + output = videoStreamName; + + ffmpeg = new FFmpegCommand(); + ffmpeg.setFFmpegPath(FFMPEG_PATH); + ffmpeg.setInput(input); + + ffmpeg.setLoglevel("quiet"); + ffmpeg.setOutput(outputLive); + ffmpeg.addRtmpOutputConnectionParameter(meetingId); + ffmpeg.addRtmpOutputConnectionParameter("transcoder-"+transcoderId); + ffmpeg.setCodec("copy"); + ffmpeg.setFormat("flv"); + command = ffmpeg.getFFmpegCommand(true); + break; + + case TRANSCODE_FILE_TO_RTP: + + if(!areFileToRtpParametersValid()) { + System.out.println(" > ***TRANSCODER WILL NOT START: File to Rtp Parameters are invalid"); + return false; + } + + input = VIDEO_CONF_LOGO_PATH; + outputLive = "rtp://" + destinationIp + ":" + remoteVideoPort + "?localport=" + localVideoPort; + output = ""; + username = callername; + + ffmpeg = new FFmpegCommand(); + ffmpeg.setFFmpegPath(FFMPEG_PATH); + ffmpeg.setIgnoreLoop(0); + ffmpeg.setInput(input); + ffmpeg.setInputLive(true); + ffmpeg.addCustomParameter("-s", globalVideoWidth+"x"+globalVideoHeight); + ffmpeg.setFrameRate(15); + ffmpeg.setPayloadType(FFmpegConstants.CODEC_ID_H264); + ffmpeg.setLoglevel("quiet"); + if (FFmpegUtils.isUserVideoSubtitleEnabled()) + ffmpeg.addCustomParameter("-vf","drawtext=fontfile=/usr/share/fonts/truetype/liberation/LiberationSans-Bold.ttf:text="+username+":x="+globalVideoWidth+"-tw-20:y="+globalVideoHeight+"-th-20:fontcolor=white@0.9:shadowcolor=black:shadowx=2:shadowy=2:fontsize=20"); + ffmpeg.setGop(1); + ffmpeg.setCodec("libopenh264"); + ffmpeg.setSliceMode("dyn"); + ffmpeg.setMaxNalSize("1024"); + ffmpeg.setRtpFlags("h264_mode0"); //RTP's packetization mode 0 + ffmpeg.setProfile("baseline"); + ffmpeg.setFormat("rtp"); + ffmpeg.setOutput(outputLive); + command = ffmpeg.getFFmpegCommand(true); + break; + + case TRANSCODE_FILE_TO_RTMP: + if(!areFileToRtmpParametersValid()) { + System.out.println("***TRANSCODER WILL NOT START: File to Rtmp Parameters are invalid"); + return false; + } + videoStreamName = generateVideoStreamName(type); + input = VIDEO_CONF_LOGO_PATH; + outputLive = "rtmp://" + destinationIp + "/video/" + meetingId + "/" + + videoStreamName+" live=1"; + output = videoStreamName; + + ffmpeg = new FFmpegCommand(); + ffmpeg.setFFmpegPath(FFMPEG_PATH); + ffmpeg.setInput(input); + ffmpeg.setInputLive(true); + ffmpeg.setFrameSize("640x480"); + ffmpeg.setIgnoreLoop(0); + ffmpeg.setFormat("flv"); + ffmpeg.setLoglevel("verbose"); + ffmpeg.addRtmpOutputConnectionParameter(meetingId); + ffmpeg.addRtmpOutputConnectionParameter("transcoder-"+transcoderId); + ffmpeg.setOutput(outputLive); + ffmpeg.setCodec("libopenh264"); + ffmpeg.setProfile("baseline"); + command = ffmpeg.getFFmpegCommand(true); + break; + + case TRANSCODE_H264_TO_H263: + if(!areH264ToH263ParametersValid()) { + System.out.println(" > ***TRANSCODER WILL NOT START: H264 to H263 parameters are invalid"); + return false; + } + + switch(sourceModule) { + case FFmpegUtils.VIDEO_MODULE: + input = "rtmp://" + sourceIp + "/" + sourceModule + "/" + meetingId + "/" + videoStreamName + " live=1"; + outputLive = "rtmp://" + destinationIp + "/" + sourceModule + "/" + meetingId + "/" + FFmpegUtils.H263PREFIX + "/" + videoStreamName; + output = videoStreamName; + break; + case FFmpegUtils.DESKSHARE_MODULE: + input = "rtmp://" + sourceIp + "/" + sourceModule + "/" + meetingId + " live=1"; + outputLive = "rtmp://" + destinationIp + "/" + sourceModule + "/" + FFmpegUtils.H263PREFIX + "/" + meetingId; + output = meetingId; + break; + default: + System.out.println(" > ***TRANSCODER WILL NOT START: Unrecognized module: " + sourceModule); + } + + ffmpeg = new FFmpegCommand(); + ffmpeg.setFFmpegPath(FFMPEG_PATH); + ffmpeg.setInput(input); + ffmpeg.setCodec("flv1"); // Sorensen H263 + ffmpeg.setFormat("flv"); + ffmpeg.addRtmpOutputConnectionParameter(meetingId); + ffmpeg.addRtmpOutputConnectionParameter(transcoderId); + ffmpeg.setOutput(outputLive); + ffmpeg.setLoglevel("quiet"); + ffmpeg.setAnalyzeDuration("10000"); // 10ms + command = ffmpeg.getFFmpegCommand(true); + break; + + case TRANSCODE_ROTATE_RIGHT: + if(!areRotateParametersValid()) { + System.out.println(" > ***TRANSCODER WILL NOT START: Rotate parameters are invalid"); + return false; + } + + input = "rtmp://" + sourceIp + "/video/" + meetingId + "/" + FFmpegUtils.ROTATE_RIGHT + "/" + videoStreamName + " live=1"; + outputLive = "rtmp://" + destinationIp + "/video/" + meetingId + "/" + videoStreamName; + output = videoStreamName; + + ffmpeg = new FFmpegCommand(); + ffmpeg.setFFmpegPath(FFMPEG_PATH); + ffmpeg.setInput(input); + ffmpeg.setFormat("flv"); + ffmpeg.addRtmpOutputConnectionParameter(meetingId); + ffmpeg.addRtmpOutputConnectionParameter(transcoderId); + ffmpeg.setOutput(outputLive); + ffmpeg.setLoglevel("warning"); + ffmpeg.setRotation(FFmpegUtils.ROTATE_RIGHT); + ffmpeg.setAnalyzeDuration("10000"); // 10ms + command = ffmpeg.getFFmpegCommand(true); + break; + + case TRANSCODE_ROTATE_LEFT: + if(!areRotateParametersValid()) { + System.out.println(" > ***TRANSCODER WILL NOT START: Rotate parameters are invalid"); + return false; + } + + input = "rtmp://" + sourceIp + "/video/" + meetingId + "/" + FFmpegUtils.ROTATE_LEFT + "/" + videoStreamName + " live=1"; + outputLive = "rtmp://" + destinationIp + "/video/" + meetingId + "/" + videoStreamName; + output = videoStreamName; + + ffmpeg = new FFmpegCommand(); + ffmpeg.setFFmpegPath(FFMPEG_PATH); + ffmpeg.setInput(input); + ffmpeg.setFormat("flv"); + ffmpeg.addRtmpOutputConnectionParameter(meetingId); + ffmpeg.addRtmpOutputConnectionParameter(transcoderId); + ffmpeg.setOutput(outputLive); + ffmpeg.setLoglevel("warning"); + ffmpeg.setRotation(FFmpegUtils.ROTATE_LEFT); + ffmpeg.setAnalyzeDuration("10000"); // 10ms + command = ffmpeg.getFFmpegCommand(true); + break; + + case TRANSCODE_ROTATE_UPSIDE_DOWN: + if(!areRotateParametersValid()) { + System.out.println(" > ***TRANSCODER WILL NOT START: Rotate parameters are invalid"); + return false; + } + + input = "rtmp://" + sourceIp + "/video/" + meetingId + "/" + FFmpegUtils.ROTATE_UPSIDE_DOWN + "/" + videoStreamName + " live=1"; + outputLive = "rtmp://" + destinationIp + "/video/" + meetingId + "/" + videoStreamName; + output = videoStreamName; + + ffmpeg = new FFmpegCommand(); + ffmpeg.setFFmpegPath(FFMPEG_PATH); + ffmpeg.setInput(input); + ffmpeg.setFormat("flv"); + ffmpeg.addRtmpOutputConnectionParameter(meetingId); + ffmpeg.addRtmpOutputConnectionParameter(transcoderId); + ffmpeg.setOutput(outputLive); + ffmpeg.setLoglevel("warning"); + ffmpeg.setRotation(FFmpegUtils.ROTATE_UPSIDE_DOWN); + ffmpeg.setAnalyzeDuration("10000"); // 10ms + command = ffmpeg.getFFmpegCommand(true); + break; + + default: command = null; + } + + if(command != null){ + this.ffmpegProcessMonitor = new ProcessMonitor(command,FFMPEG_NAME); + ffmpegProcessMonitor.setProcessMonitorObserver(this); + ffmpegProcessMonitor.start(); + return true; + } + return false; + } + + private synchronized void stop(){ + status = Status.STOPPED; + stopTranscoder(); + sendMessage(new StopVideoTranscoderReply(meetingId, transcoderId)); + } + + private void stopTranscoder() { + if (ffmpegProcessMonitor != null) { + ffmpegProcessMonitor.forceDestroy(); + clearData(); + } + } + + /** + * Clear monitor and ffmpeg data. + */ + private void clearData() { + ffmpegProcessMonitor = null; + ffmpeg = null; + switch (type) { + case TRANSCODE_RTP_TO_RTMP: + FFmpegUtils.removeSDPVideoFile(voiceBridge); + break; + default: + } + } + + private synchronized void destroyTranscoder() { + status = Status.STOPPED; + stopTranscoder(); + sendMessage(new DestroyVideoTranscoderReply(meetingId, transcoderId)); + stopActor(); + } + + private synchronized void update(Map<String,String> params) { + switch (status) { + case UPDATING: + status = Status.RUNNING; + startTranscoder(); + sendMessage(new UpdateVideoTranscoderReply(meetingId, transcoderId, output)); + break; + default: + if (params != null) { + String transcoderType = params.get(Constants.TRANSCODER_TYPE); + String input = params.get(Constants.INPUT); + String sourceIp = params.get(Constants.LOCAL_IP_ADDRESS); + String localVideoPort = params.get(Constants.LOCAL_VIDEO_PORT); + String remoteVideoPort = params.get(Constants.REMOTE_VIDEO_PORT); + String destinationIp = params.get(Constants.DESTINATION_IP_ADDRESS); + + setType(transcoderType); + setVideoStreamName(input); + setSourceIp(sourceIp); + setLocalVideoPort(localVideoPort); + setRemoteVideoPort(remoteVideoPort); + setDestinationIp(destinationIp); + + status = Status.UPDATING; //mark update status + stopTranscoder(); + } + break; + } + } + + + private synchronized void restart() { + if (!maxRestartsReached()) { + System.out.println(" > [Restart] Starting current transcoder " + transcoderId); + status = Status.RUNNING; + lastFFmpegRestartTime = System.currentTimeMillis(); + clearData(); + startTranscoder(); + sendMessage(new RestartVideoTranscoderReply(meetingId, transcoderId, output)); + } + } + + private boolean maxRestartsReached() { + currentFFmpegRestartNumber++; + if(currentFFmpegRestartNumber == MAX_RESTARTINGS_NUMBER) { + long timeInterval = System.currentTimeMillis() - lastFFmpegRestartTime; + if(timeInterval <= MIN_RESTART_TIME) { + System.out.println(" > Max number of ffmpeg restartings reached in " + timeInterval + " miliseconds for " + transcoderId + "'s Video Transcoder." + + " Not restating it anymore."); + return true; + } + else + currentFFmpegRestartNumber = 0; + } + return false; + } + + public synchronized void transcodingFinishedSuccessfully() { + sendMessage(new TranscodingFinishedSuccessfully(meetingId, transcoderId)); //tell parent for clean up + stopActor(); + } + + public synchronized void probeVideoStream(){ + if (ffmpegProcessMonitor != null) { + FFProbeCommand ffprobe = new FFProbeCommand(outputLive); + String command[]; + + ffprobe.setFFprobepath(FFPROBE_PATH); + ffprobe.setInput(outputLive); + ffprobe.setAnalyzeDuration("1"); + ffprobe.setShowStreams(); + ffprobe.setLoglevel("quiet"); + ffprobe.getFFprobeCommand(true); + + command = ffprobe.getFFprobeCommand(true); + if(command != null){ + this.ffprobeProcessMonitor = new ProcessMonitor(command,FFPROBE_NAME); + ffprobeProcessMonitor.setProcessMonitorObserver(this); + ffprobeProcessMonitor.start(); + } + } else { + } + } + + private void updateGlobalStreamName(String streamName){ + this.videoStreamName = streamName; + String outputLive; + String[] newCommand; + outputLive = "rtmp://" + destinationIp + "/video/" + meetingId + "/" + + this.videoStreamName+" live=1"; + ffmpeg.setOutput(outputLive); //update ffmpeg's output + newCommand = ffmpeg.getFFmpegCommand(true); + ffmpegProcessMonitor.setCommand(newCommand); //update ffmpeg command + } + + public void setVideoTranscoderObserver(VideoTranscoderObserver observer){ + this.observer = observer; + } + + @Override + public void handleProcessFinishedUnsuccessfully(String processMonitorName,String processOutput) { + if ((processMonitorName == null)|| processMonitorName.isEmpty()){ + return; + } + + if (FFMPEG_NAME.equals(processMonitorName)){ + sendMessage(new TranscodingFinishedUnsuccessfully(meetingId, transcoderId)); + }else if (FFPROBE_NAME.equals(processMonitorName)){ + System.out.println(" > Failed to probe video stream " + outputLive); + } + } + + @Override + public void handleProcessFinishedWithSuccess(String processMonitorName, String processOutput) { + if ((processMonitorName == null)|| processMonitorName.isEmpty()) { + System.out.println(" > Can't handle process process monitor finishing with success: UNKNOWN PROCESS"); + return; + } + + if (FFMPEG_NAME.equals(processMonitorName)){ + switch (status) { + case RUNNING: + System.out.println(" > Transcoder finished with success but wasn't closed by the user " + transcoderId + ". Informing parentActor"); + transcodingFinishedSuccessfully(); + break; + case STOPPED: + System.out.println(" > Transcoder closed by the user. Finished with success"); + break; + case UPDATING: + update(null); + break; + default: + break; + } + } + else if (FFPROBE_NAME.equals(processMonitorName)){ + String ffprobeOutput = processOutput; + Map<String,String> ffprobeData = parseFFprobeOutput(ffprobeOutput); + sendMessage(new StartVideoProbingReply(meetingId, transcoderId, ffprobeData)); + }else{ + System.out.println("Can't handle process monitor finishing with success: UNKNOWN PROCESS"); + } + } + + public Map<String,String> parseFFprobeOutput(String ffprobeOutput){ + Pattern pattern = Pattern.compile("(.*)=(.*)"); + Map<String, String> ffprobeResult = new HashMap<String, String>(); + + BufferedReader buf = new BufferedReader(new StringReader(ffprobeOutput)); + String line = null; + try { + while( (line=buf.readLine()) != null){ + Matcher matcher = pattern.matcher(line); + if(matcher.matches()) { + ffprobeResult.put(matcher.group(1), matcher.group(2)); + } + } + } catch (IOException e){ + //log.debug("Error when parsing FFprobe's output"); + } + return ffprobeResult; + } + + + public boolean canFFmpegRun() { + //log.debug("Checking if FFmpeg can run..."); + return validateIps() && isFFmpegPathValid(); + } + + public boolean validateIps(){ + if ((sourceIp == null || sourceIp.isEmpty()) + && (type == Type.TRANSCODE_RTMP_TO_RTP)) + return false; + + if ((destinationIp == null || destinationIp.isEmpty()) + && (type == Type.TRANSCODE_FILE_TO_RTMP + || type == Type.TRANSCODE_FILE_TO_RTP + || type == Type.TRANSCODE_RTMP_TO_RTP + || type == Type.TRANSCODE_FILE_TO_RTP)) + return false; + + return true; + } + + public boolean isFFmpegPathValid() { + /*if (!GlobalCall.ffmpegExists(FFMPEG_PATH)) { + //log.debug("***FFMPEG DOESN'T EXIST: check the FFMPEG path in bigbluebutton-sip.properties"); + return false; + }*/ + + return true; + } + + public boolean areRotateParametersValid() { + // TODO: Check parameters + return true; + } + + public boolean areH264ToH263ParametersValid() { + // TODO: Check parameters + return true; + } + + public boolean areRtmpToRtpParametersValid() { + //log.debug("Checking Rtmp to Rtp Transcoder Parameters..."); + + if(meetingId == null || meetingId.isEmpty()) { + //log.debug("meetingId is null or empty"); + return false; + } + + if(videoStreamName == null || videoStreamName.isEmpty()) { + //log.debug("videoStreamName is null or empty"); + return false; + } + + return areVideoPortsValid(); + } + + public boolean areRtpToRtmpParametersValid() { + //log.debug("Checking Rtp to Rtmp Transcoder Parameters..."); + + if(meetingId == null || meetingId.isEmpty()) { + //log.debug("meetingId is null or empty"); + return false; + } + + return isSdpPathValid(); + } + + public boolean areFileToRtpParametersValid() { + //log.debug("Checking File to Rtp Transcoder Parameters..."); + return areVideoPortsValid() && isVideoConfLogoValid(); + } + + public boolean areFileToRtmpParametersValid() { + //log.debug("Checking File to Rtmp Transcoder Parameters..."); + + if(meetingId == null || meetingId.isEmpty()) { + //log.debug("meetingId is null or empty"); + return false; + } + + return isVideoConfLogoValid(); + } + + public boolean areVideoPortsValid() { + if(localVideoPort == null || localVideoPort.isEmpty()) { + //log.debug("localVideoPort is null or empty"); + return false; + } + + if(remoteVideoPort == null || remoteVideoPort.isEmpty()) { + //log.debug("remoteVideoPort is null or empty"); + return false; + } + + if(localVideoPort.equals("0")) { + //log.debug("localVideoPort is 0"); + return false; + } + + if(remoteVideoPort.equals("0")) { + //log.debug("remoteVideoPort is 0"); + return false; + } + + return true; + + } + + public boolean isVideoConfLogoValid() { + /*if(!GlobalCall.videoConfLogoExists(VIDEO_CONF_LOGO_PATH)) { + //log.debug("***IMAGE FOR VIDEOCONF-LOGO VIDEO DOESN'T EXIST: check the image path in bigbluebutton-sip.properties"); + return false; + }*/ + + return true; + } + + public boolean isSdpPathValid() { + /*if(!GlobalCall.sdpVideoExists(sdpPath)) { + //log.debug("***SDP FOR GLOBAL FFMPEG ({}) doesn't exist", sdpPath); + return false; + }*/ + + return true; + } + + public String getVideoStreamName(){ + return this.videoStreamName; + } + + public String getTranscoderId(){ + return this.transcoderId; + } + + public String getMeetingId(){ + return this.meetingId; + } + + public String getOutput(){ + return this.output; + } + + public String generateVideoStreamName(Type type){ + switch(type){ + case TRANSCODE_RTP_TO_RTMP: + return FFmpegUtils.GLOBAL_VIDEO_STREAM_NAME_PREFIX + voiceBridge + "_" + System.currentTimeMillis(); + case TRANSCODE_FILE_TO_RTMP: + return FFmpegUtils.VIDEOCONF_LOGO_STREAM_NAME_PREFIX + voiceBridge + "_" + System.currentTimeMillis(); + default: + return "unknown_stream_name"; + } + } + + public void setVideoStreamName(String videoStreamName) { + if (videoStreamName != null) this.videoStreamName = videoStreamName; + } + + public void setType(String type) { + if (type == null) return; + switch (type){ + case Constants.TRANSCODE_RTP_TO_RTMP: + this.type = Type.TRANSCODE_RTP_TO_RTMP; + break; + case Constants.TRANSCODE_RTMP_TO_RTP: + this.type = Type.TRANSCODE_RTMP_TO_RTP; + break; + case Constants.TRANSCODE_FILE_TO_RTP: + this.type = Type.TRANSCODE_FILE_TO_RTP; + break; + case Constants.TRANSCODE_FILE_TO_RTMP: + this.type = Type.TRANSCODE_FILE_TO_RTMP; + break; + case Constants.TRANSCODE_H264_TO_H263: + this.type = Type.TRANSCODE_H264_TO_H263; + break; + case Constants.TRANSCODE_ROTATE_RIGHT: + this.type = Type.TRANSCODE_ROTATE_RIGHT; + break; + case Constants.TRANSCODE_ROTATE_LEFT: + this.type = Type.TRANSCODE_ROTATE_LEFT; + break; + case Constants.TRANSCODE_ROTATE_UPSIDE_DOWN: + this.type = Type.TRANSCODE_ROTATE_UPSIDE_DOWN; + break; + default: + return; + } + } + + public String getType() { + switch (type){ + case TRANSCODE_RTP_TO_RTMP: + return Constants.TRANSCODE_RTP_TO_RTMP; + case TRANSCODE_RTMP_TO_RTP: + return Constants.TRANSCODE_RTMP_TO_RTP; + case TRANSCODE_FILE_TO_RTP: + return Constants.TRANSCODE_FILE_TO_RTP; + case TRANSCODE_FILE_TO_RTMP: + return Constants.TRANSCODE_FILE_TO_RTMP; + case TRANSCODE_H264_TO_H263: + return Constants.TRANSCODE_H264_TO_H263; + case TRANSCODE_ROTATE_RIGHT: + return Constants.TRANSCODE_ROTATE_RIGHT; + case TRANSCODE_ROTATE_LEFT: + return Constants.TRANSCODE_ROTATE_LEFT; + case TRANSCODE_ROTATE_UPSIDE_DOWN: + return Constants.TRANSCODE_ROTATE_UPSIDE_DOWN; + default: + return "UNKNOWN"; + } + } + + public void setSourceIp(String sourceIp) { + if (sourceIp != null) this.sourceIp = sourceIp; + } + + public String getSourceIp() { + return sourceIp; + } + + public void setLocalVideoPort(String localVideoPort) { + if (localVideoPort != null) this.localVideoPort = localVideoPort; + } + + public String getLocalVideoPort() { + return localVideoPort; + } + + public void setRemoteVideoPort(String remoteVideoPort) { + if (remoteVideoPort != null) this.remoteVideoPort = remoteVideoPort; + } + + public String getRemoteVideoPort() { + return remoteVideoPort; + } + + public void setDestinationIp(String destinationIp) { + if (destinationIp != null) this.destinationIp = destinationIp; + } + + public String getDestinationIp() { + return destinationIp; + } + +} diff --git a/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/core/VideoTranscoderObserver.java b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/core/VideoTranscoderObserver.java new file mode 100644 index 0000000000000000000000000000000000000000..052537b9802934320c0c985bc5733e41ee86ab92 --- /dev/null +++ b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/core/VideoTranscoderObserver.java @@ -0,0 +1,9 @@ +package org.bigbluebutton.transcode.core; + +import java.util.Map; + +public interface VideoTranscoderObserver { + public void handleTranscodingFinishedUnsuccessfully(); + public void handleTranscodingFinishedWithSuccess(); + public void handleVideoProbingFinishedWithSuccess(Map<String,String> ffprobeResult); +} diff --git a/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/core/api/ITranscodingInGW.java b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/core/api/ITranscodingInGW.java new file mode 100644 index 0000000000000000000000000000000000000000..2a992e6bbdea551aaeb8047f777da43dafbefd6f --- /dev/null +++ b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/core/api/ITranscodingInGW.java @@ -0,0 +1,12 @@ +package org.bigbluebutton.transcode.core.api; + +import java.util.Map; + + +public interface ITranscodingInGW { + void startTranscoder(String meetingId, String transcoderId, Map<String, String> params); + void updateTranscoder(String meetingId, String transcoderId, Map<String, String> params); + void stopTranscoder(String meetingId, String transcoderId); + void stopMeetingTranscoders(String meetingId); + void startProbing(String meetingId, String transcoderId, Map<String, String> params); +} diff --git a/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/core/ffmpeg/FFmpegCommand.java b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/core/ffmpeg/FFmpegCommand.java new file mode 100644 index 0000000000000000000000000000000000000000..5b2a51bfb4a784614491ca7fad5ecb918c579237 --- /dev/null +++ b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/core/ffmpeg/FFmpegCommand.java @@ -0,0 +1,401 @@ +package org.bigbluebutton.transcode.core.ffmpeg; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.HashMap; +import java.util.Iterator; + +public class FFmpegCommand { + private HashMap args; + private HashMap x264Params; + private List<String[]> rtmpInputConnParams; + private List<String[]> rtmpOutputConnParams; + + private String[] command; + + private String ffmpegPath; + private String input; + private String output; + private Boolean inputLive; + + /* Analyze duration is a special parameter that MUST come before the input */ + private String analyzeDuration; + private String probeSize; + + /* Parameters when the input is a loop image/file */ + private String loop; + private String ignoreLoop; + private int frameRate; + private String frameSize; + + public FFmpegCommand() { + this.args = new HashMap(); + this.x264Params = new HashMap(); + this.rtmpInputConnParams = new ArrayList<String[]>(); + this.rtmpOutputConnParams = new ArrayList<String[]>(); + + + this.ffmpegPath = null; + this.inputLive = false; + this.loop = null; + this.frameRate = 0; + } + + public String[] getFFmpegCommand(boolean shouldBuild) { + if(shouldBuild) + buildFFmpegCommand(); + + return this.command; + } + + public void buildFFmpegCommand() { + List comm = new ArrayList<String>(); + + if(this.ffmpegPath == null) + this.ffmpegPath = "/usr/local/bin/ffmpeg"; + + comm.add(this.ffmpegPath); + + if (this.inputLive){ + comm.add("-re"); + } + + /* Analyze duration and probesize MUST come before the input */ + if(analyzeDuration != null && !analyzeDuration.isEmpty()) { + comm.add("-analyzeduration"); + comm.add(analyzeDuration); + } + + if(loop != null && !loop.isEmpty()){ + comm.add("-loop"); + comm.add(loop); + } + + if(ignoreLoop != null && !ignoreLoop.isEmpty()){ + comm.add("-ignore_loop"); + comm.add(ignoreLoop); + } + + if(probeSize != null && !probeSize.isEmpty()) { + comm.add("-probesize"); + comm.add(probeSize); + } + + buildRtmpInput(); + + comm.add("-i"); + comm.add(input); + + Iterator argsIter = this.args.entrySet().iterator(); + while (argsIter.hasNext()) { + Map.Entry pairs = (Map.Entry)argsIter.next(); + comm.add(pairs.getKey()); + comm.add(pairs.getValue()); + } + + if(!x264Params.isEmpty()) { + comm.add("-x264-params"); + String params = ""; + Iterator x264Iter = this.x264Params.entrySet().iterator(); + while (x264Iter.hasNext()) { + Map.Entry pairs = (Map.Entry)x264Iter.next(); + String argValue = pairs.getKey() + "=" + pairs.getValue(); + params += argValue; + // x264-params are separated by ':' + params += ":"; + } + // Remove trailing ':' + params.replaceAll(":+$", ""); + comm.add(params); + } + + buildRtmpOutput(); + + comm.add(this.output); + + this.command = new String[comm.size()]; + comm.toArray(this.command); + } + + /** + * Add rtmp parameters (if there are any) to the current input, + * if the input is rtmp. + */ + private void buildRtmpInput() { + if(!rtmpInputConnParams.isEmpty() && isRtmpInput()) { + StringBuilder sb = new StringBuilder(); + for (String s[] : rtmpInputConnParams){ + sb.append("conn="+s[0]+":"+s[1]+" "); + } + input+=" "+sb.toString().trim(); + } + } + + /** + * Add rtmp parameters (if there are any) to the current output, + * if the output is rtmp. + */ + private void buildRtmpOutput() { + if(!rtmpOutputConnParams.isEmpty() && isRtmpOutput()) { + StringBuilder sb = new StringBuilder(); + for (String s[] : rtmpOutputConnParams){ + sb.append("conn="+s[0]+":"+s[1]+" "); + } + output+=" "+sb.toString().trim(); + } + } + + + public void setFFmpegPath(String arg) { + this.ffmpegPath = arg; + } + + public void setInput(String arg) { + this.input = arg; + } + + public void setInputLive(Boolean live){ + this.inputLive = live; + } + + public void setOutput(String arg) { + this.output = arg; + } + + public void setCodec(String arg) { + this.args.put("-vcodec", arg); + } + + public void setLoop(String arg) { + this.loop = arg; + } + + public void setRotation(String arg) { + switch (arg) { + case FFmpegUtils.ROTATE_LEFT: + this.args.put("-vf", "transpose=2"); + break; + case FFmpegUtils.ROTATE_RIGHT: + this.args.put("-vf", "transpose=1"); + break; + case FFmpegUtils.ROTATE_UPSIDE_DOWN: + this.args.put("-vf", "transpose=2,transpose=2"); + break; + } + } + + /** + * Set ignore loop (valid for GIFs input, only) + * 0: means that input GIF will loop indefinitely + * @param arg + */ + public void setIgnoreLoop(int arg) { + this.ignoreLoop = Integer.toString(arg); + } + + public void setLevel(String arg) { + this.args.put("-level", arg); + } + + public void setPreset(String arg) { + this.args.put("-preset", arg); + } + + public void setProfile(String arg) { + this.args.put("-profile:v", arg); + } + + public void setFormat(String arg) { + this.args.put("-f", arg); + } + + public void setPayloadType(String arg) { + this.args.put("-payload_type", arg); + } + + public void setLoglevel(String arg) { + this.args.put("-loglevel", arg); + } + + public void setPixelFormat(String arg){ + this.args.put("-pix_fmt", arg); + } + + /** + * Set video bitrate, in Kbps. + * @param arg + */ + public void setVideoBitRate(int arg){ + this.args.put("-b:v", Integer.toString(arg)+"k"); + } + + /** + * Set bufsize, in Kb. + * @param arg + */ + public void setBufSize(int arg){ + this.args.put("-bufsize", Integer.toString(arg)+"k"); + } + + /** + * Set maximum bitrate, in Kbps. + * @param arg + */ + public void setMaxRate(int arg){ + this.args.put("-maxrate", Integer.toString(arg)+"k"); + } + + /** + * Set Group of images (GOP) + * @param arg + */ + public void setGop(int arg){ + this.args.put("-g", Integer.toString(arg)); + } + /** + * Set maximum NAL size, in bytes. + * This option works with libopenh264 encoder,only + * @param arg + */ + public void setMaxNalSize(String arg){ + this.args.put("-max_nal_size", arg); + } + + /** + * Set slice_mode for libopenh264 encoder. + * @param arg + */ + public void setSliceMode(String arg){ + this.args.put("-slice_mode", arg); + } + + /** + * Set rtpflags for RTP encoder. + * @param arg + */ + public void setRtpFlags(String arg){ + this.args.put("-rtpflags", arg); + } + + public void setSliceMaxSize(String arg) { + this.x264Params.put("slice-max-size", arg); + } + + public void setMaxKeyFrameInterval(String arg) { + this.x264Params.put("keyint", arg); + } + + public void addCustomParameter(String name, String value) { + this.args.put(name, value); + } + + /** + * Set how much time FFmpeg should analyze stream + * data to get stream information. Note that this + * affects directly the delay to start the stream. + * + * @param duration Analysis duration + */ + public void setAnalyzeDuration(String duration) { + this.analyzeDuration = duration; + } + + /** + * Probe size, in bytes. + * Minimum value: 32 + * Default: 5000000 + **/ + public void setProbeSize(String size) { + this.probeSize = size; + } + + /** + * Set frame rate of the input data + * @param value + */ + public void setFrameRate(int value){ + if (value>0) + this.args.put("-r",Integer.toString(value)); + } + + public void setFrameSize(String value){ + this.frameSize = value; + } + + /** + * Add parameters for rtmp connections. + * The order of parameters is the order they are added + * @param value + */ + public void addRtmpInputConnectionParameter(String value){ + //S: String + this.rtmpInputConnParams.add(new String[]{"S", value}); + } + + /** + * Add parameters for rtmp connections. + * The order of parameters is the order they are added + * @param value + */ + public void addRtmpInputConnectionParameter(boolean value){ + //B: Boolean + this.rtmpInputConnParams.add(new String[]{"B", value?"1":"0"}); + } + + /** + * Add parameters for rtmp connections. + * The order of parameters is the order they are added + * @param value + */ + public void addRtmpInputConnectionParameter(int value){ + //N : Number + this.rtmpInputConnParams.add(new String[]{"N", Integer.toString(value)}); + } + + /** + * Add parameters for rtmp connections. + * The order of parameters is the order they are added + * @param value + */ + public void addRtmpOutputConnectionParameter(String value){ + //S: String + this.rtmpOutputConnParams.add(new String[]{"S", value}); + } + + /** + * Add parameters for rtmp connections. + * The order of parameters is the order they are added + * @param value + */ + public void addRtmpOutputConnectionParameter(boolean value){ + //B: Boolean + this.rtmpOutputConnParams.add(new String[]{"B", value?"1":"0"}); + } + + /** + * Add parameters for rtmp connections. + * The order of parameters is the order they are added + * @param value + */ + public void addRtmpOutputConnectionParameter(int value){ + //N : Number + this.rtmpOutputConnParams.add(new String[]{"N", Integer.toString(value)}); + } + + /** + * Check if the current set intput is rtmp + * @return + */ + private boolean isRtmpInput(){ + return input.contains("rtmp"); + } + + /** + * Check if the current set output is rtmp + * @return + */ + private boolean isRtmpOutput(){ + return output.contains("rtmp"); + } +} diff --git a/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/core/ffmpeg/FFmpegConstants.java b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/core/ffmpeg/FFmpegConstants.java new file mode 100644 index 0000000000000000000000000000000000000000..ac4da31e4aa5558e0e34e62044ea179cbfcece6f --- /dev/null +++ b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/core/ffmpeg/FFmpegConstants.java @@ -0,0 +1,45 @@ +package org.bigbluebutton.transcode.core.ffmpeg; + +public class FFmpegConstants { + + //exit codes (obtained from process exit code) + public static final int FATAL_ERROR_CODE = 128; + public static final int EXIT_WITH_SUCCESS_CODE = 0; + public static final int EXIT_WITH_NO_INPUT_CODE = 1; + public static final int EXIT_WITH_SIGKILL_CODE = FATAL_ERROR_CODE + 9; + public static final int ACCEPTABLE_EXIT_CODES[] = {EXIT_WITH_SUCCESS_CODE,EXIT_WITH_SIGKILL_CODE}; + + //status codes (obtained from sterr/out) + public static final int EXIT_WITH_SUCCESS_STATUS = 0; + public static final int EXIT_WITH_NO_INPUT_STATUS = 1; + public static final int RUNNING_STATUS = 2; + public static final int ACCEPTABLE_EXIT_STATUS[] = {EXIT_WITH_SUCCESS_STATUS,EXIT_WITH_NO_INPUT_STATUS}; + + //output constants (obtained from verbose stderr/out) + public static String FFMPEG_EXIT_WITH_NO_INPUT_OUTPUT = "Connection timed out"; + public static String WIDTH = "width"; + public static String HEIGHT = "height"; + + //Codecs + public static final String CODEC_ID_H264 = "96" ; + public static final String CODEC_NAME_H264 = "H264" ; + public static final String SAMPLE_RATE_H264 = "90000" ; + + public static boolean acceptableExitCode(int code){ + int i; + if ((ACCEPTABLE_EXIT_CODES == null) || (code < 0)) return false; + for(i=0;i<ACCEPTABLE_EXIT_CODES.length;i++) + if (ACCEPTABLE_EXIT_CODES[i] == code) + return true; + return false; + } + + public static boolean acceptableExitStatus(int status){ + int i; + if ((ACCEPTABLE_EXIT_STATUS == null) || (status < 0)) return false; + for(i=0;i<ACCEPTABLE_EXIT_STATUS.length;i++) + if (ACCEPTABLE_EXIT_STATUS[i] == status) + return true; + return false; + } +} diff --git a/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/core/ffmpeg/FFmpegUtils.java b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/core/ffmpeg/FFmpegUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..94ee1e5db79d9c5f3a7856b21283757f98f50e17 --- /dev/null +++ b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/core/ffmpeg/FFmpegUtils.java @@ -0,0 +1,150 @@ +package org.bigbluebutton.transcode.core.ffmpeg; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.file.FileSystems; +import java.nio.file.Files; +import java.nio.file.OpenOption; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; +import org.bigbluebutton.transcode.core.TranscodersService; + +public class FFmpegUtils { + + private static final String LOW_QUALITY = "160x120"; + private static final String MEDIUM_QUALITY = "320x240"; + private static final String HIGH_QUALITY = "640x480"; + + public static final String VIDEO_MODULE = "video"; + public static final String DESKSHARE_MODULE = "deskShare"; + + public static final String ROTATE_RIGHT = "rotate_right"; + public static final String ROTATE_LEFT = "rotate_left"; + public static final String ROTATE_UPSIDE_DOWN = "rotate_left/rotate_left"; + + public static final String H263PREFIX = "h263"; + + public static String defaultVideoWidth; + public static String defaultVideoHeight; + + public static final String GLOBAL_VIDEO_STREAM_NAME_PREFIX = "sip_"; + public static final String VIDEOCONF_LOGO_STREAM_NAME_PREFIX = "video_conf_"; + private static final String sdpVideoFullPath = "/tmp/"+GLOBAL_VIDEO_STREAM_NAME_PREFIX; //when changed , must also change VideoApplication.java in bbb-video + private static OpenOption[] fileOptions = new OpenOption[] {StandardOpenOption.CREATE,StandardOpenOption.WRITE}; + public static String ffmpegPath = TranscodersService.ffmpegPath(); + public static String ffprobePath = TranscodersService.ffprobePath(); + public static String videoconfLogoPath = TranscodersService.videoconfLogoImagePath(); + private static boolean enableUserVideoSubtitle = TranscodersService.enableUserVideoSubtitle(); + + public static String createSDPVideoFile(String userId, String localIpAddress, String localVideoPort, String codecName, String codecId, String sampleRate, String voiceconf) { + Path sdpVideoPath = FileSystems.getDefault().getPath(sdpVideoFullPath + voiceconf+".sdp"); + + String sdp = "v=0\r\n" + + "o=" + userId + " 0 0 IN IP4 " + localIpAddress + "\r\n" + + "s=Session SIP/SDP\r\n" + + "c=IN IP4 " + localIpAddress + "\r\n" + + "t=0 0\r\n" + + "m=video " + localVideoPort + " RTP/AVPF " + codecId +"\r\n" + + "a=rtpmap:" + codecId + " " + codecName + "/" + sampleRate + "/1\r\n" + + "a=fmtp:96\r\n" + + "a=rtcp-fb:" + codecId + " ccm fir \r\n" + + "a=rtcp-fb:" + codecId + " nack \r\n" + + "a=rtcp-fb:" + codecId + " nack pli \r\n" + + "a=rtcp-fb:" + codecId + " goog-remb \r\n"; + + Charset charset = Charset.forName("US-ASCII"); + try { + BufferedWriter writer = Files.newBufferedWriter(sdpVideoPath,charset,fileOptions); + writer.write(sdp, 0, sdp.length()); + writer.close(); + System.out.println("SDP video file created at: "+sdpVideoPath.toString()); + } catch (IOException x) { + System.out.println("Failed to create SDP video file: "+sdpVideoPath.toString()); + } + + return (sdpVideoPath==null)?null:sdpVideoPath.toString(); + } + + public static void removeSDPVideoFile(String voiceconf) { + Path sdpVideoPath = FileSystems.getDefault().getPath(sdpVideoFullPath +voiceconf+".sdp"); + try { + Files.deleteIfExists(sdpVideoPath); + } catch (IOException e) { + System.out.println("Failed to remove SDP video file: "+sdpVideoPath.toString()); + } + } + + public String getSdpVideoPath(String voiceconf) { + return sdpVideoFullPath+voiceconf+".sdp"; + } + + public boolean sdpVideoExists(String sdpFilePath) { + return fileExists(sdpFilePath); + } + + private boolean fileExists(String filePath) { + if(filePath == null || filePath.isEmpty()) + return false; + + return new File(filePath).isFile(); + } + + public boolean isVideoConfLogoStream(String videoStreamName) { + return ((videoStreamName != null) && (videoStreamName.startsWith(VIDEOCONF_LOGO_STREAM_NAME_PREFIX))); + } + + public void setFfmpegPath(String ffPath) { + System.out.println("Trying to set the ffmpeg path to: " + ffPath); + + if(ffmpegExists(ffPath)) { + ffmpegPath = ffPath; + System.out.println("ffmpeg path set to: " + ffmpegPath); + } + else + System.out.println("****Could NOT set " + ffPath + " as the ffmpeg path"); + } + + public boolean ffmpegExists(String ffPath) { + return fileExists(ffPath); + } + + public static boolean isUserVideoSubtitleEnabled(){ + return enableUserVideoSubtitle; + } + + public boolean videoconfLogoExists(String filePath) { + return fileExists(filePath); + } + + private static void validateResolution(String resolution) { + System.out.println("Validating sip video resolution: " + resolution); + switch(resolution) { + case LOW_QUALITY: + case MEDIUM_QUALITY: + case HIGH_QUALITY: parseResolution(resolution); + break; + //using the default resolution + default: System.out.println("****The resolution set in bigbluebutton-sip.properties is invalid. Using the default resolution."); + parseResolution(MEDIUM_QUALITY); + } + } + + private static void parseResolution(String resolution) { + String[] dimensions = resolution.split("x"); + defaultVideoWidth = dimensions[0]; + defaultVideoHeight = dimensions[1]; + System.out.println("Video Resolution is " + defaultVideoWidth + "x" + defaultVideoHeight); + } + + public static String getVideoWidth() { + System.out.println("Getting video width: " + defaultVideoWidth + " (Resolution is " + defaultVideoWidth + "x" + defaultVideoHeight + ")"); + return defaultVideoWidth; + } + + public static String getVideoHeight() { + System.out.println("Getting video height: " + defaultVideoHeight + " (Resolution is " + defaultVideoWidth + "x" + defaultVideoHeight + ")"); + return defaultVideoHeight; + } +} diff --git a/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/core/ffprobe/FFProbeCommand.java b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/core/ffprobe/FFProbeCommand.java new file mode 100644 index 0000000000000000000000000000000000000000..e1eaf2730d6b236f754111d06e0c224beeef2eb7 --- /dev/null +++ b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/core/ffprobe/FFProbeCommand.java @@ -0,0 +1,95 @@ +package org.bigbluebutton.transcode.core.ffprobe; + +import java.lang.Runtime; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.HashMap; +import java.util.regex.Pattern; +import java.util.regex.Matcher; + +import java.io.InputStreamReader; +import java.io.BufferedReader; +import java.io.IOException; + +public class FFProbeCommand { + + private String input; + private String[] command; + + private String ffprobePath; + private HashMap args; + + /* Analyze duration is a special parameter that MUST come before the input */ + private String analyzeDuration; + + public FFProbeCommand(String input) { + this.input = input; + this.command = null; + this.ffprobePath = null; + this.args = new HashMap(); + } + + public String[] getFFprobeCommand(boolean shouldBuild){ + if(shouldBuild) + buildFFprobeCommand(); + + return this.command; + } + + public void buildFFprobeCommand() { + List comm = new ArrayList<String>(); + + if(this.ffprobePath == null) + this.ffprobePath = "/usr/local/bin/ffprobe"; + + comm.add(this.ffprobePath); + + /* Analyze duration MUST come before the input */ + if(analyzeDuration != null && !analyzeDuration.isEmpty()) { + comm.add("-analyzeduration"); + comm.add(analyzeDuration); + } + + comm.add("-i"); + comm.add(input); + + Iterator argsIter = this.args.entrySet().iterator(); + while (argsIter.hasNext()) { + Map.Entry pairs = (Map.Entry)argsIter.next(); + comm.add(pairs.getKey()); + if (pairs.getValue()!=null) + comm.add(pairs.getValue()); + } + + this.command = new String[comm.size()]; + comm.toArray(this.command); + } + + public void setFFprobepath(String arg) { + this.ffprobePath = arg; + } + + public void setAnalyzeDuration(String duration) { + this.analyzeDuration = duration; + } + + public void setInput(String arg){ + this.input = arg; + } + + public void setLoglevel(String arg){ + this.args.put("-loglevel", arg); + } + + public void setShowStreams(){ + this.args.put("-show_streams",null); + } + + public void selectStream(String arg){ + this.args.put("-select_streams", arg); + } + +} diff --git a/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/core/processmonitor/ProcessMonitor.java b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/core/processmonitor/ProcessMonitor.java new file mode 100644 index 0000000000000000000000000000000000000000..b39618c093ab7d3985778574683740ad6c3caaf9 --- /dev/null +++ b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/core/processmonitor/ProcessMonitor.java @@ -0,0 +1,255 @@ +package org.bigbluebutton.transcode.core.processmonitor; + +import java.io.InputStream; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.bigbluebutton.transcode.core.ffmpeg.FFmpegConstants; + +public class ProcessMonitor { + + private String[] command; + private Process process; + private String name; + ProcessStream inputStreamMonitor; + ProcessStream errorStreamMonitor; + private String inputStreamMonitorOutput; + private String errorStreamMonitorOutput; + public static enum Status{RUNNING,CLOSED_BY_USER}; + private Status status; + + private Thread thread; + private ProcessMonitorObserver observer; + + public ProcessMonitor(String[] command,String name) { + this.command = command; + this.process = null; + this.thread = null; + this.inputStreamMonitor = null; + this.errorStreamMonitor = null; + this.name = name; + this.inputStreamMonitorOutput = null; + this.errorStreamMonitor = null; + } + + @Override + public String toString() { + if (this.command == null || this.command.length == 0) { + return ""; + } + + Pattern pattern = Pattern.compile("(.*) (.*)"); + StringBuffer result = new StringBuffer(); + String delim = ""; + for (String i : this.command) { + Matcher matcher = pattern.matcher(i); + if(matcher.matches()) { + result.append(delim).append("\""+matcher.group(1)+" "+matcher.group(2)+"\""); + }else result.append(delim).append(i); + delim = " "; + } + return removeLogLevelFlag(result.toString()); + } + + private String getCommandString(){ + //used by the process's thread instead of toString() + return this.toString(); + } + + public void setCommand(String[] command){ + this.command = command; + } + + private void notifyProcessMonitorObserverOnFinishedUnsuccessfully() { + if(observer != null){ + //log.debug("Notifying ProcessMonitorObserver that process finished unsuccessfully"); + observer.handleProcessFinishedUnsuccessfully(this.name,inputStreamMonitorOutput); + }else { + //log.debug("Cannot notify ProcessMonitorObserver that process finished unsuccessfully: ProcessMonitorObserver null"); + } + } + + private void notifyProcessMonitorObserverOnFinished() { + if(observer != null){ + //log.debug("Notifying ProcessMonitorObserver that {} successfully finished",this.name); + observer.handleProcessFinishedWithSuccess(this.name,inputStreamMonitorOutput); + }else { + //log.debug("Cannot notify ProcessMonitorObserver that {} finished: ProcessMonitorObserver null",this.name); + } + } + + public synchronized void start() { + if(this.thread == null){ + this.thread = new Thread( new Runnable(){ + public void run(){ + try { + System.out.println(" > Creating thread to execute " + name); + process = Runtime.getRuntime().exec(command); + System.out.println(" > Executing " + name + "( pid=" + getPid() + " ):\n " + getCommandString()); + + if(status == Status.CLOSED_BY_USER) { + System.out.println(" > ProcessMonitor closed by user. Closing " + name + " it immediatelly"); + forceDestroy(); + return; + } + + InputStream is = process.getInputStream(); + InputStream es = process.getErrorStream(); + + inputStreamMonitor = new ProcessStream(is,"STDOUT"); + errorStreamMonitor = new ProcessStream(es,"STDERR"); + + inputStreamMonitor.start(); + errorStreamMonitor.start(); + + process.waitFor(); + } + catch(SecurityException se) { + System.out.println("Security Exception"); + } + catch(IOException ioe) { + System.out.println("IO Exception"); + } + catch(NullPointerException npe) { + System.out.println("NullPointer Exception"); + } + catch(IllegalArgumentException iae) { + System.out.println("IllegalArgument Exception"); + } + catch(InterruptedException ie) { + System.out.println("Interrupted Exception"); + } + + int ret = process.exitValue(); + + if (FFmpegConstants.acceptableExitCode(ret) || errorStreamMonitor.acceptableExitStatus()){ + //log.debug("Exiting thread that executes {}. Exit value: {}, Exit status (from stdout): {} ",name,ret, errorStreamMonitor.getExitStatus()); + storeProcessOutputs(inputStreamMonitor.getOutput(), errorStreamMonitor.getOutput()); + clearData(); + notifyProcessMonitorObserverOnFinished(); + } + else{ + //log.debug("Exiting thread that executes {}. Exit value: {}, Exit status (from stdout): {}",name,ret,errorStreamMonitor.getExitStatus()); + storeProcessOutputs(inputStreamMonitor.getOutput(), errorStreamMonitor.getOutput()); + clearData(); + notifyProcessMonitorObserverOnFinishedUnsuccessfully(); + } + } + }); + status = Status.RUNNING; + this.thread.start(); + }else{ + //log.debug("Can't start a new process monitor: It is already running."); + } + } + + public synchronized void restart(){ + clearData(); + status = Status.CLOSED_BY_USER; + start(); + } + + private void clearData(){ + closeProcessStream(); + closeProcess(); + clearMonitorThread(); + } + + private void clearMonitorThread(){ + if (this.thread !=null) + this.thread=null; + } + + private void closeProcessStream(){ + if(this.inputStreamMonitor != null){ + this.inputStreamMonitor.close(); + this.inputStreamMonitor = null; + } + if (this.errorStreamMonitor != null) { + this.errorStreamMonitor.close(); + this.errorStreamMonitor = null; + } + } + + private void closeProcess(){ + if(this.process != null) { + status = Status.CLOSED_BY_USER; + //log.debug("Closing {} process",this.name); + this.process.destroy(); + this.process = null; + } + } + + private void storeProcessOutputs(String inputStreamOutput,String errorStreamOutput){ + this.inputStreamMonitorOutput = inputStreamOutput; + this.errorStreamMonitorOutput = errorStreamOutput; + } + + public synchronized void destroy() { + if (this.thread != null){ + status = Status.CLOSED_BY_USER; + clearData(); + //log.debug("ProcessMonitor successfully finished"); + }else{ + //log.debug("Can't destroy this process monitor: There's no process running."); + } + } + + public void setProcessMonitorObserver(ProcessMonitorObserver observer){ + if (observer==null){ + //log.debug("Cannot assign observer: ProcessMonitorObserver null"); + }else this.observer = observer; + } + + public int getPid(){ + Field f; + int pid; + try { + if (this.process == null) return -1; + f = this.process.getClass().getDeclaredField("pid"); + f.setAccessible(true); + pid = (int)f.get(this.process); + return pid; + } catch (IllegalArgumentException | IllegalAccessException + | NoSuchFieldException | SecurityException e) { + //log.debug("Error when obtaining {} PID",this.name); + return -1; + } + } + + public synchronized void forceDestroy(){ + if (this.thread != null) { + status = Status.CLOSED_BY_USER; + try { + int pid = getPid(); + if (pid < 0){ + //log.debug("Process doesn't exist. Not destroying it..."); + return; + }else { + Runtime.getRuntime().exec("kill -9 "+ getPid()); + } + } catch (IOException e) { + //log.debug("Failed to force-kill {} process",this.name); + e.printStackTrace(); + } + }else{ + //log.debug("Can't force-destroy this process monitor: There's no process running."); + } + } + + public boolean isFFmpegProcess(){ + return this.name.toLowerCase().contains("ffmpeg"); + } + + /** + * Removes loglevel flag of ffmpeg command. + * Usefull for faster debugging + */ + private String removeLogLevelFlag(String commandString){ + if (isFFmpegProcess()){ + return commandString.replaceAll("-loglevel \\w+", ""); + }else return commandString; + } + +} diff --git a/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/core/processmonitor/ProcessMonitorObserver.java b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/core/processmonitor/ProcessMonitorObserver.java new file mode 100644 index 0000000000000000000000000000000000000000..c2b90869a1133589d96035a0e667d75eac2e6a4a --- /dev/null +++ b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/core/processmonitor/ProcessMonitorObserver.java @@ -0,0 +1,6 @@ +package org.bigbluebutton.transcode.core.processmonitor; + +public interface ProcessMonitorObserver { + public void handleProcessFinishedUnsuccessfully(String processName, String processOutput); + public void handleProcessFinishedWithSuccess(String processName, String processOutput); +} diff --git a/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/core/processmonitor/ProcessStream.java b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/core/processmonitor/ProcessStream.java new file mode 100644 index 0000000000000000000000000000000000000000..47eb243a2096a6ace65806ea7f12df92343d0c5f --- /dev/null +++ b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/core/processmonitor/ProcessStream.java @@ -0,0 +1,95 @@ +package org.bigbluebutton.transcode.core.processmonitor; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; + +import java.io.IOException; +import org.bigbluebutton.transcode.core.ffmpeg.FFmpegConstants; + +public class ProcessStream { + private InputStream stream; + private Thread thread; + private String type; + private String output; + private int exitStatus = FFmpegConstants.RUNNING_STATUS; + + ProcessStream(InputStream stream, String type) { + if(stream != null) + this.stream = stream; + this.type = type; + this.output = ""; + } + + protected void start() { + exitStatus = FFmpegConstants.RUNNING_STATUS; + this.thread = new Thread( new Runnable(){ + public void run(){ + try { + String line; + InputStreamReader isr = new InputStreamReader(stream); + BufferedReader ibr = new BufferedReader(isr); + output = ""; + while ((line = ibr.readLine()) != null) { + ////log.debug("[{}]"+line,type); + updateCurrentStatusFromOutput(line); + output+=line+"\n"; + } + + close(); + } + catch(IOException ioe) { + //log.debug("Finishing process stream [type={}] because there's no more data to be read",type); + close(); + } + } + }); + this.thread.start(); + } + + protected void close() { + try { + if(this.stream != null) { + ////log.debug("Closing process stream"); + this.stream.close(); + this.stream = null; + } + } + catch(IOException ioe) { + //log.debug("IOException"); + } + } + + protected String getOutput(){ + return this.output; + } + + /** + * Update current process status based on the stdout. + * The exitStatus is mapped according to ffmpeg exit status + * @param outputLine + * Requires loglevel verbose of FFmpegCommand + */ + private void updateCurrentStatusFromOutput(String outputLine){ + if (outputLine != null){ + if (outputLine.contains(FFmpegConstants.FFMPEG_EXIT_WITH_NO_INPUT_OUTPUT)){ + ////log.debug("FFmpeg exited with no input status."); + exitStatus = FFmpegConstants.EXIT_WITH_NO_INPUT_STATUS; + } + /*else if outputLine.contains(FFmpegConstants....) + exitStatus = FFmpegConstants.... + */ + } + } + + public int getExitStatus(){ + return exitStatus; + } + + /** + * Validates exit status + */ + public boolean acceptableExitStatus(){ + return FFmpegConstants.acceptableExitStatus(exitStatus); + } +} diff --git a/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/pubsub/RedisMessageReceiver.java b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/pubsub/RedisMessageReceiver.java new file mode 100644 index 0000000000000000000000000000000000000000..cb5432057c246099172972e6e3d670fcd8003b82 --- /dev/null +++ b/akka-bbb-transcode/src/main/java/org/bigbluebutton/transcode/pubsub/RedisMessageReceiver.java @@ -0,0 +1,81 @@ +package org.bigbluebutton.transcode.pubsub.receivers; + +import org.bigbluebutton.transcode.core.api.ITranscodingInGW; + +import org.bigbluebutton.common.messages.StartTranscoderRequestMessage; +import org.bigbluebutton.common.messages.UpdateTranscoderRequestMessage; +import org.bigbluebutton.common.messages.StopTranscoderRequestMessage; +import org.bigbluebutton.common.messages.StopMeetingTranscodersMessage; +import org.bigbluebutton.common.messages.StartProbingRequestMessage; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; + +public class RedisMessageReceiver { + + public static final String TO_BBB_TRANSCODE_CHANNEL = "bigbluebutton:to-bbb-transcode"; + public static final String TO_BBB_TRANSCODE_PATTERN = TO_BBB_TRANSCODE_CHANNEL + ":*"; + public static final String TO_BBB_TRANSCODE_SYSTEM_CHAN = TO_BBB_TRANSCODE_CHANNEL + ":system"; + + private ITranscodingInGW transcodingInGW; + + public RedisMessageReceiver(ITranscodingInGW transcodingInGW) { + this.transcodingInGW = transcodingInGW; + } + + public void handleMessage(String pattern, String channel, String message) { + if (channel.equalsIgnoreCase(TO_BBB_TRANSCODE_SYSTEM_CHAN)) { + JsonParser parser = new JsonParser(); + JsonObject obj = (JsonObject) parser.parse(message); + + if (obj.has("header") && obj.has("payload")) { + JsonObject header = (JsonObject) obj.get("header"); + + if (header.has("name")) { + String messageName = header.get("name").getAsString(); + switch (messageName) { + case StartTranscoderRequestMessage.START_TRANSCODER_REQUEST: + processStartTranscoderRequestMessage(message); + break; + case UpdateTranscoderRequestMessage.UPDATE_TRANSCODER_REQUEST: + processUpdateTranscoderRequestMessage(message); + break; + case StopTranscoderRequestMessage.STOP_TRANSCODER_REQUEST: + processStopTranscoderRequestMessage(message); + break; + case StopMeetingTranscodersMessage.STOP_MEETING_TRANSCODERS: + processStopMeetingTranscodersMessage(message); + break; + case StartProbingRequestMessage.START_PROBING_REQUEST: + processStartProbingRequestMessage(message); + } + } + } + } + } + + private void processStartTranscoderRequestMessage(String json) { + StartTranscoderRequestMessage msg = StartTranscoderRequestMessage.fromJson(json); + transcodingInGW.startTranscoder(msg.meetingId, msg.transcoderId, msg.params); + } + + private void processUpdateTranscoderRequestMessage(String json) { + UpdateTranscoderRequestMessage msg = UpdateTranscoderRequestMessage.fromJson(json); + transcodingInGW.updateTranscoder(msg.meetingId, msg.transcoderId, msg.params); + } + + private void processStopTranscoderRequestMessage(String json) { + StopTranscoderRequestMessage msg = StopTranscoderRequestMessage.fromJson(json); + transcodingInGW.stopTranscoder(msg.meetingId, msg.transcoderId); + } + + private void processStopMeetingTranscodersMessage(String json) { + StopMeetingTranscodersMessage msg = StopMeetingTranscodersMessage.fromJson(json); + transcodingInGW.stopMeetingTranscoders(msg.meetingId); + } + + private void processStartProbingRequestMessage(String json) { + StartProbingRequestMessage msg = StartProbingRequestMessage.fromJson(json); + transcodingInGW.startProbing(msg.meetingId, msg.transcoderId, msg.params); + } +} diff --git a/akka-bbb-transcode/src/main/resources/application.conf b/akka-bbb-transcode/src/main/resources/application.conf new file mode 100644 index 0000000000000000000000000000000000000000..09a62e7ade32c26971a76a04d0e881313a07c8ac --- /dev/null +++ b/akka-bbb-transcode/src/main/resources/application.conf @@ -0,0 +1,45 @@ +akka { + actor { + debug { + receive = on + } + } + loglevel = INFO + stdout-loglevel = "INFO" + + rediscala-subscriber-worker-dispatcher { + mailbox-type = "akka.dispatch.SingleConsumerOnlyUnboundedMailbox" + # Throughput defines the maximum number of messages to be + # processed per actor before the thread jumps to the next actor. + # Set to 1 for as fair as possible. + throughput = 512 + } +} + + +redis { + host="127.0.0.1" + port=6379 + password="" +} + +videoconference { + #The image to use in the videoconference window and/or when the webuser has no video + videoconf-logo-image-path = /usr/share/red5/webapps/sip/WEB-INF/mconf-videoconf-logo.gif + + #Enable username subtitle on video-conf-logo (the one shown in sip-phone when + #webconference's talker has no video ) + enable-user-video-subtitle = true + + #To change the sip video resolution, edit below: + #IMPORTANT: For now, we only accept these 3 resolutions: 160x120, 320x240, 640x480 + sip-video-resolution=640x480 +} + +transcoder { + #The path where ffmpeg is installed + ffmpeg-path = /usr/bin/ffmpeg + + #The path where ffprobe is installed + ffprobe-path = /usr/bin/ffprobe +} diff --git a/akka-bbb-transcode/src/main/resources/logback.xml b/akka-bbb-transcode/src/main/resources/logback.xml new file mode 100644 index 0000000000000000000000000000000000000000..73cb0571c10ba5766716a95fb31c65363e433669 --- /dev/null +++ b/akka-bbb-transcode/src/main/resources/logback.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<configuration> +<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> + <encoder> + <pattern>%date{ISO8601} %-5level %logger{36} %X{akkaSource} - %msg%n</pattern> + </encoder> +</appender> + + <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <File>logs/bbb-transcode.log</File> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <FileNamePattern>logs/bbb-transcode.%d{yyyy-MM-dd}.log</FileNamePattern> + <!-- keep 30 days worth of history --> + <MaxHistory>5</MaxHistory> + </rollingPolicy> + <layout class="ch.qos.logback.classic.PatternLayout"> + <Pattern>%d{"yyyy-MM-dd HH:mm:ss,SSSXXX"} [%thread] %-5level %logger{35} - %msg%n</Pattern> + </layout> + </appender> + + <logger name="akka" level="INFO" /> + <logger name="org.bigbluebutton" level="DEBUG" /> + <logger name="org.freeswitch.transcode" level="WARN" /> + + <root level="INFO"> + <appender-ref ref="STDOUT"/> + <appender-ref ref="FILE" /> + </root> +</configuration> diff --git a/akka-bbb-transcode/src/main/scala/org/bigbluebutton/Boot.scala b/akka-bbb-transcode/src/main/scala/org/bigbluebutton/Boot.scala new file mode 100644 index 0000000000000000000000000000000000000000..d38af2c86d47c65aa7461916d2e88fd52a1401d4 --- /dev/null +++ b/akka-bbb-transcode/src/main/scala/org/bigbluebutton/Boot.scala @@ -0,0 +1,23 @@ +package org.bigbluebutton + +import akka.actor.{ ActorSystem, Props } +import scala.concurrent.duration._ +import redis.RedisClient +import scala.concurrent.{ Future, Await } +import scala.concurrent.ExecutionContext.Implicits.global +import org.bigbluebutton.endpoint.redis.{ RedisPublisher, AppsRedisSubscriberActor } +import org.bigbluebutton.transcode.pubsub.receivers.RedisMessageReceiver +import org.bigbluebutton.transcode.core.TranscodingInGW + +object Boot extends App with SystemConfiguration { + + implicit val system = ActorSystem("bigbluebutton-transcode-system") + + val redisPublisher = new RedisPublisher(system) + + var transcodingInGW = new TranscodingInGW(system, redisPublisher); + + val redisMsgReceiver = new RedisMessageReceiver(transcodingInGW); + + val redisSubscriberActor = system.actorOf(AppsRedisSubscriberActor.props(system, redisMsgReceiver), "redis-subscriber") +} diff --git a/akka-bbb-transcode/src/main/scala/org/bigbluebutton/SystemConfiguration.scala b/akka-bbb-transcode/src/main/scala/org/bigbluebutton/SystemConfiguration.scala new file mode 100644 index 0000000000000000000000000000000000000000..9bfb7098867f993f00018e1e1e88654d53822209 --- /dev/null +++ b/akka-bbb-transcode/src/main/scala/org/bigbluebutton/SystemConfiguration.scala @@ -0,0 +1,20 @@ +package org.bigbluebutton + +import com.typesafe.config.ConfigFactory +import scala.util.Try + +trait SystemConfiguration { + + val config = ConfigFactory.load() + + lazy val redisHost = Try(config.getString("redis.host")).getOrElse("127.0.0.1") + lazy val redisPort = Try(config.getInt("redis.port")).getOrElse(6379) + lazy val redisPassword = Try(config.getString("redis.password")).getOrElse("") + + lazy val _ffmpegPath = Try(config.getString("transcoder.ffmpeg-path")).getOrElse("/usr/local/bin/ffmpeg") + lazy val _ffprobePath = Try(config.getString("transcoder.ffprobe-path")).getOrElse("/usr/local/bin/ffprobe") + + lazy val _videoconfLogoImagePath = Try(config.getString("videoconference.videoconf-logo-image-path")).getOrElse("") + lazy val _enableUserVideoSubtitle = Try(config.getString("videoconference.enable-user-video-subtitle").toBoolean).getOrElse(false) + lazy val _sipVideoResolution = Try(config.getString("videoconference.sip-video-resolution")).getOrElse("") +} diff --git a/akka-bbb-transcode/src/main/scala/org/bigbluebutton/endpoint/redis/AppsRedisSubscriberActor.scala b/akka-bbb-transcode/src/main/scala/org/bigbluebutton/endpoint/redis/AppsRedisSubscriberActor.scala new file mode 100755 index 0000000000000000000000000000000000000000..3fc85256acadd6bc14688d260df30288097951ae --- /dev/null +++ b/akka-bbb-transcode/src/main/scala/org/bigbluebutton/endpoint/redis/AppsRedisSubscriberActor.scala @@ -0,0 +1,79 @@ +package org.bigbluebutton.endpoint.redis + +import akka.actor.Props +import java.net.InetSocketAddress +import redis.actors.RedisSubscriberActor +import redis.api.pubsub.{ PMessage, Message } +import scala.concurrent.duration._ +import akka.actor.ActorRef +import akka.actor.actorRef2Scala +import org.bigbluebutton.SystemConfiguration +import org.bigbluebutton.transcode.pubsub.receivers.RedisMessageReceiver +import redis.api.servers.ClientSetname +import org.bigbluebutton.common.converters.FromJsonDecoder +import org.bigbluebutton.common.messages.PubSubPongMessage +import akka.actor.ActorSystem +import scala.concurrent.duration._ +import scala.concurrent.ExecutionContext.Implicits.global + +object AppsRedisSubscriberActor extends SystemConfiguration { + + val channels = Seq("time") + val patterns = Seq("bigbluebutton:to-bbb-transcode:*") + + def props(system: ActorSystem, msgReceiver: RedisMessageReceiver): Props = + Props(classOf[AppsRedisSubscriberActor], system, msgReceiver, + redisHost, redisPort, + channels, patterns).withDispatcher("akka.rediscala-subscriber-worker-dispatcher") +} + +class AppsRedisSubscriberActor(val system: ActorSystem, msgReceiver: RedisMessageReceiver, redisHost: String, + redisPort: Int, channels: Seq[String] = Nil, patterns: Seq[String] = Nil) + extends RedisSubscriberActor(new InetSocketAddress(redisHost, redisPort), + channels, patterns) { + + val decoder = new FromJsonDecoder() + + var lastPongReceivedOn = 0L + system.scheduler.schedule(10 seconds, 10 seconds)(checkPongMessage()) + + // Set the name of this client to be able to distinguish when doing + // CLIENT LIST on redis-cli + write(ClientSetname("BbbTranscodeAkkaSub").encodedRequest) + + def checkPongMessage() { + val now = System.currentTimeMillis() + + if (lastPongReceivedOn != 0 && (now - lastPongReceivedOn > 30000)) { + log.error("BBB-Transcode pubsub error!"); + } + } + + def onMessage(message: Message) { + log.debug(s"message received: $message") + } + + def onPMessage(pmessage: PMessage) { + log.debug(s"pattern message received: $pmessage") + + val msg = decoder.decodeMessage(pmessage.data) + + if (msg != null) { + msg match { + case m: PubSubPongMessage => { + if (m.payload.system == "BbbTranscode") { + lastPongReceivedOn = System.currentTimeMillis() + } + } + case _ => // do nothing + } + } else { + msgReceiver.handleMessage(pmessage.patternMatched, pmessage.channel, pmessage.data) + } + + } + + def handleMessage(msg: String) { + log.warning("**** TODO: Handle pubsub messages. ****") + } +} diff --git a/akka-bbb-transcode/src/main/scala/org/bigbluebutton/endpoint/redis/RedisPublisher.scala b/akka-bbb-transcode/src/main/scala/org/bigbluebutton/endpoint/redis/RedisPublisher.scala new file mode 100755 index 0000000000000000000000000000000000000000..1f491cef6349de45a144c20affe836be269094a2 --- /dev/null +++ b/akka-bbb-transcode/src/main/scala/org/bigbluebutton/endpoint/redis/RedisPublisher.scala @@ -0,0 +1,34 @@ +package org.bigbluebutton.endpoint.redis + +import akka.actor.Props +import redis.RedisClient +import scala.concurrent.duration._ +import scala.concurrent.ExecutionContext.Implicits.global +import akka.actor.ActorSystem +import scala.concurrent.Await +import akka.actor.Actor +import org.bigbluebutton.SystemConfiguration +import org.bigbluebutton.common.converters.ToJsonEncoder + +class RedisPublisher(val system: ActorSystem) extends SystemConfiguration { + + val redis = RedisClient(redisHost, redisPort)(system) + + // Set the name of this client to be able to distinguish when doing + // CLIENT LIST on redis-cli + redis.clientSetname("BbbTranscodeAkkaPub") + + val encoder = new ToJsonEncoder() + def sendPingMessage() { + val json = encoder.encodePubSubPingMessage("BbbTranscode", System.currentTimeMillis()) + redis.publish("bigbluebutton:to-bbb-apps:system", json) + } + + system.scheduler.schedule(10 seconds, 10 seconds)(sendPingMessage()) + + def publish(channel: String, data: String) { + //println("PUBLISH TO [" + channel + "]: \n [" + data + "]") + redis.publish(channel, data) + } + +} diff --git a/akka-bbb-transcode/src/main/scala/org/bigbluebutton/transcode/TranscodingInGW.scala b/akka-bbb-transcode/src/main/scala/org/bigbluebutton/transcode/TranscodingInGW.scala new file mode 100644 index 0000000000000000000000000000000000000000..57abcc4b238ed6067be5a8fd4d69edcd5312d4f8 --- /dev/null +++ b/akka-bbb-transcode/src/main/scala/org/bigbluebutton/transcode/TranscodingInGW.scala @@ -0,0 +1,35 @@ +package org.bigbluebutton.transcode.core + +import org.bigbluebutton.transcode.core.api.ITranscodingInGW +import org.bigbluebutton.endpoint.redis.RedisPublisher +import scala.collection.JavaConversions._ +import java.util.ArrayList +import scala.collection.mutable.ArrayBuffer +import akka.actor.ActorSystem +import org.bigbluebutton.transcode.api._ + +class TranscodingInGW(val system: ActorSystem, messageSender: RedisPublisher) extends ITranscodingInGW { + val log = system.log + val transcodingActor = system.actorOf(TranscodingActor.props(system, messageSender), "bbb-transcoding-manager") + + def startTranscoder(meetingId: String, transcoderId: String, params: java.util.Map[String, String]) { + transcodingActor ! new StartTranscoderRequest(meetingId, transcoderId, params) + } + + def updateTranscoder(meetingId: String, transcoderId: String, params: java.util.Map[String, String]) { + transcodingActor ! new UpdateTranscoderRequest(meetingId, transcoderId, params) + } + + def stopTranscoder(meetingId: String, transcoderId: String) { + transcodingActor ! new StopTranscoderRequest(meetingId, transcoderId) + } + + def stopMeetingTranscoders(meetingId: String) { + transcodingActor ! new StopMeetingTranscoders(meetingId) + } + + def startProbing(meetingId: String, transcoderId: String, params: java.util.Map[String, String]) { + transcodingActor ! new StartProbingRequest(meetingId, transcoderId, params) + } + +} diff --git a/akka-bbb-transcode/src/main/scala/org/bigbluebutton/transcode/api/InMessages.scala b/akka-bbb-transcode/src/main/scala/org/bigbluebutton/transcode/api/InMessages.scala new file mode 100644 index 0000000000000000000000000000000000000000..7b34fb72c8b744874bb51bc60ef441dde9d5f12e --- /dev/null +++ b/akka-bbb-transcode/src/main/scala/org/bigbluebutton/transcode/api/InMessages.scala @@ -0,0 +1,9 @@ +package org.bigbluebutton.transcode.api + +trait InMessage { val meetingId: String } + +case class StartTranscoderRequest(meetingId: String, transcoderId: String, params: java.util.Map[String, String]) extends InMessage +case class UpdateTranscoderRequest(meetingId: String, transcoderId: String, params: java.util.Map[String, String]) extends InMessage +case class StopTranscoderRequest(meetingId: String, transcoderId: String) extends InMessage +case class StopMeetingTranscoders(meetingId: String) extends InMessage +case class StartProbingRequest(meetingId: String, transcoderId: String, params: java.util.Map[String, String]) extends InMessage diff --git a/akka-bbb-transcode/src/main/scala/org/bigbluebutton/transcode/api/OutMessages.scala b/akka-bbb-transcode/src/main/scala/org/bigbluebutton/transcode/api/OutMessages.scala new file mode 100644 index 0000000000000000000000000000000000000000..fa650f308fd9bd933dade6a4e3a7bfc3e64e8016 --- /dev/null +++ b/akka-bbb-transcode/src/main/scala/org/bigbluebutton/transcode/api/OutMessages.scala @@ -0,0 +1,12 @@ +package org.bigbluebutton.transcode.api + +import scala.collection.mutable.HashMap + +abstract class OutMessage + +case class StartTranscoderReply(meetingId: String, transcoderId: String, params: HashMap[String, String]) extends OutMessage +case class StopTranscoderReply(meetingId: String, transcoderId: String) extends OutMessage +case class UpdateTranscoderReply(meetingId: String, transcoderId: String, params: HashMap[String, String]) extends OutMessage +case class StartProbingReply(meetingId: String, transcoderId: String, params: HashMap[String, String]) extends OutMessage + +case class TranscoderStatusUpdate(meetingId: String, transcoderId: String, params: HashMap[String, String]) extends OutMessage diff --git a/akka-bbb-transcode/src/main/scala/org/bigbluebutton/transcode/core/MessageSenderActor.scala b/akka-bbb-transcode/src/main/scala/org/bigbluebutton/transcode/core/MessageSenderActor.scala new file mode 100644 index 0000000000000000000000000000000000000000..af2ce5e9f97644f12cf029e088db4df524186f72 --- /dev/null +++ b/akka-bbb-transcode/src/main/scala/org/bigbluebutton/transcode/core/MessageSenderActor.scala @@ -0,0 +1,84 @@ +package org.bigbluebutton.transcode.core + +import akka.actor.Actor +import akka.actor.ActorContext +import akka.actor.ActorLogging +import akka.actor.Props +import org.bigbluebutton.transcode.api._ +import org.bigbluebutton.endpoint.redis.RedisPublisher + +import collection.JavaConverters._ +import scala.collection.JavaConversions._ + +import org.bigbluebutton.common.messages.StartTranscoderReplyMessage +import org.bigbluebutton.common.messages.StopTranscoderReplyMessage +import org.bigbluebutton.common.messages.TranscoderStatusUpdateMessage +import org.bigbluebutton.common.messages.UpdateTranscoderReplyMessage +import org.bigbluebutton.common.messages.StartProbingReplyMessage +import org.bigbluebutton.common.messages.MessagingConstants + +object MessageSenderActor { + def props(msgSender: RedisPublisher): Props = + Props(classOf[MessageSenderActor], msgSender) +} + +class MessageSenderActor(val msgSender: RedisPublisher) + extends Actor with ActorLogging { + + def receive = { + case msg: StartTranscoderReply => handleStartTranscoderReply(msg) + case msg: StopTranscoderReply => handleStopTranscoderReply(msg) + case msg: UpdateTranscoderReply => handleUpdateTranscoderReply(msg) + case msg: TranscoderStatusUpdate => handleTranscoderStatusUpdate(msg) + case msg: StartProbingReply => handleStartProbingReply(msg) + case _ => // do nothing + } + + private def handleStartTranscoderReply(msg: StartTranscoderReply) { + System.out.println("Sending StartTranscoderReplyMessage. Params: [\n" + + "meetingId = " + msg.meetingId + "\n" + + "transcoderId = " + msg.transcoderId + "\n" + + "params = " + msg.params.mkString(", ") + "\n]\n") + + val str = new StartTranscoderReplyMessage(msg.meetingId, msg.transcoderId, msg.params) + msgSender.publish(MessagingConstants.FROM_BBB_TRANSCODE_SYSTEM_CHAN, str.toJson()) + } + + private def handleStopTranscoderReply(msg: StopTranscoderReply) { + System.out.println("Sending StopTranscoderReplyMessage. Params: [\n" + + "meetingId = " + msg.meetingId + "\n" + + "transcoderId = " + msg.transcoderId + "\n]\n") + val str = new StopTranscoderReplyMessage(msg.meetingId, msg.transcoderId) + msgSender.publish(MessagingConstants.FROM_BBB_TRANSCODE_SYSTEM_CHAN, str.toJson()) + } + + private def handleUpdateTranscoderReply(msg: UpdateTranscoderReply) { + System.out.println("Sending UpdateTranscoderReplyMessage. Params: [\n" + + "meetingId = " + msg.meetingId + "\n" + + "transcoderId = " + msg.transcoderId + "\n" + + "params = " + msg.params.mkString(", ") + "\n]\n") + + val str = new UpdateTranscoderReplyMessage(msg.meetingId, msg.transcoderId, msg.params) + msgSender.publish(MessagingConstants.FROM_BBB_TRANSCODE_SYSTEM_CHAN, str.toJson()) + } + + private def handleTranscoderStatusUpdate(msg: TranscoderStatusUpdate) { + System.out.println("Sending TranscoderStatusUpdateMessage. Params: [\n" + + "meetingId = " + msg.meetingId + "\n" + + "transcoderId = " + msg.transcoderId + "\n" + + "params = " + msg.params.mkString(", ") + "\n]\n") + + val str = new TranscoderStatusUpdateMessage(msg.meetingId, msg.transcoderId, msg.params) + msgSender.publish(MessagingConstants.FROM_BBB_TRANSCODE_SYSTEM_CHAN, str.toJson()) + } + + private def handleStartProbingReply(msg: StartProbingReply) { + System.out.println("Sending StartProbingReplyMessage. Params: [\n" + + "meetingId = " + msg.meetingId + "\n" + + "transcoderId = " + msg.transcoderId + "\n" + + "params = " + msg.params.mkString(", ") + "\n]\n") + val str = new TranscoderStatusUpdateMessage(msg.meetingId, msg.transcoderId, msg.params) + msgSender.publish(MessagingConstants.FROM_BBB_TRANSCODE_SYSTEM_CHAN, str.toJson()) + } + +} diff --git a/akka-bbb-transcode/src/main/scala/org/bigbluebutton/transcode/core/TranscodersModel.scala b/akka-bbb-transcode/src/main/scala/org/bigbluebutton/transcode/core/TranscodersModel.scala new file mode 100644 index 0000000000000000000000000000000000000000..efb727963802ec430a84d307b2808daf8709ea2e --- /dev/null +++ b/akka-bbb-transcode/src/main/scala/org/bigbluebutton/transcode/core/TranscodersModel.scala @@ -0,0 +1,41 @@ + +package org.bigbluebutton.transcode.core + +import scala.collection.mutable.HashMap +import akka.actor.ActorRef + +class TranscodersModel { + + private var meetings = new HashMap[String, HashMap[String, ActorRef]] + + def addTranscoder(meetingId: String, transcoderId: String, transcoderActor: ActorRef) { + meetings.get(meetingId) match { + case Some(transcoders) => transcoders += transcoderId -> transcoderActor + case _ => + var transcoders = new HashMap[String, ActorRef] + transcoders += transcoderId -> transcoderActor + meetings += meetingId -> transcoders + } + } + + def removeTranscoder(meetingId: String, transcoderId: String) { + meetings.get(meetingId) match { + case Some(transcoders) => transcoders -= transcoderId + case _ => + } + } + + def getTranscoder(meetingId: String, transcoderId: String): Option[ActorRef] = { + meetings.get(meetingId) match { + case Some(transcoders) => transcoders.get(transcoderId) + case _ => None + } + } + + def getTranscoders(meetingId: String): Array[ActorRef] = { + meetings.get(meetingId) match { + case Some(transcoders) => transcoders.values toArray + case _ => Array.empty + } + } +} diff --git a/akka-bbb-transcode/src/main/scala/org/bigbluebutton/transcode/core/TranscodersService.scala b/akka-bbb-transcode/src/main/scala/org/bigbluebutton/transcode/core/TranscodersService.scala new file mode 100644 index 0000000000000000000000000000000000000000..1991583dee024159f447e2da4397f7d832fb79b0 --- /dev/null +++ b/akka-bbb-transcode/src/main/scala/org/bigbluebutton/transcode/core/TranscodersService.scala @@ -0,0 +1,29 @@ +package org.bigbluebutton.transcode.core + +import org.bigbluebutton.SystemConfiguration +import org.bigbluebutton.transcode.core.ffmpeg.FFmpegUtils + +class TranscodersService {} + +object TranscodersService extends SystemConfiguration { + + def ffmpegPath(): String = { + _ffmpegPath + } + + def ffprobePath(): String = { + _ffprobePath + } + + def videoconfLogoImagePath(): String = { + _videoconfLogoImagePath + } + + def enableUserVideoSubtitle(): Boolean = { + _enableUserVideoSubtitle + } + + def sipVideoResolution(): String = { + _sipVideoResolution + } +} diff --git a/akka-bbb-transcode/src/main/scala/org/bigbluebutton/transcode/core/TranscodingActor.scala b/akka-bbb-transcode/src/main/scala/org/bigbluebutton/transcode/core/TranscodingActor.scala new file mode 100644 index 0000000000000000000000000000000000000000..0fcc1d4fa4fd9bb7d00a012b15faf524fb12617b --- /dev/null +++ b/akka-bbb-transcode/src/main/scala/org/bigbluebutton/transcode/core/TranscodingActor.scala @@ -0,0 +1,116 @@ +package org.bigbluebutton.transcode.core + +import akka.actor._ +import akka.actor.ActorLogging +import scala.collection.mutable.HashMap +import org.bigbluebutton.endpoint.redis.RedisPublisher +import org.bigbluebutton.transcode.api._ +import org.bigbluebutton.SystemConfiguration +import scala.collection._ +import scala.collection.JavaConversions._ +import org.bigbluebutton.common.messages.Constants +import org.bigbluebutton.transcode.core.apps.{ TranscodingObserverApp } + +object TranscodingActor extends SystemConfiguration { + def props(system: ActorSystem, messageSender: RedisPublisher): Props = + Props(classOf[TranscodingActor], system, messageSender) +} + +class TranscodingActor(val system: ActorSystem, messageSender: RedisPublisher) + extends Actor with ActorLogging with TranscodingObserverApp { + val transcodersModel = new TranscodersModel() + + val messageSenderActor = context.actorOf(MessageSenderActor.props(messageSender), "bbb-sender-actor") + + def receive = { + case msg: StartTranscoderRequest => handleStartTranscoderRequest(msg) + case msg: UpdateTranscoderRequest => handleUpdateTranscoderRequest(msg) + case msg: StopTranscoderRequest => handleStopTranscoderRequest(msg) + case msg: StopMeetingTranscoders => handleStopMeetingTranscoders(msg) + case msg: StartProbingRequest => handleStartProbingRequest(msg) + + //internal messages + case msg: StartVideoTranscoderReply => handleStartVideoTranscoderReply(msg) + case msg: UpdateVideoTranscoderReply => handleUpdateVideoTranscoderReply(msg) + case msg: DestroyVideoTranscoderReply => handleDestroyVideoTranscoderReply(msg) + case msg: TranscodingFinishedUnsuccessfully => handleTranscodingFinishedUnsuccessfully(msg) + case msg: TranscodingFinishedSuccessfully => handleTranscodingFinishedSuccessfully(msg) + case msg: RestartVideoTranscoderReply => handleRestartVideoTranscoderReply(msg) + case msg: StartVideoProbingReply => handleStartVideoProbingReply(msg) + case _ => // do nothing + } + + private def handleStartTranscoderRequest(msg: StartTranscoderRequest) { + log.info("\n > Received StartTranscoderRequest. Params:\n" + + " meetingId = " + msg.meetingId + "\n" + + " transcoderId = " + msg.transcoderId + "\n" + + " params = " + msg.params.toString() + "\n") + + transcodersModel.getTranscoder(msg.meetingId, msg.transcoderId) match { + case Some(vt) => { + log.info("\n > Found a transcoder for this user {}", msg.transcoderId) + vt ! new StartVideoTranscoderRequest() + } + case None => { + val vt = context.actorOf(VideoTranscoder.props(self, msg.meetingId, msg.transcoderId, msg.params)) + transcodersModel.addTranscoder(msg.meetingId, msg.transcoderId, vt) + vt ! new StartVideoTranscoderRequest() + } + } + } + + private def handleUpdateTranscoderRequest(msg: UpdateTranscoderRequest) { + log.info("\n > Received UpdateTranscoderRequest. Params:\n" + + " meetingId = " + msg.meetingId + "\n" + + " transcoderId = " + msg.transcoderId + "\n" + + " params = " + msg.params.toString() + "\n") + + transcodersModel.getTranscoder(msg.meetingId, msg.transcoderId) match { + case Some(vt) => vt ! new UpdateVideoTranscoderRequest(msg.params) + case None => + log.info("\n > Video transcoder with id = {} not found (might be finished already or it is restarting).", msg.transcoderId) + } + } + + private def handleStopTranscoderRequest(msg: StopTranscoderRequest) { + log.info("\n > Received StopTranscoderRequest. Params:\n" + + " meetingId = " + msg.meetingId + "\n" + + " transcoderId = " + msg.transcoderId + "\n") + transcodersModel.getTranscoder(msg.meetingId, msg.transcoderId) match { + case Some(vt) => { + transcodersModel.removeTranscoder(msg.meetingId, msg.transcoderId) + vt ! new DestroyVideoTranscoderRequest() //stop transcoder and destroy it's actor + } + case None => { + log.info("\n > Transcoder with id = {} not found (might be finished already).", msg.transcoderId) + } + } + } + + private def handleStopMeetingTranscoders(msg: StopMeetingTranscoders) { + log.info("\n > Received StopMeetingTranscoders. Params:\n" + + " meetingId = " + msg.meetingId + "\n") + + transcodersModel.getTranscoders(msg.meetingId) foreach { + vt => vt ! new DestroyVideoTranscoderRequest() + } + } + + private def handleStartProbingRequest(msg: StartProbingRequest) { + log.info("\n > Received StartProbingRequest. Params:\n" + + " meetingId = " + msg.meetingId + "\n" + + " transcoderId = " + msg.transcoderId + "\n") + transcodersModel.getTranscoder(msg.meetingId, msg.transcoderId) match { + case Some(vt) => { + log.info("\n > Found a transcoder for this user {}", msg.transcoderId) + vt ! new StartVideoProbingRequest() + } + case None => { + val vt = context.actorOf(VideoTranscoder.props(self, msg.meetingId, msg.transcoderId, msg.params)) + transcodersModel.addTranscoder(msg.meetingId, msg.transcoderId, vt) + vt ! new StartVideoProbingRequest() + } + } + } + +} diff --git a/akka-bbb-transcode/src/main/scala/org/bigbluebutton/transcode/core/apps/TranscodingObserverApp.scala b/akka-bbb-transcode/src/main/scala/org/bigbluebutton/transcode/core/apps/TranscodingObserverApp.scala new file mode 100644 index 0000000000000000000000000000000000000000..a4ad9396d4662e7be92edd3fe3b022a733a56942 --- /dev/null +++ b/akka-bbb-transcode/src/main/scala/org/bigbluebutton/transcode/core/apps/TranscodingObserverApp.scala @@ -0,0 +1,78 @@ +package org.bigbluebutton.transcode.core.apps + +import akka.actor.ActorRef +import org.bigbluebutton.transcode.core.TranscodingActor +import org.bigbluebutton.transcode.api._ +import org.bigbluebutton.common.messages.Constants +import org.bigbluebutton.transcode.core.ffmpeg.FFmpegConstants +import scala.collection.JavaConversions._ + +trait TranscodingObserverApp { + + this: TranscodingActor => + + val messageSenderActor: ActorRef + + def handleTranscodingFinishedUnsuccessfully(msg: TranscodingFinishedUnsuccessfully) = { + transcodersModel.getTranscoder(msg.getMeetingId(), msg.getTranscoderId()) match { + case Some(vt) => { + log.info("\n > Transcoder for this user {} stopped unsuccessfully, restarting it...", msg.getTranscoderId()) + vt ! new RestartVideoTranscoderRequest() + } + case None => { + log.info("\n > Video transcoder with id = {} not found (might be destroyed already).", msg.getTranscoderId()) + } + } + } + + def handleTranscodingFinishedSuccessfully(msg: TranscodingFinishedSuccessfully) = { + transcodersModel.getTranscoder(msg.getMeetingId(), msg.getTranscoderId()) match { + case Some(vt) => { + log.info("\n > Transcoder for this user {} stopped with success, removing it from transcoder's list...", msg.getTranscoderId()) + transcodersModel.removeTranscoder(msg.getMeetingId(), msg.getTranscoderId()) + } + case None => { + log.info("\n > Video transcoder with id = {} not found (might be destroyed already).", msg.getTranscoderId()) + } + } + } + + def handleStartVideoTranscoderReply(msg: StartVideoTranscoderReply) = { + log.info("\n > Transcoder with id = {} started", msg.getTranscoderId()) + val params = new scala.collection.mutable.HashMap[String, String] + params += Constants.OUTPUT -> msg.getOutput() + messageSenderActor ! new StartTranscoderReply(msg.getMeetingId(), msg.getTranscoderId(), params) + } + + def handleUpdateVideoTranscoderReply(msg: UpdateVideoTranscoderReply) = { + log.info("\n > Transcoder with id = {} updated", msg.getTranscoderId()) + val params = new scala.collection.mutable.HashMap[String, String] + params += Constants.OUTPUT -> msg.getOutput() + messageSenderActor ! new UpdateTranscoderReply(msg.getMeetingId(), msg.getTranscoderId(), params) + } + + def handleDestroyVideoTranscoderReply(msg: DestroyVideoTranscoderReply) = { + log.info("\n > Transcoder with id = {} stopped", msg.getTranscoderId()) + messageSenderActor ! new StopTranscoderReply(msg.getMeetingId(), msg.getTranscoderId()) + } + + def handleRestartVideoTranscoderReply(msg: RestartVideoTranscoderReply) = { + log.info("\n > Transcoder with id = {} restarted", msg.getTranscoderId()) + val params = new scala.collection.mutable.HashMap[String, String] + params += Constants.OUTPUT -> msg.getOutput() + messageSenderActor ! new TranscoderStatusUpdate(msg.getMeetingId(), msg.getTranscoderId(), params) + } + + def handleStartVideoProbingReply(msg: StartVideoProbingReply) = { + val ffprobeResult = mapAsScalaMap(msg.getProbingData()) + Option(ffprobeResult) match { + case Some(result) => + val params = new scala.collection.mutable.HashMap[String, String] + params += Constants.WIDTH_RATIO -> result.getOrElse(FFmpegConstants.WIDTH, "") + params += Constants.HEIGHT_RATIO -> result.getOrElse(FFmpegConstants.HEIGHT, "") + messageSenderActor ! new StartProbingReply(msg.getMeetingId(), msg.getTranscoderId(), params) + case _ => log.debug("Could not send ffprobe reply : failed to get the new resolution"); + } + } + +} diff --git a/bbb-apps-common/src/main/java/org/bigbluebutton/red5/client/MeetingClientMessageSender.java b/bbb-apps-common/src/main/java/org/bigbluebutton/red5/client/MeetingClientMessageSender.java index cd2e19214b1aa5af60cb0b0bbadfd66a7c468d59..e83644210c727c5f9fb6bebdc4a17dbe17902afa 100755 --- a/bbb-apps-common/src/main/java/org/bigbluebutton/red5/client/MeetingClientMessageSender.java +++ b/bbb-apps-common/src/main/java/org/bigbluebutton/red5/client/MeetingClientMessageSender.java @@ -5,7 +5,6 @@ import java.util.Map; import org.bigbluebutton.common.messages.Constants; import org.bigbluebutton.common.messages.DisconnectAllUsersMessage; -import org.bigbluebutton.common.messages.DisconnectUserMessage; import org.bigbluebutton.common.messages.InactivityWarningMessage; import org.bigbluebutton.common.messages.MeetingEndedMessage; import org.bigbluebutton.common.messages.MeetingEndingMessage; @@ -13,8 +12,6 @@ import org.bigbluebutton.common.messages.MeetingHasEndedMessage; import org.bigbluebutton.common.messages.MeetingIsActiveMessage; import org.bigbluebutton.common.messages.MeetingMutedMessage; import org.bigbluebutton.common.messages.MeetingStateMessage; -import org.bigbluebutton.common.messages.NewPermissionsSettingMessage; -import org.bigbluebutton.common.messages.UserLockedMessage; import org.bigbluebutton.red5.client.messaging.BroadcastClientMessage; import org.bigbluebutton.red5.client.messaging.IConnectionInvokerService; import org.bigbluebutton.red5.client.messaging.DirectClientMessage; @@ -43,12 +40,6 @@ public class MeetingClientMessageSender { if (header.has("name")) { String messageName = header.get("name").getAsString(); switch (messageName) { - case DisconnectUserMessage.DISCONNECT_USER: - DisconnectUserMessage m = DisconnectUserMessage.fromJson(message); - if (m != null) { - processDisconnectUserMessage(m); - } - break; case DisconnectAllUsersMessage.DISCONNECT_All_USERS: DisconnectAllUsersMessage daum = DisconnectAllUsersMessage.fromJson(message); if (daum != null) { @@ -79,24 +70,12 @@ public class MeetingClientMessageSender { processMeetingStateMessage(msm); } break; - case NewPermissionsSettingMessage.NEW_PERMISSIONS_SETTING: - NewPermissionsSettingMessage npsm = NewPermissionsSettingMessage.fromJson(message); - if (npsm != null) { - processNewPermissionsSettingMessage(npsm); - } - break; case MeetingMutedMessage.MEETING_MUTED: MeetingMutedMessage mmm = MeetingMutedMessage.fromJson(message); if (mmm != null) { processMeetingMutedMessage(mmm); } break; - case UserLockedMessage.USER_LOCKED: - UserLockedMessage ulm = UserLockedMessage.fromJson(message); - if (ulm != null) { - processUserLockedMessage(ulm); - } - break; case InactivityWarningMessage.INACTIVITY_WARNING: InactivityWarningMessage iwm = InactivityWarningMessage.fromJson(message); if (iwm != null) { @@ -137,26 +116,6 @@ public class MeetingClientMessageSender { DirectClientMessage m = new DirectClientMessage(msg.meetingId, msg.userId, "meetingState", message); service.sendMessage(m); - } - - private void processNewPermissionsSettingMessage(NewPermissionsSettingMessage msg) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("disableCam", msg.permissions.get(Constants.PERM_DISABLE_CAM)); - args.put("disableMic", msg.permissions.get(Constants.PERM_DISABLE_MIC)); - args.put("disablePrivateChat", msg.permissions.get(Constants.PERM_DISABLE_PRIVCHAT)); - args.put("disablePublicChat", msg.permissions.get(Constants.PERM_DISABLE_PUBCHAT)); - args.put("lockedLayout", msg.permissions.get(Constants.PERM_LOCKED_LAYOUT)); - args.put("lockOnJoin", msg.permissions.get(Constants.PERM_LOCK_ON_JOIN)); - args.put("lockOnJoinConfigurable", msg.permissions.get(Constants.PERM_LOCK_ON_JOIN_CONFIG)); - - args.put("users", msg.users); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - BroadcastClientMessage m = new BroadcastClientMessage(msg.meetingId, "permissionsSettingsChanged", message); - service.sendMessage(m); } private void processMeetingMutedMessage(MeetingMutedMessage msg) { @@ -199,25 +158,6 @@ public class MeetingClientMessageSender { DisconnectAllClientsMessage dm = new DisconnectAllClientsMessage(msg.meetingId); service.sendMessage(dm); } - - private void processDisconnectUserMessage(DisconnectUserMessage msg) { - DisconnectClientMessage m = new DisconnectClientMessage(msg.meetingId, msg.userId); - service.sendMessage(m); - } - - private void processUserLockedMessage(UserLockedMessage msg) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("meetingID", msg.meetingId); - args.put("user", msg.userId); - args.put("lock", msg.locked); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - BroadcastClientMessage m = new BroadcastClientMessage(msg.meetingId, "userLocked", message); - service.sendMessage(m); - } private void processInactivityWarningMessage(InactivityWarningMessage msg) { Map<String, Object> args = new HashMap<String, Object>(); diff --git a/bbb-apps-common/src/main/java/org/bigbluebutton/red5/client/PollingClientMessageSender.java b/bbb-apps-common/src/main/java/org/bigbluebutton/red5/client/PollingClientMessageSender.java deleted file mode 100755 index 417c42fd32824ff1773fe3a036b26839a7d5e272..0000000000000000000000000000000000000000 --- a/bbb-apps-common/src/main/java/org/bigbluebutton/red5/client/PollingClientMessageSender.java +++ /dev/null @@ -1,108 +0,0 @@ -package org.bigbluebutton.red5.client; - - -import java.util.HashMap; -import java.util.Map; -import org.bigbluebutton.common.messages.*; -import org.bigbluebutton.red5.client.messaging.BroadcastClientMessage; -import org.bigbluebutton.red5.client.messaging.IConnectionInvokerService; -import org.bigbluebutton.red5.client.messaging.DirectClientMessage; -import com.google.gson.Gson; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class PollingClientMessageSender { - private IConnectionInvokerService service; - - public PollingClientMessageSender(IConnectionInvokerService service) { - this.service = service; - } - - public void handlePollMessage(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - - switch (messageName) { - case PollStartedMessage.POLL_STARTED: - processPollStartedMessage(message); - break; - case PollStoppedMessage.POLL_STOPPED: - processPollStoppedMessage(message); - break; - case PollShowResultMessage.POLL_SHOW_RESULT: - processPollShowResultMessage(message); - break; - case UserVotedPollMessage.USER_VOTED_POLL: - processUserVotedPollMessage(message); - break; - } - } - } - } - - private void processPollStartedMessage(String json) { - PollStartedMessage msg = PollStartedMessage.fromJson(json); - if (msg != null) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("poll", msg.poll); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - BroadcastClientMessage b = new BroadcastClientMessage(msg.meetingId, "pollStartedMessage", message); - service.sendMessage(b); - } - } - - private void processPollStoppedMessage(String json) { - PollStoppedMessage msg = PollStoppedMessage.fromJson(json); - if (msg != null) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("pollId", msg.pollId); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - BroadcastClientMessage b = new BroadcastClientMessage(msg.meetingId, "pollStoppedMessage", message); - service.sendMessage(b); - } - } - - private void processPollShowResultMessage(String json) { - PollShowResultMessage msg = PollShowResultMessage.fromJson(json); - if (msg != null) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("poll", msg.poll); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - BroadcastClientMessage b = new BroadcastClientMessage(msg.meetingId, "pollShowResultMessage", message); - service.sendMessage(b); - } - } - - private void processUserVotedPollMessage(String json) { - UserVotedPollMessage msg = UserVotedPollMessage.fromJson(json); - if (msg != null) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("poll", msg.poll); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - DirectClientMessage b = new DirectClientMessage(msg.meetingId, msg.presenterId, "pollUserVotedMessage", message); - service.sendMessage(b); - } - } -} diff --git a/bbb-apps-common/src/main/java/org/bigbluebutton/red5/client/PresentationClientMessageSender.java b/bbb-apps-common/src/main/java/org/bigbluebutton/red5/client/PresentationClientMessageSender.java deleted file mode 100755 index 5e3e596d969fbff5209dad013bdb8d5317d3e8a2..0000000000000000000000000000000000000000 --- a/bbb-apps-common/src/main/java/org/bigbluebutton/red5/client/PresentationClientMessageSender.java +++ /dev/null @@ -1,292 +0,0 @@ -package org.bigbluebutton.red5.client; - -import java.util.HashMap; -import java.util.Map; - -import org.bigbluebutton.common.messages.Constants; -import org.bigbluebutton.common.messages.GetPresentationInfoReplyMessage; -import org.bigbluebutton.common.messages.GetSlideInfoReplyMessage; -import org.bigbluebutton.common.messages.GoToSlideReplyMessage; -import org.bigbluebutton.common.messages.PresentationConversionDoneMessage; -import org.bigbluebutton.common.messages.PresentationConversionErrorMessage; -import org.bigbluebutton.common.messages.PresentationConversionProgressMessage; -import org.bigbluebutton.common.messages.PresentationPageGeneratedReplyMessage; -import org.bigbluebutton.common.messages.PresentationPageResizedMessage; -import org.bigbluebutton.common.messages.PresentationRemovedMessage; -import org.bigbluebutton.common.messages.PresentationSharedMessage; -import org.bigbluebutton.red5.client.messaging.BroadcastClientMessage; -import org.bigbluebutton.red5.client.messaging.IConnectionInvokerService; -import org.bigbluebutton.red5.client.messaging.DirectClientMessage; - -import com.google.gson.Gson; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class PresentationClientMessageSender { - private IConnectionInvokerService service; - - public PresentationClientMessageSender(IConnectionInvokerService service) { - this.service = service; - } - - public void handlePresentationMessage(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - switch (messageName) { - case PresentationRemovedMessage.PRESENTATION_REMOVED: - processPresentationRemovedMessage(message); - break; - case GetPresentationInfoReplyMessage.GET_PRESENTATION_INFO_REPLY: - processGetPresentationInfoReplyMessage(message); - break; - case GoToSlideReplyMessage.GO_TO_SLIDE_REPLY: - processGoToSlideMessage(message); - break; - case PresentationConversionProgressMessage.PRESENTATION_CONVERSION_PROGRESS: - processPresentationConversionProgress(message); - break; - case PresentationPageGeneratedReplyMessage.PRESENTATION_PAGE_GENERATED: - processPresentationPageGeneratedReply(message); - break; - case PresentationConversionErrorMessage.PRESENTATION_CONVERSION_ERROR: - processPresentationConversionError(message); - break; - case GetSlideInfoReplyMessage.GET_SLIDE_INFO: - processGetSlideInfoReply(message); - break; - case PresentationConversionDoneMessage.PRESENTATION_CONVERSION_DONE: - processPresentationConversionDone(message); - break; - case PresentationPageResizedMessage.PRESENTATION_PAGE_RESIZED: - processPresentationPageResized(message); - break; - case PresentationSharedMessage.PRESENTATION_SHARED_MESSAGE: - processPresentationSharedMessage(message); - break; - } - } - } - } - - private void processPresentationRemovedMessage(String json) { - PresentationRemovedMessage msg = PresentationRemovedMessage.fromJson(json); - if (msg != null) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("presentationID", msg.presentationId); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - BroadcastClientMessage m = new BroadcastClientMessage(msg.meetingId, "removePresentationCallback", message); - service.sendMessage(m); - } - } - - private void processGetPresentationInfoReplyMessage(String json) { - GetPresentationInfoReplyMessage msg = GetPresentationInfoReplyMessage.fromJson(json); - if (msg != null) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("meetingID", msg.meetingId); - args.put("presenter", msg.presenter); - args.put("presentations", msg.presentations); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - DirectClientMessage m = new DirectClientMessage(msg.meetingId, msg.requesterId, "getPresentationInfoReply", message); - service.sendMessage(m); - } - } - - private void processPresentationSharedMessage(String json) { - - PresentationSharedMessage msg = PresentationSharedMessage.fromJson(json); - if (msg != null) { - - Map<String, Object> presentation = new HashMap<String, Object>(); - presentation.put("id", msg.presentation.get("id")); - presentation.put("name", msg.presentation.get("name")); - presentation.put("current", msg.presentation.get("current")); - presentation.put("pages", msg.presentation.get("pages")); - presentation.put("downloadable", msg.presentation.get("downloadable")); - - Map<String, Object> args = new HashMap<String, Object>(); - args.put("presentation", presentation); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - BroadcastClientMessage m = new BroadcastClientMessage(msg.meetingId, "sharePresentationCallback", message); - service.sendMessage(m); - } - } - - private void processPresentationPageResized(String json) { - - PresentationPageResizedMessage msg = PresentationPageResizedMessage.fromJson(json); - if (msg != null) { - Map<String, Object> args = new HashMap<String, Object>(); - - args.put("id", msg.page.get("id")); - args.put("num", msg.page.get("num")); - args.put("current", msg.page.get("current")); - args.put("swfUri", msg.page.get("swf_uri")); - args.put("txtUri", msg.page.get("txt_uri")); - args.put("svgUri", msg.page.get("svg_uri")); - args.put("thumbUri", msg.page.get("thumb_uri")); - args.put("xOffset", msg.page.get("x_offset")); - args.put("yOffset", msg.page.get("y_offset")); - args.put("widthRatio", msg.page.get("width_ratio")); - args.put("heightRatio", msg.page.get("height_ratio")); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - BroadcastClientMessage m = new BroadcastClientMessage(msg.meetingId, "moveCallback", message); - service.sendMessage(m); - } - } - - private void processPresentationConversionDone(String json) { - - PresentationConversionDoneMessage msg = PresentationConversionDoneMessage.fromJson(json); - if (msg != null) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("meetingID", msg.meetingId); - args.put("code", msg.code); - - Map<String, Object> presentation = new HashMap<String, Object>(); - presentation.put("id", msg.presentation.get("id")); - presentation.put("name", msg.presentation.get("name")); - presentation.put("current", msg.presentation.get("current")); - presentation.put("pages", msg.presentation.get("pages")); - presentation.put("downloadable", msg.presentation.get("downloadable")); - - args.put("presentation", presentation); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - BroadcastClientMessage m = new BroadcastClientMessage(msg.meetingId, "conversionCompletedUpdateMessageCallback", message); - service.sendMessage(m); - } - } - - private void processGetSlideInfoReply(String json) { - GetSlideInfoReplyMessage msg = GetSlideInfoReplyMessage.fromJson(json); - if (msg != null) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("meetingID", msg.meetingId); - args.put("xOffset", msg.xOffset); - args.put("yOffest", msg.yOffset); - args.put("widthRatio", msg.widthRatio); - args.put("heightRatio", msg.heightRatio); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - DirectClientMessage m = new DirectClientMessage(msg.meetingId, msg.requesterId, "getSlideInfoReply", message); - service.sendMessage(m); - } - } - - private void processPresentationConversionError(String json) { - PresentationConversionErrorMessage msg = PresentationConversionErrorMessage.fromJson(json); - if (msg != null) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("meetingID", msg.meetingId); - args.put("code", msg.code); - args.put("presentationID", msg.presentationId); - args.put("presentationName", msg.presentationName); - args.put("messageKey", msg.messageKey); - args.put("numberOfPages", msg.numPages); - args.put("maxNumberPages", msg.maxNumPages); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - BroadcastClientMessage m = new BroadcastClientMessage(msg.meetingId, "pageCountExceededUpdateMessageCallback", message); - service.sendMessage(m); - } - } - - private void processPresentationPageGeneratedReply(String json) { - PresentationPageGeneratedReplyMessage msg = PresentationPageGeneratedReplyMessage.fromJson(json); - if (msg != null) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("presentationID", msg.presentationId); - args.put("meetingID", msg.meetingId); - args.put("code", msg.code); - args.put("messageKey", msg.messageKey); - args.put("presentationName", msg.presentationName); - args.put("pagesCompleted", msg.pagesCompleted); - args.put("numberOfPages", msg.numPages); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - BroadcastClientMessage m = new BroadcastClientMessage(msg.meetingId, "generatedSlideUpdateMessageCallback", message); - service.sendMessage(m); - } - } - - private void processPresentationConversionProgress(String json) { - PresentationConversionProgressMessage msg = PresentationConversionProgressMessage.fromJson(json); - if (msg != null) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("presentationID", msg.presentationId); - args.put("meetingID", msg.meetingId); - args.put("code", msg.code); - args.put("messageKey", msg.messageKey); - args.put("presentationName", msg.presentationName); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - BroadcastClientMessage m = new BroadcastClientMessage(msg.meetingId, "conversionUpdateMessageCallback", message); - service.sendMessage(m); - } - } - - - private void processGoToSlideMessage(String json) { - GoToSlideReplyMessage msg = GoToSlideReplyMessage.fromJson(json); - if (msg != null) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("id", msg.page.get(Constants.ID)); - args.put("widthRatio", msg.page.get(Constants.WIDTH_RATIO)); - args.put("yOffset", msg.page.get(Constants.Y_OFFSET)); - args.put("xOffset", msg.page.get(Constants.X_OFFSET)); - args.put("num", msg.page.get("num")); - args.put("heightRatio", msg.page.get(Constants.HEIGHT_RATIO)); - args.put("svgUri", msg.page.get("svg_uri")); - args.put("thumbUri", msg.page.get("thumb_uri")); - args.put(Constants.CURRENT, msg.page.get(Constants.CURRENT)); - args.put("txtUri", msg.page.get("txt_uri")); - args.put("swfUri", msg.page.get("swf_uri")); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - BroadcastClientMessage m = new BroadcastClientMessage(msg.meetingId, "goToSlideCallback", message); - service.sendMessage(m); - } - } - -} diff --git a/bbb-apps-common/src/main/java/org/bigbluebutton/red5/client/UserClientMessageSender.java b/bbb-apps-common/src/main/java/org/bigbluebutton/red5/client/UserClientMessageSender.java index f7272b7ed1ec68910a641409bbd94f3f50e942bc..2ed9907e44894de5b8b0c1cb1fc34892cdefb9fb 100755 --- a/bbb-apps-common/src/main/java/org/bigbluebutton/red5/client/UserClientMessageSender.java +++ b/bbb-apps-common/src/main/java/org/bigbluebutton/red5/client/UserClientMessageSender.java @@ -1,43 +1,10 @@ package org.bigbluebutton.red5.client; -import java.text.SimpleDateFormat; -import java.util.Calendar; import java.util.HashMap; -import java.util.Iterator; import java.util.Map; -import org.bigbluebutton.common.messages.BroadcastLayoutMessage; -import org.bigbluebutton.common.messages.GetCurrentLayoutReplyMessage; -import org.bigbluebutton.common.messages.GuestPolicyChangedMessage; -import org.bigbluebutton.common.messages.GetGuestPolicyReplyMessage; import org.bigbluebutton.common.messages.GetRecordingStatusReplyMessage; -import org.bigbluebutton.common.messages.GetUsersReplyMessage; -import org.bigbluebutton.common.messages.GuestAccessDeniedMessage; -import org.bigbluebutton.common.messages.LockLayoutMessage; -import org.bigbluebutton.common.messages.PresenterAssignedMessage; import org.bigbluebutton.common.messages.RecordingStatusChangedMessage; -import org.bigbluebutton.common.messages.UserEmojiStatusMessage; -import org.bigbluebutton.common.messages.UserJoinedMessage; -import org.bigbluebutton.common.messages.UserJoinedVoiceMessage; -import org.bigbluebutton.common.messages.UserLeftMessage; -import org.bigbluebutton.common.messages.UserLeftVoiceMessage; -import org.bigbluebutton.common.messages.UserListeningOnlyMessage; -import org.bigbluebutton.common.messages.UserSharedWebcamMessage; -import org.bigbluebutton.common.messages.UserStatusChangedMessage; -import org.bigbluebutton.common.messages.UserRoleChangeMessage; -import org.bigbluebutton.common.messages.UserUnsharedWebcamMessage; -import org.bigbluebutton.common.messages.UserVoiceMutedMessage; -import org.bigbluebutton.common.messages.UserVoiceTalkingMessage; -import org.bigbluebutton.common.messages.ValidateAuthTokenReplyMessage; -import org.bigbluebutton.common.messages.ValidateAuthTokenTimeoutMessage; -import org.bigbluebutton.common.messages.UserEjectedFromMeetingMessage; -import org.bigbluebutton.messages.BreakoutRoomClosed; -import org.bigbluebutton.messages.BreakoutRoomJoinURL; -import org.bigbluebutton.messages.BreakoutRoomStarted; -import org.bigbluebutton.messages.BreakoutRoomsList; -import org.bigbluebutton.messages.BreakoutRoomsTimeRemainingUpdate; -import org.bigbluebutton.messages.TimeRemainingUpdate; -import org.bigbluebutton.messages.UpdateBreakoutUsers; import org.bigbluebutton.red5.client.messaging.BroadcastClientMessage; import org.bigbluebutton.red5.client.messaging.IConnectionInvokerService; import org.bigbluebutton.red5.client.messaging.DirectClientMessage; @@ -64,99 +31,9 @@ public class UserClientMessageSender { if (header.has("name")) { // Used for JSON unmarshalling - Gson gson = new Gson(); - + String messageName = header.get("name").getAsString(); switch (messageName) { - case ValidateAuthTokenReplyMessage.VALIDATE_AUTH_TOKEN_REPLY: - ValidateAuthTokenReplyMessage m = ValidateAuthTokenReplyMessage.fromJson(message); - if (m != null) { - processValidateAuthTokenReply(m); - } - break; - case ValidateAuthTokenTimeoutMessage.VALIDATE_AUTH_TOKEN_TIMEOUT: - ValidateAuthTokenTimeoutMessage vattm = ValidateAuthTokenTimeoutMessage.fromJson(message); - if (vattm != null) { - processValidateAuthTokenTimeoutMessage(vattm); - } - break; - case UserLeftMessage.USER_LEFT: - UserLeftMessage ulm = UserLeftMessage.fromJson(message); - if (ulm != null) { - processUserLeftMessage(ulm); - } - break; - case UserJoinedMessage.USER_JOINED: - UserJoinedMessage ujm = UserJoinedMessage.fromJson(message); - if (ujm != null) { - processUserJoinedMessage(ujm); - } - break; - case PresenterAssignedMessage.PRESENTER_ASSIGNED: - PresenterAssignedMessage pam = PresenterAssignedMessage.fromJson(message); - if (pam != null) { - processPresenterAssignedMessage(pam); - } - break; - case UserStatusChangedMessage.USER_STATUS_CHANGED: - UserStatusChangedMessage usm = UserStatusChangedMessage.fromJson(message); - if (usm != null) { - processUserStatusChangedMessage(usm); - } - case UserRoleChangeMessage.USER_ROLE_CHANGE: - UserRoleChangeMessage urcm = UserRoleChangeMessage.fromJson(message); - if (urcm != null) { - processUserRoleChangeMessage(urcm); - } - break; - case UserEmojiStatusMessage.USER_EMOJI_STATUS: - UserEmojiStatusMessage urhm = UserEmojiStatusMessage.fromJson(message); - if (urhm != null) { - processUserEmojiStatusMessage(urhm); - } - break; - case UserListeningOnlyMessage.USER_LISTENING_ONLY: - UserListeningOnlyMessage ulom = UserListeningOnlyMessage.fromJson(message); - if (ulom != null) { - processUserListeningOnlyMessage(ulom); - } - break; - case UserSharedWebcamMessage.USER_SHARED_WEBCAM: - UserSharedWebcamMessage uswm = UserSharedWebcamMessage.fromJson(message); - if (uswm != null) { - processUserSharedWebcamMessage(uswm); - } - break; - case UserUnsharedWebcamMessage.USER_UNSHARED_WEBCAM: - UserUnsharedWebcamMessage uuwm = UserUnsharedWebcamMessage.fromJson(message); - if (uuwm != null) { - processUserUnsharedWebcamMessage(uuwm); - } - break; - case UserJoinedVoiceMessage.USER_JOINED_VOICE: - UserJoinedVoiceMessage ujvm = UserJoinedVoiceMessage.fromJson(message); - if (ujvm != null) { - processUserJoinedVoiceMessage(ujvm); - } - break; - case UserLeftVoiceMessage.USER_LEFT_VOICE: - UserLeftVoiceMessage ulvm = UserLeftVoiceMessage.fromJson(message); - if (ulvm != null) { - processUserLeftVoiceMessage(ulvm); - } - break; - case UserVoiceMutedMessage.USER_VOICE_MUTED: - UserVoiceMutedMessage uvmm = UserVoiceMutedMessage.fromJson(message); - if (uvmm != null) { - processUserVoiceMutedMessage(uvmm); - } - break; - case UserVoiceTalkingMessage.USER_VOICE_TALKING: - UserVoiceTalkingMessage uvtm = UserVoiceTalkingMessage.fromJson(message); - if (uvtm != null) { - processUserVoiceTalkingMessage(uvtm); - } - break; case RecordingStatusChangedMessage.RECORDING_STATUS_CHANGED: RecordingStatusChangedMessage rscm = RecordingStatusChangedMessage.fromJson(message); if (rscm != null) { @@ -169,359 +46,11 @@ public class UserClientMessageSender { processGetRecordingStatusReplyMessage(grsrm); } break; - case GetUsersReplyMessage.GET_USERS_REPLY: - GetUsersReplyMessage gurm = GetUsersReplyMessage.fromJson(message); - if (gurm != null) { - processGetUsersReplyMessage(gurm); - } - break; - case GetGuestPolicyReplyMessage.GET_GUEST_POLICY_REPLY: - GetGuestPolicyReplyMessage ggprm = GetGuestPolicyReplyMessage.fromJson(message); - if (ggprm != null) { - processGetGuestPolicyReplyMessage(ggprm); - } - break; - case GuestPolicyChangedMessage.GUEST_POLICY_CHANGED: - GuestPolicyChangedMessage gpcm = GuestPolicyChangedMessage.fromJson(message); - if (gpcm != null) { - processGuestPolicyChangedMessage(gpcm); - } - break; - case GuestAccessDeniedMessage.GUEST_ACCESS_DENIED: - GuestAccessDeniedMessage gadm = GuestAccessDeniedMessage.fromJson(message); - if (gadm != null) { - processGuestAccessDeniedMessage(gadm); - } - break; - case GetCurrentLayoutReplyMessage.GET_CURRENT_LAYOUT_REPLY: - processGetCurrentLayoutReplyMessage(message); - break; - case BroadcastLayoutMessage.BROADCAST_LAYOUT: - processBroadcastLayoutMessage(message); - break; - case LockLayoutMessage.LOCK_LAYOUT: - processLockLayoutMessage(message); - break; - case UserEjectedFromMeetingMessage.USER_EJECTED_FROM_MEETING: - processUserEjectedFromMeetingMessage(message); - break; - case BreakoutRoomsList.NAME: - BreakoutRoomsList brl = gson.fromJson(message, BreakoutRoomsList.class); - if (brl != null) { - processBreakoutRoomsList(brl); - } - break; - case BreakoutRoomJoinURL.NAME: - BreakoutRoomJoinURL brjum = gson.fromJson(message, BreakoutRoomJoinURL.class); - if (brjum != null) { - processBreakoutRoomJoinURL(brjum); - } - break; - case TimeRemainingUpdate.NAME: - TimeRemainingUpdate trum = gson.fromJson(message, TimeRemainingUpdate.class); - if (trum != null) { - processTimeRemainingUpdate(trum); - } - break; - case BreakoutRoomsTimeRemainingUpdate.NAME: - BreakoutRoomsTimeRemainingUpdate brtru = gson.fromJson(message, BreakoutRoomsTimeRemainingUpdate.class); - if (brtru != null) { - processBreakoutRoomsTimeRemainingUpdate(brtru); - } - break; - case UpdateBreakoutUsers.NAME: - UpdateBreakoutUsers ubum = gson.fromJson(message, UpdateBreakoutUsers.class); - if (ubum != null) { - processUpdateBreakoutUsers(ubum); - } - break; - case BreakoutRoomStarted.NAME: - BreakoutRoomStarted brsm = gson.fromJson(message, BreakoutRoomStarted.class); - if (brsm != null) { - processBreakoutRoomStarted(brsm); - } - break; - case BreakoutRoomClosed.NAME: - BreakoutRoomClosed brcm = gson.fromJson(message, BreakoutRoomClosed.class); - if (brcm != null) { - processBreakoutRoomClosed(brcm); - } - break; } } } } - private void processUserEjectedFromMeetingMessage(String message) { - UserEjectedFromMeetingMessage msg = UserEjectedFromMeetingMessage.fromJson(message); - if (msg != null) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("ejectedBy", msg.ejectedBy); - System.out.println("**** User [" + msg.userId + "] was ejected by [" + msg.ejectedBy + "]"); - DirectClientMessage m = new DirectClientMessage(msg.meetingId, msg.userId, "userEjectedFromMeeting", args); - service.sendMessage(m); - } - } - - private void processLockLayoutMessage(String message) { - LockLayoutMessage msg = LockLayoutMessage.fromJson(message); - if (msg != null) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("locked", msg.locked); - args.put("setById", msg.setByUserid); - - Iterator<String> usersIter = msg.users.iterator(); - while (usersIter.hasNext()){ - String user = usersIter.next(); - DirectClientMessage m = new DirectClientMessage(msg.meetingId, user, "layoutLocked", args); - service.sendMessage(m); - } - } - } - - private void processBroadcastLayoutMessage(String message) { - BroadcastLayoutMessage msg = BroadcastLayoutMessage.fromJson(message); - if (msg != null) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("locked", msg.locked); - args.put("setByUserID", msg.setByUserid); - args.put("layout", msg.layout); - - Iterator<String> usersIter = msg.users.iterator(); - while (usersIter.hasNext()){ - String user = usersIter.next(); - DirectClientMessage m = new DirectClientMessage(msg.meetingId, user, "syncLayout", args); - service.sendMessage(m); - } - } - } - - private void processGetCurrentLayoutReplyMessage(String message) { - GetCurrentLayoutReplyMessage msg = GetCurrentLayoutReplyMessage.fromJson(message); - if (msg != null) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("locked", msg.locked); - args.put("setById", msg.setByUserid); - args.put("layout", msg.layout); - - DirectClientMessage m = new DirectClientMessage(msg.meetingId, msg.requestedByUserid, "getCurrentLayoutResponse", args); - service.sendMessage(m); - } - } - - private void processValidateAuthTokenReply(ValidateAuthTokenReplyMessage msg) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("userId", msg.userId); - args.put("valid", msg.valid); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - DirectClientMessage m = new DirectClientMessage(msg.meetingId, msg.userId, "validateAuthTokenReply", message); - service.sendMessage(m); - } - - private void processValidateAuthTokenTimeoutMessage(ValidateAuthTokenTimeoutMessage msg) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("userId", msg.userId); - args.put("valid", msg.valid); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - DirectClientMessage m = new DirectClientMessage(msg.meetingId, msg.userId, "validateAuthTokenTimedOut", message); - service.sendMessage(m); - } - - private void processUserLeftMessage(UserLeftMessage msg) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("user", msg.user); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - BroadcastClientMessage m = new BroadcastClientMessage(msg.meetingId, "participantLeft", message); - service.sendMessage(m); - } - - private void processUserJoinedMessage(UserJoinedMessage msg) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("user", msg.user); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - String userId = msg.user.get("userId").toString(); - - DirectClientMessage jmr = new DirectClientMessage(msg.meetingId, userId, "joinMeetingReply", message); - service.sendMessage(jmr); - - BroadcastClientMessage m = new BroadcastClientMessage(msg.meetingId, "participantJoined", message); - service.sendMessage(m); - } - - private void processPresenterAssignedMessage(PresenterAssignedMessage msg) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("newPresenterID", msg.newPresenterId); - args.put("newPresenterName", msg.newPresenterName); - args.put("assignedBy", msg.assignedBy); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - BroadcastClientMessage m = new BroadcastClientMessage(msg.meetingId, "assignPresenterCallback", message); - service.sendMessage(m); - } - - private void processUserEmojiStatusMessage(UserEmojiStatusMessage msg) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("userId", msg.userId); - args.put("emojiStatus", msg.emojiStatus); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - BroadcastClientMessage m = new BroadcastClientMessage(msg.meetingId, "userEmojiStatus", message); - service.sendMessage(m); - } - - private void processUserListeningOnlyMessage(UserListeningOnlyMessage msg) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("userId", msg.userId); - args.put("listenOnly", msg.listenOnly); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - BroadcastClientMessage m = new BroadcastClientMessage(msg.meetingId, "user_listening_only", message); - service.sendMessage(m); - } - - private void processUserStatusChangedMessage(UserStatusChangedMessage msg) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("userID", msg.userId); - args.put("status", msg.status); - args.put("value", msg.value); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - BroadcastClientMessage m = new BroadcastClientMessage(msg.meetingId, "participantStatusChange", message); - service.sendMessage(m); - } - - private void processUserRoleChangeMessage(UserRoleChangeMessage msg) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("userID", msg.userId); - args.put("role", msg.role); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - BroadcastClientMessage m = new BroadcastClientMessage(msg.meetingId, "participantRoleChange", message); - service.sendMessage(m); - } - - private void processUserSharedWebcamMessage(UserSharedWebcamMessage msg) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("userId", msg.userId); - args.put("webcamStream", msg.stream); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - BroadcastClientMessage m = new BroadcastClientMessage(msg.meetingId, "userSharedWebcam", message); - service.sendMessage(m); - } - - private void processUserUnsharedWebcamMessage(UserUnsharedWebcamMessage msg) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("userId", msg.userId); - args.put("webcamStream", msg.stream); - - String timeStamp = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ").format(Calendar.getInstance().getTime()); - args.put("serverTimestamp", timeStamp ); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - BroadcastClientMessage m = new BroadcastClientMessage(msg.meetingId, "userUnsharedWebcam", message); - service.sendMessage(m); - } - - private void processUserJoinedVoiceMessage(UserJoinedVoiceMessage msg) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("meetingID", msg.meetingId); - args.put("user", msg.user); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - BroadcastClientMessage m = new BroadcastClientMessage(msg.meetingId, "userJoinedVoice", message); - service.sendMessage(m); - } - - private void processUserLeftVoiceMessage(UserLeftVoiceMessage msg) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("meetingID", msg.meetingId); - args.put("user", msg.user); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - BroadcastClientMessage m = new BroadcastClientMessage(msg.meetingId, "userLeftVoice", message); - service.sendMessage(m); - } - - private void processUserVoiceMutedMessage(UserVoiceMutedMessage msg) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("meetingID", msg.meetingId); - args.put("userId", msg.user.get("userId")); - - Map<String, Object> vuMap = (Map<String, Object>) msg.user.get("voiceUser"); - - args.put("voiceUserId", (String) vuMap.get("userId")); - args.put("muted", (Boolean) vuMap.get("muted")); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - BroadcastClientMessage m = new BroadcastClientMessage(msg.meetingId, "voiceUserMuted", message); - service.sendMessage(m); - } - - private void processUserVoiceTalkingMessage(UserVoiceTalkingMessage msg) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("meetingID", msg.meetingId); - args.put("userId", msg.user.get("userId")); - - Map<String, Object> vuMap = (Map<String, Object>) msg.user.get("voiceUser"); - - args.put("voiceUserId", (String) vuMap.get("userId")); - args.put("talking", (Boolean) vuMap.get("talking")); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - BroadcastClientMessage m = new BroadcastClientMessage(msg.meetingId, "voiceUserTalking", message); - service.sendMessage(m); - } - private void processRecordingStatusChangedMessage(RecordingStatusChangedMessage msg) { Map<String, Object> args = new HashMap<String, Object>(); args.put("userId", msg.userId); @@ -547,152 +76,4 @@ public class UserClientMessageSender { DirectClientMessage m = new DirectClientMessage(msg.meetingId, msg.userId, "getRecordingStatusReply", message); service.sendMessage(m); } - - private void processGetUsersReplyMessage(GetUsersReplyMessage msg) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("count", msg.users.size()); - args.put("users", msg.users); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - DirectClientMessage m = new DirectClientMessage(msg.meetingId, msg.requesterId, "getUsersReply", message); - service.sendMessage(m); - } - - private void processBreakoutRoomsList(BreakoutRoomsList msg) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("meetingId", msg.payload.meetingId); - args.put("rooms", msg.payload.rooms); - args.put("roomsReady", msg.payload.roomsReady); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - BroadcastClientMessage m = new BroadcastClientMessage(msg.payload.meetingId, "breakoutRoomsList", message); - service.sendMessage(m); - } - - private void processBreakoutRoomJoinURL(BreakoutRoomJoinURL msg) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("parentMeetingId", msg.payload.parentMeetingId); - args.put("breakoutMeetingId", msg.payload.breakoutMeetingId); - args.put("userId", msg.payload.userId); - args.put("redirectJoinURL", msg.payload.redirectJoinURL); - args.put("noRedirectJoinURL", msg.payload.noRedirectJoinURL); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - DirectClientMessage m = new DirectClientMessage(msg.payload.parentMeetingId, msg.payload.userId, "breakoutRoomJoinURL", message); - service.sendMessage(m); - } - - private void processTimeRemainingUpdate(TimeRemainingUpdate msg) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("meetingId", msg.payload.meetingId); - args.put("timeRemaining", msg.payload.timeRemaining); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - BroadcastClientMessage m = new BroadcastClientMessage(msg.payload.meetingId, "timeRemainingUpdate", message); - service.sendMessage(m); - } - - private void processBreakoutRoomsTimeRemainingUpdate(BreakoutRoomsTimeRemainingUpdate msg) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("meetingId", msg.payload.meetingId); - args.put("timeRemaining", msg.payload.timeRemaining); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - BroadcastClientMessage m = new BroadcastClientMessage(msg.payload.meetingId, "breakoutRoomsTimeRemainingUpdate", message); - service.sendMessage(m); - } - - private void processUpdateBreakoutUsers(UpdateBreakoutUsers msg) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("parentMeetingId", msg.payload.parentMeetingId); - args.put("breakoutMeetingId", msg.payload.breakoutMeetingId); - args.put("users", msg.payload.users); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - BroadcastClientMessage m = new BroadcastClientMessage(msg.payload.parentMeetingId, "updateBreakoutUsers", message); - service.sendMessage(m); - } - - private void processBreakoutRoomStarted(BreakoutRoomStarted msg) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("breakoutMeetingId", msg.payload.meetingId); - args.put("parentMeetingId", msg.payload.parentMeetingId); - args.put("externalMeetingId", msg.payload.externalMeetingId); - args.put("sequence", msg.payload.sequence); - args.put("name", msg.payload.name); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - BroadcastClientMessage m = new BroadcastClientMessage(msg.payload.parentMeetingId, "breakoutRoomStarted", message); - service.sendMessage(m); - } - - private void processBreakoutRoomClosed(BreakoutRoomClosed msg) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("breakoutMeetingId", msg.payload.meetingId); - args.put("parentMeetingId", msg.payload.parentMeetingId); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - BroadcastClientMessage m = new BroadcastClientMessage(msg.payload.parentMeetingId, "breakoutRoomClosed", message); - service.sendMessage(m); - } - - private void processGetGuestPolicyReplyMessage(GetGuestPolicyReplyMessage msg) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("guestPolicy", msg.guestPolicy.toString()); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - DirectClientMessage m = new DirectClientMessage(msg.meetingId, msg.requesterId, "get_guest_policy_reply", message); - service.sendMessage(m); - } - - private void processGuestPolicyChangedMessage(GuestPolicyChangedMessage msg) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("guestPolicy", msg.guestPolicy.toString()); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - BroadcastClientMessage m = new BroadcastClientMessage(msg.meetingId, "guest_policy_changed", message); - service.sendMessage(m); - } - - private void processGuestAccessDeniedMessage(GuestAccessDeniedMessage msg) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("userId", msg.userId); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - DirectClientMessage m = new DirectClientMessage(msg.meetingId, msg.userId, "guest_access_denied", message); - service.sendMessage(m); - } } diff --git a/bbb-apps-common/src/main/java/org/bigbluebutton/red5/client/WhiteboardClientMessageSender.java b/bbb-apps-common/src/main/java/org/bigbluebutton/red5/client/WhiteboardClientMessageSender.java deleted file mode 100755 index f8817ea20923f1991afc8d3169869b8650aa59e5..0000000000000000000000000000000000000000 --- a/bbb-apps-common/src/main/java/org/bigbluebutton/red5/client/WhiteboardClientMessageSender.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.bigbluebutton.red5.client; - -import java.util.HashMap; -import java.util.Map; -import org.bigbluebutton.common.messages.CursorPositionUpdatedMessage; -import org.bigbluebutton.red5.client.messaging.BroadcastClientMessage; -import org.bigbluebutton.red5.client.messaging.IConnectionInvokerService; -import org.bigbluebutton.red5.client.messaging.DirectClientMessage; - -import com.google.gson.Gson; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class WhiteboardClientMessageSender { - private IConnectionInvokerService service; - - public WhiteboardClientMessageSender(IConnectionInvokerService service) { - this.service = service; - } - - public void handleWhiteboardMessage(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - - switch (messageName) { - case CursorPositionUpdatedMessage.CURSOR_POSITION_UPDATED: - CursorPositionUpdatedMessage cpum = CursorPositionUpdatedMessage.fromJson(message); - if (cpum != null) { - processCursorPositionUpdatedMessage(cpum); - } - break; - } - } - } - } - - - private void processCursorPositionUpdatedMessage(CursorPositionUpdatedMessage msg) { - Map<String, Object> args = new HashMap<String, Object>(); - args.put("requesterId", msg.requesterId); - args.put("xPercent", msg.xPercent); - args.put("yPercent", msg.yPercent); - - Map<String, Object> message = new HashMap<String, Object>(); - Gson gson = new Gson(); - message.put("msg", gson.toJson(args)); - - BroadcastClientMessage m = new BroadcastClientMessage(msg.meetingId, "WhiteboardCursorPositionUpdatedCommand", message); - service.sendMessage(m); - } -} diff --git a/bbb-apps-common/src/main/scala/org/bigbluebutton/client/MsgToClientGW.scala b/bbb-apps-common/src/main/scala/org/bigbluebutton/client/MsgToClientGW.scala index bec29b9fa77a6ac369066d4e8813e7418ef5c31c..ab7e762470f687b2b425fa8cbe89c7d07e62e0ca 100755 --- a/bbb-apps-common/src/main/scala/org/bigbluebutton/client/MsgToClientGW.scala +++ b/bbb-apps-common/src/main/scala/org/bigbluebutton/client/MsgToClientGW.scala @@ -9,12 +9,10 @@ case class DisconnectAllConnections(scope: String) extends SystemMessage class MsgToClientGW(val connInvokerService: IConnectionInvokerService) { def broadcastToMeeting(msg: BroadcastToMeetingMsg): Unit = { - //println("**** MsgToClientGW broadcastToMeeting " + msg.json) connInvokerService.sendMessage(msg) } def directToClient(msg: DirectToClientMsg): Unit = { - //println("**** MsgToClientGW directToClient " + msg.json) connInvokerService.sendMessage(msg) } diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/converters/FromJsonDecoder.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/converters/FromJsonDecoder.java index c17a902cc7f50c761064ecb319b3294145397e11..00de7f557c3401ea6f69cf2c35091aab2790c10e 100755 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/converters/FromJsonDecoder.java +++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/converters/FromJsonDecoder.java @@ -3,7 +3,6 @@ package org.bigbluebutton.common.converters; import org.bigbluebutton.common.messages.IBigBlueButtonMessage; import org.bigbluebutton.common.messages.PubSubPingMessage; import org.bigbluebutton.common.messages.PubSubPongMessage; -import org.bigbluebutton.common.messages.StartCustomPollRequestMessage; import com.google.gson.Gson; import com.google.gson.JsonObject; @@ -27,10 +26,6 @@ public class FromJsonDecoder { Gson gson = new Gson(); PubSubPongMessage msg = gson.fromJson(message, PubSubPongMessage.class); return msg; - } else if (StartCustomPollRequestMessage.START_CUSTOM_POLL_REQUEST.equals(messageName)){ - Gson gson = new Gson(); - StartCustomPollRequestMessage msg = gson.fromJson(message, StartCustomPollRequestMessage.class); - return msg; } else { // System.out.println("Unknown message name=[" + messageName + "]"); return null; diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/AllowUserToShareDesktopReply.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/AllowUserToShareDesktopReply.java deleted file mode 100644 index cbe769de7d684c5a052c2ecfc824c8ee6d0cf058..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/AllowUserToShareDesktopReply.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class AllowUserToShareDesktopReply implements ISubscribedMessage { - public static final String NAME = "AllowUserToShareDesktopReply"; - public static final String VERSION = "0.0.1"; - - public static final String TIMESTAMP = "timestamp"; - public static final String MEETING_ID = "meeting_id"; - public static final String USER_ID = "user_id"; - public static final String ALLOWED = "allowed"; - - public final Long timestamp; - public final String userId; - public final String meetingId; - public final Boolean allowed; - - public AllowUserToShareDesktopReply(String meetingId, String userId, - Boolean allowed, Long timestamp) { - this.meetingId = meetingId; - this.userId = userId; - this.allowed = allowed; - this.timestamp = timestamp; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(TIMESTAMP, timestamp); - payload.put(MEETING_ID, meetingId); - payload.put(USER_ID, userId); - payload.put(ALLOWED, allowed); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(NAME, VERSION, null); - return MessageBuilder.buildJson(header, payload); - } - - public static AllowUserToShareDesktopReply fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (NAME.equals(messageName)) { - - if (payload.has(TIMESTAMP) && payload.has(MEETING_ID) - && payload.has(USER_ID) && payload.has(ALLOWED)) { - Long timestamp = payload.get(TIMESTAMP).getAsLong(); - String meetingId = payload.get(MEETING_ID).getAsString(); - String userId = payload.get(USER_ID).getAsString(); - Boolean allowed = payload.get(ALLOWED).getAsBoolean(); - return new AllowUserToShareDesktopReply(meetingId, userId, allowed, - timestamp); - } - } - } - } - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/AllowUserToShareDesktopRequest.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/AllowUserToShareDesktopRequest.java deleted file mode 100644 index f35fb98cc12114c109b3d6cce9c5e221dff61f48..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/AllowUserToShareDesktopRequest.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class AllowUserToShareDesktopRequest implements ISubscribedMessage { - public static final String NAME = "AllowUserToShareDesktopRequest"; - public static final String VERSION = "0.0.1"; - - public static final String TIMESTAMP = "timestamp"; - public static final String MEETING_ID = "meeting_id"; - public static final String USER_ID = "user_id"; - - public final Long timestamp; - public final String userId; - public final String meetingId; - - public AllowUserToShareDesktopRequest(String meetingId, String userId, Long timestamp) { - this.meetingId = meetingId; - this.userId = userId; - this.timestamp = timestamp; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(TIMESTAMP, timestamp); - payload.put(MEETING_ID, meetingId); - payload.put(USER_ID, userId); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(NAME, VERSION, null); - return MessageBuilder.buildJson(header, payload); - } - - public static AllowUserToShareDesktopRequest fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (NAME.equals(messageName)) { - - if (payload.has(TIMESTAMP) && payload.has(MEETING_ID) && payload.has(USER_ID)) { - Long timestamp = payload.get(TIMESTAMP).getAsLong(); - String meetingId = payload.get(MEETING_ID).getAsString(); - String userId = payload.get(USER_ID).getAsString(); - return new AllowUserToShareDesktopRequest(meetingId, userId, timestamp); - } - } - } - } - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/AssignPresenterRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/AssignPresenterRequestMessage.java deleted file mode 100755 index c26f165335ce7d36116f05f754c4a2ccb75f5e89..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/AssignPresenterRequestMessage.java +++ /dev/null @@ -1,63 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class AssignPresenterRequestMessage implements IBigBlueButtonMessage { - public static final String ASSIGN_PRESENTER_REQUEST = "assign_presenter_request_message"; - public final String VERSION = "0.0.1"; - - public final String meetingId; - public final String newPresenterId; - public final String newPresenterName; - public final String assignedBy; - - public AssignPresenterRequestMessage(String meetingID, String newPresenterId, String newPresenterName, String assignedBy) { - this.meetingId = meetingID; - this.newPresenterId = newPresenterId; - this.newPresenterName = newPresenterName; - this.assignedBy = assignedBy; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.NEW_PRESENTER_ID, newPresenterId); - payload.put(Constants.NEW_PRESENTER_NAME, newPresenterName); - payload.put(Constants.ASSIGNED_BY, assignedBy); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(ASSIGN_PRESENTER_REQUEST, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static AssignPresenterRequestMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (ASSIGN_PRESENTER_REQUEST.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.NEW_PRESENTER_ID) - && payload.has(Constants.NEW_PRESENTER_NAME) - && payload.has(Constants.ASSIGNED_BY)) { - String meetingId = payload.get(Constants.MEETING_ID).getAsString(); - String newPresenterId = payload.get(Constants.NEW_PRESENTER_ID).getAsString(); - String newPresenterName = payload.get(Constants.NEW_PRESENTER_NAME).getAsString(); - String assignedBy = payload.get(Constants.ASSIGNED_BY).getAsString(); - - return new AssignPresenterRequestMessage(meetingId, newPresenterId, newPresenterName, assignedBy); - } - } - } - } - - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/BroadcastLayoutMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/BroadcastLayoutMessage.java deleted file mode 100755 index 1aaf863f5c4661004a100b422b55d3bc6361e7bd..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/BroadcastLayoutMessage.java +++ /dev/null @@ -1,80 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.ArrayList; -import java.util.HashMap; - -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class BroadcastLayoutMessage implements ISubscribedMessage { - public static final String BROADCAST_LAYOUT = "broadcast_layout_message"; - public static final String VERSION = "0.0.1"; - - public static final String SET_BY_USERID = "set_by_userid"; - public static final String LAYOUT = "layout"; - public static final String LOCKED = "locked"; - public static final String USERS = "users"; - - public final String meetingId; - public final String setByUserid; - public final String layout; - public final Boolean locked; - public final ArrayList<String> users; - - public BroadcastLayoutMessage(String meetingId, String setByUserid, String layout, Boolean locked, ArrayList<String> users) { - this.meetingId = meetingId; - this.setByUserid = setByUserid; - this.layout = layout; - this.locked = locked; - this.users = users; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(SET_BY_USERID, setByUserid); - payload.put(LAYOUT, layout); - payload.put(LOCKED, locked); - payload.put(USERS, users); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(BROADCAST_LAYOUT, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static BroadcastLayoutMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (BROADCAST_LAYOUT.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(LOCKED) - && payload.has(SET_BY_USERID) - && payload.has(USERS) - && payload.has(LAYOUT)) { - String id = payload.get(Constants.MEETING_ID).getAsString(); - String setByUserid = payload.get(SET_BY_USERID).getAsString(); - String layout = payload.get(LAYOUT).getAsString(); - Boolean locked = payload.get(LOCKED).getAsBoolean(); - JsonArray usersArr = (JsonArray) payload.get(USERS); - - Util util = new Util(); - - ArrayList<String> users = util.extractUserids(usersArr); - return new BroadcastLayoutMessage(id, setByUserid, layout, locked, users); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/BroadcastLayoutRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/BroadcastLayoutRequestMessage.java deleted file mode 100755 index 2aaa198ccecf720cab39cc0c73dd8c76f9a79182..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/BroadcastLayoutRequestMessage.java +++ /dev/null @@ -1,61 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class BroadcastLayoutRequestMessage implements ISubscribedMessage { - public static final String BROADCAST_LAYOUT_REQUEST = "broadcast_layout_request_message"; - public static final String VERSION = "0.0.1"; - - public final static String LAYOUT = "layout"; - - public final String meetingId; - public final String userId; - public final String layout; - - public BroadcastLayoutRequestMessage(String meetingId, String userId, String layout) { - this.meetingId = meetingId; - this.userId = userId; - this.layout = layout; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.USER_ID, userId); - payload.put(LAYOUT, layout); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(BROADCAST_LAYOUT_REQUEST, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static BroadcastLayoutRequestMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (BROADCAST_LAYOUT_REQUEST.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.USER_ID) - && payload.has(LAYOUT)) { - String id = payload.get(Constants.MEETING_ID).getAsString(); - String userid = payload.get(Constants.USER_ID).getAsString(); - String layout = payload.get(LAYOUT).getAsString(); - return new BroadcastLayoutRequestMessage(id, userid, layout); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ChangeUserRoleMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ChangeUserRoleMessage.java deleted file mode 100644 index aef2845b57930337244ba0d08f516a62d077b9ba..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ChangeUserRoleMessage.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class ChangeUserRoleMessage implements IBigBlueButtonMessage { - public static final String CHANGE_USER_ROLE = "change_user_role"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final String userId; - public final String role; - - public ChangeUserRoleMessage(String meetingId, String userId, String role) { - this.meetingId = meetingId; - this.userId = userId; - this.role = role; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.USER_ID, userId); - payload.put(Constants.ROLE, role); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(CHANGE_USER_ROLE, VERSION, null); - return MessageBuilder.buildJson(header, payload); - } - - public static ChangeUserRoleMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (CHANGE_USER_ROLE.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.USER_ID) - && payload.has(Constants.ROLE)) { - String meetingId = payload.get(Constants.MEETING_ID).getAsString(); - String userId = payload.get(Constants.USER_ID).getAsString(); - String role = payload.get(Constants.ROLE).getAsString(); - - return new ChangeUserRoleMessage(meetingId, userId, role); - } - } - } - } - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/Constants.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/Constants.java index e1c733f459730217f53f0ba47d146976954704b7..4cffed7629668ace1d5c1107e5b0294352bfb1c9 100755 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/Constants.java +++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/Constants.java @@ -140,4 +140,22 @@ public class Constants { public static final String GUEST_POLICY = "guest_policy"; public static final String SET_BY = "set_by"; public static final String METADATA = "metadata"; + public static final String LOCAL_IP_ADDRESS = "local_ip_address"; + public static final String LOCAL_VIDEO_PORT = "local_video_port"; + public static final String REMOTE_VIDEO_PORT = "remote_video_port"; + public static final String DESTINATION_IP_ADDRESS = "destination_ip_address"; + public static final String SIP_HOST = "sip_host"; + public static final String TRANSCODER_TYPE = "transcoder_type"; + public static final String INPUT = "input"; + public static final String OUTPUT = "output"; + public static final String TRANSCODE_RTP_TO_RTMP = "transcode_rtp_to_rtmp"; + public static final String TRANSCODE_RTMP_TO_RTP = "transcode_rtmp_to_rtp"; + public static final String TRANSCODE_FILE_TO_RTP = "transcode_file_to_rtp"; + public static final String TRANSCODE_FILE_TO_RTMP = "transcode_file_to_rtmp"; + public static final String TRANSCODE_H264_TO_H263 = "transcode_h264_to_h263"; + public static final String TRANSCODE_ROTATE_RIGHT = "transcode_rotate_right"; + public static final String TRANSCODE_ROTATE_LEFT = "transcode_rotate_left"; + public static final String TRANSCODE_ROTATE_UPSIDE_DOWN = "transcode_rotate_upside_down"; + public static final String MODULE = "module"; + public static final String PROBE_RTMP = "probe_rtmp"; } diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/CreatePollRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/CreatePollRequestMessage.java deleted file mode 100755 index 0d4439abbf2fe83768d41cc1248bf92670025603..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/CreatePollRequestMessage.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class CreatePollRequestMessage implements ISubscribedMessage { - public static final String CREATE_POLL_REQUEST = "create_poll_request_message"; - public static final String VERSION = "0.0.1"; - - public static final String MEETING_ID = "meeting_id"; - public static final String REQUESTER_ID = "requester_id"; - public static final String POLL_ID = "poll_id"; - public static final String POLL_TYPE = "poll_type"; - - public final String meetingId; - public final String requesterId; - public final String pollId; - public final String pollType; - - public CreatePollRequestMessage(String meetingId, String requesterId, String pollId, String pollType) { - this.meetingId = meetingId; - this.requesterId = requesterId; - this.pollId = pollId; - this.pollType = pollType; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(MEETING_ID, meetingId); - payload.put(REQUESTER_ID, requesterId); - payload.put(POLL_ID, pollId); - payload.put(POLL_TYPE, pollType); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(CREATE_POLL_REQUEST, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static CreatePollRequestMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (CREATE_POLL_REQUEST.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(REQUESTER_ID) - && payload.has(POLL_ID) - && payload.has(POLL_TYPE)) { - String id = payload.get(Constants.MEETING_ID).getAsString(); - String requesterId = payload.get(REQUESTER_ID).getAsString(); - String pollId = payload.get(POLL_ID).getAsString(); - String pollType = payload.get(POLL_TYPE).getAsString(); - - return new CreatePollRequestMessage(id, requesterId, pollId, pollType); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/CursorPositionUpdatedMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/CursorPositionUpdatedMessage.java deleted file mode 100755 index 83481c4a43790ca769870e6892021987b9a0496a..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/CursorPositionUpdatedMessage.java +++ /dev/null @@ -1,67 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class CursorPositionUpdatedMessage implements ISubscribedMessage { - public static final String CURSOR_POSITION_UPDATED = "cursor_position_updated_message"; - public final String VERSION = "0.0.1"; - - public final String meetingId; - public final String requesterId; - public final double xPercent; - public final double yPercent; - - public CursorPositionUpdatedMessage(String meetingId, String requesterId, double xPercent, double yPercent) { - this.meetingId = meetingId; - this.requesterId = requesterId; - this.xPercent = xPercent; - this.yPercent = yPercent; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.REQUESTER_ID, requesterId); - payload.put(Constants.X_PERCENT, xPercent); - payload.put(Constants.Y_PERCENT, yPercent); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(CURSOR_POSITION_UPDATED, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static CursorPositionUpdatedMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (CURSOR_POSITION_UPDATED.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.REQUESTER_ID) - && payload.has(Constants.X_PERCENT) - && payload.has(Constants.Y_PERCENT)) { - String meetingId = payload.get(Constants.MEETING_ID).getAsString(); - String requesterId = payload.get(Constants.REQUESTER_ID).getAsString(); - double xPercent = payload.get(Constants.X_PERCENT).getAsDouble(); - double yPercent = payload.get(Constants.Y_PERCENT).getAsDouble(); - - return new CursorPositionUpdatedMessage(meetingId, requesterId, xPercent, yPercent); - } - } - } - } - return null; - } -} - - - - - diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/DisconnectUserMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/DisconnectUserMessage.java deleted file mode 100755 index b0078b275e97ad5401d4d1dc596c4489da1538f4..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/DisconnectUserMessage.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class DisconnectUserMessage implements IBigBlueButtonMessage { - public static final String DISCONNECT_USER = "disconnect_user_message"; - public final String VERSION = "0.0.1"; - - public final String meetingId; - public final String userId; - - public DisconnectUserMessage(String meetingID, String userId) { - this.meetingId = meetingID; - this.userId = userId; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(DISCONNECT_USER, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - public static DisconnectUserMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (DISCONNECT_USER.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.USER_ID)) { - String meetingId = payload.get(Constants.MEETING_ID).getAsString(); - String userId = payload.get(Constants.USER_ID).getAsString(); - - return new DisconnectUserMessage(meetingId, userId); - } - } - } - } - - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/EjectAllUsersFromVoiceConfRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/EjectAllUsersFromVoiceConfRequestMessage.java deleted file mode 100755 index 28ba956a06adb03d22ee14c13df5cc087628d9c2..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/EjectAllUsersFromVoiceConfRequestMessage.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class EjectAllUsersFromVoiceConfRequestMessage { - public static final String EJECT_ALL_VOICE_USERS_REQUEST = "eject_all_users_from_voice_conf_request_message"; - public static final String VERSION = "0.0.1"; - - public static final String MEETING_ID = "meeting_id"; - public static final String VOICE_CONF_ID = "voice_conf_id"; - - public final String meetingId; - public final String voiceConfId; - - public EjectAllUsersFromVoiceConfRequestMessage(String meetingId, String voiceConfId) { - this.meetingId = meetingId; - this.voiceConfId = voiceConfId; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(MEETING_ID, meetingId); - payload.put(VOICE_CONF_ID, voiceConfId); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(EJECT_ALL_VOICE_USERS_REQUEST, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static EjectAllUsersFromVoiceConfRequestMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (EJECT_ALL_VOICE_USERS_REQUEST.equals(messageName)) { - if (payload.has(MEETING_ID) - && payload.has(VOICE_CONF_ID)) { - String id = payload.get(MEETING_ID).getAsString(); - String voiceConfId = payload.get(VOICE_CONF_ID).getAsString(); - return new EjectAllUsersFromVoiceConfRequestMessage(id, voiceConfId); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/EjectUserFromMeetingRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/EjectUserFromMeetingRequestMessage.java deleted file mode 100755 index 43c998f9c85c82b16ded5d34945761cfc64c76d6..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/EjectUserFromMeetingRequestMessage.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class EjectUserFromMeetingRequestMessage implements ISubscribedMessage { - public static final String EJECT_USER_FROM_MEETING_REQUEST = "eject_user_from_meeting_request_message"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final String userId; - public final String ejectedBy; - - private static final String EJECTED_BY = "ejected_by"; - - public EjectUserFromMeetingRequestMessage(String meetingId, String userId, String ejectedBy) { - this.meetingId = meetingId; - this.userId = userId; - this.ejectedBy = ejectedBy; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.USER_ID, userId); - payload.put(EJECTED_BY, ejectedBy); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(EJECT_USER_FROM_MEETING_REQUEST, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static EjectUserFromMeetingRequestMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (EJECT_USER_FROM_MEETING_REQUEST.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.USER_ID) - && payload.has(EJECTED_BY)) { - String id = payload.get(Constants.MEETING_ID).getAsString(); - String userid = payload.get(Constants.USER_ID).getAsString(); - String ejectedBy = payload.get(EJECTED_BY).getAsString(); - return new EjectUserFromMeetingRequestMessage(id, userid, ejectedBy); - } - } - } - } - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/EjectUserFromVoiceConfRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/EjectUserFromVoiceConfRequestMessage.java deleted file mode 100755 index d9fd40168711605a75d9546ca8df5429b05f90d0..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/EjectUserFromVoiceConfRequestMessage.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class EjectUserFromVoiceConfRequestMessage { - public static final String EJECT_VOICE_USER_REQUEST = "eject_user_from_voice_conf_request_message"; - public static final String VERSION = "0.0.1"; - - public static final String MEETING_ID = "meeting_id"; - public static final String VOICE_CONF_ID = "voice_conf_id"; - public static final String VOICE_USER_ID = "voice_user_id"; - - public final String meetingId; - public final String voiceConfId; - public final String voiceUserId; - - public EjectUserFromVoiceConfRequestMessage(String meetingId, String voiceConfId, String voiceUserId) { - this.meetingId = meetingId; - this.voiceConfId = voiceConfId; - this.voiceUserId = voiceUserId; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(MEETING_ID, meetingId); - payload.put(VOICE_CONF_ID, voiceConfId); - payload.put(VOICE_USER_ID, voiceUserId); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(EJECT_VOICE_USER_REQUEST, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static EjectUserFromVoiceConfRequestMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (EJECT_VOICE_USER_REQUEST.equals(messageName)) { - if (payload.has(MEETING_ID) - && payload.has(VOICE_CONF_ID) - && payload.has(VOICE_USER_ID)) { - String id = payload.get(MEETING_ID).getAsString(); - String voiceConfId = payload.get(VOICE_CONF_ID).getAsString(); - String voiceUserId = payload.get(VOICE_USER_ID).getAsString(); - return new EjectUserFromVoiceConfRequestMessage(id, voiceConfId, voiceUserId); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/EjectUserFromVoiceRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/EjectUserFromVoiceRequestMessage.java deleted file mode 100755 index e3715ad2cde8df773c1924f8a4ce4a77b078a4bd..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/EjectUserFromVoiceRequestMessage.java +++ /dev/null @@ -1,63 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class EjectUserFromVoiceRequestMessage implements ISubscribedMessage { - public static final String EJECT_USER_FROM_VOICE_REQUEST = "eject_user_from_voice_request_message"; - public static final String VERSION = "0.0.1"; - - public static final String MEETING_ID = "meeting_id"; - public static final String REQUESTER_ID = "requester_id"; - public static final String USER_ID = "user_id"; - - public final String meetingId; - public final String requesterId; - public final String userId; - - public EjectUserFromVoiceRequestMessage(String meetingId, String requesterId, String userId) { - this.meetingId = meetingId; - this.requesterId = requesterId; - this.userId = userId; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(MEETING_ID, meetingId); - payload.put(REQUESTER_ID, requesterId); - payload.put(USER_ID, userId); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(EJECT_USER_FROM_VOICE_REQUEST, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static EjectUserFromVoiceRequestMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (EJECT_USER_FROM_VOICE_REQUEST.equals(messageName)) { - if (payload.has(MEETING_ID) - && payload.has(REQUESTER_ID) - && payload.has(USER_ID)) { - String id = payload.get(MEETING_ID).getAsString(); - String requesterId = payload.get(REQUESTER_ID).getAsString(); - String userId = payload.get(USER_ID).getAsString(); - return new EjectUserFromVoiceRequestMessage(id, requesterId, userId); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetCurrentLayoutReplyMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetCurrentLayoutReplyMessage.java deleted file mode 100755 index d14fe7cc197d8cb7463716affe0a8fb9c20171a2..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetCurrentLayoutReplyMessage.java +++ /dev/null @@ -1,74 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class GetCurrentLayoutReplyMessage implements ISubscribedMessage { - public static final String GET_CURRENT_LAYOUT_REPLY = "get_current_layout_reply_message"; - public static final String VERSION = "0.0.1"; - - public static final String SET_BY_USERID = "set_by_userid"; - public static final String REQUESTED_BY_USERID = "requested_by_userid"; - public static final String LAYOUT = "layout"; - public static final String LOCKED = "locked"; - - public final String meetingId; - public final String requestedByUserid; - public final String setByUserid; - public final String layout; - public final Boolean locked; - - public GetCurrentLayoutReplyMessage(String meetingId, String requestedByUserid, String setByUserid, String layout, Boolean locked) { - this.meetingId = meetingId; - this.requestedByUserid = requestedByUserid; - this.setByUserid = setByUserid; - this.layout = layout; - this.locked = locked; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(REQUESTED_BY_USERID, requestedByUserid); - payload.put(SET_BY_USERID, setByUserid); - payload.put(LAYOUT, layout); - payload.put(LOCKED, locked); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(GET_CURRENT_LAYOUT_REPLY, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static GetCurrentLayoutReplyMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (GET_CURRENT_LAYOUT_REPLY.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(REQUESTED_BY_USERID) - && payload.has(SET_BY_USERID) - && payload.has(LOCKED) - && payload.has(LAYOUT)) { - String id = payload.get(Constants.MEETING_ID).getAsString(); - String requestedByUserid = payload.get(REQUESTED_BY_USERID).getAsString(); - String setByUserid = payload.get(SET_BY_USERID).getAsString(); - String layout = payload.get(LAYOUT).getAsString(); - Boolean locked = payload.get(LOCKED).getAsBoolean(); - return new GetCurrentLayoutReplyMessage(id, requestedByUserid, setByUserid, layout, locked); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetCurrentLayoutRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetCurrentLayoutRequestMessage.java deleted file mode 100755 index c63028ea21884cc2f82de27f92885559798cea00..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetCurrentLayoutRequestMessage.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class GetCurrentLayoutRequestMessage implements ISubscribedMessage { - public static final String GET_CURRENT_LAYOUT_REQUEST = "get_current_layout_request_message"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final String userId; - - - public GetCurrentLayoutRequestMessage(String meetingId, String userId) { - this.meetingId = meetingId; - this.userId = userId; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.USER_ID, userId); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(GET_CURRENT_LAYOUT_REQUEST, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static GetCurrentLayoutRequestMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (GET_CURRENT_LAYOUT_REQUEST.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.USER_ID)) { - String id = payload.get(Constants.MEETING_ID).getAsString(); - String userid = payload.get(Constants.USER_ID).getAsString(); - return new GetCurrentLayoutRequestMessage(id, userid); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetGuestPolicyMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetGuestPolicyMessage.java deleted file mode 100644 index 8a8ebade5c5d7130bf9f7de79fe2b777cf46cedf..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetGuestPolicyMessage.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class GetGuestPolicyMessage implements IBigBlueButtonMessage { - public static final String GET_GUEST_POLICY = "get_guest_policy"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final String requesterId; - - public GetGuestPolicyMessage(String meetingId, String requesterId) { - this.meetingId = meetingId; - this.requesterId = requesterId; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.REQUESTER_ID, requesterId); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(GET_GUEST_POLICY, VERSION, null); - return MessageBuilder.buildJson(header, payload); - } - - public static GetGuestPolicyMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (GET_GUEST_POLICY.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.REQUESTER_ID)) { - String meetingId = payload.get(Constants.MEETING_ID).getAsString(); - String requesterId = payload.get(Constants.REQUESTER_ID).getAsString(); - - return new GetGuestPolicyMessage(meetingId, requesterId); - } - } - } - } - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetGuestPolicyReplyMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetGuestPolicyReplyMessage.java deleted file mode 100644 index 990a4584a78b172b80485547b3a96b09d1ec0b14..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetGuestPolicyReplyMessage.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class GetGuestPolicyReplyMessage implements IBigBlueButtonMessage { - public static final String GET_GUEST_POLICY_REPLY = "get_guest_policy_reply"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final String requesterId; - public final String guestPolicy; - - public GetGuestPolicyReplyMessage(String meetingId, String requesterId, String guestPolicy) { - this.meetingId = meetingId; - this.requesterId = requesterId; - this.guestPolicy = guestPolicy; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.REQUESTER_ID, requesterId); - payload.put(Constants.GUEST_POLICY, guestPolicy); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(GET_GUEST_POLICY_REPLY, VERSION, null); - return MessageBuilder.buildJson(header, payload); - } - - public static GetGuestPolicyReplyMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (GET_GUEST_POLICY_REPLY.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.REQUESTER_ID) - && payload.has(Constants.GUEST_POLICY)) { - String meetingId = payload.get(Constants.MEETING_ID).getAsString(); - String requesterId = payload.get(Constants.REQUESTER_ID).getAsString(); - String guestPolicy = payload.get(Constants.GUEST_POLICY).getAsString(); - - return new GetGuestPolicyReplyMessage(meetingId, requesterId, guestPolicy); - } - } - } - } - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetLockSettingsMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetLockSettingsMessage.java deleted file mode 100755 index 0f4c711012f8a2873eaa609b5446aa1fc9f65932..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetLockSettingsMessage.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class GetLockSettingsMessage implements IBigBlueButtonMessage { - public static final String GET_LOCK_SETTINGS = "get_lock_settings"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final String userId; - - public GetLockSettingsMessage(String meetingId, String userId) { - this.meetingId = meetingId; - this.userId = userId; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.USER_ID, userId); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(GET_LOCK_SETTINGS, VERSION, null); - return MessageBuilder.buildJson(header, payload); - } - - public static GetLockSettingsMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (GET_LOCK_SETTINGS.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.USER_ID)) { - String meetingId = payload.get(Constants.MEETING_ID).getAsString(); - String userId = payload.get(Constants.USER_ID).getAsString(); - - return new GetLockSettingsMessage(meetingId, userId); - } - } - } - } - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetPresentationInfoMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetPresentationInfoMessage.java deleted file mode 100755 index 473c2bef54184caef48225f1e6e5897a33b38f9b..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetPresentationInfoMessage.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class GetPresentationInfoMessage implements IBigBlueButtonMessage { - public static final String GET_PRESENTATION_INFO = "get_presentation_info"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final String requesterId; - public final String replyTo; - - public GetPresentationInfoMessage(String meetingId, String requesterId, String replyTo) { - this.meetingId = meetingId; - this.requesterId = requesterId; - this.replyTo = replyTo; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.REQUESTER_ID, requesterId); - payload.put(Constants.REPLY_TO, replyTo); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(GET_PRESENTATION_INFO, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static GetPresentationInfoMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (GET_PRESENTATION_INFO.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.REQUESTER_ID) - && payload.has(Constants.REPLY_TO)) { - String meetingId = payload.get(Constants.MEETING_ID).getAsString(); - String requesterId = payload.get(Constants.REQUESTER_ID).getAsString(); - String replyTo = payload.get(Constants.REPLY_TO).getAsString(); - - return new GetPresentationInfoMessage(meetingId, requesterId, replyTo); - } - } - } - } - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetPresentationInfoReplyMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetPresentationInfoReplyMessage.java deleted file mode 100755 index 7fba5d66520ec6bbe6206ae25b0b8fa63c25eb61..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetPresentationInfoReplyMessage.java +++ /dev/null @@ -1,72 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; - -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class GetPresentationInfoReplyMessage implements IBigBlueButtonMessage { - public static final String GET_PRESENTATION_INFO_REPLY = "get_presentation_info_reply"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final String requesterId; - public final Map<String, Object> presenter; - public final ArrayList<Map<String, Object>> presentations; - - public GetPresentationInfoReplyMessage(String meetingId, String requesterId, - Map<String, Object> presenter, ArrayList<Map<String, Object>> presentations) { - this.meetingId = meetingId; - this.requesterId = requesterId; - this.presenter = presenter; - this.presentations = presentations; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.REQUESTER_ID, requesterId); - payload.put(Constants.PRESENTER, presenter); - payload.put(Constants.PRESENTATIONS, presentations); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(GET_PRESENTATION_INFO_REPLY, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static GetPresentationInfoReplyMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (GET_PRESENTATION_INFO_REPLY.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.REQUESTER_ID) - && payload.has(Constants.PRESENTER) - && payload.has(Constants.PRESENTATIONS)) { - String meetingId = payload.get(Constants.MEETING_ID).getAsString(); - String requesterId = payload.get(Constants.REQUESTER_ID).getAsString(); - JsonObject presenterJsonObject = payload.get(Constants.PRESENTER).getAsJsonObject(); - - Util util = new Util(); - Map<String, Object> presenter = util.extractCurrentPresenter(presenterJsonObject); - - JsonArray presentationsJsonArray = payload.get(Constants.PRESENTATIONS).getAsJsonArray(); - ArrayList<Map<String, Object>> presentations = util.extractPresentations(presentationsJsonArray); - - return new GetPresentationInfoReplyMessage(meetingId, requesterId, presenter, presentations); - } - } - } - } - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetSlideInfoMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetSlideInfoMessage.java deleted file mode 100755 index 69170a8a9b3c3a2bcd7034da85bf8f8e6ef6ac2a..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetSlideInfoMessage.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class GetSlideInfoMessage implements IBigBlueButtonMessage { - public static final String GET_SLIDE_INFO = "get_slide_info"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final String requesterId; - public final String replyTo; - - public GetSlideInfoMessage(String meetingId, String requesterId, String replyTo){ - this.meetingId = meetingId; - this.requesterId = requesterId; - this.replyTo = replyTo; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.REQUESTER_ID, requesterId); - payload.put(Constants.REPLY_TO, replyTo); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(GET_SLIDE_INFO, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static GetSlideInfoMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (GET_SLIDE_INFO.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.REQUESTER_ID) - && payload.has(Constants.REPLY_TO)) { - String meetingId = payload.get(Constants.MEETING_ID).getAsString(); - String requesterId = payload.get(Constants.REQUESTER_ID).getAsString(); - String replyTo = payload.get(Constants.REPLY_TO).getAsString(); - - return new GetSlideInfoMessage(meetingId, requesterId, replyTo); - } - } - } - } - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetSlideInfoReplyMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetSlideInfoReplyMessage.java deleted file mode 100755 index addf8644f815708a8bd38850f462c52dab5cd656..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetSlideInfoReplyMessage.java +++ /dev/null @@ -1,76 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class GetSlideInfoReplyMessage implements ISubscribedMessage { - public static final String GET_SLIDE_INFO = "get_slide_info_message"; - public final String VERSION = "0.0.1"; - - public final String meetingId; - public final String requesterId; - public final int xOffset; - public final int yOffset; - public final int widthRatio; - public final int heightRatio; - - - public GetSlideInfoReplyMessage(String meetingId, String requesterId, - int xOffset, int yOffset, int widthRatio, int heightRatio) { - this.meetingId = meetingId; - this.requesterId = requesterId; - this.xOffset = xOffset; - this.yOffset = yOffset; - this.widthRatio = widthRatio; - this.heightRatio = heightRatio; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.REQUESTER_ID, requesterId); - payload.put(Constants.X_OFFSET, xOffset); - payload.put(Constants.Y_OFFSET, yOffset); - payload.put(Constants.WIDTH_RATIO, widthRatio); - payload.put(Constants.HEIGHT_RATIO, heightRatio); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(GET_SLIDE_INFO, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static GetSlideInfoReplyMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (GET_SLIDE_INFO.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.REQUESTER_ID) - && payload.has(Constants.X_OFFSET) - && payload.has(Constants.Y_OFFSET) - && payload.has(Constants.WIDTH_RATIO) - && payload.has(Constants.HEIGHT_RATIO)) { - String meetingId = payload.get(Constants.MEETING_ID).getAsString(); - String requesterId = payload.get(Constants.REQUESTER_ID).getAsString(); - int xOffset = payload.get(Constants.X_OFFSET).getAsInt(); - int yOffset = payload.get(Constants.Y_OFFSET).getAsInt(); - int widthRatio = payload.get(Constants.WIDTH_RATIO).getAsInt(); - int heightRatio = payload.get(Constants.HEIGHT_RATIO).getAsInt(); - - return new GetSlideInfoReplyMessage(meetingId, requesterId, - xOffset, yOffset, widthRatio, heightRatio); - } - } - } - } - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetUsersFromVoiceConfRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetUsersFromVoiceConfRequestMessage.java deleted file mode 100755 index 8e295656c04fdcae0d216489d4a4da22934ff04e..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetUsersFromVoiceConfRequestMessage.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class GetUsersFromVoiceConfRequestMessage { - public static final String GET_VOICE_USERS_REQUEST = "get_users_from_voice_conf_request_message"; - public static final String VERSION = "0.0.1"; - - public static final String MEETING_ID = "meeting_id"; - public static final String VOICE_CONF_ID = "voice_conf_id"; - - public final String meetingId; - public final String voiceConfId; - - public GetUsersFromVoiceConfRequestMessage(String meetingId, String voiceConfId) { - this.meetingId = meetingId; - this.voiceConfId = voiceConfId; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(MEETING_ID, meetingId); - payload.put(VOICE_CONF_ID, voiceConfId); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(GET_VOICE_USERS_REQUEST, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static GetUsersFromVoiceConfRequestMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (GET_VOICE_USERS_REQUEST.equals(messageName)) { - if (payload.has(MEETING_ID) - && payload.has(VOICE_CONF_ID)) { - String id = payload.get(MEETING_ID).getAsString(); - String voiceConfId = payload.get(VOICE_CONF_ID).getAsString(); - return new GetUsersFromVoiceConfRequestMessage(id, voiceConfId); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetUsersReplyMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetUsersReplyMessage.java deleted file mode 100755 index d10914b126f62523303da3b4bf58040c368e139a..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetUsersReplyMessage.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; - -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class GetUsersReplyMessage implements ISubscribedMessage { - public static final String GET_USERS_REPLY = "get_users_reply"; - public final String VERSION = "0.0.1"; - - public final String meetingId; - public final String requesterId; - public final ArrayList<Map<String, Object>> users; - - public GetUsersReplyMessage(String meetingID, String requesterId, ArrayList<Map<String, Object>> users) { - this.meetingId = meetingID; - this.requesterId = requesterId; - this.users = users; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(GET_USERS_REPLY, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static GetUsersReplyMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (GET_USERS_REPLY.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.REQUESTER_ID) - && payload.has(Constants.USERS)) { - String meetingID = payload.get(Constants.MEETING_ID).getAsString(); - String requesterId = payload.get(Constants.REQUESTER_ID).getAsString(); - - JsonArray users = (JsonArray) payload.get(Constants.USERS); - - Util util = new Util(); - ArrayList<Map<String, Object>> usersList = util.extractUsers(users); - - if (usersList != null) { - return new GetUsersReplyMessage(meetingID, requesterId, usersList); - } - } - } - } - } - - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetUsersRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetUsersRequestMessage.java deleted file mode 100755 index eb9b2afc4e248bc2754aab388b4d04709b56a7da..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetUsersRequestMessage.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class GetUsersRequestMessage implements IBigBlueButtonMessage { - public static final String GET_USERS_REQUEST = "get_users_request_message"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final String requesterId; - - - public GetUsersRequestMessage(String meetingId, String requesterId) { - this.meetingId = meetingId; - this.requesterId = requesterId; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.REQUESTER_ID, requesterId); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(GET_USERS_REQUEST, VERSION, null); - return MessageBuilder.buildJson(header, payload); - } - - public static GetUsersRequestMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (GET_USERS_REQUEST.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.REQUESTER_ID)) { - String meetingId = payload.get(Constants.MEETING_ID).getAsString(); - String requesterId = payload.get(Constants.REQUESTER_ID).getAsString(); - - return new GetUsersRequestMessage(meetingId, requesterId); - } - } - } - } - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GoToSlideReplyMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GoToSlideReplyMessage.java deleted file mode 100755 index 8a92ff43cc23d993c3a122a79734c10eaee92023..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GoToSlideReplyMessage.java +++ /dev/null @@ -1,92 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import java.util.Map; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class GoToSlideReplyMessage { - public static final String GO_TO_SLIDE_REPLY = "presentation_page_changed_message"; - public final String VERSION = "0.0.1"; - - public final String meetingId; - public final Map<String,Object> page; - - public GoToSlideReplyMessage(String meetingId, Map<String, Object> page) { - this.meetingId = meetingId; - this.page = page; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.PAGE, page); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(GO_TO_SLIDE_REPLY, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static GoToSlideReplyMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (GO_TO_SLIDE_REPLY.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.PAGE)) { - String meetingId = payload.get(Constants.MEETING_ID).getAsString(); - - JsonObject pageObj = (JsonObject) payload.get(Constants.PAGE).getAsJsonObject(); - Map<String, Object> page = new HashMap<String, Object>(); - - if(pageObj.has(Constants.WIDTH_RATIO) - && pageObj.has(Constants.HEIGHT_RATIO) - && pageObj.has("svg_uri") - && pageObj.has("txt_uri") - && pageObj.has("num") - && pageObj.has(Constants.Y_OFFSET) - && pageObj.has("swf_uri") - && pageObj.has("thumb_uri") - && pageObj.has(Constants.X_OFFSET) - && pageObj.has(Constants.CURRENT) - && pageObj.has(Constants.ID) - ) { - int wRatio = pageObj.get(Constants.WIDTH_RATIO).getAsInt(); - int hRatio = pageObj.get(Constants.HEIGHT_RATIO).getAsInt(); - String svgUri = pageObj.get("svg_uri").getAsString(); - String txtUri = pageObj.get("txt_uri").getAsString(); - int num = pageObj.get("num").getAsInt(); - int xOffset = pageObj.get(Constants.X_OFFSET).getAsInt(); - int yOffset = pageObj.get(Constants.Y_OFFSET).getAsInt(); - String swfUri = pageObj.get("swf_uri").getAsString(); - String thumbUri = pageObj.get("thumb_uri").getAsString(); - boolean current = pageObj.get(Constants.CURRENT).getAsBoolean(); - String id = pageObj.get(Constants.ID).getAsString(); - - page.put(Constants.WIDTH_RATIO, wRatio); - page.put(Constants.HEIGHT_RATIO, hRatio); - page.put("svg_uri", svgUri); - page.put("txt_uri", txtUri); - page.put("num", num); - page.put(Constants.X_OFFSET, xOffset); - page.put(Constants.Y_OFFSET, yOffset); - page.put("thumb_uri", thumbUri); - page.put("swf_uri", swfUri); - page.put(Constants.CURRENT, current); - page.put(Constants.ID, id); - - } - return new GoToSlideReplyMessage(meetingId, page); - } - } - } - } - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GuestAccessDeniedMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GuestAccessDeniedMessage.java deleted file mode 100644 index 6fa50085b4462ba48df90e43b5632b176f78ccc5..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GuestAccessDeniedMessage.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class GuestAccessDeniedMessage implements IBigBlueButtonMessage { - public static final String GUEST_ACCESS_DENIED = "guest_access_denied"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final String userId; - - public GuestAccessDeniedMessage(String meetingId, String userId) { - this.meetingId = meetingId; - this.userId = userId; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.USER_ID, userId); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(GUEST_ACCESS_DENIED, VERSION, null); - return MessageBuilder.buildJson(header, payload); - } - - public static GuestAccessDeniedMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (GUEST_ACCESS_DENIED.equals(messageName)) { - - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.USER_ID)) { - String meetingId = payload.get(Constants.MEETING_ID).getAsString(); - String userId = payload.get(Constants.USER_ID).getAsString(); - - return new GuestAccessDeniedMessage(meetingId, userId); - } - } - } - } - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GuestPolicyChangedMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GuestPolicyChangedMessage.java deleted file mode 100644 index d6de259452dfdccab223bc9a1cb21090aa8961db..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GuestPolicyChangedMessage.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class GuestPolicyChangedMessage implements IBigBlueButtonMessage { - public static final String GUEST_POLICY_CHANGED = "guest_policy_changed"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final String guestPolicy; - - public GuestPolicyChangedMessage(String meetingId, String guestPolicy) { - this.meetingId = meetingId; - this.guestPolicy = guestPolicy; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.GUEST_POLICY, guestPolicy); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(GUEST_POLICY_CHANGED, VERSION, null); - return MessageBuilder.buildJson(header, payload); - } - - public static GuestPolicyChangedMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (GUEST_POLICY_CHANGED.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.GUEST_POLICY)) { - String meetingId = payload.get(Constants.MEETING_ID).getAsString(); - String guestPolicy = payload.get(Constants.GUEST_POLICY).getAsString(); - - return new GuestPolicyChangedMessage(meetingId, guestPolicy); - } - } - } - } - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/InitAudioSettingsMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/InitAudioSettingsMessage.java deleted file mode 100755 index 0adf152235004980a2ca0e1aa1485847e5934d1e..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/InitAudioSettingsMessage.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class InitAudioSettingsMessage implements ISubscribedMessage { - public static final String INIT_AUDIO_SETTING = "init_audio_settings_message"; - public final String VERSION = "0.0.1"; - - public final String meetingId; - public final String userId; - public final Boolean muted; - - public InitAudioSettingsMessage(String meetingID, String userId, Boolean muted) { - this.meetingId = meetingID; - this.userId = userId; - this.muted = muted; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.USER_ID, userId); - payload.put(Constants.MUTED, muted); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(INIT_AUDIO_SETTING, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - public static InitAudioSettingsMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (INIT_AUDIO_SETTING.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.USER_ID) - && payload.has(Constants.MUTED)) { - String meetingID = payload.get(Constants.MEETING_ID).getAsString(); - String userId = payload.get(Constants.USER_ID).getAsString(); - Boolean muted = payload.get(Constants.MUTED).getAsBoolean(); - - return new InitAudioSettingsMessage(meetingID, userId, muted); - } - } - } - } - - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/InitPermissionsSettingMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/InitPermissionsSettingMessage.java deleted file mode 100755 index 1a770e32559c823df9448193d3e1ba72be973e66..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/InitPermissionsSettingMessage.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import java.util.Map; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class InitPermissionsSettingMessage implements ISubscribedMessage { - public static final String INIT_PERMISSIONS_SETTING = "init_permission_settings_message"; - public final String VERSION = "0.0.1"; - - public final String meetingId; - public final Map<String, Boolean> permissions; - - public InitPermissionsSettingMessage(String meetingID, Map<String, Boolean> permissions) { - this.meetingId = meetingID; - this.permissions = permissions; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.PERMISSIONS, permissions); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(INIT_PERMISSIONS_SETTING, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - public static InitPermissionsSettingMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (INIT_PERMISSIONS_SETTING.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.PERMISSIONS)) { - - String meetingID = payload.get(Constants.MEETING_ID).getAsString(); - - JsonObject permissions = (JsonObject) payload.get(Constants.PERMISSIONS); - - Util util = new Util(); - Map<String, Boolean> permissionsMap = util.extractPermission(permissions); - - if (permissionsMap != null) { - return new InitPermissionsSettingMessage(meetingID, permissionsMap); - } - } - } - } - } - - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/IsMeetingMutedReplyMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/IsMeetingMutedReplyMessage.java deleted file mode 100755 index 51188c6dc5513e0da8d8e03d436555a12c1ee6c0..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/IsMeetingMutedReplyMessage.java +++ /dev/null @@ -1,63 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class IsMeetingMutedReplyMessage implements ISubscribedMessage { - public static final String IS_MEETING_MUTED_REPLY = "is_meeting_muted_reply_message"; - public static final String VERSION = "0.0.1"; - - public static final String MEETING_ID = "meeting_id"; - public static final String REQUESTER_ID = "requester_id"; - public static final String MUTED = "muted"; - - public final String meetingId; - public final String requesterId; - public final Boolean muted; - - public IsMeetingMutedReplyMessage(String meetingId, String requesterId, Boolean muted) { - this.meetingId = meetingId; - this.requesterId = requesterId; - this.muted = muted; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(MEETING_ID, meetingId); - payload.put(REQUESTER_ID, requesterId); - payload.put(MUTED, muted); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(IS_MEETING_MUTED_REPLY, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static IsMeetingMutedReplyMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (IS_MEETING_MUTED_REPLY.equals(messageName)) { - if (payload.has(MEETING_ID) - && payload.has(REQUESTER_ID) - && payload.has(MUTED)) { - String id = payload.get(MEETING_ID).getAsString(); - String requesterId = payload.get(REQUESTER_ID).getAsString(); - Boolean muted = payload.get(MUTED).getAsBoolean(); - return new IsMeetingMutedReplyMessage(id, requesterId, muted); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/IsMeetingMutedRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/IsMeetingMutedRequestMessage.java deleted file mode 100755 index dcb391b8040914c923bc808f450733b877150fb3..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/IsMeetingMutedRequestMessage.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class IsMeetingMutedRequestMessage implements ISubscribedMessage { - public static final String IS_MEETING_MUTED_REQUEST = "is_meeting_muted_request_message"; - public static final String VERSION = "0.0.1"; - - public static final String MEETING_ID = "meeting_id"; - public static final String REQUESTER_ID = "requester_id"; - - public final String meetingId; - public final String requesterId; - - public IsMeetingMutedRequestMessage(String meetingId, String requesterId) { - this.meetingId = meetingId; - this.requesterId = requesterId; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(MEETING_ID, meetingId); - payload.put(REQUESTER_ID, requesterId); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(IS_MEETING_MUTED_REQUEST, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static IsMeetingMutedRequestMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (IS_MEETING_MUTED_REQUEST.equals(messageName)) { - if (payload.has(MEETING_ID) - && payload.has(REQUESTER_ID)) { - String id = payload.get(MEETING_ID).getAsString(); - String requesterId = payload.get(REQUESTER_ID).getAsString(); - return new IsMeetingMutedRequestMessage(id, requesterId); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/LockLayoutMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/LockLayoutMessage.java deleted file mode 100755 index 1ceb05bf93c37f1c2d2ef4b2289a6a2ae18ddd1a..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/LockLayoutMessage.java +++ /dev/null @@ -1,74 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.ArrayList; -import java.util.HashMap; - -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class LockLayoutMessage implements ISubscribedMessage { - public static final String LOCK_LAYOUT = "lock_layout_message"; - public static final String VERSION = "0.0.1"; - - public static final String SET_BY_USERID = "set_by_userid"; - public static final String LOCKED = "locked"; - public static final String USERS = "users"; - - public final String meetingId; - public final String setByUserid; - public final Boolean locked; - public final ArrayList<String> users; - - public LockLayoutMessage(String meetingId, String setByUserid, Boolean locked, ArrayList<String> users) { - this.meetingId = meetingId; - this.setByUserid = setByUserid; - this.locked = locked; - this.users = users; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(SET_BY_USERID, setByUserid); - payload.put(LOCKED, locked); - payload.put(USERS, users); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(LOCK_LAYOUT, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static LockLayoutMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (LOCK_LAYOUT.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(LOCKED) - && payload.has(SET_BY_USERID) - && payload.has(USERS)) { - String id = payload.get(Constants.MEETING_ID).getAsString(); - String setByUserid = payload.get(SET_BY_USERID).getAsString(); - Boolean locked = payload.get(LOCKED).getAsBoolean(); - JsonArray usersArr = (JsonArray) payload.get(USERS); - - Util util = new Util(); - - ArrayList<String> users = util.extractUserids(usersArr); - return new LockLayoutMessage(id, setByUserid, locked, users); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/LockLayoutRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/LockLayoutRequestMessage.java deleted file mode 100755 index ab2dff2fb2b8200a31afc7e4d57ed89e617ae989..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/LockLayoutRequestMessage.java +++ /dev/null @@ -1,75 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class LockLayoutRequestMessage implements ISubscribedMessage { - public static final String LOCK_LAYOUT_REQUEST = "lock_layout_request_message"; - public static final String VERSION = "0.0.1"; - - public final static String LAYOUT = "layout"; - public final static String LOCK = "lock"; - public final static String VIEWERS_ONLY = "viewers_only"; - - public final String meetingId; - public final String userId; - public final Boolean lock; - public final Boolean viewersOnly; - - - public final String layout; - - public LockLayoutRequestMessage(String meetingId, String userId, Boolean lock, Boolean viewersOnly, String layout) { - this.meetingId = meetingId; - this.userId = userId; - this.lock = lock; - this.viewersOnly = viewersOnly; - this.layout = layout; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.USER_ID, userId); - payload.put(LOCK, lock); - payload.put(VIEWERS_ONLY, viewersOnly); - payload.put(LAYOUT, layout); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(LOCK_LAYOUT_REQUEST, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static LockLayoutRequestMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (LOCK_LAYOUT_REQUEST.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.USER_ID) - && payload.has(LOCK) - && payload.has(VIEWERS_ONLY) - && payload.has(LAYOUT)) { - String id = payload.get(Constants.MEETING_ID).getAsString(); - String userid = payload.get(Constants.USER_ID).getAsString(); - Boolean lock = payload.get(LOCK).getAsBoolean(); - Boolean viewersOnly = payload.get(VIEWERS_ONLY).getAsBoolean(); - String layout = payload.get(LAYOUT).getAsString(); - return new LockLayoutRequestMessage(id, userid, lock, viewersOnly, layout); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/LockMuteUserRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/LockMuteUserRequestMessage.java deleted file mode 100755 index 7276ead27f29827d8cf5da7c1886b34ed2dc0727..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/LockMuteUserRequestMessage.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class LockMuteUserRequestMessage implements ISubscribedMessage { - public static final String LOCK_MUTE_USER_REQUEST = "lock_mute_user_request_message"; - public static final String VERSION = "0.0.1"; - - public static final String MEETING_ID = "meeting_id"; - public static final String REQUESTER_ID = "requester_id"; - public static final String USER_ID = "user_id"; - public static final String LOCK = "lock"; - - public final String meetingId; - public final String requesterId; - public final String userId; - public final Boolean lock; - - public LockMuteUserRequestMessage(String meetingId, String requesterId, String userId, Boolean lock) { - this.meetingId = meetingId; - this.requesterId = requesterId; - this.userId = userId; - this.lock = lock; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(MEETING_ID, meetingId); - payload.put(REQUESTER_ID, requesterId); - payload.put(USER_ID, userId); - payload.put(LOCK, lock); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(LOCK_MUTE_USER_REQUEST, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static LockMuteUserRequestMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (LOCK_MUTE_USER_REQUEST.equals(messageName)) { - if (payload.has(MEETING_ID) - && payload.has(REQUESTER_ID) - && payload.has(USER_ID) - && payload.has(LOCK)) { - String id = payload.get(MEETING_ID).getAsString(); - String requesterId = payload.get(REQUESTER_ID).getAsString(); - String userId = payload.get(USER_ID).getAsString(); - Boolean lock = payload.get(LOCK).getAsBoolean(); - return new LockMuteUserRequestMessage(id, requesterId, userId, lock); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/LockUserMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/LockUserMessage.java deleted file mode 100755 index 2c5fcffa1bbeb73a5e15a769edf686b48b8b5ba2..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/LockUserMessage.java +++ /dev/null @@ -1,63 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class LockUserMessage implements IBigBlueButtonMessage { - public static final String LOCK_USER = "lock_user"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final String requesterId; - public final boolean lock; - public final String internalUserId; - - - public LockUserMessage(String meetingId, String requesterId, boolean lock, String internalUserId) { - this.meetingId = meetingId; - this.requesterId = requesterId; - this.lock = lock; - this.internalUserId = internalUserId; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.REQUESTER_ID, requesterId); - payload.put(Constants.LOCK, lock); - payload.put(Constants.INTERNAL_USER_ID, internalUserId); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(LOCK_USER, VERSION, null); - return MessageBuilder.buildJson(header, payload); - } - - public static LockUserMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (LOCK_USER.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.REQUESTER_ID) - && payload.has(Constants.LOCK) - && payload.has(Constants.INTERNAL_USER_ID)) { - String meetingId = payload.get(Constants.MEETING_ID).getAsString(); - String requesterId = payload.get(Constants.REQUESTER_ID).getAsString(); - boolean lock = payload.get(Constants.LOCK).getAsBoolean(); - String internalUserId = payload.get(Constants.INTERNAL_USER_ID).getAsString(); - - return new LockUserMessage(meetingId, requesterId, lock, internalUserId); - } - } - } - } - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/LogoutEndMeetingRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/LogoutEndMeetingRequestMessage.java deleted file mode 100644 index 9da3d6b51e62fadf26ca48485f09ad7b04815200..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/LogoutEndMeetingRequestMessage.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class LogoutEndMeetingRequestMessage implements ISubscribedMessage { - public static final String LOGOUT_END_MEETING_REQUEST_MESSAGE = "logout_end_meeting_request_message"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final String userId; - - public LogoutEndMeetingRequestMessage(String meetingId, String userId) { - this.meetingId = meetingId; - this.userId = userId; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.USER_ID, userId); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(LOGOUT_END_MEETING_REQUEST_MESSAGE, VERSION, null); - return MessageBuilder.buildJson(header, payload); - } - - public static LogoutEndMeetingRequestMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (LOGOUT_END_MEETING_REQUEST_MESSAGE.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.USER_ID)) { - String id = payload.get(Constants.MEETING_ID).getAsString(); - String userid = payload.get(Constants.USER_ID).getAsString(); - - return new LogoutEndMeetingRequestMessage(id, userid); - } - } - } - } - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MeetingStateMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MeetingStateMessage.java index 80e7a273e683afa26cc5a72db8ae7fdd9b645509..d9d8c780d72bde246e24fd63407ae955e6fce8d5 100755 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MeetingStateMessage.java +++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MeetingStateMessage.java @@ -48,10 +48,8 @@ public class MeetingStateMessage implements ISubscribedMessage { String meetingID = payload.get(Constants.MEETING_ID).getAsString(); String userId = payload.get(Constants.USER_ID).getAsString(); Boolean muted = payload.get(Constants.MEETING_MUTED).getAsBoolean(); - JsonObject premissions = (JsonObject) payload.get(Constants.PERMISSIONS); - Util util = new Util(); - Map<String, Boolean> premissionsMap = util.extractPermission(premissions); + Map<String, Boolean> premissionsMap = new HashMap<String, Boolean>(); if (premissionsMap != null) { return new MeetingStateMessage(meetingID, userId, premissionsMap, muted); diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MessageFromJsonConverter.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MessageFromJsonConverter.java index 65588e612a0fa3f7d12f301a009cd77bda3917b7..5de9dca1a901a65fdac89069636f96fce7d1b2cc 100755 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MessageFromJsonConverter.java +++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MessageFromJsonConverter.java @@ -28,13 +28,6 @@ public class MessageFromJsonConverter { return processKeepAlive(payload); case ActivityResponseMessage.ACTIVITY_RESPONSE: return processActivityResponseMessage(payload); - case ValidateAuthTokenMessage.VALIDATE_AUTH_TOKEN: - return processValidateAuthTokenMessage(header, payload); - // return ValidateAuthTokenMessage.fromJson(message); - case UserConnectedToGlobalAudio.USER_CONNECTED_TO_GLOBAL_AUDIO: - return UserConnectedToGlobalAudio.fromJson(message); - case UserDisconnectedFromGlobalAudio.USER_DISCONNECTED_FROM_GLOBAL_AUDIO: - return UserDisconnectedFromGlobalAudio.fromJson(message); case GetAllMeetingsRequest.GET_ALL_MEETINGS_REQUEST_EVENT: return new GetAllMeetingsRequest("the_string_is_not_used_anywhere"); } @@ -42,16 +35,6 @@ public class MessageFromJsonConverter { } return null; } - - private static IBigBlueButtonMessage processValidateAuthTokenMessage(JsonObject header, JsonObject payload) { - String id = payload.get(Constants.MEETING_ID).getAsString(); - String userid = payload.get(Constants.USER_ID).getAsString(); - String authToken = payload.get(Constants.AUTH_TOKEN).getAsString(); - String replyTo = header.get(Constants.REPLY_TO).getAsString(); - String sessionId = "tobeimplemented"; - return new ValidateAuthTokenMessage(id, userid, authToken, replyTo, - sessionId); - } private static IBigBlueButtonMessage processCreateMeeting(JsonObject payload) { String id = payload.get(Constants.MEETING_ID).getAsString(); diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MessagingConstants.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MessagingConstants.java index 16b6be4a25ddfa69baef23d3c43b12d9c51cf44f..e3e9a7ae63aad6b36bbe6aba5568bab2ed91c63b 100755 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MessagingConstants.java +++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MessagingConstants.java @@ -52,6 +52,14 @@ public class MessagingConstants { public static final String FROM_VOICE_CONF_SYSTEM_CHAN = FROM_VOICE_CONF_CHANNEL + ":system"; public static final String FROM_BBB_RECORDING_CHANNEL = "bigbluebutton:from-rap"; + + public static final String TO_BBB_TRANSCODE_CHANNEL = "bigbluebutton:to-bbb-transcode"; + public static final String TO_BBB_TRANSCODE_PATTERN = TO_BBB_TRANSCODE_CHANNEL + ":*"; + public static final String TO_BBB_TRANSCODE_SYSTEM_CHAN = TO_BBB_TRANSCODE_CHANNEL + ":system"; + public static final String FROM_BBB_TRANSCODE_CHANNEL = "bigbluebutton:from-bbb-transcode"; + public static final String FROM_BBB_TRANSCODE_PATTERN = FROM_BBB_TRANSCODE_CHANNEL + ":*"; + public static final String FROM_BBB_TRANSCODE_SYSTEM_CHAN = FROM_BBB_TRANSCODE_CHANNEL + ":system"; + public static final String DESTROY_MEETING_REQUEST_EVENT = "DestroyMeetingRequestEvent"; public static final String CREATE_MEETING_REQUEST_EVENT = "CreateMeetingRequestEvent"; diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MuteAllExceptPresenterRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MuteAllExceptPresenterRequestMessage.java deleted file mode 100755 index 7fed738b3358cf8f653f343cabe242745ce75822..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MuteAllExceptPresenterRequestMessage.java +++ /dev/null @@ -1,63 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class MuteAllExceptPresenterRequestMessage implements ISubscribedMessage { - public static final String MUTE_ALL_EXCEPT_PRESENTER_REQUEST = "mute_all_except_presenter_request_message"; - public static final String VERSION = "0.0.1"; - - public static final String MEETING_ID = "meeting_id"; - public static final String REQUESTER_ID = "requester_id"; - public static final String MUTE = "mute"; - - public final String meetingId; - public final String requesterId; - public final Boolean mute; - - public MuteAllExceptPresenterRequestMessage(String meetingId, String requesterId, Boolean mute) { - this.meetingId = meetingId; - this.requesterId = requesterId; - this.mute = mute; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(MEETING_ID, meetingId); - payload.put(REQUESTER_ID, requesterId); - payload.put(MUTE, mute); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(MUTE_ALL_EXCEPT_PRESENTER_REQUEST, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static MuteAllExceptPresenterRequestMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (MUTE_ALL_EXCEPT_PRESENTER_REQUEST.equals(messageName)) { - if (payload.has(MEETING_ID) - && payload.has(REQUESTER_ID) - && payload.has(MUTE)) { - String id = payload.get(MEETING_ID).getAsString(); - String requesterId = payload.get(REQUESTER_ID).getAsString(); - Boolean mute = payload.get(MUTE).getAsBoolean(); - return new MuteAllExceptPresenterRequestMessage(id, requesterId, mute); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MuteAllRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MuteAllRequestMessage.java deleted file mode 100755 index 4e0c4b9b0ca7dead1a2665cb92c71385ff25fc89..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MuteAllRequestMessage.java +++ /dev/null @@ -1,63 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class MuteAllRequestMessage implements ISubscribedMessage { - public static final String MUTE_ALL_REQUEST = "mute_all_request_message"; - public static final String VERSION = "0.0.1"; - - public static final String MEETING_ID = "meeting_id"; - public static final String REQUESTER_ID = "requester_id"; - public static final String MUTE = "mute"; - - public final String meetingId; - public final String requesterId; - public final Boolean mute; - - public MuteAllRequestMessage(String meetingId, String requesterId, Boolean mute) { - this.meetingId = meetingId; - this.requesterId = requesterId; - this.mute = mute; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(MEETING_ID, meetingId); - payload.put(REQUESTER_ID, requesterId); - payload.put(MUTE, mute); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(MUTE_ALL_REQUEST, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static MuteAllRequestMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (MUTE_ALL_REQUEST.equals(messageName)) { - if (payload.has(MEETING_ID) - && payload.has(REQUESTER_ID) - && payload.has(MUTE)) { - String id = payload.get(MEETING_ID).getAsString(); - String requesterId = payload.get(REQUESTER_ID).getAsString(); - Boolean mute = payload.get(MUTE).getAsBoolean(); - return new MuteAllRequestMessage(id, requesterId, mute); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MuteUserInVoiceConfRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MuteUserInVoiceConfRequestMessage.java deleted file mode 100755 index 200bb7c2b0d4779b92d84f9613147074236af608..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MuteUserInVoiceConfRequestMessage.java +++ /dev/null @@ -1,67 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class MuteUserInVoiceConfRequestMessage { - public static final String MUTE_VOICE_USER_REQUEST = "mute_user_in_voice_conf_request_message"; - public static final String VERSION = "0.0.1"; - - public static final String MEETING_ID = "meeting_id"; - public static final String VOICE_CONF_ID = "voice_conf_id"; - public static final String VOICE_USER_ID = "voice_user_id"; - public static final String MUTE = "mute"; - - public final String meetingId; - public final String voiceConfId; - public final String voiceUserId; - public final Boolean mute; - - public MuteUserInVoiceConfRequestMessage(String meetingId, String voiceConfId, String voiceUserId, Boolean mute) { - this.meetingId = meetingId; - this.voiceConfId = voiceConfId; - this.voiceUserId = voiceUserId; - this.mute = mute; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(MEETING_ID, meetingId); - payload.put(VOICE_CONF_ID, voiceConfId); - payload.put(VOICE_USER_ID, voiceUserId); - payload.put(MUTE, mute); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(MUTE_VOICE_USER_REQUEST, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static MuteUserInVoiceConfRequestMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (MUTE_VOICE_USER_REQUEST.equals(messageName)) { - if (payload.has(MEETING_ID) - && payload.has(VOICE_CONF_ID) - && payload.has(VOICE_USER_ID) - && payload.has(MUTE)) { - String id = payload.get(MEETING_ID).getAsString(); - String voiceConfId = payload.get(VOICE_CONF_ID).getAsString(); - String voiceUserId = payload.get(VOICE_USER_ID).getAsString(); - Boolean mute = payload.get(MUTE).getAsBoolean(); - return new MuteUserInVoiceConfRequestMessage(id, voiceConfId, voiceUserId, mute); - } - } - } - } - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MuteUserRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MuteUserRequestMessage.java deleted file mode 100755 index 776b3cc0c829a3334e94f56d3757bb122f23fed7..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MuteUserRequestMessage.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class MuteUserRequestMessage implements ISubscribedMessage { - public static final String MUTE_USER_REQUEST = "mute_user_request_message"; - public static final String VERSION = "0.0.1"; - - public static final String MEETING_ID = "meeting_id"; - public static final String REQUESTER_ID = "requester_id"; - public static final String USER_ID = "user_id"; - public static final String MUTE = "mute"; - - public final String meetingId; - public final String requesterId; - public final String userId; - public final Boolean mute; - - public MuteUserRequestMessage(String meetingId, String requesterId, String userId, Boolean mute) { - this.meetingId = meetingId; - this.requesterId = requesterId; - this.userId = userId; - this.mute = mute; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(MEETING_ID, meetingId); - payload.put(REQUESTER_ID, requesterId); - payload.put(USER_ID, userId); - payload.put(MUTE, mute); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(MUTE_USER_REQUEST, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static MuteUserRequestMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (MUTE_USER_REQUEST.equals(messageName)) { - if (payload.has(MEETING_ID) - && payload.has(REQUESTER_ID) - && payload.has(USER_ID) - && payload.has(MUTE)) { - String id = payload.get(MEETING_ID).getAsString(); - String requesterId = payload.get(REQUESTER_ID).getAsString(); - String userId = payload.get(USER_ID).getAsString(); - Boolean mute = payload.get(MUTE).getAsBoolean(); - return new MuteUserRequestMessage(id, requesterId, userId, mute); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MuteVoiceUserRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MuteVoiceUserRequestMessage.java deleted file mode 100755 index 16a9574952d4b31e580e8951d98db9eebf34ca7b..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MuteVoiceUserRequestMessage.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class MuteVoiceUserRequestMessage implements ISubscribedMessage { - public static final String MUTE_USER_REQUEST = "mute_user_request_message"; - public static final String VERSION = "0.0.1"; - - public static final String MEETING_ID = "meeting_id"; - public static final String REQUESTER_ID = "requester_id"; - public static final String USER_ID = "user_id"; - public static final String MUTE = "mute"; - - public final String meetingId; - public final String requesterId; - public final String userId; - public final Boolean mute; - - public MuteVoiceUserRequestMessage(String meetingId, String requesterId, String userId, Boolean mute) { - this.meetingId = meetingId; - this.requesterId = requesterId; - this.userId = userId; - this.mute = mute; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(MEETING_ID, meetingId); - payload.put(REQUESTER_ID, requesterId); - payload.put(USER_ID, userId); - payload.put(MUTE, mute); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(MUTE_USER_REQUEST, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static MuteVoiceUserRequestMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (MUTE_USER_REQUEST.equals(messageName)) { - if (payload.has(MEETING_ID) - && payload.has(REQUESTER_ID) - && payload.has(USER_ID) - && payload.has(MUTE)) { - String id = payload.get(MEETING_ID).getAsString(); - String requesterId = payload.get(REQUESTER_ID).getAsString(); - String userId = payload.get(USER_ID).getAsString(); - Boolean mute = payload.get(MUTE).getAsBoolean(); - return new MuteVoiceUserRequestMessage(id, requesterId, userId, mute); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/NewPermissionsSettingMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/NewPermissionsSettingMessage.java deleted file mode 100755 index 27c8fffa0a4b00f65096bf32d936bb0a6562655a..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/NewPermissionsSettingMessage.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; - -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class NewPermissionsSettingMessage implements ISubscribedMessage { - public static final String NEW_PERMISSIONS_SETTING = "new_permission_settings"; - public final String VERSION = "0.0.1"; - - public final String meetingId; - public final ArrayList<Map<String, Object>> users; - public final Map<String, Boolean> permissions; - - public NewPermissionsSettingMessage(String meetingID, Map<String, Boolean> permissions, ArrayList<Map<String, Object>> users) { - this.meetingId = meetingID; - this.users = users; - this.permissions = permissions; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(NEW_PERMISSIONS_SETTING, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static NewPermissionsSettingMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (NEW_PERMISSIONS_SETTING.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.USERS) - && payload.has(Constants.PERMISSIONS)) { - String meetingID = payload.get(Constants.MEETING_ID).getAsString(); - - JsonObject permissions = (JsonObject) payload.get(Constants.PERMISSIONS); - - Util util = new Util(); - Map<String, Boolean> permissionsMap = util.extractPermission(permissions); - - JsonArray users = (JsonArray) payload.get(Constants.USERS); - - ArrayList<Map<String, Object>> usersList = util.extractUsers(users); - - if (usersList != null && permissionsMap != null) { - return new NewPermissionsSettingMessage(meetingID, permissionsMap, usersList); - } - } - } - } - } - - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PollCreatedMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PollCreatedMessage.java deleted file mode 100755 index 3f1e8ff053f7031715d226f4778a4b8f826c1982..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PollCreatedMessage.java +++ /dev/null @@ -1,91 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import java.util.Map; - -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class PollCreatedMessage implements ISubscribedMessage { - public static final String POLL_CREATED = "poll_created_message"; - public static final String VERSION = "0.0.1"; - - public static final String MEETING_ID = "meeting_id"; - public static final String REQUESTER_ID = "requester_id"; - public static final String POLL_ID = "poll_id"; - public static final String POLL = "poll"; - - public final String meetingId; - public final String requesterId; - public final String pollId; - public final Map<String, Object> poll; - - public PollCreatedMessage(String meetingId, String requesterId, String pollId, Map<String, Object> poll) { - this.meetingId = meetingId; - this.requesterId = requesterId; - this.pollId = pollId; - this.poll = poll; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(MEETING_ID, meetingId); - payload.put(REQUESTER_ID, requesterId); - payload.put(POLL_ID, pollId); - payload.put(POLL, poll); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(POLL_CREATED, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static PollCreatedMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (POLL_CREATED.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(REQUESTER_ID) - && payload.has(POLL_ID) - && payload.has(POLL)) { - String id = payload.get(Constants.MEETING_ID).getAsString(); - String requesterId = payload.get(REQUESTER_ID).getAsString(); - String pollId = payload.get(POLL_ID).getAsString(); - JsonObject poll = payload.get(POLL).getAsJsonObject(); - - Map<String, Object> pollMap = decodePoll(poll); - return new PollCreatedMessage(id, requesterId, pollId, pollMap); - } - } - } - } - return null; - - } - - public static final String ID = "id"; - public static final String QUESTIONS = "questions"; - public static final String QUESTION = "question"; - public static final String ANSWERS = "answers"; - public static final String ANSWER = "answer"; - public static final String NUM_VOTES = "num_votes"; - - private static Map<String, Object> decodePoll(JsonObject poll) { - Map<String, Object> pollMap = new HashMap<String, Object>(); - - if (poll.has(ID) && poll.has(QUESTIONS)) { - String id = poll.get(ID).getAsString(); - JsonArray qArray = poll.get(QUESTIONS).getAsJsonArray(); - - } - - return pollMap; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PollHideResultMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PollHideResultMessage.java deleted file mode 100755 index cf70d7dab90e87a773162ff8d25e30f1a9a70303..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PollHideResultMessage.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class PollHideResultMessage implements ISubscribedMessage { - public static final String POLL_HIDE_RESULT = "poll_hide_result_message"; - public static final String VERSION = "0.0.1"; - - public static final String MEETING_ID = "meeting_id"; - public static final String POLL_ID = "poll_id"; - - public final String meetingId; - public final String pollId; - - public PollHideResultMessage(String meetingId, String pollId) { - this.meetingId = meetingId; - this.pollId = pollId; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(MEETING_ID, meetingId); - payload.put(POLL_ID, pollId); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(POLL_HIDE_RESULT, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static PollHideResultMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (POLL_HIDE_RESULT.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(POLL_ID)) { - String id = payload.get(Constants.MEETING_ID).getAsString(); - String pollId = payload.get(POLL_ID).getAsString(); - - return new PollHideResultMessage(id, pollId); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PollShowResultMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PollShowResultMessage.java deleted file mode 100755 index 79064aea459d9ca36a14857b59b4ee5e2c8d7cf6..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PollShowResultMessage.java +++ /dev/null @@ -1,63 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import java.util.Map; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class PollShowResultMessage implements ISubscribedMessage { - public static final String POLL_SHOW_RESULT = "poll_show_result_message"; - public static final String VERSION = "0.0.1"; - - public static final String MEETING_ID = "meeting_id"; - public static final String POLL = "poll"; - - public final String meetingId; - public final Map<String, Object> poll; - - public PollShowResultMessage(String meetingId, Map<String, Object> poll) { - this.meetingId = meetingId; - this.poll = poll; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(MEETING_ID, meetingId); - payload.put(POLL, poll); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(POLL_SHOW_RESULT, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static PollShowResultMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (POLL_SHOW_RESULT.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(POLL)) { - String id = payload.get(Constants.MEETING_ID).getAsString(); - - JsonObject poll = payload.get(POLL).getAsJsonObject(); - - Util util = new Util(); - Map<String, Object> pollMap = util.decodeSimplePollResult(poll); - - return new PollShowResultMessage(id, pollMap); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PollStartedMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PollStartedMessage.java deleted file mode 100755 index 8f6bddf0c527a12becbe2f9b077df2d1ff83c728..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PollStartedMessage.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import java.util.Map; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class PollStartedMessage implements ISubscribedMessage { - public static final String POLL_STARTED = "poll_started_message"; - public static final String VERSION = "0.0.1"; - - public static final String MEETING_ID = "meeting_id"; - public static final String REQUESTER_ID = "requester_id"; - public static final String POLL = "poll"; - - public final String meetingId; - public final String requesterId; - public final Map<String, Object> poll; - - public PollStartedMessage(String meetingId, String requesterId, Map<String, Object> poll) { - this.meetingId = meetingId; - this.requesterId = requesterId; - this.poll = poll; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(MEETING_ID, meetingId); - payload.put(REQUESTER_ID, requesterId); - payload.put(POLL, poll); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(POLL_STARTED, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static PollStartedMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (POLL_STARTED.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(REQUESTER_ID) - && payload.has(POLL)) { - String id = payload.get(Constants.MEETING_ID).getAsString(); - String requesterId = payload.get(REQUESTER_ID).getAsString(); - - JsonObject poll = payload.get(POLL).getAsJsonObject(); - - Util util = new Util(); - Map<String, Object> pollMap = util.decodeSimplePoll(poll); - - return new PollStartedMessage(id, requesterId, pollMap); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PollStoppedMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PollStoppedMessage.java deleted file mode 100755 index ea6b76a520ac52af1ccc97126bfee72d694242dd..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PollStoppedMessage.java +++ /dev/null @@ -1,63 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class PollStoppedMessage implements ISubscribedMessage { - public static final String POLL_STOPPED = "poll_stopped_message"; - public static final String VERSION = "0.0.1"; - - public static final String MEETING_ID = "meeting_id"; - public static final String REQUESTER_ID = "requester_id"; - public static final String POLL_ID = "poll_id"; - - public final String meetingId; - public final String requesterId; - public final String pollId; - - public PollStoppedMessage(String meetingId, String requesterId, String pollId) { - this.meetingId = meetingId; - this.requesterId = requesterId; - this.pollId = pollId; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(MEETING_ID, meetingId); - payload.put(REQUESTER_ID, requesterId); - payload.put(POLL_ID, pollId); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(POLL_STOPPED, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static PollStoppedMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (POLL_STOPPED.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(REQUESTER_ID) - && payload.has(POLL_ID)) { - String id = payload.get(Constants.MEETING_ID).getAsString(); - String requesterId = payload.get(REQUESTER_ID).getAsString(); - String pollId = payload.get(POLL_ID).getAsString(); - - return new PollStoppedMessage(id, requesterId, pollId); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PresentationConversionDoneMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PresentationConversionDoneMessage.java deleted file mode 100755 index 6aba2fac1eb3c27832038271ebd7c45d9c9230ff..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PresentationConversionDoneMessage.java +++ /dev/null @@ -1,90 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import java.util.Map; -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -import java.util.ArrayList; - - - -public class PresentationConversionDoneMessage implements ISubscribedMessage { - public static final String PRESENTATION_CONVERSION_DONE = "presentation_conversion_done_message"; - public final String VERSION = "0.0.1"; - - public final String meetingId; - public final String code; - public final Map<String,Object> presentation; - - public PresentationConversionDoneMessage(String meetingId, String code, Map<String,Object> presentation) { - this.meetingId = meetingId; - this.code = code; - this.presentation = presentation; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.CODE, code); - payload.put(Constants.PRESENTATION, presentation); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(PRESENTATION_CONVERSION_DONE, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static PresentationConversionDoneMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (PRESENTATION_CONVERSION_DONE.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.CODE) - && payload.has(Constants.PRESENTATION)) { - String meetingId = payload.get(Constants.MEETING_ID).getAsString(); - String code = payload.get(Constants.CODE).getAsString(); - - JsonObject presObj = (JsonObject) payload.get(Constants.PRESENTATION).getAsJsonObject(); - Map<String, Object> presentation = new HashMap<String, Object>(); - - if (presObj.has("id") - && presObj.has("name") - && presObj.has("current") - && presObj.has("pages") - && presObj.has("downloadable")) { - - String id = presObj.get("id").getAsString(); - boolean current = presObj.get("current").getAsBoolean(); - String name = presObj.get("name").getAsString(); - - presentation.put("id", id); - presentation.put("current", current); - presentation.put("name", name); - - JsonArray pages = (JsonArray) presObj.get(Constants.PAGES); - - Util util = new Util(); - ArrayList<Map<String, Object>> pagesList = util.extractPages(pages); - - presentation.put("pages", pagesList); - - boolean downloadable = presObj.get("downloadable").getAsBoolean(); - presentation.put("downloadable", downloadable); - - return new PresentationConversionDoneMessage(meetingId, code, presentation); - } - } - } - } - } - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PresentationConversionErrorMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PresentationConversionErrorMessage.java deleted file mode 100755 index 529a55a47da69c0877159f90c517cebf7b80be3c..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PresentationConversionErrorMessage.java +++ /dev/null @@ -1,83 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class PresentationConversionErrorMessage implements ISubscribedMessage { - public static final String PRESENTATION_CONVERSION_ERROR = "presentation_conversion_error_message"; - public final String VERSION = "0.0.1"; - - public final String meetingId; - public final String presentationId; - public final String code; - public final String messageKey; - public final String presentationName; - public final int numPages; - public final int maxNumPages; - - - - - public PresentationConversionErrorMessage(String meetingId, String presentationId, - String code, String messageKey, String presentationName, - int numPages, int maxNumPages) { - this.meetingId = meetingId; - this.presentationId = presentationId; - this.code = code; - this.messageKey = messageKey; - this.presentationName = presentationName; - this.maxNumPages = maxNumPages; - this.numPages = numPages; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.PRESENTATION_ID, presentationId); - payload.put(Constants.CODE, code); - payload.put(Constants.MESSAGE_KEY, messageKey); - payload.put(Constants.PRESENTATION_NAME, presentationName); - payload.put(Constants.NUM_PAGES, numPages); - payload.put(Constants.MAX_NUM_PAGES, maxNumPages); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(PRESENTATION_CONVERSION_ERROR, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static PresentationConversionErrorMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (PRESENTATION_CONVERSION_ERROR.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.CODE) - && payload.has(Constants.MESSAGE_KEY) - && payload.has(Constants.MAX_NUM_PAGES) - && payload.has(Constants.NUM_PAGES) - && payload.has(Constants.PRESENTATION_NAME) - && payload.has(Constants.PRESENTATION_ID)) { - String meetingId = payload.get(Constants.MEETING_ID).getAsString(); - String presentationId = payload.get(Constants.PRESENTATION_ID).getAsString(); - String presentationName = payload.get(Constants.PRESENTATION_NAME).getAsString(); - String code = payload.get(Constants.CODE).getAsString(); - String messageKey = payload.get(Constants.MESSAGE_KEY).getAsString(); - int numPages = payload.get(Constants.NUM_PAGES).getAsInt(); - int maxNumPages = payload.get(Constants.MAX_NUM_PAGES).getAsInt(); - - return new PresentationConversionErrorMessage(meetingId, presentationId, - code, messageKey, presentationName, numPages, maxNumPages); - } - } - } - } - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PresentationConversionProgressMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PresentationConversionProgressMessage.java deleted file mode 100755 index 92ea4dd53ee3075adb69cd1266f5d2a47261ec48..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PresentationConversionProgressMessage.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class PresentationConversionProgressMessage implements ISubscribedMessage { - public static final String PRESENTATION_CONVERSION_PROGRESS = "presentation_conversion_progress_message"; - public final String VERSION = "0.0.1"; - - public final String meetingId; - public final String presentationId; - public final String code; - public final String messageKey; - public final String presentationName; - - public PresentationConversionProgressMessage(String meetingId, String presentationId, - String code, String messageKey, String presentationName) { - this.meetingId = meetingId; - this.presentationId = presentationId; - this.code = code; - this.messageKey = messageKey; - this.presentationName = presentationName; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.PRESENTATION_ID, presentationId); - payload.put(Constants.CODE, code); - payload.put(Constants.MESSAGE_KEY, messageKey); - payload.put(Constants.PRESENTATION_NAME, presentationName); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(PRESENTATION_CONVERSION_PROGRESS, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static PresentationConversionProgressMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (PRESENTATION_CONVERSION_PROGRESS.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.CODE) - && payload.has(Constants.MESSAGE_KEY) - && payload.has(Constants.PRESENTATION_NAME) - && payload.has(Constants.PRESENTATION_ID)) { - String meetingId = payload.get(Constants.MEETING_ID).getAsString(); - String presentationId = payload.get(Constants.PRESENTATION_ID).getAsString(); - String presentationName = payload.get(Constants.PRESENTATION_NAME).getAsString(); - String code = payload.get(Constants.CODE).getAsString(); - String messageKey = payload.get(Constants.MESSAGE_KEY).getAsString(); - - return new PresentationConversionProgressMessage(meetingId, presentationId, - code, messageKey, presentationName); - } - } - } - } - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PresentationPageGeneratedReplyMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PresentationPageGeneratedReplyMessage.java deleted file mode 100755 index 54bdc14a892d5e91dbaa277fe09f1c778e3cc11c..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PresentationPageGeneratedReplyMessage.java +++ /dev/null @@ -1,84 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class PresentationPageGeneratedReplyMessage implements ISubscribedMessage { - public static final String PRESENTATION_PAGE_GENERATED = "presentation_page_generated_message"; - public final String VERSION = "0.0.1"; - - public final String meetingId; - public final String presentationId; - public final int numPages; - public final String code; - public final String messageKey; - public final String presentationName; - public final int pagesCompleted; - - public PresentationPageGeneratedReplyMessage(String meetingId, String presentationId, - int numPages, String code, String messageKey, String presentationName, - int pagesCompleted) { - this.meetingId = meetingId; - this.presentationId = presentationId; - this.code = code; - this.messageKey = messageKey; - this.presentationName = presentationName; - this.pagesCompleted = pagesCompleted; - this.numPages = numPages; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.PRESENTATION_ID, presentationId); - payload.put(Constants.CODE, code); - payload.put(Constants.MESSAGE_KEY, messageKey); - payload.put(Constants.PRESENTATION_NAME, presentationName); - payload.put(Constants.PAGES_COMPLETED, pagesCompleted); - payload.put(Constants.NUM_PAGES, numPages); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(PRESENTATION_PAGE_GENERATED, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static PresentationPageGeneratedReplyMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (PRESENTATION_PAGE_GENERATED.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.CODE) - && payload.has(Constants.MESSAGE_KEY) - && payload.has(Constants.PRESENTATION_NAME) - && payload.has(Constants.NUM_PAGES) - && payload.has(Constants.PAGES_COMPLETED) - && payload.has(Constants.PRESENTATION_ID)) { - String meetingId = payload.get(Constants.MEETING_ID).getAsString(); - String presentationId = payload.get(Constants.PRESENTATION_ID).getAsString(); - String presentationName = payload.get(Constants.PRESENTATION_NAME).getAsString(); - String code = payload.get(Constants.CODE).getAsString(); - String messageKey = payload.get(Constants.MESSAGE_KEY).getAsString(); - int numPages = payload.get(Constants.NUM_PAGES).getAsInt(); - int pagesCompleted = payload.get(Constants.PAGES_COMPLETED).getAsInt(); - - return new PresentationPageGeneratedReplyMessage(meetingId, presentationId, - numPages, code, messageKey, presentationName, pagesCompleted); - } - } - } - } - return null; - } -} - - - - diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PresentationPageResizedMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PresentationPageResizedMessage.java deleted file mode 100755 index 772c31a5228336bc78c6b5c45632b05d6869e9bc..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PresentationPageResizedMessage.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import java.util.Map; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class PresentationPageResizedMessage implements ISubscribedMessage { - public static final String PRESENTATION_PAGE_RESIZED = "presentation_page_resized_message"; - public final String VERSION = "0.0.1"; - - public final String meetingId; - public final Map<String,Object> page; - - public PresentationPageResizedMessage(String meetingId, Map<String,Object> page) { - this.meetingId = meetingId; - this.page = page; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.PAGE, page); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(PRESENTATION_PAGE_RESIZED, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static PresentationPageResizedMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (PRESENTATION_PAGE_RESIZED.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.PAGE)) { - String meetingId = payload.get(Constants.MEETING_ID).getAsString(); - - JsonObject pageObject = (JsonObject) payload.get(Constants.PAGE).getAsJsonObject(); - Map<String, Object> page = new HashMap<String, Object>(); - Util util = new Util(); - page = util.extractPage(pageObject); - - return new PresentationPageResizedMessage(meetingId, page); - } - } - } - } - return null; - } -} - diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PresentationRemovedMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PresentationRemovedMessage.java deleted file mode 100755 index c2cb5cad0ef346a24aac93e817b8ec71eb737658..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PresentationRemovedMessage.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class PresentationRemovedMessage implements ISubscribedMessage { - public static final String PRESENTATION_REMOVED = "presentation_removed_message"; - public final String VERSION = "0.0.1"; - - public static final String PRESENTATION_ID = "presentation_id"; - public static final String MEETING_ID = "meeting_id"; - - public final String meetingId; - public final String presentationId; - - public PresentationRemovedMessage(String meetingId, String presentationId) { - this.meetingId = meetingId; - this.presentationId = presentationId; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(MEETING_ID, meetingId); - payload.put(PRESENTATION_ID, presentationId); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(PRESENTATION_REMOVED, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static PresentationRemovedMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (PRESENTATION_REMOVED.equals(messageName)) { - if (payload.has(MEETING_ID) - && payload.has(PRESENTATION_ID)) { - String meetingId = payload.get(MEETING_ID).getAsString(); - String presentationId = payload.get(PRESENTATION_ID).getAsString(); - return new PresentationRemovedMessage(meetingId, presentationId); - } - } - } - } - - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PresentationSharedMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PresentationSharedMessage.java deleted file mode 100755 index a927f3135edfa123c282cf9bcaceff919bf5995d..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PresentationSharedMessage.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import java.util.Map; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class PresentationSharedMessage implements ISubscribedMessage { - public static final String PRESENTATION_SHARED_MESSAGE = "presentation_shared_message"; - public final String VERSION = "0.0.1"; - - public final String meetingId; - public final Map<String,Object> presentation; - - public PresentationSharedMessage(String meetingId, Map<String,Object> presentation) { - this.meetingId = meetingId; - this.presentation = presentation; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.PRESENTATION, presentation); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(PRESENTATION_SHARED_MESSAGE, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static PresentationSharedMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (PRESENTATION_SHARED_MESSAGE.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.PRESENTATION)) { - String meetingId = payload.get(Constants.MEETING_ID).getAsString(); - - JsonObject presentationObject = (JsonObject) payload.get(Constants.PRESENTATION).getAsJsonObject(); - Util util = new Util(); - - Map<String, Object> presentation = util.extractPresentation(presentationObject); - - return new PresentationSharedMessage(meetingId, presentation); - } - } - } - } - return null; - } -} - diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PresenterAssignedMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PresenterAssignedMessage.java deleted file mode 100755 index 38a8f2dc72860c2858ff47d867e6ad064bf5f622..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PresenterAssignedMessage.java +++ /dev/null @@ -1,64 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class PresenterAssignedMessage implements ISubscribedMessage { - public static final String PRESENTER_ASSIGNED = "presenter_assigned_message"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final String newPresenterId; - public final String newPresenterName; - public final String assignedBy; - - public PresenterAssignedMessage(String meetingId, String newPresenterId, String newPresenterName, - String assignedBy) { - this.meetingId = meetingId; - this.newPresenterId = newPresenterId; - this.newPresenterName = newPresenterName; - this.assignedBy = assignedBy; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.NEW_PRESENTER_ID, newPresenterId); - payload.put(Constants.NEW_PRESENTER_NAME, newPresenterName); - payload.put(Constants.ASSIGNED_BY, assignedBy); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(PRESENTER_ASSIGNED, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static PresenterAssignedMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (PRESENTER_ASSIGNED.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.NEW_PRESENTER_ID) - && payload.has(Constants.NEW_PRESENTER_NAME) - && payload.has(Constants.ASSIGNED_BY)) { - String id = payload.get(Constants.MEETING_ID).getAsString(); - String presenterId = payload.get(Constants.NEW_PRESENTER_ID).getAsString(); - String presenterName = payload.get(Constants.NEW_PRESENTER_NAME).getAsString(); - String assignedBy = payload.get(Constants.ASSIGNED_BY).getAsString(); - return new PresenterAssignedMessage(id, presenterId, presenterName, assignedBy); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/RecordVoiceConfRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/RecordVoiceConfRequestMessage.java deleted file mode 100755 index 4158afea221409586281811a419a15d9149ba822..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/RecordVoiceConfRequestMessage.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class RecordVoiceConfRequestMessage { - public static final String RECORD_VOICE_CONF_REQUEST = "record_voice_conf_request_message"; - public static final String VERSION = "0.0.1"; - - public static final String MEETING_ID = "meeting_id"; - public static final String VOICE_CONF_ID = "voice_conf_id"; - public static final String RECORD = "record"; - - public final String meetingId; - public final String voiceConfId; - public final Boolean record; - - public RecordVoiceConfRequestMessage(String meetingId, String voiceConfId, Boolean record) { - this.meetingId = meetingId; - this.voiceConfId = voiceConfId; - this.record = record; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(MEETING_ID, meetingId); - payload.put(VOICE_CONF_ID, voiceConfId); - payload.put(RECORD, record); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(RECORD_VOICE_CONF_REQUEST, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static RecordVoiceConfRequestMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (RECORD_VOICE_CONF_REQUEST.equals(messageName)) { - if (payload.has(MEETING_ID) - && payload.has(VOICE_CONF_ID) - && payload.has(RECORD)) { - String id = payload.get(MEETING_ID).getAsString(); - String voiceConfId = payload.get(VOICE_CONF_ID).getAsString(); - Boolean record = payload.get(RECORD).getAsBoolean(); - return new RecordVoiceConfRequestMessage(id, voiceConfId, record); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/RemovePresentationMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/RemovePresentationMessage.java deleted file mode 100755 index d22fb9776dfe93dc5dfff2143e8ff9800b727e7f..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/RemovePresentationMessage.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class RemovePresentationMessage implements IBigBlueButtonMessage { - public static final String REMOVE_PRESENTATION = "remove_presentation"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final String presentationId; - - public RemovePresentationMessage(String meetingId, String presentationId){ - this.meetingId = meetingId; - this.presentationId = presentationId; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.PRESENTATION_ID, presentationId); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(REMOVE_PRESENTATION, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static RemovePresentationMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (REMOVE_PRESENTATION.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.PRESENTATION_ID)) { - String meetingId = payload.get(Constants.MEETING_ID).getAsString(); - String presentationId = payload.get(Constants.PRESENTATION_ID).getAsString(); - - return new RemovePresentationMessage(meetingId, presentationId); - } - } - } - } - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ResizeAndMoveSlideMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ResizeAndMoveSlideMessage.java deleted file mode 100755 index 16a2cf6553231af4aefd96c95fe8c52e90508cd4..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ResizeAndMoveSlideMessage.java +++ /dev/null @@ -1,68 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class ResizeAndMoveSlideMessage implements IBigBlueButtonMessage { - public static final String RESIZE_AND_MOVE_SLIDE = "resize_and_move_slide"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final double xOffset; - public final double yOffset; - public final double widthRatio; - public final double heightRatio; - - public ResizeAndMoveSlideMessage(String meetingId, double xOffset, double yOffset, - double widthRatio, double heightRatio) { - this.meetingId = meetingId; - this.xOffset = xOffset; - this.yOffset = yOffset; - this.heightRatio = heightRatio; - this.widthRatio = widthRatio; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.X_OFFSET, xOffset); - payload.put(Constants.Y_OFFSET, yOffset); - payload.put(Constants.HEIGHT_RATIO, heightRatio); - payload.put(Constants.WIDTH_RATIO, widthRatio); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(RESIZE_AND_MOVE_SLIDE, VERSION, null); - return MessageBuilder.buildJson(header, payload); - } - - public static ResizeAndMoveSlideMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (RESIZE_AND_MOVE_SLIDE.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.X_OFFSET) - && payload.has(Constants.Y_OFFSET) - && payload.has(Constants.HEIGHT_RATIO) - && payload.has(Constants.WIDTH_RATIO)) { - String meetingId = payload.get(Constants.MEETING_ID).getAsString(); - double xOffset = payload.get(Constants.X_OFFSET).getAsDouble(); - double yOffset = payload.get(Constants.Y_OFFSET).getAsDouble(); - double heightRatio = payload.get(Constants.HEIGHT_RATIO).getAsDouble(); - double widthRatio = payload.get(Constants.WIDTH_RATIO).getAsDouble(); - - return new ResizeAndMoveSlideMessage(meetingId, xOffset, yOffset, widthRatio, heightRatio); - } - } - } - } - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/RespondToGuestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/RespondToGuestMessage.java deleted file mode 100644 index 2da32de6b8006f4b9ad1aa198663834f2691a392..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/RespondToGuestMessage.java +++ /dev/null @@ -1,64 +0,0 @@ - -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class RespondToGuestMessage implements IBigBlueButtonMessage { - public static final String RESPOND_TO_GUEST = "respond_to_guest"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final String userId; - public final Boolean response; - public final String requesterId; - - public RespondToGuestMessage(String meetingId, String userId, Boolean response, String requesterId) { - this.meetingId = meetingId; - this.userId = userId; - this.response = response; - this.requesterId = requesterId; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.USER_ID, userId); - payload.put(Constants.RESPONSE, response); - payload.put(Constants.REQUESTER_ID, requesterId); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(RESPOND_TO_GUEST, VERSION, null); - return MessageBuilder.buildJson(header, payload); - } - - public static RespondToGuestMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (RESPOND_TO_GUEST.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.RESPONSE) - && payload.has(Constants.REQUESTER_ID)) { - String meetingId = payload.get(Constants.MEETING_ID).getAsString(); - String userId = null; - Boolean response = payload.get(Constants.RESPONSE).getAsBoolean(); - String requesterId = payload.get(Constants.REQUESTER_ID).getAsString(); - - if (payload.has(Constants.USER_ID)) { - userId = payload.get(Constants.USER_ID).getAsString(); - } - - return new RespondToGuestMessage(meetingId, userId, response, requesterId); - } - } - } - } - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendConversionCompletedMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendConversionCompletedMessage.java deleted file mode 100755 index ea9aa30c10879facee6d68ead31b697be554429d..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendConversionCompletedMessage.java +++ /dev/null @@ -1,84 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class SendConversionCompletedMessage implements IBigBlueButtonMessage { - public static final String SEND_CONVERSION_COMPLETED = "send_conversion_completed"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final String messageKey; - public final String code; - public final String presId; - public final int numPages; - public final String presName; - public final String presBaseUrl; - public final Boolean downloadable; - - public SendConversionCompletedMessage(String messageKey, String meetingId, String code, - String presId, int numPages, String presName, String presBaseUrl, Boolean downloadable) { - this.meetingId = meetingId; - this.messageKey = messageKey; - this.code = code; - this.presId = presId; - this.numPages = numPages; - this.presName = presName; - this.presBaseUrl = presBaseUrl; - this.downloadable = downloadable; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.MESSAGE_KEY, messageKey); - payload.put(Constants.CODE, code); - payload.put(Constants.PRESENTATION_ID, presId); - payload.put(Constants.NUM_PAGES, numPages); - payload.put(Constants.PRESENTATION_NAME, presName); - payload.put(Constants.PRESENTATION_BASE_URL, presBaseUrl); - payload.put(Constants.DOWNLOADABLE, downloadable); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(SEND_CONVERSION_COMPLETED, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static SendConversionCompletedMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (SEND_CONVERSION_COMPLETED.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.MESSAGE_KEY) - && payload.has(Constants.CODE) - && payload.has(Constants.PRESENTATION_ID) - && payload.has(Constants.NUM_PAGES) - && payload.has(Constants.PRESENTATION_NAME) - && payload.has(Constants.PRESENTATION_BASE_URL) - && payload.has(Constants.DOWNLOADABLE)) { - String meetingId = payload.get(Constants.MEETING_ID).getAsString(); - String messageKey = payload.get(Constants.MESSAGE_KEY).getAsString(); - String code = payload.get(Constants.CODE).getAsString(); - String presId = payload.get(Constants.PRESENTATION_ID).getAsString(); - int numPages = payload.get(Constants.NUM_PAGES).getAsInt(); - String presName = payload.get(Constants.PRESENTATION_NAME).getAsString(); - String presBaseUrl = payload.get(Constants.PRESENTATION_BASE_URL).getAsString(); - Boolean downloadable = payload.get(Constants.DOWNLOADABLE).getAsBoolean(); - - return new SendConversionCompletedMessage(messageKey, meetingId, code, presId, numPages, presName, presBaseUrl, downloadable); - } - } - } - } - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendConversionUpdateMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendConversionUpdateMessage.java deleted file mode 100755 index a5a07a8608a42e00581d97a0a030fd515f9ace09..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendConversionUpdateMessage.java +++ /dev/null @@ -1,70 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class SendConversionUpdateMessage implements IBigBlueButtonMessage { - public static final String SEND_CONVERSION_UPDATE = "send_conversion_update"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final String messageKey; - public final String code; - public final String presId; - public final String presName; - - - public SendConversionUpdateMessage(String messageKey, String meetingId, - String code, String presId, String presName) { - this.meetingId = meetingId; - this.messageKey = messageKey; - this.code = code; - this.presId = presId; - this.presName = presName; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.MESSAGE_KEY, messageKey); - payload.put(Constants.CODE, code); - payload.put(Constants.PRESENTATION_ID, presId); - payload.put(Constants.PRESENTATION_NAME, presName); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(SEND_CONVERSION_UPDATE, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static SendConversionUpdateMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (SEND_CONVERSION_UPDATE.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.MESSAGE_KEY) - && payload.has(Constants.CODE) - && payload.has(Constants.PRESENTATION_NAME) - && payload.has(Constants.PRESENTATION_ID)) { - String meetingId = payload.get(Constants.MEETING_ID).getAsString(); - String code = payload.get(Constants.CODE).getAsString(); - String messageKey = payload.get(Constants.MESSAGE_KEY).getAsString(); - String presId = payload.get(Constants.PRESENTATION_ID).getAsString(); - String presName = payload.get(Constants.PRESENTATION_NAME).getAsString(); - - return new SendConversionUpdateMessage(messageKey, meetingId, code, presId, presName); - } - } - } - } - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendLockSettingsMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendLockSettingsMessage.java deleted file mode 100755 index 82000311a239337b055af7eca67a4963f42844fd..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendLockSettingsMessage.java +++ /dev/null @@ -1,91 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import java.util.Map; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class SendLockSettingsMessage implements IBigBlueButtonMessage { - public static final String SEND_LOCK_SETTINGS = "send_lock_settings"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final String userId; - public final Map<String, Boolean> newSettings; - - - public SendLockSettingsMessage(String meetingId, String userId, Map<String, Boolean> newSettings) { - this.meetingId = meetingId; - this.userId = userId; - this.newSettings = newSettings; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - - Map<String, Boolean> settingsMap = new HashMap<String, Boolean>(); - - settingsMap.put(Constants.DISABLE_CAMERA, newSettings.get("disableCam")); - settingsMap.put(Constants.DISABLE_MICROPHONE, newSettings.get("disableMic")); - settingsMap.put(Constants.DISABLE_PRIVATE_CHAT, newSettings.get("disablePrivateChat")); - settingsMap.put(Constants.DISABLE_PUBLIC_CHAT, newSettings.get("disablePublicChat")); - settingsMap.put(Constants.LOCKED_LAYOUT, newSettings.get("lockedLayout")); - settingsMap.put(Constants.LOCK_ON_JOIN, newSettings.get("lockOnJoin")); - settingsMap.put(Constants.LOCK_ON_JOIN_CONFIGURABLE, newSettings.get("lockOnJoinConfigurable")); - - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.USER_ID, userId); - payload.put(Constants.SETTINGS, settingsMap); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(SEND_LOCK_SETTINGS, VERSION, null); - return MessageBuilder.buildJson(header, payload); - } - - public static SendLockSettingsMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (SEND_LOCK_SETTINGS.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.USER_ID) - && payload.has(Constants.SETTINGS)) { - - JsonObject settingsObj = (JsonObject) payload.get(Constants.SETTINGS).getAsJsonObject(); - if (settingsObj.has(Constants.DISABLE_CAMERA) - && settingsObj.has(Constants.DISABLE_CAMERA) - && settingsObj.has(Constants.DISABLE_MICROPHONE) - && settingsObj.has(Constants.DISABLE_PRIVATE_CHAT) - && settingsObj.has(Constants.DISABLE_PUBLIC_CHAT) - && settingsObj.has(Constants.LOCKED_LAYOUT) - && settingsObj.has(Constants.LOCK_ON_JOIN) - && settingsObj.has(Constants.LOCK_ON_JOIN_CONFIGURABLE)) { - - Map<String, Boolean> settingsMap = new HashMap<String, Boolean>(); - - settingsMap.put("disableCam", settingsObj.get(Constants.DISABLE_CAMERA).getAsBoolean()); - settingsMap.put("disableMic", settingsObj.get(Constants.DISABLE_MICROPHONE).getAsBoolean()); - settingsMap.put("disablePrivateChat", settingsObj.get(Constants.DISABLE_PRIVATE_CHAT).getAsBoolean()); - settingsMap.put("disablePublicChat", settingsObj.get(Constants.DISABLE_PUBLIC_CHAT).getAsBoolean()); - settingsMap.put("lockedLayout", settingsObj.get(Constants.LOCKED_LAYOUT).getAsBoolean()); - settingsMap.put("lockOnJoin", settingsObj.get(Constants.LOCK_ON_JOIN).getAsBoolean()); - settingsMap.put("lockOnJoinConfigurable", settingsObj.get(Constants.LOCK_ON_JOIN_CONFIGURABLE).getAsBoolean()); - - String meetingId = payload.get(Constants.MEETING_ID).getAsString(); - String userId = payload.get(Constants.USER_ID).getAsString(); - - return new SendLockSettingsMessage(meetingId, userId, settingsMap); - } - } - } - } - } - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendPageCountErrorMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendPageCountErrorMessage.java deleted file mode 100755 index f2680994a95c9b555b8cd7b8a64e5da4c742c594..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendPageCountErrorMessage.java +++ /dev/null @@ -1,80 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class SendPageCountErrorMessage implements IBigBlueButtonMessage { - public static final String SEND_PAGE_COUNT_ERROR = "send_page_count_error"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final String messageKey; - public final String code; - public final String presId; - public final int numberOfPages; - public final int maxNumberPages; - public final String presName; - - public SendPageCountErrorMessage(String messageKey, String meetingId, - String code, String presId, int numberOfPages, int maxNumberPages, - String presName) { - this.meetingId = meetingId; - this.messageKey = messageKey; - this.code = code; - this.presId = presId; - this.numberOfPages = numberOfPages; - this.maxNumberPages = maxNumberPages; - this.presName = presName; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.MESSAGE_KEY, messageKey); - payload.put(Constants.CODE, code); - payload.put(Constants.PRESENTATION_ID, presId); - payload.put(Constants.NUM_PAGES, numberOfPages); - payload.put(Constants.MAX_NUM_PAGES, maxNumberPages); - payload.put(Constants.PRESENTATION_NAME, presName); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(SEND_PAGE_COUNT_ERROR, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static SendPageCountErrorMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (SEND_PAGE_COUNT_ERROR.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.MESSAGE_KEY) - && payload.has(Constants.CODE) - && payload.has(Constants.PRESENTATION_ID) - && payload.has(Constants.MAX_NUM_PAGES) - && payload.has(Constants.NUM_PAGES) - && payload.has(Constants.PRESENTATION_NAME)) { - String meetingId = payload.get(Constants.MEETING_ID).getAsString(); - String messageKey = payload.get(Constants.MESSAGE_KEY).getAsString(); - String code = payload.get(Constants.CODE).getAsString(); - String presId = payload.get(Constants.PRESENTATION_ID).getAsString(); - int numberOfPages = payload.get(Constants.NUM_PAGES).getAsInt(); - int maxNumberPages = payload.get(Constants.MAX_NUM_PAGES).getAsInt(); - String presName = payload.get(Constants.PRESENTATION_NAME).getAsString(); - - return new SendPageCountErrorMessage(messageKey, meetingId, code, presId, numberOfPages, maxNumberPages, presName); - } - } - } - } - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendSlideGeneratedMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendSlideGeneratedMessage.java deleted file mode 100755 index 6d8db8255bfa40a97c96a7e92dee188371d5eac5..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendSlideGeneratedMessage.java +++ /dev/null @@ -1,80 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class SendSlideGeneratedMessage implements IBigBlueButtonMessage { - public static final String SEND_SLIDE_GENERATED = "send_slide_generated"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final String messageKey; - public final String code; - public final String presId; - public final int numberOfPages; - public final int pagesCompleted; - public final String presName; - - public SendSlideGeneratedMessage(String messageKey, String meetingId, - String code, String presId, int numberOfPages, int pagesCompleted, - String presName) { - this.meetingId = meetingId; - this.messageKey = messageKey; - this.code = code; - this.presId = presId; - this.numberOfPages = numberOfPages; - this.pagesCompleted = pagesCompleted; - this.presName = presName; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.MESSAGE_KEY, messageKey); - payload.put(Constants.CODE, code); - payload.put(Constants.PRESENTATION_ID, presId); - payload.put(Constants.NUM_PAGES, numberOfPages); - payload.put(Constants.PAGES_COMPLETED, pagesCompleted); - payload.put(Constants.PRESENTATION_NAME, presName); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(SEND_SLIDE_GENERATED, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static SendSlideGeneratedMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (SEND_SLIDE_GENERATED.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.MESSAGE_KEY) - && payload.has(Constants.CODE) - && payload.has(Constants.PRESENTATION_ID) - && payload.has(Constants.PAGES_COMPLETED) - && payload.has(Constants.NUM_PAGES) - && payload.has(Constants.PRESENTATION_NAME)) { - String meetingId = payload.get(Constants.MEETING_ID).getAsString(); - String messageKey = payload.get(Constants.MESSAGE_KEY).getAsString(); - String code = payload.get(Constants.CODE).getAsString(); - String presId = payload.get(Constants.PRESENTATION_ID).getAsString(); - int numberOfPages = payload.get(Constants.NUM_PAGES).getAsInt(); - int pagesCompleted = payload.get(Constants.PAGES_COMPLETED).getAsInt(); - String presName = payload.get(Constants.PRESENTATION_NAME).getAsString(); - - return new SendSlideGeneratedMessage(messageKey, meetingId, code, presId, numberOfPages, pagesCompleted, presName); - } - } - } - } - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SetGuestPolicyMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SetGuestPolicyMessage.java deleted file mode 100644 index b56ea59abbe0e582ef4bb04f6bfe9d2ffe2eddde..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SetGuestPolicyMessage.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class SetGuestPolicyMessage implements IBigBlueButtonMessage { - public static final String SET_GUEST_POLICY = "set_guest_policy"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final String guestPolicy; - public final String setBy; - - public SetGuestPolicyMessage(String meetingId, String guestPolicy, String setBy) { - this.meetingId = meetingId; - this.guestPolicy = guestPolicy; - this.setBy = setBy; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.GUEST_POLICY, guestPolicy); - payload.put(Constants.SET_BY, setBy); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(SET_GUEST_POLICY, VERSION, null); - return MessageBuilder.buildJson(header, payload); - } - - public static SetGuestPolicyMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (SET_GUEST_POLICY.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.GUEST_POLICY) - && payload.has(Constants.SET_BY)) { - String meetingId = payload.get(Constants.MEETING_ID).getAsString(); - String guestPolicy = payload.get(Constants.GUEST_POLICY).getAsString(); - String setBy = payload.get(Constants.SET_BY).getAsString(); - - return new SetGuestPolicyMessage(meetingId, guestPolicy, setBy); - } - } - } - } - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SetUserStatusRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SetUserStatusRequestMessage.java deleted file mode 100755 index e338a1b41a8185a61e496c803651db1822636e58..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SetUserStatusRequestMessage.java +++ /dev/null @@ -1,64 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class SetUserStatusRequestMessage implements ISubscribedMessage { - public static final String SET_USER_STATUS_REQUEST = "set_user_status_request_message"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final String userId; - public final String status; - public final String value; - - public SetUserStatusRequestMessage(String meetingId, String userId, String status, String value) { - this.meetingId = meetingId; - this.userId = userId; - this.status = status; - this.value = value; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.USER_ID, userId); - payload.put(Constants.STATUS, status); - payload.put(Constants.VALUE, value); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(SET_USER_STATUS_REQUEST, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static SetUserStatusRequestMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (SET_USER_STATUS_REQUEST.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.USER_ID) - && payload.has(Constants.STATUS) - && payload.has(Constants.VALUE)) { - String id = payload.get(Constants.MEETING_ID).getAsString(); - String userid = payload.get(Constants.USER_ID).getAsString(); - String status = payload.get(Constants.STATUS).getAsString(); - String value = payload.get(Constants.VALUE).getAsString(); - return new SetUserStatusRequestMessage(id, userid, status, value); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SharePresentationMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SharePresentationMessage.java deleted file mode 100755 index 36f07847f05c13c27831ab3d0b462391787a5065..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SharePresentationMessage.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class SharePresentationMessage implements IBigBlueButtonMessage { - public static final String SHARE_PRESENTATION = "share_presentation"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final String presentationId; - public final boolean share; - - public SharePresentationMessage(String meetingId, String presentationId, - boolean share){ - this.meetingId = meetingId; - this.presentationId = presentationId; - this.share = share; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.PRESENTATION_ID, presentationId); - payload.put(Constants.SHARE, share); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(SHARE_PRESENTATION, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static SharePresentationMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (SHARE_PRESENTATION.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.PRESENTATION_ID) - && payload.has(Constants.SHARE)) { - String meetingId = payload.get(Constants.MEETING_ID).getAsString(); - String presentationId = payload.get(Constants.PRESENTATION_ID).getAsString(); - boolean share = payload.get(Constants.SHARE).getAsBoolean(); - - return new SharePresentationMessage(meetingId, presentationId, share); - } - } - } - } - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ShowPollResultRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ShowPollResultRequestMessage.java deleted file mode 100755 index 8e5601d763e76d3bc36cef513d495f35e9d35443..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ShowPollResultRequestMessage.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class ShowPollResultRequestMessage implements ISubscribedMessage { - public static final String SHOW_POLL_RESULT_REQUEST = "show_poll_result_request_message"; - public static final String VERSION = "0.0.1"; - - public static final String MEETING_ID = "meeting_id"; - public static final String REQUESTER_ID = "requester_id"; - public static final String POLL_ID = "poll_id"; - public static final String SHOW = "show"; - - public final String meetingId; - public final String requesterId; - public final String pollId; - public final Boolean show; - - public ShowPollResultRequestMessage(String meetingId, String requesterId, String pollId, Boolean show) { - this.meetingId = meetingId; - this.requesterId = requesterId; - this.pollId = pollId; - this.show = show; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(MEETING_ID, meetingId); - payload.put(REQUESTER_ID, requesterId); - payload.put(POLL_ID, pollId); - payload.put(SHOW, show); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(SHOW_POLL_RESULT_REQUEST, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static ShowPollResultRequestMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (SHOW_POLL_RESULT_REQUEST.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(REQUESTER_ID) - && payload.has(POLL_ID) - && payload.has(SHOW)) { - String id = payload.get(Constants.MEETING_ID).getAsString(); - String requesterId = payload.get(REQUESTER_ID).getAsString(); - String pollId = payload.get(POLL_ID).getAsString(); - Boolean show = payload.get(SHOW).getAsBoolean(); - - return new ShowPollResultRequestMessage(id, requesterId, pollId, show); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/StartCustomPollRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/StartCustomPollRequestMessage.java deleted file mode 100755 index da6a6b4e956f9fec12cf05c3377b55379f718b90..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/StartCustomPollRequestMessage.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.bigbluebutton.common.messages; - -import org.bigbluebutton.common.messages.payload.StartCustomPollRequestMessagePayload; - -public class StartCustomPollRequestMessage implements IBigBlueButtonMessage { - - public static final String START_CUSTOM_POLL_REQUEST = "start_custom_poll_request_message"; - - public MessageHeader header; - public StartCustomPollRequestMessagePayload payload; -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/StartPollRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/StartPollRequestMessage.java deleted file mode 100755 index 93787da831d20c7fc3c597e72ddd55c183511d35..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/StartPollRequestMessage.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class StartPollRequestMessage implements ISubscribedMessage { - public static final String START_POLL_REQUEST = "start_poll_request_message"; - public static final String VERSION = "0.0.1"; - - public static final String MEETING_ID = "meeting_id"; - public static final String REQUESTER_ID = "requester_id"; - public static final String POLL_ID = "poll_id"; - public static final String POLL_TYPE = "poll_type"; - - public final String meetingId; - public final String requesterId; - public final String pollId; - public final String pollType; - - public StartPollRequestMessage(String meetingId, String requesterId, String pollId, String pollType) { - this.meetingId = meetingId; - this.requesterId = requesterId; - this.pollId = pollId; - this.pollType = pollType; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(MEETING_ID, meetingId); - payload.put(REQUESTER_ID, requesterId); - payload.put(POLL_ID, pollId); - payload.put(POLL_TYPE, pollType); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(START_POLL_REQUEST, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static StartPollRequestMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (START_POLL_REQUEST.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(REQUESTER_ID) - && payload.has(POLL_ID) - && payload.has(POLL_TYPE)) { - String id = payload.get(Constants.MEETING_ID).getAsString(); - String requesterId = payload.get(REQUESTER_ID).getAsString(); - String pollId = payload.get(POLL_ID).getAsString(); - String pollType = payload.get(POLL_TYPE).getAsString(); - return new StartPollRequestMessage(id, requesterId, pollId, pollType); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/StartRecordingVoiceConfRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/StartRecordingVoiceConfRequestMessage.java deleted file mode 100755 index 40c519e29c8a222e0cc0bc5e1a8aa6e28034de30..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/StartRecordingVoiceConfRequestMessage.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class StartRecordingVoiceConfRequestMessage { - public static final String START_RECORD_VOICE_CONF_REQUEST = "start_recording_voice_conf_request_message"; - public static final String VERSION = "0.0.1"; - - public static final String MEETING_ID = "meeting_id"; - public static final String VOICE_CONF_ID = "voice_conf_id"; - - public final String meetingId; - public final String voiceConfId; - - public StartRecordingVoiceConfRequestMessage(String meetingId, String voiceConfId) { - this.meetingId = meetingId; - this.voiceConfId = voiceConfId; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(MEETING_ID, meetingId); - payload.put(VOICE_CONF_ID, voiceConfId); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(START_RECORD_VOICE_CONF_REQUEST, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static StartRecordingVoiceConfRequestMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (START_RECORD_VOICE_CONF_REQUEST.equals(messageName)) { - if (payload.has(MEETING_ID) - && payload.has(VOICE_CONF_ID)) { - String id = payload.get(MEETING_ID).getAsString(); - String voiceConfId = payload.get(VOICE_CONF_ID).getAsString(); - return new StartRecordingVoiceConfRequestMessage(id, voiceConfId); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/StopPollRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/StopPollRequestMessage.java deleted file mode 100755 index ca0763b62f801d1a97fea282551b7433bc1ad38c..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/StopPollRequestMessage.java +++ /dev/null @@ -1,63 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class StopPollRequestMessage implements ISubscribedMessage { - public static final String STOP_POLL_REQUEST = "stop_poll_request_message"; - public static final String VERSION = "0.0.1"; - - public static final String MEETING_ID = "meeting_id"; - public static final String REQUESTER_ID = "requester_id"; - public static final String POLL_ID = "poll_id"; - - public final String meetingId; - public final String requesterId; - public final String pollId; - - public StopPollRequestMessage(String meetingId, String requesterId, String pollId) { - this.meetingId = meetingId; - this.requesterId = requesterId; - this.pollId = pollId; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(MEETING_ID, meetingId); - payload.put(REQUESTER_ID, requesterId); - payload.put(POLL_ID, pollId); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(STOP_POLL_REQUEST, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static StopPollRequestMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (STOP_POLL_REQUEST.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(REQUESTER_ID) - && payload.has(POLL_ID)) { - String id = payload.get(Constants.MEETING_ID).getAsString(); - String requesterId = payload.get(REQUESTER_ID).getAsString(); - String pollId = payload.get(POLL_ID).getAsString(); - return new StopPollRequestMessage(id, requesterId, pollId); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/StopRecordingVoiceConfRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/StopRecordingVoiceConfRequestMessage.java deleted file mode 100755 index a8c87ebad73ab03d686f60136d3fc132b7e4c550..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/StopRecordingVoiceConfRequestMessage.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class StopRecordingVoiceConfRequestMessage { - public static final String STOP_RECORD_VOICE_CONF_REQUEST = "stop_recording_voice_conf_request_message"; - public static final String VERSION = "0.0.1"; - - public static final String MEETING_ID = "meeting_id"; - public static final String VOICE_CONF_ID = "voice_conf_id"; - public static final String RECORD_STREAM = "record_stream"; - - public final String meetingId; - public final String voiceConfId; - public final String recordStream; - - public StopRecordingVoiceConfRequestMessage(String meetingId, String voiceConfId, String recordStream) { - this.meetingId = meetingId; - this.voiceConfId = voiceConfId; - this.recordStream = recordStream; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(MEETING_ID, meetingId); - payload.put(VOICE_CONF_ID, voiceConfId); - payload.put(RECORD_STREAM, recordStream); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(STOP_RECORD_VOICE_CONF_REQUEST, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static StopRecordingVoiceConfRequestMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (STOP_RECORD_VOICE_CONF_REQUEST.equals(messageName)) { - if (payload.has(MEETING_ID) - && payload.has(VOICE_CONF_ID) - && payload.has(RECORD_STREAM)) { - String id = payload.get(MEETING_ID).getAsString(); - String voiceConfId = payload.get(VOICE_CONF_ID).getAsString(); - String recordStream = payload.get(RECORD_STREAM).getAsString(); - return new StopRecordingVoiceConfRequestMessage(id, voiceConfId, recordStream); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/TransferUserToVoiceConfRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/TransferUserToVoiceConfRequestMessage.java deleted file mode 100644 index 2a73785186b6bd8beea3d896984d3641ceb45183..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/TransferUserToVoiceConfRequestMessage.java +++ /dev/null @@ -1,84 +0,0 @@ -/** - * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ - * - * Copyright (c) 2016 BigBlueButton Inc. and by respective authors (see below). - * - * This program is free software; you can redistribute it and/or modify it under the - * terms of the GNU Lesser General Public License as published by the Free Software - * Foundation; either version 3.0 of the License, or (at your option) any later - * version. - * - * BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along - * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. - * - */ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class TransferUserToVoiceConfRequestMessage { - public static final String TRANSFER_USER_TO_VOICE_CONF_REQUEST = "transfer_user_to_voice_conf_request_message"; - public static final String VERSION = "0.0.1"; - - public static final String VOICE_CONF_ID = "voice_conf_id"; - public static final String TARGET_VOICE_CONF_ID = "target_voice_conf_id"; - public static final String VOICE_USER_ID = "voice_user_id"; - - public final String voiceConfId; - public final String targetVoiceConfId; - public final String voiceUserId; - - public TransferUserToVoiceConfRequestMessage(String voiceConfId, - String breakoutVoiceConfId, String voiceUserId) { - this.voiceConfId = voiceConfId; - this.targetVoiceConfId = breakoutVoiceConfId; - this.voiceUserId = voiceUserId; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(VOICE_CONF_ID, voiceConfId); - payload.put(TARGET_VOICE_CONF_ID, targetVoiceConfId); - payload.put(VOICE_USER_ID, voiceUserId); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader( - TRANSFER_USER_TO_VOICE_CONF_REQUEST, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static TransferUserToVoiceConfRequestMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (TRANSFER_USER_TO_VOICE_CONF_REQUEST.equals(messageName)) { - if (payload.has(VOICE_CONF_ID) - && payload.has(TARGET_VOICE_CONF_ID) - && payload.has(VOICE_USER_ID)) { - String id = payload.get(VOICE_CONF_ID).getAsString(); - String targetVoiceConfId = payload.get( - TARGET_VOICE_CONF_ID).getAsString(); - String voiceUserId = payload.get(VOICE_USER_ID) - .getAsString(); - return new TransferUserToVoiceConfRequestMessage(id, - targetVoiceConfId, voiceUserId); - } - } - } - } - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserConnectedToGlobalAudio.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserConnectedToGlobalAudio.java deleted file mode 100755 index 5b368ae46f8f4bd908cc46cdd88816c35241285d..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserConnectedToGlobalAudio.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class UserConnectedToGlobalAudio implements IBigBlueButtonMessage { - public static final String USER_CONNECTED_TO_GLOBAL_AUDIO = "user_connected_to_global_audio"; - public static final String VERSION = "0.0.1"; - - public final String voiceConf; - public final String name; - public final String userid; - - - - public UserConnectedToGlobalAudio(String voiceConf, String userid, String name) { - this.voiceConf = voiceConf; - this.userid = userid; - this.name = name; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.VOICE_CONF, voiceConf); - payload.put(Constants.USER_ID, userid); - payload.put(Constants.NAME, name); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_CONNECTED_TO_GLOBAL_AUDIO, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static UserConnectedToGlobalAudio fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (USER_CONNECTED_TO_GLOBAL_AUDIO.equals(messageName)) { - if (payload.has(Constants.VOICE_CONF) - && payload.has(Constants.USER_ID) - && payload.has(Constants.NAME)) { - String voiceConf = payload.get(Constants.VOICE_CONF).getAsString(); - String userid = payload.get(Constants.USER_ID).getAsString(); - String name = payload.get(Constants.NAME).getAsString(); - return new UserConnectedToGlobalAudio(voiceConf, userid, name); - } - } - } - } - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserDisconnectedFromGlobalAudio.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserDisconnectedFromGlobalAudio.java deleted file mode 100755 index eb5742e2e01d41d124f56275416023bcafda5be3..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserDisconnectedFromGlobalAudio.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class UserDisconnectedFromGlobalAudio implements IBigBlueButtonMessage { - public static final String USER_DISCONNECTED_FROM_GLOBAL_AUDIO = "user_disconnected_from_global_audio"; - public static final String VERSION = "0.0.1"; - - public final String voiceConf; - public final String name; - public final String userid; - - public UserDisconnectedFromGlobalAudio(String voiceConf, String userid, String name) { - this.voiceConf = voiceConf; - this.userid = userid; - this.name = name; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.VOICE_CONF, voiceConf); - payload.put(Constants.USER_ID, userid); - payload.put(Constants.NAME, name); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_DISCONNECTED_FROM_GLOBAL_AUDIO, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static UserDisconnectedFromGlobalAudio fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (USER_DISCONNECTED_FROM_GLOBAL_AUDIO.equals(messageName)) { - if (payload.has(Constants.VOICE_CONF) - && payload.has(Constants.USER_ID) - && payload.has(Constants.NAME)) { - String voiceConf = payload.get(Constants.VOICE_CONF).getAsString(); - String userid = payload.get(Constants.USER_ID).getAsString(); - String name = payload.get(Constants.NAME).getAsString(); - return new UserDisconnectedFromGlobalAudio(voiceConf, userid, name); - } - } - } - } - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserEjectedFromMeetingMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserEjectedFromMeetingMessage.java deleted file mode 100755 index 90fcb00c9c8a246128e6a5ba72f617c8c4a8b0eb..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserEjectedFromMeetingMessage.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class UserEjectedFromMeetingMessage implements ISubscribedMessage { - public static final String USER_EJECTED_FROM_MEETING = "user_eject_from_meeting"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final String userId; - public final String ejectedBy; - - - public UserEjectedFromMeetingMessage(String meetingId, String userId, String ejectedBy) { - this.meetingId = meetingId; - this.userId = userId; - this.ejectedBy = ejectedBy; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.USER_ID, userId); - payload.put(Constants.EJECTED_BY, ejectedBy); - - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_EJECTED_FROM_MEETING, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static UserEjectedFromMeetingMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (USER_EJECTED_FROM_MEETING.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.USER_ID) - && payload.has(Constants.EJECTED_BY)) { - String id = payload.get(Constants.MEETING_ID).getAsString(); - String userid = payload.get(Constants.USER_ID).getAsString(); - String ejectedBy = payload.get(Constants.EJECTED_BY).getAsString(); - return new UserEjectedFromMeetingMessage(id, userid, ejectedBy); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserEmojiStatusMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserEmojiStatusMessage.java deleted file mode 100755 index f3e657cbea0ea5589939531b9dbf578a329fe7aa..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserEmojiStatusMessage.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class UserEmojiStatusMessage implements ISubscribedMessage { - public static final String USER_EMOJI_STATUS = "user_emoji_status_message"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final String userId; - public final String emojiStatus; - - public UserEmojiStatusMessage(String meetingId, String userId, String emojiStatus) { - this.meetingId = meetingId; - this.userId = userId; - this.emojiStatus = emojiStatus; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.USER_ID, userId); - payload.put(Constants.EMOJI_STATUS, emojiStatus); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_EMOJI_STATUS, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static UserEmojiStatusMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (USER_EMOJI_STATUS.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.USER_ID) - && payload.has(Constants.EMOJI_STATUS)) { - String id = payload.get(Constants.MEETING_ID).getAsString(); - String userid = payload.get(Constants.USER_ID).getAsString(); - String emojiStatus = payload.get(Constants.EMOJI_STATUS).getAsString(); - return new UserEmojiStatusMessage(id, userid, emojiStatus); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserJoinedMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserJoinedMessage.java deleted file mode 100755 index 0cd267bc9ee9ff742bcc25da80d13f63aac6aead..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserJoinedMessage.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import java.util.Map; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class UserJoinedMessage implements ISubscribedMessage { - public static final String USER_JOINED = "user_joined_message"; - public final String VERSION = "0.0.1"; - - public final String meetingId; - public final Map<String, Object> user; - - public UserJoinedMessage(String meetingID, Map<String, Object> user) { - this.meetingId = meetingID; - this.user = user; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_JOINED, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - public static UserJoinedMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (USER_JOINED.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.USER)) { - String meetingID = payload.get(Constants.MEETING_ID).getAsString(); - - JsonObject user = (JsonObject) payload.get(Constants.USER); - - Util util = new Util(); - Map<String, Object> userMap = util.extractUser(user); - - if (userMap != null) { - return new UserJoinedMessage(meetingID, userMap); - } - } - } - } - } - - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserJoinedVoiceConfMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserJoinedVoiceConfMessage.java deleted file mode 100755 index 7c494b425b9107162b5cc0a2dd1ac3c5c7be1bc8..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserJoinedVoiceConfMessage.java +++ /dev/null @@ -1,93 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class UserJoinedVoiceConfMessage { - public static final String USER_JOINED_VOICE_CONF = "user_joined_voice_conf_message"; - public static final String VERSION = "0.0.1"; - - public static final String VOICE_CONF_ID = "voice_conf_id"; - public static final String VOICE_USER_ID = "voice_user_id"; - public static final String USER_ID = "user_id"; - public static final String CALLER_ID_NAME = "caller_id_name"; - public static final String CALLER_ID_NUM = "caller_id_num"; - public static final String MUTED = "muted"; - public static final String TALKING = "talking"; - public static final String AVATAR_URL = "avatarURL"; - - public final String voiceConfId; - public final String voiceUserId; - public final String userId; - public final String callerIdName; - public final String callerIdNum; - public final Boolean muted; - public final Boolean talking; - public final String avatarURL; - - public UserJoinedVoiceConfMessage(String voiceConfId, String voiceUserId, String userId, - String callerIdName, String callerIdNum, Boolean muted, Boolean talking, String avatarURL) { - this.voiceConfId = voiceConfId; - this.voiceUserId = voiceUserId; - this.userId = userId; - this.callerIdName = callerIdName; - this.callerIdNum = callerIdNum; - this.muted = muted; - this.talking = talking; - this.avatarURL = avatarURL; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(VOICE_CONF_ID, voiceConfId); - payload.put(VOICE_USER_ID, voiceUserId); - payload.put(USER_ID, userId); - payload.put(CALLER_ID_NAME, callerIdName); - payload.put(CALLER_ID_NUM, callerIdNum); - payload.put(MUTED, muted); - payload.put(TALKING, talking); - payload.put(AVATAR_URL, avatarURL); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_JOINED_VOICE_CONF, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static UserJoinedVoiceConfMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (USER_JOINED_VOICE_CONF.equals(messageName)) { - if (payload.has(VOICE_CONF_ID) - && payload.has(VOICE_USER_ID) - && payload.has(USER_ID) - && payload.has(CALLER_ID_NAME) - && payload.has(CALLER_ID_NUM) - && payload.has(MUTED) - && payload.has(TALKING) - && payload.has(AVATAR_URL)) { - String voiceConfId = payload.get(VOICE_CONF_ID).getAsString(); - String voiceUserId = payload.get(VOICE_USER_ID).getAsString(); - String userId = payload.get(USER_ID).getAsString(); - String callerIdName = payload.get(CALLER_ID_NAME).getAsString(); - String callerIdNum = payload.get(CALLER_ID_NUM).getAsString(); - Boolean muted = payload.get(MUTED).getAsBoolean(); - Boolean talking = payload.get(TALKING).getAsBoolean(); - String avatarURL = payload.get(AVATAR_URL).getAsString(); - return new UserJoinedVoiceConfMessage(voiceConfId, voiceUserId, userId, callerIdName, callerIdNum, muted, talking, avatarURL); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserJoinedVoiceMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserJoinedVoiceMessage.java deleted file mode 100755 index 9231fb66c4a90517515b7ba62b88e06d8b9de983..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserJoinedVoiceMessage.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import java.util.Map; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class UserJoinedVoiceMessage implements ISubscribedMessage { - public static final String USER_JOINED_VOICE = "user_joined_voice_message"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final Map<String, Object> user; - public final String voiceConf; - - public UserJoinedVoiceMessage(String meetingId, Map<String, Object> user, String voiceConf) { - this.meetingId = meetingId; - this.user = user; - this.voiceConf = voiceConf; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.USER, user); - payload.put(Constants.VOICE_CONF, voiceConf); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_JOINED_VOICE, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static UserJoinedVoiceMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (USER_JOINED_VOICE.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.USER)) { - String id = payload.get(Constants.MEETING_ID).getAsString(); - String voiceConf = payload.get(Constants.VOICE_CONF).getAsString(); - - JsonObject user = (JsonObject) payload.get(Constants.USER); - - Util util = new Util(); - Map<String, Object> userMap = util.extractUser(user); - - if (userMap != null) { - return new UserJoinedVoiceMessage(id, userMap, voiceConf); - } - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLeavingMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLeavingMessage.java deleted file mode 100755 index 8945520836809da4fda1a175c7f2010993c58fb6..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLeavingMessage.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class UserLeavingMessage implements ISubscribedMessage { - public static final String USER_LEAVING = "user_leaving_request"; - public final String VERSION = "0.0.1"; - - public final String meetingId; - public final String userId; - - public UserLeavingMessage(String meetingID, String internalUserId) { - this.meetingId = meetingID; - this.userId = internalUserId; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.USER_ID, userId); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_LEAVING, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - public static UserLeavingMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (USER_LEAVING.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.USER_ID)) { - String meetingID = payload.get(Constants.MEETING_ID).getAsString(); - String userid = payload.get(Constants.USER_ID).getAsString(); - return new UserLeavingMessage(meetingID, userid); - } - } - } - } - - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLeftMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLeftMessage.java deleted file mode 100755 index 037d4681fdbdd145db68a5fa0db98ffd5bc0890f..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLeftMessage.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import java.util.Map; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class UserLeftMessage implements ISubscribedMessage { - public static final String USER_LEFT = "user_left_message"; - public final String VERSION = "0.0.1"; - - public final String meetingId; - public final Map<String, Object> user; - - public UserLeftMessage(String meetingID, Map<String, Object> user) { - this.meetingId = meetingID; - this.user = user; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_LEFT, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - public static UserLeftMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (USER_LEFT.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.USER)) { - String meetingID = payload.get(Constants.MEETING_ID).getAsString(); - - JsonObject user = (JsonObject) payload.get(Constants.USER); - - Util util = new Util(); - Map<String, Object> userMap = util.extractUser(user); - - if (userMap != null) { - return new UserLeftMessage(meetingID, userMap); - } - } - } - } - } - - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLeftVoiceConfMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLeftVoiceConfMessage.java deleted file mode 100755 index fe94818eb40c6531127032bcebd0dc15351cf7c3..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLeftVoiceConfMessage.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class UserLeftVoiceConfMessage { - public static final String USER_LEFT_VOICE_CONF = "user_left_voice_conf_message"; - public static final String VERSION = "0.0.1"; - - public static final String VOICE_CONF_ID = "voice_conf_id"; - public static final String VOICE_USER_ID = "voice_user_id"; - - public final String voiceConfId; - public final String voiceUserId; - - public UserLeftVoiceConfMessage(String voiceConfId, String voiceUserId) { - this.voiceConfId = voiceConfId; - this.voiceUserId = voiceUserId; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(VOICE_CONF_ID, voiceConfId); - payload.put(VOICE_USER_ID, voiceUserId); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_LEFT_VOICE_CONF, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static UserLeftVoiceConfMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (USER_LEFT_VOICE_CONF.equals(messageName)) { - if (payload.has(VOICE_CONF_ID) - && payload.has(VOICE_USER_ID)) { - String voiceConfId = payload.get(VOICE_CONF_ID).getAsString(); - String voiceUserId = payload.get(VOICE_USER_ID).getAsString(); - return new UserLeftVoiceConfMessage(voiceConfId, voiceUserId); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLeftVoiceMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLeftVoiceMessage.java deleted file mode 100755 index 8e647a6bbf5217e9e16141aeb833e2377c8ae892..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLeftVoiceMessage.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import java.util.Map; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class UserLeftVoiceMessage implements ISubscribedMessage { - public static final String USER_LEFT_VOICE = "user_left_voice_message"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final Map<String, Object> user; - public final String voiceConf; - - public UserLeftVoiceMessage(String meetingId, Map<String, Object> user, String voiceConf) { - this.meetingId = meetingId; - this.user = user; - this.voiceConf = voiceConf; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.USER, user); - payload.put(Constants.VOICE_CONF, voiceConf); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_LEFT_VOICE, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static UserLeftVoiceMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (USER_LEFT_VOICE.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.USER)) { - String id = payload.get(Constants.MEETING_ID).getAsString(); - String voiceConf = payload.get(Constants.VOICE_CONF).getAsString(); - - JsonObject user = (JsonObject) payload.get(Constants.USER); - - Util util = new Util(); - Map<String, Object> userMap = util.extractUser(user); - - if (userMap != null) { - return new UserLeftVoiceMessage(id, userMap, voiceConf); - } - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserListeningOnlyMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserListeningOnlyMessage.java deleted file mode 100755 index 5f352b2645f222b0e0bfc716a48e1efdfbd7da16..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserListeningOnlyMessage.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class UserListeningOnlyMessage implements ISubscribedMessage { - public static final String USER_LISTENING_ONLY = "user_listening_only"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final String userId; - public final Boolean listenOnly; - - public UserListeningOnlyMessage(String meetingId, String userId, Boolean listenOnly) { - this.meetingId = meetingId; - this.userId = userId; - this.listenOnly = listenOnly; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.USER_ID, userId); - payload.put(Constants.LISTEN_ONLY, listenOnly); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_LISTENING_ONLY, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static UserListeningOnlyMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (USER_LISTENING_ONLY.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.USER_ID) - && payload.has(Constants.LISTEN_ONLY)) { - String id = payload.get(Constants.MEETING_ID).getAsString(); - String userid = payload.get(Constants.USER_ID).getAsString(); - Boolean listenOnly = payload.get(Constants.LISTEN_ONLY).getAsBoolean(); - return new UserListeningOnlyMessage(id, userid, listenOnly); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLockedInVoiceConfMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLockedInVoiceConfMessage.java deleted file mode 100755 index d9fb7b85e110ab138c4aab4cdffa7d6b6938aa9f..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLockedInVoiceConfMessage.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class UserLockedInVoiceConfMessage { - public static final String USER_LOCKED_IN_VOICE_CONF = "user_locked_in_voice_conf_message"; - public static final String VERSION = "0.0.1"; - - public static final String VOICE_CONF_ID = "voice_conf_id"; - public static final String VOICE_USER_ID = "voice_user_id"; - public static final String LOCKED = "locked"; - - public final String voiceConfId; - public final String voiceUserId; - public final Boolean locked; - - public UserLockedInVoiceConfMessage(String voiceConfId, String voiceUserId, Boolean locked) { - this.voiceConfId = voiceConfId; - this.voiceUserId = voiceUserId; - this.locked = locked; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(VOICE_CONF_ID, voiceConfId); - payload.put(VOICE_USER_ID, voiceUserId); - payload.put(LOCKED, locked); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_LOCKED_IN_VOICE_CONF, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static UserLockedInVoiceConfMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (USER_LOCKED_IN_VOICE_CONF.equals(messageName)) { - if (payload.has(VOICE_CONF_ID) - && payload.has(VOICE_USER_ID) - && payload.has(LOCKED)) { - String voiceConfId = payload.get(VOICE_CONF_ID).getAsString(); - String voiceUserId = payload.get(VOICE_USER_ID).getAsString(); - Boolean locked = payload.get(LOCKED).getAsBoolean(); - return new UserLockedInVoiceConfMessage(voiceConfId, voiceUserId, locked); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLockedMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLockedMessage.java deleted file mode 100755 index c9c6aa8f3b06d4210c211687701e294ac54fbb32..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLockedMessage.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class UserLockedMessage implements ISubscribedMessage { - public static final String USER_LOCKED = "user_locked_message"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final String userId; - public final Boolean locked; - - public UserLockedMessage(String meetingId, String userId, Boolean locked) { - this.meetingId = meetingId; - this.userId = userId; - this.locked = locked; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.USER_ID, userId); - payload.put(Constants.LOCKED, locked); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_LOCKED, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static UserLockedMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (USER_LOCKED.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.USER_ID) - && payload.has(Constants.LOCKED)) { - String id = payload.get(Constants.MEETING_ID).getAsString(); - String userid = payload.get(Constants.USER_ID).getAsString(); - Boolean locked = payload.get(Constants.LOCKED).getAsBoolean(); - return new UserLockedMessage(id, userid, locked); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserMutedInVoiceConfMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserMutedInVoiceConfMessage.java deleted file mode 100755 index cb87b8c98bdc7be9588d6914f56b3da53ed96d3d..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserMutedInVoiceConfMessage.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class UserMutedInVoiceConfMessage { - public static final String USER_MUTED_IN_VOICE_CONF = "user_muted_in_voice_conf_message"; - public static final String VERSION = "0.0.1"; - - public static final String VOICE_CONF_ID = "voice_conf_id"; - public static final String VOICE_USER_ID = "voice_user_id"; - public static final String MUTED = "muted"; - - public final String voiceConfId; - public final String voiceUserId; - public final Boolean muted; - - public UserMutedInVoiceConfMessage(String voiceConfId, String voiceUserId, Boolean muted) { - this.voiceConfId = voiceConfId; - this.voiceUserId = voiceUserId; - this.muted = muted; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(VOICE_CONF_ID, voiceConfId); - payload.put(VOICE_USER_ID, voiceUserId); - payload.put(MUTED, muted); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_MUTED_IN_VOICE_CONF, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static UserMutedInVoiceConfMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (USER_MUTED_IN_VOICE_CONF.equals(messageName)) { - if (payload.has(VOICE_CONF_ID) - && payload.has(VOICE_USER_ID) - && payload.has(MUTED)) { - String voiceConfId = payload.get(VOICE_CONF_ID).getAsString(); - String voiceUserId = payload.get(VOICE_USER_ID).getAsString(); - Boolean muted = payload.get(MUTED).getAsBoolean(); - return new UserMutedInVoiceConfMessage(voiceConfId, voiceUserId, muted); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserRoleChangeMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserRoleChangeMessage.java deleted file mode 100644 index 0d6d76bde13df24c035ef97d840f30de7767d0d9..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserRoleChangeMessage.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class UserRoleChangeMessage implements IBigBlueButtonMessage { - public static final String USER_ROLE_CHANGE = "user_role_change"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final String userId; - public final String role; - - public UserRoleChangeMessage(String meetingId, String userId, String role) { - this.meetingId = meetingId; - this.userId = userId; - this.role = role; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.USER_ID, userId); - payload.put(Constants.ROLE, role); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_ROLE_CHANGE, VERSION, null); - return MessageBuilder.buildJson(header, payload); - } - - public static UserRoleChangeMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (USER_ROLE_CHANGE.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.USER_ID) - && payload.has(Constants.ROLE)) { - String meetingId = payload.get(Constants.MEETING_ID).getAsString(); - String userId = payload.get(Constants.USER_ID).getAsString(); - String role = payload.get(Constants.ROLE).getAsString(); - - return new UserRoleChangeMessage(meetingId, userId, role); - } - } - } - } - return null; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserShareWebcamRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserShareWebcamRequestMessage.java deleted file mode 100755 index 225580e1aa4fd6b60eefeeb2e93d680ee8e2d8a7..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserShareWebcamRequestMessage.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class UserShareWebcamRequestMessage implements ISubscribedMessage { - public static final String USER_SHARE_WEBCAM_REQUEST = "user_share_webcam_request_message"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final String userId; - public final String stream; - - public UserShareWebcamRequestMessage(String meetingId, String userId, String stream) { - this.meetingId = meetingId; - this.userId = userId; - this.stream = stream; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.USER_ID, userId); - payload.put(Constants.STREAM, stream); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_SHARE_WEBCAM_REQUEST, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static UserShareWebcamRequestMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (USER_SHARE_WEBCAM_REQUEST.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.USER_ID) - && payload.has(Constants.STREAM)) { - String id = payload.get(Constants.MEETING_ID).getAsString(); - String userid = payload.get(Constants.USER_ID).getAsString(); - String stream = payload.get(Constants.STREAM).getAsString(); - return new UserShareWebcamRequestMessage(id, userid, stream); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserSharedWebcamMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserSharedWebcamMessage.java index 5789b3942de756f162c4afaeb39a7a7f1f98c859..84d54dbe0607e6b583b00438c2d7a5abb6b6acf7 100755 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserSharedWebcamMessage.java +++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserSharedWebcamMessage.java @@ -1,59 +1,57 @@ package org.bigbluebutton.common.messages; import java.util.HashMap; - import com.google.gson.JsonObject; import com.google.gson.JsonParser; - public class UserSharedWebcamMessage implements ISubscribedMessage { - public static final String USER_SHARED_WEBCAM = "user_shared_webcam_message"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final String userId; - public final String stream; - - public UserSharedWebcamMessage(String meetingId, String userId, String stream) { - this.meetingId = meetingId; - this.userId = userId; - this.stream = stream; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.USER_ID, userId); - payload.put(Constants.STREAM, stream); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_SHARED_WEBCAM, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static UserSharedWebcamMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (USER_SHARED_WEBCAM.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.USER_ID) - && payload.has(Constants.STREAM)) { - String id = payload.get(Constants.MEETING_ID).getAsString(); - String userid = payload.get(Constants.USER_ID).getAsString(); - String stream = payload.get(Constants.STREAM).getAsString(); - return new UserSharedWebcamMessage(id, userid, stream); - } - } - } - } - return null; - - } + public static final String USER_SHARED_WEBCAM = "user_shared_webcam_message"; + public static final String VERSION = "0.0.1"; + + public final String meetingId; + public final String userId; + public final String stream; + + public UserSharedWebcamMessage(String meetingId, String userId, String stream) { + this.meetingId = meetingId; + this.userId = userId; + this.stream = stream; + } + + public String toJson() { + HashMap<String, Object> payload = new HashMap<String, Object>(); + payload.put(Constants.MEETING_ID, meetingId); + payload.put(Constants.USER_ID, userId); + payload.put(Constants.STREAM, stream); + + java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_SHARED_WEBCAM, VERSION, null); + + return MessageBuilder.buildJson(header, payload); + } + + public static UserSharedWebcamMessage fromJson(String message) { + JsonParser parser = new JsonParser(); + JsonObject obj = (JsonObject) parser.parse(message); + + if (obj.has("header") && obj.has("payload")) { + JsonObject header = (JsonObject) obj.get("header"); + JsonObject payload = (JsonObject) obj.get("payload"); + + if (header.has("name")) { + String messageName = header.get("name").getAsString(); + if (USER_SHARED_WEBCAM.equals(messageName)) { + if (payload.has(Constants.MEETING_ID) + && payload.has(Constants.USER_ID) + && payload.has(Constants.STREAM)) { + String id = payload.get(Constants.MEETING_ID).getAsString(); + String userid = payload.get(Constants.USER_ID).getAsString(); + String stream = payload.get(Constants.STREAM).getAsString(); + return new UserSharedWebcamMessage(id, userid, stream); + } + } + } + } + return null; + + } } diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserStatusChangedMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserStatusChangedMessage.java deleted file mode 100755 index f643e72eb4ca697e05be0bdfc27a3f5be1f89ee7..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserStatusChangedMessage.java +++ /dev/null @@ -1,65 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class UserStatusChangedMessage implements ISubscribedMessage { - public static final String USER_STATUS_CHANGED = "user_status_changed_message"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final String userId; - public final String status; - public final String value; - - public UserStatusChangedMessage(String meetingId, String userId, String status, - String value) { - this.meetingId = meetingId; - this.userId = userId; - this.status = status; - this.value = value; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.USER_ID, userId); - payload.put(Constants.STATUS, status); - payload.put(Constants.VALUE, value); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_STATUS_CHANGED, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static UserStatusChangedMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (USER_STATUS_CHANGED.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.USER_ID) - && payload.has(Constants.STATUS) - && payload.has(Constants.VALUE)) { - String id = payload.get(Constants.MEETING_ID).getAsString(); - String userid = payload.get(Constants.USER_ID).getAsString(); - String status = payload.get(Constants.STATUS).getAsString(); - String value = payload.get(Constants.VALUE).getAsString(); - return new UserStatusChangedMessage(id, userid, status, value); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserTalkingInVoiceConfMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserTalkingInVoiceConfMessage.java deleted file mode 100755 index 461337e16de14dea778e852d9edf6801e6b0f183..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserTalkingInVoiceConfMessage.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class UserTalkingInVoiceConfMessage { - public static final String USER_TALKING_IN_VOICE_CONF = "user_talking_in_voice_conf_message"; - public static final String VERSION = "0.0.1"; - - public static final String VOICE_CONF_ID = "voice_conf_id"; - public static final String VOICE_USER_ID = "voice_user_id"; - public static final String TALKING = "talking"; - - public final String voiceConfId; - public final String voiceUserId; - public final Boolean talking; - - public UserTalkingInVoiceConfMessage(String voiceConfId, String voiceUserId, Boolean talking) { - this.voiceConfId = voiceConfId; - this.voiceUserId = voiceUserId; - this.talking = talking; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(VOICE_CONF_ID, voiceConfId); - payload.put(VOICE_USER_ID, voiceUserId); - payload.put(TALKING, talking); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_TALKING_IN_VOICE_CONF, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static UserTalkingInVoiceConfMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (USER_TALKING_IN_VOICE_CONF.equals(messageName)) { - if (payload.has(VOICE_CONF_ID) - && payload.has(VOICE_USER_ID) - && payload.has(TALKING)) { - String voiceConfId = payload.get(VOICE_CONF_ID).getAsString(); - String voiceUserId = payload.get(VOICE_USER_ID).getAsString(); - Boolean talking = payload.get(TALKING).getAsBoolean(); - return new UserTalkingInVoiceConfMessage(voiceConfId, voiceUserId, talking); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserUnshareWebcamRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserUnshareWebcamRequestMessage.java index 051b91db0204ae731bfa25c7d96418237fd57b53..8b51b3f1e49e79fbb6d9e5da4ad6047500d4836e 100755 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserUnshareWebcamRequestMessage.java +++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserUnshareWebcamRequestMessage.java @@ -7,53 +7,53 @@ import com.google.gson.JsonParser; public class UserUnshareWebcamRequestMessage implements ISubscribedMessage { - public static final String USER_UNSHARE_WEBCAM_REQUEST = "user_unshare_webcam_request_message"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final String userId; - public final String stream; - - public UserUnshareWebcamRequestMessage(String meetingId, String userId, String stream) { - this.meetingId = meetingId; - this.userId = userId; - this.stream = stream; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.USER_ID, userId); - payload.put(Constants.STREAM, stream); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_UNSHARE_WEBCAM_REQUEST, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static UserUnshareWebcamRequestMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (USER_UNSHARE_WEBCAM_REQUEST.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.USER_ID) - && payload.has(Constants.STREAM)) { - String id = payload.get(Constants.MEETING_ID).getAsString(); - String userid = payload.get(Constants.USER_ID).getAsString(); - String stream = payload.get(Constants.STREAM).getAsString(); - return new UserUnshareWebcamRequestMessage(id, userid, stream); - } - } - } - } - return null; - - } + public static final String USER_UNSHARE_WEBCAM_REQUEST = "user_unshare_webcam_request_message"; + public static final String VERSION = "0.0.1"; + + public final String meetingId; + public final String userId; + public final String stream; + + public UserUnshareWebcamRequestMessage(String meetingId, String userId, String stream) { + this.meetingId = meetingId; + this.userId = userId; + this.stream = stream; + } + + public String toJson() { + HashMap<String, Object> payload = new HashMap<String, Object>(); + payload.put(Constants.MEETING_ID, meetingId); + payload.put(Constants.USER_ID, userId); + payload.put(Constants.STREAM, stream); + + java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_UNSHARE_WEBCAM_REQUEST, VERSION, null); + + return MessageBuilder.buildJson(header, payload); + } + + public static UserUnshareWebcamRequestMessage fromJson(String message) { + JsonParser parser = new JsonParser(); + JsonObject obj = (JsonObject) parser.parse(message); + + if (obj.has("header") && obj.has("payload")) { + JsonObject header = (JsonObject) obj.get("header"); + JsonObject payload = (JsonObject) obj.get("payload"); + + if (header.has("name")) { + String messageName = header.get("name").getAsString(); + if (USER_UNSHARE_WEBCAM_REQUEST.equals(messageName)) { + if (payload.has(Constants.MEETING_ID) + && payload.has(Constants.USER_ID) + && payload.has(Constants.STREAM)) { + String id = payload.get(Constants.MEETING_ID).getAsString(); + String userid = payload.get(Constants.USER_ID).getAsString(); + String stream = payload.get(Constants.STREAM).getAsString(); + return new UserUnshareWebcamRequestMessage(id, userid, stream); + } + } + } + } + return null; + + } } diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserUnsharedWebcamMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserUnsharedWebcamMessage.java deleted file mode 100755 index 8ae89d0348e8981781f284fd6e2d13cd121f2baf..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserUnsharedWebcamMessage.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class UserUnsharedWebcamMessage implements ISubscribedMessage { - public static final String USER_UNSHARED_WEBCAM = "user_unshared_webcam_message"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final String userId; - public final String stream; - - public UserUnsharedWebcamMessage(String meetingId, String userId, String stream) { - this.meetingId = meetingId; - this.userId = userId; - this.stream = stream; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.USER_ID, userId); - payload.put(Constants.STREAM, stream); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_UNSHARED_WEBCAM, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static UserUnsharedWebcamMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (USER_UNSHARED_WEBCAM.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.USER_ID) - && payload.has(Constants.STREAM)) { - String id = payload.get(Constants.MEETING_ID).getAsString(); - String userid = payload.get(Constants.USER_ID).getAsString(); - String stream = payload.get(Constants.STREAM).getAsString(); - return new UserUnsharedWebcamMessage(id, userid, stream); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserVoiceMutedMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserVoiceMutedMessage.java deleted file mode 100755 index a9942670717d4b2f77811489b56feee430472fe9..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserVoiceMutedMessage.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import java.util.Map; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class UserVoiceMutedMessage implements ISubscribedMessage { - public static final String USER_VOICE_MUTED = "user_voice_muted_message"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final Map<String, Object> user; - public final String voiceConf; - - public UserVoiceMutedMessage(String meetingId, Map<String, Object> user, String voiceConf) { - this.meetingId = meetingId; - this.user = user; - this.voiceConf = voiceConf; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.USER, user); - payload.put(Constants.VOICE_CONF, voiceConf); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_VOICE_MUTED, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static UserVoiceMutedMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (USER_VOICE_MUTED.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.USER)) { - String id = payload.get(Constants.MEETING_ID).getAsString(); - String voiceConf = payload.get(Constants.VOICE_CONF).getAsString(); - - JsonObject user = (JsonObject) payload.get(Constants.USER); - - Util util = new Util(); - Map<String, Object> userMap = util.extractUser(user); - - if (userMap != null) { - return new UserVoiceMutedMessage(id, userMap, voiceConf); - } - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserVoiceTalkingMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserVoiceTalkingMessage.java deleted file mode 100755 index 2445d97e71dd90e8c661782a1c42d46bb1d92b8b..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserVoiceTalkingMessage.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import java.util.Map; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class UserVoiceTalkingMessage implements ISubscribedMessage { - public static final String USER_VOICE_TALKING = "user_voice_talking_message"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final Map<String, Object> user; - public final String voiceConf; - - public UserVoiceTalkingMessage(String meetingId, Map<String, Object> user, String voiceConf) { - this.meetingId = meetingId; - this.user = user; - this.voiceConf = voiceConf; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.USER, user); - payload.put(Constants.VOICE_CONF, voiceConf); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_VOICE_TALKING, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static UserVoiceTalkingMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (USER_VOICE_TALKING.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.USER)) { - String id = payload.get(Constants.MEETING_ID).getAsString(); - String voiceConf = payload.get(Constants.VOICE_CONF).getAsString(); - - JsonObject user = (JsonObject) payload.get(Constants.USER); - - Util util = new Util(); - Map<String, Object> userMap = util.extractUser(user); - - if (userMap != null) { - return new UserVoiceTalkingMessage(id, userMap, voiceConf); - } - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserVotedPollMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserVotedPollMessage.java deleted file mode 100755 index 2b9804872688b8a8f3885c78a2f787e20d3924ec..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserVotedPollMessage.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import java.util.Map; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class UserVotedPollMessage implements ISubscribedMessage { - public static final String USER_VOTED_POLL = "user_voted_poll_message"; - public static final String VERSION = "0.0.1"; - - public static final String MEETING_ID = "meeting_id"; - public static final String PRESENTER_ID = "presenter_id"; - public static final String POLL = "poll"; - - public final String meetingId; - public final String presenterId; - public final Map<String, Object> poll; - - public UserVotedPollMessage(String meetingId, String presenterId, Map<String, Object> poll) { - this.meetingId = meetingId; - this.presenterId = presenterId; - this.poll = poll; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(MEETING_ID, meetingId); - payload.put(PRESENTER_ID, presenterId); - payload.put(POLL, poll); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_VOTED_POLL, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static UserVotedPollMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (USER_VOTED_POLL.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(PRESENTER_ID) - && payload.has(POLL)) { - String id = payload.get(Constants.MEETING_ID).getAsString(); - String presenterId = payload.get(PRESENTER_ID).getAsString(); - - JsonObject poll = payload.get(POLL).getAsJsonObject(); - - Util util = new Util(); - Map<String, Object> pollMap = util.decodeSimplePollResult(poll); - - return new UserVotedPollMessage(id, presenterId, pollMap); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/Util.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/Util.java index 975c36f5fd093b2e4df676198501f9b6ada439bb..7ea654f6f751ebfc2d4070b295fe9a226c39bc5b 100755 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/Util.java +++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/Util.java @@ -10,121 +10,6 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; public class Util { - public Map<String, Boolean> extractPermission(JsonObject vu) { - if (vu.has(Constants.PERM_DISABLE_CAM) && vu.has(Constants.PERM_DISABLE_MIC) - && vu.has(Constants.PERM_DISABLE_PRIVCHAT) && vu.has(Constants.PERM_DISABLE_PUBCHAT) - && vu.has(Constants.PERM_LOCKED_LAYOUT) && vu.has(Constants.PERM_LOCK_ON_JOIN) - && vu.has(Constants.PERM_LOCK_ON_JOIN_CONFIG)){ - - Map<String, Boolean> vuMap = new HashMap<String, Boolean>(); - Boolean disableCam = vu.get(Constants.PERM_DISABLE_CAM).getAsBoolean(); - Boolean disableMic = vu.get(Constants.PERM_DISABLE_MIC).getAsBoolean(); - Boolean disablePrivChat = vu.get(Constants.PERM_DISABLE_PRIVCHAT).getAsBoolean(); - Boolean disablePubChat = vu.get(Constants.PERM_DISABLE_PUBCHAT).getAsBoolean(); - Boolean lockedLayout = vu.get(Constants.PERM_LOCKED_LAYOUT).getAsBoolean(); - Boolean lockOnJoin = vu.get(Constants.PERM_LOCK_ON_JOIN).getAsBoolean(); - Boolean lockOnJoinConfig = vu.get(Constants.PERM_LOCK_ON_JOIN_CONFIG).getAsBoolean(); - - vuMap.put(Constants.PERM_DISABLE_CAM, disableCam); - vuMap.put(Constants.PERM_DISABLE_MIC, disableMic); - vuMap.put(Constants.PERM_DISABLE_PRIVCHAT, disablePrivChat); - vuMap.put(Constants.PERM_DISABLE_PUBCHAT, disablePubChat); - vuMap.put(Constants.PERM_LOCKED_LAYOUT, lockedLayout); - vuMap.put(Constants.PERM_LOCK_ON_JOIN, lockOnJoin); - vuMap.put(Constants.PERM_LOCK_ON_JOIN_CONFIG, lockOnJoinConfig); - - return vuMap; - } - return null; - } - - public Map<String, Object> extractVoiceUser(JsonObject vu) { - if (vu.has(Constants.TALKING) && vu.has(Constants.LOCKED) - && vu.has(Constants.MUTED) && vu.has(Constants.JOINED) - && vu.has(Constants.CALLERNAME) && vu.has(Constants.CALLERNUM) - && vu.has(Constants.WEB_USERID) && vu.has(Constants.USER_ID)){ - - Map<String, Object> vuMap = new HashMap<String, Object>(); - Boolean talking = vu.get(Constants.TALKING).getAsBoolean(); - Boolean voiceLocked = vu.get(Constants.LOCKED).getAsBoolean(); - Boolean muted = vu.get(Constants.MUTED).getAsBoolean(); - Boolean joined = vu.get(Constants.JOINED).getAsBoolean(); - String callername = vu.get(Constants.CALLERNAME).getAsString(); - String callernum = vu.get(Constants.CALLERNUM).getAsString(); - String webUserId = vu.get(Constants.WEB_USERID).getAsString(); - String voiceUserId = vu.get(Constants.USER_ID).getAsString(); - - vuMap.put("talking", talking); - vuMap.put("locked", voiceLocked); - vuMap.put("muted", muted); - vuMap.put("joined", joined); - vuMap.put("callerName", callername); - vuMap.put("callerNum", callernum); - vuMap.put("webUserId", webUserId); - vuMap.put("userId", voiceUserId); - - return vuMap; - } - return null; - } - - public Map<String, Object> extractUser(JsonObject user) { - if (user.has(Constants.USER_ID) && user.has(Constants.NAME) - && user.has(Constants.HAS_STREAM) && user.has(Constants.LISTENONLY) - && user.has(Constants.EMOJI_STATUS) && user.has(Constants.PHONE_USER) - && user.has(Constants.PRESENTER) && user.has(Constants.LOCKED) - && user.has(Constants.EXTERN_USERID) && user.has(Constants.ROLE) - && user.has(Constants.VOICEUSER) && user.has(Constants.WEBCAM_STREAM) - && user.has(Constants.GUEST) && user.has(Constants.WAITING_FOR_ACCEPTANCE)){ - - Map<String, Object> userMap = new HashMap<String, Object>(); - - String userid = user.get(Constants.USER_ID).getAsString(); - String username = user.get(Constants.NAME).getAsString(); - Boolean hasStream = user.get(Constants.HAS_STREAM).getAsBoolean(); - Boolean listenOnly = user.get(Constants.LISTENONLY).getAsBoolean(); - String emojiStatus = user.get(Constants.EMOJI_STATUS).getAsString(); - Boolean phoneUser = user.get(Constants.PHONE_USER).getAsBoolean(); - Boolean presenter = user.get(Constants.PRESENTER).getAsBoolean(); - Boolean locked = user.get(Constants.LOCKED).getAsBoolean(); - String extUserId = user.get(Constants.EXTERN_USERID).getAsString(); - String role = user.get(Constants.ROLE).getAsString(); - String avatarURL = user.get(Constants.AVATAR_URL).getAsString(); - Boolean guest = user.get(Constants.GUEST).getAsBoolean(); - Boolean waitingForAcceptance = user.get(Constants.WAITING_FOR_ACCEPTANCE).getAsBoolean(); - - JsonArray webcamStreamJArray = user.get(Constants.WEBCAM_STREAM).getAsJsonArray(); - ArrayList<String> webcamStreams = extractWebcamStreams(webcamStreamJArray); - - userMap.put("userId", userid); - userMap.put("name", username); - userMap.put("listenOnly", listenOnly); - userMap.put("hasStream", hasStream); - userMap.put("webcamStream", webcamStreams); - userMap.put("emojiStatus", emojiStatus); - userMap.put("externUserID", extUserId); - userMap.put("phoneUser", phoneUser); - userMap.put("locked", locked); - userMap.put("role", role); - userMap.put("guest", guest); - userMap.put("waitingForAcceptance", waitingForAcceptance); - userMap.put("presenter", presenter); - userMap.put("avatarURL", avatarURL); - - JsonObject vu = (JsonObject) user.get(Constants.VOICEUSER); - - Map<String, Object> vuMap = extractVoiceUser(vu); - if (vuMap != null) { - userMap.put("voiceUser", vuMap); - return userMap; - } - } - - return null; - - } - - public ArrayList<String> extractStuns(JsonArray stunsArray) { ArrayList<String> collection = new ArrayList<String>(); Iterator<JsonElement> stunIter = stunsArray.iterator(); @@ -170,600 +55,6 @@ public class Util { return null; } - public ArrayList<Map<String, Object>> extractUsers(JsonArray users) { - ArrayList<Map<String, Object>> collection = new ArrayList<Map<String, Object>>(); - - Iterator<JsonElement> usersIter = users.iterator(); - while (usersIter.hasNext()){ - JsonElement user = usersIter.next(); - Map<String, Object> userMap = extractUser((JsonObject)user); - if (userMap != null) { - collection.add(userMap); - } - } - - return collection; - - } - - public ArrayList<String> extractWebcamStreams(JsonArray webcamStreams) { - ArrayList<String> collection = new ArrayList<String>(); - - Iterator<JsonElement> webcamStreamsIter = webcamStreams.iterator(); - while (webcamStreamsIter.hasNext()){ - JsonElement stream = webcamStreamsIter.next(); - collection.add(stream.getAsString()); - } - - return collection; - - } - - public ArrayList<String> extractUserids(JsonArray users) { - ArrayList<String> collection = new ArrayList<String>(); - - Iterator<JsonElement> usersIter = users.iterator(); - while (usersIter.hasNext()){ - JsonElement user = usersIter.next(); - collection.add(user.getAsString()); - } - - return collection; - - } - - - - public Map<String, Object> extractAnnotation(JsonObject annotationElement) { - //NON-TEXT SHAPE - if (annotationElement.has(Constants.ID) - && annotationElement.has("transparency") - && annotationElement.has("color") - && annotationElement.has("status") - && annotationElement.has("whiteboardId") - && annotationElement.has("type") - && annotationElement.has("thickness") - && annotationElement.has("points")){ - - Map<String, Object> finalAnnotation = new HashMap<String, Object>(); - - boolean transparency = annotationElement.get("transparency").getAsBoolean(); - String id = annotationElement.get(Constants.ID).getAsString(); - int color = annotationElement.get("color").getAsInt(); - String status = annotationElement.get(Constants.STATUS).getAsString(); - String whiteboardId = annotationElement.get("whiteboardId").getAsString(); - Float thickness = annotationElement.get("thickness").getAsFloat(); - String type = annotationElement.get("type").getAsString(); - - JsonArray pointsJsonArray = annotationElement.get("points").getAsJsonArray(); - - ArrayList<Float> pointsArray = new ArrayList<Float>(); - Iterator<JsonElement> pointIter = pointsJsonArray.iterator(); - while (pointIter.hasNext()){ - JsonElement p = pointIter.next(); - Float pf = p.getAsFloat(); - if (pf != null) { - pointsArray.add(pf); - } - } - - //the final pencil annotation has a commands property - if (annotationElement.has("commands")) { - JsonArray commandsJsonArray = annotationElement.get("commands").getAsJsonArray(); - ArrayList<Integer> commandsArray = new ArrayList<Integer>(); - Iterator<JsonElement> commandIter = commandsJsonArray.iterator(); - while (commandIter.hasNext()){ - JsonElement p = commandIter.next(); - Integer ci = p.getAsInt(); - if (ci != null) { - commandsArray.add(ci); - } - } - finalAnnotation.put("commands", commandsArray); - } - - finalAnnotation.put("transparency", transparency); - finalAnnotation.put(Constants.ID, id); - finalAnnotation.put("color", color); - finalAnnotation.put("status", status); - finalAnnotation.put("whiteboardId", whiteboardId); - finalAnnotation.put("thickness", thickness); - finalAnnotation.put("points", pointsArray); - finalAnnotation.put("type", type); - - return finalAnnotation; - } - - // TEXT SHAPE - else if (annotationElement.has(Constants.ID) - && annotationElement.has("text") - && annotationElement.has("fontColor") - && annotationElement.has("status") - && annotationElement.has("textBoxWidth") - && annotationElement.has("fontSize") - && annotationElement.has("type") - && annotationElement.has("calcedFontSize") - && annotationElement.has("textBoxHeight") - && annotationElement.has("calcedFontSize") - && annotationElement.has("whiteboardId") - && annotationElement.has("dataPoints") - && annotationElement.has("x") - && annotationElement.has("y")){ - - Map<String, Object> finalAnnotation = new HashMap<String, Object>(); - - String text = annotationElement.get("text").getAsString(); - int fontColor = annotationElement.get("fontColor").getAsInt(); - String status = annotationElement.get(Constants.STATUS).getAsString(); - Float textBoxWidth = annotationElement.get("textBoxWidth").getAsFloat(); - int fontSize = annotationElement.get("fontSize").getAsInt(); - String type = annotationElement.get("type").getAsString(); - Float calcedFontSize = annotationElement.get("calcedFontSize").getAsFloat(); - Float textBoxHeight = annotationElement.get("textBoxHeight").getAsFloat(); - String id = annotationElement.get(Constants.ID).getAsString(); - String whiteboardId = annotationElement.get("whiteboardId").getAsString(); - Float x = annotationElement.get("x").getAsFloat(); - Float y = annotationElement.get("y").getAsFloat(); - String dataPoints = annotationElement.get("dataPoints").getAsString(); - - finalAnnotation.put("text", text); - finalAnnotation.put("fontColor", fontColor); - finalAnnotation.put(Constants.STATUS, status); - finalAnnotation.put("textBoxWidth", textBoxWidth); - finalAnnotation.put("fontSize", fontSize); - finalAnnotation.put("type", type); - finalAnnotation.put("calcedFontSize", calcedFontSize); - finalAnnotation.put("textBoxHeight", textBoxHeight); - finalAnnotation.put(Constants.ID, id); - finalAnnotation.put("whiteboardId", whiteboardId); - finalAnnotation.put("x", x); - finalAnnotation.put("y", y); - finalAnnotation.put("dataPoints", dataPoints); - - return finalAnnotation; - } - return null; - } - - public Map<String, Object> extractCurrentPresenter(JsonObject vu) { - if (vu.has(Constants.USER_ID) && vu.has(Constants.NAME) - && vu.has(Constants.ASSIGNED_BY)){ - - Map<String, Object> vuMap = new HashMap<String, Object>(); - String presenterUserId = vu.get(Constants.USER_ID).getAsString(); - String presenterName = vu.get(Constants.NAME).getAsString(); - String assignedBy = vu.get(Constants.ASSIGNED_BY).getAsString(); - - vuMap.put("userId", presenterUserId); - vuMap.put("name", presenterName); - vuMap.put("assignedBy", assignedBy); - - return vuMap; - } - return null; - } - - - public ArrayList<Map<String, Object>> extractPresentationPages(JsonArray pagesArray) { - ArrayList<Map<String, Object>> pages = new ArrayList<Map<String, Object>>(); - - Iterator<JsonElement> pagesIter = pagesArray.iterator(); - while (pagesIter.hasNext()){ - JsonObject pageObj = (JsonObject)pagesIter.next(); - if (pageObj.has("id") && pageObj.has("num") - && pageObj.has("thumb_uri") && pageObj.has("swf_uri") - && pageObj.has("txt_uri") && pageObj.has("svg_uri") - && pageObj.has("current") && pageObj.has("x_offset") - && pageObj.has("y_offset") && pageObj.has("width_ratio") - && pageObj.has("height_ratio")) { - - Map<String, Object> page = new HashMap<String, Object>(); - - String pageId = pageObj.get("id").getAsString(); - Integer pageNum = pageObj.get("num").getAsInt(); - String pageThumbUri = pageObj.get("thumb_uri").getAsString(); - String pageSwfUri = pageObj.get("swf_uri").getAsString(); - String pageTxtUri = pageObj.get("txt_uri").getAsString(); - String pageSvgUri = pageObj.get("svg_uri").getAsString(); - - Boolean currentPage = pageObj.get("current").getAsBoolean(); - Double xOffset = pageObj.get("x_offset").getAsDouble(); - Double yOffset = pageObj.get("y_offset").getAsDouble(); - Double widthRatio = pageObj.get("width_ratio").getAsDouble(); - Double heightRatio = pageObj.get("height_ratio").getAsDouble(); - - page.put("id", pageId); - page.put("num", pageNum); - page.put("thumbUri", pageThumbUri); - page.put("swfUri", pageSwfUri); - page.put("txtUri", pageTxtUri); - page.put("svgUri", pageSvgUri); - page.put("current", currentPage); - page.put("xOffset", xOffset); - page.put("yOffset", yOffset); - page.put("widthRatio", widthRatio); - page.put("heightRatio", heightRatio); - - pages.add(page); - } - } - return pages; - } - - public ArrayList<Map<String, Object>> extractPresentations(JsonArray presArray) { - ArrayList<Map<String, Object>> presentations = new ArrayList<Map<String, Object>>(); - - Iterator<JsonElement> presentationsIter = presArray.iterator(); - while (presentationsIter.hasNext()){ - JsonObject presObj = (JsonObject)presentationsIter.next(); - presentations.add(extractPresentation(presObj)); - } - return presentations; - } - - public Map<String, Object> extractPresentation(JsonObject presObj) { - if (presObj.has(Constants.ID) && presObj.has(Constants.NAME) - && presObj.has(Constants.CURRENT) && presObj.has(Constants.PAGES) - && presObj.has(Constants.DOWNLOADABLE)) { - Map<String, Object> pres = new HashMap<String, Object>(); - - String presId = presObj.get(Constants.ID).getAsString(); - String presName = presObj.get(Constants.NAME).getAsString(); - Boolean currentPres = presObj.get(Constants.CURRENT).getAsBoolean(); - Boolean downloadable = presObj.get(Constants.DOWNLOADABLE).getAsBoolean(); - - pres.put("id", presId); - pres.put("name", presName); - pres.put("current", currentPres); - pres.put("downloadable", downloadable); - - JsonArray pagesJsonArray = presObj.get(Constants.PAGES).getAsJsonArray(); - - ArrayList<Map<String, Object>> pages = extractPresentationPages(pagesJsonArray); - // store the pages in the presentation - pres.put(Constants.PAGES, pages); - - // add this presentation into our presentations list - return pres; - } - return null; - } - - public ArrayList<Map<String, Object>> extractShapes(JsonArray shapes) { - ArrayList<Map<String, Object>> collection = new ArrayList<Map<String, Object>>(); - - Iterator<JsonElement> shapesIter = shapes.iterator(); - while (shapesIter.hasNext()){ - JsonElement shape = shapesIter.next(); - - Map<String, Object> shapeMap = extractOuterAnnotation((JsonObject)shape); - - if (shapeMap != null) { - collection.add(shapeMap); - } - } - return collection; - } - - public Map<String, Object> extractPollResultAnnotation(JsonObject annotationElement) { - if (annotationElement.has("result") && annotationElement.has("whiteboardId") - && annotationElement.has("points")) { - Map<String, Object> finalAnnotation = new HashMap<String, Object>(); - - String whiteboardId = annotationElement.get("whiteboardId").getAsString(); - Integer numRespondents = annotationElement.get(NUM_RESPONDENTS).getAsInt(); - Integer numResponders = annotationElement.get(NUM_RESPONDERS).getAsInt(); - - String resultJson = annotationElement.get("result").getAsString(); - JsonParser parser = new JsonParser(); - JsonArray resultJsonArray = parser.parse(resultJson).getAsJsonArray(); - - ArrayList<Map<String, Object>> collection = new ArrayList<Map<String, Object>>(); - Iterator<JsonElement> resultIter = resultJsonArray.iterator(); - - while (resultIter.hasNext()){ - JsonObject p = (JsonObject)resultIter.next(); - Map<String, Object> vote = new HashMap<String, Object>(); - Integer vid = p.get("id").getAsInt(); - Integer vvotes = p.get("num_votes").getAsInt(); - String vkey = p.get("key").getAsString(); - vote.put("id", vid); - vote.put("num_votes", vvotes); - vote.put("key", vkey); - - collection.add(vote); - } - - JsonArray pointsJsonArray = annotationElement.get("points").getAsJsonArray(); - ArrayList<Float> pointsArray = new ArrayList<Float>(); - Iterator<JsonElement> pointIter = pointsJsonArray.iterator(); - while (pointIter.hasNext()){ - JsonElement p = pointIter.next(); - Float pf = p.getAsFloat(); - if (pf != null) { - pointsArray.add(pf); - } - } - - finalAnnotation.put("whiteboardId", whiteboardId); - finalAnnotation.put(NUM_RESPONDENTS, numRespondents); - finalAnnotation.put(NUM_RESPONDERS, numResponders); - finalAnnotation.put("result", collection); - finalAnnotation.put("points", pointsArray); - - return finalAnnotation; - } - return null; - } - - public Map<String, Object> extractOuterAnnotation(JsonObject annotationElement) { - - if (annotationElement.has(Constants.ID) - && annotationElement.has("shape") - && annotationElement.has("status") - && annotationElement.has("shape_type") - && annotationElement.has("user_id")){ - - Map<String, Object> finalAnnotation = new HashMap<String, Object>(); - - String id = annotationElement.get(Constants.ID).getAsString(); - String status = annotationElement.get("status").getAsString(); - String type = annotationElement.get("shape_type").getAsString(); - String userId = annotationElement.get("user_id").getAsString(); - - finalAnnotation.put(Constants.ID, id); - finalAnnotation.put("type", type); - finalAnnotation.put("status", status); - finalAnnotation.put("userId", userId); - - JsonElement shape = annotationElement.get("shape"); - Map<String, Object> shapesMap; - - if (type.equals("poll_result")) { - shapesMap = extractPollResultAnnotation((JsonObject)shape); - } else { - shapesMap = extractAnnotation((JsonObject)shape); - } - - if (shapesMap != null) { - finalAnnotation.put("shapes", shapesMap); - } - - return finalAnnotation; - } - - return null; - } - - public ArrayList<Map<String, Object>> extractPages(JsonArray pages) { - ArrayList<Map<String, Object>> collection = new ArrayList<Map<String, Object>>(); - - Iterator<JsonElement> pagesIter = pages.iterator(); - while (pagesIter.hasNext()){ - JsonElement page = pagesIter.next(); - - Map<String, Object> pageMap = extractPage((JsonObject)page); - if (pageMap != null) { - collection.add(pageMap); - } - } - return collection; - } - - public Map<String, Object> extractPage(JsonObject page) { - - final String WIDTH_RATIO = "width_ratio"; - final String Y_OFFSET = "y_offset"; - final String NUM = "num"; - final String HEIGHT_RATIO = "height_ratio"; - final String X_OFFSET = "x_offset"; - final String SVG_URI = "svg_uri"; - final String THUMB_URI = "thumb_uri"; - final String TXT_URI = "txt_uri"; - final String CURRENT = "current"; - final String SWF_URI = "swf_uri"; - - if (page.has(Constants.ID) - && page.has(WIDTH_RATIO) - && page.has(Y_OFFSET) - && page.has(NUM) - && page.has(HEIGHT_RATIO) - && page.has(X_OFFSET) - && page.has(SVG_URI) - && page.has(THUMB_URI) - && page.has(CURRENT) - && page.has(TXT_URI) - && page.has(SWF_URI)){ - - Map<String, Object> finalPage = new HashMap<String, Object>(); - - String id = page.get(Constants.ID).getAsString(); - double widthRatio = page.get(WIDTH_RATIO).getAsDouble(); - double yOffset = page.get(Y_OFFSET).getAsDouble(); - double num = page.get(NUM).getAsDouble(); - double heightRatio = page.get(HEIGHT_RATIO).getAsDouble(); - double xOffset = page.get(X_OFFSET).getAsDouble(); - String svgUri = page.get(SVG_URI).getAsString(); - String thumbUri = page.get(THUMB_URI).getAsString(); - boolean current = page.get(CURRENT).getAsBoolean(); - String txtUri = page.get(TXT_URI).getAsString(); - String swfUri = page.get(SWF_URI).getAsString(); - - finalPage.put(Constants.ID, id); - finalPage.put(WIDTH_RATIO, widthRatio); - finalPage.put(Y_OFFSET, yOffset); - finalPage.put(NUM, num); - finalPage.put(HEIGHT_RATIO, heightRatio); - finalPage.put(X_OFFSET, xOffset); - finalPage.put(SVG_URI, svgUri); - finalPage.put(THUMB_URI, thumbUri); - finalPage.put(CURRENT, current); - finalPage.put(TXT_URI, txtUri); - finalPage.put(SWF_URI, swfUri); - - return finalPage; - } - - return null; - } - - public Map<String, Object> decodeSimplePollAnswer(JsonObject answer) { - Map<String, Object> answerMap = new HashMap<String, Object>(); - if (answer.has(Constants.ID) && answer.has(KEY)) { - String id = answer.get(Constants.ID).getAsString(); - String key = answer.get(KEY).getAsString(); - - answerMap.put(Constants.ID, id); - answerMap.put(KEY, key); - } - - - return answerMap; - } - - public static final String ANSWERS = "answers"; - public static final String KEY = "key"; - public static final String NUM_VOTES = "num_votes"; - public static final String NUM_RESPONDERS = "num_responders"; - public static final String NUM_RESPONDENTS = "num_respondents"; - - public Map<String, Object> decodeSimplePoll(JsonObject poll) { - Map<String, Object> pollMap = new HashMap<String, Object>(); - - if (poll.has(Constants.ID) && poll.has(ANSWERS)) { - String id = poll.get(Constants.ID).getAsString(); - JsonArray answers = poll.get(ANSWERS).getAsJsonArray(); - - ArrayList<Map<String, Object>> collection = new ArrayList<Map<String, Object>>(); - - Iterator<JsonElement> answersIter = answers.iterator(); - while (answersIter.hasNext()){ - JsonElement qElem = answersIter.next(); - - Map<String, Object> answerMap = decodeSimplePollAnswer((JsonObject)qElem); - - if (answerMap != null) { - collection.add(answerMap); - } - } - - pollMap.put(Constants.ID, id); - pollMap.put(ANSWERS, collection); - } - - - return pollMap; - } - - public Map<String, Object> decodeSimplePollAnswerVote(JsonObject answer) { - Map<String, Object> answerMap = new HashMap<String, Object>(); - if (answer.has(Constants.ID) && answer.has(KEY)) { - String id = answer.get(Constants.ID).getAsString(); - String key = answer.get(KEY).getAsString(); - Integer numVotes = answer.get(NUM_VOTES).getAsInt(); - - answerMap.put(Constants.ID, id); - answerMap.put(KEY, key); - answerMap.put(NUM_VOTES, numVotes); - } - - return answerMap; - } - public Map<String, Object> decodeSimplePollResult(JsonObject poll) { - Map<String, Object> pollMap = new HashMap<String, Object>(); - - if (poll.has(Constants.ID) && poll.has(ANSWERS)) { - String id = poll.get(Constants.ID).getAsString(); - Integer numRespondents = poll.get(NUM_RESPONDENTS).getAsInt(); - Integer numResponders = poll.get(NUM_RESPONDERS).getAsInt(); - - JsonArray answers = poll.get(ANSWERS).getAsJsonArray(); - - ArrayList<Map<String, Object>> collection = new ArrayList<Map<String, Object>>(); - - Iterator<JsonElement> answersIter = answers.iterator(); - while (answersIter.hasNext()){ - JsonElement qElem = answersIter.next(); - - Map<String, Object> answerMap = decodeSimplePollAnswerVote((JsonObject)qElem); - - if (answerMap != null) { - collection.add(answerMap); - } - } - - pollMap.put(Constants.ID, id); - pollMap.put(NUM_RESPONDENTS, numRespondents); - pollMap.put(NUM_RESPONDERS, numResponders); - pollMap.put(ANSWERS, collection); - } - - - return pollMap; - } - - public Map<String, String[]> extractCaptionHistory(JsonObject history) { - Map<String, String[]> collection = new HashMap<String, String[]>(); - - for (Map.Entry<String,JsonElement> entry : history.entrySet()) { - String locale = entry.getKey(); - JsonArray values = entry.getValue().getAsJsonArray(); - String[] localeValueArray = new String[3]; - - int i = 0; - Iterator<JsonElement> valuesIter = values.iterator(); - while (valuesIter.hasNext()){ - String element = valuesIter.next().getAsString(); - - localeValueArray[i++] = element; - } - - collection.put(locale, localeValueArray); - } - - return collection; - } - - class Note { - String name = ""; - String document = ""; - Integer patchCounter = 0; - Boolean undo = false; - Boolean redo = false; - - public Note(String name, String document, Integer patchCounter, Boolean undo, Boolean redo) { - this.name = name; - this.document = document; - this.patchCounter = patchCounter; - this.undo = undo; - this.redo = redo; - } - } - - public Object extractNote(JsonObject noteObject) { - String name = noteObject.get("name").getAsString(); - String document = noteObject.get("document").getAsString(); - Integer patchCounter = noteObject.get("patchCounter").getAsInt(); - Boolean undo = noteObject.get("undo").getAsBoolean(); - Boolean redo = noteObject.get("redo").getAsBoolean(); - - Note note = new Note(name, document, patchCounter, undo, redo); - - return (Object) note; - } - - public Map<String, Object> extractNotes(JsonObject notes) { - Map<String, Object> notesMap = new HashMap<String, Object>(); - - for (Map.Entry<String, JsonElement> entry : notes.entrySet()) { - JsonObject obj = entry.getValue().getAsJsonObject(); - Object note = extractNote(obj); - notesMap.put(entry.getKey(), note); - } - - return notesMap; - } - public Map<String, String> extractMetadata(JsonObject metadata) { Map<String, String> metadataMap = new HashMap<String, String>(); diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ValidateAuthTokenMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ValidateAuthTokenMessage.java deleted file mode 100755 index 997e940b4bc0ef6f9cd769d7f9d87ab08e9fdf33..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ValidateAuthTokenMessage.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class ValidateAuthTokenMessage implements IBigBlueButtonMessage { - public static final String VALIDATE_AUTH_TOKEN = "validate_auth_token"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final String userId; - public final String token; - public final String replyTo; - public final String sessionId; - - public ValidateAuthTokenMessage(String meetingId, String userId, String token, String replyTo, String sessionId) { - this.meetingId = meetingId; - this.userId = userId; - this.token = token; - this.replyTo = replyTo; - this.sessionId = sessionId; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.USER_ID, userId); - payload.put(Constants.AUTH_TOKEN, token); - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(VALIDATE_AUTH_TOKEN, VERSION, replyTo); - - return MessageBuilder.buildJson(header, payload); - } - - public static ValidateAuthTokenMessage fromJson(String message) { - - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (VALIDATE_AUTH_TOKEN.equals(messageName)) { - - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.USER_ID) - && payload.has(Constants.AUTH_TOKEN) - && header.has(Constants.REPLY_TO)) { - - String id = payload.get(Constants.MEETING_ID).getAsString(); - String userid = payload.get(Constants.USER_ID).getAsString(); - String authToken = payload.get(Constants.AUTH_TOKEN).getAsString(); - String replyTo = header.get(Constants.REPLY_TO).getAsString(); - String sessionId = "tobeimplemented"; - return new ValidateAuthTokenMessage(id, userid, authToken, replyTo, - sessionId); - } - } - } - } - - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ValidateAuthTokenReplyMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ValidateAuthTokenReplyMessage.java deleted file mode 100755 index 01b16000e9583f5f919075396bf3030682cccbc6..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ValidateAuthTokenReplyMessage.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class ValidateAuthTokenReplyMessage implements ISubscribedMessage { - public static final String VALIDATE_AUTH_TOKEN_REPLY = "validate_auth_token_reply"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final String userId; - public final String token; - public final String replyTo; - public final Boolean valid; - - public ValidateAuthTokenReplyMessage(String meetingId, String userId, String token, - Boolean valid, String replyTo) { - this.meetingId = meetingId; - this.userId = userId; - this.token = token; - this.replyTo = replyTo; - this.valid = valid; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.REPLY_TO, replyTo); - payload.put(Constants.VALID, valid); - payload.put(Constants.USER_ID, userId); - payload.put(Constants.AUTH_TOKEN, token); - payload.put(Constants.MEETING_ID, meetingId); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(VALIDATE_AUTH_TOKEN_REPLY, VERSION, replyTo); - - return MessageBuilder.buildJson(header, payload); - } - - public static ValidateAuthTokenReplyMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (VALIDATE_AUTH_TOKEN_REPLY.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.USER_ID) - && payload.has(Constants.AUTH_TOKEN) - && payload.has(Constants.VALID) - && payload.has(Constants.REPLY_TO)) { - String id = payload.get(Constants.MEETING_ID).getAsString(); - String userid = payload.get(Constants.USER_ID).getAsString(); - String authToken = payload.get(Constants.AUTH_TOKEN).getAsString(); - String replyTo = payload.get(Constants.REPLY_TO).getAsString(); - Boolean valid = payload.get(Constants.VALID).getAsBoolean(); - return new ValidateAuthTokenReplyMessage(id, userid, authToken, valid, replyTo); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ValidateAuthTokenTimeoutMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ValidateAuthTokenTimeoutMessage.java deleted file mode 100755 index f8fdd31f545a1f40519db844ce4a54f0b839d721..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ValidateAuthTokenTimeoutMessage.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class ValidateAuthTokenTimeoutMessage implements ISubscribedMessage { - public static final String VALIDATE_AUTH_TOKEN_TIMEOUT = "validate_auth_token_timeout"; - public static final String VERSION = "0.0.1"; - - public final String meetingId; - public final String userId; - public final String token; - public final String replyTo; - public final Boolean valid; - - public ValidateAuthTokenTimeoutMessage(String meetingId, String userId, String token, - Boolean valid, String replyTo) { - this.meetingId = meetingId; - this.userId = userId; - this.token = token; - this.replyTo = replyTo; - this.valid = valid; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.REPLY_TO, replyTo); - payload.put(Constants.VALID, valid); - payload.put(Constants.USER_ID, userId); - payload.put(Constants.AUTH_TOKEN, token); - payload.put(Constants.MEETING_ID, meetingId); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(VALIDATE_AUTH_TOKEN_TIMEOUT, VERSION, replyTo); - - return MessageBuilder.buildJson(header, payload); - } - - public static ValidateAuthTokenTimeoutMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (VALIDATE_AUTH_TOKEN_TIMEOUT.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.USER_ID) - && payload.has(Constants.AUTH_TOKEN) - && payload.has(Constants.VALID) - && payload.has(Constants.REPLY_TO)) { - String id = payload.get(Constants.MEETING_ID).getAsString(); - String userid = payload.get(Constants.USER_ID).getAsString(); - String authToken = payload.get(Constants.AUTH_TOKEN).getAsString(); - String replyTo = payload.get(Constants.REPLY_TO).getAsString(); - Boolean valid = payload.get(Constants.VALID).getAsBoolean(); - return new ValidateAuthTokenTimeoutMessage(id, userid, authToken, valid, replyTo); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/VoiceConfRecordingStartedMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/VoiceConfRecordingStartedMessage.java deleted file mode 100755 index 6bd2dd455c55b8c9af0fbccbb8103aedb5a89c30..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/VoiceConfRecordingStartedMessage.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class VoiceConfRecordingStartedMessage { - public static final String VOICE_CONF_RECORDING_STARTED = "voice_conf_recording_started_message"; - public static final String VERSION = "0.0.1"; - - public static final String VOICE_CONF_ID = "voice_conf_id"; - public static final String RECORD_STREAM = "record_stream"; - public static final String RECORDING = "recording"; - public static final String TIMESTAMP = "timestamp"; - - public final String voiceConfId; - public final String recordStream; - public final Boolean recording; - public final String timestamp; - - public VoiceConfRecordingStartedMessage(String voiceConfId, - String recordStream, Boolean recording, String timestamp) { - this.voiceConfId = voiceConfId; - this.recordStream = recordStream; - this.recording = recording; - this.timestamp = timestamp; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(VOICE_CONF_ID, voiceConfId); - payload.put(RECORD_STREAM, recordStream); - payload.put(RECORDING, recording); - payload.put(TIMESTAMP, timestamp); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(VOICE_CONF_RECORDING_STARTED, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static VoiceConfRecordingStartedMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (VOICE_CONF_RECORDING_STARTED.equals(messageName)) { - if (payload.has(VOICE_CONF_ID) - && payload.has(RECORD_STREAM) - && payload.has(RECORDING) - && payload.has(TIMESTAMP)) { - String voiceConfId = payload.get(VOICE_CONF_ID).getAsString(); - String recordStream = payload.get(RECORD_STREAM).getAsString(); - Boolean recording = payload.get(RECORDING).getAsBoolean(); - String timestamp = payload.get(TIMESTAMP).getAsString(); - return new VoiceConfRecordingStartedMessage(voiceConfId, recordStream, recording, timestamp); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/VotePollUserRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/VotePollUserRequestMessage.java deleted file mode 100755 index 79f52d771812987fddd01404dfb7c1956ce44496..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/VotePollUserRequestMessage.java +++ /dev/null @@ -1,75 +0,0 @@ -package org.bigbluebutton.common.messages; - -import java.util.HashMap; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - - -public class VotePollUserRequestMessage implements ISubscribedMessage { - public static final String VOTE_POLL_REQUEST = "vote_poll_user_request_message"; - public static final String VERSION = "0.0.1"; - - public static final String MEETING_ID = "meeting_id"; - public static final String USER_ID = "user_id"; - public static final String POLL_ID = "poll_id"; - public static final String QUESTION_ID = "question_id"; - public static final String ANSWER_ID = "answer_id"; - - public final String meetingId; - public final String userId; - public final String pollId; - public final Integer questionId; - public final Integer answerId; - - public VotePollUserRequestMessage(String meetingId, String userId, String pollId, Integer questionId, Integer answerId) { - this.meetingId = meetingId; - this.userId = userId; - this.pollId = pollId; - this.questionId = questionId; - this.answerId = answerId; - } - - public String toJson() { - HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(MEETING_ID, meetingId); - payload.put(USER_ID, userId); - payload.put(POLL_ID, pollId); - payload.put(QUESTION_ID, questionId); - payload.put(ANSWER_ID, answerId); - - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(VOTE_POLL_REQUEST, VERSION, null); - - return MessageBuilder.buildJson(header, payload); - } - - public static VotePollUserRequestMessage fromJson(String message) { - JsonParser parser = new JsonParser(); - JsonObject obj = (JsonObject) parser.parse(message); - - if (obj.has("header") && obj.has("payload")) { - JsonObject header = (JsonObject) obj.get("header"); - JsonObject payload = (JsonObject) obj.get("payload"); - - if (header.has("name")) { - String messageName = header.get("name").getAsString(); - if (VOTE_POLL_REQUEST.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(USER_ID) - && payload.has(POLL_ID) - && payload.has(QUESTION_ID) - && payload.has(ANSWER_ID)) { - String id = payload.get(Constants.MEETING_ID).getAsString(); - String userId = payload.get(USER_ID).getAsString(); - String pollId = payload.get(POLL_ID).getAsString(); - Integer questionId = payload.get(QUESTION_ID).getAsInt(); - Integer answerId = payload.get(ANSWER_ID).getAsInt(); - - return new VotePollUserRequestMessage(id, userId, pollId, questionId, answerId); - } - } - } - } - return null; - - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/payload/StartCustomPollRequestMessagePayload.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/payload/StartCustomPollRequestMessagePayload.java deleted file mode 100755 index e72d90145dab17b38a8143770b06cd0f2932c0ce..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/payload/StartCustomPollRequestMessagePayload.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.bigbluebutton.common.messages.payload; - -import java.util.ArrayList; - -public class StartCustomPollRequestMessagePayload { - public String pollType; - public ArrayList<String> answers; - public String pollId; - public String requesterId; - public String meetingId; -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/payload/StartProbingReplyMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/payload/StartProbingReplyMessage.java new file mode 100644 index 0000000000000000000000000000000000000000..44f4f3e23554563db95ce35b7f63cbf8bba2723f --- /dev/null +++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/payload/StartProbingReplyMessage.java @@ -0,0 +1,64 @@ +package org.bigbluebutton.common.messages; + +import java.util.Map; +import java.util.HashMap; +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.reflect.TypeToken; + + +public class StartProbingReplyMessage implements IBigBlueButtonMessage { + public static final String START_PROBING_REPLY = "start_probing_reply_message"; + public static final String VERSION = "0.0.1"; + + public static final String MEETING_ID = "meeting_id"; + public static final String TRANSCODER_ID = "transcoder_id"; + public static final String PARAMS = "params"; + + public final String meetingId; + public final String transcoderId; + public final Map<String,String> params; + + public StartProbingReplyMessage(String meetingId, String transcoderId, Map<String,String> params) { + this.meetingId = meetingId; + this.transcoderId = transcoderId; + this.params = params; + } + + public String toJson() { + HashMap<String, Object> payload = new HashMap<String, Object>(); + payload.put(MEETING_ID, meetingId); + payload.put(TRANSCODER_ID, transcoderId); + payload.put(PARAMS, params); + + java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(START_PROBING_REPLY, VERSION, null); + + return MessageBuilder.buildJson(header, payload); + } + + public static StartProbingReplyMessage fromJson(String message) { + JsonParser parser = new JsonParser(); + JsonObject obj = (JsonObject) parser.parse(message); + + if (obj.has("header") && obj.has("payload")) { + JsonObject header = (JsonObject) obj.get("header"); + JsonObject payload = (JsonObject) obj.get("payload"); + + if (header.has("name")) { + String messageName = header.get("name").getAsString(); + if (START_PROBING_REPLY.equals(messageName)) { + if (payload.has(MEETING_ID) + && payload.has(TRANSCODER_ID) + && payload.has(PARAMS)){ + String meetingId = payload.get(MEETING_ID).getAsString(); + String transcoderId = payload.get(TRANSCODER_ID).getAsString(); + Map<String,String> params = new Gson().fromJson(payload.get(PARAMS).toString(), new TypeToken<Map<String, String>>() {}.getType()); + return new StartProbingReplyMessage(meetingId, transcoderId, params); + } + } + } + } + return null; + } +} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/payload/StartProbingRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/payload/StartProbingRequestMessage.java new file mode 100644 index 0000000000000000000000000000000000000000..b9d90672831984fce42253ad4a058d39ff51d31b --- /dev/null +++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/payload/StartProbingRequestMessage.java @@ -0,0 +1,64 @@ +package org.bigbluebutton.common.messages; + +import java.util.Map; +import java.util.HashMap; +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.reflect.TypeToken; + + +public class StartProbingRequestMessage implements IBigBlueButtonMessage { + public static final String START_PROBING_REQUEST = "start_probing_request_message"; + public static final String VERSION = "0.0.1"; + + public static final String MEETING_ID = "meeting_id"; + public static final String TRANSCODER_ID = "transcoder_id"; + public static final String PARAMS = "params"; + + public final String meetingId; + public final String transcoderId; + public final Map<String,String> params; + + public StartProbingRequestMessage(String meetingId, String transcoderId, Map<String,String> params) { + this.meetingId = meetingId; + this.transcoderId = transcoderId; + this.params = params; + } + + public String toJson() { + HashMap<String, Object> payload = new HashMap<String, Object>(); + payload.put(MEETING_ID, meetingId); + payload.put(TRANSCODER_ID, transcoderId); + payload.put(PARAMS, params); + + java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(START_PROBING_REQUEST, VERSION, null); + + return MessageBuilder.buildJson(header, payload); + } + + public static StartProbingRequestMessage fromJson(String message) { + JsonParser parser = new JsonParser(); + JsonObject obj = (JsonObject) parser.parse(message); + + if (obj.has("header") && obj.has("payload")) { + JsonObject header = (JsonObject) obj.get("header"); + JsonObject payload = (JsonObject) obj.get("payload"); + + if (header.has("name")) { + String messageName = header.get("name").getAsString(); + if (START_PROBING_REQUEST.equals(messageName)) { + if (payload.has(MEETING_ID) + && payload.has(TRANSCODER_ID) + && payload.has(PARAMS)){ + String meetingId = payload.get(MEETING_ID).getAsString(); + String transcoderId = payload.get(TRANSCODER_ID).getAsString(); + Map<String,String> params = new Gson().fromJson(payload.get(PARAMS).toString(), new TypeToken<Map<String, String>>() {}.getType()); + return new StartProbingRequestMessage(meetingId, transcoderId, params); + } + } + } + } + return null; + } +} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/payload/StartTranscoderReplyMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/payload/StartTranscoderReplyMessage.java new file mode 100644 index 0000000000000000000000000000000000000000..33d71db1130dc8f00066bbb94971bd2f8b915317 --- /dev/null +++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/payload/StartTranscoderReplyMessage.java @@ -0,0 +1,64 @@ +package org.bigbluebutton.common.messages; + +import java.util.Map; +import java.util.HashMap; +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.reflect.TypeToken; + + +public class StartTranscoderReplyMessage implements IBigBlueButtonMessage { + public static final String START_TRANSCODER_REPLY = "start_transcoder_reply_message"; + public static final String VERSION = "0.0.1"; + + public static final String MEETING_ID = "meeting_id"; + public static final String TRANSCODER_ID = "transcoder_id"; + public static final String PARAMS = "params"; + + public final String meetingId; + public final String transcoderId; + public final Map<String,String> params; + + public StartTranscoderReplyMessage(String meetingId, String transcoderId, Map<String,String> params) { + this.meetingId = meetingId; + this.transcoderId = transcoderId; + this.params = params; + } + + public String toJson() { + HashMap<String, Object> payload = new HashMap<String, Object>(); + payload.put(MEETING_ID, meetingId); + payload.put(TRANSCODER_ID, transcoderId); + payload.put(PARAMS, params); + + java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(START_TRANSCODER_REPLY, VERSION, null); + + return MessageBuilder.buildJson(header, payload); + } + + public static StartTranscoderReplyMessage fromJson(String message) { + JsonParser parser = new JsonParser(); + JsonObject obj = (JsonObject) parser.parse(message); + + if (obj.has("header") && obj.has("payload")) { + JsonObject header = (JsonObject) obj.get("header"); + JsonObject payload = (JsonObject) obj.get("payload"); + + if (header.has("name")) { + String messageName = header.get("name").getAsString(); + if (START_TRANSCODER_REPLY.equals(messageName)) { + if ( payload.has(MEETING_ID) + && payload.has(TRANSCODER_ID) + && payload.has(PARAMS)){ + String meetingId = payload.get(MEETING_ID).getAsString(); + String transcoderId = payload.get(TRANSCODER_ID).getAsString(); + Map<String,String> params = new Gson().fromJson(payload.get(PARAMS).toString(), new TypeToken<Map<String, String>>() {}.getType()); + return new StartTranscoderReplyMessage(meetingId, transcoderId, params); + } + } + } + } + return null; + } +} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/payload/StartTranscoderRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/payload/StartTranscoderRequestMessage.java new file mode 100644 index 0000000000000000000000000000000000000000..728093dc2299de771ff8b1b15d33a6234746706b --- /dev/null +++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/payload/StartTranscoderRequestMessage.java @@ -0,0 +1,64 @@ +package org.bigbluebutton.common.messages; + +import java.util.Map; +import java.util.HashMap; +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.reflect.TypeToken; + + +public class StartTranscoderRequestMessage implements IBigBlueButtonMessage { + public static final String START_TRANSCODER_REQUEST = "start_transcoder_request_message"; + public static final String VERSION = "0.0.1"; + + public static final String MEETING_ID = "meeting_id"; + public static final String TRANSCODER_ID = "transcoder_id"; + public static final String PARAMS = "params"; + + public final String meetingId; + public final String transcoderId; + public final Map<String,String> params; + + public StartTranscoderRequestMessage(String meetingId, String transcoderId, Map<String,String> params) { + this.meetingId = meetingId; + this.transcoderId = transcoderId; + this.params = params; + } + + public String toJson() { + HashMap<String, Object> payload = new HashMap<String, Object>(); + payload.put(MEETING_ID, meetingId); + payload.put(TRANSCODER_ID, transcoderId); + payload.put(PARAMS, params); + + java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(START_TRANSCODER_REQUEST, VERSION, null); + + return MessageBuilder.buildJson(header, payload); + } + + public static StartTranscoderRequestMessage fromJson(String message) { + JsonParser parser = new JsonParser(); + JsonObject obj = (JsonObject) parser.parse(message); + + if (obj.has("header") && obj.has("payload")) { + JsonObject header = (JsonObject) obj.get("header"); + JsonObject payload = (JsonObject) obj.get("payload"); + + if (header.has("name")) { + String messageName = header.get("name").getAsString(); + if (START_TRANSCODER_REQUEST.equals(messageName)) { + if (payload.has(MEETING_ID) + && payload.has(TRANSCODER_ID) + && payload.has(PARAMS)){ + String meetingId = payload.get(MEETING_ID).getAsString(); + String transcoderId = payload.get(TRANSCODER_ID).getAsString(); + Map<String,String> params = new Gson().fromJson(payload.get(PARAMS).toString(), new TypeToken<Map<String, String>>() {}.getType()); + return new StartTranscoderRequestMessage(meetingId, transcoderId, params); + } + } + } + } + return null; + } +} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GoToSlideMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/payload/StopMeetingTranscodersMessage.java old mode 100755 new mode 100644 similarity index 53% rename from bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GoToSlideMessage.java rename to bbb-common-message/src/main/java/org/bigbluebutton/common/messages/payload/StopMeetingTranscodersMessage.java index 17a7ed03fc3630b37cf8f60aeedc00fd61eefe55..c277ae4fd4f6e643056a4a103f66cbe67b889b18 --- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GoToSlideMessage.java +++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/payload/StopMeetingTranscodersMessage.java @@ -1,33 +1,35 @@ package org.bigbluebutton.common.messages; +import java.util.Map; import java.util.HashMap; - +import com.google.gson.Gson; import com.google.gson.JsonObject; import com.google.gson.JsonParser; +import com.google.gson.reflect.TypeToken; + -public class GoToSlideMessage implements IBigBlueButtonMessage { - public static final String GO_TO_SLIDE = "go_to_slide"; +public class StopMeetingTranscodersMessage implements IBigBlueButtonMessage { + public static final String STOP_MEETING_TRANSCODERS = "stop_meeting_transcoders_message"; public static final String VERSION = "0.0.1"; + public static final String MEETING_ID = "meeting_id"; + public final String meetingId; - public final String page; - public GoToSlideMessage(String meetingId, String page){ + public StopMeetingTranscodersMessage(String meetingId) { this.meetingId = meetingId; - this.page = page; } public String toJson() { HashMap<String, Object> payload = new HashMap<String, Object>(); - payload.put(Constants.MEETING_ID, meetingId); - payload.put(Constants.PAGE, page); + payload.put(MEETING_ID, meetingId); - java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(GO_TO_SLIDE, VERSION, null); + java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(STOP_MEETING_TRANSCODERS, VERSION, null); return MessageBuilder.buildJson(header, payload); } - public static GoToSlideMessage fromJson(String message) { + public static StopMeetingTranscodersMessage fromJson(String message) { JsonParser parser = new JsonParser(); JsonObject obj = (JsonObject) parser.parse(message); @@ -37,13 +39,10 @@ public class GoToSlideMessage implements IBigBlueButtonMessage { if (header.has("name")) { String messageName = header.get("name").getAsString(); - if (GO_TO_SLIDE.equals(messageName)) { - if (payload.has(Constants.MEETING_ID) - && payload.has(Constants.PAGE)) { - String meetingId = payload.get(Constants.MEETING_ID).getAsString(); - String page = payload.get(Constants.PAGE).getAsString(); - - return new GoToSlideMessage(meetingId, page); + if (STOP_MEETING_TRANSCODERS.equals(messageName)) { + if (payload.has(MEETING_ID)){ + String meetingId = payload.get(MEETING_ID).getAsString(); + return new StopMeetingTranscodersMessage(meetingId); } } } diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/payload/StopTranscoderReplyMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/payload/StopTranscoderReplyMessage.java new file mode 100644 index 0000000000000000000000000000000000000000..d8aee64bb5e44dd6856dd7a0574e6932f559fc83 --- /dev/null +++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/payload/StopTranscoderReplyMessage.java @@ -0,0 +1,58 @@ +package org.bigbluebutton.common.messages; + +import java.util.Map; +import java.util.HashMap; +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.reflect.TypeToken; + + +public class StopTranscoderReplyMessage implements IBigBlueButtonMessage { + public static final String STOP_TRANSCODER_REPLY = "stop_transcoder_reply_message"; + public static final String VERSION = "0.0.1"; + + public static final String MEETING_ID = "meeting_id"; + public static final String TRANSCODER_ID = "transcoder_id"; + + public final String meetingId; + public final String transcoderId; + + public StopTranscoderReplyMessage(String meetingId, String transcoderId) { + this.meetingId = meetingId; + this.transcoderId = transcoderId; + } + + public String toJson() { + HashMap<String, Object> payload = new HashMap<String, Object>(); + payload.put(MEETING_ID, meetingId); + payload.put(TRANSCODER_ID, transcoderId); + + java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(STOP_TRANSCODER_REPLY, VERSION, null); + + return MessageBuilder.buildJson(header, payload); + } + + public static StopTranscoderReplyMessage fromJson(String message) { + JsonParser parser = new JsonParser(); + JsonObject obj = (JsonObject) parser.parse(message); + + if (obj.has("header") && obj.has("payload")) { + JsonObject header = (JsonObject) obj.get("header"); + JsonObject payload = (JsonObject) obj.get("payload"); + + if (header.has("name")) { + String messageName = header.get("name").getAsString(); + if (STOP_TRANSCODER_REPLY.equals(messageName)) { + if ( payload.has(MEETING_ID) + && payload.has(TRANSCODER_ID)){ + String meetingId = payload.get(MEETING_ID).getAsString(); + String transcoderId = payload.get(TRANSCODER_ID).getAsString(); + return new StopTranscoderReplyMessage(meetingId, transcoderId); + } + } + } + } + return null; + } +} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/payload/StopTranscoderRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/payload/StopTranscoderRequestMessage.java new file mode 100644 index 0000000000000000000000000000000000000000..7ac74c17298aa0af0adc94e4f462840a13be5718 --- /dev/null +++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/payload/StopTranscoderRequestMessage.java @@ -0,0 +1,58 @@ +package org.bigbluebutton.common.messages; + +import java.util.Map; +import java.util.HashMap; +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.reflect.TypeToken; + + +public class StopTranscoderRequestMessage implements IBigBlueButtonMessage { + public static final String STOP_TRANSCODER_REQUEST = "stop_transcoder_request_message"; + public static final String VERSION = "0.0.1"; + + public static final String MEETING_ID = "meeting_id"; + public static final String TRANSCODER_ID = "transcoder_id"; + + public final String meetingId; + public final String transcoderId; + + public StopTranscoderRequestMessage(String meetingId, String transcoderId) { + this.meetingId = meetingId; + this.transcoderId = transcoderId; + } + + public String toJson() { + HashMap<String, Object> payload = new HashMap<String, Object>(); + payload.put(MEETING_ID, meetingId); + payload.put(TRANSCODER_ID, transcoderId); + + java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(STOP_TRANSCODER_REQUEST, VERSION, null); + + return MessageBuilder.buildJson(header, payload); + } + + public static StopTranscoderRequestMessage fromJson(String message) { + JsonParser parser = new JsonParser(); + JsonObject obj = (JsonObject) parser.parse(message); + + if (obj.has("header") && obj.has("payload")) { + JsonObject header = (JsonObject) obj.get("header"); + JsonObject payload = (JsonObject) obj.get("payload"); + + if (header.has("name")) { + String messageName = header.get("name").getAsString(); + if (STOP_TRANSCODER_REQUEST.equals(messageName)) { + if (payload.has(MEETING_ID) + && payload.has(TRANSCODER_ID)){ + String meetingId = payload.get(MEETING_ID).getAsString(); + String transcoderId = payload.get(TRANSCODER_ID).getAsString(); + return new StopTranscoderRequestMessage(meetingId, transcoderId); + } + } + } + } + return null; + } +} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/payload/TranscoderStatusUpdateMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/payload/TranscoderStatusUpdateMessage.java new file mode 100644 index 0000000000000000000000000000000000000000..a48a85db18917263d077b49509477ec265cd7b38 --- /dev/null +++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/payload/TranscoderStatusUpdateMessage.java @@ -0,0 +1,64 @@ +package org.bigbluebutton.common.messages; + +import java.util.Map; +import java.util.HashMap; +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.reflect.TypeToken; + + +public class TranscoderStatusUpdateMessage implements IBigBlueButtonMessage { + public static final String TRANSCODER_STATUS_UPDATE = "transcoder_status_update"; + public static final String VERSION = "0.0.1"; + + public static final String MEETING_ID = "meeting_id"; + public static final String TRANSCODER_ID = "transcoder_id"; + public static final String PARAMS = "params"; + + public final String meetingId; + public final String transcoderId; + public final Map<String,String> params; + + public TranscoderStatusUpdateMessage(String meetingId, String transcoderId, Map<String,String> params) { + this.meetingId = meetingId; + this.transcoderId = transcoderId; + this.params = params; + } + + public String toJson() { + HashMap<String, Object> payload = new HashMap<String, Object>(); + payload.put(MEETING_ID, meetingId); + payload.put(TRANSCODER_ID, transcoderId); + payload.put(PARAMS, params); + + java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(TRANSCODER_STATUS_UPDATE, VERSION, null); + + return MessageBuilder.buildJson(header, payload); + } + + public static TranscoderStatusUpdateMessage fromJson(String message) { + JsonParser parser = new JsonParser(); + JsonObject obj = (JsonObject) parser.parse(message); + + if (obj.has("header") && obj.has("payload")) { + JsonObject header = (JsonObject) obj.get("header"); + JsonObject payload = (JsonObject) obj.get("payload"); + + if (header.has("name")) { + String messageName = header.get("name").getAsString(); + if (TRANSCODER_STATUS_UPDATE.equals(messageName)) { + if (payload.has(MEETING_ID) + && payload.has(TRANSCODER_ID) + && payload.has(PARAMS)){ + String meetingId = payload.get(MEETING_ID).getAsString(); + String transcoderId = payload.get(TRANSCODER_ID).getAsString(); + Map<String,String> params = new Gson().fromJson(payload.get(PARAMS).toString(), new TypeToken<Map<String, String>>() {}.getType()); + return new TranscoderStatusUpdateMessage(meetingId, transcoderId, params); + } + } + } + } + return null; + } +} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/payload/UpdateTranscoderReplyMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/payload/UpdateTranscoderReplyMessage.java new file mode 100644 index 0000000000000000000000000000000000000000..a8c8ce533848d022ef077cc65cfee62572f09331 --- /dev/null +++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/payload/UpdateTranscoderReplyMessage.java @@ -0,0 +1,64 @@ +package org.bigbluebutton.common.messages; + +import java.util.Map; +import java.util.HashMap; +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.reflect.TypeToken; + + +public class UpdateTranscoderReplyMessage implements IBigBlueButtonMessage { + public static final String UPDATE_TRANSCODER_REPLY = "update_transcoder_reply_message"; + public static final String VERSION = "0.0.1"; + + public static final String MEETING_ID = "meeting_id"; + public static final String TRANSCODER_ID = "transcoder_id"; + public static final String PARAMS = "params"; + + public final String meetingId; + public final String transcoderId; + public final Map<String,String> params; + + public UpdateTranscoderReplyMessage(String meetingId, String transcoderId, Map<String,String> params) { + this.meetingId = meetingId; + this.transcoderId = transcoderId; + this.params = params; + } + + public String toJson() { + HashMap<String, Object> payload = new HashMap<String, Object>(); + payload.put(MEETING_ID, meetingId); + payload.put(TRANSCODER_ID, transcoderId); + payload.put(PARAMS, params); + + java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(UPDATE_TRANSCODER_REPLY, VERSION, null); + + return MessageBuilder.buildJson(header, payload); + } + + public static UpdateTranscoderReplyMessage fromJson(String message) { + JsonParser parser = new JsonParser(); + JsonObject obj = (JsonObject) parser.parse(message); + + if (obj.has("header") && obj.has("payload")) { + JsonObject header = (JsonObject) obj.get("header"); + JsonObject payload = (JsonObject) obj.get("payload"); + + if (header.has("name")) { + String messageName = header.get("name").getAsString(); + if (UPDATE_TRANSCODER_REPLY.equals(messageName)) { + if ( payload.has(MEETING_ID) + && payload.has(TRANSCODER_ID) + && payload.has(PARAMS)){ + String meetingId = payload.get(MEETING_ID).getAsString(); + String transcoderId = payload.get(TRANSCODER_ID).getAsString(); + Map<String,String> params = new Gson().fromJson(payload.get(PARAMS).toString(), new TypeToken<Map<String, String>>() {}.getType()); + return new UpdateTranscoderReplyMessage(meetingId, transcoderId, params); + } + } + } + } + return null; + } +} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/payload/UpdateTranscoderRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/payload/UpdateTranscoderRequestMessage.java new file mode 100644 index 0000000000000000000000000000000000000000..3fd6904e6a3229316ff58e93da24991d5768167d --- /dev/null +++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/payload/UpdateTranscoderRequestMessage.java @@ -0,0 +1,64 @@ +package org.bigbluebutton.common.messages; + +import java.util.Map; +import java.util.HashMap; +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.reflect.TypeToken; + + +public class UpdateTranscoderRequestMessage implements IBigBlueButtonMessage { + public static final String UPDATE_TRANSCODER_REQUEST = "update_transcoder_request_message"; + public static final String VERSION = "0.0.1"; + + public static final String MEETING_ID = "meeting_id"; + public static final String TRANSCODER_ID = "transcoder_id"; + public static final String PARAMS = "params"; + + public final String meetingId; + public final String transcoderId; + public final Map<String,String> params; + + public UpdateTranscoderRequestMessage(String meetingId, String transcoderId, Map<String,String> params) { + this.meetingId = meetingId; + this.transcoderId = transcoderId; + this.params = params; + } + + public String toJson() { + HashMap<String, Object> payload = new HashMap<String, Object>(); + payload.put(MEETING_ID, meetingId); + payload.put(TRANSCODER_ID, transcoderId); + payload.put(PARAMS, params); + + java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(UPDATE_TRANSCODER_REQUEST, VERSION, null); + + return MessageBuilder.buildJson(header, payload); + } + + public static UpdateTranscoderRequestMessage fromJson(String message) { + JsonParser parser = new JsonParser(); + JsonObject obj = (JsonObject) parser.parse(message); + + if (obj.has("header") && obj.has("payload")) { + JsonObject header = (JsonObject) obj.get("header"); + JsonObject payload = (JsonObject) obj.get("payload"); + + if (header.has("name")) { + String messageName = header.get("name").getAsString(); + if (UPDATE_TRANSCODER_REQUEST.equals(messageName)) { + if (payload.has(MEETING_ID) + && payload.has(TRANSCODER_ID) + && payload.has(PARAMS)){ + String meetingId = payload.get(MEETING_ID).getAsString(); + String transcoderId = payload.get(TRANSCODER_ID).getAsString(); + Map<String,String> params = new Gson().fromJson(payload.get(PARAMS).toString(), new TypeToken<Map<String, String>>() {}.getType()); + return new UpdateTranscoderRequestMessage(meetingId, transcoderId, params); + } + } + } + } + return null; + } +} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/messages/BreakoutRoomClosed.java b/bbb-common-message/src/main/java/org/bigbluebutton/messages/BreakoutRoomClosed.java deleted file mode 100644 index bcfac2115c8f358a179b164dde549af56a39e537..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/messages/BreakoutRoomClosed.java +++ /dev/null @@ -1,42 +0,0 @@ -/** - * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ - * - * Copyright (c) 2015 BigBlueButton Inc. and by respective authors (see below). - * - * This program is free software; you can redistribute it and/or modify it under the - * terms of the GNU Lesser General Public License as published by the Free Software - * Foundation; either version 3.0 of the License, or (at your option) any later - * version. - * - * BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along - * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. - * - */ -package org.bigbluebutton.messages; - -import org.bigbluebutton.common.messages.IBigBlueButtonMessage; -import org.bigbluebutton.messages.payload.BreakoutRoomPayload; - -import com.google.gson.Gson; - -public class BreakoutRoomClosed implements IBigBlueButtonMessage { - public final static String NAME = "BreakoutRoomClosed"; - - public final Header header; - public final BreakoutRoomPayload payload; - - public BreakoutRoomClosed(BreakoutRoomPayload payload) { - header = new Header(NAME); - this.payload = payload; - } - - public String toJson() { - Gson gson = new Gson(); - return gson.toJson(this); - } - -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/messages/BreakoutRoomJoinURL.java b/bbb-common-message/src/main/java/org/bigbluebutton/messages/BreakoutRoomJoinURL.java deleted file mode 100755 index 523c0ab24f756502b59e730f1149bf35655efcd9..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/messages/BreakoutRoomJoinURL.java +++ /dev/null @@ -1,41 +0,0 @@ -/** - * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ - * - * Copyright (c) 2016 BigBlueButton Inc. and by respective authors (see below). - * - * This program is free software; you can redistribute it and/or modify it under the - * terms of the GNU Lesser General Public License as published by the Free Software - * Foundation; either version 3.0 of the License, or (at your option) any later - * version. - * - * BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along - * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. - * - */ -package org.bigbluebutton.messages; - -import org.bigbluebutton.common.messages.IBigBlueButtonMessage; -import org.bigbluebutton.messages.payload.BreakoutRoomJoinURLPayload; - -import com.google.gson.Gson; - -public class BreakoutRoomJoinURL implements IBigBlueButtonMessage { - public final static String NAME = "BreakoutRoomJoinURL"; - - public final Header header; - public final BreakoutRoomJoinURLPayload payload; - - public BreakoutRoomJoinURL(BreakoutRoomJoinURLPayload payload) { - header = new Header(NAME ); - this.payload = payload; - } - - public String toJson() { - Gson gson = new Gson(); - return gson.toJson(this); - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/messages/BreakoutRoomStarted.java b/bbb-common-message/src/main/java/org/bigbluebutton/messages/BreakoutRoomStarted.java deleted file mode 100755 index e7f5878000945af57debeab29b19fc4f49e992fe..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/messages/BreakoutRoomStarted.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.bigbluebutton.messages; - -import org.bigbluebutton.common.messages.IBigBlueButtonMessage; -import org.bigbluebutton.messages.payload.BreakoutRoomPayload; - -import com.google.gson.Gson; - -public class BreakoutRoomStarted implements IBigBlueButtonMessage { - public final static String NAME = "BreakoutRoomStarted"; - - public final Header header; - public final BreakoutRoomPayload payload; - - public BreakoutRoomStarted(BreakoutRoomPayload payload) { - this.header = new Header(NAME); - this.payload = payload; - } - - public String toJson() { - Gson gson = new Gson(); - return gson.toJson(this); - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/messages/BreakoutRoomsList.java b/bbb-common-message/src/main/java/org/bigbluebutton/messages/BreakoutRoomsList.java deleted file mode 100644 index a759f496e77f2f8fa920c60d9a80f757c7a1ef40..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/messages/BreakoutRoomsList.java +++ /dev/null @@ -1,41 +0,0 @@ -/** - * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ - * - * Copyright (c) 2016 BigBlueButton Inc. and by respective authors (see below). - * - * This program is free software; you can redistribute it and/or modify it under the - * terms of the GNU Lesser General Public License as published by the Free Software - * Foundation; either version 3.0 of the License, or (at your option) any later - * version. - * - * BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along - * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. - * - */ -package org.bigbluebutton.messages; - -import org.bigbluebutton.common.messages.IBigBlueButtonMessage; -import org.bigbluebutton.messages.payload.BreakoutRoomsListPayload; - -import com.google.gson.Gson; - -public class BreakoutRoomsList implements IBigBlueButtonMessage { - public final static String NAME = "BreakoutRoomsList"; - - public final Header header; - public final BreakoutRoomsListPayload payload; - - public BreakoutRoomsList(BreakoutRoomsListPayload payload) { - header = new Header(NAME); - this.payload = payload; - } - - public String toJson() { - Gson gson = new Gson(); - return gson.toJson(this); - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/messages/BreakoutRoomsTimeRemainingUpdate.java b/bbb-common-message/src/main/java/org/bigbluebutton/messages/BreakoutRoomsTimeRemainingUpdate.java deleted file mode 100644 index 36deb60e3633d3f45ea5fe269136a7745a0da289..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/messages/BreakoutRoomsTimeRemainingUpdate.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.bigbluebutton.messages; - -import org.bigbluebutton.common.messages.IBigBlueButtonMessage; -import org.bigbluebutton.messages.payload.BreakoutRoomsTimeRemainingPayload; - -import com.google.gson.Gson; - -public class BreakoutRoomsTimeRemainingUpdate implements IBigBlueButtonMessage { - public final static String NAME = "BreakoutRoomsTimeRemainingUpdate"; - - public final Header header; - public final BreakoutRoomsTimeRemainingPayload payload; - - public BreakoutRoomsTimeRemainingUpdate( - BreakoutRoomsTimeRemainingPayload payload) { - header = new Header(NAME); - this.payload = payload; - } - - public String toJson() { - Gson gson = new Gson(); - return gson.toJson(this); - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/messages/CreateBreakoutRoomRequest.java b/bbb-common-message/src/main/java/org/bigbluebutton/messages/CreateBreakoutRoomRequest.java deleted file mode 100755 index 1187be2fbcc1bc256e327ee197fbfe06ea996b2a..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/messages/CreateBreakoutRoomRequest.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.bigbluebutton.messages; - -import org.bigbluebutton.common.messages.IBigBlueButtonMessage; -import org.bigbluebutton.messages.payload.CreateBreakoutRoomRequestPayload; - -import com.google.gson.Gson; - -public class CreateBreakoutRoomRequest implements IBigBlueButtonMessage { - public final static String NAME = "CreateBreakoutRoomRequest"; - - public final Header header; - public final CreateBreakoutRoomRequestPayload payload; - - public CreateBreakoutRoomRequest(CreateBreakoutRoomRequestPayload payload) { - this.header = new Header(NAME); - this.payload = payload; - } - - public String toJson() { - Gson gson = new Gson(); - return gson.toJson(this); - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/messages/CreateBreakoutRoomsRequest.java b/bbb-common-message/src/main/java/org/bigbluebutton/messages/CreateBreakoutRoomsRequest.java deleted file mode 100755 index ada356418f46de3e4673b0a30875ffd082348039..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/messages/CreateBreakoutRoomsRequest.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.bigbluebutton.messages; - -import org.bigbluebutton.common.messages.IBigBlueButtonMessage; -import org.bigbluebutton.messages.payload.CreateBreakoutRoomsRequestPayload; - -import com.google.gson.Gson; - -/** - * The message from the client to the server requesting to create breakout - * rooms. - */ -public class CreateBreakoutRoomsRequest implements IBigBlueButtonMessage { - public final static String NAME = "CreateBreakoutRoomsRequest"; - - public final Header header; - public final CreateBreakoutRoomsRequestPayload payload; - - public CreateBreakoutRoomsRequest(CreateBreakoutRoomsRequestPayload payload) { - this.header = new Header(NAME); - this.payload = payload; - } - - public String toJson() { - Gson gson = new Gson(); - return gson.toJson(this); - } - -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/messages/EndAllBreakoutRoomsRequest.java b/bbb-common-message/src/main/java/org/bigbluebutton/messages/EndAllBreakoutRoomsRequest.java deleted file mode 100644 index 7516892d7a7a89bb62e1aa0bfd23bd152cfb3415..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/messages/EndAllBreakoutRoomsRequest.java +++ /dev/null @@ -1,41 +0,0 @@ -/** - * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ - * - * Copyright (c) 2015 BigBlueButton Inc. and by respective authors (see below). - * - * This program is free software; you can redistribute it and/or modify it under the - * terms of the GNU Lesser General Public License as published by the Free Software - * Foundation; either version 3.0 of the License, or (at your option) any later - * version. - * - * BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along - * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. - * - */ -package org.bigbluebutton.messages; - -import org.bigbluebutton.common.messages.IBigBlueButtonMessage; -import org.bigbluebutton.messages.payload.EndAllBreakoutRoomsRequestPayload; - -import com.google.gson.Gson; - -public class EndAllBreakoutRoomsRequest implements IBigBlueButtonMessage { - public final static String NAME = "EndAllBreakoutRoomsRequest"; - - public final Header header; - public final EndAllBreakoutRoomsRequestPayload payload; - - public EndAllBreakoutRoomsRequest(EndAllBreakoutRoomsRequestPayload payload) { - this.header = new Header(NAME); - this.payload = payload; - } - - public String toJson() { - Gson gson = new Gson(); - return gson.toJson(this); - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/messages/EndBreakoutRoomRequest.java b/bbb-common-message/src/main/java/org/bigbluebutton/messages/EndBreakoutRoomRequest.java deleted file mode 100644 index 6440db5f492b4f69f64af7c1fb9503ca1bcb6182..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/messages/EndBreakoutRoomRequest.java +++ /dev/null @@ -1,41 +0,0 @@ -/** - * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ - * - * Copyright (c) 2016 BigBlueButton Inc. and by respective authors (see below). - * - * This program is free software; you can redistribute it and/or modify it under the - * terms of the GNU Lesser General Public License as published by the Free Software - * Foundation; either version 3.0 of the License, or (at your option) any later - * version. - * - * BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along - * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. - * - */ -package org.bigbluebutton.messages; - -import org.bigbluebutton.common.messages.IBigBlueButtonMessage; -import org.bigbluebutton.messages.payload.EndBreakoutRoomRequestPayload; - -import com.google.gson.Gson; - -public class EndBreakoutRoomRequest implements IBigBlueButtonMessage { - public final static String NAME = "EndBreakoutRoomRequest"; - - public final Header header; - public final EndBreakoutRoomRequestPayload payload; - - public EndBreakoutRoomRequest(EndBreakoutRoomRequestPayload payload) { - header = new Header(NAME); - this.payload = payload; - } - - public String toJson() { - Gson gson = new Gson(); - return gson.toJson(this); - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/messages/GetBreakoutRoomsList.java b/bbb-common-message/src/main/java/org/bigbluebutton/messages/GetBreakoutRoomsList.java deleted file mode 100644 index 6e75ddc891f82b8f8515e59603df6b2373e8ff9e..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/messages/GetBreakoutRoomsList.java +++ /dev/null @@ -1,41 +0,0 @@ -/** - * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ - * - * Copyright (c) 2016 BigBlueButton Inc. and by respective authors (see below). - * - * This program is free software; you can redistribute it and/or modify it under the - * terms of the GNU Lesser General Public License as published by the Free Software - * Foundation; either version 3.0 of the License, or (at your option) any later - * version. - * - * BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along - * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. - * - */ -package org.bigbluebutton.messages; - -import org.bigbluebutton.common.messages.IBigBlueButtonMessage; -import org.bigbluebutton.messages.payload.GetBreakoutRoomsListPayload; - -import com.google.gson.Gson; - -public class GetBreakoutRoomsList implements IBigBlueButtonMessage { - public final static String NAME = "GetBreakoutRoomsList"; - - public final Header header; - public final GetBreakoutRoomsListPayload payload; - - public GetBreakoutRoomsList(GetBreakoutRoomsListPayload payload) { - header = new Header(NAME); - this.payload = payload; - } - - public String toJson() { - Gson gson = new Gson(); - return gson.toJson(this); - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/messages/ListenInOnBreakout.java b/bbb-common-message/src/main/java/org/bigbluebutton/messages/ListenInOnBreakout.java deleted file mode 100755 index 9c871b2d39511021f9507d45c0914724aef005b1..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/messages/ListenInOnBreakout.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.bigbluebutton.messages; - -import org.bigbluebutton.common.messages.IBigBlueButtonMessage; -import org.bigbluebutton.messages.payload.ListenInOnBreakoutPayload; - -import com.google.gson.Gson; - -public class ListenInOnBreakout implements IBigBlueButtonMessage { - public final static String NAME = "ListenInOnBreakout"; - - public final Header header; - public final ListenInOnBreakoutPayload payload; - - public ListenInOnBreakout(ListenInOnBreakoutPayload payload) { - this.header = new Header(NAME); - this.payload = payload; - } - - public String toJson() { - Gson gson = new Gson(); - return gson.toJson(this); - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/messages/RegisterUserMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/messages/RegisterUserMessage.java deleted file mode 100755 index 42f956ea09117f421988a5d442d5e6a67f5ff0c2..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/messages/RegisterUserMessage.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.bigbluebutton.messages; - -import org.bigbluebutton.common.messages.IBigBlueButtonMessage; - -public class RegisterUserMessage implements IBigBlueButtonMessage { - public static final String NAME = "register_user_request"; - public final Header header; - public final RegisterUserMessagePayload payload; - - public RegisterUserMessage(RegisterUserMessagePayload payload) { - this.header = new Header(NAME); - this.payload = payload; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/messages/RegisterUserMessagePayload.java b/bbb-common-message/src/main/java/org/bigbluebutton/messages/RegisterUserMessagePayload.java deleted file mode 100755 index 430f7b3d16d848a3d61458df3a5f8de6995c635a..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/messages/RegisterUserMessagePayload.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.bigbluebutton.messages; - - -public class RegisterUserMessagePayload { - public final String meetingId; - public final String userId; - public final String name; - public final String role; - public final String extUserId; - public final String authToken; - public final String avatarUrl; - public final Boolean guest; - public final Boolean authed; - - public RegisterUserMessagePayload(String meetingId, String userId, String name, String role, - String extUserId, String authToken, String avatarUrl, Boolean guest, Boolean authed) { - this.meetingId = meetingId; - this.userId = userId; - this.name = name; - this.role = role; - this.extUserId = extUserId; - this.authToken = authToken; - this.avatarUrl = avatarUrl; - this.guest = guest; - this.authed = authed; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/messages/RequestBreakoutJoinURL.java b/bbb-common-message/src/main/java/org/bigbluebutton/messages/RequestBreakoutJoinURL.java deleted file mode 100755 index d16e9e6f141ccd192b403f14b7d93f7e3e79124b..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/messages/RequestBreakoutJoinURL.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.bigbluebutton.messages; - -import org.bigbluebutton.common.messages.IBigBlueButtonMessage; -import org.bigbluebutton.messages.payload.RequestBreakoutJoinURLPayload; - -import com.google.gson.Gson; - -public class RequestBreakoutJoinURL implements IBigBlueButtonMessage { - public final static String NAME = "RequestBreakoutJoinURL"; - - public final Header header; - public final RequestBreakoutJoinURLPayload payload; - - public RequestBreakoutJoinURL(RequestBreakoutJoinURLPayload payload) { - this.header = new Header(NAME); - this.payload = payload; - } - - public String toJson() { - Gson gson = new Gson(); - return gson.toJson(this); - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/messages/TimeRemainingUpdate.java b/bbb-common-message/src/main/java/org/bigbluebutton/messages/TimeRemainingUpdate.java deleted file mode 100755 index 4d41d7bbcf44e52200e30480336aa7db05919cae..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/messages/TimeRemainingUpdate.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.bigbluebutton.messages; - -import org.bigbluebutton.common.messages.IBigBlueButtonMessage; -import org.bigbluebutton.messages.payload.MeetingTimeRemainingPayload; - -import com.google.gson.Gson; - -public class TimeRemainingUpdate implements IBigBlueButtonMessage { - public final static String NAME = "TimeRemainingUpdate"; - - public final Header header; - public final MeetingTimeRemainingPayload payload; - - public TimeRemainingUpdate(MeetingTimeRemainingPayload payload) { - header = new Header(NAME); - this.payload = payload; - } - - public String toJson() { - Gson gson = new Gson(); - return gson.toJson(this); - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/messages/UpdateBreakoutUsers.java b/bbb-common-message/src/main/java/org/bigbluebutton/messages/UpdateBreakoutUsers.java deleted file mode 100755 index e916622f9ca7bee83d7ce4b7e446c86ebde44dc3..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/messages/UpdateBreakoutUsers.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.bigbluebutton.messages; - -import org.bigbluebutton.common.messages.IBigBlueButtonMessage; -import org.bigbluebutton.messages.payload.UpdateBreakoutUsersPayload; - -import com.google.gson.Gson; - -public class UpdateBreakoutUsers implements IBigBlueButtonMessage { - public final static String NAME = "UpdateBreakoutUsers"; - - public final Header header; - public final UpdateBreakoutUsersPayload payload; - - public UpdateBreakoutUsers(UpdateBreakoutUsersPayload payload) { - this.header = new Header(NAME); - this.payload = payload; - - } - - public String toJson() { - Gson gson = new Gson(); - return gson.toJson(this); - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/messages/ValidateAuthTokenReply.java b/bbb-common-message/src/main/java/org/bigbluebutton/messages/ValidateAuthTokenReply.java deleted file mode 100755 index 2ebf081d5bcebbc5748ba1a1e6fadddc56f809d4..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/messages/ValidateAuthTokenReply.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.bigbluebutton.messages; - -import org.bigbluebutton.common.messages.IBigBlueButtonMessage; - -public class ValidateAuthTokenReply implements IBigBlueButtonMessage { - public final static String NAME = "ValidateAuthTokenReply"; - - public final Header header; - public final ValidateAuthTokenReplyPayload payload; - - public ValidateAuthTokenReply(MessageType type, ValidateAuthTokenReplyPayload payload) { - this.header = new Header(NAME); - this.payload = payload; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/messages/ValidateAuthTokenReplyPayload.java b/bbb-common-message/src/main/java/org/bigbluebutton/messages/ValidateAuthTokenReplyPayload.java deleted file mode 100755 index 50c81d7e9bb713387af7b2dfb6189e82c44cae1e..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/messages/ValidateAuthTokenReplyPayload.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.bigbluebutton.messages; - - -public class ValidateAuthTokenReplyPayload { - public final String meetingId; - public final String userId; - public final String token; - public final Boolean valid; - - public ValidateAuthTokenReplyPayload(String meetingId, String userId, String token, Boolean valid) { - this.meetingId = meetingId; - this.userId = userId; - this.token = token; - this.valid = valid; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/messages/ValidateAuthTokenRequest.java b/bbb-common-message/src/main/java/org/bigbluebutton/messages/ValidateAuthTokenRequest.java deleted file mode 100755 index 1eb0c4f3f58ecabbafdd1db4c37038aa0753eb9b..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/messages/ValidateAuthTokenRequest.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.bigbluebutton.messages; - -import org.bigbluebutton.common.messages.IBigBlueButtonMessage; - -public class ValidateAuthTokenRequest implements IBigBlueButtonMessage { - public final static String NAME = "ValidateAuthTokenRequest"; - - public final Header header; - public final ValidateAuthTokenRequestPayload payload; - - public ValidateAuthTokenRequest(MessageType type, ValidateAuthTokenRequestPayload payload) { - this.header = new Header(NAME); - this.payload = payload; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/messages/ValidateAuthTokenRequestPayload.java b/bbb-common-message/src/main/java/org/bigbluebutton/messages/ValidateAuthTokenRequestPayload.java deleted file mode 100755 index 042054cd03116acee2a47700d35dfe25c979bfac..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/messages/ValidateAuthTokenRequestPayload.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.bigbluebutton.messages; - -public class ValidateAuthTokenRequestPayload { - public final String meetingId; - public final String userId; - public final String token; - - public ValidateAuthTokenRequestPayload(String meetingId, String userId, String token) { - this.meetingId = meetingId; - this.userId = userId; - this.token = token; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/messages/ValidateAuthTokenRequestTimedout.java b/bbb-common-message/src/main/java/org/bigbluebutton/messages/ValidateAuthTokenRequestTimedout.java deleted file mode 100755 index 6bd15a0b239d6f75b8c6bd68702e1ad6549aa9db..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/messages/ValidateAuthTokenRequestTimedout.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.bigbluebutton.messages; - -import org.bigbluebutton.common.messages.IBigBlueButtonMessage; - - -public class ValidateAuthTokenRequestTimedout implements IBigBlueButtonMessage { - public final static String NAME = "ValidateAuthTokenRequestTimedout"; - - public final Header header; - public final ValidateAuthTokenRequestTimedoutPayload payload; - - public ValidateAuthTokenRequestTimedout(MessageType type, ValidateAuthTokenRequestTimedoutPayload payload) { - this.header = new Header(NAME); - this.payload = payload; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/messages/ValidateAuthTokenRequestTimedoutPayload.java b/bbb-common-message/src/main/java/org/bigbluebutton/messages/ValidateAuthTokenRequestTimedoutPayload.java deleted file mode 100755 index 888d2445ea0e255232a63d5e9c5a1bd7cc797b21..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/messages/ValidateAuthTokenRequestTimedoutPayload.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.bigbluebutton.messages; - -public class ValidateAuthTokenRequestTimedoutPayload { - public final String meetingId; - public final String userId; - public final String token; - - public ValidateAuthTokenRequestTimedoutPayload(String meetingId, String userId, String token) { - this.meetingId = meetingId; - this.userId = userId; - this.token = token; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/BreakoutRoomJoinURLPayload.java b/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/BreakoutRoomJoinURLPayload.java deleted file mode 100755 index af086f129cc537a4726602c910074b33274e9659..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/BreakoutRoomJoinURLPayload.java +++ /dev/null @@ -1,38 +0,0 @@ -/** - * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ - * - * Copyright (c) 2016 BigBlueButton Inc. and by respective authors (see below). - * - * This program is free software; you can redistribute it and/or modify it under the - * terms of the GNU Lesser General Public License as published by the Free Software - * Foundation; either version 3.0 of the License, or (at your option) any later - * version. - * - * BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along - * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. - * - */ -package org.bigbluebutton.messages.payload; - -public class BreakoutRoomJoinURLPayload { - - public final String parentMeetingId; - public final String breakoutMeetingId; - public final String userId; - public final String redirectJoinURL; - public final String noRedirectJoinURL; - - public BreakoutRoomJoinURLPayload(String parentMeetingId, - String breakoutMeetingId, String userId, String redirectJoinURL, - String noRedirectJoinURL) { - this.parentMeetingId = parentMeetingId; - this.breakoutMeetingId = breakoutMeetingId; - this.userId = userId; - this.redirectJoinURL = redirectJoinURL; - this.noRedirectJoinURL = noRedirectJoinURL; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/BreakoutRoomPayload.java b/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/BreakoutRoomPayload.java deleted file mode 100755 index 898ab5048690b8fbd91aedcabed86f87af040891..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/BreakoutRoomPayload.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.bigbluebutton.messages.payload; - -public class BreakoutRoomPayload { - - public final String parentMeetingId; - public final String meetingId; - public final String externalMeetingId; - public final String name; - public final Integer sequence; - - public BreakoutRoomPayload(String parentMeetingId, String meetingId, - String externalMeetingId, String name, Integer sequence) { - this.parentMeetingId = parentMeetingId; - this.meetingId = meetingId; - this.externalMeetingId = externalMeetingId; - this.name = name; - this.sequence = sequence; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/BreakoutRoomRequestPayload.java b/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/BreakoutRoomRequestPayload.java deleted file mode 100755 index 20cceb76bcdd1b3b587513536bdcbc17338cbb37..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/BreakoutRoomRequestPayload.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.bigbluebutton.messages.payload; - -import java.util.ArrayList; - -public class BreakoutRoomRequestPayload { - // Name of the breakout room - public final String name; - // Sequence of the breakout room - public final Integer sequence; - // List of user ids to assign to the breakout room - public final ArrayList<String> users; - - public BreakoutRoomRequestPayload(String name, Integer sequence, ArrayList<String> users) { - this.name = name; - this.sequence = sequence; - this.users = users; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/BreakoutRoomsTimeRemainingPayload.java b/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/BreakoutRoomsTimeRemainingPayload.java deleted file mode 100644 index 404b14cb5011dca415ddfbe9c8fa6fc441a4ceeb..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/BreakoutRoomsTimeRemainingPayload.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.bigbluebutton.messages.payload; - -public class BreakoutRoomsTimeRemainingPayload { - - public final String meetingId; - public final Integer timeRemaining; - - public BreakoutRoomsTimeRemainingPayload(String meetingId, - Integer timeRemaining) { - this.meetingId = meetingId; - this.timeRemaining = timeRemaining; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/BreakoutUserPayload.java b/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/BreakoutUserPayload.java deleted file mode 100755 index 3ebc4e816b8392b9c1e9d59c01449c871ec80382..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/BreakoutUserPayload.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.bigbluebutton.messages.payload; - -public class BreakoutUserPayload { - - public final String id; - public final String name; - - public BreakoutUserPayload(String id, String name) { - this.id = id; - this.name = name; - } -} 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 deleted file mode 100755 index 9c49157c76b5ee750a8b01d3707fce95ede2682d..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/CreateBreakoutRoomRequestPayload.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.bigbluebutton.messages.payload; - -public class CreateBreakoutRoomRequestPayload { - public final String breakoutMeetingId; - public final String parentMeetingId; // The main meeting internal id - public final String name; // The name of the breakout room - public final Integer sequence; // The sequnce number 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 meetingMeetingId, String parentMeetingId, - String name, Integer sequence, String voiceConfId, String viewerPassword, - String moderatorPassword, Integer duration, - String sourcePresentationId, Integer sourcePresentationSlide, - Boolean record) { - this.breakoutMeetingId = meetingMeetingId; - this.parentMeetingId = parentMeetingId; - this.name = name; - this.sequence = sequence; - 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/main/java/org/bigbluebutton/messages/payload/CreateBreakoutRoomsRequestPayload.java b/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/CreateBreakoutRoomsRequestPayload.java deleted file mode 100755 index c212b36aa283cb35b3a48432189849b5a75cdd6b..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/CreateBreakoutRoomsRequestPayload.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.bigbluebutton.messages.payload; - -import java.util.ArrayList; - -public class CreateBreakoutRoomsRequestPayload { - // The main meeting internal id - public final String meetingId; - // The list of breakout rooms - public final ArrayList<BreakoutRoomRequestPayload> rooms; - // The duration of the breakout room - public final Integer durationInMinutes; - // Breakout rooms recording option - public final Boolean record; - - public CreateBreakoutRoomsRequestPayload(String meetingId, - ArrayList<BreakoutRoomRequestPayload> breakoutRooms, - Integer duration, Boolean record) { - this.meetingId = meetingId; - this.rooms = breakoutRooms; - this.durationInMinutes = duration; - this.record = record; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/EndAllBreakoutRoomsRequestPayload.java b/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/EndAllBreakoutRoomsRequestPayload.java deleted file mode 100644 index d7b7e9010668830e8d21b9acc82ac8aac8982fd1..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/EndAllBreakoutRoomsRequestPayload.java +++ /dev/null @@ -1,27 +0,0 @@ -/** - * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ - * - * Copyright (c) 2015 BigBlueButton Inc. and by respective authors (see below). - * - * This program is free software; you can redistribute it and/or modify it under the - * terms of the GNU Lesser General Public License as published by the Free Software - * Foundation; either version 3.0 of the License, or (at your option) any later - * version. - * - * BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along - * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. - * - */ -package org.bigbluebutton.messages.payload; - -public class EndAllBreakoutRoomsRequestPayload { - public final String meetingId; - - public EndAllBreakoutRoomsRequestPayload(String meetingId) { - this.meetingId = meetingId; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/EndBreakoutRoomRequestPayload.java b/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/EndBreakoutRoomRequestPayload.java deleted file mode 100644 index 7ff228bac6674cb3bfe1e1857a1751480204bf67..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/EndBreakoutRoomRequestPayload.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ - * - * Copyright (c) 2016 BigBlueButton Inc. and by respective authors (see below). - * - * This program is free software; you can redistribute it and/or modify it under the - * terms of the GNU Lesser General Public License as published by the Free Software - * Foundation; either version 3.0 of the License, or (at your option) any later - * version. - * - * BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along - * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. - * - */ -package org.bigbluebutton.messages.payload; - -public class EndBreakoutRoomRequestPayload { - - public final String meetingId; - - public EndBreakoutRoomRequestPayload(String meetingId) { - this.meetingId = meetingId; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/ListenInOnBreakoutPayload.java b/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/ListenInOnBreakoutPayload.java deleted file mode 100755 index aeed47d5185e8601a8111fb55ce66a0fcbb6cb4f..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/ListenInOnBreakoutPayload.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.bigbluebutton.messages.payload; - -public class ListenInOnBreakoutPayload { - - public final String meetingId; - public final String targetMeetingId; - public final String userId; - - public ListenInOnBreakoutPayload(String meetingId, String targetMeetingId, - String userId) { - this.meetingId = meetingId; - this.targetMeetingId = targetMeetingId; - this.userId = userId; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/MeetingTimeRemainingPayload.java b/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/MeetingTimeRemainingPayload.java deleted file mode 100755 index ca2dbd2831905e6da38a9d1bf8aebeaac18c95c9..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/MeetingTimeRemainingPayload.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.bigbluebutton.messages.payload; - -public class MeetingTimeRemainingPayload { - - public final String meetingId; - public final Integer timeRemaining; - - public MeetingTimeRemainingPayload(String meetingId, Integer timeRemaining) { - this.meetingId = meetingId; - this.timeRemaining = timeRemaining; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/RequestBreakoutJoinURLPayload.java b/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/RequestBreakoutJoinURLPayload.java deleted file mode 100755 index e53be785192279c2f78cde37b26d26ccf52c04ae..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/RequestBreakoutJoinURLPayload.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.bigbluebutton.messages.payload; - -public class RequestBreakoutJoinURLPayload { - - public final String meetingId; - public final String breakoutMeetingId; - public final String userId; - - public RequestBreakoutJoinURLPayload(String meetingId, - String breakoutMeetingId, String userId) { - this.meetingId = meetingId; - this.breakoutMeetingId = breakoutMeetingId; - this.userId = userId; - } -} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/UpdateBreakoutUsersPayload.java b/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/UpdateBreakoutUsersPayload.java deleted file mode 100755 index 84810e44cacf905f81d284cc1f576caa472904b8..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/UpdateBreakoutUsersPayload.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.bigbluebutton.messages.payload; - -import java.util.ArrayList; - -public class UpdateBreakoutUsersPayload { - - public final ArrayList<BreakoutUserPayload> users; - public final String breakoutMeetingId; - public final String parentMeetingId; - - public UpdateBreakoutUsersPayload(String meetingParentId, String breakoutMeetingId, ArrayList<BreakoutUserPayload> users) { - this.parentMeetingId = meetingParentId; - this.breakoutMeetingId = breakoutMeetingId; - this.users = users; - } -} diff --git a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/domain/Meeting2x.scala b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/domain/Meeting2x.scala index ac5934245bc8a8031152d3dac46aa074ab3674d6..d12fb9c7f81646bdc199d9fda95006f28ac17fd1 100755 --- a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/domain/Meeting2x.scala +++ b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/domain/Meeting2x.scala @@ -2,7 +2,9 @@ package org.bigbluebutton.common2.domain case class ConfigProps(defaultConfigToken: String, config: String) -case class DurationProps(duration: Int, createdTime: Long, createdDate: String) +case class DurationProps(duration: Int, createdTime: Long, createdDate: String, maxInactivityTimeoutMinutes: Int, +warnMinutesBeforeMax: Int, meetingExpireIfNoUserJoinedInMinutes: Int, + meetingExpireWhenLastUserLeftInMinutes: Int) case class MeetingProp(name: String, extId: String, intId: String, isBreakout: Boolean) diff --git a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/domain/Whiteboard.scala b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/domain/Whiteboard.scala deleted file mode 100755 index cdec63594af0ea10f0251814def5799c7354c389..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/domain/Whiteboard.scala +++ /dev/null @@ -1,3 +0,0 @@ -package org.bigbluebutton.common2.domain - -case class AnnotationVO(id: String, status: String, annotationType: String, annotationInfo: scala.collection.immutable.Map[String, Object], wbId: String, userId: String, position: Int) \ No newline at end of file diff --git a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/GuestsMsgs.scala b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/GuestsMsgs.scala index 1f4c41a7772e7ab1e746e8db400768beb28acb6a..c8ade0ab93b92dafd11e14286c2f64f60fc8bce8 100755 --- a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/GuestsMsgs.scala +++ b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/GuestsMsgs.scala @@ -7,7 +7,7 @@ object GetGuestsWaitingApprovalReqMsg { val NAME = "GetGuestsWaitingApprovalReqMsg" } case class GetGuestsWaitingApprovalReqMsg(header: BbbClientMsgHeader, - body: GetGuestsWaitingApprovalReqMsgBody) extends BbbCoreMsg + body: GetGuestsWaitingApprovalReqMsgBody) extends StandardMsg case class GetGuestsWaitingApprovalReqMsgBody(requesterId: String) @@ -47,7 +47,7 @@ object GuestsWaitingApprovedMsg { } case class GuestsWaitingApprovedMsg(header: BbbClientMsgHeader, - body: GuestsWaitingApprovedMsgBody) extends BbbCoreMsg + body: GuestsWaitingApprovedMsgBody) extends StandardMsg case class GuestsWaitingApprovedMsgBody(guests: Vector[GuestApprovedVO], approvedBy: String) case class GuestApprovedVO(guest: String, approved: Boolean) @@ -76,12 +76,12 @@ case class GuestApprovedEvtMsgBody(approved: Boolean, approvedBy: String) /** * Message from user to set the guest policy. */ -object SetGuestPolicyMsg { - val NAME = "SetGuestPolicyMsg" +object SetGuestPolicyCmdMsg { + val NAME = "SetGuestPolicyCmdMsg" } -case class SetGuestPolicyMsg(header: BbbClientMsgHeader, - body: SetGuestPolicyMsgBody) extends BbbCoreMsg -case class SetGuestPolicyMsgBody(policy: String, setBy: String) +case class SetGuestPolicyCmdMsg(header: BbbClientMsgHeader, + body: SetGuestPolicyCmdMsgBody) extends StandardMsg +case class SetGuestPolicyCmdMsgBody(policy: String, setBy: String) /** * Message sent to all clients that guest policy has been changed. @@ -94,6 +94,18 @@ case class GuestPolicyChangedEvtMsg(header: BbbClientMsgHeader, case class GuestPolicyChangedEvtMsgBody(policy: String, setBy: String) +/** + * Message from user to get the guest policy. + */ +object GetGuestPolicyReqMsg { val NAME = "GetGuestPolicyReqMsg" } +case class GetGuestPolicyReqMsg(header: BbbClientMsgHeader, + body: GetGuestPolicyReqMsgBody) extends StandardMsg +case class GetGuestPolicyReqMsgBody(requestedBy: String) - - +/** + * Sent to client as response to query for guest policy. + */ +object GetGuestPolicyRespMsg { val NAME = "GetGuestPolicyRespMsg" } +case class GetGuestPolicyRespMsg(header: BbbClientMsgHeader, + body: GetGuestPolicyRespMsgBody) extends StandardMsg +case class GetGuestPolicyRespMsgBody(policy: String) diff --git a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/SystemMsgs.scala b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/SystemMsgs.scala index 755b0cd6f318fdcd69d66a0e49f99673a68fb3e6..82f2aa47c29871503b06f4ab7ae4418c06701c98 100755 --- a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/SystemMsgs.scala +++ b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/SystemMsgs.scala @@ -59,7 +59,7 @@ case class MeetingEndedEvtMsgBody(meetingId: String) object MeetingEndingEvtMsg { val NAME = "MeetingEndingEvtMsg"} case class MeetingEndingEvtMsg(header: BbbClientMsgHeader, body: MeetingEndingEvtMsgBody) extends BbbCoreMsg -case class MeetingEndingEvtMsgBody(meetingId: String) +case class MeetingEndingEvtMsgBody(meetingId: String, reason: String) /** diff --git a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/UsersMgs.scala b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/UsersMgs.scala index f66752e22e8ec3dac3acb51f22fc9890095fd31c..6176fb5e86e5a27ce3fa6e1b19f00dc513403180 100755 --- a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/UsersMgs.scala +++ b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/UsersMgs.scala @@ -101,6 +101,13 @@ object RecordingStatusChangedEvtMsg { val NAME = "RecordingStatusChangedEvtMsg" case class RecordingStatusChangedEvtMsg(header: BbbClientMsgHeader, body: RecordingStatusChangedEvtMsgBody) extends BbbCoreMsg case class RecordingStatusChangedEvtMsgBody(recording: Boolean, setBy: String) +/** + * Sent by user to get status of screenshare (meant for late joiners). + */ +object GetScreenshareStatusReqMsg { val NAME = "GetScreenshareStatusReqMsg" } +case class GetScreenshareStatusReqMsg(header: BbbClientMsgHeader, body: GetScreenshareStatusReqMsgBody) extends StandardMsg +case class GetScreenshareStatusReqMsgBody(requestedBy: String) + /** * Sent from client about a user changing emoji. */ diff --git a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/WhiteboardMsgs.scala b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/WhiteboardMsgs.scala index 9c92823781d5d1123f07c4b7a1a3fdd035f0e60f..d62f109153d3e191506a314d4f0248c48d1b9e46 100755 --- a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/WhiteboardMsgs.scala +++ b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/WhiteboardMsgs.scala @@ -1,7 +1,6 @@ package org.bigbluebutton.common2.msgs -import org.bigbluebutton.common2.domain.AnnotationVO - +case class AnnotationVO(id: String, status: String, annotationType: String, annotationInfo: scala.collection.immutable.Map[String, Object], wbId: String, userId: String, position: Int) object ClearWhiteboardEvtMsg { val NAME = "ClearWhiteboardEvtMsg" 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 deleted file mode 100755 index 59f3086d0d8f12afa9180afc45bf37aa26178606..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/test/java/org/bigbluebutton/messages/CreateBreakoutRoomRequestTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.bigbluebutton.messages; - -import org.bigbluebutton.messages.payload.CreateBreakoutRoomRequestPayload; -import org.junit.Assert; -import org.junit.Test; - -import com.google.gson.Gson; - -public class CreateBreakoutRoomRequestTest { - @Test - public void testCreateBreakoutRoomRequest() { - String breakoutId = "183f0bf3a0982a127bdb8161e0c44eb696b3e75c-1474984695664"; - String parentId = "abc-123"; - Integer durationInMinutes = 20; - String name = "Breakout room 1"; - Integer sequence = 3; - String voiceConfId = "851153"; - String viewerPassword = "vp"; - String moderatorPassword = "mp"; - String sourcePresentationId = "d2d9a672040fbde2a47a10bf6c37b6a4b5ae187f-1474984695907"; - Integer sourePresentationSlide = 5; - Boolean record = false; - - CreateBreakoutRoomRequestPayload payload = new CreateBreakoutRoomRequestPayload( - breakoutId, parentId, name, sequence, voiceConfId, - viewerPassword, moderatorPassword, durationInMinutes, - sourcePresentationId, sourePresentationSlide, record); - CreateBreakoutRoomRequest msg = new CreateBreakoutRoomRequest(payload); - Gson gson = new Gson(); - String json = gson.toJson(msg); - System.out.println(json); - - CreateBreakoutRoomRequest rxMsg = gson.fromJson(json, CreateBreakoutRoomRequest.class); - - Assert.assertEquals(rxMsg.header.name, CreateBreakoutRoomRequest.NAME); - Assert.assertEquals(rxMsg.payload.breakoutMeetingId, breakoutId); - Assert.assertEquals(rxMsg.payload.name, name); - Assert.assertEquals(rxMsg.payload.sequence, sequence); - Assert.assertEquals(rxMsg.payload.voiceConfId, voiceConfId); - Assert.assertEquals(rxMsg.payload.viewerPassword, viewerPassword); - Assert.assertEquals(rxMsg.payload.moderatorPassword, moderatorPassword); - Assert.assertEquals(rxMsg.payload.durationInMinutes, durationInMinutes); - Assert.assertEquals(rxMsg.payload.sourcePresentationId, sourcePresentationId); - Assert.assertEquals(rxMsg.payload.sourcePresentationSlide, sourePresentationSlide); - Assert.assertEquals(rxMsg.payload.record, record); - } -} diff --git a/bbb-common-message/src/test/java/org/bigbluebutton/messages/CreateBreakoutRoomsMsgsRequestTest.java b/bbb-common-message/src/test/java/org/bigbluebutton/messages/CreateBreakoutRoomsMsgsRequestTest.java deleted file mode 100755 index 2fd0aeb2f2d4eb9206e91112778eda8cd867749a..0000000000000000000000000000000000000000 --- a/bbb-common-message/src/test/java/org/bigbluebutton/messages/CreateBreakoutRoomsMsgsRequestTest.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.bigbluebutton.messages; - -import java.util.ArrayList; - -import org.bigbluebutton.messages.payload.BreakoutRoomRequestPayload; -import org.bigbluebutton.messages.payload.CreateBreakoutRoomsRequestPayload; -import org.junit.Assert; -import org.junit.Test; - -import com.google.gson.Gson; - -public class CreateBreakoutRoomsMsgsRequestTest { - - @Test - public void testCreateBreakoutRoomsRequest() { - String meetingId = "abc123"; - Integer durationInMinutes = 20; - Boolean record = true; - - ArrayList<String> room1Users = new ArrayList<String>(); - room1Users.add("Tidora"); room1Users.add("Nidora"); room1Users.add("Tinidora"); - BreakoutRoomRequestPayload room1 = new BreakoutRoomRequestPayload("room1", 1, room1Users); - - ArrayList<String> room2Users = new ArrayList<String>(); - room2Users.add("Jose"); room2Users.add("Wally"); room2Users.add("Paolo"); - BreakoutRoomRequestPayload room2= new BreakoutRoomRequestPayload("room2", 2, room2Users); - - ArrayList<String> room3Users = new ArrayList<String>(); - room3Users.add("Alden"); room3Users.add("Yaya Dub"); - BreakoutRoomRequestPayload room3= new BreakoutRoomRequestPayload("room3", 3, room3Users); - - ArrayList<BreakoutRoomRequestPayload> rooms = new ArrayList<BreakoutRoomRequestPayload>(); - rooms.add(room1); rooms.add(room2); rooms.add(room3); - - CreateBreakoutRoomsRequestPayload payload = new CreateBreakoutRoomsRequestPayload(meetingId, rooms, durationInMinutes, record); - CreateBreakoutRoomsRequest msg = new CreateBreakoutRoomsRequest(payload); - Gson gson = new Gson(); - String json = gson.toJson(msg); - System.out.println(json); - - CreateBreakoutRoomsRequest rxMsg = gson.fromJson(json, CreateBreakoutRoomsRequest.class); - - Assert.assertEquals(rxMsg.header.name, CreateBreakoutRoomsRequest.NAME); - Assert.assertEquals(rxMsg.payload.meetingId, meetingId); - Assert.assertEquals(rxMsg.payload.rooms.size(), 3); - Assert.assertEquals(rxMsg.payload.durationInMinutes, durationInMinutes); - Assert.assertEquals(rxMsg.payload.record, record); - } -} diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/api/MeetingService.java b/bbb-common-web/src/main/java/org/bigbluebutton/api/MeetingService.java index 8dbf8c52157a4b3558fcccce2f9504aab5147901..b1c914279ce926b5001df7be672467beb1cc0975 100755 --- a/bbb-common-web/src/main/java/org/bigbluebutton/api/MeetingService.java +++ b/bbb-common-web/src/main/java/org/bigbluebutton/api/MeetingService.java @@ -264,7 +264,9 @@ public class MeetingService implements MessageListener { m.getModeratorPassword(), m.getViewerPassword(), m.getCreateTime(), formatPrettyDate(m.getCreateTime()), m.isBreakout(), m.getSequence(), m.getMetadata(), m.getGuestPolicy(), m.getWelcomeMessageTemplate(), - m.getWelcomeMessage(), m.getModeratorOnlyMessage(), m.getDialNumber(), m.getMaxUsers()); + m.getWelcomeMessage(), m.getModeratorOnlyMessage(), m.getDialNumber(), m.getMaxUsers(), + m.getMaxInactivityTimeoutMinutes(), m.getWarnMinutesBeforeMax(), + m.getMeetingExpireIfNoUserJoinedInMinutes(), m.getmeetingExpireWhenLastUserLeftInMinutes()); } diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/api/ParamsProcessorUtil.java b/bbb-common-web/src/main/java/org/bigbluebutton/api/ParamsProcessorUtil.java index 7a562f22423555e01585ed51b4975b323e1e9c15..4534ba22ec23ef3879f962688d666ffce440bce4 100755 --- a/bbb-common-web/src/main/java/org/bigbluebutton/api/ParamsProcessorUtil.java +++ b/bbb-common-web/src/main/java/org/bigbluebutton/api/ParamsProcessorUtil.java @@ -81,6 +81,11 @@ public class ParamsProcessorUtil { private String defaultConfigXML = null; + private Integer maxInactivityTimeoutMinutes = 120; + private Integer warnMinutesBeforeMax = 5; + private Integer meetingExpireIfNoUserJoinedInMinutes = 5; + private Integer meetingExpireWhenLastUserLeftInMinutes = 1; + private String substituteKeywords(String message, String dialNumber, String telVoice, String meetingName) { String welcomeMessage = message; @@ -446,7 +451,7 @@ public class ParamsProcessorUtil { .withMetadata(meetingInfo) .withWelcomeMessageTemplate(welcomeMessageTemplate) .withWelcomeMessage(welcomeMessage).isBreakout(isBreakout) - .withGuestPolicy(guestPolicy) + .withGuestPolicy(guestPolicy) .build(); String configXML = getDefaultConfigXML(); @@ -457,6 +462,11 @@ public class ParamsProcessorUtil { meeting.setModeratorOnlyMessage(moderatorOnlyMessage); } + meeting.setMaxInactivityTimeoutMinutes(maxInactivityTimeoutMinutes); + meeting.setWarnMinutesBeforeMax(warnMinutesBeforeMax); + meeting.setMeetingExpireIfNoUserJoinedInMinutes(meetingExpireIfNoUserJoinedInMinutes); + meeting.setMeetingExpireWhenLastUserLeftInMinutes(meetingExpireWhenLastUserLeftInMinutes); + // Add extra parameters for breakout room if (isBreakout) { meeting.setSequence(Integer.parseInt(params.get("sequence"))); @@ -828,6 +838,35 @@ public class ParamsProcessorUtil { this.defaultGuestPolicy = guestPolicy; } + public void setMaxInactivityTimeoutMinutes(Integer value) { + maxInactivityTimeoutMinutes = value; + } + + public void setWarnMinutesBeforeMax(Integer value) { + warnMinutesBeforeMax = value; + } + + public Integer getMaxInactivityTimeoutMinutes() { + return maxInactivityTimeoutMinutes; + } + + public Integer getWarnMinutesBeforeMax() { + return warnMinutesBeforeMax; + } + + + public void setMeetingExpireWhenLastUserLeftInMinutes(Integer value) { + meetingExpireWhenLastUserLeftInMinutes = value; + } + + public Integer getmeetingExpireWhenLastUserLeftInMinutes() { + return meetingExpireWhenLastUserLeftInMinutes; + } + + public void setMeetingExpireIfNoUserJoinedInMinutes(Integer value) { + meetingExpireIfNoUserJoinedInMinutes = value; + } + public ArrayList<String> decodeIds(String encodeid) { ArrayList<String> ids=new ArrayList<String>(); try { diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/api/domain/Meeting.java b/bbb-common-web/src/main/java/org/bigbluebutton/api/domain/Meeting.java index b15534e19d6630855bc0154043029da579843ca6..ac8a3097f67d82d3101860f15252dd531c58d32c 100755 --- a/bbb-common-web/src/main/java/org/bigbluebutton/api/domain/Meeting.java +++ b/bbb-common-web/src/main/java/org/bigbluebutton/api/domain/Meeting.java @@ -43,7 +43,7 @@ public class Meeting { private String viewerPass; private String welcomeMsgTemplate; private String welcomeMsg; - private String modOnlyMessage = "bbb-None"; + private String modOnlyMessage = ""; private String logoutUrl; private int maxUsers; private boolean record; @@ -62,7 +62,12 @@ public class Meeting { private final ConcurrentMap<String, Config> configs; private final Boolean isBreakout; private final List<String> breakoutRooms = new ArrayList<String>(); - + + private Integer maxInactivityTimeoutMinutes = 120; + private Integer warnMinutesBeforeMax = 5; + private Integer meetingExpireIfNoUserJoinedInMinutes = 5; + private Integer meetingExpireWhenLastUserLeftInMinutes = 1; + public Meeting(Meeting.Builder builder) { name = builder.name; extMeetingId = builder.externalId; @@ -343,11 +348,47 @@ public class Meeting { public void addUserCustomData(String userID, Map<String, String> data) { userCustomData.put(userID, data); } - + + public void setMaxInactivityTimeoutMinutes(Integer value) { + maxInactivityTimeoutMinutes = value; + } + + public void setWarnMinutesBeforeMax(Integer value) { + warnMinutesBeforeMax = value; + } + + public Integer getMaxInactivityTimeoutMinutes() { + return maxInactivityTimeoutMinutes; + } + + public Integer getWarnMinutesBeforeMax() { + return warnMinutesBeforeMax; + } + + public void setMeetingExpireWhenLastUserLeftInMinutes(Integer value) { + meetingExpireWhenLastUserLeftInMinutes = value; + } + + public Integer getmeetingExpireWhenLastUserLeftInMinutes() { + return meetingExpireWhenLastUserLeftInMinutes; + } + + + public void setMeetingExpireIfNoUserJoinedInMinutes(Integer value) { + meetingExpireIfNoUserJoinedInMinutes = value; + } + + public Integer getMeetingExpireIfNoUserJoinedInMinutes() { + return meetingExpireIfNoUserJoinedInMinutes; + } + + public Map<String, Object> getUserCustomData(String userID){ return (Map<String, Object>) userCustomData.get(userID); } - + + + /*** * Meeting Builder * diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/api2/IBbbWebApiGWApp.java b/bbb-common-web/src/main/java/org/bigbluebutton/api2/IBbbWebApiGWApp.java index 08d6045e52db85407c2b95520f1b64ed5e4d8b03..d40b7de845da69b301ee9e74c816c99bbe3d0c45 100755 --- a/bbb-common-web/src/main/java/org/bigbluebutton/api2/IBbbWebApiGWApp.java +++ b/bbb-common-web/src/main/java/org/bigbluebutton/api2/IBbbWebApiGWApp.java @@ -16,7 +16,11 @@ public interface IBbbWebApiGWApp { String moderatorPass, String viewerPass, Long createTime, String createDate, Boolean isBreakout, Integer sequence, Map<String, String> metadata, String guestPolicy, String welcomeMsgTemplate, String welcomeMsg, String modOnlyMessage, - String dialNumber, Integer maxUsers); + String dialNumber, Integer maxUsers, + Integer maxInactivityTimeoutMinutes, Integer warnMinutesBeforeMax, + Integer meetingExpireIfNoUserJoinedInMinutes, + Integer meetingExpireWhenLastUserLeftInMinutes); + void registerUser(String meetingID, String internalUserId, String fullname, String role, String externUserID, String authToken, String avatarURL, Boolean guest, Boolean authed); diff --git a/bbb-common-web/src/main/scala/org/bigbluebutton/api2/BbbWebApiGWApp.scala b/bbb-common-web/src/main/scala/org/bigbluebutton/api2/BbbWebApiGWApp.scala index 64d41f4afd894781da69e1eb255d694781ae1aef..42dc778f5bb61f49c12f62ac9b87ba4ec2919106 100755 --- a/bbb-common-web/src/main/scala/org/bigbluebutton/api2/BbbWebApiGWApp.scala +++ b/bbb-common-web/src/main/scala/org/bigbluebutton/api2/BbbWebApiGWApp.scala @@ -85,11 +85,19 @@ class BbbWebApiGWApp(val oldMessageReceivedGW: OldMessageReceivedGW, sequence: java.lang.Integer, metadata: java.util.Map[String, String], guestPolicy: String, welcomeMsgTemplate: String, welcomeMsg: String, modOnlyMessage: String, - dialNumber: String, maxUsers: java.lang.Integer): Unit = { + dialNumber: String, maxUsers: java.lang.Integer, maxInactivityTimeoutMinutes: java.lang.Integer, + warnMinutesBeforeMax: java.lang.Integer, + meetingExpireIfNoUserJoinedInMinutes: java.lang.Integer, + meetingExpireWhenLastUserLeftInMinutes: java.lang.Integer): Unit = { val meetingProp = MeetingProp(name = meetingName, extId = extMeetingId, intId = meetingId, isBreakout = isBreakout.booleanValue()) - val durationProps = DurationProps(duration = duration.intValue(), createdTime = createTime.longValue(), createDate) + val durationProps = DurationProps(duration = duration.intValue(), + createdTime = createTime.longValue(), createDate, + maxInactivityTimeoutMinutes = maxInactivityTimeoutMinutes.intValue(), + warnMinutesBeforeMax = warnMinutesBeforeMax.intValue(), + meetingExpireIfNoUserJoinedInMinutes = meetingExpireIfNoUserJoinedInMinutes.intValue(), + meetingExpireWhenLastUserLeftInMinutes = meetingExpireWhenLastUserLeftInMinutes.intValue()) val password = PasswordProp(moderatorPass = moderatorPass, viewerPass = viewerPass) val recordProp = RecordProp(record = recorded.booleanValue(), autoStartRecording = autoStartRecording.booleanValue(), diff --git a/bbb-common-web/src/main/scala/org/bigbluebutton/api2/meeting/MeetingsManagerActor.scala b/bbb-common-web/src/main/scala/org/bigbluebutton/api2/meeting/MeetingsManagerActor.scala index 1654197439c79a120c892ceaa05a04820ade82a3..b8f8b351133e3636892fb562e748e5f2ecbf481d 100755 --- a/bbb-common-web/src/main/scala/org/bigbluebutton/api2/meeting/MeetingsManagerActor.scala +++ b/bbb-common-web/src/main/scala/org/bigbluebutton/api2/meeting/MeetingsManagerActor.scala @@ -5,7 +5,6 @@ import org.bigbluebutton.api.domain.UserSession import org.bigbluebutton.api2.bus.MsgToAkkaAppsEventBus import org.bigbluebutton.common2.domain.DefaultProps import org.bigbluebutton.api2.util.Util2 -import org.bigbluebutton.common.messages.UserJoinedVoiceMessage import org.bigbluebutton.common2.msgs.{BbbCommonEnvCoreMsg, MeetingCreatedEvtMsg} sealed trait ApiMsg diff --git a/bbb-video/src/main/java/org/bigbluebutton/app/video/VideoApplication.java b/bbb-video/src/main/java/org/bigbluebutton/app/video/VideoApplication.java index c604ccfefd46a7741bf195b28aecf984c99aaa62..89957e1d1ddd85f4042e5ae77a52071ce0cc0f66 100755 --- a/bbb-video/src/main/java/org/bigbluebutton/app/video/VideoApplication.java +++ b/bbb-video/src/main/java/org/bigbluebutton/app/video/VideoApplication.java @@ -202,6 +202,36 @@ public class VideoApplication extends MultiThreadedApplicationAdapter { log.info("streamPublishStart " + stream.getPublishedName() + " " + System.currentTimeMillis() + " " + conn.getScope().getName()); } + private String getStreamName(String streamName) { + String parts[] = streamName.split("/"); + if(parts.length > 1) + return parts[parts.length-1]; + return ""; + } + + private void requestRotateVideoTranscoder(IBroadcastStream stream) { + IConnection conn = Red5.getConnectionLocal(); + String userId = getUserId(); + String meetingId = conn.getScope().getName(); + String streamId = stream.getPublishedName(); + String streamName = getStreamName(streamId); + String ipAddress = conn.getHost(); + + switch (VideoRotator.getDirection(streamId)) { + case VideoRotator.ROTATE_RIGHT: + publisher.startRotateRightTranscoderRequest(meetingId, userId, streamName, ipAddress); + break; + case VideoRotator.ROTATE_LEFT: + publisher.startRotateLeftTranscoderRequest(meetingId, userId, streamName, ipAddress); + break; + case VideoRotator.ROTATE_UPSIDE_DOWN: + publisher.startRotateUpsideDownTranscoderRequest(meetingId, userId, streamName, ipAddress); + break; + default: + break; + } + } + @Override public void streamBroadcastStart(IBroadcastStream stream) { IConnection conn = Red5.getConnectionLocal(); @@ -214,7 +244,14 @@ public class VideoApplication extends MultiThreadedApplicationAdapter { Matcher matcher = RECORD_STREAM_ID_PATTERN.matcher(stream.getPublishedName()); - if (matcher.matches()) { + addH263PublishedStream(streamId); + if (streamId.contains("/")) { + if(VideoRotator.getDirection(streamId) != null) { + //VideoRotator rotator = new VideoRotator(streamId); + videoRotators.put(streamId, null); + requestRotateVideoTranscoder(stream); + } + } else if (matcher.matches()) { log.info("Start recording of stream=[" + stream.getPublishedName() + "] for meeting=[" + conn.getScope().getName() + "]"); Boolean recordVideoStream = true; @@ -223,15 +260,7 @@ public class VideoApplication extends MultiThreadedApplicationAdapter { stream.addStreamListener(listener); streamListeners.put(conn.getScope().getName() + "-" + stream.getPublishedName(), listener); - addH263PublishedStream(streamId); - if (streamId.contains("/")) { - if(VideoRotator.getDirection(streamId) != null) { - VideoRotator rotator = new VideoRotator(streamId); - videoRotators.put(streamId, rotator); - } - } else { - recordStream(stream); - } + recordStream(stream); } @@ -265,6 +294,13 @@ public class VideoApplication extends MultiThreadedApplicationAdapter { String streamId = stream.getPublishedName(); Matcher matcher = RECORD_STREAM_ID_PATTERN.matcher(stream.getPublishedName()); + removeH263ConverterIfNeeded(streamId); + if (videoRotators.containsKey(streamId)) { + // Stop rotator + videoRotators.remove(streamId); + publisher.stopTranscoderRequest(meetingId, userId); + } + removeH263PublishedStream(streamId); if (matcher.matches()) { IStreamListener listener = streamListeners.remove(scopeName + "-" + stream.getPublishedName()); if (listener != null) { @@ -285,12 +321,6 @@ public class VideoApplication extends MultiThreadedApplicationAdapter { } - removeH263ConverterIfNeeded(streamId); - if (videoRotators.containsKey(streamId)) { - // Stop rotator - videoRotators.remove(streamId).stop(); - } - removeH263PublishedStream(streamId); } /** @@ -338,7 +368,7 @@ public class VideoApplication extends MultiThreadedApplicationAdapter { // Check if a new stream converter is necessary H263Converter converter; if(!h263Converters.containsKey(streamName) && !isStreamPublished(streamName)) { - converter = new H263Converter(streamName); + converter = new H263Converter(streamName, publisher); h263Converters.put(streamName, converter); } else { diff --git a/bbb-video/src/main/java/org/bigbluebutton/app/video/converter/H263Converter.java b/bbb-video/src/main/java/org/bigbluebutton/app/video/converter/H263Converter.java index c5185125d7e0818aa774066f2d69468cd67a3638..e16693888c06f32ba787dfe11cfdcb5e430a5438 100644 --- a/bbb-video/src/main/java/org/bigbluebutton/app/video/converter/H263Converter.java +++ b/bbb-video/src/main/java/org/bigbluebutton/app/video/converter/H263Converter.java @@ -1,8 +1,6 @@ package org.bigbluebutton.app.video.converter; -import org.bigbluebutton.app.video.ffmpeg.FFmpegCommand; -import org.bigbluebutton.app.video.ffmpeg.ProcessMonitor; -import org.bigbluebutton.app.video.ffmpeg.ProcessMonitorObserver; +import org.bigbluebutton.red5.pubsub.MessagePublisher; import org.red5.logging.Red5LoggerFactory; import org.red5.server.api.IConnection; import org.red5.server.api.Red5; @@ -16,7 +14,7 @@ import org.slf4j.Logger; * Converted streams are published in the same scope as the original ones, * with 'h263/' appended in the beginning. */ -public class H263Converter implements ProcessMonitorObserver{ +public class H263Converter { private static Logger log = Red5LoggerFactory.getLogger(H263Converter.class, "video"); @@ -25,8 +23,11 @@ public class H263Converter implements ProcessMonitorObserver{ private String origin; private Integer numListeners = 0; - private FFmpegCommand ffmpeg; - private ProcessMonitor processMonitor; + private MessagePublisher publisher; + private Boolean publishing; + private String ipAddress; + private String meetingId; + private String userId; /** * Creates a H263Converter from a given streamName. It is assumed @@ -35,38 +36,26 @@ public class H263Converter implements ProcessMonitorObserver{ * * @param origin streamName of the stream that should be converted */ - public H263Converter(String origin) { + public H263Converter(String origin, MessagePublisher publisher) { log.info("Spawn FFMpeg to convert H264 to H263 for stream [{}]", origin); this.origin = origin; - IConnection conn = Red5.getConnectionLocal(); - String ip = conn.getHost(); - String conf = conn.getScope().getName(); - String inputLive = "rtmp://" + ip + "/video/" + conf + "/" + origin + " live=1"; - - String output = "rtmp://" + ip + "/video/" + conf + "/" + H263PREFIX + origin; - - ffmpeg = new FFmpegCommand(); - ffmpeg.setFFmpegPath("/usr/local/bin/ffmpeg"); - ffmpeg.setInput(inputLive); - ffmpeg.setCodec("flv1"); // Sorensen H263 - ffmpeg.setFormat("flv"); - ffmpeg.setOutput(output); - ffmpeg.setAudioEnabled(false); - ffmpeg.setLoglevel("quiet"); - ffmpeg.setAnalyzeDuration("10000"); // 10ms + this.publisher = publisher; + this.publishing = false; + IConnection conn = Red5.getConnectionLocal(); + this.ipAddress = conn.getHost(); + this.meetingId = conn.getScope().getName(); + this.userId = getUserId(); } /** - * Launches the process monitor responsible for FFmpeg. + * Launches the transcoder event responsible for FFmpeg. */ private void startConverter() { - if (processMonitor == null){ - String[] command = ffmpeg.getFFmpegCommand(true); - processMonitor = new ProcessMonitor(command,"FFMPEG"); - processMonitor.setProcessMonitorObserver(this); - processMonitor.start(); - }else log.debug("No need to start transcoder, it is already running"); + if (!publishing) { + publisher.startH264ToH263TranscoderRequest(meetingId, userId, origin, ipAddress); + publishing = true; + } else log.debug("No need to start transcoder, it is already running"); } /** @@ -102,28 +91,17 @@ public class H263Converter implements ProcessMonitorObserver{ * listeners to zero. */ public synchronized void stopConverter() { - if(processMonitor != null) { + if (publishing) { this.numListeners = 0; - processMonitor.forceDestroy(); - processMonitor = null; + publisher.stopTranscoderRequest(meetingId, userId); + publishing = false; log.debug("Transcoder force-stopped"); - }else log.debug("No need to stop transcoder, it already stopped"); + } else log.debug("No need to stop transcoder, it already stopped"); } - private synchronized void clearConverterData(){ - if(processMonitor!=null){ - log.debug("Clearing process monitor's data."); - this.numListeners = 0; - processMonitor=null; - } - } - - @Override - public void handleProcessFinishedUnsuccessfully(String processName, String processOutput){} - - @Override - public void handleProcessFinishedWithSuccess(String processName, String processOutput){ - log.debug("{} finished successfully [output={}]. ",processName,processOutput); - //clearConverterData(); - } + private String getUserId() { + String userid = (String) Red5.getConnectionLocal().getAttribute("USERID"); + if ((userid == null) || ("".equals(userid))) userid = "unknown-userid"; + return userid; + } } diff --git a/bbb-video/src/main/java/org/bigbluebutton/app/video/converter/VideoRotator.java b/bbb-video/src/main/java/org/bigbluebutton/app/video/converter/VideoRotator.java index 9c87aa93041ba6c6fe25f81a71a9a68a5bee752e..144875717bd27e35c2ecbb6a0d26c3b0bb8e0e1f 100644 --- a/bbb-video/src/main/java/org/bigbluebutton/app/video/converter/VideoRotator.java +++ b/bbb-video/src/main/java/org/bigbluebutton/app/video/converter/VideoRotator.java @@ -18,9 +18,10 @@ public class VideoRotator { public static final String ROTATE_LEFT = "rotate_left"; public static final String ROTATE_RIGHT = "rotate_right"; + public static final String ROTATE_UPSIDE_DOWN = "rotate_left/rotate_left"; private String streamName; - private FFmpegCommand.ROTATE direction; +// private FFmpegCommand.ROTATE direction; private FFmpegCommand ffmpeg; private ProcessMonitor processMonitor; @@ -35,9 +36,9 @@ public class VideoRotator { */ public VideoRotator(String origin) { this.streamName = getStreamName(origin); - this.direction = getDirection(origin); +// this.direction = getDirection(origin); - log.debug("Setting up VideoRotator: StreamName={}, Direction={}",this.streamName,this.direction); +// log.debug("Setting up VideoRotator: StreamName={}, Direction={}",this.streamName,this.direction); IConnection conn = Red5.getConnectionLocal(); String ip = conn.getHost(); String conf = conn.getScope().getName(); @@ -51,7 +52,7 @@ public class VideoRotator { ffmpeg.setFormat("flv"); ffmpeg.setOutput(output); ffmpeg.setLoglevel("warning"); - ffmpeg.setRotation(direction); +// ffmpeg.setRotation(direction); ffmpeg.setAnalyzeDuration("10000"); // 10ms start(); @@ -72,16 +73,22 @@ public class VideoRotator { /** * Get the rotate direction from the streamName string. * @param streamName Name of the stream with rotate direction - * @return FFmpegCommand.ROTATE for the given direction if present, null otherwise + * @return String for the given direction if present, null otherwise */ - public static FFmpegCommand.ROTATE getDirection(String streamName) { - String parts[] = streamName.split("/"); + public static String getDirection(String streamName) { + int index = streamName.lastIndexOf("/"); + String parts[] = { + streamName.substring(0, index), + streamName.substring(index + 1) + }; switch(parts[0]) { case ROTATE_LEFT: - return FFmpegCommand.ROTATE.LEFT; + return ROTATE_LEFT; case ROTATE_RIGHT: - return FFmpegCommand.ROTATE.RIGHT; + return ROTATE_RIGHT; + case ROTATE_UPSIDE_DOWN: + return ROTATE_UPSIDE_DOWN; default: return null; } @@ -91,7 +98,7 @@ public class VideoRotator { * Start FFmpeg process to rotate and re-publish the stream. */ public void start() { - log.debug("Spawn FFMpeg to rotate [{}] stream [{}]", direction.name(), streamName); +// log.debug("Spawn FFMpeg to rotate [{}] stream [{}]", direction.name(), streamName); String[] command = ffmpeg.getFFmpegCommand(true); if (processMonitor == null) { processMonitor = new ProcessMonitor(command,"FFMPEG"); @@ -103,7 +110,7 @@ public class VideoRotator { * Stop FFmpeg process that is rotating and re-publishing the stream. */ public void stop() { - log.debug("Stopping FFMpeg from rotate [{}] stream [{}]", direction.name(), streamName); +// log.debug("Stopping FFMpeg from rotate [{}] stream [{}]", direction.name(), streamName); if(processMonitor != null) { processMonitor.destroy(); processMonitor = null; diff --git a/bbb-video/src/main/java/org/bigbluebutton/app/video/ffmpeg/FFmpegCommand.java b/bbb-video/src/main/java/org/bigbluebutton/app/video/ffmpeg/FFmpegCommand.java index ae2f3762c5cdea74c762dbf6872ebc0040538178..43f05bfb9854c387aa8133dc3cf130ca51e2b8ec 100644 --- a/bbb-video/src/main/java/org/bigbluebutton/app/video/ffmpeg/FFmpegCommand.java +++ b/bbb-video/src/main/java/org/bigbluebutton/app/video/ffmpeg/FFmpegCommand.java @@ -12,7 +12,7 @@ public class FFmpegCommand { /** * Indicate the direction to rotate the video */ - public enum ROTATE { LEFT, RIGHT }; + public enum ROTATE { LEFT, RIGHT, UPSIDE_DOWN }; private HashMap args; private HashMap x264Params; @@ -164,6 +164,9 @@ public class FFmpegCommand { case RIGHT: this.args.put("-vf", "transpose=1"); break; + case UPSIDE_DOWN: + this.args.put("-vf", "transpose=2,transpose=2"); + break; } } diff --git a/bbb-video/src/main/java/org/bigbluebutton/red5/pubsub/MessagePublisher.java b/bbb-video/src/main/java/org/bigbluebutton/red5/pubsub/MessagePublisher.java index db0c5b0584616338394c6f264ec382c35acb1bcd..ae4c66badb90542ecd6aeab12c3e26c6df51ea65 100755 --- a/bbb-video/src/main/java/org/bigbluebutton/red5/pubsub/MessagePublisher.java +++ b/bbb-video/src/main/java/org/bigbluebutton/red5/pubsub/MessagePublisher.java @@ -1,6 +1,14 @@ package org.bigbluebutton.red5.pubsub; -import org.bigbluebutton.common.messages.*; +import org.bigbluebutton.common.messages.MessagingConstants; +import org.bigbluebutton.common.messages.Constants; +import org.bigbluebutton.common.messages.UserSharedWebcamMessage; +import org.bigbluebutton.common.messages.UserUnshareWebcamRequestMessage; +import org.bigbluebutton.common.messages.StartTranscoderRequestMessage; +import org.bigbluebutton.common.messages.StopTranscoderRequestMessage; + +import java.util.HashMap; +import java.util.Map; public class MessagePublisher { @@ -21,4 +29,54 @@ public class MessagePublisher { sender.send(MessagingConstants.TO_USERS_CHANNEL, msg.toJson()); } + public void startRotateLeftTranscoderRequest(String meetingId, String userId, String streamName, String ipAddress) { + Map<String, String> params = new HashMap<String, String>(); + params.put(Constants.TRANSCODER_TYPE, Constants.TRANSCODE_ROTATE_LEFT); + params.put(Constants.LOCAL_IP_ADDRESS, ipAddress); + params.put(Constants.DESTINATION_IP_ADDRESS, ipAddress); + params.put(Constants.INPUT, streamName); + // TODO: transcoderId is getting userId, this may have to change + StartTranscoderRequestMessage msg = new StartTranscoderRequestMessage(meetingId, userId, params); + sender.send(MessagingConstants.TO_BBB_TRANSCODE_SYSTEM_CHAN, msg.toJson()); + } + + public void startRotateRightTranscoderRequest(String meetingId, String userId, String streamName, String ipAddress) { + Map<String, String> params = new HashMap<String, String>(); + params.put(Constants.TRANSCODER_TYPE, Constants.TRANSCODE_ROTATE_RIGHT); + params.put(Constants.LOCAL_IP_ADDRESS, ipAddress); + params.put(Constants.DESTINATION_IP_ADDRESS, ipAddress); + params.put(Constants.INPUT, streamName); + // TODO: transcoderId is getting userId, this may have to change + StartTranscoderRequestMessage msg = new StartTranscoderRequestMessage(meetingId, userId, params); + sender.send(MessagingConstants.TO_BBB_TRANSCODE_SYSTEM_CHAN, msg.toJson()); + } + + public void startRotateUpsideDownTranscoderRequest(String meetingId, String userId, String streamName, String ipAddress) { + Map<String, String> params = new HashMap<String, String>(); + params.put(Constants.TRANSCODER_TYPE, Constants.TRANSCODE_ROTATE_UPSIDE_DOWN); + params.put(Constants.LOCAL_IP_ADDRESS, ipAddress); + params.put(Constants.DESTINATION_IP_ADDRESS, ipAddress); + params.put(Constants.INPUT, streamName); + // TODO: transcoderId is getting userId, this may have to change + StartTranscoderRequestMessage msg = new StartTranscoderRequestMessage(meetingId, userId, params); + sender.send(MessagingConstants.TO_BBB_TRANSCODE_SYSTEM_CHAN, msg.toJson()); + } + + public void startH264ToH263TranscoderRequest(String meetingId, String userId, String streamName, String ipAddress) { + Map<String, String> params = new HashMap<String, String>(); + params.put(Constants.TRANSCODER_TYPE, Constants.TRANSCODE_H264_TO_H263); + params.put(Constants.MODULE, "video"); + params.put(Constants.LOCAL_IP_ADDRESS, ipAddress); + params.put(Constants.DESTINATION_IP_ADDRESS, ipAddress); + params.put(Constants.INPUT, streamName); + // TODO: transcoderId is getting userId, this may have to change + StartTranscoderRequestMessage msg = new StartTranscoderRequestMessage(meetingId, userId, params); + sender.send(MessagingConstants.TO_BBB_TRANSCODE_SYSTEM_CHAN, msg.toJson()); + } + + public void stopTranscoderRequest(String meetingId, String userId) { + // TODO: transcoderId is getting userId, this may have to change + StopTranscoderRequestMessage msg = new StopTranscoderRequestMessage(meetingId, userId); + sender.send(MessagingConstants.TO_BBB_TRANSCODE_SYSTEM_CHAN, msg.toJson()); + } } diff --git a/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/BigBlueButtonApplication.java b/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/BigBlueButtonApplication.java index 9b9f68b3cd04170f46d5a1636f6a44e3181f60e7..dbada54328be8f323e594c8c013139eea73fdc92 100755 --- a/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/BigBlueButtonApplication.java +++ b/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/BigBlueButtonApplication.java @@ -154,15 +154,6 @@ public class BigBlueButtonApplication extends MultiThreadedApplicationAdapter { if (params.length >= 7 && ((Boolean) params[7])) { muted = true; } - - Map<String, Boolean> lsMap = null; - if (params.length >= 8) { - try { - lsMap = (Map<String, Boolean> ) params[8]; - } catch(Exception e){ - lsMap = new HashMap<String, Boolean>(); - } - } Boolean guest = false; if (params.length >= 9 && ((Boolean) params[9])) { @@ -214,10 +205,6 @@ public class BigBlueButtonApplication extends MultiThreadedApplicationAdapter { connection.setAttribute("USER_SESSION_ID", sessionId); connection.setAttribute("TIMESTAMP", System.currentTimeMillis()); - red5InGW.initLockSettings(room, lsMap); - - red5InGW.initAudioSettings(room, internalUserID, muted); - String meetingId = bbbSession.getRoom(); String userFullname = bbbSession.getUsername(); @@ -303,7 +290,7 @@ public class BigBlueButtonApplication extends MultiThreadedApplicationAdapter { if (removeUser) { // log.info("User leaving bbb-apps: data={}", logStr); System.out.println("User leaving bbb-apps: data=" + logStr); - red5InGW.userLeft(bbbSession.getRoom(), getBbbSession().getInternalUserID(), sessionId); + //red5InGW.userLeft(bbbSession.getRoom(), getBbbSession().getInternalUserID(), sessionId); } else { log.info("User not leaving bbb-apps but just disconnected: data={}", logStr); } @@ -330,37 +317,7 @@ public class BigBlueButtonApplication extends MultiThreadedApplicationAdapter { String token = bbbSession.getAuthToken(); return new ConnInfo(meetingId, userId, token, connId, sessionId); } - - public void validateToken(Map<String, String> msg) { - String token = (String) msg.get("authToken"); - - BigBlueButtonSession bbbSession = (BigBlueButtonSession) Red5.getConnectionLocal().getAttribute(Constants.SESSION); - assert bbbSession != null; - String userId = bbbSession.getInternalUserID(); - String meetingId = Red5.getConnectionLocal().getScope().getName(); - String connId = Red5.getConnectionLocal().getSessionId(); - String sessionId = CONN + connId + "-" + userId; - - Map<String, Object> logData = new HashMap<String, Object>(); - logData.put("meetingId", meetingId); - logData.put("connId", connId); - logData.put("sessionId", sessionId); - logData.put("userId", userId); - logData.put("token", token); - logData.put("event", "user_validate_token_bbb_apps"); - logData.put("description", "User validate token BBB Apps."); - - Gson gson = new Gson(); - String logStr = gson.toJson(logData); - - // log.info("User validate token bbb-apps: data={}", logStr); - System.out.println("User validate token bbb-apps: data=" + logStr); - System.out.println("User validate token bbb-apps: data=" + logStr); - red5InGW.validateAuthToken(meetingId, userId, token, meetingId + "/" + userId, sessionId); - } - - private BigBlueButtonSession getBbbSession() { return (BigBlueButtonSession) Red5.getConnectionLocal().getAttribute(Constants.SESSION); } diff --git a/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/client/messaging/ConnectionInvokerService.java b/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/client/messaging/ConnectionInvokerService.java index 86bc8b12ae5cd490258e9b830c40a1c113f83b63..d15d351dd584464a7c3d3d41344f306ba0e37ab8 100755 --- a/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/client/messaging/ConnectionInvokerService.java +++ b/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/client/messaging/ConnectionInvokerService.java @@ -150,14 +150,14 @@ public class ConnectionInvokerService implements IConnectionInvokerService { } private void handleCloseMeetingAllConnectionsMsg(CloseMeetingAllConnectionsMsg msg) { + log.info("Disconnecting all clients for meeting {}", msg.meetingId); + IScope meetingScope = getScope(msg.meetingId); if (meetingScope != null) { Set<IConnection> conns = meetingScope.getClientConnections(); for (IConnection conn : conns) { if (conn.isConnected()) { - String connId = (String) conn.getAttribute("INTERNAL_USER_ID"); - log.info("Disconnecting client=[{}] from meeting=[{}]", connId, msg.meetingId); conn.close(); } } diff --git a/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/pubsub/MessagePublisher.java b/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/pubsub/MessagePublisher.java index 3287d4c4bbdb9fff5ed771061bbc9baa99c951ae..e4674eff8fafffdabae0bfd4ce997bcb8b2eda1d 100755 --- a/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/pubsub/MessagePublisher.java +++ b/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/pubsub/MessagePublisher.java @@ -1,7 +1,5 @@ package org.bigbluebutton.red5.pubsub; -import java.util.Map; - import org.bigbluebutton.common.messages.*; import org.bigbluebutton.client.IClientInGW; @@ -12,91 +10,6 @@ public class MessagePublisher { public void setMessageSender(IClientInGW sender) { this.sender = sender; } - - // Polling - public void votePoll(String meetingId, String userId, String pollId, Integer questionId, Integer answerId) { - VotePollUserRequestMessage msg = new VotePollUserRequestMessage(meetingId, userId, pollId, questionId, answerId); - sender.send(MessagingConstants.TO_POLLING_CHANNEL, msg.toJson()); - } - - public void sendPollingMessage(String json) { - sender.send(MessagingConstants.TO_POLLING_CHANNEL, json); - } - - public void startPoll(String meetingId, String requesterId, String pollId, String pollType) { - StartPollRequestMessage msg = new StartPollRequestMessage(meetingId, requesterId, pollId, pollType); - sender.send(MessagingConstants.TO_POLLING_CHANNEL, msg.toJson()); - } - - public void stopPoll(String meetingId, String userId, String pollId) { - StopPollRequestMessage msg = new StopPollRequestMessage(meetingId, userId, pollId); - sender.send(MessagingConstants.TO_POLLING_CHANNEL, msg.toJson()); - } - - public void showPollResult(String meetingId, String requesterId, String pollId, Boolean show) { - ShowPollResultRequestMessage msg = new ShowPollResultRequestMessage(meetingId, requesterId, pollId, show); - sender.send(MessagingConstants.TO_POLLING_CHANNEL, msg.toJson()); - } - - public void initLockSettings(String meetingID, Map<String, Boolean> permissions) { - InitPermissionsSettingMessage msg = new InitPermissionsSettingMessage(meetingID, permissions); - sender.send(MessagingConstants.TO_USERS_CHANNEL, msg.toJson()); - } - - public void sendLockSettings(String meetingID, String userId, Map<String, Boolean> settings) { - SendLockSettingsMessage msg = new SendLockSettingsMessage(meetingID, userId, settings); - sender.send(MessagingConstants.TO_MEETING_CHANNEL, msg.toJson()); - } - - public void getLockSettings(String meetingId, String userId) { - GetLockSettingsMessage msg = new GetLockSettingsMessage(meetingId, userId); - sender.send(MessagingConstants.TO_MEETING_CHANNEL, msg.toJson()); - } - - public void lockUser(String meetingId, String requesterID, boolean lock, String internalUserID) { - LockUserMessage msg = new LockUserMessage(meetingId, requesterID, lock, internalUserID); - sender.send(MessagingConstants.TO_MEETING_CHANNEL, msg.toJson()); - } - - public void validateAuthToken(String meetingId, String userId, String token, String correlationId, String sessionId) { - ValidateAuthTokenMessage msg = new ValidateAuthTokenMessage(meetingId, userId, token, correlationId, sessionId); - sender.send(MessagingConstants.TO_MEETING_CHANNEL, msg.toJson()); - } - - public void userEmojiStatus(String meetingId, String userId, String emojiStatus) { - UserEmojiStatusMessage msg = new UserEmojiStatusMessage(meetingId, userId, emojiStatus); - sender.send(MessagingConstants.TO_USERS_CHANNEL, msg.toJson()); - } - - public void shareWebcam(String meetingId, String userId, String stream) { - UserShareWebcamRequestMessage msg = new UserShareWebcamRequestMessage(meetingId, userId, stream); - sender.send(MessagingConstants.TO_USERS_CHANNEL, msg.toJson()); - } - - public void unshareWebcam(String meetingId, String userId, String stream) { - UserUnshareWebcamRequestMessage msg = new UserUnshareWebcamRequestMessage(meetingId, userId, stream); - sender.send(MessagingConstants.TO_USERS_CHANNEL, msg.toJson()); - } - - public void setUserStatus(String meetingId, String userId, String status, Object value) { - SetUserStatusRequestMessage msg = new SetUserStatusRequestMessage(meetingId, userId, status, value.toString()); - sender.send(MessagingConstants.TO_USERS_CHANNEL, msg.toJson()); - } - - public void getUsers(String meetingId, String requesterId) { - GetUsersRequestMessage msg = new GetUsersRequestMessage(meetingId, requesterId); - sender.send(MessagingConstants.TO_USERS_CHANNEL, msg.toJson()); - } - - public void userLeft(String meetingId, String userId, String sessionId) { - UserLeavingMessage msg = new UserLeavingMessage(meetingId, userId); - sender.send(MessagingConstants.TO_USERS_CHANNEL, msg.toJson()); - } - - public void assignPresenter(String meetingId, String newPresenterID, String newPresenterName, String assignedBy) { - AssignPresenterRequestMessage msg = new AssignPresenterRequestMessage(meetingId, newPresenterID, newPresenterName, assignedBy); - sender.send(MessagingConstants.TO_USERS_CHANNEL, msg.toJson()); - } public void setRecordingStatus(String meetingId, String userId, Boolean recording) { SetRecordingStatusRequestMessage msg = new SetRecordingStatusRequestMessage(meetingId, userId, recording); @@ -108,162 +21,6 @@ public class MessagePublisher { sender.send(MessagingConstants.TO_USERS_CHANNEL, msg.toJson()); } - public void getGuestPolicy(String meetingID, String userID) { - GetGuestPolicyMessage msg = new GetGuestPolicyMessage(meetingID, userID); - sender.send(MessagingConstants.TO_USERS_CHANNEL, msg.toJson()); - } - - public void newGuestPolicy(String meetingID, String guestPolicy, String setBy) { - SetGuestPolicyMessage msg = new SetGuestPolicyMessage(meetingID, guestPolicy, setBy); - sender.send(MessagingConstants.TO_USERS_CHANNEL, msg.toJson()); - } - - public void responseToGuest(String meetingID, String userID, Boolean response, String requesterID) { - RespondToGuestMessage msg = new RespondToGuestMessage(meetingID, userID, response, requesterID); - sender.send(MessagingConstants.TO_USERS_CHANNEL, msg.toJson()); - } - - public void setParticipantRole(String meetingID, String userID, String role) { - ChangeUserRoleMessage msg = new ChangeUserRoleMessage(meetingID, userID, role); - sender.send(MessagingConstants.TO_USERS_CHANNEL, msg.toJson()); - } - - public void initAudioSettings(String meetingID, String requesterID, Boolean muted) { - InitAudioSettingsMessage msg = new InitAudioSettingsMessage(meetingID, requesterID, muted); - sender.send(MessagingConstants.TO_USERS_CHANNEL, msg.toJson()); - } - - public void muteAllExceptPresenter(String meetingID, String requesterID, Boolean mute) { - MuteAllExceptPresenterRequestMessage msg = new MuteAllExceptPresenterRequestMessage(meetingID, requesterID, mute); - sender.send(MessagingConstants.TO_USERS_CHANNEL, msg.toJson()); - } - - public void muteAllUsers(String meetingID, String requesterID, Boolean mute) { - MuteAllRequestMessage msg = new MuteAllRequestMessage(meetingID, requesterID, mute); - sender.send(MessagingConstants.TO_USERS_CHANNEL, msg.toJson()); - } - - public void isMeetingMuted(String meetingID, String requesterID) { - IsMeetingMutedRequestMessage msg = new IsMeetingMutedRequestMessage(meetingID, requesterID); - sender.send(MessagingConstants.TO_USERS_CHANNEL, msg.toJson()); - } - - public void muteUser(String meetingID, String requesterID, String userID, Boolean mute) { - MuteUserRequestMessage msg = new MuteUserRequestMessage(meetingID, requesterID, userID, mute); - sender.send(MessagingConstants.TO_USERS_CHANNEL, msg.toJson()); - - } - - public void lockMuteUser(String meetingID, String requesterID, String userID, Boolean lock) { - LockMuteUserRequestMessage msg = new LockMuteUserRequestMessage(meetingID, requesterID, userID, lock); - sender.send(MessagingConstants.TO_USERS_CHANNEL, msg.toJson()); - } - - public void ejectUserFromVoice(String meetingID, String userId, String ejectedBy) { - EjectUserFromVoiceRequestMessage msg = new EjectUserFromVoiceRequestMessage(meetingID, ejectedBy, userId); - sender.send(MessagingConstants.TO_USERS_CHANNEL, msg.toJson()); - } - - public void ejectUserFromMeeting(String meetingId, String userId, String ejectedBy) { - EjectUserFromMeetingRequestMessage msg = new EjectUserFromMeetingRequestMessage(meetingId, userId, ejectedBy); - sender.send(MessagingConstants.TO_USERS_CHANNEL, msg.toJson()); - } - - public void removePresentation(String meetingID, String presentationID) { - RemovePresentationMessage msg = new RemovePresentationMessage(meetingID, presentationID); - sender.send(MessagingConstants.TO_PRESENTATION_CHANNEL, msg.toJson()); - } - - public void getPresentationInfo(String meetingID, String requesterID, String replyTo) { - GetPresentationInfoMessage msg = new GetPresentationInfoMessage(meetingID, requesterID, replyTo); - sender.send(MessagingConstants.TO_PRESENTATION_CHANNEL, msg.toJson()); - - } - - public void resizeAndMoveSlide(String meetingID, double xOffset, double yOffset, double widthRatio, double heightRatio) { - ResizeAndMoveSlideMessage msg = new ResizeAndMoveSlideMessage(meetingID, xOffset, yOffset, widthRatio, heightRatio); - sender.send(MessagingConstants.TO_PRESENTATION_CHANNEL, msg.toJson()); - } - - public void gotoSlide(String meetingID, String page) { - GoToSlideMessage msg = new GoToSlideMessage(meetingID, page); - sender.send(MessagingConstants.TO_PRESENTATION_CHANNEL, msg.toJson()); - } - - public void sharePresentation(String meetingID, String presentationID, boolean share) { - SharePresentationMessage msg = new SharePresentationMessage(meetingID, presentationID, share); - sender.send(MessagingConstants.TO_PRESENTATION_CHANNEL, msg.toJson()); - } - - public void getSlideInfo(String meetingID, String requesterID, String replyTo) { - GetSlideInfoMessage msg = new GetSlideInfoMessage(meetingID, requesterID, replyTo); - sender.send(MessagingConstants.TO_PRESENTATION_CHANNEL, msg.toJson()); - } - - public void sendConversionUpdate(String messageKey, String meetingId, String code, String presId, String presName) { - SendConversionUpdateMessage msg = new SendConversionUpdateMessage(messageKey, meetingId, code, presId, presName); - sender.send(MessagingConstants.TO_PRESENTATION_CHANNEL, msg.toJson()); - } - - public void sendPageCountError(String messageKey, String meetingId, String code, String presId, int numberOfPages, int maxNumberPages, String presName) { - SendPageCountErrorMessage msg = new SendPageCountErrorMessage(messageKey, meetingId, code, presId, numberOfPages, maxNumberPages, presName); - sender.send(MessagingConstants.TO_PRESENTATION_CHANNEL, msg.toJson()); - } - - public void sendSlideGenerated(String messageKey, String meetingId, String code, String presId, int numberOfPages, int pagesCompleted, String presName) { - SendSlideGeneratedMessage msg = new SendSlideGeneratedMessage(messageKey, meetingId, code, presId, numberOfPages, pagesCompleted, presName); - sender.send(MessagingConstants.TO_PRESENTATION_CHANNEL, msg.toJson()); - } - - public void sendConversionCompleted(String messageKey, String meetingId, - String code, String presId, int numPages, String presName, - String presBaseUrl, Boolean downloadable) { - SendConversionCompletedMessage msg = new SendConversionCompletedMessage(messageKey, meetingId, - code, presId, numPages, presName, presBaseUrl, downloadable); - sender.send(MessagingConstants.TO_PRESENTATION_CHANNEL, msg.toJson()); - } - - public void getCurrentLayout(String meetingID, String requesterID) { - GetCurrentLayoutRequestMessage msg = new GetCurrentLayoutRequestMessage(meetingID, requesterID); - sender.send(MessagingConstants.TO_USERS_CHANNEL, msg.toJson()); - } - - public void broadcastLayout(String meetingID, String requesterID, String layout) { - BroadcastLayoutRequestMessage msg = new BroadcastLayoutRequestMessage(meetingID, requesterID, layout); - sender.send(MessagingConstants.TO_USERS_CHANNEL, msg.toJson()); - } - - public void lockLayout(String meetingID, String setById, boolean lock, boolean viewersOnly, String layout) { - LockLayoutRequestMessage msg = new LockLayoutRequestMessage(meetingID, setById, lock, viewersOnly, layout); - sender.send(MessagingConstants.TO_USERS_CHANNEL, msg.toJson()); - } - - // could be improved by doing some factorization - public void getBreakoutRoomsList(String jsonMessage) { - sender.send(MessagingConstants.TO_USERS_CHANNEL, jsonMessage); - } - - public void createBreakoutRooms(String jsonMessage) { - sender.send(MessagingConstants.TO_USERS_CHANNEL, jsonMessage); - } - - public void requestBreakoutJoinURL(String jsonMessage) { - sender.send(MessagingConstants.TO_USERS_CHANNEL, jsonMessage); - } - - public void listenInOnBreakout(String jsonMessage) { - sender.send(MessagingConstants.TO_USERS_CHANNEL, jsonMessage); - } - - public void endAllBreakoutRooms(String jsonMessage) { - sender.send(MessagingConstants.TO_USERS_CHANNEL, jsonMessage); - } - - public void logoutEndMeeting(String meetingId, String userId) { - LogoutEndMeetingRequestMessage msg = new LogoutEndMeetingRequestMessage(meetingId, userId); - sender.send(MessagingConstants.TO_USERS_CHANNEL, msg.toJson()); - } - public void activityResponse(String meetingID) { ActivityResponseMessage msg = new ActivityResponseMessage(meetingID); sender.send(MessagingConstants.TO_MEETING_CHANNEL, msg.toJson()); diff --git a/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/pubsub/redis/RedisPubSubMessageHandler.java b/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/pubsub/redis/RedisPubSubMessageHandler.java index d54fec9649641c48eb2deb135f9d7b7550999f77..d16dc37b399c4539a0f2082142d6b788cfe4f5df 100755 --- a/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/pubsub/redis/RedisPubSubMessageHandler.java +++ b/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/pubsub/redis/RedisPubSubMessageHandler.java @@ -2,10 +2,7 @@ package org.bigbluebutton.red5.pubsub.redis; import org.bigbluebutton.common.messages.MessagingConstants; import org.bigbluebutton.red5.client.MeetingClientMessageSender; -import org.bigbluebutton.red5.client.PollingClientMessageSender; -import org.bigbluebutton.red5.client.PresentationClientMessageSender; import org.bigbluebutton.red5.client.UserClientMessageSender; -import org.bigbluebutton.red5.client.WhiteboardClientMessageSender; import org.bigbluebutton.red5.client.messaging.IConnectionInvokerService; import org.bigbluebutton.red5.monitoring.BbbAppsIsKeepAliveHandler; import org.slf4j.Logger; @@ -15,18 +12,12 @@ public class RedisPubSubMessageHandler implements MessageHandler { private IConnectionInvokerService service; private UserClientMessageSender userMessageSender; private MeetingClientMessageSender meetingMessageSender; - private PresentationClientMessageSender presentationMessageSender; - private WhiteboardClientMessageSender whiteboardMessageSender; //private BbbAppsIsKeepAliveHandler bbbAppsIsKeepAliveHandler; - private PollingClientMessageSender pollingMessageSender; public void setConnectionInvokerService(IConnectionInvokerService s) { this.service = s; userMessageSender = new UserClientMessageSender(service); meetingMessageSender = new MeetingClientMessageSender(service); - presentationMessageSender = new PresentationClientMessageSender(service); - whiteboardMessageSender = new WhiteboardClientMessageSender(service); - pollingMessageSender = new PollingClientMessageSender(service); } public void setBbbAppsIsKeepAliveHandler(BbbAppsIsKeepAliveHandler handler) { @@ -36,18 +27,12 @@ public class RedisPubSubMessageHandler implements MessageHandler { @Override public void handleMessage(String pattern, String channel, String message) { // System.out.println("in red5 getting message: " + channel + " " + message); - if (channel.equalsIgnoreCase(MessagingConstants.FROM_PRESENTATION_CHANNEL)) { - presentationMessageSender.handlePresentationMessage(message); - } else if (channel.equalsIgnoreCase(MessagingConstants.FROM_MEETING_CHANNEL)) { + if (channel.equalsIgnoreCase(MessagingConstants.FROM_MEETING_CHANNEL)) { meetingMessageSender.handleMeetingMessage(message); } else if (channel.equalsIgnoreCase(MessagingConstants.FROM_USERS_CHANNEL)) { userMessageSender.handleUsersMessage(message); - } else if (channel.equalsIgnoreCase(MessagingConstants.FROM_WHITEBOARD_CHANNEL)) { - whiteboardMessageSender.handleWhiteboardMessage(message); } else if (channel.equalsIgnoreCase(MessagingConstants.FROM_SYSTEM_CHANNEL)) { //bbbAppsIsKeepAliveHandler.handleKeepAliveMessage(message); - } else if (channel.equalsIgnoreCase(MessagingConstants.FROM_POLLING_CHANNEL)) { - pollingMessageSender.handlePollMessage(message); } } diff --git a/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/service/BreakoutRoomService.java b/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/service/BreakoutRoomService.java deleted file mode 100755 index 6ae1b91dd30c8f34d506bd137523e28637664f31..0000000000000000000000000000000000000000 --- a/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/service/BreakoutRoomService.java +++ /dev/null @@ -1,60 +0,0 @@ -/** - * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ - * - * Copyright (c) 2015 BigBlueButton Inc. and by respective authors (see below). - * - * This program is free software; you can redistribute it and/or modify it under the - * terms of the GNU Lesser General Public License as published by the Free Software - * Foundation; either version 3.0 of the License, or (at your option) any later - * version. - * - * BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along - * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. - * - */ -package org.bigbluebutton.red5.service; - -import org.bigbluebutton.messages.CreateBreakoutRoomsRequest; -import org.bigbluebutton.messages.EndAllBreakoutRoomsRequest; -import org.bigbluebutton.messages.GetBreakoutRoomsList; -import org.bigbluebutton.messages.ListenInOnBreakout; -import org.bigbluebutton.messages.RequestBreakoutJoinURL; -import org.bigbluebutton.red5.pubsub.MessagePublisher; - -public class BreakoutRoomService extends AbstractService { - - private MessagePublisher red5GW; - - public void setRed5Publisher(MessagePublisher inGW) { - red5GW = inGW; - } - - public void getBreakoutRoomsList(String jsonMessage) { - red5GW.getBreakoutRoomsList(addHeaderToMessage(jsonMessage, - GetBreakoutRoomsList.NAME)); - } - - public void createBreakoutRooms(String jsonMessage) { - red5GW.createBreakoutRooms(addHeaderToMessage(jsonMessage, - CreateBreakoutRoomsRequest.NAME)); - } - - public void requestBreakoutJoinUrl(String jsonMessage) { - red5GW.requestBreakoutJoinURL(addHeaderToMessage(jsonMessage, - RequestBreakoutJoinURL.NAME)); - } - - public void listenInOnBreakout(String jsonMessage) { - red5GW.listenInOnBreakout(addHeaderToMessage(jsonMessage, - ListenInOnBreakout.NAME)); - } - - public void endAllBreakoutRooms(String jsonMessage) { - red5GW.endAllBreakoutRooms(addHeaderToMessage(jsonMessage, - EndAllBreakoutRoomsRequest.NAME)); - } -} diff --git a/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/service/LayoutService.java b/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/service/LayoutService.java deleted file mode 100755 index 3a307c30885ad69ccdbd5b85e5d4328c0ce84e60..0000000000000000000000000000000000000000 --- a/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/service/LayoutService.java +++ /dev/null @@ -1,83 +0,0 @@ -/** -* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ -* -* Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below). -* -* This program is free software; you can redistribute it and/or modify it under the -* terms of the GNU Lesser General Public License as published by the Free Software -* Foundation; either version 3.0 of the License, or (at your option) any later -* version. -* -* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY -* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License along -* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. -* Author: Felipe Cecagno <felipe@mconf.org> -*/ -package org.bigbluebutton.red5.service; - -import java.util.Map; - -import org.bigbluebutton.red5.BigBlueButtonSession; -import org.bigbluebutton.red5.Constants; -import org.bigbluebutton.red5.pubsub.MessagePublisher; -import org.red5.server.api.Red5; - -public class LayoutService { - - private MessagePublisher red5GW; - - public void setRed5Publisher(MessagePublisher inGW) { - red5GW = inGW; - } - - public void getCurrentLayout() { - String meetingID = Red5.getConnectionLocal().getScope().getName(); - - red5GW.getCurrentLayout(meetingID, getBbbSession().getInternalUserID()); - } - - public void broadcast(Map<String, Object> message) { - String meetingID = Red5.getConnectionLocal().getScope().getName(); - String newlayout = (String) message.get("layout"); - - if (newlayout == null || newlayout.isEmpty()) { - //log.error("Invalid Broadcast Layout message. layout is null or empty."); - return; - } - - red5GW.broadcastLayout(meetingID, getBbbSession().getInternalUserID(), newlayout); - } - - public void lock(Map<String, Object> message) { - String meetingID = Red5.getConnectionLocal().getScope().getName(); - String newlayout = (String) message.get("layout"); - Boolean lock = (Boolean) message.get("lock"); - Boolean viewersOnly = (Boolean) message.get("viewersOnly"); - String layout; - - if (newlayout == null || newlayout.isEmpty()) { - layout = null; - } else { - layout = newlayout; - } - - if (lock == null) { - //log.error("Invalid Lock Layout message. lock in null."); - return; - } - - if (viewersOnly == null) { - //log.error("Invalid Lock Layout message. viewersOnly is null"); - return; - } - - red5GW.lockLayout(meetingID, getBbbSession().getInternalUserID(), lock, viewersOnly, layout); - } - - private BigBlueButtonSession getBbbSession() { - return (BigBlueButtonSession) Red5.getConnectionLocal().getAttribute(Constants.SESSION); - } -} diff --git a/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/service/LockService.java b/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/service/LockService.java deleted file mode 100755 index d0408cb53ea40d75a7df1221509ab2ef82c95c95..0000000000000000000000000000000000000000 --- a/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/service/LockService.java +++ /dev/null @@ -1,94 +0,0 @@ -/** -* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ -* -* Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below). -* -* This program is free software; you can redistribute it and/or modify it under the -* terms of the GNU Lesser General Public License as published by the Free Software -* Foundation; either version 3.0 of the License, or (at your option) any later -* version. -* -* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY -* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License along -* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. -* -*/ -package org.bigbluebutton.red5.service; - -import java.util.ArrayList; -import java.util.Map; - -import org.bigbluebutton.red5.BigBlueButtonSession; -import org.bigbluebutton.red5.Constants; -import org.bigbluebutton.red5.pubsub.MessagePublisher; -import org.red5.server.api.Red5; - -public class LockService { - - private MessagePublisher red5BBBInGW; - - /** - * Internal function used to get the session - * */ - private BigBlueButtonSession getBbbSession() { - return (BigBlueButtonSession) Red5.getConnectionLocal().getAttribute(Constants.SESSION); - } - - public void setRed5Publisher(MessagePublisher inGW) { - red5BBBInGW = inGW; - } - - /** - * Called from client to get lock settings for this room. - * */ - public void getLockSettings(){ - String meetingId = getBbbSession().getRoom(); - String userId = getMyUserId(); - - red5BBBInGW.getLockSettings(meetingId, userId); - } - - /** - * Called from client to get lock settings for this room. - * - * If room don't have any lock settings, it applies the defaultSettings - * sent from client (came from config.xml). - * - * Returns the new lock settings for the room. - * */ - public void setLockSettings(Map<String, Boolean> newSettings){ - String meetingId = getBbbSession().getRoom(); - String userId = getMyUserId(); - red5BBBInGW.sendLockSettings(meetingId, userId, newSettings); - } - - /** - * This method locks (or unlocks), based on lock parameter - * all users but the users listed in array dontLockTheseUsers - * */ - public void setAllUsersLock(Boolean lock, ArrayList<String> dontLockTheseUsers){ - - } - - /** - * This method locks or unlocks a specific user - * */ - public void setUserLock(Map<String, Object> msg) { - String meetingID = Red5.getConnectionLocal().getScope().getName(); - String requesterID = getBbbSession().getInternalUserID(); - - Boolean lock = (Boolean) msg.get("lock"); - String userId = (String) msg.get("userId"); - - red5BBBInGW.lockUser(meetingID, requesterID, lock, userId); - } - - public String getMyUserId() { - BigBlueButtonSession bbbSession = (BigBlueButtonSession) Red5.getConnectionLocal().getAttribute(Constants.SESSION); - assert bbbSession != null; - return bbbSession.getInternalUserID(); - } -} diff --git a/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/service/ParticipantsService.java b/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/service/ParticipantsService.java index 9aa8d0710b53c6a037dab17a576688fee8018cd1..953aedb4fe3c7c31a0abf8e4da90880b03c4d109 100755 --- a/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/service/ParticipantsService.java +++ b/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/service/ParticipantsService.java @@ -21,100 +21,20 @@ package org.bigbluebutton.red5.service; import org.red5.server.api.Red5; import org.red5.server.api.scope.IScope; -import java.util.HashMap; import java.util.Map; -import org.apache.commons.lang3.StringUtils; import org.bigbluebutton.red5.BigBlueButtonSession; import org.bigbluebutton.red5.Constants; import org.bigbluebutton.red5.pubsub.MessagePublisher; -import com.google.gson.Gson; - public class ParticipantsService { private MessagePublisher red5InGW; - public void assignPresenter(Map<String, String> msg) { - IScope scope = Red5.getConnectionLocal().getScope(); - String meetingId = scope.getName(); - String newPresenterID = (String) msg.get("newPresenterID"); - String newPresenterName = (String) msg.get("newPresenterName"); - String assignedBy = (String) msg.get("assignedBy"); - - red5InGW.assignPresenter(meetingId, newPresenterID, newPresenterName, assignedBy); - } - - public void getParticipants() { - IScope scope = Red5.getConnectionLocal().getScope(); - String meetingId = scope.getName(); - String userId = getBbbSession().getInternalUserID(); - red5InGW.getUsers(meetingId, userId); - } - public void activityResponse() { IScope scope = Red5.getConnectionLocal().getScope(); String meetingId = scope.getName(); red5InGW.activityResponse(meetingId); } - - public void userEmojiStatus(Map<String, String> msg) { - IScope scope = Red5.getConnectionLocal().getScope(); - String meetingId = scope.getName(); - String userId = (String) msg.get("userId"); - String emojiStatus = (String) msg.get("emojiStatus"); - - if (StringUtils.isEmpty(emojiStatus)) { - //log.warn("Invalid EmojiStatus from client: meetingId=" + meetingId + ", userId=" + userId + ",emoji=" + emojiStatus); - // Set emojiStatus=none if passed is null. - emojiStatus = "none"; - } - red5InGW.userEmojiStatus(meetingId, userId, emojiStatus); - } - - public void ejectUserFromMeeting(Map<String, String> msg) { - IScope scope = Red5.getConnectionLocal().getScope(); - String meetingId = scope.getName(); - String userId = (String) msg.get("userId"); - String ejectedBy = (String) msg.get("ejectedBy"); - - red5InGW.ejectUserFromMeeting(meetingId, userId, ejectedBy); - } - - public void shareWebcam(String stream) { - IScope scope = Red5.getConnectionLocal().getScope(); - String meetingId = scope.getName(); - String userId = getBbbSession().getInternalUserID(); - - red5InGW.shareWebcam(meetingId, userId, stream); - } - - public void unshareWebcam(String stream) { - IScope scope = Red5.getConnectionLocal().getScope(); - String meetingId = scope.getName(); - String userId = getBbbSession().getInternalUserID(); - - Map<String, Object> logData = new HashMap<String, Object>(); - logData.put("meetingId", scope.getName()); - logData.put("userId", userId); - logData.put("stream", stream); - - Gson gson = new Gson(); - String logStr = gson.toJson(logData); - - // log.warn("User unshared webcam. data={}", logStr ); - - red5InGW.unshareWebcam(meetingId, userId, stream); - } - - public void setParticipantStatus(Map<String, Object> msg) { - IScope scope = Red5.getConnectionLocal().getScope(); - String meetingId = scope.getName(); - String userId = (String) msg.get("userID"); - String status = (String) msg.get("status"); - Object value = (Object) msg.get("value"); - - red5InGW.setUserStatus(meetingId, userId, status, value); - } public void setRecordingStatus(Map<String, Object> msg) { IScope scope = Red5.getConnectionLocal().getScope(); @@ -137,43 +57,6 @@ public class ParticipantsService { assert bbbSession != null; return bbbSession.getInternalUserID(); } - - private BigBlueButtonSession getBbbSession() { - return (BigBlueButtonSession) Red5.getConnectionLocal().getAttribute(Constants.SESSION); - } - - public void getGuestPolicy() { - String requesterId = getBbbSession().getInternalUserID(); - String roomName = Red5.getConnectionLocal().getScope().getName(); - red5InGW.getGuestPolicy(roomName, requesterId); - } - - public void setGuestPolicy(String guestPolicy) { - String requesterId = getBbbSession().getInternalUserID(); - String roomName = Red5.getConnectionLocal().getScope().getName(); - red5InGW.newGuestPolicy(roomName, guestPolicy, requesterId); - } - - public void responseToGuest(Map<String, Object> msg) { - String requesterId = getBbbSession().getInternalUserID(); - String roomName = Red5.getConnectionLocal().getScope().getName(); - red5InGW.responseToGuest(roomName, (String) msg.get("userId"), (Boolean) msg.get("response"), requesterId); - } - - public void setParticipantRole(Map<String, String> msg) { - String roomName = Red5.getConnectionLocal().getScope().getName(); - String userId = (String) msg.get("userId"); - String role = (String) msg.get("role"); - //log.debug("Setting participant role " + roomName + " " + userId + " " + role); - red5InGW.setParticipantRole(roomName, userId, role); - } - - public void logoutEndMeeting(Map<String, Object> msg) { - IScope scope = Red5.getConnectionLocal().getScope(); - String meetingId = scope.getName(); - String userId = (String) msg.get("userId"); - red5InGW.logoutEndMeeting(meetingId, userId); - } public void setRed5Publisher(MessagePublisher red5InGW) { this.red5InGW = red5InGW; diff --git a/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/service/PollingService.java b/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/service/PollingService.java deleted file mode 100755 index c74bccb35a5751be5bd0e4383a5f712f0cf60fd8..0000000000000000000000000000000000000000 --- a/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/service/PollingService.java +++ /dev/null @@ -1,96 +0,0 @@ -/** -* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ -* -* Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below). -* -* This program is free software; you can redistribute it and/or modify it under the -* terms of the GNU Lesser General Public License as published by the Free Software -* Foundation; either version 3.0 of the License, or (at your option) any later -* version. -* -* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY -* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License along -* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. -* Author: Felipe Cecagno <felipe@mconf.org> -*/ -package org.bigbluebutton.red5.service; - -import java.util.Map; - -import org.bigbluebutton.red5.BigBlueButtonSession; -import org.bigbluebutton.red5.Constants; -import org.bigbluebutton.red5.pubsub.MessagePublisher; -import org.red5.server.api.Red5; - -public class PollingService { - - private MessagePublisher red5GW; - - public void setRed5Publisher(MessagePublisher inGW) { - red5GW = inGW; - } - - public void votePoll(Map<String, Object> message) { - String meetingID = Red5.getConnectionLocal().getScope().getName(); - String userId = getBbbSession().getInternalUserID(); - String pollId = (String) message.get("pollId"); - - Integer questionId; - if (message.get("answerId") instanceof Double) { - Double tempQuestionId = (Double) message.get("answerId"); - questionId = tempQuestionId.intValue(); - } else { - questionId = (Integer) message.get("answerId"); - } - - Integer answerId; - if (message.get("answerId") instanceof Double) { - Double tempAnswerId = (Double) message.get("answerId"); - answerId = tempAnswerId.intValue(); - } else { - answerId = (Integer) message.get("answerId"); - } - - red5GW.votePoll(meetingID, userId, pollId, questionId, answerId); - } - - public void showPollResult(Map<String, Object> message) { - String meetingID = Red5.getConnectionLocal().getScope().getName(); - String userId = getBbbSession().getInternalUserID(); - String pollId = (String) message.get("pollId"); - Boolean show = (Boolean) message.get("show"); - - red5GW.showPollResult(meetingID, userId, pollId, show); - } - - public void sendPollingMessage(String json) { - String meetingID = Red5.getConnectionLocal().getScope().getName(); - String userId = getBbbSession().getInternalUserID(); - - red5GW.sendPollingMessage(json); - } - - public void startPoll(Map<String, Object> message) { - String meetingID = Red5.getConnectionLocal().getScope().getName(); - String userId = getBbbSession().getInternalUserID(); - String pollId = (String) message.get("pollId"); - String pollType = (String) message.get("pollType"); - - red5GW.startPoll(meetingID, userId, pollId, pollType); - } - - public void stopPoll(Map<String, Object> message) { - String meetingID = Red5.getConnectionLocal().getScope().getName(); - String userId = getBbbSession().getInternalUserID(); - String pollId = (String) message.get("pollId"); - - red5GW.stopPoll(meetingID, userId, pollId); - } - - private BigBlueButtonSession getBbbSession() { - return (BigBlueButtonSession) Red5.getConnectionLocal().getAttribute(Constants.SESSION); - } -} diff --git a/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/service/PresentationApplication.java b/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/service/PresentationApplication.java deleted file mode 100755 index 691441421482b7c0bb3fc748e42f9af84025d2a1..0000000000000000000000000000000000000000 --- a/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/service/PresentationApplication.java +++ /dev/null @@ -1,98 +0,0 @@ -/** -* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ -* -* Copyright (c) 2015 BigBlueButton Inc. and by respective authors (see below). -* -* This program is free software; you can redistribute it and/or modify it under the -* terms of the GNU Lesser General Public License as published by the Free Software -* Foundation; either version 3.0 of the License, or (at your option) any later -* version. -* -* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY -* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License along -* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. -* -*/ -package org.bigbluebutton.red5.service; - -import org.bigbluebutton.red5.pubsub.MessagePublisher; - -public class PresentationApplication { - - private MessagePublisher red5BBBInGW; - - public void setRed5Publisher(MessagePublisher inGW) { - red5BBBInGW = inGW; - } - - public void clear(String meetingID) { - } - - public void sendConversionUpdate(String messageKey, String meetingId, - String code, String presentationId, String presName) { - - red5BBBInGW.sendConversionUpdate(messageKey, meetingId, code, - presentationId, presName); - } - - public void sendPageCountError(String messageKey, String meetingId, - String code, String presentationId, int numberOfPages, - int maxNumberPages, String presName) { - - red5BBBInGW.sendPageCountError(messageKey, meetingId, code, - presentationId, numberOfPages, maxNumberPages, presName); - } - - public void sendSlideGenerated(String messageKey, String meetingId, - String code, String presentationId, int numberOfPages, - int pagesCompleted, String presName) { - - red5BBBInGW.sendSlideGenerated(messageKey, meetingId, code, - presentationId, numberOfPages, pagesCompleted, presName); - } - - public void sendConversionCompleted(String messageKey, String meetingId, - String code, String presentation, int numberOfPages, - String presName, String presBaseUrl, Boolean downloadable) { - - red5BBBInGW.sendConversionCompleted(messageKey, meetingId, - code, presentation, numberOfPages, presName, presBaseUrl, downloadable); - } - - public void removePresentation(String meetingID, String presentationID){ - - red5BBBInGW.removePresentation(meetingID, presentationID); - } - - public void getPresentationInfo(String meetingID, String requesterID) { - // Just hardcode as we don't really need it for flash client. (ralam may 7, 2014) - String replyTo = meetingID + "/" + requesterID; - - red5BBBInGW.getPresentationInfo(meetingID, requesterID, replyTo); - } - - public void resizeAndMoveSlide(String meetingID, Double xOffset, Double yOffset, Double widthRatio, Double heightRatio) { - - red5BBBInGW.resizeAndMoveSlide(meetingID, xOffset, yOffset, widthRatio, heightRatio); - } - - public void gotoSlide(String meetingID, String pageId){ - - red5BBBInGW.gotoSlide(meetingID, pageId); - } - - public void sharePresentation(String meetingID, String presentationID, Boolean share){ - - red5BBBInGW.sharePresentation(meetingID, presentationID, share); - } - - public void getSlideInfo(String meetingID, String requesterID) { - // Just hardcode as we don't really need it for flash client. (ralam may 7, 2014) - - String replyTo = meetingID + "/" + requesterID; - red5BBBInGW.getSlideInfo(meetingID, requesterID, replyTo); - } -} \ No newline at end of file diff --git a/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/service/PresentationService.java b/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/service/PresentationService.java deleted file mode 100755 index 05097d022194ae8e5d56319798c470aa493fdc35..0000000000000000000000000000000000000000 --- a/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/service/PresentationService.java +++ /dev/null @@ -1,130 +0,0 @@ -/** - * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ - * - * Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below). - * - * This program is free software; you can redistribute it and/or modify it under the - * terms of the GNU Lesser General Public License as published by the Free Software - * Foundation; either version 3.0 of the License, or (at your option) any later - * version. - * - * BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along - * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. - * - */ -package org.bigbluebutton.red5.service; - -import java.util.Map; -import org.red5.server.api.Red5; -import org.red5.server.api.scope.IScope; -import org.bigbluebutton.red5.BigBlueButtonSession; -import org.bigbluebutton.red5.Constants; - -public class PresentationService { - - private PresentationApplication presentationApplication; - - public void removePresentation(Map<String, Object> msg) { - String presentationID = (String) msg.get("presentationID"); - - IScope scope = Red5.getConnectionLocal().getScope(); - presentationApplication.removePresentation(scope.getName(), presentationID); - } - - public void getSlideInfo() { - IScope scope = Red5.getConnectionLocal().getScope(); - presentationApplication.getSlideInfo(scope.getName(), getBbbSession().getInternalUserID()); - } - - public void clear() { - IScope scope = Red5.getConnectionLocal().getScope(); - presentationApplication.clear(scope.getName()); - } - - public void getPresentationInfo() { - IScope scope = Red5.getConnectionLocal().getScope(); - presentationApplication.getPresentationInfo(scope.getName(), getBbbSession().getInternalUserID()); - } - - public void gotoSlide(Map<String, Object> msg) { - String pageId = (String) msg.get("page"); - - IScope scope = Red5.getConnectionLocal().getScope(); - presentationApplication.gotoSlide(scope.getName(), pageId); - } - - public void sharePresentation(Map<String, Object> msg) { - String presentationID = (String) msg.get("presentationID"); - Boolean share = (Boolean) msg.get("share"); - - IScope scope = Red5.getConnectionLocal().getScope(); - presentationApplication.sharePresentation(scope.getName(), presentationID, share); - } - - public void resizeAndMoveSlide(Map<String, Object> msg) { - Double xOffset; - if (msg.get("xOffset") instanceof Integer) { - Integer tempXOffset = (Integer) msg.get("xOffset"); - xOffset = tempXOffset.doubleValue(); - } else { - xOffset = (Double) msg.get("xOffset"); - } - if (Double.isNaN(xOffset)) { - // log.warn("resizeAndMoveSlide came with xOffset as NaN, setting it to 0"); - xOffset = 0.0; - } - - Double yOffset; - - if (msg.get("yOffset") instanceof Integer) { - Integer tempYOffset = (Integer) msg.get("yOffset"); - yOffset = tempYOffset.doubleValue(); - } else { - yOffset = (Double) msg.get("yOffset"); - } - if (Double.isNaN(yOffset)) { - //log.warn("resizeAndMoveSlide came with yOffset as NaN, setting it to 0"); - yOffset = 0.0; - } - - Double widthRatio; - if (msg.get("widthRatio") instanceof Integer) { - Integer tempWRatio = (Integer) msg.get("widthRatio"); - widthRatio = tempWRatio.doubleValue(); - } else { - widthRatio = (Double) msg.get("widthRatio"); - } - if (Double.isNaN(widthRatio)) { - // log.warn("resizeAndMoveSlide came with widthRatio as NaN, setting it to 100"); - widthRatio = 100.0; - } - - - Double heightRatio; - if (msg.get("heightRatio") instanceof Integer) { - Integer tempHRatio = (Integer) msg.get("heightRatio"); - heightRatio = tempHRatio.doubleValue(); - } else { - heightRatio = (Double) msg.get("heightRatio"); - } - if (Double.isNaN(heightRatio)) { - //log.warn("resizeAndMoveSlide came with heightRatio as NaN, setting it to 100"); - heightRatio = 100.0; - } - - IScope scope = Red5.getConnectionLocal().getScope(); - presentationApplication.resizeAndMoveSlide(scope.getName(), xOffset, yOffset, widthRatio, heightRatio); - } - - public void setPresentationApplication(PresentationApplication a) { - presentationApplication = a; - } - - private BigBlueButtonSession getBbbSession() { - return (BigBlueButtonSession) Red5.getConnectionLocal().getAttribute(Constants.SESSION); - } -} \ No newline at end of file diff --git a/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/service/VoiceKeyUtil.java b/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/service/VoiceKeyUtil.java deleted file mode 100755 index f0f60a24bdb8975c3dc5147e2b7a2ce0b18c55c9..0000000000000000000000000000000000000000 --- a/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/service/VoiceKeyUtil.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.bigbluebutton.red5.service; - -public class VoiceKeyUtil { - public static final String MUTE = "mute"; - public static final String USERID = "userId"; -} \ No newline at end of file diff --git a/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/service/VoiceService.java b/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/service/VoiceService.java deleted file mode 100755 index c63af7d3dc3882f7ec8be2e66ea4915dbc186c05..0000000000000000000000000000000000000000 --- a/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/service/VoiceService.java +++ /dev/null @@ -1,84 +0,0 @@ -/** -* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ -* -* Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below). -* -* This program is free software; you can redistribute it and/or modify it under the -* terms of the GNU Lesser General Public License as published by the Free Software -* Foundation; either version 3.0 of the License, or (at your option) any later -* version. -* -* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY -* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License along -* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. -* -*/ -package org.bigbluebutton.red5.service; - -import java.util.Map; - -import org.bigbluebutton.red5.BigBlueButtonSession; -import org.bigbluebutton.red5.Constants; -import org.bigbluebutton.red5.pubsub.MessagePublisher; -import org.red5.server.api.Red5; - -public class VoiceService { - - private MessagePublisher red5InGW; - - public void muteAllUsersExceptPresenter(Map<String, Object> msg) { - String meetingID = Red5.getConnectionLocal().getScope().getName(); - String requesterID = getBbbSession().getInternalUserID(); - Boolean muteAll = (Boolean) msg.get("mute"); - red5InGW.muteAllExceptPresenter(meetingID, requesterID, muteAll); - } - - public void muteAllUsers(Map<String, Object> msg) { - String meetingID = Red5.getConnectionLocal().getScope().getName(); - String requesterID = getBbbSession().getInternalUserID(); - Boolean mute = (Boolean) msg.get("mute"); - red5InGW.muteAllUsers(meetingID, requesterID, mute); - } - - public void isRoomMuted(){ - String meetingID = Red5.getConnectionLocal().getScope().getName(); - String requesterID = getBbbSession().getInternalUserID(); - red5InGW.isMeetingMuted(meetingID, requesterID); - } - - public void muteUnmuteUser(Map<String, Object> msg) { - Boolean mute = (Boolean) msg.get(VoiceKeyUtil.MUTE); - String userid = (String) msg.get(VoiceKeyUtil.USERID); - - String meetingID = Red5.getConnectionLocal().getScope().getName(); - String requesterID = getBbbSession().getInternalUserID(); - red5InGW.muteUser(meetingID, requesterID, userid, mute); - } - - public void lockMuteUser(Map<String, Object> msg) { - Boolean lock = (Boolean) msg.get("lock"); - String userid = (String) msg.get("userId"); - - String meetingID = Red5.getConnectionLocal().getScope().getName(); - String requesterID = getBbbSession().getInternalUserID(); - red5InGW.lockMuteUser(meetingID, requesterID, userid, lock); - } - - public void ejectUserFromVoice(Map<String, Object> msg) { - String userId = (String) msg.get("userId"); - String meetingID = Red5.getConnectionLocal().getScope().getName(); - String ejectedBy = getBbbSession().getInternalUserID(); - red5InGW.ejectUserFromVoice(meetingID, userId, ejectedBy); - } - - private BigBlueButtonSession getBbbSession() { - return (BigBlueButtonSession) Red5.getConnectionLocal().getAttribute(Constants.SESSION); - } - - public void setRed5Publisher(MessagePublisher red5InGW) { - this.red5InGW = red5InGW; - } -} diff --git a/bigbluebutton-apps/src/main/webapp/WEB-INF/red5-web.xml b/bigbluebutton-apps/src/main/webapp/WEB-INF/red5-web.xml index dedc6e45a020cdf49257cd2137dcf7ec063e9917..eea15aa4c168873a7465e85b05d92d1d7b99bb35 100755 --- a/bigbluebutton-apps/src/main/webapp/WEB-INF/red5-web.xml +++ b/bigbluebutton-apps/src/main/webapp/WEB-INF/red5-web.xml @@ -74,42 +74,14 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. <bean id="connInvokerService" class="org.bigbluebutton.red5.client.messaging.ConnectionInvokerService" init-method="start" destroy-method="stop"/> - <bean id="layout.service" class="org.bigbluebutton.red5.service.LayoutService"> - <property name="red5Publisher"> <ref bean="red5Publisher"/></property> - </bean> - <bean id="desktopSharing.service" class="org.bigbluebutton.red5.service.DesktopSharingService"> <property name="red5Publisher"><ref bean="red5Publisher"/></property> </bean> - <bean id="lock.service" class="org.bigbluebutton.red5.service.LockService"> - <property name="red5Publisher"><ref bean="red5Publisher"/></property> - </bean> - <bean id="participants.service" class="org.bigbluebutton.red5.service.ParticipantsService"> <property name="red5Publisher"> <ref bean="red5Publisher"/> </property> </bean> - <bean id="breakoutroom.service" class="org.bigbluebutton.red5.service.BreakoutRoomService"> - <property name="red5Publisher"> <ref bean="red5Publisher"/> </property> - </bean> - - <bean id="presentationApplication" class="org.bigbluebutton.red5.service.PresentationApplication"> - <property name="red5Publisher"><ref bean="red5Publisher"/></property> - </bean> - - <bean id="presentation.service" class="org.bigbluebutton.red5.service.PresentationService"> - <property name="presentationApplication"> <ref local="presentationApplication"/></property> - </bean> - - <bean id="poll.service" class="org.bigbluebutton.red5.service.PollingService"> - <property name="red5Publisher"> <ref bean="red5Publisher"/></property> - </bean> - - <bean id="voice.service" class="org.bigbluebutton.red5.service.VoiceService"> - <property name="red5Publisher" ref="red5Publisher"/> - </bean> - <bean id="red5Publisher" class="org.bigbluebutton.red5.pubsub.MessagePublisher"> <property name="messageSender" ref="clientInGW"/> </bean> diff --git a/bigbluebutton-client/.actionScriptProperties b/bigbluebutton-client/.actionScriptProperties index 06a78d9f4aa04a1da79ae79bc5b858ed7ec2f0cf..af87226ebaa19955045b60898cddb6bb4397d2e0 100755 --- a/bigbluebutton-client/.actionScriptProperties +++ b/bigbluebutton-client/.actionScriptProperties @@ -1,7 +1,9 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> <actionScriptProperties analytics="false" mainApplicationPath="BigBlueButton.mxml" projectUUID="d0ee1158-6eb2-478c-9e78-b5aa55d7b59c" version="11"> - <compiler additionalCompilerArguments="-locale en_US" autoRSLOrdering="true" copyDependentFiles="true" fteInMXComponents="false" generateAccessible="true" htmlExpressInstall="true" htmlGenerate="true" htmlHistoryManagement="true" htmlPlayerVersionCheck="true" includeNetmonSwc="false" outputFolderPath="bin-debug" removeUnusedRSL="true" sourceFolderPath="src" strict="true" targetPlayerVersion="0.0.0" useApolloConfig="false" useDebugRSLSwfs="true" useFlashSDK="false" verifyDigests="true" warn="true"> - <compilerSourcePath/> + <compiler additionalCompilerArguments="-locale en_US -show-unused-type-selector-warnings=false" autoRSLOrdering="true" copyDependentFiles="true" fteInMXComponents="true" generateAccessible="true" htmlExpressInstall="true" htmlGenerate="true" htmlHistoryManagement="true" htmlPlayerVersionCheck="true" includeNetmonSwc="false" outputFolderPath="bin-debug" removeUnusedRSL="true" sourceFolderPath="src" strict="true" targetPlayerVersion="0.0.0" useApolloConfig="false" useDebugRSLSwfs="true" useFlashSDK="false" verifyDigests="true" warn="true"> + <compilerSourcePath> + <compilerSourcePathEntry kind="1" linkType="1" path="branding/default/style/css"/> + </compilerSourcePath> <libraryPath defaultLinkType="0"> <libraryPathEntry kind="4" path=""> <excludedEntries> @@ -13,10 +15,23 @@ </libraryPath> <sourceAttachmentPath/> </compiler> + <theme themeIsDefault="false" themeIsSDK="true" themeLocation="${SDK_THEMES_DIR}/frameworks/themes/Halo"/> <applications> <application path="BigBlueButton.mxml"/> </applications> - <modules/> + <modules> + <module application="src/BigBlueButton.mxml" destPath="PhoneModule.swf" optimize="true" sourcePath="src/PhoneModule.mxml"/> + <module application="src/BigBlueButton.mxml" destPath="UsersModule.swf" optimize="true" sourcePath="src/UsersModule.mxml"/> + <module application="src/BigBlueButton.mxml" destPath="ChatModule.swf" optimize="true" sourcePath="src/ChatModule.mxml"/> + <module application="src/BigBlueButton.mxml" destPath="VideoconfModule.swf" optimize="true" sourcePath="src/VideoconfModule.mxml"/> + <module application="src/BigBlueButton.mxml" destPath="PresentModule.swf" optimize="true" sourcePath="src/PresentModule.mxml"/> + <module application="src/BigBlueButton.mxml" destPath="LayoutModule.swf" optimize="true" sourcePath="src/LayoutModule.mxml"/> + <module application="src/BigBlueButton.mxml" destPath="WhiteboardModule.swf" optimize="true" sourcePath="src/WhiteboardModule.mxml"/> + <module application="src/BigBlueButton.mxml" destPath="PollingModule.swf" optimize="true" sourcePath="src/PollingModule.mxml"/> + <module application="src/BigBlueButton.mxml" destPath="CaptionModule.swf" optimize="true" sourcePath="src/CaptionModule.mxml"/> + <module application="src/BigBlueButton.mxml" destPath="SharedNotesModule.swf" optimize="true" sourcePath="src/SharedNotesModule.mxml"/> + <module application="src/BigBlueButton.mxml" destPath="ScreenshareModule.swf" optimize="true" sourcePath="src/ScreenshareModule.mxml"/> + </modules> <workers/> <buildCSSFiles/> <flashCatalyst validateFlashCatalystCompatibility="false"/> diff --git a/bigbluebutton-client/branding/default/build.xml b/bigbluebutton-client/branding/default/build.xml index 96f061779d870ba8e90c50d72bd0778ca5dce055..ca6ff181bf73dcfc9a1a8eed36b71d70c3d04898 100755 --- a/bigbluebutton-client/branding/default/build.xml +++ b/bigbluebutton-client/branding/default/build.xml @@ -5,7 +5,7 @@ <property name="DEBUG" value="true" /> <property name="BUILD_ENV" value="DEV" /> <property name="FLEX_HOME" value="${env.FLEX_HOME}" /> - <property name="themeFile" value="BBBDefault.css" /> + <property name="themeFile" value="V2Theme.css" /> <property name="BASE_DIR" value="${basedir}" /> <property name="SRC_DIR" value="${BASE_DIR}/src" /> diff --git a/bigbluebutton-client/branding/default/style/css/BBBBlack.css b/bigbluebutton-client/branding/default/style/css/BBBBlack.css deleted file mode 100755 index 8f9818f413385977aad9e0c89d7cda501ad70a91..0000000000000000000000000000000000000000 --- a/bigbluebutton-client/branding/default/style/css/BBBBlack.css +++ /dev/null @@ -1,651 +0,0 @@ -@namespace mx "library://ns.adobe.com/flex/mx"; -@namespace flexlib "http://code.google.com/p/flexlib/"; -@namespace users "org.bigbluebutton.modules.users.views.*"; -@namespace poll "org.bigbluebutton.modules.polling.views.*"; - -mx|Application { - backgroundColor: #000000; -} - -mx|ApplicationControlBar { - highlightAlphas: 0.1, 0; - fillAlphas: 0, 0; - fillColors: #000000, #000000; - backgroundColor: #000000; - backgroundAlpha: 1; - cornerRadius: 0; - dropShadowEnabled: true; - shadowDistance: 1; - shadowDirection: center; - dropShadowColor: #000000; -} - -mx|Panel { - borderColor: #000000; - borderAlpha: 1; - shadowDistance: 1; - dropShadowColor: #000000; - titleStyleName: "mypanelTitle"; -} - -mx|ToolTip { - borderSkin : ClassReference("org.bigbluebutton.skins.ToolTipSkin"); - backgroundAlpha : 0.9; - cornerRadius : 3; -} - -.mypanelTitle { - color: #444444; - fontFamily: Arial; - fontSize: 12; -} - -.whiteboardToolbarStyle { - backgroundColor: #000000; - cornerRadius: 5; - borderStyle: solid; - borderThickness: 1; - paddingBottom: 3; - paddingTop: 3; - paddingLeft: 3; - paddingRight: 3; -} - -mx|Button, .logoutButtonStyle, .chatSendButtonStyle, .helpLinkButtonStyle { - textIndent: 0; - paddingLeft: 10; - paddingRight: 10; - paddingTop: 5; - paddingBottom: 5; - highlightAlphas: 0.4, 0; - fillAlphas: 1, 1, 1, 1; - fillColors: #000000, #000000, #000000, #000000; - color: #5e5f63; - textRollOverColor: #5e5f63; - textSelectedColor: #5e5f63; - borderColor: #000000; - themeColor: haloBlue; - fontFamily: Arial; - fontSize: 12; -} - - -.helpLinkButtonStyle { - rollOverColor: #cccccc; - selectionColor: #999999; - color: #ffffff; - textRollOverColor: #504f3d; - textSelectedColor: #504f3d; -} - -mx|DataGrid { - backgroundColor: #000000; - rollOverColor: #f3f3f3; - textRollOverColor: #5e5f63; - selectionColor: #e1e2e5; - color: #5e5f63; - textSelectedColor: #5e5f63; - dropShadowEnabled: false; - fontFamily: arial; - fontSize: 11; - headerStyleName: "mydataGridHeaderStyle"; -} - -.mydataGridHeaderStyle { - color: #5e5f63; - fontFamily: arial; - fontSize: 12; -} - - -.whiteboardUndoButtonStyle, .whiteboardCircleButtonStyle, .whiteboardClearButtonStyle, -.whiteboardTriangleButtonStyle, .whiteboardTextButtonStyle, .whiteboardRectangleButtonStyle, -.whiteboardPanZoomButtonStyle, .whiteboardLineButtonStyle, .whiteboardScribbleButtonStyle -{ - textIndent: 0; - paddingLeft: 0; - paddingRight: 0; - paddingTop: 5; - paddingBottom: 5; - highlightAlphas: 0.4, 0; - fillAlphas: 1, 1, 1, 1; - fillColors: #000000, #000000, #000000, #000000; - color: #5e5f63; - textRollOverColor: #5e5f63; - textSelectedColor: #5e5f63; - borderColor: #000000; - themeColor: haloBlue; - fontFamily: Arial; - fontSize: 12; -} - -.whiteboardUndoButtonStyle -{ - icon: Embed('assets/images/undo.png'); -} - -.whiteboardCircleButtonStyle { - icon: Embed('assets/images/ellipse.png'); -} - -.whiteboardClearButtonStyle { - icon: Embed('assets/images/delete.png'); -} - -.whiteboardScribbleButtonStyle{ - icon: Embed('assets/images/pencil.png'); -} - -.whiteboardLineButtonStyle { - icon: Embed('assets/images/line.png'); -} - -.whiteboardPanZoomButtonStyle { - icon: Embed('assets/images/hand.png'); -} - -.whiteboardRectangleButtonStyle { - icon: Embed('assets/images/square.png'); -} - -.whiteboardTextButtonStyle { - icon: Embed('assets/images/text.png'); -} - -.whiteboardTriangleButtonStyle { - icon: Embed('assets/images/triangle.png'); -} - -.presentationUploadButtonStyle, .presentationBackButtonStyle, .presentationForwardButtonStyle, -.presentationFitToWidthButtonStyle, .presentationFitToPageButtonStyle -{ - textIndent: 0; - paddingLeft: 10; - paddingRight: 10; - paddingTop: 5; - paddingBottom: 5; - highlightAlphas: 0.4, 0; - fillAlphas: 1, 1, 1, 1; - fillColors: #000000, #000000, #000000, #000000; - color: #5e5f63; - textRollOverColor: #5e5f63; - textSelectedColor: #5e5f63; - borderColor: #000000; - themeColor: haloBlue; - fontFamily: Arial; - fontSize: 12; -} - -.presentationUploadButtonStyle { - icon: Embed('assets/images/upload.png'); -} - -.presentationBackButtonStyle { - icon: Embed('assets/images/left-arrow.png'); -} - -.presentationForwardButtonStyle { - icon: Embed('assets/images/right-arrow.png'); -} - -.presentationFitToWidthButtonStyle { - icon: Embed('assets/images/fit-to-width.png'); -} - -.presentationFitToPageButtonStyle { - icon: Embed('assets/images/fit-to-screen.png'); -} - -.presentationZoomSliderStyle{ - labelOffset: 0; - thumbOffset: 3; - dataTipOffset: -1; - tickOffset: 2; - tickLength: 5; - tickThickness: 2; - tickColor: #6cccff; - showTrackHighlight: true; - invertThumbDirection: false; - borderColor: #000000; - trackColors: #aaaaaa, #aaaaaa; - themeColor: haloBlue; - fillAlphas: 1, 1, 1, 1; - fillColors: #000000, #000000, #000000, #000000; - labelStyleName: "presentationZoomSliderLabelStyle"; -} - -.presentationZoomSliderLabelStyle { - color: #5e5f63; - fontFamily: Arial; -} - -.videoMuteButtonStyle, .videoUnmutedButtonStyle, .videoSwitchPresenterButtonStyle, .videoEjectUserButtonStyle, .videoPrivateChatButtonStyle { - fillAlphas: 1, 1, 1, 1; - fillColors: #000000, #000000, #000000, #000000; - color: #5e5f63; - textRollOverColor: #5e5f63; - textSelectedColor: #5e5f63; - borderColor: #b9babc; - cornerRadius: 17; -} - -.videoMutedButtonStyle { - /* Need to duplicate info here as the styleName is programatically changed. Extracting it out doesn't have any effect. */ - fillAlphas: 1, 1, 1, 1; - fillColors: #000000, #000000, #000000, #000000; - color: #ffffff; - textRollOverColor: #5e5f63; - textSelectedColor: #5e5f63; - borderColor: #000000; - cornerRadius: 17; - icon: Embed('assets/images/webcam-muted.png'); -} - -.videoUnmutedButtonStyle { - icon: Embed('assets/images/webcam-unmuted.png'); -} - -.videoSwitchPresenterButtonStyle { - icon: Embed('assets/images/webcam-switch-presenter.png'); -} - -.videoEjectUserButtonStyle { - icon: Embed('assets/images/webcam-eject-user.png'); -} - -.videoPrivateChatButtonStyle { - icon: Embed('assets/images/webcam-private-chat.png'); -} - -.presentationFileUploadWindowStyle { - borderColor: #000000; - borderAlpha: 1; - borderThicknessLeft: 10; - borderThicknessTop: 0; - borderThicknessBottom: 10; - borderThicknessRight: 10; - roundedBottomCorners: true; - cornerRadius: 5; - headerHeight: 20; - backgroundAlpha: 1; - headerColors: #000000, #000000; - footerColors: #000000, #000000; - backgroundColor: #000000; - dropShadowEnabled: true; - titleStyleName: "presentationFileUploadWindowTitleStyle"; -} - -.presentationFileUploadWindowTitleStyle, .presentationUploadTitleStyle { - fontFamily: Arial; - fontSize: 20; - fontWeight: bold; -} - -.presentationNamesLabelStyle { - fontFamily: Arial; - fontSize: 14; - fontWeight: bold; -} - -.presentationUploadChooseFileButtonStyle { - fillAlphas: 1, 1, 1, 1; - fillColors: #000000, #000000, #000000, #000000; - color: #5e5f63; - textRollOverColor: #5e5f63; - textSelectedColor: #5e5f63; - borderColor: #000000; - cornerRadius: 5; -} - -.presentationUploadCancelButtonStyle { - fillAlphas: 1, 1, 1, 1; - fillColors: #000000, #000000, #000000, #000000; - color: #5e5f63; - textRollOverColor: #5e5f63; - textSelectedColor: #5e5f63; - borderColor: #b9babc; - cornerRadius: 5; -} - -.presentationUploadShowButtonStyle { - fillAlphas: 1, 1, 1, 1; - fillColors: #000000, #000000, #000000, #000000; - color: #5e5f63; - textRollOverColor: #5e5f63; - textSelectedColor: #5e5f63; - borderColor: #000000; - cornerRadius: 5; -} - -.presentationUploadDeleteButtonStyle { - fillAlphas: 1, 1, 1, 1; - fillColors: #000000, #000000, #000000, #000000; - color: #5e5f63; - textRollOverColor: #5e5f63; - textSelectedColor: #5e5f63; - borderColor: #000000; - cornerRadius: 5; - icon: Embed('assets/images/trash.png'); -} - -.presentationUploadProgressBarLabelStyle { - -} - -.presentationUploadProgressBarStyle { - -} - -.presentationNameLabelStyle { - -} - -.micSettingsWindowStyle { - borderColor: #000000; - borderAlpha: 1; - borderThicknessLeft: 10; - borderThicknessTop: 0; - borderThicknessBottom: 10; - borderThicknessRight: 10; - roundedBottomCorners: true; - cornerRadius: 5; - headerHeight: 20; - backgroundAlpha: 1; - headerColors: #000000, #000000; - footerColors: #000000, #000000; - backgroundColor: #000000; - dropShadowEnabled: true; - titleStyleName: "micSettingsWindowTitleStyle"; -} - -.micSettingsWindowTitleStyle, .webcamSettingsWindowTitleStyle { - fontFamily: Arial; - fontSize: 20; - fontWeight: bold; -} - -.micSettingsWindowTestSpeakersLabelStyle, .micSettingsWindowTestMicrophoneLabelStyle { - fontFamily: Arial; - fontSize: 14; - fontWeight: bold; -} - -.micSettingsWindowHearFromHeadsetLabelStyle, .micSettingsWindowSpeakIntoMicLabelStyle, .micSettingsWindowMicNameLabelStyle, .webcamPermissionSettingsTextStyle { - fontFamily: Arial; - fontSize: 12; -} - -.micSettingsWindowPlaySoundButtonStyle, .micSettingsWindowChangeMicButtonStyle, -.micSettingsWindowJoinButtonStyle { - fillAlphas: 1, 1, 1, 1; - fillColors: #000000, #000000, #000000, #000000; - rollOverColor: #000000; - color: #5e5f63; - textRollOverColor: #5e5f63; - textSelectedColor: #5e5f63; - borderColor: #000000; - cornerRadius: 5; -} - -.micSettingsWindowCancelButtonStyle { - fillAlphas: 1, 1, 1, 1; - fillColors: #000000, #000000, #000000, #000000; - rollOverColor: #eeeeee; - color: #5e5f63; - textRollOverColor: #5e5f63; - textSelectedColor: #5e5f63; - borderColor: #000000; - cornerRadius: 5; -} - -.micSettingsWindowMicProgressBarStyle { - -} - -.micSettingsWindowHelpButtonStyle { - icon: Embed('assets/images/questionmark.png'); -} - -flexlib|MDIWindow { /*None of the following properties are overridden by the MDIWindow class*/ - backgroundSize: '100%'; - - cornerRadius: 5; - dropShadowEnabled: false; - titleStyleName: "mypanelTitle"; - - cornerResizeImg: Embed(source="assets/swf/Blue.swf", symbol="Corner_Resize"); - cornerResizeWidth: 2; - cornerResizeHeight: 2; - cornerResizePaddingRight: 2; - cornerResizePaddingBottom: 2; - - controlButtonWidth: 10; - controlButtonHeight: 10; - controlButtonGap: 4; -} - -.mdiWindowFocus, .presentationWindowStyleFocus, .videoDockStyleFocus -{ - headerHeight: 26; - roundedBottomCorners: true; - backgroundColor: #000000; - backgroundAlpha: 1; - - borderStyle: solid; - borderColor: #000000; - borderAlpha: 1; - borderThicknessLeft: 3; - borderThicknessTop: 0; - borderThicknessBottom: 3; - borderThicknessRight: 3; -} - -.mdiWindowNoFocus, .presentationWindowStyleNoFocus, .videoDockStyleNoFocus -{ - headerHeight: 26; - roundedBottomCorners: true; - backgroundColor: #000000; - backgroundAlpha: 0.5; - - borderStyle: solid; - borderColor: #000000; - borderAlpha: 0.5; - borderThicknessLeft: 3; - borderThicknessTop: 0; - borderThicknessBottom: 3; - borderThicknessRight: 3; -} - -.presentationSlideViewStyle { - backgroundColor: #b9babc; -} - -.presentationWindowControlsStyle { - paddingBottom: 5; - paddingTop: 3; - paddingLeft: 3; - paddingRight: 3; - bottom: 5; - cornerRadius: 0; - dropShadowEnabled: false; -} - -.videoViewStyleNoFocus -{ - headerHeight: 20; - roundedBottomCorners: true; - backgroundColor: #000000; - backgroundAlpha: 0.5; - - borderStyle: solid; - borderColor: #000000; - borderAlpha: 0.5; - borderThicknessLeft: 3; - borderThicknessTop: 0; - borderThicknessBottom: 3; - borderThicknessRight: 3; -} - -.videoViewStyleFocus -{ - headerHeight: 20; - roundedBottomCorners: true; - backgroundColor: #000000; - backgroundAlpha: 1; - - borderStyle: solid; - borderColor: #000000; - borderAlpha: 1; - borderThicknessLeft: 3; - borderThicknessTop: 0; - borderThicknessBottom: 3; - borderThicknessRight: 3; -} - -.videoPublishStyleNoFocus -{ - headerHeight: 20; - roundedBottomCorners: true; - backgroundColor: #000000; - backgroundAlpha: 0.5; - - borderStyle: solid; - borderColor: #000000; - borderAlpha: 0.5; - borderThicknessLeft: 3; - borderThicknessTop: 0; - borderThicknessBottom: 3; - borderThicknessRight: 3; -} - -.videoPublishStyleFocus -{ - headerHeight: 20; - roundedBottomCorners: true; - backgroundColor: #000000; - backgroundAlpha: 1; - - borderStyle: solid; - borderColor: #000000; - borderAlpha: 1; - borderThicknessLeft: 3; - borderThicknessTop: 0; - borderThicknessBottom: 3; - borderThicknessRight: 3; -} - -.videoAvatarStyleNoFocus -{ - headerHeight: 20; - roundedBottomCorners: true; - backgroundColor: #000000; - backgroundAlpha: 0.5; - - borderStyle: solid; - borderColor: #000000; - borderAlpha: 0.5; - borderThicknessLeft: 3; - borderThicknessTop: 0; - borderThicknessBottom: 3; - borderThicknessRight: 3; -} - -.videoAvatarStyleFocus -{ - headerHeight: 20; - roundedBottomCorners: true; - backgroundColor: #000000; - backgroundAlpha: 1; - - borderStyle: solid; - borderColor: #000000; - borderAlpha: 1; - borderThicknessLeft: 3; - borderThicknessTop: 0; - borderThicknessBottom: 3; - borderThicknessRight: 3; -} - -.mypanelTitle { - color: #5e5f63; - fontFamily: Arial; - fontSize: 12; - fontWeight: bold; -} - -.closeBtnFocus, .closeBtnNoFocus -{ - upSkin: Embed('assets/images/3_closeButton.png'); - overSkin: Embed('assets/images/3_closeButton.png'); - downSkin: Embed('assets/images/3_closeButton.png'); - disabledSkin: Embed('assets/images/3_closeButton.png'); -} - - -.increaseBtnFocus, .increaseBtnNoFocus -{ - upSkin: Embed('assets/images/3_increaseButton.png'); - overSkin: Embed('assets/images/3_increaseButton.png'); - downSkin: Embed('assets/images/3_increaseButton.png'); - disabledSkin: Embed('assets/images/3_increaseButton.png'); -} - -.decreaseBtnFocus, .decreaseBtnNoFocus -{ - upSkin: Embed('assets/images/3_decreaseButton.png'); - overSkin: Embed('assets/images/3_decreaseButton.png'); - downSkin: Embed('assets/images/3_decreaseButton.png'); - disabledSkin: Embed('assets/images/3_decreaseButton.png'); -} - -.minimizeBtnFocus -{ - upSkin: Embed('assets/images/3_minimizeButton.png'); - overSkin: Embed('assets/images/3_minimizeButton.png'); - downSkin: Embed('assets/images/3_minimizeButton.png'); - disabledSkin: Embed('assets/images/3_minimizeButton.png'); -} - - -.resizeHndlr -{ - upSkin: Embed('assets/images/resizeHandler.png'); - overSkin: Embed('assets/images/resizeHandler.png'); - downSkin: Embed('assets/images/resizeHandler.png'); - disabledSkin: Embed('assets/images/resizeHandler.png'); -} - -.cameraDisplaySettingsWindowStartBtn -{ - icon: Embed('assets/images/play-blue.png'); -} - -.lockSettingsDefaultLabelStyle { - fontFamily: Arial; - fontSize: 14; - fontWeight: bold; -} - -.lockSettingsWindowStyle { - borderColor: #000000; - borderAlpha: 1; - borderThicknessLeft: 10; - borderThicknessTop: 0; - borderThicknessBottom: 10; - borderThicknessRight: 10; - roundedBottomCorners: true; - cornerRadius: 5; - headerHeight: 20; - backgroundAlpha: 1; - headerColors: #000000, #000000; - footerColors: #000000, #000000; - backgroundColor: #000000; - dropShadowEnabled: true; - titleStyleName: "micSettingsWindowTitleStyle"; -} - -.lockSettingsWindowTitleStyle { - fontFamily: Arial; - fontSize: 20; - fontWeight: bold; -} diff --git a/bigbluebutton-client/branding/default/style/css/BBBDefault.css b/bigbluebutton-client/branding/default/style/css/BBBDefault.css deleted file mode 100755 index 2d7597ac859ed097a9780b5c175612fcbf97b2a9..0000000000000000000000000000000000000000 --- a/bigbluebutton-client/branding/default/style/css/BBBDefault.css +++ /dev/null @@ -1,1336 +0,0 @@ -@namespace mx "library://ns.adobe.com/flex/mx"; -@namespace flexlib "http://code.google.com/p/flexlib/"; -@namespace users "org.bigbluebutton.modules.users.views.*"; -@namespace poll "org.bigbluebutton.modules.polling.views.*"; - -mx|Application { - backgroundColor: #ffffff; -} - -mx|ApplicationControlBar { - highlightAlphas: 0.1, 0; - fillAlphas: 0, 0; - fillColors: #32343b, #32343b; - backgroundColor: #42444c; - backgroundAlpha: 1; - cornerRadius: 0; - dropShadowEnabled: true; - shadowDistance: 1; - shadowDirection: center; - dropShadowColor: #000000; -} - -.defaultControlBarStyle { - color : #0B333C; -} - -.darkControlBarStyle { - color : #ffffff; -} - -mx|Panel { - borderColor: #dfdfdf; - borderAlpha: 1; - shadowDistance: 1; - dropShadowColor: #666666; - titleStyleName: "mypanelTitle"; -} - -mx|ToolTip { - borderSkin : ClassReference("org.bigbluebutton.skins.ToolTipSkin"); - backgroundAlpha : 0.9; - cornerRadius : 3; -} - -.errorTip { - borderColor : #3b3b3b; -} - -.mypanelTitle { - color: #444444; - fontFamily: Arial; - fontSize: 12; -} - -.whiteboardToolbarStyle { - backgroundColor: #CCCCCC; - cornerRadius: 5; - borderStyle: solid; - borderThickness: 1; - paddingBottom: 3; - paddingTop: 3; - paddingLeft: 3; - paddingRight: 3; -} - -.chatToolbarStyle { - backgroundColor: #CCCCCC; - cornerRadius: 5; - borderStyle: solid; - borderThickness: 1; - paddingBottom: 2; - paddingTop: 2; - paddingLeft: 2; - paddingRight: 2; -} - -.meetingNameLabelStyle { - fontWeight: bold; - fontSize: 15; - fontFamily: Arial; - textAlign: center; - color: #e1e2e5; -} - -.recordingLabelStyle { - fontWeight: bold; - fontSize: 15; - fontFamily: Arial; - color: #e1e2e5; -} - -.videoMessageWarningLabelStyle { - fontWeight: bold; - fontSize: 18; - fontFamily: Arial; - color: #ffff26; -} - -.videoMessageErrorLabelStyle { - fontWeight: bold; - fontSize: 18; - fontFamily: Arial; - color: #ff2727; -} - -.videoMessageBackgroundStyle { - backgroundAlpha: 0.6; - backgroundColor: #b9babc; -} - -.videoToolbarBackgroundTalkingStyle { - backgroundColor: #20c600; - backgroundAlpha: 0.6; -} - -.videoToolbarBackgroundNotTalkingStyle { - backgroundColor: #42444c; - backgroundAlpha: 0.6; -} - -.videoToolbarLabelStyle { - textIndent: 0; - color: #ffffff; - fontFamily: Arial; -} - -.pollResondersLabelStyle { - color: #444444; - fontFamily: Arial; - fontSize: 16; - fontWeight: bold; -} - -mx|Button, .logoutButtonStyle, .chatSendButtonStyle, .helpLinkButtonStyle, .cameraDisplaySettingsWindowProfileComboStyle, .cameraDisplaySettingsWindowCameraSelector, .languageSelectorStyle, .testJavaLinkButtonStyle, .recordButtonStyleNormal, .recordButtonStyleStart, .recordButtonStyleStop, .micSettingsWindowHelpButtonStyle, .bandwidthButtonStyle, .settingsButtonStyle, .acceptButtonStyle, .denyButtonStyle { - textIndent: 0; - paddingLeft: 10; - paddingRight: 10; - paddingTop: 5; - paddingBottom: 5; - highlightAlphas: 0.4, 0; - fillAlphas: 1, 1, 1, 1; - fillColors: #fefeff, #e1e2e5, #ffffff, #eeeeee; - color: #3f3f41; - textRollOverColor: #3f3f41; - textSelectedColor: #3f3f41; - borderColor: #b9babc; - themeColor: haloBlue; - fontFamily: Arial; - fontSize: 12; -} - -.quickWindowLinkStyle { - paddingLeft: 0; - paddingRight: 0; - textDecoration: underline; - rollOverColor: #cccccc; - selectionColor: #999999; - color: #ffffff; - textRollOverColor: #504f3d; - textSelectedColor: #504f3d; -} - -.helpLinkButtonStyle { - paddingLeft: 4; - paddingRight: 4; - paddingTop: 2; - paddingBottom: 2; - fontSize: 16; - rollOverColor: #cccccc; - selectionColor: #999999; - color: #ffffff; - textRollOverColor: #504f3d; - textSelectedColor: #504f3d; - fontWeight: bold; -} - -.testJavaLinkButtonStyle { - paddingLeft: 4; - paddingRight: 4; - paddingTop: 2; - paddingBottom: 2; - fontSize: 14; - rollOverColor: #cccccc; - selectionColor: #cccccc; - color: #e3e3e3; - textRollOverColor: #504f46; - textSelectedColor: #504f46; - fontWeight: bold; - textDecoration: none; -} - -.javaVersionRequiredLabelStyle { - fontSize: 12; - color: #000000; - fontFamily: Arial; -} - -.logoutButtonStyle { - paddingLeft: 0; - paddingRight: 0; - icon: Embed('assets/images/logout.png'); -} - -.settingsButtonStyle { - icon: Embed('assets/images/ic_settings_16px.png'); -} - -.acceptButtonStyle { - icon: Embed('assets/images/ic_thumb_up_16px.png'); -} - -.denyButtonStyle { - icon: Embed('assets/images/ic_thumb_down_16px.png'); -} - - -mx|DataGrid { - backgroundColor: #e1e2e5; - rollOverColor: #f3f3f3; - textRollOverColor: #3f3f41; - selectionColor: #e1e2e5; - color: #3f3f41; - textSelectedColor: #3f3f41; - dropShadowEnabled: false; - fontFamily: arial; - fontSize: 11; - headerStyleName: "mydataGridHeaderStyle"; -} - -.mydataGridHeaderStyle { - color: #3f3f41; - fontFamily: arial; - fontSize: 12; -} - - -.whiteboardUndoButtonStyle, .whiteboardCircleButtonStyle, .whiteboardClearButtonStyle, -.whiteboardTriangleButtonStyle, .whiteboardTextButtonStyle, .whiteboardRectangleButtonStyle, -.chatClearButtonStyle, .multiUserWhiteboardOnButtonStyle, .multiUserWhiteboardOffButtonStyle -{ - textIndent: 0; - paddingLeft: 0; - paddingRight: 0; - paddingTop: 5; - paddingBottom: 5; - highlightAlphas: 0.4, 0; - fillAlphas: 1, 1, 1, 1; - fillColors: #fefeff, #e1e2e5, #ffffff, #eeeeee; - color: #3f3f41; - textRollOverColor: #3f3f41; - textSelectedColor: #3f3f41; - borderColor: #b9babc; - themeColor: haloBlue; - fontFamily: Arial; - fontSize: 12; -} - -.multiUserWhiteboardOnButtonStyle -{ - icon: Embed('assets/images/multiuserwhiteboardon.png'); -} - -.multiUserWhiteboardOffButtonStyle -{ - icon: Embed('assets/images/multiuserwhiteboardoff.png'); -} - -.whiteboardUndoButtonStyle -{ - icon: Embed('assets/images/undo.png'); -} - -.whiteboardCircleButtonStyle { - icon: Embed('assets/images/ellipse.png'); -} - -.whiteboardClearButtonStyle { - icon: Embed('assets/images/delete.png'); -} - -.chatClearButtonStyle { - icon: Embed('assets/images/delete.png'); -} - -.whiteboardScribbleButtonStyle{ - icon: Embed('assets/images/pencil.png'); -} - -.whiteboardLineButtonStyle { - icon: Embed('assets/images/line.png'); -} - -.whiteboardPanZoomButtonStyle { - icon: Embed('assets/images/hand.png'); -} - -.whiteboardRectangleButtonStyle { - icon: Embed('assets/images/square.png'); -} - -.whiteboardTextButtonStyle { - icon: Embed('assets/images/text.png'); -} - -.whiteboardTriangleButtonStyle { - icon: Embed('assets/images/triangle.png'); -} - -.voiceConfDefaultButtonStyle { - icon: Embed('assets/images/headset.png'); -} - -.voiceConfActiveButtonStyle { - icon: Embed('assets/images/headset_open.png'); -} - -.voiceConfInactiveButtonStyle { - icon: Embed('assets/images/headset_close.png'); -} - -.webcamDefaultButtonStyle { - icon: Embed('assets/images/webcam.png'); -} - -.webcamOnButtonStyle { - icon: Embed('assets/images/webcam_on.png'); -} - -.webcamOffButtonStyle { - icon: Embed('assets/images/webcam_close.png'); -} - -.deskshareDefaultButtonStyle { - icon: Embed('assets/images/deskshare_icon.png'); -} - -.deskshareOnButtonStyle { - icon: Embed('assets/images/deskshare_on.png'); -} - -.deskshareOffButtonStyle { - icon: Embed('assets/images/deskshare_close.png'); -} - - -.presentationUploadButtonStyle, .pollStartButtonStyle, .presentationBackButtonStyle, .presentationBackButtonDisabledStyle, .presentationForwardButtonStyle, .presentationForwardButtonDisabledStyle, -.presentationFitToWidthButtonStyle, .presentationFitToPageButtonStyle, .presentationDownloadButtonStyle, .presentationDownloadButtonDisabledStyle, -.sharedNotesSaveButtonStyle, .sharedNotesNewButtonStyle, .sharedNotesEnabledUndoButtonStyle, .sharedNotesDisabledUndoButtonStyle, .sharedNotesEnabledRedoButtonStyle, .sharedNotesDisabledRedoButtonStyle, .sharedNotesFormatButtonStyle, .chatCopyButtonStyle, .chatSaveButtonStyle -{ - textIndent: 0; - paddingLeft: 10; - paddingRight: 10; - paddingTop: 5; - paddingBottom: 5; - highlightAlphas: 0.4, 0; - fillAlphas: 1, 1, 1, 1; - fillColors: #fefeff, #e1e2e5, #ffffff, #eeeeee; - color: #3f3f41; - textRollOverColor: #3f3f41; - textSelectedColor: #3f3f41; - borderColor: #b9babc; - themeColor: haloBlue; - fontFamily: Arial; - fontSize: 12; -} - -.sharedNotesSaveButtonStyle, .chatSaveButtonStyle { - icon: Embed('assets/images/ic_save_16px.png'); -} - -.sharedNotesNewButtonStyle { - icon: Embed('assets/images/ic_note_add_16px.png'); -} - -.sharedNotesEnabledUndoButtonStyle { - icon: Embed('assets/images/arrows_undo_icon.png'); -} - -.sharedNotesDisabledUndoButtonStyle { - icon: Embed('assets/images/arrows_undo_icon_grey.png'); -} - -.sharedNotesEnabledRedoButtonStyle { - icon: Embed('assets/images/arrows_redo_icon.png'); -} - -.sharedNotesDisabledRedoButtonStyle { - icon: Embed('assets/images/arrows_redo_icon_grey.png'); -} - -.sharedNotesFormatButtonStyle { - icon: Embed('assets/images/ic_note_format_16px.png'); -} - -.presentationUploadButtonStyle { - icon: Embed('assets/images/ic_file_upload_16px.png'); -} - -.pollStartButtonStyle { - icon: Embed('assets/images/poll_icon.png'); -} - -.presentationBackButtonStyle { - icon: Embed('assets/images/ic_arrow_back_24px.png'); -} - -.presentationBackButtonDisabledStyle { - icon: Embed('assets/images/ic_arrow_back_grey_24px.png'); -} - -.presentationForwardButtonStyle { - icon: Embed('assets/images/ic_arrow_forward_24px.png'); -} - -.presentationForwardButtonDisabledStyle { - icon: Embed('assets/images/ic_arrow_forward_grey_24px.png'); -} - -.presentationFitToWidthButtonStyle { - icon: Embed('assets/images/fit-to-width.png'); -} - -.presentationFitToPageButtonStyle { - icon: Embed('assets/images/fit-to-screen.png'); -} - -.presentationDownloadButtonStyle { - icon: Embed('assets/images/ic_file_download_16px.png'); -} - -.presentationDownloadButtonDisabledStyle { - icon: Embed('assets/images/ic_file_download_grey_16px.png'); -} - -.presentationZoomSliderStyle{ - labelOffset: 0; - thumbOffset: 3; - dataTipOffset: -1; - tickOffset: 2; - tickLength: 5; - tickThickness: 2; - tickColor: #6cccff; - showTrackHighlight: true; - invertThumbDirection: false; - borderColor: #b9babc; - trackColors: #aaaaaa, #aaaaaa; - themeColor: haloBlue; - fillAlphas: 1, 1, 1, 1; - fillColors: #fefeff, #e1e2e5, #ffffff, #eeeeee; - labelStyleName: "presentationZoomSliderLabelStyle"; -} - -.presentationZoomSliderLabelStyle { - color: #3f3f41; - fontFamily: Arial; -} - -.deskshareControlButtonStyle { - fillAlphas: 1, 1, 1, 1; - fillColors: #fefeff, #e1e2e5, #ffffff, #eeeeee; - color: #3f3f41; - textRollOverColor: #3f3f41; - textSelectedColor: #3f3f41; - borderColor: #b9babc; - cornerRadius: 17; -} - -.deskshareWarningLabelStyle { - fontWeight: bold; - fontSize: 18; - fontFamily: Arial; - color: #003399; -} - -.deskshareWarningBackgroundStyle { - backgroundAlpha: 0.6; - backgroundColor: #78797e; -} - -.videoMuteButtonStyle, .videoUnmutedButtonStyle, .videoSwitchPresenterButtonStyle, .videoEjectUserButtonStyle, .videoPrivateChatButtonStyle { - fillAlphas: 1, 1, 1, 1; - fillColors: #fefeff, #e1e2e5, #ffffff, #eeeeee; - color: #3f3f41; - textRollOverColor: #3f3f41; - textSelectedColor: #3f3f41; - borderColor: #b9babc; - cornerRadius: 17; -} - -.videoMutedButtonStyle { - /* Need to duplicate info here as the styleName is programatically changed. Extracting it out doesn't have any effect. */ - fillAlphas: 1, 1, 1, 1; - fillColors: #fefeff, #e1e2e5, #ffffff, #eeeeee; - color: #ffffff; - textRollOverColor: #3f3f41; - textSelectedColor: #3f3f41; - borderColor: #b9babc; - cornerRadius: 17; - icon: Embed('assets/images/webcam-muted.png'); -} - -.videoUnmutedButtonStyle { - icon: Embed('assets/images/webcam-unmuted.png'); -} - -.videoSwitchPresenterButtonStyle { - icon: Embed('assets/images/webcam-switch-presenter.png'); -} - -.videoEjectUserButtonStyle { - icon: Embed('assets/images/webcam-eject-user.png'); -} - -.videoPrivateChatButtonStyle { - icon: Embed('assets/images/webcam-private-chat.png'); -} - -mx|TitleWindow { - borderColor: #b9babc; - borderAlpha: 1; - borderThicknessLeft: 10; - borderThicknessTop: 0; - borderThicknessBottom: 10; - borderThicknessRight: 10; - roundedBottomCorners: true; - cornerRadius: 5; - headerHeight: 20; - backgroundAlpha: 1; - backgroundColor: #EFEFEF; - dropShadowEnabled: true; -} - -.presentationFileUploadWindowTitleStyle, .presentationUploadTitleStyle { - fontFamily: Arial; - fontSize: 20; - fontWeight: bold; -} - -.presentationNamesLabelStyle { - fontFamily: Arial; - fontSize: 14; - fontWeight: bold; -} - -.presentationUploadChooseFileButtonStyle { - fillAlphas: 1, 1, 1, 1; - fillColors: #fefeff, #e1e2e5, #ffffff, #eeeeee; - color: #3f3f41; - textRollOverColor: #3f3f41; - textSelectedColor: #3f3f41; - borderColor: #b9babc; - cornerRadius: 5; -} - -.presentationUploadCancelButtonStyle { - fillAlphas: 1, 1, 1, 1; - fillColors: #fefeff, #e1e2e5, #ffffff, #eeeeee; - color: #3f3f41; - textRollOverColor: #3f3f41; - textSelectedColor: #3f3f41; - borderColor: #b9babc; - cornerRadius: 5; -} - -.presentationUploadShowButtonStyle { - fillAlphas: 1, 1, 1, 1; - fillColors: #fefeff, #e1e2e5, #ffffff, #eeeeee; - color: #3f3f41; - textRollOverColor: #3f3f41; - textSelectedColor: #3f3f41; - borderColor: #b9babc; - cornerRadius: 5; -} - -.presentationUploadDeleteButtonStyle { - fillAlphas: 1, 1, 1, 1; - fillColors: #fefeff, #e1e2e5, #ffffff, #eeeeee; - color: #3f3f41; - textRollOverColor: #3f3f41; - textSelectedColor: #3f3f41; - borderColor: #b9babc; - cornerRadius: 5; - icon: Embed('assets/images/trash.png'); -} - -.presentationUploadProgressBarLabelStyle { - -} - -.presentationUploadProgressBarStyle { - -} - -.presentationNameLabelStyle { - -} - -.presentationUploadFileFormatHintBoxStyle, .audioBroswerHintBoxStyle { - backgroundColor: #D4D4D4; - dropShadowEnabled: false; - paddingLeft: 10; - paddingRight: 10; -} - -.presentationUploadFileFormatHintTextStyle, .audioBroswerHintTextStyle { - fontWeight: bold; -} - -.audioBroswerHintBoxStyle { - paddingLeft: 5; - paddingRight: 5; - paddingBottom : 8; - paddingTop : 8; -} - -.desktopShareViewStyle { - backgroundColor: #FFFFFF; - paddingTop: 15; - paddingLeft: 15; - paddingBottom: 15; - paddingRight: 15; -} - -.desksharePublishPauseBox { - horizontalAlign: center; - verticalAlign: middle; - borderColor: #C0C0C0; - borderThickness: 2; - borderStyle: solid -} - -.publishHelpPCIE1 { - imageSource: Embed(source='assets/images/bbb_pc_ie_1.png'); -} - -.publishHelpPCIE2 { - imageSource: Embed(source='assets/images/bbb_pc_ie_2.png'); -} - -.publishHelpPCIE3 { - imageSource: Embed(source='assets/images/bbb_pc_ie_3.png'); -} - -.publishHelpPCFirefox1 { - imageSource: Embed(source='assets/images/bbb_pc_firefox_1.png'); -} - -.publishHelpPCFirefox2 { - imageSource: Embed(source='assets/images/bbb_pc_firefox_2.png'); -} - -.publishHelpPCFirefox3 { - imageSource: Embed(source='assets/images/bbb_pc_firefox_3.png'); -} - -.publishHelpPCChrome1 { - imageSource: Embed(source='assets/images/bbb_pc_chrome_1.png'); -} - -.publishHelpPCChrome2 { - imageSource: Embed(source='assets/images/bbb_pc_chrome_2.png'); -} - -.publishHelpPCChrome3 { - imageSource: Embed(source='assets/images/bbb_pc_chrome_3.png'); -} - -.publishHelpMacSafari1 { - imageSource: Embed(source='assets/images/bbb_mac_safari_1.png'); -} - -.publishHelpMacSafari2 { - imageSource: Embed(source='assets/images/bbb_mac_safari_2.png'); -} - -.publishHelpMacSafari3 { - imageSource: Embed(source='assets/images/bbb_mac_safari_3.png'); -} - -.publishHelpMacSafari4 { - imageSource: Embed(source='assets/images/bbb_mac_safari_4.png'); -} - -.publishHelpMacFirefox1 { - imageSource: Embed(source='assets/images/bbb_mac_firefox_1.png'); -} - -.publishHelpMacFirefox2 { - imageSource: Embed(source='assets/images/bbb_mac_firefox_2.png'); -} - -.publishHelpMacFirefox3 { - imageSource: Embed(source='assets/images/bbb_mac_firefox_3.png'); -} - -.publishHelpMacFirefox4 { - imageSource: Embed(source='assets/images/bbb_mac_firefox_4.png'); -} - -.publishHelpMacChrome1 { - imageSource: Embed(source='assets/images/bbb_mac_chrome_1.png'); -} - -.publishHelpMacChrome2 { - imageSource: Embed(source='assets/images/bbb_mac_chrome_2.png'); -} - -.publishHelpMacChrome3 { - imageSource: Embed(source='assets/images/bbb_mac_chrome_3.png'); -} - -.publishHelpMacChrome4 { - imageSource: Embed(source='assets/images/bbb_mac_chrome_4.png'); -} - -.publishHelpLinuxFirefox1 { - imageSource: Embed(source='assets/images/bbb_linux_firefox_1.png'); -} - -.publishHelpLinuxFirefox2 { - imageSource: Embed(source='assets/images/bbb_linux_firefox_2.png'); -} - -.publishHelpLinuxFirefox3 { - imageSource: Embed(source='assets/images/bbb_linux_firefox_3.png'); -} - -.publishHelpLinuxChrome1 { - imageSource: Embed(source='assets/images/bbb_linux_chrome_1.png'); -} - -.publishHelpLinuxChrome2 { - imageSource: Embed(source='assets/images/bbb_linux_chrome_2.png'); -} - -.publishHelpLinuxChrome3 { - imageSource: Embed(source='assets/images/bbb_linux_chrome_3.png'); -} - -.desktopShareTextStyle { - color: #3f3f3f; - fontSize: 11; - fontWeight: bold; -} - -.chromeJavaHelpImage { - imageSource: Embed(source='assets/images/jnlp-run-chrome.png'); -} - -.webcamSettingsWindowTitleStyle, .micSettingsWindowTitleStyle { - fontFamily: Arial; - fontSize: 20; - fontWeight: bold; -} - -.micSettingsWindowTestSpeakersLabelStyle, .micSettingsWindowTestMicrophoneLabelStyle { - fontFamily: Arial; - fontSize: 14; - fontWeight: bold; -} - -.micSettingsWindowHearFromHeadsetLabelStyle, .micSettingsWindowSpeakIntoMicLabelStyle, .micSettingsWindowMicNameLabelStyle, .webcamPermissionSettingsTextStyle, .inactivityWarningTextStyle { - fontFamily: Arial; - fontSize: 14; -} - -.micSettingsWindowOpenDialogLabelStyle { - fontFamily: Arial; - fontSize: 14; - fontWeight: bold; - color: #e1e2e5; -} - -.micSettingsWindowShareMicrophoneLabelStyle { - fontFamily: Arial; - fontSize: 14; - color: #5e5f63; -} - -.micSettingsWindowPlaySoundButtonStyle, .micSettingsWindowChangeMicButtonStyle { - fillAlphas: 1, 1, 1, 1; - fillColors: #fefeff, #e1e2e5, #ffffff, #eeeeee; - rollOverColor: #eeeeee; - color: #3f3f41; - textRollOverColor: #3f3f41; - textSelectedColor: #3f3f41; - borderColor: #b9babc; - cornerRadius: 5; -} - -.micSettingsWindowJoinButtonStyle { - fillAlphas: 1, 1, 1, 1; - fillColors: #fefeff, #e1e2e5, #ffffff, #eeeeee; - rollOverColor: #eeeeee; - color: #3f3f41; - textRollOverColor: #3f3f41; - textSelectedColor: #3f3f41; - borderColor: #b9babc; - cornerRadius: 5; - icon: Embed('assets/images/headset.png'); -} - -.micSettingsWindowCancelButtonStyle, .inactivityWarningWindowCancelButtonStyle { - fillAlphas: 1, 1, 1, 1; - fillColors: #ffffff, #eeeeee, #ffffff, #eeeeee; - rollOverColor: #eeeeee; - color: #3f3f41; - textRollOverColor: #3f3f41; - textSelectedColor: #3f3f41; - borderColor: #b9babc; - cornerRadius: 5; -} - -.micSettingsWindowHelpButtonStyle { - paddingLeft: 4; - paddingRight: 4; - paddingTop: 2; - paddingBottom: 2; - fontSize: 16; - rollOverColor: #cccccc; - selectionColor: #999999; - color: #504f3d; - textRollOverColor: #ffffff; - textSelectedColor: #ffffff; - fontWeight: bold; -} - -flexlib|MDIWindow { /*None of the following properties are overridden by the MDIWindow class*/ - backgroundSize: '100%'; - - cornerRadius: 5; - dropShadowEnabled: false; - titleStyleName: "mdiWindowTitle"; - - cornerResizeImg: Embed(source="assets/swf/Blue.swf", symbol="Corner_Resize"); - cornerResizeWidth: 2; - cornerResizeHeight: 2; - cornerResizePaddingRight: 2; - cornerResizePaddingBottom: 2; - - controlButtonWidth: 10; - controlButtonHeight: 10; - controlButtonGap: 4; -} - -.mdiWindowFocus, .presentationWindowStyleFocus, .videoDockStyleFocus -{ - headerHeight: 26; - roundedBottomCorners: true; - backgroundColor: #b9babc; - backgroundAlpha: 1; - - borderStyle: solid; - borderColor: #b9babc; - borderAlpha: 1; - borderThicknessLeft: 3; - borderThicknessTop: 0; - borderThicknessBottom: 3; - borderThicknessRight: 3; -} - -.mdiWindowNoFocus, .presentationWindowStyleNoFocus, .videoDockStyleNoFocus -{ - headerHeight: 26; - roundedBottomCorners: true; - backgroundColor: #b9babc; - backgroundAlpha: 0.5; - - borderStyle: solid; - borderColor: #b9babc; - borderAlpha: 0.5; - borderThicknessLeft: 3; - borderThicknessTop: 0; - borderThicknessBottom: 3; - borderThicknessRight: 3; -} - -.videoDockStyleFocusChatLayout { - borderStyle : none; - borderColor: #42444c; - backgroundColor: #42444c; -} - -.videoDockStyleNoFocusChatLayout { - borderStyle : none; - borderColor: #42444c; - backgroundColor: #42444c; -} - -.presentationSlideViewStyle { - backgroundColor: #b9babc; -} - -.presentationWindowControlsStyle { - paddingBottom: 5; - paddingTop: 3; - paddingLeft: 3; - paddingRight: 3; - bottom: 5; - cornerRadius: 0; - dropShadowEnabled: false; -} - -.videoViewStyleNoFocus -{ - headerHeight: 20; - roundedBottomCorners: true; - backgroundColor: #e6e6e6; - backgroundAlpha: 0.5; - - borderStyle: solid; - borderColor: #b9babc; - borderAlpha: 0.5; - borderThicknessLeft: 3; - borderThicknessTop: 0; - borderThicknessBottom: 3; - borderThicknessRight: 3; -} - -.videoViewStyleFocus -{ - headerHeight: 20; - roundedBottomCorners: true; - backgroundColor: #e6e6e6; - backgroundAlpha: 1; - - borderStyle: solid; - borderColor: #b9babc; - borderAlpha: 1; - borderThicknessLeft: 3; - borderThicknessTop: 0; - borderThicknessBottom: 3; - borderThicknessRight: 3; -} - -.videoPublishStyleNoFocus -{ - headerHeight: 20; - roundedBottomCorners: true; - backgroundColor: #e6e6e6; - backgroundAlpha: 0.5; - - borderStyle: solid; - borderColor: #b9babc; - borderAlpha: 0.5; - borderThicknessLeft: 3; - borderThicknessTop: 0; - borderThicknessBottom: 3; - borderThicknessRight: 3; -} - -.videoPublishStyleFocus -{ - headerHeight: 20; - roundedBottomCorners: true; - backgroundColor: #e6e6e6; - backgroundAlpha: 1; - - borderStyle: solid; - borderColor: #b9babc; - borderAlpha: 1; - borderThicknessLeft: 3; - borderThicknessTop: 0; - borderThicknessBottom: 3; - borderThicknessRight: 3; -} - -.videoAvatarStyleNoFocus -{ - headerHeight: 20; - roundedBottomCorners: true; - backgroundColor: #e6e6e6; - backgroundAlpha: 0.5; - - borderStyle: solid; - borderColor: #b9babc; - borderAlpha: 0.5; - borderThicknessLeft: 3; - borderThicknessTop: 0; - borderThicknessBottom: 3; - borderThicknessRight: 3; -} - -.videoAvatarStyleFocus -{ - headerHeight: 20; - roundedBottomCorners: true; - backgroundColor: #e6e6e6; - backgroundAlpha: 1; - - borderStyle: solid; - borderColor: #b9babc; - borderAlpha: 1; - borderThicknessLeft: 3; - borderThicknessTop: 0; - borderThicknessBottom: 3; - borderThicknessRight: 3; -} - -.defaultShellStyle { - backgroundColor: #fefeff; -} - -.darkShellStyle { - backgroundColor: #42444c; -} - -.mdiWindowTitle { - color: #3f3f41; - fontFamily: Arial; - fontSize: 12; - fontWeight: bold; -} - -.closeBtnFocus, .closeBtnNoFocus -{ - upSkin: Embed('assets/images/3_closeButton.png'); - overSkin: Embed('assets/images/3_closeButton.png'); - downSkin: Embed('assets/images/3_closeButton.png'); - disabledSkin: Embed('assets/images/3_closeButton.png'); -} - - -.increaseBtnFocus, .increaseBtnNoFocus -{ - upSkin: Embed('assets/images/3_increaseButton.png'); - overSkin: Embed('assets/images/3_increaseButton.png'); - downSkin: Embed('assets/images/3_increaseButton.png'); - disabledSkin: Embed('assets/images/3_increaseButton.png'); -} - -.decreaseBtnFocus, .decreaseBtnNoFocus -{ - upSkin: Embed('assets/images/3_decreaseButton.png'); - overSkin: Embed('assets/images/3_decreaseButton.png'); - downSkin: Embed('assets/images/3_decreaseButton.png'); - disabledSkin: Embed('assets/images/3_decreaseButton.png'); -} - -.minimizeBtnFocus -{ - upSkin: Embed('assets/images/3_minimizeButton.png'); - overSkin: Embed('assets/images/3_minimizeButton.png'); - downSkin: Embed('assets/images/3_minimizeButton.png'); - disabledSkin: Embed('assets/images/3_minimizeButton.png'); -} - -/* -https://www.iconfinder.com/icons/172512/mute_icon#size=128 -*/ -.muteOverlayBtn -{ - upSkin: Embed('assets/images/audio_20_white.png'); - overSkin: Embed('assets/images/audio_20_white.png'); - downSkin: Embed('assets/images/audio_20_white.png'); - disabledSkin: Embed('assets/images/audio_20_white.png'); -} - -/* -https://www.iconfinder.com/icons/172499/low_volume_icon#size=128 -*/ -.unmuteOverlayBtn -{ - upSkin: Embed('assets/images/audio_muted_20_white.png'); - overSkin: Embed('assets/images/audio_muted_20_white.png'); - downSkin: Embed('assets/images/audio_muted_20_white.png'); - disabledSkin: Embed('assets/images/audio_muted_20_white.png'); -} - -.resizeHndlr -{ - upSkin: Embed('assets/images/resizeHandler.png'); - overSkin: Embed('assets/images/resizeHandler.png'); - downSkin: Embed('assets/images/resizeHandler.png'); - disabledSkin: Embed('assets/images/resizeHandler.png'); -} - -.cameraDisplaySettingsWindowStartBtn -{ - icon: Embed('assets/images/webcam.png'); -} - -.cameraDisplaySettingsWindowStartBtnDisabled -{ - icon: Embed('assets/images/webcam.png'); - color: #AAB3B3; - textSelectedColor: #AAB3B3; - fillAlphas: 0.45, 0.25; -} - -mx|Alert { - borderColor: #DFDFDF; - backgroundColor: #EFEFEF; - borderAlpha: 1; - shadowDistance: 1; - dropShadowColor: #FFFFFF; - titleStyleName: "alertTitleStyle"; - messageStyleName: "alertMessageStyle"; -} - -mx|AlertForm { - paddingTop: 8; - fontSize: 13; -} - -.alertMessageStyle { - color: #000000; - fontSize: 13; - textAlign: center; - paddingTop: 6; - paddingLeft: 12; - paddingRight: 12; - paddingBottom: 6; -} - -.alertTitleStyle { - fontFamily: Arial; - fontSize: 14; - fontWeight: bold; -} - -.logoutWindowStyle { - borderColor: #DFDFDF; - backgroundColor: #EFEFEF; - borderAlpha: 1; - shadowDistance: 1; - dropShadowColor: #FFFFFF; - color: #000000; - headerHeight: 32; - /* we need to set transparency duration to avoid the blur effect when two alerts are displayed sequentially */ - modalTransparencyDuration: 250; -} - -.lockSettingsDefaultLabelStyle { - fontFamily: Arial; - fontSize: 14; -} - -.lockSettingsWindowTitleStyle { - fontFamily: Arial; - fontSize: 20; - fontWeight: bold; -} - -.recordButtonStyleNormal { - icon: Embed('assets/images/control-record.png'); -} - -.recordButtonStyleStart { - icon: Embed('assets/images/control-record-start.png'); -} - -.recordButtonStyleStop { - icon: Embed('assets/images/control-record-stop.png'); -} - -.bandwidthButtonStyle { - paddingTop: 0; - paddingBottom: 0; - height: 22; - icon: Embed('assets/images/ic_swap_vert_16px.png'); -} - -.statusImageStyle { - successImage: Embed(source='assets/images/status_success.png'); - warningImage: Embed(source='assets/images/status_warning.png'); - failImage: Embed(source='assets/images/status_fail.png'); - refreshImage: Embed(source='assets/images/status_refresh.png'); -} - -.webRTCAudioStatusStyle { - strongAudioStatus: Embed(source='assets/images/strong_audio_status.png'); - almostStrongAudioStatus: Embed(source='assets/images/almost_strong_audio_status.png'); - almostWeakAudioStatus: Embed(source='assets/images/almost_weak_audio_status.png'); - weakAudioStatus: Embed(source='assets/images/weak_audio_status.png'); - color: #e1e2e5; -} - -.warningButtonStyle { - icon: Embed('assets/images/status_warning_20.png'); -} - -.statusTitleStyle { - fontWeight: bold; - fontSize: 12; - paddingBottom: 0; -} - -.statusMessageStyle { - fontSize: 12; - paddingTop: 0; -} - -.statusTimeStyle { - fontSize: 10; - paddingTop: 0; -} - -.addLayoutButtonStyle { - icon: Embed('assets/images/ic_add_circle_outline_16px.png'); -} - -.saveLayoutButtonStyle { - icon: Embed('assets/images/ic_file_download_16px.png'); -} - -.loadLayoutButtonStyle { - icon: Embed('assets/images/ic_file_upload_16px.png'); -} - -.broadcastLayoutButtonStyle { - icon: Embed('assets/images/ic_send_16px.png'); -} - -poll|PollChoicesModal { - fontSize: 14; - paddingLeft: 16; - paddingRight: 16; -} - -.chatOptionsLabel { - fontSize: 12; - color: #000000; - textRollOverColor: #000000; - textSelectedColor: #000000; - fontFamily: Arial; -} - -.chatMessageListStyle { - rollOverColor: #ffffff; - selectionColor: #f3f3f3; -} - -users|EmojiGrid { - backgroundColor: #ffffff; - horizontalAlign: center; - paddingLeft: 0; - paddingRight: 0; - paddingBottom: 0; - paddingTop: 0; -} - -.emojiGridTile { - paddingBottom: 10; - paddingLeft: 10; - paddingRight: 10; - paddingTop: 10; - verticalGap: 6; - horizontalGap: 6; -} - -users|RoomActionsRenderer { - paddingLeft : 5; - paddingRight : 5; -} - -.breakoutRoomUserWindowHeadingStyle { - fontWeight: bold; -} - -.breakoutRoomSettingTitleStyle { - fontFamily: Arial; - fontSize: 20; - fontWeight: bold; -} - -.roomsContainer { - horizontalAlign : center; - verticalGap: 10; - horizontalGap: 10; - paddingTop: 20; - paddingBottom: 20; -} - -.breakoutTipBox { - horizontalAlign: center; -} - -.breakoutRoomsBox { - paddingTop: 12; - horizontalAlign: center; -} - -.breakoutRoomTimerBox { - backgroundColor: #CCCCCC; - verticalAlign: middle; - horizontalAlign: center; -} - -.moodStyle { - icon: Embed('assets/images/ic_mood_black_18dp.png'); -} - -.moodRaiseHandStyle { - icon: Embed('assets/images/icon-3-high-five.png'); -} - -.moodAgreedStyle { - icon: Embed('assets/images/icon-6-thumb-up.png'); -} - -.moodDisagreedStyle { - icon: Embed('assets/images/icon-7-thumb-down.png'); -} - -.moodSpeakFasterStyle { - icon: Embed('assets/images/ic_fast_forward_black_18dp.png'); -} - -.moodSpeakSlowerStyle { - icon: Embed('assets/images/ic_fast_rewind_black_18dp.png'); -} - -.moodSpeakLouderStyle { - icon: Embed('assets/images/ic_volume_up_black_18dp.png'); -} - -.moodSpeakSofterStyle { - icon: Embed('assets/images/ic_volume_down_black_18dp.png'); -} - -.moodBeRightBackStyle { - icon: Embed('assets/images/ic_access_time_black_18dp.png'); -} - -.moodHappyStyle { - icon: Embed('assets/images/icon-6-smiling-face.png'); -} - -.moodSadStyle { - icon: Embed('assets/images/icon-7-sad-face.png'); -} - -.chatCopyButtonStyle{ - icon: Embed('assets/images/ic_content_copy_black_16px.png'); -} \ No newline at end of file diff --git a/bigbluebutton-client/branding/default/style/css/V2Theme.css b/bigbluebutton-client/branding/default/style/css/V2Theme.css new file mode 100644 index 0000000000000000000000000000000000000000..26331eb75c1be9dd98d03b6059018bb64a3c2614 --- /dev/null +++ b/bigbluebutton-client/branding/default/style/css/V2Theme.css @@ -0,0 +1,1422 @@ +@namespace mx "library://ns.adobe.com/flex/mx"; +@namespace flexlib "http://code.google.com/p/flexlib/"; +@namespace users "org.bigbluebutton.modules.users.views.*"; +@namespace poll "org.bigbluebutton.modules.polling.views.*"; +@namespace whiteboard "org.bigbluebutton.modules.whiteboard.views.*"; +@namespace videoconf "org.bigbluebutton.modules.videoconf.views.*"; +@namespace views "org.bigbluebutton.main.views.*"; +@namespace layout "org.bigbluebutton.modules.layout.views.*"; +@namespace presentation "org.bigbluebutton.modules.present.ui.views.*"; +@namespace sharednotes "org.bigbluebutton.modules.sharednotes.views.components.*"; +@namespace chat "org.bigbluebutton.modules.chat.views.*"; + +/* +//------------------------------ +// @font-face +//------------------------------ +*/ +@font-face { + src : url("assets/fonts/SourceSansPro-Regular.ttf"); + fontFamily : "Source Sans Pro"; + fontStyle : normal; + fontWeight : normal; +} + +@font-face { + src : url("assets/fonts/SourceSansPro-SemiBold.ttf"); + fontFamily : "Source Sans Pro"; + fontStyle : normal; + fontWeight : bold; +} + +/* +//------------------------------ +// global +//------------------------------ +*/ + +global { + fontFamily : "Source Sans Pro", Arial, sans-serif; + fontSize : 13; + color : #2A2D33; + selectionColor : #1070D7; + focusColor : #1070D7; +} + +.defaultShellStyle { + backgroundColor : #F1F3F7; +} + +.darkShellStyle { + backgroundColor : #42444C; +} + +/* +//------------------------------ +// Application +//------------------------------ +*/ + +mx|Application { + backgroundGradientColors : #F1F3F7, #F1F3F7; + backgroundColor : #F1F3F7; +} + +/* +//------------------------------ +// AudioSelectionWindow +//------------------------------ +*/ + +.audioSelectionsStyle { + horizontalGap : 60; + paddingLeft : 30; + paddingRight : 30; +} + +.audioBroswerHintBoxStyle { + paddingLeft : 5; + paddingRight : 5; + paddingBottom : 8; + paddingTop : 8; +} + +.webcamSettingsWindowTitleStyle, .micSettingsWindowTitleStyle { + fontSize : 24; + textAlign : center; +} + +.btnMicrophoneStyle, .btnListenOnlyStyle, .btnPhoneStyle { + borderAlphaUp : 0; + borderAlphaOver : 1; + borderAlphaDown : 1; + borderAlphaDisabled : 0; + + fillColorUp : #EFF5FA; + borderColorOver : #1070D7; + borderColorDown : #1070D7; + + borderThickness : 5; + cornerRadius : 70; +} + +.btnMicrophoneStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Audio_Big"); +} + +.btnListenOnlyStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Headset_Big"); +} + +.btnPhoneStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Phone_Big"); +} + +.audioSubtitle { + color : #363B43; + fontSize : 14; + fontWeight : bold; +} + +/* +//------------------------------ +// ApplicationControlBar +//------------------------------ +*/ + +mx|ApplicationControlBar { + cornerRadius : 0; + fillAlphas : 1, 1; + fillColors : #FFFFFF, #FFFFFF; + highlightAlphas : 0, 0; +} + +.toolbarSeparator { + strokeWidth : 1; + strokeColor : #CDD4DB; + paddingLeft : 20; + paddingRight : 20; +} + +.meetingNameLabelStyle { + fontSize : 14; + textAlign : left; + color : #2A2D33; +} + +.defaultControlBarStyle { + color : #2A2D33; +} + +.darkControlBarStyle { + color : #FFFFFF; +} + +.bandwidthButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Bandwidth"); +} + +.logoutButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Logout"); +} + +.settingsButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Settings"); +} + +.webcamDefaultButtonStyle, .webcamOnButtonStyle, .webcamOffButtonStyle, .webcamOverButtonStyle, +.deskshareDefaultButtonStyle, .deskshareOverButtonStyle, .deskshareOnButtonStyle, .deskshareOffButtonStyle, +.muteMeDefaultButtonStyle, .muteMeOnButtonStyle, .muteMeOffButtonStyle { + fillColorOver : #FFFFFF; + borderColorOver : #1070D7; + fillColorSelectedUp : #1070D7; + fillColorSelectedOver : #0A5EAC; + fillColorSelectedDown : #1070D7; + borderColorSelectedUp : #1070D7; + borderColorSelectedOver : #0A5EAC; + borderColorSelectedDown : #1070D7; +} + +.voiceConfDefaultButtonStyle, .voiceConfOverButtonStyle, .voiceConfActiveButtonStyle, .voiceConfInactiveButtonStyle { + /* Normal state */ + fillColorOver : #FFFFFF; + borderColorOver : #DE2721; + /* Selected state */ + backgroundColorOver : #FFFFFF; + borderColorOver : #DE2721; + fillColorSelectedUp : #DE2721; + fillColorSelectedOver : #B4201B; + fillColorSelectedDown : #DE2721; + borderColorSelectedUp : #DE2721; + borderColorSelectedOver : #B4201B; + borderColorSelectedDown : #DE2721; +} + +.webcamOnButtonStyle, .webcamOffButtonStyle { + fillColorUp : #1070D7; + borderColorUp : #1070D7; + fillColorOver : #0A5EAC; + fillColorDown : #1070D7; + borderColorOver : #0A5EAC; + + iconColor : #FFFFFF; + iconColorOver : #FFFFFF; + iconColorDown : #FFFFFF; +} + +.voiceConfDefaultButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Audio"); + disabledIcon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Audio_Disabled"); +} + +.voiceConfOverButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Audio_Red"); +} + +.voiceConfActiveButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Audio_On"); + disabledIcon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Audio_On_Disabled"); +} + +.voiceConfInactiveButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Audio_Off"); +} + +.webcamDefaultButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Webcam"); + disabledIcon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Webcam_Disabled"); +} + +.webcamOverButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Webcam_Blue"); +} + +.webcamOnButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Webcam_On"); +} + +.webcamOffButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Webcam_Off"); +} + +.deskshareDefaultButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Deskshare"); +} + +.deskshareOverButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Deskshare_Blue"); +} + +.deskshareOnButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Deskshare_White"); +} + +.deskshareOffButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Deskshare_White"); +} + +.recordButtonStyleNormal { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Record"); + disabledIcon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Record_Disabled"); + iconRecordReminder : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Record_Reminder"); +} + +.recordButtonStyleStart { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Record_On"); +} + +.recordButtonStyleStop { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Record_On"); +} + +.muteMeDefaultButtonStyle { + glowFilterColor : #B4201B; + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Microphone"); + disabledIcon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Microphone_Disabled"); +} + +.muteMeOnButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Microphone_White"); +} + +.muteMeOffButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Microphone_Off"); +} + +.quickWindowLinkStyle { + /* FIXME */ + paddingLeft : 0; + paddingRight : 0; + textDecoration : underline; + rollOverColor : #CCCCCC; + selectionColor : #999999; + color : #FFFFFF; + textRollOverColor : #504F3D; + textSelectedColor : #504F3D; +} + +.helpLinkButtonStyle { + /* FIXME */ + paddingLeft : 4; + paddingRight : 4; + paddingTop : 2; + paddingBottom : 2; + fontSize : 16; + rollOverColor : #CCCCCC; + selectionColor : #999999; + color : #FFFFFF; + textRollOverColor : #504F3D; + textSelectedColor : #504F3D; + fontWeight : bold; +} + +/* +//------------------------------ +// Alert +//------------------------------ +*/ + +mx|Alert { + borderColor : #FFFFFF; + backgroundColor : #FFFFFF; + borderAlpha : 1; + dropShadowEnabled : false; + color : #6C6C6C; + titleStyleName : "alertTitleStyle"; + messageStyleName : "alertMessageStyle"; +} + +mx|AlertForm { + paddingTop : 8; + fontSize : 13; +} + +.alertMessageStyle { + color : #8A9AA7; + fontSize : 14; + textAlign : center; + paddingTop : 6; + paddingLeft : 12; + paddingRight : 12; + paddingBottom : 6; +} + +.alertTitleStyle { + textAlign : center; + fontSize : 24; +} + +/* +//------------------------------ +// Button +//------------------------------ +*/ + +mx|Button { + paddingLeft : 12; + paddingRight : 12; + paddingTop : 8; + paddingBottom : 8; + cornerRadius : 2; + color : #4E5A66; + textRollOverColor : #4E5A66; + textSelectedColor : #4E5A66; + fontSize : 14; + skin : ClassReference("org.bigbluebutton.skins.ButtonSkin"); + + /* Normal state */ + fillColorUp : #FFFFFF; + fillColorOver : #CDD4DB; + fillColorDown : #ACB2B7; + fillColorDisabled : #F0F2F6; + borderColorUp : #CDD4DB; + borderColorOver : #CDD4DB; + borderColorDown : #ACB2B7; + borderColorDisabled : #CDD4DB; + + borderAlphaUp : 1; + borderAlphaOver : 1; + borderAlphaDown : 1; + borderAlphaDisabled : 1; + + borderThickness : 1; + + /* Selected state */ + fillColorSelectedUp : #F0F2F6; + fillColorSelectedOver : #CDD4DB; + fillColorSelectedDown : #ACB2B7; + fillColorSelectedDisabled : #F0F2F6; + borderColorSelectedUp : #CDD4DB; + borderColorSelectedOver : #CDD4DB; + borderColorSelectedDown : #ACB2B7; + borderColorSelectedDisabled : #CDD4DB; +} + +/* +//------------------------------ +// Breakout Rooms (FIXME) +//------------------------------ +*/ + +users|RoomActionsRenderer { + paddingLeft : 5; + paddingRight : 5; + iconTransfer : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Transfer"); + iconTransferred : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Transferred"); + iconJoin : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Join"); +} + +.breakoutRoomUserWindowHeadingStyle { + fontWeight : bold; +} + +.breakoutRoomSettingTitleStyle { + fontSize : 20; + fontWeight : bold; +} + +.roomsContainer { + horizontalAlign : center; + verticalGap : 10; + horizontalGap : 10; + paddingTop : 20; + paddingBottom : 20; +} + +.breakoutTipBox { + horizontalAlign : center; +} + +.breakoutRoomsBox { + paddingTop : 12; + horizontalAlign : center; +} + +.breakoutRoomTimerBox { + backgroundColor : #CCCCCC; + verticalAlign : middle; + horizontalAlign : center; +} + +/* +//------------------------------ +// Client Status +//------------------------------ +*/ + +views|ClientStatusItemRenderer { + iconSuccess : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Success"); + iconWarning : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Warning"); + iconFail : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Fail"); +} + +.statusTitleStyle { + fontWeight : bold; + fontSize : 12; + paddingBottom : 0; +} + +.statusMessageStyle { + fontSize : 12; + paddingTop : 0; +} + +.statusTimeStyle { + fontSize : 10; + paddingTop : 0; +} + +/* +//------------------------------ +// Chat +//------------------------------ +*/ + +.chatControlBarSendButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Send"); + disabledIcon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Send_Disabled"); + cornerRadius : 20; + borderStyle : none; + borderThickness : 0; + fillColorUp : #1070D7; + fillColorOver : #0A5EAC; + fillColorDown : #1070D7; + fillColorDisabled : #F0F2F6; +} + +.chatControlBarTextMsgStyle { + borderStyle : solid; + borderThickness : 1; + borderColor : #CDD4DB; + cornerRadius : 2; +} + +.chatSaveButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Save"); +} + +.chatCopyButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Copy"); +} + +.chatClearButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Delete"); + disabledIcon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Delete_Disabled"); +} + +.chatToolbarStyle { + backgroundColor : #F1F3F7; + cornerRadius : 5; + borderStyle : none; + paddingBottom : 4; + paddingTop : 4; + paddingLeft : 4; + paddingRight : 4; +} + +.chatOptionsLabel { + fontSize : 12; + color : #000000; + textRollOverColor : #000000; + textSelectedColor : #000000; +} + +.chatMessageListStyle { + rollOverColor : #FFFFFF; + selectionColor : #CED4DB; +} + +/* +//------------------------------ +// ComboBox +//------------------------------ +*/ + +mx|ComboBox { + cornerRadius : 2; + color : #5E6C73; + textRollOverColor : #5E6C73; + textSelectedColor : #5E6C73; + fontSize : 12; + + /* Normal state */ + fillColorUp : #FFFFFF; + fillColorOver : #CDD4DB; + fillColorDown : #ACB2B7; + fillColorDisabled : #F0F2F6; + borderColorUp : #CDD4DB; + borderColorOver : #CDD4DB; + borderColorDown : #ACB2B7; + borderColorDisabled : #CDD4DB; + + iconColor : #5E6C73; + + borderThickness : 1; + + skin : ClassReference("org.bigbluebutton.skins.ComboBoxSkin"); +} + +/* +//------------------------------ +// DataGrid +//------------------------------ +*/ + +mx|DataGrid { + backgroundColor : #FFFFFF; + borderStyle : none; + rollOverColor : #F3F3F3; + textRollOverColor : #3F3F41; + textSelectedColor : #3F3F41; + alternatingItemColors : #FFFFFF, #FFFFFF; + dropShadowEnabled : false; + verticalSeparatorSkin : ClassReference("org.bigbluebutton.skins.DataGridVerticalSeparatorSkin"); +} + +/* +//------------------------------ +// Desktop Sharing +//------------------------------ +*/ + +.deskshareControlButtonStyle { + cornerRadius : 18; +} + +.deskshareWarningLabelStyle { + fontWeight : bold; + fontSize : 18; + color : #1070D7; +} + +.deskshareWarningBackgroundStyle { + backgroundAlpha : 0.6; + backgroundColor : #5E6C72; +} + +.desktopShareViewStyle { + backgroundColor : #FFFFFF; + paddingTop : 15; + paddingLeft : 15; + paddingBottom : 15; + paddingRight : 15; +} + +.desksharePublishPauseBox { + horizontalAlign : center; + verticalAlign : middle; + borderColor : #CDD4DB; + borderThickness : 2; + borderStyle : solid; +} + +.desktopShareTextStyle { + color : #2A2D33; + fontSize : 11; + fontWeight : bold; +} + +/* +//------------------------------ +// Guest +//------------------------------ +*/ + +.allowButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Allow"); +} + +.denyButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Deny"); +} + +/* +//------------------------------ +// Layout +//------------------------------ +*/ + +layout|AddButton { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Circle_Add"); +} + +layout|SaveButton { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Download_Template"); +} + +layout|LoadButton { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Upload_Template"); +} + +layout|BroadcastButton { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Send_Layout"); +} + +/* +//------------------------------ +// Logout Window +//------------------------------ +*/ + +.logoutWindowStyle { + headerHeight : 32; + /* we need to set transparency duration to avoid the blur effect when two alerts are displayed sequentially */ + modalTransparencyDuration : 250; +} + +/* +//------------------------------ +// Lock Settings +//------------------------------ +*/ + +.lockSettingsDefaultLabelStyle { + fontSize : 14; +} + +.lockSettingsWindowTitleStyle { + fontSize : 18; + fontWeight : bold; +} + +/* +//------------------------------ +// MainApplicationShell +//------------------------------ +*/ + +views|MainApplicationShell { + verticalGap : 0; +} + +.logsButton { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Logs"); +} + +.fullScreenButton { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Fullscreen"); +} + +.exitFullScreenButton { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Exit_Fullscreen"); +} + +/* +//------------------------------ +// MDICanvas & MDIWindow +//------------------------------ +*/ + +flexlib|MDICanvas { + backgroundColor : #F1F3F7; +} + +flexlib|MDIWindow { + /*None of the following properties are overridden by the MDIWindow class*/ + backgroundSize : "100%"; + + headerHeight : 40; + + cornerRadius : 4; + dropShadowEnabled : false; + titleStyleName : "mdiWindowTitle"; + + cornerResizeImg : Embed(source="assets/swf/Blue.swf", symbol="Corner_Resize"); + roundedBottomCorners : true; + + controlButtonWidth : 10; + controlButtonHeight : 10; + controlButtonGap : 4; + + styleNameFocus : "mdiWindowFocus"; + styleNameNoFocus : "mdiWindowNoFocus"; + + maximizeBtnStyleName : "mdiMaximizeButtonStyle"; + restoreBtnStyleName : "mdiMaximizeButtonStyle"; + minimizeBtnStyleName : "mdiMinimizeButtonStyle"; + + paddingLeft : 0; + paddingRight : 0; + + showHeaderSeparator : true; +} + +.mdiMaximizeButtonStyle { + upSkin : Embed(source="assets/swf/v2_skin.swf", symbol="MDI_Button_Maximize_Up"); + overSkin : Embed(source="assets/swf/v2_skin.swf", symbol="MDI_Button_Maximize_Over"); + downSkin : Embed(source="assets/swf/v2_skin.swf", symbol="MDI_Button_Maximize_Down"); + disabledSkin : Embed(source="assets/swf/v2_skin.swf", symbol="MDI_Button_Maximize_Disabled"); +} + +.mdiMinimizeButtonStyle { + upSkin : Embed(source="assets/swf/v2_skin.swf", symbol="MDI_Button_Minimize_Up"); + overSkin : Embed(source="assets/swf/v2_skin.swf", symbol="MDI_Button_Minimize_Over"); + downSkin : Embed(source="assets/swf/v2_skin.swf", symbol="MDI_Button_Minimize_Down"); + disabledSkin : Embed(source="assets/swf/v2_skin.swf", symbol="MDI_Button_Minimize_Disabled"); +} + +.mdiWindowTitle { + color : #2A2D33; + fontSize : 12; +} + +.mdiWindowNoFocus { + borderStyle : solid; + borderAlpha : 1; + borderThickness : 1; + borderColor : #CDD4DB; + + backgroundColor : #FFFFFF; + backgroundAlpha : 1; +} + +.mdiWindowFocus { + borderStyle : solid; + borderAlpha : 1; + borderThickness : 1; + borderColor : #9EAEBA; + + backgroundColor : #FFFFFF; + backgroundAlpha : 1; +} + +/* +//------------------------------ +// MicSettings +//------------------------------ +*/ + +.micSettingsWindowHearFromHeadsetLabelStyle, .micSettingsWindowSpeakIntoMicLabelStyle, .webcamPermissionSettingsTextStyle, .inactivityWarningTextStyle { + fontSize : 14; +} + +.micSettingsWindowOpenDialogLabelStyle { + fontSize : 14; + fontWeight : bold; + color : #CDD4DB; +} + +.micSettingsWindowShareMicrophoneLabelStyle { + fontSize : 14; + color : #5E6C72; +} + +.micSettingsWindowPlaySoundButtonStyle { + color : #2A2D33; + textRollOverColor : #CDD4DB; + textSelectedColor : #CDD4DB; +} + +.micSettingsWindowCancelButtonStyle, .inactivityWarningWindowCancelButtonStyle { + color : #CDD4DB; + textRollOverColor : #CDD4DB; + textSelectedColor : #CDD4DB; +} + +.micSettingsWindowHelpButtonStyle { + paddingLeft : 4; + paddingRight : 4; + paddingTop : 2; + paddingBottom : 2; + fontSize : 16; + rollOverColor : #CDD4DB; + selectionColor : #5E6C73; + textRollOverColor : #FFFFFF; + textSelectedColor : #FFFFFF; + fontWeight : bold; +} + +/* +//------------------------------ +// Network Stats +//------------------------------ +*/ + +views|NetworkStatsWindow { + iconRefresh : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Refresh"); +} + +/* +//------------------------------ +// PopUpButton +//------------------------------ +*/ + +mx|PopUpButton { + /* Normal state */ + fillColorUp : #FFFFFF; + fillColorOver : #CDD4DB; + fillColorDown : #ACB2B7; + fillColorDisabled : #F0F2F6; + borderColorUp : #CDD4DB; + borderColorOver : #1070D7; + borderColorDown : #1070D7; + borderColorDisabled : #CDD4DB; + + /* Icon states */ + iconColor : #4E5A66; + iconColorOver : #1070D7; + iconColorDown : #4E5A66; + + borderThickness : 1; + + skin : ClassReference("org.bigbluebutton.skins.PopUpButtonSkin"); +} + +/* +//------------------------------ +// Panel +//------------------------------ +*/ + +mx|Panel { + borderColor : #CDD4DB; + borderAlpha : 1; + dropShadowEnabled : false; + backgroundColor : #FFFFFF; + titleStyleName : "panelTitleStyle"; + showHeaderSeparator : false; + borderSkin : ClassReference("org.bigbluebutton.skins.PanelSkin"); +} + +.panelTitleStyle { + color : #2A2D33; + fontSize : 12; +} + +/* +//------------------------------ +// Presentation +//------------------------------ +*/ + +presentation|UploadedPresentationRenderer { + iconSave : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Save_Disabled"); +} + +.presentationWindowControlsStyle { + paddingBottom : 5; + paddingTop : 3; + paddingLeft : 3; + paddingRight : 3; + bottom : 5; + cornerRadius : 0; + dropShadowEnabled : false; +} + +.presentationUploadDeleteButtonStyle { + fillAlphas : 1, 1, 1, 1; + fillColors : #FEFEFF, #E1E2E5, #FFFFFF, #EEEEEE; + color : #3F3F41; + textRollOverColor : #3F3F41; + textSelectedColor : #3F3F41; + borderColor : #B9BABC; + cornerRadius : 5; + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Trash"); +} + +.presentationUploadButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Upload"); +} + +.pollStartButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Polling"); +} + +.presentationBackButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Arrow_Left"); + disabledIcon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Arrow_Left_Disabled"); +} + +.presentationForwardButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Arrow_Right"); + disabledIcon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Arrow_Right_Disabled"); +} + +.presentationFitToWidthButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Fit_To_Width"); +} + +.presentationFitToPageButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Fit_To_Screen"); +} + +.presentationDownloadButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Download"); + disabledIcon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Download_Disabled"); +} + +.presentationZoomSliderStyle { + labelOffset : 0; + thumbOffset : 3; + dataTipOffset : -1; + tickOffset : 2; + tickLength : 5; + tickThickness : 2; + tickColor : #1070D7; + showTrackHighlight : true; + invertThumbDirection : false; + borderColor : #CDD4DB; + trackColors : #5E6C72, #5E6C72; + fillAlphas : 1, 1, 1, 1; + fillColors : #F1F3F7, #F1F3F7, #F1F3F7, #F1F3F7; + labelStyleName : "presentationZoomSliderLabelStyle"; +} + +.presentationZoomSliderLabelStyle { + color : #2A2D33; +} + +presentation|FileUploadWindow { + iconGo : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Go"); + titleStyleName : "presentationFileUploadWindowTitleStyle"; +} + +.presentationFileUploadWindowTitleStyle, .presentationUploadTitleStyle { + fontSize : 18; + fontWeight : bold; +} + +.presentationNamesLabelStyle { + fontSize : 14; + fontWeight : bold; +} + +.presentationUploadChooseFileButtonStyle { + color : #2A2D33; +} + +.presentationUploadCancelButtonStyle { + color : #2A2D33; +} + +.presentationUploadShowButtonStyle { + color : #2A2D33; +} + +.presentationUploadFileFormatHintBoxStyle, .audioBroswerHintBoxStyle { + backgroundColor : #CDD4DB; + dropShadowEnabled : false; + paddingLeft : 10; + paddingRight : 10; +} + +.presentationUploadFileFormatHintTextStyle, .audioBroswerHintTextStyle { + fontWeight : bold; +} + +.presentationSlideViewStyle { + backgroundColor : #8A9AA7; +} + +/* +//------------------------------ +// Poll +//------------------------------ +*/ + +poll|PollChoicesModal { + fontSize : 14; + paddingLeft : 16; + paddingRight : 16; +} + +.pollResondersLabelStyle { + color : #5E6C72; + fontSize : 14; +} + +/* +//------------------------------ +// ProgressBar +//------------------------------ +*/ + +mx|ProgressBar { + color : #8A9AA7; + barColor : #1070D7; + trackColors : #FFFFFF, #FFFFFF; + borderColor : #CDD4DB; + barSkin : ClassReference("org.bigbluebutton.skins.ProgressBarSkin"); + trackSkin : ClassReference("org.bigbluebutton.skins.ProgressTrackSkin"); +} + +/* +//------------------------------ +// ReconnectionPopup +//------------------------------ +*/ + +views|ReconnectionPopup { + iconRefresh : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Refreshing"); +} + +/* +//------------------------------ +// SharedNotes +//------------------------------ +*/ + +sharednotes|SharedNotesRichTextEditor { + iconBold : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Bold"); + iconItalic : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Italic"); + iconUnderline : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Underline"); + iconBullet : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Bullet"); + iconAlignLeft : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Align_Left"); + iconAlignCenter : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Align_Center"); + iconAlignRight : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Align_Right"); + iconAlignJustify : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Align_Justify"); +} + +.sharedNotesSettings { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Settings"); +} + +.sharedNotesSaveButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Save"); +} + +.sharedNotesNewButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Add_File"); +} + +.sharedNotesUndoButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Undo"); + disabledIcon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Undo_Disabled"); +} + +.sharedNotesRedoButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Redo"); + disabledIcon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Redo_Disabled"); +} + +.sharedNotesFormatButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Format_Text"); +} + +/* +//------------------------------ +// TitleWindow +//------------------------------ +*/ + +mx|TitleWindow { + borderColor : #FFFFFF; + cornerRadius : 4; + roundedBottomCorners : true; + dropShadowEnabled : true; + shadowDistance : 0; +} + +/* +//------------------------------ +// ToolTip +//------------------------------ +*/ + +mx|ToolTip { + borderSkin : ClassReference("org.bigbluebutton.skins.ToolTipSkin"); + backgroundColor : #1070D7; + color : #FFFFFF; + fontSize : 13; + backgroundAlpha : 0.9; + cornerRadius : 3; +} + +.errorTip { + borderColor : #DE2721; +} + +/* +//------------------------------ +// Users +//------------------------------ +*/ + +users|UsersWindow { + iconAudioMuted : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Audio_Muted"); + iconAudio : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Audio"); + iconLock : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Lock"); + iconMood : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Mood_Happy"); + iconSettings : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Settings"); +} + +users|StatusItemRenderer { + iconPresenter : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Presenter"); + iconModerator : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Moderator"); + iconModeratorOnly : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_ListenOnly"); + iconMoodRaiseHand : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Mood_RaiseHand"); + iconMood : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Mood_Happy"); + iconMoodHappy : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Mood_Happy"); + iconMoodNeutral : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Mood_Neutral"); + iconMoodSad : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Mood_Sad"); + iconMoodConfused : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Mood_Confused"); + iconMoodAway : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Mood_Away"); + iconMoodThumbsUp : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Mood_ThumbsUp"); + iconMoodThumbsDown : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Mood_ThumbsDown"); + iconMoodApplause : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Mood_Applause"); +} + +users|MediaItemRenderer { + iconAudioMuted : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Audio_Muted"); + iconAudio : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Audio"); + iconSound : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Sound"); + iconLock : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Lock"); + iconUnlock : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Unlock"); + iconSettings : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Settings"); + iconWebcam : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Webcam"); + iconDemote : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Demote"); + iconPromote : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Promote"); + iconEject : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Eject"); + glowFilterColor : #B4201B; +} + +users|NameItemRenderer { + fontSize : 12; + textAlign : left; +} + +.nameRenderer { + fontWeight : normal; + color : #2A2D33; +} + +.meNameRenderer { + fontWeight : bold; + color : #3D97D3; +} + +.usersGridStyle { + selectionColor : #F0F2F6; +} + +users|EmojiGrid { + backgroundColor : #FFFFFF; + horizontalAlign : center; + paddingLeft : 0; + paddingRight : 0; + paddingBottom : 0; + paddingTop : 0; +} + +.emojiGridTile { + paddingBottom : 10; + paddingLeft : 10; + paddingRight : 10; + paddingTop : 10; + verticalGap : 6; + horizontalGap : 6; +} + +users|MoodMenu { + iconMoodRaiseHand : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Mood_RaiseHand"); + iconMoodApplause : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Mood_Applause"); + iconMoodAgree : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Mood_ThumbsUp"); + iconMoodDisagree : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Mood_ThumbsDown"); + /* FIXME - start*/ + iconMoodSpeakFaster : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Mood_Away"); + iconMoodSpeakSlower : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Mood_Away"); + iconMoodSpeakLouder : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Mood_Speak_Louder"); + iconMoodSpeakSofter : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Mood_Away"); + /* FIXME - end */ + iconMoodBeRightBack : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Mood_Away"); + iconMoodHappy : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Mood_Happy"); + iconMoodClear : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Mood_Clear"); + iconMoodNeutral : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Mood_Neutral"); + iconMoodConfused : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Mood_Confused"); +} + +/* +//------------------------------ +// VideoDock +//------------------------------ +*/ + +videoconf|UserGraphicHolder { + iconPresenter : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Video_Presenter"); + iconModerator : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Video_Moderator"); + iconClose : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Close_Video"); + iconFullScreen : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Fullscreen_White"); + iconExitFullScreen : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Exit_Fullscreen_White"); +} + +.videoToolbarBackgroundTalkingStyle { + backgroundColor : #1070D7; + backgroundAlpha : 0.5; +} + +.videoToolbarBackgroundNotTalkingStyle { + backgroundColor : #000000; + backgroundAlpha : 0.5; +} + +.videoToolbarLabelStyle { + color : #FFFFFF; + fontSize : 12; + textIndent : 0; +} + +.muteOverlayBtn { + upSkin : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Video_Unmuted"); + overSkin : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Video_Unmuted"); + downSkin : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Video_Unmuted"); + disabledSkin : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Video_Unmuted"); +} + +.unmuteOverlayBtn { + upSkin : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Video_Muted"); + overSkin : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Video_Muted"); + downSkin : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Video_Muted"); + disabledSkin : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Video_Muted"); +} + +/* +//------------------------------ +// Webcam Shraring +//------------------------------ +*/ + +.videoMessageWarningLabelStyle { + fontWeight : bold; + fontSize : 14; + color : #FFFF26; +} + +.videoMessageErrorLabelStyle { + fontWeight : bold; + fontSize : 14; + color : #EF4339; +} + +.videoMessageBackgroundStyle { + backgroundAlpha : 0.6; + backgroundColor : #5E6C72; +} + +.cameraDisplaySettingsWindowStartBtn { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Webcam"); + disabledIcon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Webcam_Disabled"); +} + +/* +//------------------------------ +// WebRTCAudioStatus +//------------------------------ +*/ + +views|WebRTCAudioStatus { + color : #E1E2E5; + iconStrongAudio : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Strong_Audio"); + iconAlmostStrongAudio : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Almost_Strong_Audio"); + iconAlmostWeakAudio : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Almost_Weak_Audio"); + iconWeakAudio : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Weak_Audio"); +} + +/* +//------------------------------ +// WarningButton +//------------------------------ +*/ + +views|WarningButton { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Warning_Small"); +} + +/* +//------------------------------ +// Whiteboard +//------------------------------ +*/ + +whiteboard|WhiteboardToolbar { + iconWhiteboardThin : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Whiteboard_Thin"); + iconWhiteboardThick : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Whiteboard_Thick"); + backgroundColor : #CFD4DB; + borderColor : #CFD4DB; + borderStyle : solid; + borderThickness : 1; + cornerRadius : 4; + paddingBottom : 0; + paddingTop : 0; + paddingLeft : 0; + paddingRight : 0; + verticalGap : 1; +} + +whiteboard|WhiteboardCanvas { + iconEllipse : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Whiteboard_Ellipse"); + iconRectangle : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Whiteboard_Rectangle"); + iconTriangle : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Whiteboard_Triangle"); + iconPencil : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Whiteboard_Pencil"); + iconLine : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Whiteboard_Line"); + iconText : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Whiteboard_Text"); +} + +.colorPickerStyle { + backgroundColor : #E5E6E7; + columnCount : 13; + horizontalGap : 0; + previewHeight : 22; + previewWidth : 50; + swatchGridBackgroundColor : #000000; + swatchGridBorderSize : 0; + swatchHeight : 60; + swatchHighlightColor : #FFFFFF; + swatchHighlightSize : 1; + swatchWidth : 12; + textFieldWidth : 72; + verticalGap : 0; +} + +.whiteboardPanZoomButtonStyle, .whiteboardScribbleButtonStyle, .whiteboardRectangleButtonStyle, +.whiteboardCircleButtonStyle, .whiteboardTriangleButtonStyle, .whiteboardLineButtonStyle, +.whiteboardTextButtonStyle, .whiteboardClearButtonStyle, .whiteboardUndoButtonStyle { + /* Normal state */ + borderStyle : none; + borderThickness : 0; + cornerRadius : 0; +} + +.whiteboardPanZoomButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Hand"); +} + +.whiteboardScribbleButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Pencil"); +} + +.whiteboardRectangleButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Rectangle"); +} + +.whiteboardCircleButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Circle"); +} + +.whiteboardTriangleButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Triangle"); +} + +.whiteboardLineButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Line"); +} + +.whiteboardTextButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Text_Tool"); +} + +.whiteboardClearButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Whiteboard_Clear"); +} + +.whiteboardUndoButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Whiteboard_Undo"); +} + +.multiUserWhiteboardOnButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Whiteboard"); +} + +.multiUserWhiteboardOffButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Multi_Whiteboard"); +} diff --git a/bigbluebutton-client/branding/default/style/css/assets/fonts/SourceSansPro-Regular.ttf b/bigbluebutton-client/branding/default/style/css/assets/fonts/SourceSansPro-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..278ad8aa0a09592a759e39f8fc06d0fa9d986fb0 Binary files /dev/null and b/bigbluebutton-client/branding/default/style/css/assets/fonts/SourceSansPro-Regular.ttf differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/fonts/SourceSansPro-SemiBold.ttf b/bigbluebutton-client/branding/default/style/css/assets/fonts/SourceSansPro-SemiBold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ac3e0d19a9c87eda6a76a801ae2ec80e16cbe3d3 Binary files /dev/null and b/bigbluebutton-client/branding/default/style/css/assets/fonts/SourceSansPro-SemiBold.ttf differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/3_closeButton.png b/bigbluebutton-client/branding/default/style/css/assets/images/3_closeButton.png deleted file mode 100755 index 6439bca62b17541aedea8a2b399ccf89c2149386..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/3_closeButton.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/3_decreaseButton.png b/bigbluebutton-client/branding/default/style/css/assets/images/3_decreaseButton.png deleted file mode 100755 index 78acfd24702bfeac9bf0491a626d612e192407af..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/3_decreaseButton.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/3_increaseButton.png b/bigbluebutton-client/branding/default/style/css/assets/images/3_increaseButton.png deleted file mode 100755 index efadb1bf07c102106d0ccd1679bbb8990cfa9491..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/3_increaseButton.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/3_minimizeButton.png b/bigbluebutton-client/branding/default/style/css/assets/images/3_minimizeButton.png deleted file mode 100755 index bf90eb5814b04a5e163184f747d4f404972300c2..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/3_minimizeButton.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/almost_strong_audio_status.png b/bigbluebutton-client/branding/default/style/css/assets/images/almost_strong_audio_status.png deleted file mode 100644 index af067f7abf218f358dd784146f99f7a0b19edb5f..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/almost_strong_audio_status.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/almost_weak_audio_status.png b/bigbluebutton-client/branding/default/style/css/assets/images/almost_weak_audio_status.png deleted file mode 100644 index ca769d83e4a552fb79daa54383a8bb937a755061..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/almost_weak_audio_status.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/arrows_redo_icon.png b/bigbluebutton-client/branding/default/style/css/assets/images/arrows_redo_icon.png deleted file mode 100644 index 7aa2e5847c88bd2f3dc134af7c96ea1663659f28..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/arrows_redo_icon.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/arrows_redo_icon_grey.png b/bigbluebutton-client/branding/default/style/css/assets/images/arrows_redo_icon_grey.png deleted file mode 100644 index 0c348f929499eb3c6fd4c26c669a8c506e351b0e..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/arrows_redo_icon_grey.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/arrows_undo_icon.png b/bigbluebutton-client/branding/default/style/css/assets/images/arrows_undo_icon.png deleted file mode 100644 index 5c24a934c439aa0a97f16dba647e46ea678686cb..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/arrows_undo_icon.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/arrows_undo_icon_grey.png b/bigbluebutton-client/branding/default/style/css/assets/images/arrows_undo_icon_grey.png deleted file mode 100644 index 2657cb174101acb1080d44af1419d7541808436f..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/arrows_undo_icon_grey.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/audio_20_white.png b/bigbluebutton-client/branding/default/style/css/assets/images/audio_20_white.png deleted file mode 100755 index b337c3ea5863f8b40caa1df013ec034f9a15d34a..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/audio_20_white.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/audio_20_white.xcf b/bigbluebutton-client/branding/default/style/css/assets/images/audio_20_white.xcf deleted file mode 100644 index f4b196793398428aac3cfeb58d3a9466d2900b43..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/audio_20_white.xcf and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/audio_muted_20_white.png b/bigbluebutton-client/branding/default/style/css/assets/images/audio_muted_20_white.png deleted file mode 100755 index 6bf58b88e71bee8b91f37fd380f2ce127dee668c..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/audio_muted_20_white.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/bandwidth.png b/bigbluebutton-client/branding/default/style/css/assets/images/bandwidth.png deleted file mode 100644 index 58f33a59d663acb039a7d1b5604438e139ee83af..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/bandwidth.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/bbb_accept_certificate.png b/bigbluebutton-client/branding/default/style/css/assets/images/bbb_accept_certificate.png deleted file mode 100644 index d7f1ab3da08d5abb19cb6468adbd43561eb0b002..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/bbb_accept_certificate.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/bbb_empty_image.png b/bigbluebutton-client/branding/default/style/css/assets/images/bbb_empty_image.png deleted file mode 100755 index 239b6ab501e4b3ca308d80515a923d887c0fdcaa..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/bbb_empty_image.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/bbb_placeholder_image.png b/bigbluebutton-client/branding/default/style/css/assets/images/bbb_placeholder_image.png deleted file mode 100755 index 2f564b36f61c21c499c21624cb31a3d0fde20e2b..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/bbb_placeholder_image.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/chromePluginBlocked.png b/bigbluebutton-client/branding/default/style/css/assets/images/chromePluginBlocked.png deleted file mode 100755 index 5631ba46a343a45634dbc6468926b5f9475b3f9a..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/chromePluginBlocked.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/control-record-start.png b/bigbluebutton-client/branding/default/style/css/assets/images/control-record-start.png deleted file mode 100644 index e26a3d5ae32e2856f31b11f11a84d416e314ab88..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/control-record-start.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/control-record-stop.png b/bigbluebutton-client/branding/default/style/css/assets/images/control-record-stop.png deleted file mode 100644 index c10cc1e504dc79de4b0e7d47ddd7274a3e385042..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/control-record-stop.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/control-record.png b/bigbluebutton-client/branding/default/style/css/assets/images/control-record.png deleted file mode 100644 index c11d60b052e6eebdb2e47831062618aabd692ddf..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/control-record.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/delete.png b/bigbluebutton-client/branding/default/style/css/assets/images/delete.png deleted file mode 100755 index 0059eaa72ce11f79b11fb2fa0d5c3e225ca6c11a..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/delete.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/deskshare_close.png b/bigbluebutton-client/branding/default/style/css/assets/images/deskshare_close.png deleted file mode 100644 index 2c68797e1e5ec4ecde6df2e3ffc0ad1cc4c91302..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/deskshare_close.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/deskshare_icon.png b/bigbluebutton-client/branding/default/style/css/assets/images/deskshare_icon.png deleted file mode 100644 index e9065faaf077a4032e50c4455f2e0e10a349c2af..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/deskshare_icon.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/deskshare_on.png b/bigbluebutton-client/branding/default/style/css/assets/images/deskshare_on.png deleted file mode 100644 index ab036b1766e4284d2603518848309a1ad3a5f842..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/deskshare_on.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/ellipse.png b/bigbluebutton-client/branding/default/style/css/assets/images/ellipse.png deleted file mode 100755 index 3252b6aa957f272a4c0ae8ea14213464681cba7d..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/ellipse.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/fit-to-screen.png b/bigbluebutton-client/branding/default/style/css/assets/images/fit-to-screen.png deleted file mode 100755 index 13791f50651aa93b059fdc0043a3577f5b62f4da..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/fit-to-screen.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/fit-to-width.png b/bigbluebutton-client/branding/default/style/css/assets/images/fit-to-width.png deleted file mode 100755 index d776a6634c1e9d12623700e6db78459b0d3cba44..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/fit-to-width.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/hand.png b/bigbluebutton-client/branding/default/style/css/assets/images/hand.png deleted file mode 100755 index d923194e5ed2ccd5ac57a456540474727d6531b4..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/hand.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/headset.png b/bigbluebutton-client/branding/default/style/css/assets/images/headset.png deleted file mode 100644 index 41e20141a1bb9989836f9f69b4c80bd2556321fc..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/headset.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/headset_close.png b/bigbluebutton-client/branding/default/style/css/assets/images/headset_close.png deleted file mode 100644 index a69e50da75b59fefc1e3abc3482150e19549245d..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/headset_close.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/headset_open.png b/bigbluebutton-client/branding/default/style/css/assets/images/headset_open.png deleted file mode 100644 index 65bacb45bf7516a3db77593583d9278d75a6e5e4..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/headset_open.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/ic_access_time_black_18dp.png b/bigbluebutton-client/branding/default/style/css/assets/images/ic_access_time_black_18dp.png deleted file mode 100644 index 1fd032f2d667900c0a6e4803e4b22f5bbe66c25c..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/ic_access_time_black_18dp.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/ic_add_circle_outline_16px.png b/bigbluebutton-client/branding/default/style/css/assets/images/ic_add_circle_outline_16px.png deleted file mode 100644 index 62c8a130134f8cf9fe65888d0f53bc29271f70c4..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/ic_add_circle_outline_16px.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/ic_arrow_back_24px.png b/bigbluebutton-client/branding/default/style/css/assets/images/ic_arrow_back_24px.png deleted file mode 100644 index 9cf8af82f846bd0f88de0247b5a578aaabefb28f..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/ic_arrow_back_24px.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/ic_arrow_back_grey_24px.png b/bigbluebutton-client/branding/default/style/css/assets/images/ic_arrow_back_grey_24px.png deleted file mode 100644 index 99cf9f7c9960e4e1f38d71ef4c748eed5aaaf257..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/ic_arrow_back_grey_24px.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/ic_arrow_forward_24px.png b/bigbluebutton-client/branding/default/style/css/assets/images/ic_arrow_forward_24px.png deleted file mode 100644 index d407e3dcdd5d4f051859711b50928e10ec2cfc59..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/ic_arrow_forward_24px.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/ic_arrow_forward_grey_24px.png b/bigbluebutton-client/branding/default/style/css/assets/images/ic_arrow_forward_grey_24px.png deleted file mode 100644 index 70df2653996db6071dcf7b66b0e967a95228d867..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/ic_arrow_forward_grey_24px.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/ic_clear_black_18dp.png b/bigbluebutton-client/branding/default/style/css/assets/images/ic_clear_black_18dp.png deleted file mode 100644 index 082c9bdfd9ca005efdacb9295c9a281fff1c1cf1..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/ic_clear_black_18dp.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/ic_content_copy_black_16px.png b/bigbluebutton-client/branding/default/style/css/assets/images/ic_content_copy_black_16px.png deleted file mode 100644 index 5f460b1bb009d772cce0786b44fe942fe9605af2..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/ic_content_copy_black_16px.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/ic_fast_forward_black_18dp.png b/bigbluebutton-client/branding/default/style/css/assets/images/ic_fast_forward_black_18dp.png deleted file mode 100644 index a1394ab3215683ef21c4c993af1bdbfdad663631..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/ic_fast_forward_black_18dp.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/ic_fast_rewind_black_18dp.png b/bigbluebutton-client/branding/default/style/css/assets/images/ic_fast_rewind_black_18dp.png deleted file mode 100644 index 30fdf6e706b346a87914b3ae3c15172ddd15f75c..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/ic_fast_rewind_black_18dp.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/ic_file_download_16px.png b/bigbluebutton-client/branding/default/style/css/assets/images/ic_file_download_16px.png deleted file mode 100644 index 0521c6210b4570b403ee4f51d00b10ecae0c3702..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/ic_file_download_16px.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/ic_file_download_grey_16px.png b/bigbluebutton-client/branding/default/style/css/assets/images/ic_file_download_grey_16px.png deleted file mode 100644 index c375962ff327e242b5d63cf51df5c253c9042d6b..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/ic_file_download_grey_16px.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/ic_file_upload_16px.png b/bigbluebutton-client/branding/default/style/css/assets/images/ic_file_upload_16px.png deleted file mode 100644 index b9089febd06bc90f08a7fefdf6c4867f70ba165e..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/ic_file_upload_16px.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/ic_mood_black_18dp.png b/bigbluebutton-client/branding/default/style/css/assets/images/ic_mood_black_18dp.png deleted file mode 100644 index 4ca438be9b3df3a1c4556dcd2051150df9db8e90..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/ic_mood_black_18dp.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/ic_note_add_16px.png b/bigbluebutton-client/branding/default/style/css/assets/images/ic_note_add_16px.png deleted file mode 100644 index efe50b413b11446ae64ba09642e4d7592b842e3f..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/ic_note_add_16px.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/ic_note_format_16px.png b/bigbluebutton-client/branding/default/style/css/assets/images/ic_note_format_16px.png deleted file mode 100644 index d00faa64a486165552992297d0677a03e148b0ed..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/ic_note_format_16px.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/ic_save_16px.png b/bigbluebutton-client/branding/default/style/css/assets/images/ic_save_16px.png deleted file mode 100644 index a3ef221d2d969ac54ebc43bd1f889d93608e6540..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/ic_save_16px.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/ic_send_16px.png b/bigbluebutton-client/branding/default/style/css/assets/images/ic_send_16px.png deleted file mode 100644 index 61ac36eb4b0508596b250075ee2606e998311727..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/ic_send_16px.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/ic_settings_16px.png b/bigbluebutton-client/branding/default/style/css/assets/images/ic_settings_16px.png deleted file mode 100644 index e269e38c5f2fd86d09ba489d3daa76b9f8b2b8cf..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/ic_settings_16px.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/ic_swap_vert_16px.png b/bigbluebutton-client/branding/default/style/css/assets/images/ic_swap_vert_16px.png deleted file mode 100644 index 27d7ef68261109b4625a34f6571e33c5a41868d3..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/ic_swap_vert_16px.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/ic_thumb_down_16px.png b/bigbluebutton-client/branding/default/style/css/assets/images/ic_thumb_down_16px.png deleted file mode 100644 index 5f7a7853aceab7b258520a5cdedf91b6e339b62c..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/ic_thumb_down_16px.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/ic_thumb_up_16px.png b/bigbluebutton-client/branding/default/style/css/assets/images/ic_thumb_up_16px.png deleted file mode 100644 index 19ec42fc3afbff6747e89f114256abfe6ed360e4..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/ic_thumb_up_16px.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/ic_volume_down_black_18dp.png b/bigbluebutton-client/branding/default/style/css/assets/images/ic_volume_down_black_18dp.png deleted file mode 100644 index b51479f4cacce573c97f5a38522a3d320defe1f4..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/ic_volume_down_black_18dp.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/ic_volume_up_black_18dp.png b/bigbluebutton-client/branding/default/style/css/assets/images/ic_volume_up_black_18dp.png deleted file mode 100644 index 58f4e270760ae3b7483a86de06bc21453e05dba4..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/ic_volume_up_black_18dp.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/icon-3-high-five.png b/bigbluebutton-client/branding/default/style/css/assets/images/icon-3-high-five.png deleted file mode 100644 index 4361fea6534359e9b1150d56718b8296101d5c35..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/icon-3-high-five.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/icon-3-high-five.svg b/bigbluebutton-client/branding/default/style/css/assets/images/icon-3-high-five.svg deleted file mode 100644 index 4c563540df1f21f23244b33d76e89864ded4cb4a..0000000000000000000000000000000000000000 --- a/bigbluebutton-client/branding/default/style/css/assets/images/icon-3-high-five.svg +++ /dev/null @@ -1,80 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:sketch="http://www.bohemiancoding.com/sketch/ns" - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="32px" - height="32px" - viewBox="0 0 32 32" - version="1.1" - id="svg2" - inkscape:version="0.48.4 r9939" - sodipodi:docname="icon-3-high-five.svg" - inkscape:export-filename="/var/lib/lxc/bbb-dev090-14/rootfs/home/ubuntu/dev/bigbluebutton/bigbluebutton-client/branding/default/style/css/assets/images/icon-3-high-five.png" - inkscape:export-xdpi="50" - inkscape:export-ydpi="50"> - <metadata - id="metadata15"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title>icon 3 high five</dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="753" - inkscape:window-height="480" - id="namedview13" - showgrid="false" - inkscape:zoom="7.375" - inkscape:cx="39.864407" - inkscape:cy="16" - inkscape:window-x="75" - inkscape:window-y="34" - inkscape:window-maximized="0" - inkscape:current-layer="svg2" /> - <!-- Generator: Sketch 3.0.3 (7891) - http://www.bohemiancoding.com/sketch --> - <title - id="title4">icon 3 high five</title> - <desc - id="desc6">Created with Sketch.</desc> - <defs - id="defs8" /> - <g - id="Page-1" - stroke="none" - stroke-width="1" - fill="none" - fill-rule="evenodd" - sketch:type="MSPage" - style="fill:#000000;stroke:#000000;stroke-opacity:1"> - <g - id="icon-3-high-five" - sketch:type="MSArtboardGroup" - fill="#929292" - style="fill:#000000;stroke:#000000;stroke-opacity:1"> - <path - d="M28.1244203,21.5 C28.1244203,26.1944206 24.3188409,30 19.6244203,30.0000003 C16.5115051,30.0000003 13.2262274,28.5474856 10.9652407,24.4282229 C7.70175208,18.4825159 3.52827319,14.5832077 5.51553361,12.5959473 C6.9371827,11.1742982 9.16926196,12.5381668 11.1244203,14.3667868 L11.1244203,14.3667868 L11.1244203,6.50840855 C11.1244203,5.11541748 12.2437085,4 13.6244203,4 C14.1892809,4 14.7078132,4.18537107 15.1244253,4.49839144 C15.1271484,3.1148807 16.2453908,2 17.6244203,2 C19.014265,2 20.1236329,3.12004027 20.1244199,4.50198455 C20.5422503,4.18708451 21.0616172,4 21.6244203,4 C23.0147583,4 24.1244203,5.12055197 24.1244203,6.50282288 L24.1244203,7.49767249 C24.5422506,7.18504628 25.0616174,7 25.6244203,7 C27.0147583,7 28.1244203,8.11599243 28.1244203,9.49263886 L28.1244203,21.5 L28.1244203,21.5 Z M19.6244203,29 C15.8647052,28.9995418 13.6344162,26.9488875 11.8717958,23.9830936 C7.95978233,17.4007216 5.15828327,14.3887562 6.24545305,13.2957153 C7.35605012,12.1791206 10.0660207,14.5979243 12.1244203,16.7983451 L12.1244203,6.49309635 C12.1244203,5.66388585 12.7959932,5 13.6244203,5 C14.4586231,5 15.1244203,5.66848201 15.1244203,6.49309635 L15.1244203,16 L16.1244203,16 L16.1244203,4.49089813 C16.1244203,3.67622006 16.7959932,3 17.6244203,3 C18.4586231,3 19.1244203,3.66749783 19.1244203,4.49089813 L19.1244203,15 L20.1244203,15 L20.1244203,6.50370994 C20.1244203,5.66197696 20.7959932,5 21.6244203,5 C22.4586231,5 23.1244203,5.67323387 23.1244203,6.50370994 L23.1244203,16 L24.1244203,16 L24.1244203,9.4912653 C24.1244203,8.66254437 24.7959932,8 25.6244203,8 C26.4586231,8 27.1244203,8.66766222 27.1244203,9.4912653 L27.1244203,17.7543674 L27.1244203,21.5 C27.1244203,25.6421358 23.7665562,29 19.6244203,29 L19.6244203,29 Z" - id="high-five" - sketch:type="MSShapeGroup" - style="fill:#000000;stroke:#000000;stroke-opacity:1" /> - </g> - </g> -</svg> diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/icon-6-smiling-face.png b/bigbluebutton-client/branding/default/style/css/assets/images/icon-6-smiling-face.png deleted file mode 100644 index 860284020f261ccd08003396b182237b7699b10d..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/icon-6-smiling-face.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/icon-6-smiling-face.svg b/bigbluebutton-client/branding/default/style/css/assets/images/icon-6-smiling-face.svg deleted file mode 100644 index ed5064c6a86b3f2a84c2dc382410d75162a469fc..0000000000000000000000000000000000000000 --- a/bigbluebutton-client/branding/default/style/css/assets/images/icon-6-smiling-face.svg +++ /dev/null @@ -1,80 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:sketch="http://www.bohemiancoding.com/sketch/ns" - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="32px" - height="32px" - viewBox="0 0 32 32" - version="1.1" - id="svg2" - inkscape:version="0.48.4 r9939" - sodipodi:docname="icon-6-smiling-face.svg" - inkscape:export-filename="/var/lib/lxc/bbb-dev090-14/rootfs/home/ubuntu/dev/bigbluebutton/bigbluebutton-client/branding/default/style/css/assets/images/icon-6-smiling-face.png" - inkscape:export-xdpi="50" - inkscape:export-ydpi="50"> - <metadata - id="metadata15"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title>icon 6 smiling face</dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="753" - inkscape:window-height="480" - id="namedview13" - showgrid="false" - inkscape:zoom="7.375" - inkscape:cx="16" - inkscape:cy="16" - inkscape:window-x="75" - inkscape:window-y="34" - inkscape:window-maximized="0" - inkscape:current-layer="svg2" /> - <!-- Generator: Sketch 3.0.3 (7891) - http://www.bohemiancoding.com/sketch --> - <title - id="title4">icon 6 smiling face</title> - <desc - id="desc6">Created with Sketch.</desc> - <defs - id="defs8" /> - <g - id="Page-1" - stroke="none" - stroke-width="1" - fill="none" - fill-rule="evenodd" - sketch:type="MSPage" - style="fill:#000000;stroke:#000000;stroke-opacity:1"> - <g - id="icon-6-smiling-face" - sketch:type="MSArtboardGroup" - fill="#929292" - style="fill:#000000;stroke:#000000;stroke-opacity:1"> - <path - d="M16.5,29 C23.4035597,29 29,23.4035597 29,16.5 C29,9.59644029 23.4035597,4 16.5,4 C9.59644029,4 4,9.59644029 4,16.5 C4,23.4035597 9.59644029,29 16.5,29 L16.5,29 Z M16.5,28 C22.8512749,28 28,22.8512749 28,16.5 C28,10.1487251 22.8512749,5 16.5,5 C10.1487251,5 5,10.1487251 5,16.5 C5,22.8512749 10.1487251,28 16.5,28 L16.5,28 Z M12,14 C12.5522848,14 13,13.5522848 13,13 C13,12.4477152 12.5522848,12 12,12 C11.4477152,12 11,12.4477152 11,13 C11,13.5522848 11.4477152,14 12,14 L12,14 Z M21,14 C21.5522848,14 22,13.5522848 22,13 C22,12.4477152 21.5522848,12 21,12 C20.4477152,12 20,12.4477152 20,13 C20,13.5522848 20.4477152,14 21,14 L21,14 Z M16.4813232,22 C13,22 11,20 11,20 L11,21 C11,21 13,23 16.4813232,23 C19.9626465,23 22,21 22,21 L22,20 C22,20 19.9626465,22 16.4813232,22 L16.4813232,22 Z" - id="smiling-face" - sketch:type="MSShapeGroup" - style="fill:#000000;stroke:#000000;stroke-opacity:1" /> - </g> - </g> -</svg> diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/icon-6-thumb-up.png b/bigbluebutton-client/branding/default/style/css/assets/images/icon-6-thumb-up.png deleted file mode 100644 index 3f2b76b33d690d289e8e22f05d913393797e6fd7..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/icon-6-thumb-up.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/icon-6-thumb-up.svg b/bigbluebutton-client/branding/default/style/css/assets/images/icon-6-thumb-up.svg deleted file mode 100644 index 4610328cf75886c6daaffd48c061fd94020f3234..0000000000000000000000000000000000000000 --- a/bigbluebutton-client/branding/default/style/css/assets/images/icon-6-thumb-up.svg +++ /dev/null @@ -1,80 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:sketch="http://www.bohemiancoding.com/sketch/ns" - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="32px" - height="32px" - viewBox="0 0 32 32" - version="1.1" - id="svg2992" - inkscape:version="0.48.4 r9939" - sodipodi:docname="icon-6-thumb-up.svg" - inkscape:export-filename="/var/lib/lxc/bbb-dev090-14/rootfs/home/ubuntu/dev/bigbluebutton/bigbluebutton-client/branding/default/style/css/assets/images/icon-6-thumb-up.png" - inkscape:export-xdpi="50" - inkscape:export-ydpi="50"> - <metadata - id="metadata3005"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title>icon 6 thumb up</dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="753" - inkscape:window-height="480" - id="namedview3003" - showgrid="false" - inkscape:zoom="7.375" - inkscape:cx="16" - inkscape:cy="16" - inkscape:window-x="65" - inkscape:window-y="24" - inkscape:window-maximized="0" - inkscape:current-layer="svg2992" /> - <!-- Generator: Sketch 3.0.3 (7891) - http://www.bohemiancoding.com/sketch --> - <title - id="title2994">icon 6 thumb up</title> - <desc - id="desc2996">Created with Sketch.</desc> - <defs - id="defs2998" /> - <g - id="Page-1" - stroke="none" - stroke-width="1" - fill="none" - fill-rule="evenodd" - sketch:type="MSPage" - style="fill:#000000;stroke:#000000;stroke-opacity:1"> - <g - id="icon-6-thumb-up" - sketch:type="MSArtboardGroup" - fill="#929292" - style="fill:#000000;stroke:#000000;stroke-opacity:1"> - <path - d="M19.2488133,30 L23.5023733,30 C24.8817744,30 26,28.8903379 26,27.5 C26,26.9371936 25.8126296,26.417824 25.4978577,25.9999924 C26.8803322,25.9966522 28,24.8882411 28,23.5 C28,22.864214 27.763488,22.28386 27.3722702,21.8426992 L27.3722702,21.8426992 C28.3231922,21.4895043 29,20.5793268 29,19.5 C29,18.864214 28.763488,18.28386 28.3722702,17.8426992 C29.3231922,17.4895043 30,16.5793268 30,15.5 C30,14.1192881 28.8845825,13 27.4915915,13 L21.4997555,13 C22.5490723,7.9831543 22.0463867,1.99999928 18,2 C13.9536133,2.00000073 16.066359,6.78764706 14.5,9.76269531 C12.9337003,12.7376303 10.000223,12.9999801 10,13 L3.99508929,13 C2.8932319,13 2,13.8933973 2,14.9918842 L2,26.0081158 C2,27.1082031 2.88670635,28 3.99810135,28 L10,28 L16,30 L19.2488133,30 L19.2488133,30 Z M10.5,14 C10.5000014,13.9999997 13.8047349,13.276317 15.3710938,10.3012695 C16.9374527,7.32622128 15.1291504,3.00000043 18,3 C21.1514893,2.99999957 21.5007324,8.5 20.2999878,14 L20.2999878,14 L27.5069036,14 C28.3361142,14 29,14.6715729 29,15.5 C29,16.3342028 28.331518,17 27.5069036,17 L24,17 L24,18 L26.5069036,18 C27.3361142,18 28,18.6715729 28,19.5 C28,20.3342028 27.331518,21 26.5069036,21 L23,21 L23,21 L23,22 L25.5069036,22 C26.3361142,22 27,22.6715729 27,23.5 C27,24.3342028 26.331518,25 25.5069036,25 L22,25 L22,25 L22,26 L23.4983244,26 C24.3288106,26 25,26.6715729 25,27.5 C25,28.3342028 24.3276769,29 23.4983244,29 L19.7508378,29 L16,29 L10,27 L4.00292933,27 C3.43788135,27 3,26.5529553 3,26.0014977 L3,14.9985023 C3,14.4474894 3.44769743,14 3.9999602,14 L10.5,14 L10.5,14 L10.5,14 Z" - id="thumb-up" - sketch:type="MSShapeGroup" - style="fill:#000000;stroke:#000000;stroke-opacity:1" /> - </g> - </g> -</svg> diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/icon-7-sad-face.png b/bigbluebutton-client/branding/default/style/css/assets/images/icon-7-sad-face.png deleted file mode 100644 index 63a079cddb4ee5a7180f69be8ec6e91bc34ccf97..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/icon-7-sad-face.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/icon-7-sad-face.svg b/bigbluebutton-client/branding/default/style/css/assets/images/icon-7-sad-face.svg deleted file mode 100644 index 584001036e0f441e05f91c04880642ca3ac3e5a5..0000000000000000000000000000000000000000 --- a/bigbluebutton-client/branding/default/style/css/assets/images/icon-7-sad-face.svg +++ /dev/null @@ -1,80 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:sketch="http://www.bohemiancoding.com/sketch/ns" - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="32px" - height="32px" - viewBox="0 0 32 32" - version="1.1" - id="svg2992" - inkscape:version="0.48.4 r9939" - sodipodi:docname="icon-7-sad-face.svg" - inkscape:export-filename="/var/lib/lxc/bbb-dev090-14/rootfs/home/ubuntu/dev/bigbluebutton/bigbluebutton-client/branding/default/style/css/assets/images/icon-7-sad-face.png" - inkscape:export-xdpi="50" - inkscape:export-ydpi="50"> - <metadata - id="metadata3005"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title>icon 7 sad face</dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="753" - inkscape:window-height="480" - id="namedview3003" - showgrid="false" - inkscape:zoom="7.375" - inkscape:cx="16" - inkscape:cy="16" - inkscape:window-x="65" - inkscape:window-y="24" - inkscape:window-maximized="0" - inkscape:current-layer="svg2992" /> - <!-- Generator: Sketch 3.0.3 (7891) - http://www.bohemiancoding.com/sketch --> - <title - id="title2994">icon 7 sad face</title> - <desc - id="desc2996">Created with Sketch.</desc> - <defs - id="defs2998" /> - <g - id="Page-1" - stroke="none" - stroke-width="1" - fill="none" - fill-rule="evenodd" - sketch:type="MSPage" - style="fill:#000000;stroke:#000000;stroke-opacity:1"> - <g - id="icon-7-sad-face" - sketch:type="MSArtboardGroup" - fill="#929292" - style="fill:#000000;stroke:#000000;stroke-opacity:1"> - <path - d="M16.5,29 C23.4035597,29 29,23.4035597 29,16.5 C29,9.59644029 23.4035597,4 16.5,4 C9.59644029,4 4,9.59644029 4,16.5 C4,23.4035597 9.59644029,29 16.5,29 L16.5,29 Z M16.5,28 C22.8512749,28 28,22.8512749 28,16.5 C28,10.1487251 22.8512749,5 16.5,5 C10.1487251,5 5,10.1487251 5,16.5 C5,22.8512749 10.1487251,28 16.5,28 L16.5,28 Z M12,15 C12.5522848,15 13,14.5522848 13,14 C13,13.4477152 12.5522848,13 12,13 C11.4477152,13 11,13.4477152 11,14 C11,14.5522848 11.4477152,15 12,15 L12,15 Z M21,15 C21.5522848,15 22,14.5522848 22,14 C22,13.4477152 21.5522848,13 21,13 C20.4477152,13 20,13.4477152 20,14 C20,14.5522848 20.4477152,15 21,15 L21,15 Z M16.4813232,21 C13,21 11,23 11,23 L11,22 C11,22 13,20 16.4813232,20 C19.9626465,20 22,22 22,22 L22,23 C22,23 19.9626465,21 16.4813232,21 L16.4813232,21 Z" - id="sad-face" - sketch:type="MSShapeGroup" - style="fill:#000000;stroke:#000000;stroke-opacity:1" /> - </g> - </g> -</svg> diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/icon-7-thumb-down.png b/bigbluebutton-client/branding/default/style/css/assets/images/icon-7-thumb-down.png deleted file mode 100644 index e9b46550cad5ab24985d53da86c2f2cb88ca3653..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/icon-7-thumb-down.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/icon-7-thumb-down.svg b/bigbluebutton-client/branding/default/style/css/assets/images/icon-7-thumb-down.svg deleted file mode 100644 index 20a8802c2fa50ae14d980337dd1ff8e4ade52d98..0000000000000000000000000000000000000000 --- a/bigbluebutton-client/branding/default/style/css/assets/images/icon-7-thumb-down.svg +++ /dev/null @@ -1,80 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:sketch="http://www.bohemiancoding.com/sketch/ns" - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="32px" - height="32px" - viewBox="0 0 32 32" - version="1.1" - id="svg3007" - inkscape:version="0.48.4 r9939" - sodipodi:docname="icon-7-thumb-down.svg" - inkscape:export-filename="/var/lib/lxc/bbb-dev090-14/rootfs/home/ubuntu/dev/bigbluebutton/bigbluebutton-client/branding/default/style/css/assets/images/icon-7-thumb-down.png" - inkscape:export-xdpi="50" - inkscape:export-ydpi="50"> - <metadata - id="metadata3020"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title>icon 7 thumb down</dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="753" - inkscape:window-height="480" - id="namedview3018" - showgrid="false" - inkscape:zoom="7.375" - inkscape:cx="16" - inkscape:cy="16" - inkscape:window-x="65" - inkscape:window-y="24" - inkscape:window-maximized="0" - inkscape:current-layer="svg3007" /> - <!-- Generator: Sketch 3.0.3 (7891) - http://www.bohemiancoding.com/sketch --> - <title - id="title3009">icon 7 thumb down</title> - <desc - id="desc3011">Created with Sketch.</desc> - <defs - id="defs3013" /> - <g - id="Page-1" - stroke="none" - stroke-width="1" - fill="none" - fill-rule="evenodd" - sketch:type="MSPage" - style="fill:#000000;stroke:#000000;stroke-opacity:1"> - <g - id="icon-7-thumb-down" - sketch:type="MSArtboardGroup" - fill="#929292" - style="fill:#000000;stroke:#000000;stroke-opacity:1"> - <path - d="M19.2488133,2 L23.5023733,2 C24.8817744,2 26,3.10966206 26,4.5 C26,5.06280636 25.8126296,5.58217601 25.4978577,6.00000757 C26.8803322,6.00334775 28,7.11175892 28,8.5 C28,9.13578601 27.763488,9.71613998 27.3722702,10.1573008 L27.3722702,10.1573008 C28.3231922,10.5104957 29,11.4206732 29,12.5 C29,13.135786 28.763488,13.71614 28.3722702,14.1573008 C29.3231922,14.5104957 30,15.4206732 30,16.5 C30,17.8807119 28.8845825,19 27.4915915,19 L21.4997555,19 C22.5490723,24.0168457 22.0463867,30.0000007 18,30 C13.9536133,29.9999993 16.066359,25.2123529 14.5,22.2373047 C12.9337003,19.2623697 10.000223,19.0000199 10,19 L3.99508929,19 C2.8932319,19 2,18.1066027 2,17.0081158 L2,5.99188419 C2,4.89179693 2.88670635,4 3.99810135,4 L10,4 L16,2 L19.2488133,2 L19.2488133,2 Z M10.5,18 C10.5000014,18.0000003 13.8047349,18.723683 15.3710938,21.6987305 C16.9374527,24.6737787 15.1291504,28.9999996 18,29 C21.1514893,29.0000004 21.5007324,23.5 20.2999878,18 L20.2999878,18 L27.5069036,18 C28.3361142,18 29,17.3284271 29,16.5 C29,15.6657972 28.331518,15 27.5069036,15 L24,15 L24,14 L26.5069036,14 C27.3361142,14 28,13.3284271 28,12.5 C28,11.6657972 27.331518,11 26.5069036,11 L23,11 L23,11 L23,10 L25.5069036,10 C26.3361142,10 27,9.32842712 27,8.5 C27,7.66579723 26.331518,7 25.5069036,7 L22,7 L22,7 L22,6 L23.4983244,6 C24.3288106,6 25,5.32842712 25,4.5 C25,3.66579723 24.3276769,3 23.4983244,3 L19.7508378,3 L16,3 L10,5 L4.00292933,5 C3.43788135,5 3,5.44704472 3,5.99850233 L3,17.0014977 C3,17.5525106 3.44769743,18 3.9999602,18 L10.5,18 L10.5,18 L10.5,18 Z" - id="thumb-down" - sketch:type="MSShapeGroup" - style="fill:#000000;stroke:#000000;stroke-opacity:1" /> - </g> - </g> -</svg> diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/icons-license.txt b/bigbluebutton-client/branding/default/style/css/assets/images/icons-license.txt deleted file mode 100755 index 6d3c50ba645568a1c8c33a3436479b847e063d83..0000000000000000000000000000000000000000 --- a/bigbluebutton-client/branding/default/style/css/assets/images/icons-license.txt +++ /dev/null @@ -1,60 +0,0 @@ -Silk icon set 1.3 - -_________________________________________ -Mark James -http://www.famfamfam.com/lab/icons/silk/ -_________________________________________ - -This work is licensed under a -Creative Commons Attribution 2.5 License. -[ http://creativecommons.org/licenses/by/2.5/ ] - -This means you may use it for any purpose, -and make any changes you like. -All I ask is that you include a link back -to this page in your credits. - -Are you using this icon set? Send me an email -(including a link or picture if available) to -mjames@gmail.com - -Any other questions about this icon set please -contact mjames@gmail.com - -================================================== -Diagona Icons / Fugue Icons - -Copyright (C) 2007 Yusuke Kamiyamane. All rights reserved. -The icons are licensed under a Creative Commons Attribution -3.0 license. <http://creativecommons.org/licenses/by/3.0/> - -If you can't or don't want to provide a link back, please -purchase a royalty-free license. -<http://p.yusukekamiyamane.com/> - -I'm unavailable for custom icon design work. But your -suggestions are always welcome! -<mailto:p@yusukekamiyamane.com> -==================== -# Hawcons - -Created by *Yannick Lung*, 2014 -* [Web](http://www.hawcons.com) -* [Twitter](http://www.twitter.com/Hawcons) -* [Facebook](http://www.facebook.com/Hawcons) -* [Mail](mailto:support@hawcons.com) -* [Tumblr](http://hawcons.tumblr.com) -* [Google+](http://www.google.com/+) - -## Version 1.0 - -## LICENSE -You are free to use Hawcons for commercial and personal purposes without attribution, however a credit for the work would be appreciated. You may not sell or redistribute the icons themselves as icons. Do not claim creative credit. - -If you would like to support my work you can do this with the donate button on the website. - -If you have any additional questions please contact Hawcons via email or social networks. -==================== -Some of the client icons were generated using the following online tool: - -http://romannurik.github.io/AndroidAssetStudio/icons-launcher.html#foreground.type=clipart&foreground.space.trim=1&foreground.space.pad=0.15&foreground.clipart=res%2Fclipart%2Ficons%2Fnavigation_refresh.svg&foreColor=4b4b4b%2C0&crop=0&backgroundShape=none&backColor=ffffff%2C100&effects=none diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/jnlp-run-chrome.png b/bigbluebutton-client/branding/default/style/css/assets/images/jnlp-run-chrome.png deleted file mode 100644 index 33ab2ac4085fa3b40f79ee53a3207320cd006ba8..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/jnlp-run-chrome.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/left-arrow-disabled.png b/bigbluebutton-client/branding/default/style/css/assets/images/left-arrow-disabled.png deleted file mode 100755 index eac1976f2c69140b325248b9ccae0541a6096d98..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/left-arrow-disabled.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/left-arrow.png b/bigbluebutton-client/branding/default/style/css/assets/images/left-arrow.png deleted file mode 100755 index 0b61d9b507067f0e71d668107e68bcf106a7bead..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/left-arrow.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/line.png b/bigbluebutton-client/branding/default/style/css/assets/images/line.png deleted file mode 100755 index 175174a0ea5ebb32535ad19ccd0a86a319496bb9..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/line.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/logout.png b/bigbluebutton-client/branding/default/style/css/assets/images/logout.png deleted file mode 100755 index 6394917e14eea4a7269a50d4bc4e9eea7a25babd..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/logout.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/marker.png b/bigbluebutton-client/branding/default/style/css/assets/images/marker.png deleted file mode 100755 index 7a026099e3685ceb87505f5b1292f48b714da566..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/marker.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/multiuserwhiteboardoff.png b/bigbluebutton-client/branding/default/style/css/assets/images/multiuserwhiteboardoff.png deleted file mode 100755 index 2ac0240f544399b823b15e4abc6b260f166f223b..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/multiuserwhiteboardoff.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/multiuserwhiteboardon.png b/bigbluebutton-client/branding/default/style/css/assets/images/multiuserwhiteboardon.png deleted file mode 100755 index f5c75c1dc5ef6b9daaabf428d74793ff37f26a31..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/multiuserwhiteboardon.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/pencil.png b/bigbluebutton-client/branding/default/style/css/assets/images/pencil.png deleted file mode 100755 index dd979748baebc063f532af178489732ab0c4548f..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/pencil.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/play-blue.png b/bigbluebutton-client/branding/default/style/css/assets/images/play-blue.png deleted file mode 100755 index f8c8ec683edd6a974eacc253332f903d643dbe41..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/play-blue.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/poll_icon.png b/bigbluebutton-client/branding/default/style/css/assets/images/poll_icon.png deleted file mode 100755 index ce9fe648d6f2226fd81ebdc02dc202b368fa4f3b..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/poll_icon.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/questionmark.png b/bigbluebutton-client/branding/default/style/css/assets/images/questionmark.png deleted file mode 100755 index 6bdfb27e2ef8fb97fc4833d6a6b6454574be4559..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/questionmark.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/resizeHandler.png b/bigbluebutton-client/branding/default/style/css/assets/images/resizeHandler.png deleted file mode 100755 index ba6e42f956564de3b30408af07a5184474752214..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/resizeHandler.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/right-arrow-disabled.png b/bigbluebutton-client/branding/default/style/css/assets/images/right-arrow-disabled.png deleted file mode 100755 index 680f017472678eb615cd7663869780233dbe5dba..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/right-arrow-disabled.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/right-arrow.png b/bigbluebutton-client/branding/default/style/css/assets/images/right-arrow.png deleted file mode 100755 index 8e6e99648ad705ae23bfb428cdb7ab544fa0dd03..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/right-arrow.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/square.png b/bigbluebutton-client/branding/default/style/css/assets/images/square.png deleted file mode 100755 index 48b5280bdb794d3d5de562af781f3affeda59ffc..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/square.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/status_fail.png b/bigbluebutton-client/branding/default/style/css/assets/images/status_fail.png deleted file mode 100755 index f025bc6de3977fbc1419650ad14f50f08bc7a784..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/status_fail.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/status_refresh.png b/bigbluebutton-client/branding/default/style/css/assets/images/status_refresh.png deleted file mode 100644 index 77d6a8bd1290a8249584b98a788db87a5b9296d5..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/status_refresh.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/status_success.png b/bigbluebutton-client/branding/default/style/css/assets/images/status_success.png deleted file mode 100755 index 326d2666f8fa0096045b06b0f09e97743f90facb..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/status_success.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/status_warning.png b/bigbluebutton-client/branding/default/style/css/assets/images/status_warning.png deleted file mode 100755 index e7a5c5ed5cb5ebb669211dc4201c27ffe6562813..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/status_warning.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/status_warning_20.png b/bigbluebutton-client/branding/default/style/css/assets/images/status_warning_20.png deleted file mode 100755 index 1828db53023cf5fa65368ccbbd7fc402704f593b..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/status_warning_20.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/stop.png b/bigbluebutton-client/branding/default/style/css/assets/images/stop.png deleted file mode 100644 index 0cfd585963d255190b8855a7689e8da1c4d7cf6b..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/stop.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/strong_audio_status.png b/bigbluebutton-client/branding/default/style/css/assets/images/strong_audio_status.png deleted file mode 100644 index 5f7b11d30b0f4e8c3781facc0ab0ed51a0679692..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/strong_audio_status.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/text.png b/bigbluebutton-client/branding/default/style/css/assets/images/text.png deleted file mode 100755 index 21858b8ca4c28e93acb3eddd665860cf214d3bcf..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/text.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/trash.png b/bigbluebutton-client/branding/default/style/css/assets/images/trash.png deleted file mode 100755 index 8eed7077186c2f319604c077fdaf1b4841264acb..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/trash.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/triangle.png b/bigbluebutton-client/branding/default/style/css/assets/images/triangle.png deleted file mode 100755 index f629ee6aebb3c600c700ef3eb54cbf59917dd70b..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/triangle.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/undo.png b/bigbluebutton-client/branding/default/style/css/assets/images/undo.png deleted file mode 100755 index f65e9db3edf0cd4f2ee09b2a463e8436c19894d3..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/undo.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/upload.png b/bigbluebutton-client/branding/default/style/css/assets/images/upload.png deleted file mode 100755 index 344d18b8e79e317578e00ff54d68caf07bf9ca68..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/upload.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/weak_audio_status.png b/bigbluebutton-client/branding/default/style/css/assets/images/weak_audio_status.png deleted file mode 100644 index 4f482fd65075fed2502716c728765488b6a36dbb..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/weak_audio_status.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/webcam-eject-user.png b/bigbluebutton-client/branding/default/style/css/assets/images/webcam-eject-user.png deleted file mode 100755 index 561edc8d9b00d9c97c9acd82b4bf121bc3a77426..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/webcam-eject-user.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/webcam-muted.png b/bigbluebutton-client/branding/default/style/css/assets/images/webcam-muted.png deleted file mode 100755 index 3be5bd19cf8cf09beb6c7c7758b21b5deabab69b..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/webcam-muted.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/webcam-private-chat.png b/bigbluebutton-client/branding/default/style/css/assets/images/webcam-private-chat.png deleted file mode 100755 index 9fdff988a3cfa2f6ef81f0a2d0de135dd199371e..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/webcam-private-chat.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/webcam-switch-presenter.png b/bigbluebutton-client/branding/default/style/css/assets/images/webcam-switch-presenter.png deleted file mode 100755 index e7cfff5e97381b5a88d0b96b35508e52e850960e..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/webcam-switch-presenter.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/webcam-unmuted.png b/bigbluebutton-client/branding/default/style/css/assets/images/webcam-unmuted.png deleted file mode 100755 index 32a685732f0073772bb782662fe37e30a83d5220..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/webcam-unmuted.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/webcam.png b/bigbluebutton-client/branding/default/style/css/assets/images/webcam.png deleted file mode 100644 index af71c30610862c76f07e948d8c28433c7d338f9a..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/webcam.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/webcam_close.png b/bigbluebutton-client/branding/default/style/css/assets/images/webcam_close.png deleted file mode 100644 index 5265a7305e18196d51edcf9db18789c935bb9e9e..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/webcam_close.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/webcam_on.png b/bigbluebutton-client/branding/default/style/css/assets/images/webcam_on.png deleted file mode 100644 index 6c491aa4b5b75f6e3aeed6f3b75f04f74eff9143..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/branding/default/style/css/assets/images/webcam_on.png and /dev/null differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/swf/v2_skin.fla b/bigbluebutton-client/branding/default/style/css/assets/swf/v2_skin.fla new file mode 100644 index 0000000000000000000000000000000000000000..3c0ce618abd6b98f7d52b54d46919e0d0e63451c Binary files /dev/null and b/bigbluebutton-client/branding/default/style/css/assets/swf/v2_skin.fla differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/swf/v2_skin.swf b/bigbluebutton-client/branding/default/style/css/assets/swf/v2_skin.swf new file mode 100644 index 0000000000000000000000000000000000000000..ce651110cd584c517aed03c7f3a67a7cbb7e575d Binary files /dev/null and b/bigbluebutton-client/branding/default/style/css/assets/swf/v2_skin.swf differ diff --git a/bigbluebutton-client/branding/default/style/css/org/bigbluebutton/skins/ButtonSkin.as b/bigbluebutton-client/branding/default/style/css/org/bigbluebutton/skins/ButtonSkin.as new file mode 100644 index 0000000000000000000000000000000000000000..17869687a4fd46b750df112b26f0d5871aa91337 --- /dev/null +++ b/bigbluebutton-client/branding/default/style/css/org/bigbluebutton/skins/ButtonSkin.as @@ -0,0 +1,198 @@ +/** + * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ + * + * Copyright (c) 2017 BigBlueButton Inc. and by respective authors (see below). + * + * This program is free software; you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License as published by the Free Software + * Foundation; either version 3.0 of the License, or (at your option) any later + * version. + * + * BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License along + * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. + * + */ +package org.bigbluebutton.skins { + import mx.core.UIComponent; + import mx.skins.Border; + + public class ButtonSkin extends Border { + + //-------------------------------------------------------------------------- + // + // Constructor + // + //-------------------------------------------------------------------------- + + /** + * Constructor. + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ + public function ButtonSkin() { + super(); + } + + //-------------------------------------------------------------------------- + // + // Overridden properties + // + //-------------------------------------------------------------------------- + + //---------------------------------- + // measuredWidth + //---------------------------------- + + /** + * @private + */ + override public function get measuredWidth():Number { + return UIComponent.DEFAULT_MEASURED_MIN_WIDTH; + } + + //---------------------------------- + // measuredHeight + //---------------------------------- + + /** + * @private + */ + override public function get measuredHeight():Number { + return UIComponent.DEFAULT_MEASURED_MIN_HEIGHT; + } + + //-------------------------------------------------------------------------- + // + // Overridden methods + // + //-------------------------------------------------------------------------- + + /** + * @private + */ + override protected function updateDisplayList(w:Number, h:Number):void { + super.updateDisplayList(w, h); + + // User-defined styles. + var cornerRadius:Number = getStyle("cornerRadius"); + + // Normal state + var borderColorUp:uint = getStyle("borderColorUp"); + var borderColorOver:uint = getStyle("borderColorOver"); + var borderColorDown:uint = getStyle("borderColorDown"); + var borderColorDisabled:uint = getStyle("borderColorDisabled"); + + var borderAlphaUp:uint = getStyle("borderAlphaUp"); + var borderAlphaOver:uint = getStyle("borderAlphaOver"); + var borderAlphaDown:uint = getStyle("borderAlphaDown"); + var borderAlphaDisabled:uint = getStyle("borderAlphaDisabled"); + + var borderThickness:uint = getStyle("borderThickness"); + + var fillColorUp:uint = getStyle("fillColorUp"); + var fillColorOver:uint = getStyle("fillColorOver"); + var fillColorDown:uint = getStyle("fillColorDown"); + var fillColorDisabled:uint = getStyle("fillColorDisabled"); + + // Selected state + var borderColorSelectedUp:uint = getStyle("borderColorSelectedUp"); + var borderColorSelectedOver:uint = getStyle("borderColorSelectedOver"); + var borderColorSelectedDown:uint = getStyle("borderColorSelectedDown"); + var borderColorSelectedDisabled:uint = getStyle("borderColorSelectedDisabled"); + + var fillColorSelectedUp:uint = getStyle("fillColorSelectedUp"); + var fillColorSelectedOver:uint = getStyle("fillColorSelectedOver"); + var fillColorSelectedDown:uint = getStyle("fillColorSelectedDown"); + var fillColorSelectedDisabled:uint = getStyle("fillColorSelectedDisabled"); + + // Corner radius + var cr:Number = Math.max(0, cornerRadius); + var cr1:Number = Math.max(0, cornerRadius - borderThickness); + + graphics.clear(); + + switch (name) { + case "selectedUpSkin": { + // button border/edge + drawRoundRect(0, 0, w, h, cr, borderColorSelectedUp, 1); + + // button fill + drawRoundRect(1, 1, w - 2, h - 2, cr1, fillColorSelectedUp, 1); + break; + } + + case "selectedOverSkin": { + // button border/edge + drawRoundRect(0, 0, w, h, cr, borderColorSelectedOver, 1); + + // button fill + drawRoundRect(1, 1, w - 2, h - 2, cr1, fillColorSelectedOver, 1); + break; + } + + case "selectedDownSkin": { + // button border/edge + drawRoundRect(0, 0, w, h, cr, borderColorSelectedDown, 1); + + // button fill + drawRoundRect(1, 1, w - 2, h - 2, cr1, fillColorSelectedDown, 1); + break; + } + + case "selectedDisabledSkin": { + // button border/edge + drawRoundRect(0, 0, w, h, cr, borderColorSelectedDisabled, 1); + + // button fill + drawRoundRect(1, 1, w - 2, h - 2, cr1, fillColorSelectedDisabled, 1); + break; + } + + case "upSkin": { + // button border/edge + drawRoundRect(0, 0, w, h, cr, borderColorUp, borderAlphaUp); + + // button fill + drawRoundRect(borderThickness, borderThickness, w - (borderThickness * 2), h - (borderThickness * 2), cr1, fillColorUp, 1); + break; + } + + case "overSkin": { + // button border/edge + drawRoundRect(0, 0, w, h, cr, borderColorOver, borderAlphaOver); + + // button fill + drawRoundRect(borderThickness, borderThickness, w - (borderThickness * 2), h - (borderThickness * 2), cr1, fillColorOver, 1); + break; + } + + case "downSkin": { + // button border/edge + drawRoundRect(0, 0, w, h, cr, borderColorDown, borderAlphaDown); + + // button fill + drawRoundRect(borderThickness, borderThickness, w - (borderThickness * 2), h - (borderThickness * 2), cr1, fillColorDown, 1); + break; + } + + + case "disabledSkin": { + // button border/edge + drawRoundRect(0, 0, w, h, cr, borderColorDisabled, borderAlphaDisabled); + + // button fill + drawRoundRect(borderThickness, borderThickness, w - (borderThickness * 2), h - (borderThickness * 2), cr1, fillColorDisabled, 1); + break; + } + + } + } + } +} diff --git a/bigbluebutton-client/branding/default/style/css/org/bigbluebutton/skins/ComboBoxSkin.as b/bigbluebutton-client/branding/default/style/css/org/bigbluebutton/skins/ComboBoxSkin.as new file mode 100644 index 0000000000000000000000000000000000000000..60cc05bffc9cc7cedf4c600bfd13ccce794c50ec --- /dev/null +++ b/bigbluebutton-client/branding/default/style/css/org/bigbluebutton/skins/ComboBoxSkin.as @@ -0,0 +1,191 @@ +/** + * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ + * + * Copyright (c) 2017 BigBlueButton Inc. and by respective authors (see below). + * + * This program is free software; you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License as published by the Free Software + * Foundation; either version 3.0 of the License, or (at your option) any later + * version. + * + * BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License along + * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. + * + */ +package org.bigbluebutton.skins { + import flash.display.Graphics; + + import mx.core.UIComponent; + import mx.skins.Border; + + public class ComboBoxSkin extends Border { + + //-------------------------------------------------------------------------- + // + // Overridden properties + // + //-------------------------------------------------------------------------- + + //---------------------------------- + // measuredWidth + //---------------------------------- + + /** + * @private + */ + override public function get measuredWidth():Number { + return UIComponent.DEFAULT_MEASURED_MIN_WIDTH; + } + + //---------------------------------- + // measuredHeight + //---------------------------------- + + /** + * @private + */ + override public function get measuredHeight():Number { + return UIComponent.DEFAULT_MEASURED_MIN_HEIGHT; + } + + //-------------------------------------------------------------------------- + // + // Overridden methods + // + //-------------------------------------------------------------------------- + + /** + * @private + */ + override protected function updateDisplayList(w:Number, h:Number):void { + super.updateDisplayList(w, h); + + // User-defined styles. + var arrowColor:uint = getStyle("iconColor"); + var arrowAlpha:Number = 1; + + var borderColorUp:uint = getStyle("borderColorUp"); + var borderColorOver:uint = getStyle("borderColorOver"); + var borderColorDown:uint = getStyle("borderColorDown"); + var borderColorDisabled:uint = getStyle("borderColorDisabled"); + + var borderThickness:uint = getStyle("borderThickness"); + + var fillColorUp:uint = getStyle("fillColorUp"); + var fillColorOver:uint = getStyle("fillColorOver"); + var fillColorDown:uint = getStyle("fillColorDown"); + var fillColorDisabled:uint = getStyle("fillColorDisabled"); + + var cornerRadius:Number = getStyle("cornerRadius"); + var dropdownBorderColor:Number = getStyle("dropdownBorderColor"); + + // The dropdownBorderColor is currently only used + // when displaying an error state. + if (!isNaN(dropdownBorderColor)) + borderColorUp = dropdownBorderColor; + + var cornerRadius1:Number = Math.max(cornerRadius - 1, 0); + var cr:Object = {tl: 0, tr: cornerRadius, bl: 0, br: cornerRadius}; + var cr1:Object = {tl: 0, tr: cornerRadius - borderThickness, bl: 0, br: cornerRadius - borderThickness}; + + var arrowOnly:Boolean = true; + + // If our name doesn't include "editable", we are drawing the non-edit + // skin which spans the entire control + if (name.indexOf("editable") < 0) { + arrowOnly = false; + cr.tl = cr.bl = cornerRadius; + cr1.tl = cr1.bl = cornerRadius1; + } + + var g:Graphics = graphics; + + g.clear(); + + // Draw the border and fill. + switch (name) { + case "upSkin": + case "editableUpSkin": { + // border + drawRoundRect(0, 0, w, h, cr, borderColorUp, 1); + + // button fill + drawRoundRect(borderThickness, borderThickness, w - (borderThickness * 2), h - (borderThickness * 2), cr1, fillColorUp, 1); + + if (!arrowOnly) { + // line + drawRoundRect(w - 22, 4, 1, h - 8, 0, borderColorUp, 1); + drawRoundRect(w - 21, 4, 1, h - 8, 0, 0xFFFFFF, 0.2); + } + + break; + } + + case "overSkin": + case "editableOverSkin": { + // border + drawRoundRect(0, 0, w, h, cr, borderColorOver, 1); + + // button fill + drawRoundRect(borderThickness, borderThickness, w - (borderThickness * 2), h - (borderThickness * 2), cr1, fillColorOver, 1); + + if (!arrowOnly) { + // line + drawRoundRect(w - 22, 4, 1, h - 8, 0, borderColorOver, 1); + drawRoundRect(w - 21, 4, 1, h - 8, 0, 0xFFFFFF, 0.2); + } + + break; + } + + case "downSkin": + case "editableDownSkin": { + // border + drawRoundRect(0, 0, w, h, cr, borderColorDown, 1); + + // button fill + drawRoundRect(borderThickness, borderThickness, w - (borderThickness * 2), h - (borderThickness * 2), cr1, fillColorDown, 1); + + if (!arrowOnly) { + // line + drawRoundRect(w - 22, 4, 1, h - 8, 0, fillColorDown, 1); + drawRoundRect(w - 21, 4, 1, h - 8, 0, 0xFFFFFF, 0.2); + } + + break; + } + + case "disabledSkin": + case "editableDisabledSkin": { + // border + drawRoundRect(0, 0, w, h, cr, borderColorDisabled, 1); + + // button fill + drawRoundRect(borderThickness, borderThickness, w - (borderThickness * 2), h - (borderThickness * 2), cr1, fillColorDisabled, 1); + + if (!arrowOnly) { + // line + drawRoundRect(w - 22, 4, 1, h - 8, 0, 0x999999, 0.5); + } + + arrowColor = getStyle("disabledIconColor"); + arrowAlpha = 0.45; + + break; + } + } + + // Draw the triangle. + g.beginFill(arrowColor, arrowAlpha); + g.moveTo(w - 10, h / 2 + 1.9); + g.lineTo(w - 13, h / 2 - 2); + g.lineTo(w - 7, h / 2 - 2); + g.lineTo(w - 10, h / 2 + 1.9); + g.endFill(); + } + } +} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/GetBreakoutRoomsListPayload.java b/bigbluebutton-client/branding/default/style/css/org/bigbluebutton/skins/DataGridVerticalSeparatorSkin.as similarity index 63% rename from bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/GetBreakoutRoomsListPayload.java rename to bigbluebutton-client/branding/default/style/css/org/bigbluebutton/skins/DataGridVerticalSeparatorSkin.as index 7d9c6471032a5588534525cfec026b8398a9e191..20c579d025e21693cd247288ff1ea2b94674f86d 100644 --- a/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/GetBreakoutRoomsListPayload.java +++ b/bigbluebutton-client/branding/default/style/css/org/bigbluebutton/skins/DataGridVerticalSeparatorSkin.as @@ -1,28 +1,33 @@ -/** - * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ - * - * Copyright (c) 2016 BigBlueButton Inc. and by respective authors (see below). - * - * This program is free software; you can redistribute it and/or modify it under the - * terms of the GNU Lesser General Public License as published by the Free Software - * Foundation; either version 3.0 of the License, or (at your option) any later - * version. - * - * BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along - * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. - * - */ -package org.bigbluebutton.messages.payload; - -public class GetBreakoutRoomsListPayload { - - public final String meetingId; - - public GetBreakoutRoomsListPayload(String meetingId) { - this.meetingId = meetingId; - } -} +/** + * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ + * + * Copyright (c) 2017 BigBlueButton Inc. and by respective authors (see below). + * + * This program is free software; you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License as published by the Free Software + * Foundation; either version 3.0 of the License, or (at your option) any later + * version. + * + * BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License along + * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. + * + */ +package org.bigbluebutton.skins { + import mx.skins.Border; + + public class DataGridVerticalSeparatorSkin extends Border { + override protected function updateDisplayList(w:Number, h:Number):void { + super.updateDisplayList(w, h); + + var borderColor:uint = getStyle("borderColor"); + + graphics.clear(); + + drawRoundRect(0, 0, w, h, 0, borderColor, 1); + } + } +} diff --git a/bigbluebutton-client/branding/default/style/css/org/bigbluebutton/skins/PanelSkin.as b/bigbluebutton-client/branding/default/style/css/org/bigbluebutton/skins/PanelSkin.as new file mode 100644 index 0000000000000000000000000000000000000000..757f255bc31bde7c3994f495cf99ebda3468b263 --- /dev/null +++ b/bigbluebutton-client/branding/default/style/css/org/bigbluebutton/skins/PanelSkin.as @@ -0,0 +1,105 @@ +/** + * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ + * + * Copyright (c) 2017 BigBlueButton Inc. and by respective authors (see below). + * + * This program is free software; you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License as published by the Free Software + * Foundation; either version 3.0 of the License, or (at your option) any later + * version. + * + * BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License along + * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. + * + */ + +//////////////////////////////////////////////////////////////////////////////// +// +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//////////////////////////////////////////////////////////////////////////////// + +package org.bigbluebutton.skins { + import flash.display.Graphics; + import flash.utils.describeType; + import flash.utils.getQualifiedClassName; + + import mx.core.mx_internal; + import mx.skins.halo.PanelSkin; + + use namespace mx_internal; + + public class PanelSkin extends mx.skins.halo.PanelSkin { + + /** + * We don't use 'is' to prevent dependency issues + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ + private static var panels:Object = {}; + + private static function isPanel(parent:Object):Boolean { + var s:String = getQualifiedClassName(parent); + if (panels[s] == 1) + return true; + + if (panels[s] == 0) + return false; + + if (s == "mx.containers::Panel") { + panels[s] == 1; + return true; + } + + var x:XML = describeType(parent); + var xmllist:XMLList = x.extendsClass.(@type == "mx.containers::Panel"); + if (xmllist.length() == 0) { + panels[s] = 0; + return false; + } + + panels[s] = 1; + return true; + } + + override mx_internal function drawBackground(w:Number, h:Number):void { + super.drawBackground(w, h); + + if (getStyle("showHeaderSeparator") == true) { + var g:Graphics = graphics; + + var hasPanelParent:Boolean = isPanel(parent); + var hHeight:Number = hasPanelParent ? Object(parent).getHeaderHeightProxy() : NaN; + + // Fill in the content area + g.beginFill(Number(backgroundColor), 1); + + g.lineStyle(1, getStyle("borderColor"), 1); + g.moveTo(1, hHeight); + g.lineTo(w - 1, hHeight); + g.endFill(); + } + } + + } +} diff --git a/bigbluebutton-client/branding/default/style/css/org/bigbluebutton/skins/PopUpButtonSkin.as b/bigbluebutton-client/branding/default/style/css/org/bigbluebutton/skins/PopUpButtonSkin.as new file mode 100644 index 0000000000000000000000000000000000000000..38c590e3155b89ea0d806d4df87f829778868c74 --- /dev/null +++ b/bigbluebutton-client/branding/default/style/css/org/bigbluebutton/skins/PopUpButtonSkin.as @@ -0,0 +1,268 @@ +/** + * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ + * + * Copyright (c) 2017 BigBlueButton Inc. and by respective authors (see below). + * + * This program is free software; you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License as published by the Free Software + * Foundation; either version 3.0 of the License, or (at your option) any later + * version. + * + * BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License along + * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. + * + */ + +//////////////////////////////////////////////////////////////////////////////// +// +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//////////////////////////////////////////////////////////////////////////////// + +package org.bigbluebutton.skins { + import flash.display.DisplayObject; + + import mx.core.IFlexDisplayObject; + import mx.core.IProgrammaticSkin; + import mx.core.UIComponent; + import mx.core.mx_internal; + import mx.skins.halo.PopUpIcon; + + use namespace mx_internal; + + public class PopUpButtonSkin extends UIComponent implements IProgrammaticSkin { + + //-------------------------------------------------------------------------- + // + // Constructor + // + //-------------------------------------------------------------------------- + + /** + * Constructor. + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ + public function PopUpButtonSkin() { + super(); + + mouseEnabled = false; + } + + //-------------------------------------------------------------------------- + // + // Overridden properties + // + //-------------------------------------------------------------------------- + + + //---------------------------------- + // measuredWidth + //---------------------------------- + + /** + * @private + */ + override public function get measuredWidth():Number { + return DEFAULT_MEASURED_MIN_WIDTH; + } + + //---------------------------------- + // measuredHeight + //---------------------------------- + + /** + * @private + */ + override public function get measuredHeight():Number { + return DEFAULT_MEASURED_MIN_HEIGHT; + } + + //-------------------------------------------------------------------------- + // + // Overridden methods + // + //-------------------------------------------------------------------------- + + /** + * @private + */ + override protected function updateDisplayList(w:Number, h:Number):void { + super.updateDisplayList(w, h); + + var borderColorUp:uint = getStyle("borderColorUp"); + var borderColorOver:uint = getStyle("borderColorOver"); + var borderColorDown:uint = getStyle("borderColorDown"); + var borderColorDisabled:uint = getStyle("borderColorDisabled"); + + var borderThickness:uint = getStyle("borderThickness"); + + var fillColorUp:uint = getStyle("fillColorUp"); + var fillColorOver:uint = getStyle("fillColorOver"); + var fillColorDown:uint = getStyle("fillColorDown"); + var fillColorDisabled:uint = getStyle("fillColorDisabled"); + + // User-defined styles. + var arrowColor:uint = getStyle("iconColor"); + var arrowColorOver:uint = getStyle("iconColorOver"); + var arrowColorDown:uint = getStyle("iconColorDown"); + + var cornerRadius:Number = getStyle("cornerRadius"); + + var popUpIcon:IFlexDisplayObject = IFlexDisplayObject(getChildByName("popUpIcon")); + + if (!popUpIcon) { + var popUpIconClass:Class = Class(getStyle("popUpIcon")); + popUpIcon = new popUpIconClass(); + DisplayObject(popUpIcon).name = "popUpIcon"; + addChild(DisplayObject(popUpIcon)); + DisplayObject(popUpIcon).visible = true; + } + + var arrowButtonWidth:Number = Math.max(getStyle("arrowButtonWidth"), popUpIcon.width + 3 + borderThickness); + + var dividerPosX:Number = w - arrowButtonWidth; + + popUpIcon.move(w - (arrowButtonWidth + popUpIcon.width) / 2, (h - popUpIcon.height) / 2); + + // Corner radius + var cr:Number = Math.max(0, cornerRadius); + var cr1:Number = Math.max(0, cornerRadius - borderThickness); + + graphics.clear(); + + switch (name) { + case "upSkin": { + // button border/edge + drawRoundRect(0, 0, w, h, cr, borderColorUp, 1); + + // button fill + drawRoundRect(borderThickness, borderThickness, w - (borderThickness * 2), h - (borderThickness * 2), cr1, fillColorUp, 1); + + // Separator + drawRoundRect(dividerPosX, borderThickness, borderThickness, h - (borderThickness * 2), cr, borderColorUp, 1); + + break; + } + case "overSkin": // for hover on the main button (left) side + { + // button border/edge + drawRoundRect(0, 0, w, h, cr, borderColorUp, 1); + + drawRoundRect(dividerPosX, borderThickness, borderThickness, h - (borderThickness * 2), 0, borderColorOver, 1); + + // button fill + drawRoundRect(borderThickness, borderThickness, w - (borderThickness * 2), h - (borderThickness * 2), cr1, fillColorUp, 1); + + // left/main button fill + drawRoundRect(borderThickness, borderThickness, w - arrowButtonWidth - (borderThickness * 2), h - (borderThickness * 2), getRadius(cr1, true), fillColorOver, 1); + + break; + } + + case "popUpOverSkin": // for hover on the arrow-button (right) side + { + arrowColor = arrowColorOver; + + // button border/edge + drawRoundRect(0, 0, w, h, cr, borderColorUp, 1); + + drawRoundRect(dividerPosX, borderThickness, borderThickness, h - (borderThickness * 2), 0, borderColorOver, 1); + + // button fill + drawRoundRect(borderThickness, borderThickness, w - (borderThickness * 2), h - (borderThickness * 2), getRadius(cr1, true), fillColorUp, 1); + + // right button fill + drawRoundRect(dividerPosX + borderThickness, borderThickness, arrowButtonWidth - (borderThickness * 2), h - (borderThickness * 2), getRadius(cr1, false), fillColorOver, 1); + + break; + } + + case "downSkin": // for press on the main button (left) side + { + // button border/ddge + drawRoundRect(0, 0, w, h, cr, borderColorDown, 1); + + drawRoundRect(dividerPosX, borderThickness, borderThickness, h - (borderThickness * 2), 0, borderColorUp, 1); + + // button fill + drawRoundRect(borderThickness, borderThickness, w - (borderThickness * 2), h - (borderThickness * 2), cr1, fillColorUp, 1); + + // left/main button fill + drawRoundRect(borderThickness, borderThickness, w - arrowButtonWidth - (borderThickness * 2), h - (borderThickness * 2), getRadius(cr1, true), fillColorDown, 1); + + break; + } + + case "popUpDownSkin": // for press on the arrow-button (right) side + { + arrowColor = arrowColorDown; + + // button border/edge + drawRoundRect(0, 0, w, h, cr, borderColorUp, 1); + + drawRoundRect(dividerPosX, borderThickness, borderThickness, h - (borderThickness * 2), 0, fillColorDown, 1); + + // button fill + drawRoundRect(borderThickness, borderThickness, w - (borderThickness * 2), h - (borderThickness * 2), cr1, fillColorUp, 1); + + // right button fill + drawRoundRect(dividerPosX + borderThickness, borderThickness, arrowButtonWidth - (borderThickness * 2), h - (borderThickness * 2), getRadius(cr1, false), fillColorDown, 1); + + break; + } + + case "disabledSkin": { + arrowColor = getStyle("disabledIconColor"); + + // outer edge + drawRoundRect(0, 0, w, h, cornerRadius, fillColorDisabled, 1); + + drawRoundRect(dividerPosX, borderThickness, borderThickness, h - (borderThickness * 2), 0, borderColorDisabled, 1); + + // button fill + drawRoundRect(borderThickness, borderThickness, w - (borderThickness * 2), h - (borderThickness * 2), cr1, fillColorDisabled, 1); + + break; + } + + } + + if (popUpIcon is PopUpIcon) + PopUpIcon(popUpIcon).arrowColor = arrowColor; + } + + //-------------------------------------------------------------------------- + // + // Methods + // + //-------------------------------------------------------------------------- + + /** + * @private + */ + private function getRadius(r:Number, left:Boolean):Object { + return left ? {br: 0, bl: r, tr: 0, tl: r} : {br: r, bl: 0, tr: r, tl: 0}; + } + } +} diff --git a/bigbluebutton-client/branding/default/style/css/org/bigbluebutton/skins/ProgressBarSkin.as b/bigbluebutton-client/branding/default/style/css/org/bigbluebutton/skins/ProgressBarSkin.as new file mode 100644 index 0000000000000000000000000000000000000000..c7e72d4bdef24a08fa3415cbb2fecc8605fc82f7 --- /dev/null +++ b/bigbluebutton-client/branding/default/style/css/org/bigbluebutton/skins/ProgressBarSkin.as @@ -0,0 +1,74 @@ +/** + * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ + * + * Copyright (c) 2017 BigBlueButton Inc. and by respective authors (see below). + * + * This program is free software; you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License as published by the Free Software + * Foundation; either version 3.0 of the License, or (at your option) any later + * version. + * + * BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License along + * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. + * + */ +package org.bigbluebutton.skins { + import mx.skins.halo.ProgressBarSkin; + + public class ProgressBarSkin extends mx.skins.halo.ProgressBarSkin { + + //-------------------------------------------------------------------------- + // + // Overridden properties + // + //-------------------------------------------------------------------------- + + //---------------------------------- + // measuredWidth + //---------------------------------- + + /** + * @private + */ + override public function get measuredWidth():Number { + return 280; + } + + //---------------------------------- + // measuredHeight + //---------------------------------- + + /** + * @private + */ + override public function get measuredHeight():Number { + return 15; + } + + //-------------------------------------------------------------------------- + // + // Overridden methods + // + //-------------------------------------------------------------------------- + + /** + * @private + */ + override protected function updateDisplayList(w:Number, h:Number):void { + super.updateDisplayList(w, h); + + // User-defined styles + var barColorStyle:* = getStyle("barColor"); + var barColor:uint = styleManager.isValidStyleValue(barColorStyle) ? barColorStyle : getStyle("themeColor"); + + graphics.clear(); + + // fill + drawRoundRect(1, 1, w - 2, h - 2, 7.5, barColor, 1); + } + } +} diff --git a/bigbluebutton-client/branding/default/style/css/org/bigbluebutton/skins/ProgressTrackSkin.as b/bigbluebutton-client/branding/default/style/css/org/bigbluebutton/skins/ProgressTrackSkin.as new file mode 100644 index 0000000000000000000000000000000000000000..215ed1f64bd2984958ff761dc858af911b0aa9a2 --- /dev/null +++ b/bigbluebutton-client/branding/default/style/css/org/bigbluebutton/skins/ProgressTrackSkin.as @@ -0,0 +1,77 @@ +/** + * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ + * + * Copyright (c) 2017 BigBlueButton Inc. and by respective authors (see below). + * + * This program is free software; you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License as published by the Free Software + * Foundation; either version 3.0 of the License, or (at your option) any later + * version. + * + * BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License along + * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. + * + */ +package org.bigbluebutton.skins { + import mx.skins.halo.ProgressTrackSkin; + + public class ProgressTrackSkin extends mx.skins.halo.ProgressTrackSkin { + //-------------------------------------------------------------------------- + // + // Overridden properties + // + //-------------------------------------------------------------------------- + + //---------------------------------- + // measuredWidth + //---------------------------------- + + /** + * @private + */ + override public function get measuredWidth():Number { + return 280; + } + + //---------------------------------- + // measuredHeight + //---------------------------------- + + /** + * @private + */ + override public function get measuredHeight():Number { + return 15; + } + + //-------------------------------------------------------------------------- + // + // Overridden methods + // + //-------------------------------------------------------------------------- + + /** + * @private + */ + override protected function updateDisplayList(w:Number, h:Number):void { + super.updateDisplayList(w, h); + + // User-defined styles + var borderColor:uint = getStyle("borderColor"); + var fillColors:Array = getStyle("trackColors") as Array; + styleManager.getColorNames(fillColors); + + graphics.clear(); + + // border + drawRoundRect(0, 0, w, h, 7.5, borderColor, 1); + + // background + drawRoundRect(1, 1, w - 2, h - 2, 7.5, fillColors, 1); + } + } +} diff --git a/bigbluebutton-client/branding/default/style/css/org/bigbluebutton/skins/ToolTipSkin.as b/bigbluebutton-client/branding/default/style/css/org/bigbluebutton/skins/ToolTipSkin.as index 9f7743e4e741d53e8cf81b61c5f7c25fc6ced47c..30b077dfa00af12ff894f69530c88f9c9c52356b 100755 --- a/bigbluebutton-client/branding/default/style/css/org/bigbluebutton/skins/ToolTipSkin.as +++ b/bigbluebutton-client/branding/default/style/css/org/bigbluebutton/skins/ToolTipSkin.as @@ -1,13 +1,13 @@ /** * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ - * + * * Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below). * * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free Software * Foundation; either version 3.0 of the License, or (at your option) any later * version. - * + * * BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. @@ -19,290 +19,261 @@ // Most of the source is adapted from the ToolTipBorder class and the functionality is replicated here for performance reasons -package org.bigbluebutton.skins -{ - import flash.display.Graphics; - import flash.events.Event; - import flash.geom.Point; - import mx.core.EdgeMetrics; - import flash.filters.DropShadowFilter; - import mx.graphics.RectangularDropShadow; - import mx.managers.ToolTipManager; - import mx.skins.RectangularBorder; - - public class ToolTipSkin extends RectangularBorder - { - private static const LOG : String = "ToolTipSkin - "; - - private static const TOP : String = "top"; - private static const BOTTOM : String = "bottom"; - - private var _arrowPosition : String = TOP; - - public function ToolTipSkin() { - super(); - visible = false; - addEventListener(Event.ENTER_FRAME, this.enterFrameHandler); - } - - //-------------------------------------------------------------------------- - // - // Overridden properties - // - //-------------------------------------------------------------------------- - - //---------------------------------- - // borderMetrics - //---------------------------------- - - /** - * @private - * Storage for the borderMetrics property. - */ - private var _borderMetrics:EdgeMetrics; - - /** - * @private - */ - override public function get borderMetrics():EdgeMetrics - { - if (_borderMetrics) - return _borderMetrics; - - var borderStyle:String = getStyle("borderStyle"); - switch (borderStyle) - { - case "errorTipRight": - { - _borderMetrics = new EdgeMetrics(15, 1, 3, 3); - break; - } - - case "errorTipAbove": - { - _borderMetrics = new EdgeMetrics(3, 1, 3, 15); - break; - } - - case "errorTipBelow": - { - _borderMetrics = new EdgeMetrics(3, 13, 3, 3); - break; - } - - default: // "toolTip" - { - _borderMetrics = new EdgeMetrics(3, 1, 3, 3); - break; - } - } - - return _borderMetrics; - } - - //-------------------------------------------------------------------------- - // - // Overridden methods - // - //-------------------------------------------------------------------------- - - /** - * @private - * If borderStyle may have changed, clear the cached border metrics. - */ - override public function styleChanged(styleProp:String):void - { - super.styleChanged(styleProp); - - if (styleProp == "borderStyle" || - styleProp == "styleName" || - styleProp == null) - { - _borderMetrics = null; - - var borderStyle:String = getStyle("borderStyle"); - switch (borderStyle) - { - case "errorTipRight": - case "errorTipAbove": - case "errorTipBelow": - { - visible = true; - break; - } - } - } - } - - /** - * @private - * Draw the background and border. - */ - override protected function updateDisplayList(w:Number, h:Number):void - { - super.updateDisplayList(w, h); - - var borderStyle:String = getStyle("borderStyle"); - var backgroundColor:uint = getStyle("backgroundColor"); - var backgroundAlpha:Number= getStyle("backgroundAlpha"); - var borderColor:uint = getStyle("borderColor"); - var cornerRadius:Number = getStyle("cornerRadius"); - - var g:Graphics = graphics; - g.clear(); - - filters = []; - - switch (borderStyle) - { - case "none": - { - // Don't draw anything - break; - } - case "errorTipRight": - { - // border - drawRoundRect( - 11, 0, w - 11, h - 2, 3, - borderColor, backgroundAlpha); - - // left pointer - g.beginFill(borderColor, backgroundAlpha); - g.moveTo(11, 7); - g.lineTo(0, 13); - g.lineTo(11, 19); - g.moveTo(11, 7); - g.endFill(); - - filters = [ new DropShadowFilter(2, 90, 0, 0.4) ]; - break; - } - - case "errorTipAbove": - { - // border - drawRoundRect( - 0, 0, w, h - 13, 3, - borderColor, backgroundAlpha); - - // bottom pointer - g.beginFill(borderColor, backgroundAlpha); - g.moveTo(w/2-6, h - 13); - g.lineTo(w/2, h - 2); - g.lineTo(w/2+6, h - 13); - g.moveTo(w/2-6, h - 13); - g.endFill(); - - filters = [ new DropShadowFilter(2, 90, 0, 0.4) ]; - break; - } - - case "errorTipBelow": - { - // border - drawRoundRect( - 0, 11, w, h - 13, 3, - borderColor, backgroundAlpha); - - // top pointer - g.beginFill(borderColor, backgroundAlpha); - g.moveTo(9, 11); - g.lineTo(15, 0); - g.lineTo(21, 11); - g.moveTo(10, 11); - g.endFill(); - - filters = [ new DropShadowFilter(2, 90, 0, 0.4) ]; - break; - } - - default: //Tooltip - { - // face - drawRoundRect( - 3, 1, w - 6, h - 4, cornerRadius, - backgroundColor, backgroundAlpha) - - // top pointer - if (_arrowPosition == TOP) { - g.beginFill(backgroundColor, backgroundAlpha); - g.moveTo((w / 2) - 6, 1); - g.lineTo((w / 2), -10); - g.lineTo((w / 2) + 6, 1); - g.moveTo((w / 2) - 5, -10); - g.endFill(); - } - else { - g.beginFill(backgroundColor, backgroundAlpha); - g.moveTo((w / 2) - 6, h - 3); - g.lineTo((w / 2), h + 7); - g.lineTo((w / 2) + 6, h - 3); - g.moveTo((w / 2) - 5, h + 7); - g.endFill(); - } - - break; - } - } - } - - //-------------------------------------------------------------------------- - // - // Methods - // - //-------------------------------------------------------------------------- - - private function enterFrameHandler( event : Event ) : void { - this.position(); - } - - private function position() : void { - if (!stage || !ToolTipManager.currentToolTip || !ToolTipManager.currentTarget) - { - removeEventListener(Event.ENTER_FRAME, this.enterFrameHandler); - return; - } - var speed : Number = 5; - var parentCoords : Point = new Point(ToolTipManager.currentTarget.mouseX, ToolTipManager.currentTarget.mouseY); - var globalPoint : Point = ToolTipManager.currentTarget.localToGlobal(parentCoords); - var xp : Number = globalPoint.x + 5 - (ToolTipManager.currentToolTip.width / 2); - var yp : Number = globalPoint.y + ToolTipManager.currentToolTip.height; - - var overhangRight : Number = ToolTipManager.currentToolTip.width + xp; - var overhangBottom : Number = ToolTipManager.currentToolTip.height + yp; - updateArrowPosition(TOP); - - if (overhangRight > stage.stageWidth) { - xp = stage.stageWidth - ToolTipManager.currentToolTip.width; - } - if (overhangBottom > stage.height) { - yp = globalPoint.y - ToolTipManager.currentToolTip.height - 10; - updateArrowPosition(BOTTOM); - } - if (xp < 0) { - xp = 0; - } - if ((yp) < 0) { - yp = 0; - } - if (visible) { - ToolTipManager.currentToolTip.x += (xp - ToolTipManager.currentToolTip.x) / speed; - ToolTipManager.currentToolTip.y += (yp - ToolTipManager.currentToolTip.y) / speed; - } - else { - ToolTipManager.currentToolTip.x = xp; - ToolTipManager.currentToolTip.y = yp; - visible = true; - } - - } - - private function updateArrowPosition( value : String ) : void { - if (_arrowPosition != value) { - _arrowPosition = value; - validateDisplayList(); - } - } - } +package org.bigbluebutton.skins { + import flash.display.Graphics; + import flash.events.Event; + import flash.filters.DropShadowFilter; + import flash.geom.Point; + + import mx.core.EdgeMetrics; + import mx.managers.ToolTipManager; + import mx.skins.RectangularBorder; + + public class ToolTipSkin extends RectangularBorder { + private static const LOG:String = "ToolTipSkin - "; + + private static const TOP:String = "top"; + + private static const BOTTOM:String = "bottom"; + + private var _arrowPosition:String = TOP; + + public function ToolTipSkin() { + super(); + visible = false; + addEventListener(Event.ENTER_FRAME, this.enterFrameHandler); + } + + //-------------------------------------------------------------------------- + // + // Overridden properties + // + //-------------------------------------------------------------------------- + + //---------------------------------- + // borderMetrics + //---------------------------------- + + /** + * @private + * Storage for the borderMetrics property. + */ + private var _borderMetrics:EdgeMetrics; + + /** + * @private + */ + override public function get borderMetrics():EdgeMetrics { + if (_borderMetrics) + return _borderMetrics; + + var borderStyle:String = getStyle("borderStyle"); + switch (borderStyle) { + case "errorTipRight": { + _borderMetrics = new EdgeMetrics(15, 1, 3, 3); + break; + } + + case "errorTipAbove": { + _borderMetrics = new EdgeMetrics(3, 1, 3, 15); + break; + } + + case "errorTipBelow": { + _borderMetrics = new EdgeMetrics(3, 13, 3, 3); + break; + } + + default: // "toolTip" + { + _borderMetrics = new EdgeMetrics(3, 1, 3, 3); + break; + } + } + + return _borderMetrics; + } + + //-------------------------------------------------------------------------- + // + // Overridden methods + // + //-------------------------------------------------------------------------- + + /** + * @private + * If borderStyle may have changed, clear the cached border metrics. + */ + override public function styleChanged(styleProp:String):void { + super.styleChanged(styleProp); + + if (styleProp == "borderStyle" || styleProp == "styleName" || styleProp == null) { + _borderMetrics = null; + + var borderStyle:String = getStyle("borderStyle"); + switch (borderStyle) { + case "errorTipRight": + case "errorTipAbove": + case "errorTipBelow": { + visible = true; + break; + } + } + } + } + + /** + * @private + * Draw the background and border. + */ + override protected function updateDisplayList(w:Number, h:Number):void { + super.updateDisplayList(w, h); + + var borderStyle:String = getStyle("borderStyle"); + var backgroundColor:uint = getStyle("backgroundColor"); + var backgroundAlpha:Number = getStyle("backgroundAlpha"); + var borderColor:uint = getStyle("borderColor"); + var cornerRadius:Number = getStyle("cornerRadius"); + + var g:Graphics = graphics; + g.clear(); + + filters = []; + + switch (borderStyle) { + case "none": { + // Don't draw anything + break; + } + case "errorTipRight": { + // border + drawRoundRect(11, 0, w - 11, h - 2, 3, borderColor, backgroundAlpha); + + // left pointer + g.beginFill(borderColor, backgroundAlpha); + g.moveTo(11, 7); + g.lineTo(0, 13); + g.lineTo(11, 19); + g.moveTo(11, 7); + g.endFill(); + + filters = [new DropShadowFilter(2, 90, 0, 0.4)]; + break; + } + + case "errorTipAbove": { + // border + drawRoundRect(0, 0, w, h - 13, 3, borderColor, backgroundAlpha); + + // bottom pointer + g.beginFill(borderColor, backgroundAlpha); + g.moveTo(w / 2 - 6, h - 13); + g.lineTo(w / 2, h - 2); + g.lineTo(w / 2 + 6, h - 13); + g.moveTo(w / 2 - 6, h - 13); + g.endFill(); + + filters = [new DropShadowFilter(2, 90, 0, 0.4)]; + break; + } + + case "errorTipBelow": { + // border + drawRoundRect(0, 11, w, h - 13, 3, borderColor, backgroundAlpha); + + // top pointer + g.beginFill(borderColor, backgroundAlpha); + g.moveTo(9, 11); + g.lineTo(15, 0); + g.lineTo(21, 11); + g.moveTo(10, 11); + g.endFill(); + + filters = [new DropShadowFilter(2, 90, 0, 0.4)]; + break; + } + + default: //Tooltip + { + // face + drawRoundRect(3, 1, w - 6, h - 4, cornerRadius, backgroundColor, backgroundAlpha) + + // top pointer + if (_arrowPosition == TOP) { + g.beginFill(backgroundColor, backgroundAlpha); + g.moveTo((w / 2) - 6, 1); + g.lineTo((w / 2), -10); + g.lineTo((w / 2) + 6, 1); + g.moveTo((w / 2) - 5, -10); + g.endFill(); + } else { + g.beginFill(backgroundColor, backgroundAlpha); + g.moveTo((w / 2) - 6, h - 3); + g.lineTo((w / 2), h + 7); + g.lineTo((w / 2) + 6, h - 3); + g.moveTo((w / 2) - 5, h + 7); + g.endFill(); + } + + break; + } + } + } + + //-------------------------------------------------------------------------- + // + // Methods + // + //-------------------------------------------------------------------------- + + private function enterFrameHandler(event:Event):void { + this.position(); + } + + private function position():void { + if (!stage || !ToolTipManager.currentToolTip || !ToolTipManager.currentTarget) { + removeEventListener(Event.ENTER_FRAME, this.enterFrameHandler); + return; + } + var speed:Number = 5; + var parentCoords:Point = new Point(ToolTipManager.currentTarget.mouseX, ToolTipManager.currentTarget.mouseY); + var globalPoint:Point = ToolTipManager.currentTarget.localToGlobal(parentCoords); + var xp:Number = globalPoint.x + 5 - (ToolTipManager.currentToolTip.width / 2); + var yp:Number = globalPoint.y + ToolTipManager.currentToolTip.height; + + var overhangRight:Number = ToolTipManager.currentToolTip.width + xp; + var overhangBottom:Number = ToolTipManager.currentToolTip.height + yp; + updateArrowPosition(TOP); + + if (overhangRight > stage.stageWidth) { + xp = stage.stageWidth - ToolTipManager.currentToolTip.width; + } + if (overhangBottom > stage.height) { + yp = globalPoint.y - ToolTipManager.currentToolTip.height - 10; + updateArrowPosition(BOTTOM); + } + if (xp < 0) { + xp = 0; + } + if ((yp) < 0) { + yp = 0; + } + if (visible) { + ToolTipManager.currentToolTip.x += (xp - ToolTipManager.currentToolTip.x) / speed; + ToolTipManager.currentToolTip.y += (yp - ToolTipManager.currentToolTip.y) / speed; + } else { + ToolTipManager.currentToolTip.x = xp; + ToolTipManager.currentToolTip.y = yp; + visible = true; + } + + } + + private function updateArrowPosition(value:String):void { + if (_arrowPosition != value) { + _arrowPosition = value; + validateDisplayList(); + } + } + } } diff --git a/bigbluebutton-client/build.xml b/bigbluebutton-client/build.xml index 27f7329129f0753dc7f30fcc2514c644b3c78fe9..0f3c3e15495dd06837046c690a570f915c06eb15 100755 --- a/bigbluebutton-client/build.xml +++ b/bigbluebutton-client/build.xml @@ -8,8 +8,7 @@ <property name="FLEX_HOME" value="${env.FLEX_HOME}" /> <property name="LOCALE_DIR" value="${FLEX_HOME}/frameworks/locale" /> <property name="BASE_DIR" value="${basedir}" /> - <property name="themeFile" value="BBBDefault.css" /> - <property name="blackTheme" value="BBBBlack.css" /> + <property name="V2_THEME" value="V2Theme.css" /> <property name="LOCALE" value="en_US" /> <property name="RESOURCES_DIR" value="${BASE_DIR}/resources" /> <property name="PROD_RESOURCES_DIR" value="${RESOURCES_DIR}/prod" /> @@ -78,25 +77,15 @@ </foreach> </target> - <target name="branding" depends="init-ant-contrib"> - <sequential> - <mxmlc file="${BASE_DIR}/branding/default/style/css/${themeFile}" output="${OUTPUT_DIR}/branding/css/${themeFile}.swf" debug="${DEBUG}" show-unused-type-selector-warnings="false" incremental="true" swf-version="13" default-background-color="0xFFFFFF" optimize="true"> - <compiler.library-path dir="." append="true"> - <include name="libs" /> - </compiler.library-path> - </mxmlc> - </sequential> - </target> - - <target name="branding-black" depends="init-ant-contrib"> - <sequential> - <mxmlc file="${BASE_DIR}/branding/default/style/css/${blackTheme}" output="${OUTPUT_DIR}/branding/css/${blackTheme}.swf" debug="${DEBUG}" show-unused-type-selector-warnings="false" incremental="true" swf-version="13" optimize="true"> - <compiler.library-path dir="." append="true"> - <include name="libs" /> - </compiler.library-path> - </mxmlc> - </sequential> - </target> + <target name="branding-v2" depends="init-ant-contrib"> + <sequential> + <mxmlc file="${BASE_DIR}/branding/default/style/css/${V2_THEME}" output="${OUTPUT_DIR}/branding/css/${V2_THEME}.swf" debug="${DEBUG}" show-unused-type-selector-warnings="false" incremental="true" swf-version="13" optimize="true"> + <compiler.library-path dir="." append="true"> + <include name="libs" /> + </compiler.library-path> + </mxmlc> + </sequential> + </target> <target name="build-bbb-main-test" description="Compile BigBlueButton Main Test"> <build-main src="${SRC_DIR}" target="${BBB_MAIN_TEST}" /> @@ -181,11 +170,6 @@ <target name="build-bbb-main" description="Compile BigBlueButton Main"> <build-main src="${SRC_DIR}" target="${BBB_MAIN}" /> - - <echo message="Copying common assets for BBB Main" /> - <copy todir="${OUTPUT_DIR}/org/bigbluebutton/common/assets/images"> - <fileset dir="${BASE_DIR}/src/org/bigbluebutton/common/assets/images/" /> - </copy> </target> <target name="build-broadcast" description="Compile Broadcast Module"> @@ -250,11 +234,6 @@ <target name="build-phone" description="Compile Phone Module"> <build-module src="${SRC_DIR}" target="${PHONE}" /> - - <echo message="Copying assets for Phone Module" /> - <copy todir="${OUTPUT_DIR}/org/bigbluebutton/modules/phone/views/assets/images/"> - <fileset dir="${BASE_DIR}/src/org/bigbluebutton/modules/phone/views/assets/images/" /> - </copy> </target> <target name="build-video" description="Compile Video Module"> @@ -295,12 +274,14 @@ <attribute name="target" description="Module to compile" /> <attribute name="flex" default="${FLEX_HOME}" description="Location of the Flex install." /> <attribute name="app" default="." /> + <attribute name="themeDir" default="${BASE_DIR}/branding/default/style/css" /> <attribute name="src" default="${SRC_DIR}" description="Path to the module to compile" /> <sequential> <mxmlc file="@{src}/@{target}.mxml" output="${OUTPUT_DIR}/@{target}.swf" debug="${DEBUG}" incremental="true" swf-version="13" optimize="true" link-report="linker-report.xml"> <target-player>11.2.0</target-player> <load-config filename="@{flex}/frameworks/flex-config.xml" /> <default-background-color>0xFFFFFF</default-background-color> + <source-path path-element="@{themeDir}" /> <source-path path-element="@{flex}/frameworks" /> <show-unused-type-selector-warnings>false</show-unused-type-selector-warnings> @@ -438,7 +419,7 @@ <copy file="${PROD_RESOURCES_DIR}/get_flash_player.gif" todir="${OUTPUT_DIR}" overwrite="true" /> <copy file="${PROD_RESOURCES_DIR}/bbb.gif" todir="${OUTPUT_DIR}" overwrite="true" /> <copy file="${PROD_RESOURCES_DIR}/avatar.png" todir="${OUTPUT_DIR}" overwrite="true" /> - <copy file="${PROD_RESOURCES_DIR}/logo.png" todir="${OUTPUT_DIR}" overwrite="true" /> + <copy file="${PROD_RESOURCES_DIR}/logo.swf" todir="${OUTPUT_DIR}" overwrite="true" /> <copy file="${PROD_RESOURCES_DIR}/background.jpg" todir="${OUTPUT_DIR}" overwrite="true" /> <copy file="${PROD_RESOURCES_DIR}/locales.xml" todir="${OUTPUT_DIR}/conf" overwrite="true" /> <copy file="${PROD_RESOURCES_DIR}/expressInstall.swf" todir="${OUTPUT_DIR}" overwrite="true" /> @@ -462,7 +443,7 @@ <target name="generate-html-wrapper"> - <html-wrapper title="BigBlueButton" file="BigBlueButton.html" height="100%" width="100%" bgcolor="white" application="BBB" swf="BigBlueButton" version-major="10" version-minor="3" version-revision="0" history="true" output="${OUTPUT_DIR}" /> + <html-wrapper title="BigBlueButton" file="BigBlueButton.html" height="100%" width="100%" bgcolor="#F1F3F7" application="BBB" swf="BigBlueButton" version-major="10" version-minor="3" version-revision="0" history="true" output="${OUTPUT_DIR}" /> </target> <target name="asdoc"> @@ -519,7 +500,7 @@ <target name="clean-build-all" depends="clean, init-ant-contrib, generate-html-wrapper, compile-screenshare-standalone, build-mic-check, build-cam-check, build-conn-check, build-webcam-preview-standalone, build-webcam-view-standalone, - compile-bbb, branding, branding-black" description="Build BBB client including locales" /> + compile-bbb, branding-v2" description="Build BBB client including locales" /> <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" /> diff --git a/bigbluebutton-client/locale/en_US/bbbResources.properties b/bigbluebutton-client/locale/en_US/bbbResources.properties index b896acab7957231955692f6483a3e7c1c469aae7..87a288a0cf5da88ed071f2e9ccd9f71f6cfb162b 100755 --- a/bigbluebutton-client/locale/en_US/bbbResources.properties +++ b/bigbluebutton-client/locale/en_US/bbbResources.properties @@ -170,7 +170,6 @@ bbb.users.pushToMute.toolTip = Mute yourself bbb.users.muteMeBtnTxt.talk = Unmute bbb.users.muteMeBtnTxt.mute = Mute bbb.users.muteMeBtnTxt.muted = Muted -bbb.users.muteMeBtnTxt.unmuted = Unmuted bbb.users.usersGrid.contextmenu.exportusers = Copy User Names bbb.users.usersGrid.accessibilityName = Users List. Use the arrow keys to navigate. bbb.users.usersGrid.nameItemRenderer = Name @@ -293,7 +292,6 @@ bbb.chat.title = Chat bbb.chat.quickLink.label = Chat Window bbb.chat.cmpColorPicker.toolTip = Text Color bbb.chat.input.accessibilityName = Chat Message Editing Field -bbb.chat.sendBtn = Send bbb.chat.sendBtn.toolTip = Send Message bbb.chat.sendBtn.accessibilityName = Send chat message bbb.chat.saveBtn.toolTip = Save chat @@ -426,6 +424,7 @@ bbb.screenshareView.actualSize = Display actual size bbb.screenshareView.minimizeBtn.accessibilityName = Minimize the Screen Sharing View Window bbb.screenshareView.maximizeRestoreBtn.accessibilityName = Maximize the Screen Sharing View Window bbb.screenshareView.closeBtn.accessibilityName = Close the Screen Sharing View Window +bbb.toolbar.sharednotes.toolTip = Open Shared Notes bbb.toolbar.phone.toolTip.start = Enable Audio (microphone or listen only) bbb.toolbar.phone.toolTip.stop = Disable Audio bbb.toolbar.phone.toolTip.mute = Stop listening the conference diff --git a/bigbluebutton-client/locale/pt_BR/bbbResources.properties b/bigbluebutton-client/locale/pt_BR/bbbResources.properties index 6e8207cc6d8a47339e4a49fcde35aaab2527733a..a17f5eadc3ae261d0a7e5580faf1740128a6495a 100644 --- a/bigbluebutton-client/locale/pt_BR/bbbResources.properties +++ b/bigbluebutton-client/locale/pt_BR/bbbResources.properties @@ -410,6 +410,7 @@ bbb.screenshareView.actualSize = Exibir tamanho original bbb.screenshareView.minimizeBtn.accessibilityName = Minimizar a Janela de Visualização do Compartilhamento de Tela bbb.screenshareView.maximizeRestoreBtn.accessibilityName = Maximizar a Janela de Visualização do Compartilhamento de Tela bbb.screenshareView.closeBtn.accessibilityName = Fechar a Janela de Visualização do Compartilhamento de Tela +bbb.toolbar.sharednotes.toolTip = Abrir bloco de notas bbb.toolbar.phone.toolTip.start = Transmitir seu microfone bbb.toolbar.phone.toolTip.stop = Interromper transmissão do seu microfone bbb.toolbar.phone.toolTip.mute = Parar de escutar a conferência diff --git a/bigbluebutton-client/resources/config.xml.template b/bigbluebutton-client/resources/config.xml.template index 85718bd567ef832e1615bfb46692aae09a624fc8..13d8767c76c18aad22aa552592e2c62ec7e35a9d 100755 --- a/bigbluebutton-client/resources/config.xml.template +++ b/bigbluebutton-client/resources/config.xml.template @@ -1,20 +1,19 @@ <?xml version="1.0" ?> <config> <localeversion suppressWarning="false">0.9.0</localeversion> - <version>VERSION</version> <help url="http://HOST/help.html"/> <javaTest url="http://HOST/testjava.html"/> <porttest host="HOST" application="video/portTest" timeout="10000"/> <bwMon server="HOST" application="video/bwTest"/> <application uri="rtmp://HOST/bigbluebutton" host="http://HOST/bigbluebutton/api/enter"/> <language userSelectionEnabled="true" /> - <skinning enabled="true" url="http://HOST/client/branding/css/BBBDefault.css.swf?v=VERSION" /> - <branding logo="logo.png" copyright="© 2017 <u><a href="http://www.bigbluebutton.org" target="_blank">http://www.bigbluebutton.org</a></u>" background="" toolbarColor="" toolbarColorAlphas="" /> + <skinning enabled="true" url="http://HOST/client/branding/css/V2Theme.css.swf?v=VERSION" /> + <branding logo="logo.swf" copyright="© 2017 <u><a href="http://www.bigbluebutton.org" target="_blank">http://www.bigbluebutton.org</a></u>" background="" toolbarColor="" /> <shortcutKeys showButton="true" /> <browserVersions chrome="CHROME_VERSION" firefox="FIREFOX_VERSION" flash="FLASH_VERSION" java="1.7.0_51" /> <layout showLogButton="false" defaultLayout="bbb.layout.name.defaultlayout" showToolbar="true" showFooter="true" showMeetingName="true" showHelpButton="true" - showLogoutWindow="true" showLayoutTools="true" confirmLogout="true" showNetworkMonitor="true" + showLogoutWindow="true" showLayoutTools="true" confirmLogout="true" showNetworkMonitor="false" showRecordingNotification="true" logoutOnStopRecording="false"/> <meeting muteOnStart="false" /> <breakoutRooms enabled="true" record="false" /> @@ -45,7 +44,7 @@ <module name="ScreenshareModule" url="http://HOST/client/ScreenshareModule.swf?v=VERSION" uri="rtmp://HOST/screenshare" - showButton="false" + showButton="true" tryWebRTCFirst="false" chromeExtensionLink="" chromeExtensionKey="" @@ -119,7 +118,7 @@ <module name="LayoutModule" url="http://HOST/client/LayoutModule.swf?v=VERSION" uri="rtmp://HOST/bigbluebutton" layoutConfig="http://HOST/client/conf/layout.xml" - enableEdit="true" + enableEdit="false" /> <module name="SharedNotesModule" url="http://HOST/client/SharedNotesModule.swf?v=VERSION" diff --git a/bigbluebutton-client/resources/prod/BigBlueButton.html b/bigbluebutton-client/resources/prod/BigBlueButton.html index 1009be5afab0fa1544b80020a8532f425c4ebec1..cd508ffdc9b848388d598657e82c02cdbc69daa1 100755 --- a/bigbluebutton-client/resources/prod/BigBlueButton.html +++ b/bigbluebutton-client/resources/prod/BigBlueButton.html @@ -120,6 +120,9 @@ <script src="lib/verto-min.js" language="javascript"></script> <script src="lib/verto_extension.js" language="javascript"></script> + <script src="lib/kurento-utils.min.js" language="javascript"></script> + <script src="lib/kurento-extension.js" language="javascript"></script> + <script src="lib/bbb_api_bridge.js?v=VERSION" language="javascript"></script> <script src="lib/sip.js?v=VERSION" language="javascript"></script> diff --git a/bigbluebutton-client/resources/prod/layout.xml b/bigbluebutton-client/resources/prod/layout.xml index da13bce36760c12b762af87bb1ba2487ff73462c..21332db2eec0ca7f84d8e4667b9d5f74066d3967 100755 --- a/bigbluebutton-client/resources/prod/layout.xml +++ b/bigbluebutton-client/resources/prod/layout.xml @@ -1,135 +1,93 @@ <?xml version="1.0"?> <layouts> <layout name="bbb.layout.name.defaultlayout" default="true"> - <window name="SharedNotesWindow" hidden="true" width="0.7" height="1" x="0" y="0" draggable="false" resizable="false"/> - <window name="BroadcastWindow" hidden="true" draggable="false" resizable="false"/> - <window name="PresentationWindow" width="0.513" height="1" x="0.180" y="0" /> - <window name="CaptionWindow" hidden="true" width="0.513" height="0.308" x="0.180" y="0.692" /> - <window name="VideoDock" width="0.177" height="0.313" x="0" y="0.687" minWidth="280" /> - <window name="ChatWindow" width="0.304" height="1" x="0.696" y="0" /> - <window name="UsersWindow" width="0.177" height="0.679" x="0" y="0" minWidth="280" /> + <window name="UsersWindow" width="0.25" height="0.539560439560439" x="0.015625" y="0.028571428571429" /> + <window name="VideoDock" width="0.25" height="0.373385989010990" x="0.015625" y="0.598042582417582" /> + <window name="PresentationWindow" width="0.4375" height="0.942857142857143" x="0.28125" y="0.028571428571429" /> + <window name="ChatWindow" width="0.25" height="0.942857142857143" x="0.734375" y="0.028571428571429" /> + <window name="SharedNotesWindow" hidden="true" /> + <window name="BroadcastWindow" hidden="true" /> + <window name="CaptionWindow" hidden="true" /> </layout> <layout name="bbb.layout.name.closedcaption"> - <window name="SharedNotesWindow" hidden="true" width="0.7" height="1" x="0" y="0" draggable="false" resizable="false"/> - <window name="BroadcastWindow" hidden="true" draggable="false" resizable="false"/> - <window name="PresentationWindow" width="0.513" height="0.684" x="0.180" y="0" /> - <window name="CaptionWindow" width="0.513" height="0.308" x="0.180" y="0.692" /> - <window name="VideoDock" width="0.177" height="0.308" x="0" y="0.687" minWidth="280" /> - <window name="ChatWindow" width="0.304" height="1" x="0.696" y="0" /> - <window name="UsersWindow" width="0.177" height="0.679" x="0" y="0" minWidth="280" /> + <window name="UsersWindow" width="0.25" height="0.539560439560439" x="0.015625" y="0.028571428571429" /> + <window name="VideoDock" width="0.25" height="0.373385989010990" x="0.015625" y="0.598042582417582" /> + <window name="PresentationWindow" width="0.4375" height="0.539560439560439" x="0.28125" y="0.028571428571429" /> + <window name="CaptionWindow" width="0.4375" height="0.373385989010990" x="0.28125" y="0.598042582417582" /> + <window name="ChatWindow" width="0.25" height="0.942857142857143" x="0.734375" y="0.028571428571429" /> + <window name="SharedNotesWindow" hidden="true" /> + <window name="BroadcastWindow" hidden="true" /> </layout> <layout name="bbb.layout.name.videochat"> - <window name="SharedNotesWindow" hidden="true" width="0.7" height="1" x="0" y="0" draggable="false" resizable="false"/> - <window name="BroadcastWindow" hidden="true" draggable="false" resizable="false"/> <window name="VideoDock" width="1" height="1" x="0" y="0" order="0"/> - <window name="ChatWindow" width="0.303125" height="0.9955703211517165" x="0.3229166666666667" y="0.9656699889258029" order="4" hidden="true" /> - <window name="PresentationWindow" minimized="true" order="1" hidden="true" /> - <window name="UsersWindow" minimized="true" hidden="true" order="2"/> - <window name="CaptionWindow" hidden="true" width="0.513" height="0.308" x="0.180" y="0.692" /> + <window name="SharedNotesWindow" hidden="true" /> + <window name="BroadcastWindow" hidden="true" /> + <window name="ChatWindow" hidden="true" /> + <window name="PresentationWindow" hidden="true" /> + <window name="UsersWindow" hidden="true" /> + <window name="CaptionWindow" hidden="true" /> </layout> <layout name="bbb.layout.name.webcamsfocus"> - <window name="SharedNotesWindow" hidden="true" width="0.7" height="1" x="0" y="0" draggable="false" resizable="false"/> - <window name="BroadcastWindow" hidden="true" draggable="false" resizable="false"/> - <window name="VideoDock" width="0.6570188133140377" height="0.9960106382978723" x="0" y="0" /> - <window name="ChatWindow" width="0.3393632416787265" height="0.5305851063829787" x="0.658465991316932" y="0" /> - <window name="UsersWindow" hidden="true" /> - <window name="PresentationWindow" width="0.34008683068017365" height="0.4601063829787234" x="0.658465991316932" y="0.535904255319149" /> - <window name="CaptionWindow" hidden="true" width="0.513" height="0.308" x="0.180" y="0.692" /> + <window name="VideoDock" width="0.641393813314037" height="0.942857142857143" x="0.015625" y="0.028571428571429" /> + <window name="ChatWindow" width="0.311731186685963" height="0.457142857142857" x="0.672643813314037" y="0.028571428571429" /> + <window name="PresentationWindow" width="0.311731186685963" height="0.457142857142857" x="0.672643813314037" y="0.514285714285714" /> + <window name="CaptionWindow" hidden="true" /> + <window name="BroadcastWindow" hidden="true" /> + <window name="UsersWindow" hidden="true" /> + <window name="SharedNotesWindow" hidden="true" /> </layout> <layout name="bbb.layout.name.presentfocus"> - <window name="SharedNotesWindow" hidden="true" width="0.7" height="1" x="0" y="0" draggable="false" resizable="false"/> - <window name="BroadcastWindow" hidden="true" draggable="false" resizable="false"/> - <window name="UsersWindow" minimized="true" /> - <window name="VideoDock" width="0.2923611111111111" height="0.4640957446808511" x="0.7048611111111112" y="0.535904255319149" /> - <window name="PresentationWindow" width="0.7027777777777777" height="0.9986702127659575" x="0" y="0" /> - <window name="ChatWindow" width="0.2923611111111111" height="0.5305851063829787" x="0.7048611111111112" y="0" /> - <window name="CaptionWindow" hidden="true" width="0.513" height="0.308" x="0.180" y="0.692" /> + <window name="PresentationWindow" width="0.641393813314037" height="0.942857142857143" x="0.015625" y="0.028571428571429" /> + <window name="ChatWindow" width="0.311731186685963" height="0.457142857142857" x="0.672643813314037" y="0.028571428571429" /> + <window name="VideoDock" width="0.311731186685963" height="0.457142857142857" x="0.672643813314037" y="0.514285714285714" /> + <window name="CaptionWindow" hidden="true" /> + <window name="SharedNotesWindow" hidden="true" /> + <window name="BroadcastWindow" hidden="true" /> + <window name="UsersWindow" hidden="true" /> </layout> <layout name="bbb.layout.name.lectureassistant"> - <window name="SharedNotesWindow" hidden="true" width="0.7" height="1" x="0" y="0" draggable="false" resizable="false"/> - <window name="BroadcastWindow" hidden="true" draggable="false" resizable="false"/> - <window name="ChatWindow" width="0.4597222222222222" height="0.9958677685950413" x="0.2263888888888889" y="0" /> - <window name="UsersWindow" width="0.22152777777777777" height="0.9958677685950413" x="0" y="0" minWidth="280" /> - <window name="PresentationWindow" width="0.3104166666666667" height="0.5537190082644629" x="0.6895833333333333" y="0" /> - <window name="VideoDock" width="0.30972222222222223" height="0.4357198347107438" x="0.6902777777777778" y="0.558870523415978" /> - <window name="CaptionWindow" hidden="true" width="0.513" height="0.308" x="0.180" y="0.692" /> - </layout> + <window name="UsersWindow" width="0.25" height="0.942857142857143" x="0.015625" y="0.028571428571429" /> + <window name="ChatWindow" width="0.4375" height="0.942857142857143" x="0.28125" y="0.028571428571429" /> + <window name="PresentationWindow" width="0.25" height="0.457142857142857" x="0.7343758" y="0.028571428571429" /> + <window name="VideoDock" width="0.25" height="0.457142857142857" x="0.734375" y="0.514285714285714" /> + <window name="SharedNotesWindow" hidden="true" /> + <window name="BroadcastWindow" hidden="true" /> + <window name="CaptionWindow" hidden="true" /> + </layout> <layout name="bbb.layout.name.lecture"> - <window name="SharedNotesWindow" hidden="true" width="0.7" height="1" x="0" y="0" draggable="false" resizable="false"/> - <window name="BroadcastWindow" hidden="true" draggable="false" resizable="false"/> - <window name="UsersWindow" hidden="true" /> - <window name="VideoDock" width="0.2923611111111111" height="0.4640957446808511" x="0.7048611111111112" y="0.535904255319149" /> - <window name="PresentationWindow" width="0.7027777777777777" height="0.9986702127659575" x="0" y="0" /> - <window name="ChatWindow" width="0.2923611111111111" height="0.5305851063829787" x="0.7048611111111112" y="0" /> - <window name="CaptionWindow" hidden="true" width="0.513" height="0.308" x="0.180" y="0.692" /> - </layout> + <window name="UsersWindow" width="0.25" height="0.6780487804878049" x="0" y="0" order="3"/> + <window name="SharedNotesWindow" width="0.25" height="0.3073170731707317" x="0" y="0.6861788617886179" order="4"/> + <window name="PresentationWindow" width="0.4888030888030888" height="0.9934959349593496" x="0.21853281853281853" y="0" order="1"/> + <window name="ChatWindow" width="0.25" height="0.5756097560975609" x="0.7104247104247104" y="0" order="0"/> + <window name="VideoDock" width="0.25" height="0.4113821138211382" x="0.7104247104247104" y="0.5804878048780487" order="2"/> + <window name="BroadcastWindow" hidden="true"/> + <window name="CaptionWindow" hidden="true"/> + </layout> <layout name="bbb.layout.name.lecture" role="presenter"> - <window name="SharedNotesWindow" hidden="true" width="0.7" height="1" x="0" y="0" draggable="false" resizable="false"/> - <window name="BroadcastWindow" hidden="true" draggable="false" resizable="false"/> + <window name="PresentationWindow" maximized="true" /> + <window name="SharedNotesWindow" hidden="true" /> + <window name="BroadcastWindow" hidden="true"/> <window name="ChatWindow" hidden="true" /> <window name="UsersWindow" hidden="true" /> - <window name="PresentationWindow" maximized="true" /> <window name="VideoDock" hidden="true" /> - <window name="CaptionWindow" hidden="true" width="0.513" height="0.308" x="0.180" y="0.692" /> - </layout> - <layout name="bbb.layout.name.lecture" role="moderator"> - <window name="SharedNotesWindow" hidden="true" width="0.7" height="1" x="0" y="0" draggable="false" resizable="false"/> - <window name="BroadcastWindow" hidden="true" draggable="false" resizable="false"/> - <window name="ChatWindow" width="0.4597222222222222" height="0.9958677685950413" x="0.2263888888888889" y="0" /> - <window name="UsersWindow" width="0.22152777777777777" height="0.9944903581267218" x="0" y="0" minWidth="280" /> - <window name="PresentationWindow" width="0.3104166666666667" height="0.5537190082644629" x="0.6895833333333333" y="0" /> - <window name="VideoDock" width="0.30972222222222223" height="0.4256198347107438" x="0.6902777777777778" y="0.568870523415978" /> - <window name="CaptionWindow" hidden="true" width="0.513" height="0.308" x="0.180" y="0.692" /> - </layout> - <layout name="bbb.layout.name.sharednotes"> - <window name="SharedNotesWindow" minimized="false" maximized="false" hidden="false" width="0.21621621621621623" height="0.3073170731707317" minWidth="-1" x="0" y="0.6861788617886179" order="4"/> - <window name="BroadcastWindow" hidden="true" draggable="false" resizable="false"/> - <window name="ChatWindow" minimized="false" maximized="false" hidden="false" width="0.2888030888030888" height="0.5756097560975609" minWidth="-1" x="0.7104247104247104" y="0" order="0"/> - <window name="UsersWindow" minimized="false" maximized="false" hidden="false" width="0.21621621621621623" height="0.6780487804878049" minWidth="-1" x="0" y="0" order="3"/> - <window name="PresentationWindow" minimized="false" maximized="false" hidden="false" width="0.4888030888030888" height="0.9934959349593496" minWidth="-1" x="0.21853281853281853" y="0" order="1"/> - <window name="VideoDock" minimized="false" maximized="false" hidden="false" width="0.2888030888030888" height="0.4113821138211382" minWidth="-1" x="0.7104247104247104" y="0.5804878048780487" order="2"/> - <window name="CaptionWindow" minimized="false" maximized="false" hidden="true" width="0.4888030888030888" height="0.3073170731707317" minWidth="-1" x="0.21853281853281853" y="0.6861788617886179" order="1"/> - </layout> -<!-- - <layout name="Users"> - <window name="SharedNotesWindow" hidden="true" width="0.7" height="1" x="0" y="0" draggable="false" resizable="false"/> - <window name="BroadcastWindow" hidden="true" draggable="false" resizable="false"/> - <window name="UsersWindow" width="0.1772793053545586" height="0.6795212765957446" x="0" y="0" /> - <window name="PresentationWindow" width="0.5137481910274964" height="0.9946808510638298" x="0.18017366136034732" y="0" /> - <window name="VideoDock" width="0.1772793053545586" height="0.30851063829787234" x="0" y="0.6875" /> - <window name="ChatWindow" width="0.3031837916063676" height="0.9960106382978723" x="0.6968162083936325" y="0" /> - </layout> - <layout name="S2SPresentation"> - <window name="SharedNotesWindow" hidden="true" width="0.7" height="1" x="0" y="0" draggable="false" resizable="false"/> - <window name="BroadcastWindow" hidden="true" draggable="false" resizable="false"/> - <window name="ChatWindow" hidden="true" draggable="false" resizable="false"/> - <window name="UsersWindow" hidden="true" draggable="false" resizable="false"/> - <window name="PresentationWindow" width="0.8" height="1" x="0" y="0" draggable="false" resizable="false"/> - <window name="VideoDock" hidden="true" draggable="false" resizable="false"/> + <window name="CaptionWindow" hidden="true" /> </layout> - <layout name="S2SVideoChat"> - <window name="SharedNotesWindow" hidden="true" width="0.7" height="1" x="0" y="0" draggable="false" resizable="false"/> - <window name="BroadcastWindow" hidden="true" draggable="false" resizable="false"/> - <window name="UsersWindow" hidden="true" draggable="false" resizable="false"/> - <window name="VideoDock" width="1" height="1" x="0" y="0" draggable="false" resizable="false"/> - <window name="ChatWindow" hidden="true" draggable="false" resizable="false"/> - <window name="PresentationWindow" hidden="true" draggable="false" resizable="false"/> - </layout> - <layout name="Notes"> - <window name="SharedNotesWindow" hidden="false" width="0.7" height="0.4" x="0" y="0.6" draggable="false" resizable="false"/> - <window name="BroadcastWindow" hidden="false" width="0.7" height="0.6" x="0" y="0" draggable="false" resizable="false"/> - <window name="UsersWindow" hidden="true" draggable="false" resizable="false"/> - <window name="VideoDock" hidden="true" draggable="false" resizable="false"/> - <window name="ChatWindow" width="0.3" height="1" x="0.7" y="0" draggable="false" resizable="false"/> - <window name="PresentationWindow" hidden="true" draggable="false" resizable="false"/> + <layout name="bbb.layout.name.lecture" role="moderator"> + <window name="UsersWindow" width="0.25" height="0.942857142857143" x="0.015625" y="0.028571428571429" /> + <window name="ChatWindow" width="0.4375" height="0.942857142857143" x="0.28125" y="0.028571428571429" /> + <window name="PresentationWindow" width="0.25" height="0.457142857142857" x="0.7343758" y="0.028571428571429" /> + <window name="VideoDock" width="0.25" height="0.457142857142857" x="0.734375" y="0.514285714285714" /> + <window name="SharedNotesWindow" hidden="true" /> + <window name="BroadcastWindow" hidden="true" /> + <window name="CaptionWindow" hidden="true" /> </layout> - <layout name="Broadcast"> - <window name="SharedNotesWindow" hidden="false" width="0.7" height="1" x="0" y="0" draggable="false" resizable="false"/> - <window name="BroadcastWindow" hidden="false" width="0.7" height="0.9" x="0" y="0" draggable="false" resizable="false"/> - <window name="UsersWindow" hidden="true" draggable="false" resizable="false"/> - <window name="VideoDock" hidden="true" draggable="false" resizable="false"/> - <window name="ChatWindow" width="0.3" height="1" x="0.7" y="0" draggable="false" resizable="false"/> - <window name="PresentationWindow" hidden="true" draggable="false" resizable="false"/> + <layout name="bbb.layout.name.sharednotes"> + <window name="UsersWindow" width="0.25" height="0.539560439560439" x="0.015625" y="0.028571428571429" order="3"/> + <window name="SharedNotesWindow" width="0.25" height="0.373385989010990" x="0.015625" y="0.598042582417582" order="4"/> + <window name="PresentationWindow" width="0.4375" height="0.942857142857143" x="0.28125" y="0.028571428571429" /> + <window name="ChatWindow" width="0.25" height="0.457142857142857" x="0.7343758" y="0.028571428571429" order="0"/> + <window name="VideoDock" width="0.25" height="0.457142857142857" x="0.734375" y="0.514285714285714" order="2"/> + <window name="BroadcastWindow" hidden="true"/> + <window name="CaptionWindow" hidden="true"/> </layout> ---> </layouts> diff --git a/bigbluebutton-client/resources/prod/lib/kurento-extension.js b/bigbluebutton-client/resources/prod/lib/kurento-extension.js new file mode 100644 index 0000000000000000000000000000000000000000..e792e38e24e6669d5a73f494011700e6196886e5 --- /dev/null +++ b/bigbluebutton-client/resources/prod/lib/kurento-extension.js @@ -0,0 +1,433 @@ +var isFirefox = typeof window.InstallTrigger !== 'undefined'; +var isOpera = !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0; +var isChrome = !!window.chrome && !isOpera; +var kurentoHandler = null; + +Kurento = function ( + tag, + voiceBridge, + conferenceUsername, + internalMeetingId, + onFail = null, + chromeExtension = null + ) { + + this.ws = null; + this.video; + this.screen; + this.webRtcPeer; + this.extensionInstalled = false; + this.screenConstraints = {}; + this.mediaCallback = null; + voiceBridge += "-DESKSHARE"; + + this.vid_width = window.screen.width; + this.vid_height = window.screen.height; + + // TODO properly generate a uuid + this.sessid = Math.random().toString(); + + this.renderTag = 'remote-media'; + + this.destination_number = internalMeetingId; + this.caller_id_name = conferenceUsername; + this.caller_id_number = conferenceUsername; + this.pingInterval; + + this.kurentoPort = "kurento-screenshare"; + this.hostName = window.location.hostname; + this.socketUrl = 'wss://' + this.hostName + '/' + this.kurentoPort; + + this.iceServers = null; + + if (chromeExtension != null) { + this.chromeExtension = chromeExtension; + } + + if (onFail != null) { + this.onFail = Kurento.normalizeCallback(onFail); + } else { + var _this = this; + this.onFail = function () { + _this.logError('Default error handler'); + }; + } +}; + +this.KurentoManager= function () { + this.kurentoVideo = null; + this.kurentoScreenShare = null; +}; + +KurentoManager.prototype.exitScreenShare = function () { + if (this.kurentoScreenShare != null) { + if(kurentoHandler.pingInterval) { + clearInterval(kurentoHandler.pingInterval); + } + if(kurentoHandler.ws !== null) { + kurentoHandler.ws.onclose = function(){}; + kurentoHandler.ws.close(); + } + kurentoHandler.disposeScreenShare(); + this.kurentoScreenShare = null; + kurentoHandler = null; + } +}; + +KurentoManager.prototype.shareScreen = function (tag) { + this.exitScreenShare(); + var obj = Object.create(Kurento.prototype); + Kurento.apply(obj, arguments); + this.kurentoScreenShare = obj; + kurentoHandler = obj; + this.kurentoScreenShare.setScreenShare(tag); +}; + +// Still unused, part of the HTML5 implementation +KurentoManager.prototype.joinWatchVideo = function (tag) { + this.exitVideo(); + var obj = Object.create(Kurento.prototype); + Kurento.apply(obj, arguments); + this.kurentoVideo = obj; + kurentoHandler = obj; + this.kurentoVideo.setWatchVideo(tag); +}; + + +Kurento.prototype.setScreenShare = function (tag) { + this.mediaCallback = this.makeShare; + this.create(tag); +}; + +Kurento.prototype.create = function (tag) { + this.setRenderTag(tag); + this.iceServers = true; + this.init(); +}; + +Kurento.prototype.init = function () { + var self = this; + if("WebSocket" in window) { + console.log("this browser supports websockets"); + this.ws = new WebSocket(this.socketUrl); + + this.ws.onmessage = this.onWSMessage; + this.ws.onclose = function (close) { + kurentoManager.exitScreenShare(); + self.onFail("Websocket connection closed"); + }; + this.ws.onerror = function (error) { + kurentoManager.exitScreenShare(); + self.onFail("Websocket connection error"); + }; + this.ws.onopen = function() { + self.pingInterval = setInterval(self.ping, 3000); + self.mediaCallback(); + }; + } + else + console.log("this browser does not support websockets"); +}; + +Kurento.prototype.onWSMessage = function (message) { + var parsedMessage = JSON.parse(message.data); + switch (parsedMessage.id) { + + case 'presenterResponse': + kurentoHandler.presenterResponse(parsedMessage); + break; + case 'stopSharing': + kurentoManager.exitScreenShare(); + break; + case 'iceCandidate': + kurentoHandler.webRtcPeer.addIceCandidate(parsedMessage.candidate); + break; + case 'pong': + break; + default: + console.error('Unrecognized message', parsedMessage); + } +}; + +Kurento.prototype.setRenderTag = function (tag) { + this.renderTag = tag; +}; + +Kurento.prototype.presenterResponse = function (message) { + if (message.response != 'accepted') { + var errorMsg = message.message ? message.message : 'Unknow error'; + console.warn('Call not accepted for the following reason: ' + errorMsg); + kurentoManager.exitScreenShare(); + kurentoHandler.onFail(errorMessage); + } else { + console.log("Presenter call was accepted with SDP => " + message.sdpAnswer); + this.webRtcPeer.processAnswer(message.sdpAnswer); + } +} + +Kurento.prototype.serverResponse = function (message) { + if (message.response != 'accepted') { + var errorMsg = message.message ? message.message : 'Unknow error'; + console.warn('Call not accepted for the following reason: ' + errorMsg); + kurentoHandler.dispose(); + } else { + this.webRtcPeer.processAnswer(message.sdpAnswer); + } +} + +Kurento.prototype.makeShare = function() { + var self = this; + console.log("Kurento.prototype.makeShare " + JSON.stringify(this.webRtcPeer, null, 2)); + if (!this.webRtcPeer) { + + var options = { + onicecandidate : this.onIceCandidate + } + + console.log("Peer options " + JSON.stringify(options, null, 2)); + + kurentoHandler.startScreenStreamFrom(); + + } +} + +Kurento.prototype.onOfferPresenter = function (error, offerSdp) { + if(error) { + console.log("Kurento.prototype.onOfferPresenter Error " + error); + kurentoHandler.onFail(error); + return; + } + + var message = { + id : 'presenter', + presenterId : kurentoHandler.sessid, + callerName : kurentoHandler.caller_id_name, + voiceBridge : kurentoHandler.destination_number, + sdpOffer : offerSdp, + vh: kurentoHandler.vid_height, + vw: kurentoHandler.vid_width + }; + console.log("onOfferPresenter sending to screenshare server => " + JSON.stringify(message, null, 2)); + kurentoHandler.sendMessage(message); +} + +Kurento.prototype.startScreenStreamFrom = function () { + var screenInfo = null; + var _this = this; + if (!!window.chrome) { + if (!_this.chromeExtension) { + _this.logError({ + status: 'failed', + message: 'Missing Chrome Extension key', + }); + _this.onFail(); + return; + } + } + // TODO it would be nice to check those constraints + _this.screenConstraints.video = {}; + + var options = { + //localVideo: this.renderTag, + onicecandidate : _this.onIceCandidate, + mediaConstraints : _this.screenConstraints, + sendSource : 'desktop' + }; + + console.log(" Peer options => " + JSON.stringify(options, null, 2)); + + _this.webRtcPeer = kurentoUtils.WebRtcPeer.WebRtcPeerSendonly(options, function(error) { + if(error) { + console.log("WebRtcPeerSendonly constructor error " + JSON.stringify(error, null, 2)); + kurentoHandler.onFail(error); + return kurentoManager.exitScreenShare(); + } + + _this.webRtcPeer.generateOffer(_this.onOfferPresenter); + console.log("Generated peer offer w/ options " + JSON.stringify(options)); + }); +} + +Kurento.prototype.onIceCandidate = function(candidate) { + console.log('Local candidate' + JSON.stringify(candidate)); + + var message = { + id : 'onIceCandidate', + presenterId : kurentoHandler.sessid, + candidate : candidate + } + console.log("this object " + JSON.stringify(this, null, 2)); + kurentoHandler.sendMessage(message); +} + +Kurento.prototype.setWatchVideo = function (tag) { + this.useVideo = true; + this.useCamera = 'none'; + this.useMic = 'none'; + this.mediaCallback = this.viewer; + this.create(tag); +}; + +Kurento.prototype.viewer = function () { + var self = this; + if (!this.webRtcPeer) { + + var options = { + remoteVideo: this.renderTag, + onicecandidate : onIceCandidate + } + + webRtcPeer = kurentoUtils.WebRtcPeer.WebRtcPeerRecvonly(options, function(error) { + if(error) { + return kurentoHandler.onFail(error); + } + + this.generateOffer(onOfferViewer); + }); + } +}; + +Kurento.prototype.onOfferViewer = function (error, offerSdp) { + if(error) { + console.log("Kurento.prototype.onOfferViewer Error " + error); + return kurentoHandler.onFail(); + } + var message = { + id : 'viewer', + presenterId : kurentoHandler.sessid, + callerName : kurentoHandler.caller_id_name, + voiceBridge : kurentoHandler.destination_number, + sdpOffer : offerSdp + }; + + console.log("onOfferViewer sending to screenshare server => " + JSON.stringify(message, null, 2)); + kurentoHandler.sendMessage(message); +}; + +Kurento.prototype.ping = function() { + var message = { + id : 'ping', + presenterId : kurentoHandler.sessid, + callerName : kurentoHandler.caller_id_name, + voiceBridge : kurentoHandler.destination_number, + }; + + kurentoHandler.sendMessage(message); +} + +Kurento.prototype.stop = function() { + if (this.webRtcPeer) { + var message = { + id : 'stop', + presenterId : kurentoHandler.sessId, + } + kurentoHandler.sendMessage(message); + kurentoHandler.disposeScreenShare(); + } +} + +Kurento.prototype.dispose = function() { + if (this.webRtcPeer) { + this.webRtcPeer.dispose(); + this.webRtcPeer = null; + } +} + +Kurento.prototype.disposeScreenShare = function() { + if (this.webRtcPeer) { + this.webRtcPeer.dispose(); + this.webRtcPeer = null; + } +} + +Kurento.prototype.sendMessage = function(message) { + var jsonMessage = JSON.stringify(message); + console.log('Sending message: ' + jsonMessage); + this.ws.send(jsonMessage); +} + +Kurento.prototype.logger = function (obj) { + console.log(obj); +}; + +Kurento.prototype.logError = function (obj) { + console.error(obj); +}; + +Kurento.prototype.getChromeScreenConstraints = function(callback, extensionId) { + chrome.runtime.sendMessage(extensionId, { + getStream: true, + sources: [ + "window", + "screen", + "tab" + ]}, + function(response) { + console.log(response); + callback(response); + }); +}; + +Kurento.normalizeCallback = function (callback) { + if (typeof callback == 'function') { + return callback; + } else { + console.log(document.getElementById('BigBlueButton')[callback]); + return function (args) { + document.getElementById('BigBlueButton')[callback](args); + }; + } +}; + +/* Global methods */ + +// this function explains how to use above methods/objects +window.getScreenConstraints = function(sendSource, callback) { + var _this = this; + var chromeMediaSourceId = sendSource; + if(isChrome) { + kurentoHandler.getChromeScreenConstraints (function (constraints) { + + var sourceId = constraints.streamId; + + // this statement sets gets 'sourceId" and sets "chromeMediaSourceId" + kurentoHandler.screenConstraints.video.chromeMediaSource = { exact: [sendSource]}; + kurentoHandler.screenConstraints.video.chromeMediaSourceId= sourceId; + console.log("getScreenConstraints for Chrome returns => " +JSON.stringify(kurentoHandler.screenConstraints, null, 2)); + // now invoking native getUserMedia API + callback(null, kurentoHandler.screenConstraints); + + }, kurentoHandler.chromeExtension); + } + else if (isFirefox) { + kurentoHandler.screenConstraints.video.mediaSource= "screen"; + kurentoHandler.screenConstraints.video.width= {max: kurentoHandler.vid_width}; + kurentoHandler.screenConstraints.video.height = {max: kurentoHandler.vid_height}; + + console.log("getScreenConstraints for Firefox returns => " +JSON.stringify(kurentoHandler.screenConstraints, null, 2)); + // now invoking native getUserMedia API + callback(null, kurentoHandler.screenConstraints); + } +} + +window.kurentoInitialize = function () { + if (window.kurentoManager == null || window.KurentoManager == undefined) { + window.kurentoManager = new KurentoManager(); + } +}; + +window.kurentoShareScreen = function() { + window.kurentoInitialize(); + window.kurentoManager.shareScreen.apply(window.kurentoManager, arguments); +}; + + +window.kurentoExitScreenShare = function () { + window.kurentoInitialize(); + window.kurentoManager.exitScreenShare(); +}; + +window.kurentoWatchVideo = function () { + window.kurentoInitialize(); + window.kurentoManager.joinWatchVideo.apply(window.kurentoManager, arguments); +}; diff --git a/bigbluebutton-client/resources/prod/lib/kurento-utils.min.js b/bigbluebutton-client/resources/prod/lib/kurento-utils.min.js new file mode 100644 index 0000000000000000000000000000000000000000..4e88a14cb52432fe068dd62adf6ec94350103ae2 --- /dev/null +++ b/bigbluebutton-client/resources/prod/lib/kurento-utils.min.js @@ -0,0 +1,56 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.kurentoUtils = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ +function noop(e){e&&logger.error(e)}function trackStop(e){e.stop&&e.stop()}function streamStop(e){e.getTracks().forEach(trackStop)}function bufferizeCandidates(e,n){var t=[];return e.addEventListener("signalingstatechange",function(){if("stable"===this.signalingState)for(;t.length;){var e=t.shift();this.addIceCandidate(e.candidate,e.callback,e.callback)}}),function(r,i){switch(i=i||n,e.signalingState){case"closed":i(new Error("PeerConnection object is closed"));break;case"stable":if(e.remoteDescription){e.addIceCandidate(r,i,i);break}default:t.push({candidate:r,callback:i})}}}function removeFIDFromOffer(e){var n=e.indexOf("a=ssrc-group:FID");return n>0?e.slice(0,n):e}function getSimulcastInfo(e){var n=e.getVideoTracks();if(!n.length)return logger.warn("No video tracks available in the video stream"),"";var t=["a=x-google-flag:conference","a=ssrc-group:SIM 1 2 3","a=ssrc:1 cname:localVideo","a=ssrc:1 msid:"+e.id+" "+n[0].id,"a=ssrc:1 mslabel:"+e.id,"a=ssrc:1 label:"+n[0].id,"a=ssrc:2 cname:localVideo","a=ssrc:2 msid:"+e.id+" "+n[0].id,"a=ssrc:2 mslabel:"+e.id,"a=ssrc:2 label:"+n[0].id,"a=ssrc:3 cname:localVideo","a=ssrc:3 msid:"+e.id+" "+n[0].id,"a=ssrc:3 mslabel:"+e.id,"a=ssrc:3 label:"+n[0].id];return t.push(""),t.join("\n")}function WebRtcPeer(e,n,t){function r(){if(l){var e=p.getRemoteStreams()[0],n=e?URL.createObjectURL(e):"";l.pause(),l.src=n,l.load(),logger.info("Remote URL:",n)}}function i(e){return w&&("Chrome"===browser.name||"Chromium"===browser.name?(logger.info("Adding multicast info"),e=new RTCSessionDescription({type:e.type,sdp:removeFIDFromOffer(e.sdp)+getSimulcastInfo(u)})):logger.warn("Simulcast is only available in Chrome browser.")),e}function o(){"closed"===p.signalingState&&t('The peer connection object is in "closed" state. This is most likely due to an invocation of the dispose method before accepting in the dialogue'),u&&d&&c.showLocalVideo(),u&&p.addStream(u),f&&p.addStream(f);var n=parser.getBrowser();"sendonly"!==e||"Chrome"!==n.name&&"Chromium"!==n.name||39!==n.major||(e="sendrecv"),t()}function a(e){void 0===e&&(e=MEDIA_CONSTRAINTS),navigator.mediaDevices.getUserMedia(e).then(function(e){u=e,o()}).catch(t)}if(!(this instanceof WebRtcPeer))return new WebRtcPeer(e,n,t);WebRtcPeer.super_.call(this),n instanceof Function&&(t=n,n=void 0),n=n||{},t=(t||noop).bind(this);var s,c=this,d=n.localVideo,l=n.remoteVideo,u=n.videoStream,f=n.audioStream,g=n.mediaConstraints,p=(n.connectionConstraints,n.peerConnection),h=n.sendSource||"webcam",m=n.dataChannelConfig,v=n.dataChannels||!1,b=uuid.v4(),P=recursive({iceServers:freeice()},n.configuration),S=n.onicecandidate;S&&this.on("icecandidate",S);var R=n.oncandidategatheringdone;R&&this.on("candidategatheringdone",R);var w=n.simulcast,C=n.multistream,y=new sdpTranslator.Interop,D=[],W=!1;if(Object.defineProperties(this,{peerConnection:{get:function(){return p}},id:{value:n.id||b,writable:!1},remoteVideo:{get:function(){return l}},localVideo:{get:function(){return d}},dataChannel:{get:function(){return s}},currentFrame:{get:function(){if(l){if(l.readyState<l.HAVE_CURRENT_DATA)throw new Error("No video stream data available");var e=document.createElement("canvas");return e.width=l.videoWidth,e.height=l.videoHeight,e.getContext("2d").drawImage(l,0,0),e}}}}),!p&&(p=new RTCPeerConnection(P),v&&!s)){var E="WebRtcPeer-"+c.id,T=void 0;m&&(E=m.id||E,T=m.options),s=p.createDataChannel(E,T),m&&(s.onopen=m.onopen,s.onclose=m.onclose,s.onmessage=m.onmessage,s.onbufferedamountlow=m.onbufferedamountlow,s.onerror=m.onerror||noop)}p.addEventListener("icecandidate",function(e){var n=e.candidate;if(EventEmitter.listenerCount(c,"icecandidate")||EventEmitter.listenerCount(c,"candidategatheringdone"))if(n){var t;t=C&&usePlanB?y.candidateToUnifiedPlan(n):n,c.emit("icecandidate",t),W=!1}else W||(c.emit("candidategatheringdone"),W=!0);else W||(D.push(n),n||(W=!0))}),p.ontrack=n.onaddstream,p.onnegotiationneeded=n.onnegotiationneeded,this.on("newListener",function(e,n){if("icecandidate"===e||"candidategatheringdone"===e)for(;D.length;){var t=D.shift();!t==("candidategatheringdone"===e)&&n(t)}});var k=bufferizeCandidates(p);this.addIceCandidate=function(e,n){var t;t=C&&usePlanB?y.candidateToPlanB(e):new RTCIceCandidate(e),logger.debug("Remote ICE candidate received",e),n=(n||noop).bind(this),k(t,n)},this.generateOffer=function(n){n=n.bind(this);var t=!0,r=!0;g&&(t="boolean"!=typeof g.audio||g.audio,r="boolean"!=typeof g.video||g.video);var o={offerToReceiveAudio:"sendonly"!==e&&t,offerToReceiveVideo:"sendonly"!==e&&r},a=o;logger.info("constraints: "+JSON.stringify(a)),p.createOffer(a).then(function(e){return logger.info("Created SDP offer"),e=i(e),p.setLocalDescription(e)}).then(function(){var e=p.localDescription;logger.info("Local description set",e.sdp),C&&usePlanB&&(e=y.toUnifiedPlan(e),logger.info("offer::origPlanB->UnifiedPlan",dumpSDP(e))),n(null,e.sdp,c.processAnswer.bind(c))}).catch(n)},this.getLocalSessionDescriptor=function(){return p.localDescription},this.getRemoteSessionDescriptor=function(){return p.remoteDescription},this.showLocalVideo=function(){d.src=URL.createObjectURL(u),d.muted=!0},this.send=function(e){s&&"open"===s.readyState?s.send(e):logger.warn("Trying to send data over a non-existing or closed data channel")},this.processAnswer=function(e,n){n=(n||noop).bind(this);var t=new RTCSessionDescription({type:"answer",sdp:e});if(C&&usePlanB){var i=y.toPlanB(t);logger.info("asnwer::planB",dumpSDP(i)),t=i}if(logger.info("SDP answer received, setting remote description"),"closed"===p.signalingState)return n("PeerConnection is closed");p.setRemoteDescription(t,function(){r(),n()},n)},this.processOffer=function(e,n){n=n.bind(this);var t=new RTCSessionDescription({type:"offer",sdp:e});if(C&&usePlanB){var o=y.toPlanB(t);logger.info("offer::planB",dumpSDP(o)),t=o}if(logger.info("SDP offer received, setting remote description"),"closed"===p.signalingState)return n("PeerConnection is closed");p.setRemoteDescription(t).then(function(){return r()}).then(function(){return p.createAnswer()}).then(function(e){return e=i(e),logger.info("Created SDP answer"),p.setLocalDescription(e)}).then(function(){var e=p.localDescription;C&&usePlanB&&(e=y.toUnifiedPlan(e),logger.info("answer::origPlanB->UnifiedPlan",dumpSDP(e))),logger.info("Local description set",e.sdp),n(null,e.sdp)}).catch(n)},"recvonly"===e||u||f?setTimeout(o,0):"webcam"===h?a(g):getScreenConstraints(h,function(e,n){if(e)return t(e);constraints=[g],constraints.unshift(n),a(recursive.apply(void 0,constraints))},b),this.on("_dispose",function(){d&&(d.pause(),d.src="",d.load(),d.muted=!1),l&&(l.pause(),l.src="",l.load()),c.removeAllListeners(),void 0!==window.cancelChooseDesktopMedia&&window.cancelChooseDesktopMedia(b)})}function createEnableDescriptor(e){var n="get"+e+"Tracks";return{enumerable:!0,get:function(){if(this.peerConnection){var e=this.peerConnection.getLocalStreams();if(e.length){for(var t,r=0;t=e[r];r++)for(var i,o=t[n](),a=0;i=o[a];a++)if(!i.enabled)return!1;return!0}}},set:function(e){function t(n){n.enabled=e}this.peerConnection.getLocalStreams().forEach(function(e){e[n]().forEach(t)})}}}function WebRtcPeerRecvonly(e,n){if(!(this instanceof WebRtcPeerRecvonly))return new WebRtcPeerRecvonly(e,n);WebRtcPeerRecvonly.super_.call(this,"recvonly",e,n)}function WebRtcPeerSendonly(e,n){if(!(this instanceof WebRtcPeerSendonly))return new WebRtcPeerSendonly(e,n);WebRtcPeerSendonly.super_.call(this,"sendonly",e,n)}function WebRtcPeerSendrecv(e,n){if(!(this instanceof WebRtcPeerSendrecv))return new WebRtcPeerSendrecv(e,n);WebRtcPeerSendrecv.super_.call(this,"sendrecv",e,n)}function harkUtils(e,n){return hark(e,n)}var freeice=require("freeice"),inherits=require("inherits"),UAParser=require("ua-parser-js"),uuid=require("uuid"),hark=require("hark"),EventEmitter=require("events").EventEmitter,recursive=require("merge").recursive.bind(void 0,!0),sdpTranslator=require("sdp-translator"),logger=window.Logger||console;try{require("kurento-browser-extensions")}catch(e){"undefined"==typeof getScreenConstraints&&(logger.warn("screen sharing is not available"),getScreenConstraints=function(e,n){n(new Error("This library is not enabled for screen sharing"))})}var MEDIA_CONSTRAINTS={audio:!0,video:{width:640,framerate:15}},ua=window&&window.navigator?window.navigator.userAgent:"",parser=new UAParser(ua),browser=parser.getBrowser(),usePlanB=!1;"Chrome"!==browser.name&&"Chromium"!==browser.name||(logger.info(browser.name+": using SDP PlanB"),usePlanB=!0);var dumpSDP=function(e){return void 0===e||null===e?"":"type: "+e.type+"\r\n"+e.sdp};inherits(WebRtcPeer,EventEmitter),Object.defineProperties(WebRtcPeer.prototype,{enabled:{enumerable:!0,get:function(){return this.audioEnabled&&this.videoEnabled},set:function(e){this.audioEnabled=this.videoEnabled=e}},audioEnabled:createEnableDescriptor("Audio"),videoEnabled:createEnableDescriptor("Video")}),WebRtcPeer.prototype.getLocalStream=function(e){if(this.peerConnection)return this.peerConnection.getLocalStreams()[e||0]},WebRtcPeer.prototype.getRemoteStream=function(e){if(this.peerConnection)return this.peerConnection.getRemoteStreams()[e||0]},WebRtcPeer.prototype.dispose=function(){logger.info("Disposing WebRtcPeer");var e=this.peerConnection,n=this.dataChannel;try{if(n){if("closed"===n.signalingState)return;n.close()}if(e){if("closed"===e.signalingState)return;e.getLocalStreams().forEach(streamStop),e.close()}}catch(e){logger.warn("Exception disposing webrtc peer "+e)}this.emit("_dispose")},inherits(WebRtcPeerRecvonly,WebRtcPeer),inherits(WebRtcPeerSendonly,WebRtcPeer),inherits(WebRtcPeerSendrecv,WebRtcPeer),exports.bufferizeCandidates=bufferizeCandidates,exports.WebRtcPeerRecvonly=WebRtcPeerRecvonly,exports.WebRtcPeerSendonly=WebRtcPeerSendonly,exports.WebRtcPeerSendrecv=WebRtcPeerSendrecv,exports.hark=harkUtils; +},{"events":4,"freeice":5,"hark":8,"inherits":9,"kurento-browser-extensions":10,"merge":11,"sdp-translator":18,"ua-parser-js":21,"uuid":23}],2:[function(require,module,exports){ +window.addEventListener&&(module.exports=require("./index")); +},{"./index":3}],3:[function(require,module,exports){ +var WebRtcPeer=require("./WebRtcPeer");exports.WebRtcPeer=WebRtcPeer; +},{"./WebRtcPeer":1}],4:[function(require,module,exports){ +function EventEmitter(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function isFunction(e){return"function"==typeof e}function isNumber(e){return"number"==typeof e}function isObject(e){return"object"==typeof e&&null!==e}function isUndefined(e){return void 0===e}module.exports=EventEmitter,EventEmitter.EventEmitter=EventEmitter,EventEmitter.prototype._events=void 0,EventEmitter.prototype._maxListeners=void 0,EventEmitter.defaultMaxListeners=10,EventEmitter.prototype.setMaxListeners=function(e){if(!isNumber(e)||e<0||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},EventEmitter.prototype.emit=function(e){var t,i,n,s,r,o;if(this._events||(this._events={}),"error"===e&&(!this._events.error||isObject(this._events.error)&&!this._events.error.length)){if((t=arguments[1])instanceof Error)throw t;var h=new Error('Uncaught, unspecified "error" event. ('+t+")");throw h.context=t,h}if(i=this._events[e],isUndefined(i))return!1;if(isFunction(i))switch(arguments.length){case 1:i.call(this);break;case 2:i.call(this,arguments[1]);break;case 3:i.call(this,arguments[1],arguments[2]);break;default:s=Array.prototype.slice.call(arguments,1),i.apply(this,s)}else if(isObject(i))for(s=Array.prototype.slice.call(arguments,1),o=i.slice(),n=o.length,r=0;r<n;r++)o[r].apply(this,s);return!0},EventEmitter.prototype.addListener=function(e,t){var i;if(!isFunction(t))throw TypeError("listener must be a function");return this._events||(this._events={}),this._events.newListener&&this.emit("newListener",e,isFunction(t.listener)?t.listener:t),this._events[e]?isObject(this._events[e])?this._events[e].push(t):this._events[e]=[this._events[e],t]:this._events[e]=t,isObject(this._events[e])&&!this._events[e].warned&&(i=isUndefined(this._maxListeners)?EventEmitter.defaultMaxListeners:this._maxListeners)&&i>0&&this._events[e].length>i&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace()),this},EventEmitter.prototype.on=EventEmitter.prototype.addListener,EventEmitter.prototype.once=function(e,t){function i(){this.removeListener(e,i),n||(n=!0,t.apply(this,arguments))}if(!isFunction(t))throw TypeError("listener must be a function");var n=!1;return i.listener=t,this.on(e,i),this},EventEmitter.prototype.removeListener=function(e,t){var i,n,s,r;if(!isFunction(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(i=this._events[e],s=i.length,n=-1,i===t||isFunction(i.listener)&&i.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(isObject(i)){for(r=s;r-- >0;)if(i[r]===t||i[r].listener&&i[r].listener===t){n=r;break}if(n<0)return this;1===i.length?(i.length=0,delete this._events[e]):i.splice(n,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},EventEmitter.prototype.removeAllListeners=function(e){var t,i;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(i=this._events[e],isFunction(i))this.removeListener(e,i);else if(i)for(;i.length;)this.removeListener(e,i[i.length-1]);return delete this._events[e],this},EventEmitter.prototype.listeners=function(e){return this._events&&this._events[e]?isFunction(this._events[e])?[this._events[e]]:this._events[e].slice():[]},EventEmitter.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(isFunction(t))return 1;if(t)return t.length}return 0},EventEmitter.listenerCount=function(e,t){return e.listenerCount(t)}; +},{}],5:[function(require,module,exports){ +"use strict";var normalice=require("normalice"),freeice=module.exports=function(n){function t(n,t){for(var r,u=[],o=[].concat(e[n]);o.length&&u.length<t;)r=Math.random()*o.length|0,u=u.concat(o.splice(r,1));return u.map(function(t){return"string"==typeof t||t instanceof String?normalice(n+":"+t):t})}var r,e={stun:(n||{}).stun||require("./stun.json"),turn:(n||{}).turn||require("./turn.json")},u=(n||{}).stunCount||2,o=(n||{}).turnCount||0;return r=[].concat(t("stun",u)),o&&(r=r.concat(t("turn",o))),r}; +},{"./stun.json":6,"./turn.json":7,"normalice":12}],6:[function(require,module,exports){ +module.exports=["stun.l.google.com:19302","stun1.l.google.com:19302","stun2.l.google.com:19302","stun3.l.google.com:19302","stun4.l.google.com:19302","stun.ekiga.net","stun.ideasip.com","stun.schlund.de","stun.stunprotocol.org:3478","stun.voiparound.com","stun.voipbuster.com","stun.voipstunt.com","stun.voxgratia.org","stun.services.mozilla.com"] +},{}],7:[function(require,module,exports){ +module.exports=[] +},{}],8:[function(require,module,exports){ +function getMaxVolume(e,t){var i=-1/0;e.getFloatFrequencyData(t);for(var n=4,o=t.length;n<o;n++)t[n]>i&&t[n]<0&&(i=t[n]);return i}var WildEmitter=require("wildemitter"),audioContextType=window.AudioContext||window.webkitAudioContext,audioContext=null;module.exports=function(e,t){var i=new WildEmitter;if(!audioContextType)return i;var t=t||{},n=t.smoothing||.1,o=t.interval||50,a=t.threshold,r=t.play,s=t.history||10,u=!0;audioContext||(audioContext=new audioContextType);var p,g,d;d=audioContext.createAnalyser(),d.fftSize=512,d.smoothingTimeConstant=n,g=new Float32Array(d.fftSize),e.jquery&&(e=e[0]),e instanceof HTMLAudioElement||e instanceof HTMLVideoElement?(p=audioContext.createMediaElementSource(e),void 0===r&&(r=!0),a=a||-50):(p=audioContext.createMediaStreamSource(e),a=a||-50),p.connect(d),r&&d.connect(audioContext.destination),i.speaking=!1,i.setThreshold=function(e){a=e},i.setInterval=function(e){o=e},i.stop=function(){u=!1,i.emit("volume_change",-100,a),i.speaking&&(i.speaking=!1,i.emit("stopped_speaking"))},i.speakingHistory=[];for(var l=0;l<s;l++)i.speakingHistory.push(0);var f=function(){setTimeout(function(){if(u){var e=getMaxVolume(d,g);i.emit("volume_change",e,a);var t=0;if(e>a&&!i.speaking){for(var n=i.speakingHistory.length-3;n<i.speakingHistory.length;n++)t+=i.speakingHistory[n];t>=2&&(i.speaking=!0,i.emit("speaking"))}else if(e<a&&i.speaking){for(var n=0;n<i.speakingHistory.length;n++)t+=i.speakingHistory[n];0==t&&(i.speaking=!1,i.emit("stopped_speaking"))}i.speakingHistory.shift(),i.speakingHistory.push(0+(e>a)),f()}},o)};return f(),i}; +},{"wildemitter":24}],9:[function(require,module,exports){ +"function"==typeof Object.create?module.exports=function(t,e){t.super_=e,t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}})}:module.exports=function(t,e){t.super_=e;var o=function(){};o.prototype=e.prototype,t.prototype=new o,t.prototype.constructor=t}; +},{}],10:[function(require,module,exports){ + +},{}],11:[function(require,module,exports){ +!function(e){function o(e,r){if("object"!==n(e))return r;for(var t in r)"object"===n(e[t])&&"object"===n(r[t])?e[t]=o(e[t],r[t]):e[t]=r[t];return e}function r(e,r,c){var u=c[0],f=c.length;(e||"object"!==n(u))&&(u={});for(var i=0;i<f;++i){var l=c[i];if("object"===n(l))for(var a in l){var v=e?t.clone(l[a]):l[a];u[a]=r?o(u[a],v):v}}return u}function n(e){return{}.toString.call(e).slice(8,-1).toLowerCase()}var t=function(e){return r(!0===e,!1,arguments)};t.recursive=function(e){return r(!0===e,!0,arguments)},t.clone=function(e){var o,r,c=e,u=n(e);if("array"===u)for(c=[],r=e.length,o=0;o<r;++o)c[o]=t.clone(e[o]);else if("object"===u){c={};for(o in e)c[o]=t.clone(e[o])}return c},e?module.exports=t:window.merge=t}("object"==typeof module&&module&&"object"==typeof module.exports&&module.exports); +},{}],12:[function(require,module,exports){ +var protocols=["stun:","turn:"];module.exports=function(e){var r,t,n=(e||{}).url||e,l={};return"string"==typeof n||n instanceof String?(n=n.trim(),(r=protocols[protocols.indexOf(n.slice(0,5))])?(n=n.slice(5),t=n.split("@"),l.username=e.username,l.credential=e.credential,t.length>1&&(n=t[1],t=t[0].split(":"),l.username=t[0],l.credential=(e||{}).credential||t[1]||""),l.url=r+n,l.urls=[l.url],l):e):e}; +},{}],13:[function(require,module,exports){ +var grammar=module.exports={v:[{name:"version",reg:/^(\d*)$/}],o:[{name:"origin",reg:/^(\S*) (\d*) (\d*) (\S*) IP(\d) (\S*)/,names:["username","sessionId","sessionVersion","netType","ipVer","address"],format:"%s %s %d %s IP%d %s"}],s:[{name:"name"}],i:[{name:"description"}],u:[{name:"uri"}],e:[{name:"email"}],p:[{name:"phone"}],z:[{name:"timezones"}],r:[{name:"repeats"}],t:[{name:"timing",reg:/^(\d*) (\d*)/,names:["start","stop"],format:"%d %d"}],c:[{name:"connection",reg:/^IN IP(\d) (\S*)/,names:["version","ip"],format:"IN IP%d %s"}],b:[{push:"bandwidth",reg:/^(TIAS|AS|CT|RR|RS):(\d*)/,names:["type","limit"],format:"%s:%s"}],m:[{reg:/^(\w*) (\d*) ([\w\/]*)(?: (.*))?/,names:["type","port","protocol","payloads"],format:"%s %d %s %s"}],a:[{push:"rtp",reg:/^rtpmap:(\d*) ([\w\-]*)(?:\s*\/(\d*)(?:\s*\/(\S*))?)?/,names:["payload","codec","rate","encoding"],format:function(e){return e.encoding?"rtpmap:%d %s/%s/%s":e.rate?"rtpmap:%d %s/%s":"rtpmap:%d %s"}},{push:"fmtp",reg:/^fmtp:(\d*) ([\S| ]*)/,names:["payload","config"],format:"fmtp:%d %s"},{name:"control",reg:/^control:(.*)/,format:"control:%s"},{name:"rtcp",reg:/^rtcp:(\d*)(?: (\S*) IP(\d) (\S*))?/,names:["port","netType","ipVer","address"],format:function(e){return null!=e.address?"rtcp:%d %s IP%d %s":"rtcp:%d"}},{push:"rtcpFbTrrInt",reg:/^rtcp-fb:(\*|\d*) trr-int (\d*)/,names:["payload","value"],format:"rtcp-fb:%d trr-int %d"},{push:"rtcpFb",reg:/^rtcp-fb:(\*|\d*) ([\w-_]*)(?: ([\w-_]*))?/,names:["payload","type","subtype"],format:function(e){return null!=e.subtype?"rtcp-fb:%s %s %s":"rtcp-fb:%s %s"}},{push:"ext",reg:/^extmap:([\w_\/]*) (\S*)(?: (\S*))?/,names:["value","uri","config"],format:function(e){return null!=e.config?"extmap:%s %s %s":"extmap:%s %s"}},{push:"crypto",reg:/^crypto:(\d*) ([\w_]*) (\S*)(?: (\S*))?/,names:["id","suite","config","sessionConfig"],format:function(e){return null!=e.sessionConfig?"crypto:%d %s %s %s":"crypto:%d %s %s"}},{name:"setup",reg:/^setup:(\w*)/,format:"setup:%s"},{name:"mid",reg:/^mid:([^\s]*)/,format:"mid:%s"},{name:"msid",reg:/^msid:(.*)/,format:"msid:%s"},{name:"ptime",reg:/^ptime:(\d*)/,format:"ptime:%d"},{name:"maxptime",reg:/^maxptime:(\d*)/,format:"maxptime:%d"},{name:"direction",reg:/^(sendrecv|recvonly|sendonly|inactive)/},{name:"icelite",reg:/^(ice-lite)/},{name:"iceUfrag",reg:/^ice-ufrag:(\S*)/,format:"ice-ufrag:%s"},{name:"icePwd",reg:/^ice-pwd:(\S*)/,format:"ice-pwd:%s"},{name:"fingerprint",reg:/^fingerprint:(\S*) (\S*)/,names:["type","hash"],format:"fingerprint:%s %s"},{push:"candidates",reg:/^candidate:(\S*) (\d*) (\S*) (\d*) (\S*) (\d*) typ (\S*)(?: raddr (\S*) rport (\d*))?(?: tcptype (\S*))?(?: generation (\d*))?/,names:["foundation","component","transport","priority","ip","port","type","raddr","rport","tcptype","generation"],format:function(e){var r="candidate:%s %d %s %d %s %d typ %s";return r+=null!=e.raddr?" raddr %s rport %d":"%v%v",r+=null!=e.tcptype?" tcptype %s":"%v",null!=e.generation&&(r+=" generation %d"),r}},{name:"endOfCandidates",reg:/^(end-of-candidates)/},{name:"remoteCandidates",reg:/^remote-candidates:(.*)/,format:"remote-candidates:%s"},{name:"iceOptions",reg:/^ice-options:(\S*)/,format:"ice-options:%s"},{push:"ssrcs",reg:/^ssrc:(\d*) ([\w_]*):(.*)/,names:["id","attribute","value"],format:"ssrc:%d %s:%s"},{push:"ssrcGroups",reg:/^ssrc-group:(\w*) (.*)/,names:["semantics","ssrcs"],format:"ssrc-group:%s %s"},{name:"msidSemantic",reg:/^msid-semantic:\s?(\w*) (\S*)/,names:["semantic","token"],format:"msid-semantic: %s %s"},{push:"groups",reg:/^group:(\w*) (.*)/,names:["type","mids"],format:"group:%s %s"},{name:"rtcpMux",reg:/^(rtcp-mux)/},{name:"rtcpRsize",reg:/^(rtcp-rsize)/},{push:"invalid",names:["value"]}]};Object.keys(grammar).forEach(function(e){grammar[e].forEach(function(e){e.reg||(e.reg=/(.*)/),e.format||(e.format="%s")})}); +},{}],14:[function(require,module,exports){ +var parser=require("./parser"),writer=require("./writer");exports.write=writer,exports.parse=parser.parse,exports.parseFmtpConfig=parser.parseFmtpConfig,exports.parsePayloads=parser.parsePayloads,exports.parseRemoteCandidates=parser.parseRemoteCandidates; +},{"./parser":15,"./writer":16}],15:[function(require,module,exports){ +var toIntIfInt=function(t){return String(Number(t))===t?Number(t):t},attachProperties=function(t,r,e,n){if(n&&!e)r[n]=toIntIfInt(t[1]);else for(var a=0;a<e.length;a+=1)null!=t[a+1]&&(r[e[a]]=toIntIfInt(t[a+1]))},parseReg=function(t,r,e){var n=t.name&&t.names;t.push&&!r[t.push]?r[t.push]=[]:n&&!r[t.name]&&(r[t.name]={});var a=t.push?{}:n?r[t.name]:r;attachProperties(e.match(t.reg),a,t.names,t.name),t.push&&r[t.push].push(a)},grammar=require("./grammar"),validLine=RegExp.prototype.test.bind(/^([a-z])=(.*)/);exports.parse=function(t){var r={},e=[],n=r;return t.split(/(\r\n|\r|\n)/).filter(validLine).forEach(function(t){var r=t[0],a=t.slice(2);"m"===r&&(e.push({rtp:[],fmtp:[]}),n=e[e.length-1]);for(var p=0;p<(grammar[r]||[]).length;p+=1){var s=grammar[r][p];if(s.reg.test(a))return parseReg(s,n,a)}}),r.media=e,r};var fmtpReducer=function(t,r){var e=r.split("=");return 2===e.length&&(t[e[0]]=toIntIfInt(e[1])),t};exports.parseFmtpConfig=function(t){return t.split(/\;\s?/).reduce(fmtpReducer,{})},exports.parsePayloads=function(t){return t.split(" ").map(Number)},exports.parseRemoteCandidates=function(t){for(var r=[],e=t.split(" ").map(toIntIfInt),n=0;n<e.length;n+=3)r.push({component:e[n],ip:e[n+1],port:e[n+2]});return r}; +},{"./grammar":13}],16:[function(require,module,exports){ +var grammar=require("./grammar"),formatRegExp=/%[sdv%]/g,format=function(n){var r=1,e=arguments,a=e.length;return n.replace(formatRegExp,function(n){if(r>=a)return n;var u=e[r];switch(r+=1,n){case"%%":return"%";case"%s":return String(u);case"%d":return Number(u);case"%v":return""}})},makeLine=function(n,r,e){var a=r.format instanceof Function?r.format(r.push?e:e[r.name]):r.format,u=[n+"="+a];if(r.names)for(var m=0;m<r.names.length;m+=1){var t=r.names[m];r.name?u.push(e[r.name][t]):u.push(e[r.names[m]])}else u.push(e[r.name]);return format.apply(null,u)},defaultOuterOrder=["v","o","s","i","u","e","p","c","b","t","r","z","a"],defaultInnerOrder=["i","c","b","a"];module.exports=function(n,r){r=r||{},null==n.version&&(n.version=0),null==n.name&&(n.name=" "),n.media.forEach(function(n){null==n.payloads&&(n.payloads="")});var e=r.outerOrder||defaultOuterOrder,a=r.innerOrder||defaultInnerOrder,u=[];return e.forEach(function(r){grammar[r].forEach(function(e){e.name in n&&null!=n[e.name]?u.push(makeLine(r,e,n)):e.push in n&&null!=n[e.push]&&n[e.push].forEach(function(n){u.push(makeLine(r,e,n))})})}),n.media.forEach(function(n){u.push(makeLine("m",grammar.m[0],n)),a.forEach(function(r){grammar[r].forEach(function(e){e.name in n&&null!=n[e.name]?u.push(makeLine(r,e,n)):e.push in n&&null!=n[e.push]&&n[e.push].forEach(function(n){u.push(makeLine(r,e,n))})})})}),u.join("\r\n")+"\r\n"}; +},{"./grammar":13}],17:[function(require,module,exports){ +module.exports=function r(t){if(!t)return!1;if(this.length!=t.length)return!1;for(var e=0,n=this.length;e<n;e++)if(this[e]instanceof Array&&t[e]instanceof Array){if(!r.apply(this[e],[t[e]]))return!1}else if(this[e]!=t[e])return!1;return!0}; +},{}],18:[function(require,module,exports){ +exports.Interop=require("./interop"); +},{"./interop":19}],19:[function(require,module,exports){ +"use strict";function Interop(){this.cache={mlB2UMap:{},mlU2BMap:{}}}function addSetupAttr(e){void 0!==e.setup&&("active"===e.setup?e.setup="passive":"passive"===e.setup&&(e.setup="active"))}var transform=require("./transform"),arrayEquals=require("./array-equals");module.exports=Interop,Interop.prototype.candidateToUnifiedPlan=function(e){var r=new RTCIceCandidate(e);return r.sdpMLineIndex=this.cache.mlB2UMap[r.sdpMLineIndex],r},Interop.prototype.candidateToPlanB=function(e){var r=new RTCIceCandidate(e);if(0===r.sdpMid.indexOf("audio"))r.sdpMid="audio";else{if(0!==r.sdpMid.indexOf("video"))throw new Error("candidate with "+r.sdpMid+" not allowed");r.sdpMid="video"}return r.sdpMLineIndex=this.cache.mlU2BMap[r.sdpMLineIndex],r},Interop.prototype.getFirstSendingIndexFromAnswer=function(e){if(!this.cache.answer)return null;var r=transform.parse(this.cache.answer);if(r&&r.media&&Array.isArray(r.media))for(var i=0;i<r.media.length;i++)if(r.media[i].type==e&&(!r.media[i].direction||"sendrecv"===r.media[i].direction||"sendonly"===r.media[i].direction))return i;return null},Interop.prototype.toPlanB=function(e){var r=this;if("object"!=typeof e||null===e||"string"!=typeof e.sdp)return console.warn("An empty description was passed as an argument."),e;var i=transform.parse(e.sdp);if(void 0===i.media||!Array.isArray(i.media)||0===i.media.length)return console.warn("The description has no media."),e;if(i.media.length<=3&&i.media.every(function(e){return-1!==["video","audio","data"].indexOf(e.mid)}))return console.warn("This description does not look like Unified Plan."),e;for(var t=e.sdp,o=!1,n=0;n<i.media.length;n++){i.media[n].rtp.forEach(function(e){if("NULL"===e.codec){o=!0;var i=transform.parse(r.cache.offer);e.codec=i.media[n].rtp[0].codec}})}o&&(t=transform.write(i)),this.cache[e.type]=t;var s=i.media;i.media=[];var a={},d=[];s.forEach(function(e){if(("string"!=typeof e.rtcpMux||"rtcp-mux"!==e.rtcpMux)&&"inactive"!==e.direction)throw new Error("Cannot convert to Plan B because m-lines without the rtcp-mux attribute were found.");if(void 0!==a[e.type]&&"inactive"!==a[e.type].direction||(a[e.type]=e),e.protocol!=a[e.type].protocol)throw new Error("Cannot convert to Plan B because m-lines have different protocols and this library does not have support for that");if(e.payloads!=a[e.type].payloads)throw new Error("Cannot convert to Plan B because m-lines have different payloads and this library does not have support for that")}),s.forEach(function(e){if("application"===e.type)return i.media.push(e),void d.push(e.mid);"object"==typeof e.sources&&Object.keys(e.sources).forEach(function(r){"object"!=typeof a[e.type].sources&&(a[e.type].sources={}),a[e.type].sources[r]=e.sources[r],void 0!==e.msid&&(a[e.type].sources[r].msid=e.msid)}),void 0!==e.ssrcGroups&&Array.isArray(e.ssrcGroups)&&(void 0!==a[e.type].ssrcGroups&&Array.isArray(a[e.type].ssrcGroups)||(a[e.type].ssrcGroups=[]),a[e.type].ssrcGroups=a[e.type].ssrcGroups.concat(e.ssrcGroups)),a[e.type]===e&&(e.mid=e.type,delete e.bundleOnly,delete e.msid,e.type==s[0].type?(d.unshift(e.type),i.media.unshift(e)):(d.push(e.type),i.media.push(e)))}),void 0!==i.groups&&i.groups.some(function(e){if("BUNDLE"===e.type)return e.mids=d.join(" "),!0}),i.msidSemantic={semantic:"WMS",token:"*"};var c=transform.write(i);return new RTCSessionDescription({type:e.type,sdp:c})},Interop.prototype.toUnifiedPlan=function(e){var r=this;if("object"!=typeof e||null===e||"string"!=typeof e.sdp)return console.warn("An empty description was passed as an argument."),e;var i=transform.parse(e.sdp);if(void 0===i.media||!Array.isArray(i.media)||0===i.media.length)return console.warn("The description has no media."),e;if(i.media.length>3||!i.media.every(function(e){return-1!==["video","audio","data"].indexOf(e.mid)}))return console.warn("This description does not look like Plan B."),e;var t=[];i.media.forEach(function(e){t.push(e.mid)});var o=!1;if(void 0!==i.groups&&Array.isArray(i.groups)&&(o=i.groups.every(function(e){return"BUNDLE"!==e.type||arrayEquals.apply(e.mids.sort(),[t.sort()])})),!o){var n=!1;if(i.media.forEach(function(e){"inactive"!==e.direction&&(n=!0)}),n)throw new Error("Cannot convert to Unified Plan because m-lines that are not bundled were found.")}var s;if("answer"===e.type)s="offer";else{if("offer"!==e.type)throw new Error("Type '"+e.type+"' not supported.");s="answer"}var a;void 0!==this.cache[s]&&(a=transform.parse(this.cache[s]));var d,c,p,u,f={audio:{},video:{}},m={},y=0,l=0,v={},h={},w={},g={};if(i.media.forEach(function(i){if(("string"!=typeof i.rtcpMux||"rtcp-mux"!==i.rtcpMux)&&"inactive"!==i.direction)throw new Error("Cannot convert to Unified Plan because m-lines without the rtcp-mux attribute were found.");if("application"===i.type)return void(m[i.mid]=i);var t=i.sources,o=i.ssrcGroups,n=i.port;if(void 0!==i.candidates&&(d=void 0!==d?d.concat(i.candidates):i.candidates),void 0!==c&&void 0!==i.iceUfrag&&c!=i.iceUfrag)throw new Error("Only BUNDLE supported, iceUfrag must be the same for all m-lines.\n\tLast iceUfrag: "+c+"\n\tNew iceUfrag: "+i.iceUfrag);if(void 0!==i.iceUfrag&&(c=i.iceUfrag),void 0!==p&&void 0!==i.icePwd&&p!=i.icePwd)throw new Error("Only BUNDLE supported, icePwd must be the same for all m-lines.\n\tLast icePwd: "+p+"\n\tNew icePwd: "+i.icePwd);if(void 0!==i.icePwd&&(p=i.icePwd),void 0!==u&&void 0!==i.fingerprint&&(u.type!=i.fingerprint.type||u.hash!=i.fingerprint.hash))throw new Error("Only BUNDLE supported, fingerprint must be the same for all m-lines.\n\tLast fingerprint: "+JSON.stringify(u)+"\n\tNew fingerprint: "+JSON.stringify(i.fingerprint));void 0!==i.fingerprint&&(u=i.fingerprint),h[i.type]=i.payloads,w[i.type]=i.rtcpFb,g[i.type]=i.rtp;var s={};void 0!==o&&Array.isArray(o)&&o.forEach(function(e){void 0!==e.ssrcs&&Array.isArray(e.ssrcs)&&e.ssrcs.forEach(function(r){void 0===s[r]&&(s[r]=[]),s[r].push(e)})});var E={};if("object"==typeof t)delete i.sources,delete i.ssrcGroups,delete i.candidates,delete i.iceUfrag,delete i.icePwd,delete i.fingerprint,delete i.port,delete i.mid,Object.keys(t).forEach(function(o){var h;if("offer"===e.type&&!t[o].msid)return void(f[i.type][o]=t[o]);void 0!==s[o]&&Array.isArray(s[o])&&s[o].some(function(e){return e.ssrcs.some(function(e){if("object"==typeof E[e])return h=E[e],!0})}),"object"==typeof h?(h.sources[o]=t[o],delete t[o].msid):(h=Object.create(i),E[o]=h,void 0!==t[o].msid&&(h.msid=t[o].msid,delete t[o].msid),h.sources={},h.sources[o]=t[o],h.ssrcGroups=s[o],void 0!==a&&void 0!==a.media&&Array.isArray(a.media)&&a.media.forEach(function(e){"object"==typeof e.sources&&Object.keys(e.sources).forEach(function(r){r===o&&(h.mid=e.mid)})}),void 0===h.mid&&(h.mid=[i.type,"-",o].join("")),h.candidates=d,h.iceUfrag=c,h.icePwd=p,h.fingerprint=u,h.port=n,m[h.mid]=h,v[l]=h.sources,r.cache.mlU2BMap[l]=y,void 0===r.cache.mlB2UMap[y]&&(r.cache.mlB2UMap[y]=l),l++)});else{var U=i;U.candidates=d,U.iceUfrag=c,U.icePwd=p,U.fingerprint=u,U.port=n,m[U.mid]=U,r.cache.mlU2BMap[l]=y,void 0===r.cache.mlB2UMap[y]&&(r.cache.mlB2UMap[y]=l)}y++}),i.media=[],t=[],"answer"===e.type)for(var E=0;E<a.media.length;E++){var U=a.media[E];delete U.msid,delete U.sources,delete U.ssrcGroups,void 0===v[E]?U.direction&&"sendrecv"!==U.direction?"sendonly"===U.direction&&(U.direction="inactive"):U.direction="recvonly":U.direction&&"sendrecv"!==U.direction?"recvonly"===U.direction&&(U.direction="sendonly"):U.direction="sendrecv",U.sources=v[E],U.candidates=d,U.iceUfrag=c,U.icePwd=p,U.fingerprint=u,U.rtp=g[U.type],U.payloads=h[U.type],U.rtcpFb=w[U.type],i.media.push(U),"string"==typeof U.mid&&t.push(U.mid)}else void 0!==a&&void 0!==a.media&&Array.isArray(a.media)&&a.media.forEach(function(e){t.push(e.mid),void 0!==m[e.mid]?i.media.push(m[e.mid]):(delete e.msid,delete e.sources,delete e.ssrcGroups,e.direction&&"sendrecv"!==e.direction||(e.direction="sendonly"),e.direction&&"recvonly"!==e.direction||(e.direction="inactive"),addSetupAttr(e),i.media.push(e))}),Object.keys(m).forEach(function(e){if(-1===t.indexOf(e))if(t.push(e),"recvonly"===m[e].direction){var r=!1;i.media.some(function(i){if(("sendrecv"===i.direction||"sendonly"===i.direction)&&i.type===m[e].type)return Object.keys(m[e].sources).forEach(function(r){i.sources[r]=m[e].sources[r]}),r=!0,!0}),r||i.media.push(m[e])}else i.media.push(m[e])});["audio","video"].forEach(function(e){if(i&&i.media&&Array.isArray(i.media)){var t=null;if(Object.keys(f[e]).length>0&&null===(t=r.getFirstSendingIndexFromAnswer(e)))for(var o=0;o<i.media.length;o++)if(i.media[o].type===e){t=o;break}if(t&&i.media.length>t){var n=i.media[t];Object.keys(f[e]).forEach(function(r){n.sources&&n.sources[r]&&console.warn("Replacing an existing SSRC."),n.sources||(n.sources={}),n.sources[r]=f[e][r]})}}}),void 0!==i.groups&&i.groups.some(function(e){if("BUNDLE"===e.type)return e.mids=t.join(" "),!0}),i.msidSemantic={semantic:"WMS",token:"*"};var b=transform.write(i);return this.cache[e.type]=b,new RTCSessionDescription({type:e.type,sdp:b})}; +},{"./array-equals":17,"./transform":20}],20:[function(require,module,exports){ +var transform=require("sdp-transform");exports.write=function(s,r){return void 0!==s&&void 0!==s.media&&Array.isArray(s.media)&&s.media.forEach(function(s){void 0!==s.sources&&0!==Object.keys(s.sources).length&&(s.ssrcs=[],Object.keys(s.sources).forEach(function(r){var o=s.sources[r];Object.keys(o).forEach(function(i){s.ssrcs.push({id:r,attribute:i,value:o[i]})})}),delete s.sources),void 0!==s.ssrcGroups&&Array.isArray(s.ssrcGroups)&&s.ssrcGroups.forEach(function(s){void 0!==s.ssrcs&&Array.isArray(s.ssrcs)&&(s.ssrcs=s.ssrcs.join(" "))})}),void 0!==s&&void 0!==s.groups&&Array.isArray(s.groups)&&s.groups.forEach(function(s){void 0!==s.mids&&Array.isArray(s.mids)&&(s.mids=s.mids.join(" "))}),transform.write(s,r)},exports.parse=function(s){var r=transform.parse(s);return void 0!==r&&void 0!==r.media&&Array.isArray(r.media)&&r.media.forEach(function(s){void 0!==s.ssrcs&&Array.isArray(s.ssrcs)&&(s.sources={},s.ssrcs.forEach(function(r){s.sources[r.id]||(s.sources[r.id]={}),s.sources[r.id][r.attribute]=r.value}),delete s.ssrcs),void 0!==s.ssrcGroups&&Array.isArray(s.ssrcGroups)&&s.ssrcGroups.forEach(function(s){"string"==typeof s.ssrcs&&(s.ssrcs=s.ssrcs.split(" "))})}),void 0!==r&&void 0!==r.groups&&Array.isArray(r.groups)&&r.groups.forEach(function(s){"string"==typeof s.mids&&(s.mids=s.mids.split(" "))}),r}; +},{"sdp-transform":14}],21:[function(require,module,exports){ +!function(i,e){"use strict";var s="model",o="name",r="type",n="vendor",a="version",t="mobile",w="tablet",d={extend:function(i,e){var s={};for(var o in i)e[o]&&e[o].length%2==0?s[o]=e[o].concat(i[o]):s[o]=i[o];return s},has:function(i,e){return"string"==typeof i&&-1!==e.toLowerCase().indexOf(i.toLowerCase())},lowerize:function(i){return i.toLowerCase()},major:function(i){return"string"==typeof i?i.replace(/[^\d\.]/g,"").split(".")[0]:void 0},trim:function(i){return i.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}},l={rgx:function(){for(var i,e,s,o,r,n,a,t=0,w=arguments;t<w.length&&!n;){var d=w[t],l=w[t+1];if(void 0===i){i={};for(o in l)l.hasOwnProperty(o)&&(r=l[o],"object"==typeof r?i[r[0]]=void 0:i[r]=void 0)}for(e=s=0;e<d.length&&!n;)if(n=d[e++].exec(this.getUA()))for(o=0;o<l.length;o++)a=n[++s],r=l[o],"object"==typeof r&&r.length>0?2==r.length?"function"==typeof r[1]?i[r[0]]=r[1].call(this,a):i[r[0]]=r[1]:3==r.length?"function"!=typeof r[1]||r[1].exec&&r[1].test?i[r[0]]=a?a.replace(r[1],r[2]):void 0:i[r[0]]=a?r[1].call(this,a,r[2]):void 0:4==r.length&&(i[r[0]]=a?r[3].call(this,a.replace(r[1],r[2])):void 0):i[r]=a||void 0;t+=2}return i},str:function(i,e){for(var s in e)if("object"==typeof e[s]&&e[s].length>0){for(var o=0;o<e[s].length;o++)if(d.has(e[s][o],i))return"?"===s?void 0:s}else if(d.has(e[s],i))return"?"===s?void 0:s;return i}},c={browser:{oldsafari:{version:{"1.0":"/8",1.2:"/1",1.3:"/3","2.0":"/412","2.0.2":"/416","2.0.3":"/417","2.0.4":"/419","?":"/"}}},device:{amazon:{model:{"Fire Phone":["SD","KF"]}},sprint:{model:{"Evo Shift 4G":"7373KT"},vendor:{HTC:"APA",Sprint:"Sprint"}}},os:{windows:{version:{ME:"4.90","NT 3.11":"NT3.51","NT 4.0":"NT4.0",2000:"NT 5.0",XP:["NT 5.1","NT 5.2"],Vista:"NT 6.0",7:"NT 6.1",8:"NT 6.2",8.1:"NT 6.3",10:["NT 6.4","NT 10.0"],RT:"ARM"}}}},u={browser:[[/(opera\smini)\/([\w\.-]+)/i,/(opera\s[mobiletab]+).+version\/([\w\.-]+)/i,/(opera).+version\/([\w\.]+)/i,/(opera)[\/\s]+([\w\.]+)/i],[o,a],[/(opios)[\/\s]+([\w\.]+)/i],[[o,"Opera Mini"],a],[/\s(opr)\/([\w\.]+)/i],[[o,"Opera"],a],[/(kindle)\/([\w\.]+)/i,/(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?([\w\.]+)*/i,/(avant\s|iemobile|slim|baidu)(?:browser)?[\/\s]?([\w\.]*)/i,/(?:ms|\()(ie)\s([\w\.]+)/i,/(rekonq)\/([\w\.]+)*/i,/(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs)\/([\w\.-]+)/i],[o,a],[/(trident).+rv[:\s]([\w\.]+).+like\sgecko/i],[[o,"IE"],a],[/(edge)\/((\d+)?[\w\.]+)/i],[o,a],[/(yabrowser)\/([\w\.]+)/i],[[o,"Yandex"],a],[/(comodo_dragon)\/([\w\.]+)/i],[[o,/_/g," "],a],[/(micromessenger)\/([\w\.]+)/i],[[o,"WeChat"],a],[/xiaomi\/miuibrowser\/([\w\.]+)/i],[a,[o,"MIUI Browser"]],[/\swv\).+(chrome)\/([\w\.]+)/i],[[o,/(.+)/,"$1 WebView"],a],[/android.+samsungbrowser\/([\w\.]+)/i,/android.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)*/i],[a,[o,"Android Browser"]],[/(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i,/(qqbrowser)[\/\s]?([\w\.]+)/i],[o,a],[/(uc\s?browser)[\/\s]?([\w\.]+)/i,/ucweb.+(ucbrowser)[\/\s]?([\w\.]+)/i,/juc.+(ucweb)[\/\s]?([\w\.]+)/i],[[o,"UCBrowser"],a],[/(dolfin)\/([\w\.]+)/i],[[o,"Dolphin"],a],[/((?:android.+)crmo|crios)\/([\w\.]+)/i],[[o,"Chrome"],a],[/;fbav\/([\w\.]+);/i],[a,[o,"Facebook"]],[/fxios\/([\w\.-]+)/i],[a,[o,"Firefox"]],[/version\/([\w\.]+).+?mobile\/\w+\s(safari)/i],[a,[o,"Mobile Safari"]],[/version\/([\w\.]+).+?(mobile\s?safari|safari)/i],[a,o],[/webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i],[o,[a,l.str,c.browser.oldsafari.version]],[/(konqueror)\/([\w\.]+)/i,/(webkit|khtml)\/([\w\.]+)/i],[o,a],[/(navigator|netscape)\/([\w\.-]+)/i],[[o,"Netscape"],a],[/(swiftfox)/i,/(icedragon|iceweasel|camino|chimera|fennec|maemo\sbrowser|minimo|conkeror)[\/\s]?([\w\.\+]+)/i,/(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix)\/([\w\.-]+)/i,/(mozilla)\/([\w\.]+).+rv\:.+gecko\/\d+/i,/(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir)[\/\s]?([\w\.]+)/i,/(links)\s\(([\w\.]+)/i,/(gobrowser)\/?([\w\.]+)*/i,/(ice\s?browser)\/v?([\w\._]+)/i,/(mosaic)[\/\s]([\w\.]+)/i],[o,a]],cpu:[[/(?:(amd|x(?:(?:86|64)[_-])?|wow|win)64)[;\)]/i],[["architecture","amd64"]],[/(ia32(?=;))/i],[["architecture",d.lowerize]],[/((?:i[346]|x)86)[;\)]/i],[["architecture","ia32"]],[/windows\s(ce|mobile);\sppc;/i],[["architecture","arm"]],[/((?:ppc|powerpc)(?:64)?)(?:\smac|;|\))/i],[["architecture",/ower/,"",d.lowerize]],[/(sun4\w)[;\)]/i],[["architecture","sparc"]],[/((?:avr32|ia64(?=;))|68k(?=\))|arm(?:64|(?=v\d+;))|(?=atmel\s)avr|(?:irix|mips|sparc)(?:64)?(?=;)|pa-risc)/i],[["architecture",d.lowerize]]],device:[[/\((ipad|playbook);[\w\s\);-]+(rim|apple)/i],[s,n,[r,w]],[/applecoremedia\/[\w\.]+ \((ipad)/],[s,[n,"Apple"],[r,w]],[/(apple\s{0,1}tv)/i],[[s,"Apple TV"],[n,"Apple"]],[/(archos)\s(gamepad2?)/i,/(hp).+(touchpad)/i,/(hp).+(tablet)/i,/(kindle)\/([\w\.]+)/i,/\s(nook)[\w\s]+build\/(\w+)/i,/(dell)\s(strea[kpr\s\d]*[\dko])/i],[n,s,[r,w]],[/(kf[A-z]+)\sbuild\/[\w\.]+.*silk\//i],[s,[n,"Amazon"],[r,w]],[/(sd|kf)[0349hijorstuw]+\sbuild\/[\w\.]+.*silk\//i],[[s,l.str,c.device.amazon.model],[n,"Amazon"],[r,t]],[/\((ip[honed|\s\w*]+);.+(apple)/i],[s,n,[r,t]],[/\((ip[honed|\s\w*]+);/i],[s,[n,"Apple"],[r,t]],[/(blackberry)[\s-]?(\w+)/i,/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|huawei|meizu|motorola|polytron)[\s_-]?([\w-]+)*/i,/(hp)\s([\w\s]+\w)/i,/(asus)-?(\w+)/i],[n,s,[r,t]],[/\(bb10;\s(\w+)/i],[s,[n,"BlackBerry"],[r,t]],[/android.+(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus 7|padfone)/i],[s,[n,"Asus"],[r,w]],[/(sony)\s(tablet\s[ps])\sbuild\//i,/(sony)?(?:sgp.+)\sbuild\//i],[[n,"Sony"],[s,"Xperia Tablet"],[r,w]],[/(?:sony)?(?:(?:(?:c|d)\d{4})|(?:so[-l].+))\sbuild\//i],[[n,"Sony"],[s,"Xperia Phone"],[r,t]],[/\s(ouya)\s/i,/(nintendo)\s([wids3u]+)/i],[n,s,[r,"console"]],[/android.+;\s(shield)\sbuild/i],[s,[n,"Nvidia"],[r,"console"]],[/(playstation\s[34portablevi]+)/i],[s,[n,"Sony"],[r,"console"]],[/(sprint\s(\w+))/i],[[n,l.str,c.device.sprint.vendor],[s,l.str,c.device.sprint.model],[r,t]],[/(lenovo)\s?(S(?:5000|6000)+(?:[-][\w+]))/i],[n,s,[r,w]],[/(htc)[;_\s-]+([\w\s]+(?=\))|\w+)*/i,/(zte)-(\w+)*/i,/(alcatel|geeksphone|huawei|lenovo|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]+)*/i],[n,[s,/_/g," "],[r,t]],[/(nexus\s9)/i],[s,[n,"HTC"],[r,w]],[/(nexus\s6p)/i],[s,[n,"Huawei"],[r,t]],[/(microsoft);\s(lumia[\s\w]+)/i],[n,s,[r,t]],[/[\s\(;](xbox(?:\sone)?)[\s\);]/i],[s,[n,"Microsoft"],[r,"console"]],[/(kin\.[onetw]{3})/i],[[s,/\./g," "],[n,"Microsoft"],[r,t]],[/\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?(:?\s4g)?)[\w\s]+build\//i,/mot[\s-]?(\w+)*/i,/(XT\d{3,4}) build\//i,/(nexus\s6)/i],[s,[n,"Motorola"],[r,t]],[/android.+\s(mz60\d|xoom[\s2]{0,2})\sbuild\//i],[s,[n,"Motorola"],[r,w]],[/hbbtv\/\d+\.\d+\.\d+\s+\([\w\s]*;\s*(\w[^;]*);([^;]*)/i],[[n,d.trim],[s,d.trim],[r,"smarttv"]],[/hbbtv.+maple;(\d+)/i],[[s,/^/,"SmartTV"],[n,"Samsung"],[r,"smarttv"]],[/\(dtv[\);].+(aquos)/i],[s,[n,"Sharp"],[r,"smarttv"]],[/android.+((sch-i[89]0\d|shw-m380s|gt-p\d{4}|gt-n\d+|sgh-t8[56]9|nexus 10))/i,/((SM-T\w+))/i],[[n,"Samsung"],s,[r,w]],[/smart-tv.+(samsung)/i],[n,[r,"smarttv"],s],[/((s[cgp]h-\w+|gt-\w+|galaxy\snexus|sm-\w[\w\d]+))/i,/(sam[sung]*)[\s-]*(\w+-?[\w-]*)*/i,/sec-((sgh\w+))/i],[[n,"Samsung"],s,[r,t]],[/sie-(\w+)*/i],[s,[n,"Siemens"],[r,t]],[/(maemo|nokia).*(n900|lumia\s\d+)/i,/(nokia)[\s_-]?([\w-]+)*/i],[[n,"Nokia"],s,[r,t]],[/android\s3\.[\s\w;-]{10}(a\d{3})/i],[s,[n,"Acer"],[r,w]],[/android\s3\.[\s\w;-]{10}(lg?)-([06cv9]{3,4})/i],[[n,"LG"],s,[r,w]],[/(lg) netcast\.tv/i],[n,s,[r,"smarttv"]],[/(nexus\s[45])/i,/lg[e;\s\/-]+(\w+)*/i],[s,[n,"LG"],[r,t]],[/android.+(ideatab[a-z0-9\-\s]+)/i],[s,[n,"Lenovo"],[r,w]],[/linux;.+((jolla));/i],[n,s,[r,t]],[/((pebble))app\/[\d\.]+\s/i],[n,s,[r,"wearable"]],[/android.+;\s(glass)\s\d/i],[s,[n,"Google"],[r,"wearable"]],[/android.+(\w+)\s+build\/hm\1/i,/android.+(hm[\s\-_]*note?[\s_]*(?:\d\w)?)\s+build/i,/android.+(mi[\s\-_]*(?:one|one[\s_]plus|note lte)?[\s_]*(?:\d\w)?)\s+build/i],[[s,/_/g," "],[n,"Xiaomi"],[r,t]],[/android.+a000(1)\s+build/i],[s,[n,"OnePlus"],[r,t]],[/\s(tablet)[;\/]/i,/\s(mobile)(?:[;\/]|\ssafari)/i],[[r,d.lowerize],n,s]],engine:[[/windows.+\sedge\/([\w\.]+)/i],[a,[o,"EdgeHTML"]],[/(presto)\/([\w\.]+)/i,/(webkit|trident|netfront|netsurf|amaya|lynx|w3m)\/([\w\.]+)/i,/(khtml|tasman|links)[\/\s]\(?([\w\.]+)/i,/(icab)[\/\s]([23]\.[\d\.]+)/i],[o,a],[/rv\:([\w\.]+).*(gecko)/i],[a,o]],os:[[/microsoft\s(windows)\s(vista|xp)/i],[o,a],[/(windows)\snt\s6\.2;\s(arm)/i,/(windows\sphone(?:\sos)*)[\s\/]?([\d\.\s]+\w)*/i,/(windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)/i],[o,[a,l.str,c.os.windows.version]],[/(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i],[[o,"Windows"],[a,l.str,c.os.windows.version]],[/\((bb)(10);/i],[[o,"BlackBerry"],a],[/(blackberry)\w*\/?([\w\.]+)*/i,/(tizen)[\/\s]([\w\.]+)/i,/(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|contiki)[\/\s-]?([\w\.]+)*/i,/linux;.+(sailfish);/i],[o,a],[/(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]+)*/i],[[o,"Symbian"],a],[/\((series40);/i],[o],[/mozilla.+\(mobile;.+gecko.+firefox/i],[[o,"Firefox OS"],a],[/(nintendo|playstation)\s([wids34portablevu]+)/i,/(mint)[\/\s\(]?(\w+)*/i,/(mageia|vectorlinux)[;\s]/i,/(joli|[kxln]?ubuntu|debian|[open]*suse|gentoo|(?=\s)arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus)[\/\s-]?(?!chrom)([\w\.-]+)*/i,/(hurd|linux)\s?([\w\.]+)*/i,/(gnu)\s?([\w\.]+)*/i],[o,a],[/(cros)\s[\w]+\s([\w\.]+\w)/i],[[o,"Chromium OS"],a],[/(sunos)\s?([\w\.]+\d)*/i],[[o,"Solaris"],a],[/\s([frentopc-]{0,4}bsd|dragonfly)\s?([\w\.]+)*/i],[o,a],[/(haiku)\s(\w+)/i],[o,a],[/(ip[honead]+)(?:.*os\s([\w]+)*\slike\smac|;\sopera)/i],[[o,"iOS"],[a,/_/g,"."]],[/(mac\sos\sx)\s?([\w\s\.]+\w)*/i,/(macintosh|mac(?=_powerpc)\s)/i],[[o,"Mac OS"],[a,/_/g,"."]],[/((?:open)?solaris)[\/\s-]?([\w\.]+)*/i,/(aix)\s((\d)(?=\.|\)|\s)[\w\.]*)*/i,/(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms)/i,/(unix)\s?([\w\.]+)*/i],[o,a]]},p=function(e,s){if(!(this instanceof p))return new p(e,s).getResult();var o=e||(i&&i.navigator&&i.navigator.userAgent?i.navigator.userAgent:""),r=s?d.extend(u,s):u;return this.getBrowser=function(){var i=l.rgx.apply(this,r.browser);return i.major=d.major(i.version),i},this.getCPU=function(){return l.rgx.apply(this,r.cpu)},this.getDevice=function(){return l.rgx.apply(this,r.device)},this.getEngine=function(){return l.rgx.apply(this,r.engine)},this.getOS=function(){return l.rgx.apply(this,r.os)},this.getResult=function(){return{ua:this.getUA(),browser:this.getBrowser(),engine:this.getEngine(),os:this.getOS(),device:this.getDevice(),cpu:this.getCPU()}},this.getUA=function(){return o},this.setUA=function(i){return o=i,this},this};p.VERSION="0.7.12",p.BROWSER={NAME:o,MAJOR:"major",VERSION:a},p.CPU={ARCHITECTURE:"architecture"},p.DEVICE={MODEL:s,VENDOR:n,TYPE:r,CONSOLE:"console",MOBILE:t,SMARTTV:"smarttv",TABLET:w,WEARABLE:"wearable",EMBEDDED:"embedded"},p.ENGINE={NAME:o,VERSION:a},p.OS={NAME:o,VERSION:a},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=p),exports.UAParser=p):"function"==typeof define&&define.amd?define(function(){return p}):i.UAParser=p;var m=i.jQuery||i.Zepto;if(void 0!==m){var b=new p;m.ua=b.getResult(),m.ua.get=function(){return b.getUA()},m.ua.set=function(i){b.setUA(i);var e=b.getResult();for(var s in e)m.ua[s]=e[s]}}}("object"==typeof window?window:this); +},{}],22:[function(require,module,exports){ +(function (global){ +var rng,crypto=global.crypto||global.msCrypto;if(crypto&&crypto.getRandomValues){var _rnds8=new Uint8Array(16);rng=function(){return crypto.getRandomValues(_rnds8),_rnds8}}if(!rng){var _rnds=new Array(16);rng=function(){for(var r,n=0;n<16;n++)0==(3&n)&&(r=4294967296*Math.random()),_rnds[n]=r>>>((3&n)<<3)&255;return _rnds}}module.exports=rng; +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{}],23:[function(require,module,exports){ +function parse(e,s,r){var t=s&&r||0,n=0;for(s=s||[],e.toLowerCase().replace(/[0-9a-f]{2}/g,function(e){n<16&&(s[t+n++]=_hexToByte[e])});n<16;)s[t+n++]=0;return s}function unparse(e,s){var r=s||0,t=_byteToHex;return t[e[r++]]+t[e[r++]]+t[e[r++]]+t[e[r++]]+"-"+t[e[r++]]+t[e[r++]]+"-"+t[e[r++]]+t[e[r++]]+"-"+t[e[r++]]+t[e[r++]]+"-"+t[e[r++]]+t[e[r++]]+t[e[r++]]+t[e[r++]]+t[e[r++]]+t[e[r++]]}function v1(e,s,r){var t=s&&r||0,n=s||[];e=e||{};var o=void 0!==e.clockseq?e.clockseq:_clockseq,a=void 0!==e.msecs?e.msecs:(new Date).getTime(),u=void 0!==e.nsecs?e.nsecs:_lastNSecs+1,c=a-_lastMSecs+(u-_lastNSecs)/1e4;if(c<0&&void 0===e.clockseq&&(o=o+1&16383),(c<0||a>_lastMSecs)&&void 0===e.nsecs&&(u=0),u>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");_lastMSecs=a,_lastNSecs=u,_clockseq=o,a+=122192928e5;var i=(1e4*(268435455&a)+u)%4294967296;n[t++]=i>>>24&255,n[t++]=i>>>16&255,n[t++]=i>>>8&255,n[t++]=255&i;var _=a/4294967296*1e4&268435455;n[t++]=_>>>8&255,n[t++]=255&_,n[t++]=_>>>24&15|16,n[t++]=_>>>16&255,n[t++]=o>>>8|128,n[t++]=255&o;for(var d=e.node||_nodeId,v=0;v<6;v++)n[t+v]=d[v];return s||unparse(n)}function v4(e,s,r){var t=s&&r||0;"string"==typeof e&&(s="binary"==e?new Array(16):null,e=null),e=e||{};var n=e.random||(e.rng||_rng)();if(n[6]=15&n[6]|64,n[8]=63&n[8]|128,s)for(var o=0;o<16;o++)s[t+o]=n[o];return s||unparse(n)}for(var _rng=require("./rng"),_byteToHex=[],_hexToByte={},i=0;i<256;i++)_byteToHex[i]=(i+256).toString(16).substr(1),_hexToByte[_byteToHex[i]]=i;var _seedBytes=_rng(),_nodeId=[1|_seedBytes[0],_seedBytes[1],_seedBytes[2],_seedBytes[3],_seedBytes[4],_seedBytes[5]],_clockseq=16383&(_seedBytes[6]<<8|_seedBytes[7]),_lastMSecs=0,_lastNSecs=0,uuid=v4;uuid.v1=v1,uuid.v4=v4,uuid.parse=parse,uuid.unparse=unparse,module.exports=uuid; +},{"./rng":22}],24:[function(require,module,exports){ +function WildEmitter(){}module.exports=WildEmitter,WildEmitter.mixin=function(t){var l=t.prototype||t;l.isWildEmitter=!0,l.on=function(t,l,i){this.callbacks=this.callbacks||{};var s=3===arguments.length,c=s?arguments[1]:void 0,a=s?arguments[2]:arguments[1];return a._groupName=c,(this.callbacks[t]=this.callbacks[t]||[]).push(a),this},l.once=function(t,l,i){function s(){c.off(t,s),h.apply(this,arguments)}var c=this,a=3===arguments.length,e=a?arguments[1]:void 0,h=a?arguments[2]:arguments[1];return this.on(t,e,s),this},l.releaseGroup=function(t){this.callbacks=this.callbacks||{};var l,i,s,c;for(l in this.callbacks)for(c=this.callbacks[l],i=0,s=c.length;i<s;i++)c[i]._groupName===t&&(c.splice(i,1),i--,s--);return this},l.off=function(t,l){this.callbacks=this.callbacks||{};var i,s=this.callbacks[t];return s?1===arguments.length?(delete this.callbacks[t],this):(i=s.indexOf(l),s.splice(i,1),0===s.length&&delete this.callbacks[t],this):this},l.emit=function(t){this.callbacks=this.callbacks||{};var l,i,s,c=[].slice.call(arguments,1),a=this.callbacks[t],e=this.getWildcardCallbacks(t);if(a)for(s=a.slice(),l=0,i=s.length;l<i&&s[l];++l)s[l].apply(this,c);if(e)for(i=e.length,s=e.slice(),l=0,i=s.length;l<i&&s[l];++l)s[l].apply(this,[t].concat(c));return this},l.getWildcardCallbacks=function(t){this.callbacks=this.callbacks||{};var l,i,s=[];for(l in this.callbacks)i=l.split("*"),("*"===l||2===i.length&&t.slice(0,i[0].length)===i[0])&&(s=s.concat(this.callbacks[l]));return s}},WildEmitter.mixin(WildEmitter); +},{}]},{},[2])(2) +}); + + +//# sourceMappingURL=kurento-utils.map \ No newline at end of file diff --git a/bigbluebutton-client/resources/prod/lib/verto_extension.js b/bigbluebutton-client/resources/prod/lib/verto_extension.js index 73c55e9858d71a339f177d48041fe026811baca2..2d710adf64ff14e608fdd43cfe84127ff68e27aa 100755 --- a/bigbluebutton-client/resources/prod/lib/verto_extension.js +++ b/bigbluebutton-client/resources/prod/lib/verto_extension.js @@ -4,7 +4,8 @@ Verto = function ( conferenceUsername, userCallback, onFail = null, - chromeExtension = null) { + chromeExtension = null, + stunTurnInfo = null) { voiceBridge += "-SCREENSHARE"; this.cur_call = null; @@ -37,7 +38,7 @@ Verto = function ( this.callWasSuccessful = false; this.shouldConnect = true; - this.iceServers = null; + this.iceServers = stunTurnInfo; this.userCallback = userCallback; if (chromeExtension != null) { @@ -308,9 +309,14 @@ Verto.prototype.setScreenShare = function (tag) { Verto.prototype.create = function (tag) { this.setRenderTag(tag); this.registerCallbacks(); - //this.configStuns(this.init); - this.iceServers = true; - this.init(); + + // fetch ice information from server + if (this.iceServers == null) { + this.configStuns(this.init); + } else { + // already have it. proceed with init + this.init(); + } }; Verto.prototype.docall = function () { @@ -454,38 +460,55 @@ Verto.prototype.configStuns = function (callback) { this.logger('Fetching STUN/TURN server info for Verto initialization'); var _this = this; var stunsConfig = {}; - $.ajax({ - dataType: 'json', - url: '/bigbluebutton/api/stuns/', - }).done(function (data) { - _this.logger('ajax request done'); - _this.logger(data); - if (data.response && data.response.returncode == 'FAILED') { - _this.logError(data.response.message, { error: true }); - _this.logError({ status: 'failed', errorcode: data.response.message }); - return; - } - stunsConfig.stunServers = (data.stunServers ? data.stunServers.map(function (data) { - return { url: data.url }; - }) : []); + // flash client has api access. html5 user passes array. + // client provided no stuns and cannot make api calls + // use defaults in verto and try making a call + if (BBB.getSessionToken == undefined) { + // uses defaults + this.iceServers = true; + // run init callback + return callback(); + } - stunsConfig.turnServers = (data.turnServers ? data.turnServers.map(function (data) { - return { - urls: data.url, - username: data.username, - credential: data.password, - }; - }) : []); - - stunsConfig = stunsConfig.stunServers.concat(stunsConfig.turnServers); - _this.logger('success got stun data, making verto'); - _this.iceServers = stunsConfig; - callback.apply(_this); - }).fail(function (data, textStatus, errorThrown) { - _this.logError({ status: 'failed', errorcode: 1009 }); - _this.onFail(); - return; + // TODO: screensharing and audio use this exact same function. Should be + // moved to a shared library for retrieving stun/turn and just pass + // success/fail callbacks + BBB.getSessionToken(function(sessionToken) { + $.ajax({ + dataType: 'json', + url: '/bigbluebutton/api/stuns/', + data: {sessionToken}, + }).done(function (data) { + _this.logger('ajax request done'); + _this.logger(data); + if (data.response && data.response.returncode == 'FAILED') { + _this.logError(data.response.message, { error: true }); + _this.logError({ status: 'failed', errorcode: data.response.message }); + return; + } + + stunsConfig.stunServers = (data.stunServers ? data.stunServers.map(function (data) { + return { url: data.url }; + }) : []); + + stunsConfig.turnServers = (data.turnServers ? data.turnServers.map(function (data) { + return { + urls: data.url, + username: data.username, + credential: data.password, + }; + }) : []); + + stunsConfig = stunsConfig.stunServers.concat(stunsConfig.turnServers); + _this.logger('success got stun data, making verto'); + _this.iceServers = stunsConfig; + callback.apply(_this); + }).fail(function (data, textStatus, errorThrown) { + _this.logError({ status: 'failed', errorcode: 1009 }); + _this.onFail(); + return; + }); }); }; diff --git a/bigbluebutton-client/resources/prod/logo.png b/bigbluebutton-client/resources/prod/logo.png deleted file mode 100644 index 17492e90b6a2a4be5b0bad3239fd062b99ee6357..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/resources/prod/logo.png and /dev/null differ diff --git a/bigbluebutton-client/resources/prod/logo.swf b/bigbluebutton-client/resources/prod/logo.swf new file mode 100644 index 0000000000000000000000000000000000000000..19ef9166c7dd8b9ac370a9e49798b49a04deb020 Binary files /dev/null and b/bigbluebutton-client/resources/prod/logo.swf differ diff --git a/bigbluebutton-client/src/BigBlueButton.mxml b/bigbluebutton-client/src/BigBlueButton.mxml index 4dff0348a9aa925d0860ec33403cb87313d3c95a..70be7320dcf9986a13033053128004443d945e7c 100755 --- a/bigbluebutton-client/src/BigBlueButton.mxml +++ b/bigbluebutton-client/src/BigBlueButton.mxml @@ -26,20 +26,23 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. layout="absolute" preinitialize="init()" preloader="org.bigbluebutton.main.model.BigBlueButtonPreloader"> - + <fx:Style source="assets/halo.css" /> + <!-- Shared Stylesheet containing common assets and styles --> + <fx:Style source="assets/shared.css" /> + + <fx:Style source="../branding/default/style/css/V2Theme.css" /> + <fx:Script> <![CDATA[ import org.bigbluebutton.common.LogUtil; private function init():void { LogUtil.initLogging(true); - setStyle('backgroundColor', '0xFFFFFF'); } ]]> </fx:Script> - <views:BigBlueButtonMainContainer id="bbbShell"/> - + </mx:Application> diff --git a/bigbluebutton-client/src/ScreenshareStandalone.mxml b/bigbluebutton-client/src/ScreenshareStandalone.mxml index 23e05f6c539cdbda75f0f251edf538e3f497ead2..77adf063a559528ef61a8faa568fc5e840bc6fcd 100755 --- a/bigbluebutton-client/src/ScreenshareStandalone.mxml +++ b/bigbluebutton-client/src/ScreenshareStandalone.mxml @@ -38,10 +38,9 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. <fx:Script> <![CDATA[ + + import mx.core.UIComponent; - import mx.controls.Image; - import mx.core.UIComponent; - import org.bigbluebutton.common.Images; import org.bigbluebutton.modules.screenshare.events.AppletStartedEvent; import org.bigbluebutton.modules.screenshare.events.CursorEvent; import org.bigbluebutton.modules.screenshare.events.ViewStreamEvent; @@ -53,9 +52,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. private var cursor:Shape = new Shape();; - private var images:Images = new Images(); - [Bindable] public var bbbLogo:Class = images.bbb_logo; - private var video:Video; private var ns:NetStream; private var stream:String; diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/bbb_linux_chrome_1.png b/bigbluebutton-client/src/assets/images/bbb_linux_chrome_1.png similarity index 100% rename from bigbluebutton-client/branding/default/style/css/assets/images/bbb_linux_chrome_1.png rename to bigbluebutton-client/src/assets/images/bbb_linux_chrome_1.png diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/bbb_linux_chrome_2.png b/bigbluebutton-client/src/assets/images/bbb_linux_chrome_2.png similarity index 100% rename from bigbluebutton-client/branding/default/style/css/assets/images/bbb_linux_chrome_2.png rename to bigbluebutton-client/src/assets/images/bbb_linux_chrome_2.png diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/bbb_linux_chrome_3.png b/bigbluebutton-client/src/assets/images/bbb_linux_chrome_3.png similarity index 100% rename from bigbluebutton-client/branding/default/style/css/assets/images/bbb_linux_chrome_3.png rename to bigbluebutton-client/src/assets/images/bbb_linux_chrome_3.png diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/bbb_linux_firefox_1.png b/bigbluebutton-client/src/assets/images/bbb_linux_firefox_1.png similarity index 100% rename from bigbluebutton-client/branding/default/style/css/assets/images/bbb_linux_firefox_1.png rename to bigbluebutton-client/src/assets/images/bbb_linux_firefox_1.png diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/bbb_linux_firefox_2.png b/bigbluebutton-client/src/assets/images/bbb_linux_firefox_2.png similarity index 100% rename from bigbluebutton-client/branding/default/style/css/assets/images/bbb_linux_firefox_2.png rename to bigbluebutton-client/src/assets/images/bbb_linux_firefox_2.png diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/bbb_linux_firefox_3.png b/bigbluebutton-client/src/assets/images/bbb_linux_firefox_3.png similarity index 100% rename from bigbluebutton-client/branding/default/style/css/assets/images/bbb_linux_firefox_3.png rename to bigbluebutton-client/src/assets/images/bbb_linux_firefox_3.png diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/bbb_mac_chrome_1.png b/bigbluebutton-client/src/assets/images/bbb_mac_chrome_1.png similarity index 100% rename from bigbluebutton-client/branding/default/style/css/assets/images/bbb_mac_chrome_1.png rename to bigbluebutton-client/src/assets/images/bbb_mac_chrome_1.png diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/bbb_mac_chrome_2.png b/bigbluebutton-client/src/assets/images/bbb_mac_chrome_2.png similarity index 100% rename from bigbluebutton-client/branding/default/style/css/assets/images/bbb_mac_chrome_2.png rename to bigbluebutton-client/src/assets/images/bbb_mac_chrome_2.png diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/bbb_mac_chrome_3.png b/bigbluebutton-client/src/assets/images/bbb_mac_chrome_3.png similarity index 100% rename from bigbluebutton-client/branding/default/style/css/assets/images/bbb_mac_chrome_3.png rename to bigbluebutton-client/src/assets/images/bbb_mac_chrome_3.png diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/bbb_mac_chrome_4.png b/bigbluebutton-client/src/assets/images/bbb_mac_chrome_4.png similarity index 100% rename from bigbluebutton-client/branding/default/style/css/assets/images/bbb_mac_chrome_4.png rename to bigbluebutton-client/src/assets/images/bbb_mac_chrome_4.png diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/bbb_mac_firefox_1.png b/bigbluebutton-client/src/assets/images/bbb_mac_firefox_1.png similarity index 100% rename from bigbluebutton-client/branding/default/style/css/assets/images/bbb_mac_firefox_1.png rename to bigbluebutton-client/src/assets/images/bbb_mac_firefox_1.png diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/bbb_mac_firefox_2.png b/bigbluebutton-client/src/assets/images/bbb_mac_firefox_2.png similarity index 100% rename from bigbluebutton-client/branding/default/style/css/assets/images/bbb_mac_firefox_2.png rename to bigbluebutton-client/src/assets/images/bbb_mac_firefox_2.png diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/bbb_mac_firefox_3.png b/bigbluebutton-client/src/assets/images/bbb_mac_firefox_3.png similarity index 100% rename from bigbluebutton-client/branding/default/style/css/assets/images/bbb_mac_firefox_3.png rename to bigbluebutton-client/src/assets/images/bbb_mac_firefox_3.png diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/bbb_mac_firefox_4.png b/bigbluebutton-client/src/assets/images/bbb_mac_firefox_4.png similarity index 100% rename from bigbluebutton-client/branding/default/style/css/assets/images/bbb_mac_firefox_4.png rename to bigbluebutton-client/src/assets/images/bbb_mac_firefox_4.png diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/bbb_mac_safari_1.png b/bigbluebutton-client/src/assets/images/bbb_mac_safari_1.png similarity index 100% rename from bigbluebutton-client/branding/default/style/css/assets/images/bbb_mac_safari_1.png rename to bigbluebutton-client/src/assets/images/bbb_mac_safari_1.png diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/bbb_mac_safari_2.png b/bigbluebutton-client/src/assets/images/bbb_mac_safari_2.png similarity index 100% rename from bigbluebutton-client/branding/default/style/css/assets/images/bbb_mac_safari_2.png rename to bigbluebutton-client/src/assets/images/bbb_mac_safari_2.png diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/bbb_mac_safari_3.png b/bigbluebutton-client/src/assets/images/bbb_mac_safari_3.png similarity index 100% rename from bigbluebutton-client/branding/default/style/css/assets/images/bbb_mac_safari_3.png rename to bigbluebutton-client/src/assets/images/bbb_mac_safari_3.png diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/bbb_mac_safari_4.png b/bigbluebutton-client/src/assets/images/bbb_mac_safari_4.png similarity index 100% rename from bigbluebutton-client/branding/default/style/css/assets/images/bbb_mac_safari_4.png rename to bigbluebutton-client/src/assets/images/bbb_mac_safari_4.png diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/bbb_pc_chrome_1.png b/bigbluebutton-client/src/assets/images/bbb_pc_chrome_1.png similarity index 100% rename from bigbluebutton-client/branding/default/style/css/assets/images/bbb_pc_chrome_1.png rename to bigbluebutton-client/src/assets/images/bbb_pc_chrome_1.png diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/bbb_pc_chrome_2.png b/bigbluebutton-client/src/assets/images/bbb_pc_chrome_2.png similarity index 100% rename from bigbluebutton-client/branding/default/style/css/assets/images/bbb_pc_chrome_2.png rename to bigbluebutton-client/src/assets/images/bbb_pc_chrome_2.png diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/bbb_pc_chrome_3.png b/bigbluebutton-client/src/assets/images/bbb_pc_chrome_3.png similarity index 100% rename from bigbluebutton-client/branding/default/style/css/assets/images/bbb_pc_chrome_3.png rename to bigbluebutton-client/src/assets/images/bbb_pc_chrome_3.png diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/bbb_pc_firefox_1.png b/bigbluebutton-client/src/assets/images/bbb_pc_firefox_1.png similarity index 100% rename from bigbluebutton-client/branding/default/style/css/assets/images/bbb_pc_firefox_1.png rename to bigbluebutton-client/src/assets/images/bbb_pc_firefox_1.png diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/bbb_pc_firefox_2.png b/bigbluebutton-client/src/assets/images/bbb_pc_firefox_2.png similarity index 100% rename from bigbluebutton-client/branding/default/style/css/assets/images/bbb_pc_firefox_2.png rename to bigbluebutton-client/src/assets/images/bbb_pc_firefox_2.png diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/bbb_pc_firefox_3.png b/bigbluebutton-client/src/assets/images/bbb_pc_firefox_3.png similarity index 100% rename from bigbluebutton-client/branding/default/style/css/assets/images/bbb_pc_firefox_3.png rename to bigbluebutton-client/src/assets/images/bbb_pc_firefox_3.png diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/bbb_pc_ie_1.png b/bigbluebutton-client/src/assets/images/bbb_pc_ie_1.png similarity index 100% rename from bigbluebutton-client/branding/default/style/css/assets/images/bbb_pc_ie_1.png rename to bigbluebutton-client/src/assets/images/bbb_pc_ie_1.png diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/bbb_pc_ie_2.png b/bigbluebutton-client/src/assets/images/bbb_pc_ie_2.png similarity index 100% rename from bigbluebutton-client/branding/default/style/css/assets/images/bbb_pc_ie_2.png rename to bigbluebutton-client/src/assets/images/bbb_pc_ie_2.png diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/bbb_pc_ie_3.png b/bigbluebutton-client/src/assets/images/bbb_pc_ie_3.png similarity index 100% rename from bigbluebutton-client/branding/default/style/css/assets/images/bbb_pc_ie_3.png rename to bigbluebutton-client/src/assets/images/bbb_pc_ie_3.png diff --git a/bigbluebutton-client/src/assets/images/delete.png b/bigbluebutton-client/src/assets/images/delete.png deleted file mode 100755 index 0059eaa72ce11f79b11fb2fa0d5c3e225ca6c11a..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/assets/images/delete.png and /dev/null differ diff --git a/bigbluebutton-client/src/assets/images/elipse.png b/bigbluebutton-client/src/assets/images/elipse.png deleted file mode 100755 index 3252b6aa957f272a4c0ae8ea14213464681cba7d..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/assets/images/elipse.png and /dev/null differ diff --git a/bigbluebutton-client/src/assets/images/fit-to-screen.png b/bigbluebutton-client/src/assets/images/fit-to-screen.png deleted file mode 100755 index 0f83d20bedc8a35bced16f37b0e6cd2f6277d81f..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/assets/images/fit-to-screen.png and /dev/null differ diff --git a/bigbluebutton-client/src/assets/images/fit-to-width.png b/bigbluebutton-client/src/assets/images/fit-to-width.png deleted file mode 100755 index 12b052798435720aca6d0c94e43073e4eac5a1d4..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/assets/images/fit-to-width.png and /dev/null differ diff --git a/bigbluebutton-client/src/assets/images/hand.png b/bigbluebutton-client/src/assets/images/hand.png deleted file mode 100755 index d923194e5ed2ccd5ac57a456540474727d6531b4..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/assets/images/hand.png and /dev/null differ diff --git a/bigbluebutton-client/src/assets/images/left_arrow.png b/bigbluebutton-client/src/assets/images/left_arrow.png deleted file mode 100755 index e6abeb60d45d8a2a2b0f85b741f1af14683a4c4c..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/assets/images/left_arrow.png and /dev/null differ diff --git a/bigbluebutton-client/src/assets/images/line.png b/bigbluebutton-client/src/assets/images/line.png deleted file mode 100755 index 175174a0ea5ebb32535ad19ccd0a86a319496bb9..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/assets/images/line.png and /dev/null differ diff --git a/bigbluebutton-client/src/assets/images/pencil.png b/bigbluebutton-client/src/assets/images/pencil.png deleted file mode 100755 index dd979748baebc063f532af178489732ab0c4548f..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/assets/images/pencil.png and /dev/null differ diff --git a/bigbluebutton-client/src/assets/images/right_arrow.png b/bigbluebutton-client/src/assets/images/right_arrow.png deleted file mode 100755 index 6eab9f047a5ecd05d65ac1dae3f226b80009347d..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/assets/images/right_arrow.png and /dev/null differ diff --git a/bigbluebutton-client/src/assets/images/square.png b/bigbluebutton-client/src/assets/images/square.png deleted file mode 100755 index 48b5280bdb794d3d5de562af781f3affeda59ffc..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/assets/images/square.png and /dev/null differ diff --git a/bigbluebutton-client/src/assets/images/text.png b/bigbluebutton-client/src/assets/images/text.png deleted file mode 100755 index 21858b8ca4c28e93acb3eddd665860cf214d3bcf..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/assets/images/text.png and /dev/null differ diff --git a/bigbluebutton-client/src/assets/images/triangle.png b/bigbluebutton-client/src/assets/images/triangle.png deleted file mode 100755 index f629ee6aebb3c600c700ef3eb54cbf59917dd70b..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/assets/images/triangle.png and /dev/null differ diff --git a/bigbluebutton-client/src/assets/images/undo.png b/bigbluebutton-client/src/assets/images/undo.png deleted file mode 100755 index f65e9db3edf0cd4f2ee09b2a463e8436c19894d3..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/assets/images/undo.png and /dev/null differ diff --git a/bigbluebutton-client/src/assets/images/upload.png b/bigbluebutton-client/src/assets/images/upload.png deleted file mode 100755 index 724a094ae6974c1fd6e451ed492a06955e538ed2..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/assets/images/upload.png and /dev/null differ diff --git a/bigbluebutton-client/src/assets/shared.css b/bigbluebutton-client/src/assets/shared.css new file mode 100644 index 0000000000000000000000000000000000000000..6a0236ff0107438d96bbb1a7d17c4113d39cf8f4 --- /dev/null +++ b/bigbluebutton-client/src/assets/shared.css @@ -0,0 +1,110 @@ +@namespace s "library://ns.adobe.com/flex/spark"; +@namespace mx "library://ns.adobe.com/flex/mx"; + +.publishHelpPCIE1 { + imageSource: Embed(source='assets/images/bbb_pc_ie_1.png'); +} + +.publishHelpPCIE2 { + imageSource: Embed(source='assets/images/bbb_pc_ie_2.png'); +} + +.publishHelpPCIE3 { + imageSource: Embed(source='assets/images/bbb_pc_ie_3.png'); +} + +.publishHelpPCFirefox1 { + imageSource: Embed(source='assets/images/bbb_pc_firefox_1.png'); +} + +.publishHelpPCFirefox2 { + imageSource: Embed(source='assets/images/bbb_pc_firefox_2.png'); +} + +.publishHelpPCFirefox3 { + imageSource: Embed(source='assets/images/bbb_pc_firefox_3.png'); +} + +.publishHelpPCChrome1 { + imageSource: Embed(source='assets/images/bbb_pc_chrome_1.png'); +} + +.publishHelpPCChrome2 { + imageSource: Embed(source='assets/images/bbb_pc_chrome_2.png'); +} + +.publishHelpPCChrome3 { + imageSource: Embed(source='assets/images/bbb_pc_chrome_3.png'); +} + +.publishHelpMacSafari1 { + imageSource: Embed(source='assets/images/bbb_mac_safari_1.png'); +} + +.publishHelpMacSafari2 { + imageSource: Embed(source='assets/images/bbb_mac_safari_2.png'); +} + +.publishHelpMacSafari3 { + imageSource: Embed(source='assets/images/bbb_mac_safari_3.png'); +} + +.publishHelpMacSafari4 { + imageSource: Embed(source='assets/images/bbb_mac_safari_4.png'); +} + +.publishHelpMacFirefox1 { + imageSource: Embed(source='assets/images/bbb_mac_firefox_1.png'); +} + +.publishHelpMacFirefox2 { + imageSource: Embed(source='assets/images/bbb_mac_firefox_2.png'); +} + +.publishHelpMacFirefox3 { + imageSource: Embed(source='assets/images/bbb_mac_firefox_3.png'); +} + +.publishHelpMacFirefox4 { + imageSource: Embed(source='assets/images/bbb_mac_firefox_4.png'); +} + +.publishHelpMacChrome1 { + imageSource: Embed(source='assets/images/bbb_mac_chrome_1.png'); +} + +.publishHelpMacChrome2 { + imageSource: Embed(source='assets/images/bbb_mac_chrome_2.png'); +} + +.publishHelpMacChrome3 { + imageSource: Embed(source='assets/images/bbb_mac_chrome_3.png'); +} + +.publishHelpMacChrome4 { + imageSource: Embed(source='assets/images/bbb_mac_chrome_4.png'); +} + +.publishHelpLinuxFirefox1 { + imageSource: Embed(source='assets/images/bbb_linux_firefox_1.png'); +} + +.publishHelpLinuxFirefox2 { + imageSource: Embed(source='assets/images/bbb_linux_firefox_2.png'); +} + +.publishHelpLinuxFirefox3 { + imageSource: Embed(source='assets/images/bbb_linux_firefox_3.png'); +} + +.publishHelpLinuxChrome1 { + imageSource: Embed(source='assets/images/bbb_linux_chrome_1.png'); +} + +.publishHelpLinuxChrome2 { + imageSource: Embed(source='assets/images/bbb_linux_chrome_2.png'); +} + +.publishHelpLinuxChrome3 { + imageSource: Embed(source='assets/images/bbb_linux_chrome_3.png'); +} \ No newline at end of file diff --git a/bigbluebutton-client/src/conf/layout.xml b/bigbluebutton-client/src/conf/layout.xml deleted file mode 100755 index b26c57c8065d711ec4c7bbd28bc39d9fd9fe124e..0000000000000000000000000000000000000000 --- a/bigbluebutton-client/src/conf/layout.xml +++ /dev/null @@ -1,45 +0,0 @@ -<?xml version="1.0"?> -<layouts> - <layout name="Default" default="true"> - <window name="UsersWindow" width="0.1772793053545586" height="0.6795212765957446" x="0" y="0" /> - <window name="PresentationWindow" width="0.5137481910274964" height="0.9946808510638298" x="0.18017366136034732" y="0" /> - <window name="VideoDock" width="0.1772793053545586" height="0.30851063829787234" x="0" y="0.6875" /> - <window name="ChatWindow" width="0.3031837916063676" height="0.9960106382978723" x="0.6968162083936325" y="0" /> - </layout> - <layout name="Meeting"> - <window name="VideoDock" width="0.6570188133140377" height="0.9960106382978723" x="0" y="0" /> - <window name="ChatWindow" width="0.3393632416787265" height="0.5305851063829787" x="0.658465991316932" y="0" /> - <window name="UsersWindow" hidden="true" /> - <window name="PresentationWindow" width="0.34008683068017365" height="0.4601063829787234" x="0.658465991316932" y="0.535904255319149" /> - </layout> - <layout name="Webinar"> - <window name="UsersWindow" minimized="true" /> - <window name="VideoDock" width="0.2923611111111111" height="0.4640957446808511" x="0.7048611111111112" y="0.535904255319149" /> - <window name="PresentationWindow" width="0.7027777777777777" height="0.9986702127659575" x="0" y="0" /> - <window name="ChatWindow" width="0.2923611111111111" height="0.5305851063829787" x="0.7048611111111112" y="0" /> - </layout> - <layout name="Lecture assistant"> - <window name="ChatWindow" width="0.4597222222222222" height="0.9958677685950413" x="0.2263888888888889" y="0" /> - <window name="UsersWindow" width="0.2222222222222222" height="0.9944903581267218" x="0" y="0" /> - <window name="PresentationWindow" width="0.3104166666666667" height="0.5537190082644629" x="0.6895833333333333" y="0" /> - <window name="VideoDock" width="0.30972222222222223" height="0.4256198347107438" x="0.6902777777777778" y="0.568870523415978" /> - </layout> - <layout name="Lecture"> - <window name="UsersWindow" hidden="true" /> - <window name="VideoDock" width="0.2923611111111111" height="0.4640957446808511" x="0.7048611111111112" y="0.535904255319149" /> - <window name="PresentationWindow" width="0.7027777777777777" height="0.9986702127659575" x="0" y="0" /> - <window name="ChatWindow" width="0.2923611111111111" height="0.5305851063829787" x="0.7048611111111112" y="0" /> - </layout> - <layout name="Lecture" role="presenter"> - <window name="ChatWindow" hidden="true" /> - <window name="UsersWindow" hidden="true" /> - <window name="PresentationWindow" maximized="true" /> - <window name="VideoDock" hidden="true" /> - </layout> - <layout name="Lecture" role="moderator"> - <window name="ChatWindow" width="0.4597222222222222" height="0.9958677685950413" x="0.2263888888888889" y="0" /> - <window name="UsersWindow" width="0.2222222222222222" height="0.9944903581267218" x="0" y="0" /> - <window name="PresentationWindow" width="0.3104166666666667" height="0.5537190082644629" x="0.6895833333333333" y="0" /> - <window name="VideoDock" width="0.30972222222222223" height="0.4256198347107438" x="0.6902777777777778" y="0.568870523415978" /> - </layout> -</layouts> diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/Images.as b/bigbluebutton-client/src/org/bigbluebutton/common/Images.as deleted file mode 100755 index ac252312b3cc8e09ca04bcc34e0f0ff9b7889f44..0000000000000000000000000000000000000000 --- a/bigbluebutton-client/src/org/bigbluebutton/common/Images.as +++ /dev/null @@ -1,188 +0,0 @@ -/** -* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ -* -* Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below). -* -* This program is free software; you can redistribute it and/or modify it under the -* terms of the GNU Lesser General Public License as published by the Free Software -* Foundation; either version 3.0 of the License, or (at your option) any later -* version. -* -* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY -* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License along -* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. -* -*/ -package org.bigbluebutton.common -{ - [Bindable] - public class Images - { - - [Embed(source="assets/images/users_settings.png")] - public var users_settings:Class; - - [Embed(source="assets/images/eject_user.png")] - public var eject_user_new:Class; - - [Embed(source="assets/images/audio_muted.png")] - public var audio_muted:Class; - - [Embed(source="assets/images/audio.png")] - public var audio:Class; - - [Embed(source="assets/images/audio_muted_20.png")] - public var audio_muted_20:Class; - - [Embed(source="assets/images/audio_20.png")] - public var audio_20:Class; - - [Embed(source="assets/images/webcam_new_20.png")] - public var webcam_new_20:Class; - - [Embed(source="assets/images/moderator_20db.png")] - public var moderator:Class; - - [Embed(source="assets/images/presenter_new_20db.png")] - public var presenter_new:Class; - - [Embed(source="assets/images/webcam_mute.png")] - public var webcam_mute:Class; - - [Embed(source="assets/images/ic_hearing_grey_20dp.png")] - public var sound:Class; - - [Embed(source="assets/images/cancel.png")] - public var cancel:Class; - - [Embed(source="assets/images/pencil.png")] - public var pencil_icon:Class; - - [Embed(source="assets/images/square.png")] - public var square_icon:Class; - - [Embed(source="assets/images/text.png")] - public var text_icon:Class; - - [Embed(source="assets/images/ellipse.png")] - public var circle_icon:Class; - - [Embed(source="assets/images/ic_fullscreen_16px.png")] - public var full_screen:Class; - - [Embed(source="assets/images/ic_fullscreen_exit_16px.png")] - public var exit_full_screen:Class; - - [Embed(source="assets/images/BBBlogo.png")] - public var bbb_logo:Class; - - [Embed(source="assets/images/table.png")] - public var table:Class; - - [Embed(source="assets/images/add.png")] - public var add:Class; - - [Embed(source="assets/images/bullet_go.png")] - public var bulletGo:Class; - - [Embed(source="assets/images/whiteboard_thick.png")] - public var whiteboard_thick:Class; - - [Embed(source="assets/images/whiteboard_thin.png")] - public var whiteboard_thin:Class; - - [Embed(source="assets/images/lock_20.png")] - public var locked_20:Class; - - [Embed(source="assets/images/unlock_20.png")] - public var unlocked_20:Class; - - [Embed(source="assets/images/lock_open.png")] - public var lock_open:Class; - - [Embed(source="assets/images/disk_grayscale.png")] - public var disk_grayscale:Class; - - // PLACE CUSTOM IMAGES BELOW - [Embed(source="assets/images/line.png")] - public var line_icon:Class; - - [Embed(source="assets/images/triangle.png")] - public var triangle_icon:Class; - - [Embed(source="assets/images/ic_refresh_16px.png")] - public var refreshSmall:Class; - - [Embed(source="assets/images/moderator_white.png")] - public var moderator_white:Class; - - [Embed(source="assets/images/presenter_white.png")] - public var presenter_white:Class; - - [Embed(source="assets/images/transfer.png")] - public var transfer:Class; - - [Embed(source="assets/images/transferred.png")] - public var transferred:Class; - - [Embed(source="assets/images/join.png")] - public var join:Class; - - [Embed(source="assets/images/emoji_thumbsUp.png")] - public var emoji_thumbsUp:Class; - - [Embed(source="assets/images/emoji_thumbsDown.png")] - public var emoji_thumbsDown:Class; - - [Embed(source="assets/images/emoji_applause.png")] - public var emoji_applause:Class; - - [Embed(source="assets/images/user_add.png")] - public var user_add:Class; - - [Embed(source="assets/images/user_delete.png")] - public var user_delete:Class; - - [Embed(source="assets/images/status/ic_mood_grey_20dp.png")] - public var mood:Class; - - [Embed(source="assets/images/status/ic_clear_grey_20dp.png")] - public var mood_clear:Class; - - [Embed(source="assets/images/status/icon-3-grey-high-five.png")] - public var mood_raiseHand:Class; - - [Embed(source="assets/images/status/icon-6-grey-thumb-up.png")] - public var mood_agree:Class; - - [Embed(source="assets/images/status/icon-7-grey-thumb-down.png")] - public var mood_disagree:Class; - - [Embed(source="assets/images/status/ic_fast_forward_grey_20dp.png")] - public var mood_speakFaster:Class; - - [Embed(source="assets/images/status/ic_fast_rewind_grey_20dp.png")] - public var mood_speakSlower:Class; - - [Embed(source="assets/images/status/ic_volume_up_grey_20dp.png")] - public var mood_speakLouder:Class; - - [Embed(source="assets/images/status/ic_volume_down_grey_20dp.png")] - public var mood_speakSofter:Class; - - [Embed(source="assets/images/status/ic_access_time_grey_20dp.png")] - public var mood_beRightBack:Class; - - [Embed(source="assets/images/status/icon-6-grey-smiling-face.png")] - public var mood_happy:Class; - - [Embed(source="assets/images/status/icon-7-grey-sad-face.png")] - public var mood_sad:Class; - - [Embed(source="assets/images/status/applause-20.png")] - public var mood_applause:Class; - } -} diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/BBBlogo.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/BBBlogo.png deleted file mode 100644 index 2e9f8151f4083aece663009ae40d9271104dbb41..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/BBBlogo.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/add.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/add.png deleted file mode 100644 index 6332fefea4be19eeadf211b0b202b272e8564898..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/add.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/arrow_in.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/arrow_in.png deleted file mode 100755 index 745c65134db478a64016d63a7104e585452f2b9f..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/arrow_in.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/audio.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/audio.png deleted file mode 100755 index 6c9f9e708091bf1d20ca05709bca51dc6bf66941..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/audio.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/audio_20.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/audio_20.png deleted file mode 100755 index 0dd7ce86de371c38f49d1541643dbd7707a2f174..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/audio_20.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/audio_muted.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/audio_muted.png deleted file mode 100644 index 5fe13231256830d4fda33c1684cee1322224f69f..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/audio_muted.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/audio_muted_20.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/audio_muted_20.png deleted file mode 100755 index 44a230552c6866c312862c438b90ac2efbb5e73f..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/audio_muted_20.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/avatar.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/avatar.png deleted file mode 100644 index 2e9f8151f4083aece663009ae40d9271104dbb41..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/avatar.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/bandwidth.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/bandwidth.png deleted file mode 100755 index adb979ce5aa24832549312d1291605e4dfcc4cae..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/bandwidth.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/blank-circle.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/blank-circle.png deleted file mode 100755 index f3b2a1360a0a4dcfe3824294e268cad6918ea240..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/blank-circle.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/bullet_go.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/bullet_go.png deleted file mode 100755 index bc4faa709e7980514e6aaa5360e6208e63248c65..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/bullet_go.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/cancel.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/cancel.png deleted file mode 100755 index 3950faf59d340e47f4a9d8e566ddddac55a31bd3..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/cancel.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/deskshare_close.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/deskshare_close.png deleted file mode 100755 index 2c68797e1e5ec4ecde6df2e3ffc0ad1cc4c91302..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/deskshare_close.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/deskshare_icon.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/deskshare_icon.png deleted file mode 100644 index e9065faaf077a4032e50c4455f2e0e10a349c2af..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/deskshare_icon.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/deskshare_on.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/deskshare_on.png deleted file mode 100644 index ab036b1766e4284d2603518848309a1ad3a5f842..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/deskshare_on.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/disk.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/disk.png deleted file mode 100644 index 99d532e8b1750115952f97302a92d713c0486f97..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/disk.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/disk_grayscale.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/disk_grayscale.png deleted file mode 100644 index 30056e2734a4077a030755f5de3d9db5c6804276..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/disk_grayscale.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/eject_user.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/eject_user.png deleted file mode 100644 index 2b0ad4f5790da006c2a104dcc8061ca14086a857..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/eject_user.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/ellipse.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/ellipse.png deleted file mode 100644 index d58b3f79fe2be522f6b6a602c6666f4fb3f460bd..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/ellipse.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/emoji_applause.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/emoji_applause.png deleted file mode 100755 index 8c5b8b076402562ff7350af0b8da0554b8fbb6e6..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/emoji_applause.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/emoji_away.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/emoji_away.png deleted file mode 100644 index c2042f1d8b21f16533efdb858119daaa0a716942..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/emoji_away.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/emoji_confused.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/emoji_confused.png deleted file mode 100644 index d7774ba6c620bc836c1c45ed1067c027fd0c099b..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/emoji_confused.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/emoji_happy.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/emoji_happy.png deleted file mode 100644 index c1e579d3ae58090650ccfab6b99c9b76535d7d0b..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/emoji_happy.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/emoji_neutral.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/emoji_neutral.png deleted file mode 100644 index 90337ef36e9df667485ec99670da54670e844c35..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/emoji_neutral.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/emoji_raiseHand.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/emoji_raiseHand.png deleted file mode 100755 index 4c5c4836d1a4a55a34ed332a7b2b05800febe97a..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/emoji_raiseHand.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/emoji_sad.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/emoji_sad.png deleted file mode 100644 index e8d820ccab4945d2e74f22a62c30406c91bc0a14..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/emoji_sad.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/emoji_thumbsDown.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/emoji_thumbsDown.png deleted file mode 100755 index ec694be4095dea3ebf27a3e275ccfedbf67d1bfa..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/emoji_thumbsDown.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/emoji_thumbsUp.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/emoji_thumbsUp.png deleted file mode 100755 index a4c9f9d7c6e16b55a29b5ba7123e24254807eae0..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/emoji_thumbsUp.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/green-circle.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/green-circle.png deleted file mode 100755 index 08f8b8c25a23734b28abe4b90f809d770d592600..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/green-circle.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/ic_fullscreen_16px.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/ic_fullscreen_16px.png deleted file mode 100644 index 685700f137f2e62b1c8f727d3fbb122438ec6300..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/ic_fullscreen_16px.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/ic_fullscreen_exit_16px.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/ic_fullscreen_exit_16px.png deleted file mode 100644 index e6c25681015ba7367447ec565750bd530359f7a2..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/ic_fullscreen_exit_16px.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/ic_hearing_grey_20dp.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/ic_hearing_grey_20dp.png deleted file mode 100644 index 2be75cab8dea9c36da7411ac429d2fe2a938e0b7..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/ic_hearing_grey_20dp.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/ic_refresh_16px.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/ic_refresh_16px.png deleted file mode 100644 index 02a2d81f6f291371599e4bec81442a796a4d295b..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/ic_refresh_16px.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/icons-license.txt b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/icons-license.txt deleted file mode 100755 index 9f25609678fefd389d8e80e4ea4b0243b685c2b4..0000000000000000000000000000000000000000 --- a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/icons-license.txt +++ /dev/null @@ -1,38 +0,0 @@ -Silk icon set 1.3 - -_________________________________________ -Mark James -http://www.famfamfam.com/lab/icons/silk/ -_________________________________________ - -This work is licensed under a -Creative Commons Attribution 2.5 License. -[ http://creativecommons.org/licenses/by/2.5/ ] - -This means you may use it for any purpose, -and make any changes you like. -All I ask is that you include a link back -to this page in your credits. - -Are you using this icon set? Send me an email -(including a link or picture if available) to -mjames@gmail.com - -Any other questions about this icon set please -contact mjames@gmail.com - -================================================== -Diagona Icons - -Copyright (C) 2007 Yusuke Kamiyamane. All rights reserved. -The icons are licensed under a Creative Commons Attribution -3.0 license. <http://creativecommons.org/licenses/by/3.0/> - -If you can't or don't want to provide a link back, please -purchase a royalty-free license. -<http://p.yusukekamiyamane.com/> - -I'm unavailable for custom icon design work. But your -suggestions are always welcome! -<mailto:p@yusukekamiyamane.com> -==================== \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/join.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/join.png deleted file mode 100644 index 91ebb65032bf8f3f55da3aacb8bb06a6a72e443d..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/join.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/line.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/line.png deleted file mode 100644 index bd1fa8bcb6adaa97abd27556369d35b1331bc470..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/line.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/lock.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/lock.png deleted file mode 100755 index 08f0bf613f5e25dababa85e2a9e645f27ef9aec4..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/lock.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/lock_20.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/lock_20.png deleted file mode 100755 index ea453ea22bfd82ab21bad0e0bfab6bc23f4d76a2..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/lock_20.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/lock_open.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/lock_open.png deleted file mode 100755 index 08f0bf613f5e25dababa85e2a9e645f27ef9aec4..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/lock_open.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/moderator.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/moderator.png deleted file mode 100644 index 36213a78668b1dca782629208ea25c0680a5216f..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/moderator.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/moderator_20db.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/moderator_20db.png deleted file mode 100644 index e14349d5cef9f7b2a1b1a24c70e03839ccd5c272..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/moderator_20db.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/moderator_white.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/moderator_white.png deleted file mode 100644 index 002f1b8e858db0e3d6977ad4f730986e16560ec2..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/moderator_white.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/page_link.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/page_link.png deleted file mode 100644 index 319e27b1925e4f135f1f82873478452403516db9..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/page_link.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/page_white_get.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/page_white_get.png deleted file mode 100755 index 5e3c3db49266205ada109139fb5c13a4c2bd6ade..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/page_white_get.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/pencil.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/pencil.png deleted file mode 100755 index b2b4c883b11e309de1f6995fe5bfc9e6d9cb332d..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/pencil.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/presenter_new.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/presenter_new.png deleted file mode 100644 index b9d40bb75b3df779443e7f96c808f193d82bee63..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/presenter_new.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/presenter_new_20db.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/presenter_new_20db.png deleted file mode 100644 index 4ada04086f217489af85d1cc6c36b43429930d2e..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/presenter_new_20db.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/presenter_white.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/presenter_white.png deleted file mode 100644 index 273b2f17075bd8cd474e201de74004239f0978f8..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/presenter_white.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/record.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/record.png deleted file mode 100755 index 4cf27bd28fee5c3babd8cf5269f4fa1a905afdfa..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/record.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/red-circle.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/red-circle.png deleted file mode 100755 index 1c500ba34e6e023796bf329bb335390d9649c3d6..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/red-circle.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/sound.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/sound.png deleted file mode 100755 index 26d885578247342a1872974132d1d942f6f9ae87..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/sound.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/square.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/square.png deleted file mode 100644 index 5d3df5eac375f54ea42ded89c48a7fc8f221a61f..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/square.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/applause-20.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/applause-20.png deleted file mode 100644 index 8f39c4618c55666ed738407dd6e423b4ee5a2f12..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/applause-20.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/ic_access_time_grey_20dp.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/ic_access_time_grey_20dp.png deleted file mode 100644 index 00e5112469ea4416e53d6164f5110c60c11c3369..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/ic_access_time_grey_20dp.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/ic_clear_grey_20dp.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/ic_clear_grey_20dp.png deleted file mode 100644 index 8e6d3ce19bfe2a8223c3161c411592a25d769a69..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/ic_clear_grey_20dp.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/ic_fast_forward_grey_20dp.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/ic_fast_forward_grey_20dp.png deleted file mode 100644 index 2416aaefdc638f7656ccfd714a7a7c920dfcfcd0..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/ic_fast_forward_grey_20dp.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/ic_fast_rewind_grey_20dp.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/ic_fast_rewind_grey_20dp.png deleted file mode 100644 index e9d507243f66c59bb5b737530310d73a3415d363..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/ic_fast_rewind_grey_20dp.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/ic_mood_grey_20dp.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/ic_mood_grey_20dp.png deleted file mode 100644 index 60604dbb3cc459b7c7627cadf2bb7c7861a73b8c..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/ic_mood_grey_20dp.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/ic_volume_down_grey_20dp.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/ic_volume_down_grey_20dp.png deleted file mode 100644 index c068c151f6dab4f7f4565c5c1a0cac812bcd4fd7..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/ic_volume_down_grey_20dp.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/ic_volume_up_grey_20dp.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/ic_volume_up_grey_20dp.png deleted file mode 100644 index d625a3f7c72215d767c4a361bea225f3b4bd0766..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/ic_volume_up_grey_20dp.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/icon-3-grey-high-five.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/icon-3-grey-high-five.png deleted file mode 100644 index 08577497f29344b4833c7f040dcb1ebb214f425c..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/icon-3-grey-high-five.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/icon-6-grey-smiling-face.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/icon-6-grey-smiling-face.png deleted file mode 100644 index 9d10ce0c7492c7270989be4e2cabfb0147fcb2a3..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/icon-6-grey-smiling-face.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/icon-6-grey-thumb-up.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/icon-6-grey-thumb-up.png deleted file mode 100644 index 0c78bea9d46b6605f76eb02f9e6400daa43ac7b3..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/icon-6-grey-thumb-up.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/icon-7-grey-sad-face.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/icon-7-grey-sad-face.png deleted file mode 100644 index 5b938878a6083702a51a45649baeb566cf501377..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/icon-7-grey-sad-face.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/icon-7-grey-thumb-down.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/icon-7-grey-thumb-down.png deleted file mode 100644 index f9d48bd5d8c32dffec647c312aef106513569738..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/status/icon-7-grey-thumb-down.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/table.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/table.png deleted file mode 100755 index abcd93689a08ec9bdbf0984927e8da06c043c7cd..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/table.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/text.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/text.png deleted file mode 100644 index 7b49878d92775719aa30e72c873239bf2d09b4f2..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/text.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/transfer.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/transfer.png deleted file mode 100644 index 932be2cb35e7e7ead1ad5a51bc56777a6c8fd1bd..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/transfer.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/transferred.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/transferred.png deleted file mode 100644 index 3d3db7813eee98f29433ad54fa3983879af7bc62..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/transferred.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/triangle.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/triangle.png deleted file mode 100644 index f2b9fb82ddf0806c95b92ae7a961a3dc7c9853b8..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/triangle.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/unlock.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/unlock.png deleted file mode 100755 index d09050420eb92a7060454f1053d8a72352413178..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/unlock.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/unlock_20.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/unlock_20.png deleted file mode 100755 index 364a4630fd79282f7aebe1cf4ca1c5429bea0a86..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/unlock_20.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/upload.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/upload.png deleted file mode 100755 index 030cc3e82aab53ff29cbc0dc4fbe30ee067177be..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/upload.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/user_add.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/user_add.png deleted file mode 100644 index deae99bcff9815d8530a920e754d743700ddd5fb..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/user_add.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/user_delete.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/user_delete.png deleted file mode 100644 index acbb5630e51a12a1cd30ea799d659b309e7041cd..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/user_delete.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/users_settings.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/users_settings.png deleted file mode 100644 index 625775ee11cbc989694ae71c1eb734a1536f987e..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/users_settings.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/vdoc_bg.jpg b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/vdoc_bg.jpg deleted file mode 100755 index 0dfda438df84be7d57567944ff3a89f1f540900a..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/vdoc_bg.jpg and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/webcam.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/webcam.png deleted file mode 100755 index af71c30610862c76f07e948d8c28433c7d338f9a..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/webcam.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/webcam_close.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/webcam_close.png deleted file mode 100755 index 5265a7305e18196d51edcf9db18789c935bb9e9e..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/webcam_close.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/webcam_kickuser.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/webcam_kickuser.png deleted file mode 100755 index 561edc8d9b00d9c97c9acd82b4bf121bc3a77426..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/webcam_kickuser.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/webcam_make_presenter.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/webcam_make_presenter.png deleted file mode 100755 index e7cfff5e97381b5a88d0b96b35508e52e850960e..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/webcam_make_presenter.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/webcam_mute.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/webcam_mute.png deleted file mode 100755 index 3be5bd19cf8cf09beb6c7c7758b21b5deabab69b..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/webcam_mute.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/webcam_new.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/webcam_new.png deleted file mode 100644 index ae305c167a690281fa8f741e2d096605f5b94f99..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/webcam_new.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/webcam_new_20.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/webcam_new_20.png deleted file mode 100755 index b16e85854180ee6aaa152f9151d597a134113d64..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/webcam_new_20.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/webcam_on.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/webcam_on.png deleted file mode 100644 index 6c491aa4b5b75f6e3aeed6f3b75f04f74eff9143..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/webcam_on.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/webcam_private_chat.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/webcam_private_chat.png deleted file mode 100755 index 9fdff988a3cfa2f6ef81f0a2d0de135dd199371e..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/webcam_private_chat.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/webcam_unmute.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/webcam_unmute.png deleted file mode 100755 index 32a685732f0073772bb782662fe37e30a83d5220..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/webcam_unmute.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/whiteboard_thick.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/whiteboard_thick.png deleted file mode 100755 index bff40862405ed472d41faf4f1bf12233f38b8495..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/whiteboard_thick.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/whiteboard_thin.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/whiteboard_thin.png deleted file mode 100755 index 2967c924349fedc2d38aa434795fb530a07f6b12..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/whiteboard_thin.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/core/model/MediaStream.as b/bigbluebutton-client/src/org/bigbluebutton/core/model/MediaStream.as index 54fdd29d97e1d3a363088dd7189d92720427a498..45039624d49a4985949ca0f5ce5d744203055446 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/core/model/MediaStream.as +++ b/bigbluebutton-client/src/org/bigbluebutton/core/model/MediaStream.as @@ -13,5 +13,21 @@ package org.bigbluebutton.core.model this.streamId = streamId; this.userId = userId; } + + public function addViewer(userId: String):void { + for (var i: int=0; i < viewers.length; i++) { + var viewer: String = viewers[i] as String; + if (viewer == userId) return; + } + + viewers.push(userId); + } + + public function removeViewer(userId: String):void { + var index: int = viewers.indexOf(userId); + if (index > -1 && index < viewers.length) { + viewers.removeAt(index); + } + } } } \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/core/model/Webcams.as b/bigbluebutton-client/src/org/bigbluebutton/core/model/Webcams.as index 1cbe721ed3f1a19913b75e44d6bf59fd4d5e2010..7477b547da616fadab1eb8e88684d00bbfd837a7 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/core/model/Webcams.as +++ b/bigbluebutton-client/src/org/bigbluebutton/core/model/Webcams.as @@ -85,7 +85,21 @@ package org.bigbluebutton.core.model return tempArray; } - public function getStreamIdsViewingForUser(userId: String): Array { + public function startedViewingStream(userId: String, streamId: String): void { + var _stream: MediaStream = getStream(streamId); + if (_stream != null) { + _stream.addViewer(userId); + } + } + + public function stoppedViewingStream(userId: String, streamId: String): void { + var _stream: MediaStream = getStream(streamId); + if (_stream != null) { + _stream.removeViewer(userId); + } + } + + public function getStreamIdsIAmViewingForUser(userId: String): Array { var tempArray: Array = new Array(); for (var i:int = 0; i < _webcams.length; i++) { diff --git a/bigbluebutton-client/src/org/bigbluebutton/core/model/users/GuestsApp.as b/bigbluebutton-client/src/org/bigbluebutton/core/model/users/GuestsApp.as index 24383e002aa963fc3f4c6e55b87de4285791a1c7..647b687cf8104a004d5889a5ccd5a687e2b13660 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/core/model/users/GuestsApp.as +++ b/bigbluebutton-client/src/org/bigbluebutton/core/model/users/GuestsApp.as @@ -10,6 +10,10 @@ package org.bigbluebutton.core.model.users private var _guests:ArrayCollection = new ArrayCollection(); + public function getGuests(): Array { + return new ArrayCollection(_guests.toArray()).toArray(); + } + public function add(user: GuestWaiting):void { _guests.addItem(user); } @@ -63,6 +67,14 @@ package org.bigbluebutton.core.model.users return -1; } + public function setGuestPolicy(value: String): void { + _guestPolicy = value; + } + + public function getGuestPolicy(): String { + return _guestPolicy; + } + public function userJoined(vu: GuestWaiting):void { add(vu); } diff --git a/bigbluebutton-client/src/org/bigbluebutton/core/model/users/User2x.as b/bigbluebutton-client/src/org/bigbluebutton/core/model/users/User2x.as index c77edc399719f855e2f2ed552d03026a2c1aa5dd..86d7ec7673698e06e9035b9620f5845fa66562b6 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/core/model/users/User2x.as +++ b/bigbluebutton-client/src/org/bigbluebutton/core/model/users/User2x.as @@ -18,62 +18,7 @@ package org.bigbluebutton.core.model.users // Flag to tell that user is in the process of leaving the meeting. public var isLeavingFlag:Boolean = false; - - [Bindable] private var _viewingStream:Array = new Array(); - - [Bindable] - public function get viewingStream():Array { - return _viewingStream; - } - public function set viewingStream(v:Array):void { - throw new Error("Please use the helpers addViewingStream or removeViewingStream to handle viewingStream"); - } - public function addViewingStream(streamName:String):Boolean { - if (isViewingStream(streamName)) { - return false; - } - - _viewingStream.push(streamName); - return true; - } - public function removeViewingStream(streamName:String):Boolean { - if (!isViewingStream(streamName)) { - return false; - } - - _viewingStream = _viewingStream.filter(function(item:*, index:int, array:Array):Boolean { return item != streamName; }); - return true; - } - private function isViewingStream(streamName:String):Boolean { - return _viewingStream.some(function(item:*, index:int, array:Array):Boolean { return item == streamName; }); - } - public function isViewingAllStreams():Boolean { - return _viewingStream.length == streamNames.length; - } - - [Bindable] public var streamNames:Array = new Array(); - - [Bindable] - public function get streamName():String { - var streams:String = ""; - for each(var stream:String in streamNames) { - streams = streams + stream + "|"; - } - //Remove last | - streams = streams.slice(0, streams.length-1); - return streams; - } - - private function hasThisStream(streamName:String):Boolean { - return streamNames.some(function(item:*, index:int, array:Array):Boolean { return item == streamName; }); - } - - public function set streamName(streamNames:String):void { - if(streamNames) { - var streamNamesList:Array = streamNames.split("|"); - } - } - + public static function copy(source: User2x):User2x { var dest: User2x = new User2x(); dest.intId = source.intId; diff --git a/bigbluebutton-client/src/org/bigbluebutton/core/services/SkinningService.as b/bigbluebutton-client/src/org/bigbluebutton/core/services/SkinningService.as index a4efa296cac6a5d343170223cba3036d13d47213..ad27b582ec4b0cf99266dfbb8f8c1a3b33eb33ba 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/core/services/SkinningService.as +++ b/bigbluebutton-client/src/org/bigbluebutton/core/services/SkinningService.as @@ -1,39 +1,47 @@ /** -* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ -* -* Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below). -* -* This program is free software; you can redistribute it and/or modify it under the -* terms of the GNU Lesser General Public License as published by the Free Software -* Foundation; either version 3.0 of the License, or (at your option) any later -* version. -* -* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY -* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License along -* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. -* -*/ -package org.bigbluebutton.core.services -{ + * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ + * + * Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below). + * + * This program is free software; you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License as published by the Free Software + * Foundation; either version 3.0 of the License, or (at your option) any later + * version. + * + * BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License along + * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. + * + */ +package org.bigbluebutton.core.services { import mx.styles.IStyleManager2; import mx.styles.StyleManager; - + import org.as3commons.lang.StringUtils; + import org.as3commons.logging.api.ILogger; + import org.as3commons.logging.api.getClassLogger; import org.bigbluebutton.core.Options; import org.bigbluebutton.main.model.options.SkinningOptions; - - public class SkinningService - { - private var myStyleManager: IStyleManager2; - + + public class SkinningService { + + private static const LOGGER:ILogger = getClassLogger(SkinningService); + + private var myStyleManager:IStyleManager2; + + private var loadedSkin:String = "V2Theme"; + public function loadSkins():void { var skinOptions:SkinningOptions = Options.getOptions(SkinningOptions) as SkinningOptions; - if (!StringUtils.isEmpty(skinOptions.url)) { + var skinToLoad:String = StringUtils.remove(".css.swf", StringUtils.substringAfterLast(skinOptions.url, "/")); + if (!StringUtils.isEmpty(skinOptions.url) && skinToLoad != loadedSkin) { + LOGGER.info("Loading new skin {}", [skinToLoad]); myStyleManager = StyleManager.getStyleManager(null); - myStyleManager.loadStyleDeclarations(skinOptions.url); + myStyleManager.loadStyleDeclarations(skinOptions.url); + loadedSkin = skinToLoad; } } } diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/BreakoutRoomsListPayload.java b/bigbluebutton-client/src/org/bigbluebutton/main/events/StartedViewingWebcamEvent.as old mode 100644 new mode 100755 similarity index 54% rename from bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/BreakoutRoomsListPayload.java rename to bigbluebutton-client/src/org/bigbluebutton/main/events/StartedViewingWebcamEvent.as index d649ee56e39e78a49991373776e4dc089e85f4d2..e245fa3f278bdcbd670bdebca87a1e68c7e41db2 --- a/bbb-common-message/src/main/java/org/bigbluebutton/messages/payload/BreakoutRoomsListPayload.java +++ b/bigbluebutton-client/src/org/bigbluebutton/main/events/StartedViewingWebcamEvent.as @@ -1,35 +1,38 @@ -/** - * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ - * - * Copyright (c) 2016 BigBlueButton Inc. and by respective authors (see below). - * - * This program is free software; you can redistribute it and/or modify it under the - * terms of the GNU Lesser General Public License as published by the Free Software - * Foundation; either version 3.0 of the License, or (at your option) any later - * version. - * - * BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along - * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. - * - */ -package org.bigbluebutton.messages.payload; - -import java.util.ArrayList; - -public class BreakoutRoomsListPayload { - - public final String meetingId; - public final ArrayList<BreakoutRoomPayload> rooms; - public final Boolean roomsReady; - - public BreakoutRoomsListPayload(String meetingId, - ArrayList<BreakoutRoomPayload> rooms, Boolean roomsReady) { - this.meetingId = meetingId; - this.rooms = rooms; - this.roomsReady = roomsReady; - } -} +/** + * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ + * + * Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below). + * + * This program is free software; you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License as published by the Free Software + * Foundation; either version 3.0 of the License, or (at your option) any later + * version. + * + * BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License along + * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. + * + */ +package org.bigbluebutton.main.events +{ + import flash.events.Event; + + public class StartedViewingWebcamEvent extends Event + { + public static const STARTED_VIEWING_WEBCAM:String = "started viewing webcam event"; + + // The userID of the webcam being viewed. + public var webcamUserID:String; + + // The streamName of the user + public var streamName:String; + + public function StartedViewingWebcamEvent(bubbles:Boolean=true, cancelable:Boolean=false) + { + super(STARTED_VIEWING_WEBCAM, bubbles, cancelable); + } + } +} diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/model/options/BrandingOptions.as b/bigbluebutton-client/src/org/bigbluebutton/main/model/options/BrandingOptions.as index 91303adf0372b4a5acb3c9c8dc579811e8921e80..f598626b67312edf254b83b93ad0b911add2adb5 100644 --- a/bigbluebutton-client/src/org/bigbluebutton/main/model/options/BrandingOptions.as +++ b/bigbluebutton-client/src/org/bigbluebutton/main/model/options/BrandingOptions.as @@ -33,9 +33,6 @@ package org.bigbluebutton.main.model.options { [Bindable] public var toolbarColor:String = ""; - [Bindable] - public var toolbarColorAlphas:Array = []; - public function BrandingOptions() { name = "branding"; } diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/model/options/LayoutOptions.as b/bigbluebutton-client/src/org/bigbluebutton/main/model/options/LayoutOptions.as index 0d4cdabebba6488922df8edc1df40f1ddebacc53..858976ec3dda6ec16c25b2f8e51eb8de1aff09a7 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/model/options/LayoutOptions.as +++ b/bigbluebutton-client/src/org/bigbluebutton/main/model/options/LayoutOptions.as @@ -52,7 +52,7 @@ package org.bigbluebutton.main.model.options { public var logoutOnStopRecording:Boolean = false; [Bindable] - public var showNetworkMonitor:Boolean = true; + public var showNetworkMonitor:Boolean = false; public var defaultLayout:String = "Default"; diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/AudioSelectionWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/AudioSelectionWindow.mxml index 2a0ae3064526a2d9dc1baba0ba18605f351aefb3..4f1a7ae9efc0e61d4be0a730f6fb679d73a5ea70 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/views/AudioSelectionWindow.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/AudioSelectionWindow.mxml @@ -23,69 +23,74 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:mate="http://mate.asfusion.com/" xmlns:common="org.bigbluebutton.common.*" - width="700" height="350" - initialize="init()" - styleName="micSettingsWindowStyle" - showCloseButton="false"> + initialize="init()" + creationComplete="creationCompleteHandler(event)" + close="onCancelClicked()" + verticalScrollPolicy="off" + horizontalScrollPolicy="off" + showCloseButton="true"> <fx:Script> <![CDATA[ - import com.asfusion.mate.events.Dispatcher; - import org.as3commons.logging.api.ILogger; - import org.as3commons.logging.api.getClassLogger; - import org.bigbluebutton.core.Options; - import org.bigbluebutton.core.PopUpUtil; - import org.bigbluebutton.core.model.LiveMeeting; - import org.bigbluebutton.main.api.JSAPI; - import org.bigbluebutton.modules.phone.events.AudioSelectionWindowEvent; - import org.bigbluebutton.modules.phone.events.JoinVoiceConferenceCommand; - import org.bigbluebutton.modules.phone.events.UseFlashModeCommand; - import org.bigbluebutton.modules.phone.models.PhoneOptions; - import org.bigbluebutton.util.i18n.ResourceUtil; + import com.asfusion.mate.events.Dispatcher; + + import mx.core.mx_internal; + import mx.events.FlexEvent; + + import org.as3commons.logging.api.ILogger; + import org.as3commons.logging.api.getClassLogger; + import org.bigbluebutton.core.Options; + import org.bigbluebutton.core.PopUpUtil; + import org.bigbluebutton.core.model.LiveMeeting; + import org.bigbluebutton.main.api.JSAPI; + import org.bigbluebutton.modules.phone.events.AudioSelectionWindowEvent; + import org.bigbluebutton.modules.phone.events.JoinVoiceConferenceCommand; + import org.bigbluebutton.modules.phone.events.UseFlashModeCommand; + import org.bigbluebutton.modules.phone.models.PhoneOptions; + import org.bigbluebutton.util.i18n.ResourceUtil; private static const LOGGER:ILogger = getClassLogger(AudioSelectionWindow); private var phoneOptions:PhoneOptions; private var browserInfo:Array; - + private function init():void { phoneOptions = Options.getOptions(PhoneOptions) as PhoneOptions; browserInfo = JSAPI.getInstance().getBrowserInfo(); - if (!phoneOptions.listenOnlyMode) btnListenOnly.enabled = false; if (phoneOptions.showPhoneOption) { - var dialNumber: String = LiveMeeting.inst().meeting.dialNumber; - var voiceConf: String = LiveMeeting.inst().meeting.voiceConf; - - txtPhone.text=ResourceUtil.getInstance().getString('bbb.audioSelection.txtPhone.text', [dialNumber, voiceConf]); + var dialNumber:String = LiveMeeting.inst().meeting.dialNumber; + var voiceConf:String = LiveMeeting.inst().meeting.voiceConf; + + txtPhone.text = ResourceUtil.getInstance().getString('bbb.audioSelection.txtPhone.text', [dialNumber, voiceConf]); } else { - vrulePhone.visible = vrulePhone.includeInLayout = false; vboxPhone.visible = vboxPhone.includeInLayout = false; - this.width = 450; - this.height = 325; vboxMic.percentWidth = 50; vboxListen.percentWidth = 50; } - + if (!JSAPI.getInstance().isWebRTCAvailable()) { audioBrowserHint.visible = audioBrowserHint.includeInLayout = true; - this.height += 72; } - + // If Puffin browser is deteted and version is less than 4.6 if (browserInfo[0] == "Puffin" && String(browserInfo[2]).substr(0, 3) < "4.6") { - vruleListen.visible = vruleListen.includeInLayout = vboxMic.visible = vboxMic.includeInLayout = false; vboxListen.percentWidth = 100; - if (!phoneOptions.showPhoneOption) { - this.width = this.width/2; - } } } + private function creationCompleteHandler(event:FlexEvent):void + { + this.mx_internal::closeButton.toolTip = ResourceUtil.getInstance().getString('bbb.micSettings.cancel'); + this.mx_internal::closeButton.accessibilityName = ResourceUtil.getInstance().getString('bbb.micSettings.cancel.toolTip'); + + tabIndexer.tabIndices.unshift(this.mx_internal::closeButton); + } + private function onMicClick():void { LOGGER.debug("AudioSelectionWindow - Share Microphone Clicked"); var dispatcher:Dispatcher = new Dispatcher(); @@ -122,17 +127,15 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. </fx:Script> <fx:Declarations> - <common:TabIndexer startIndex="1" tabIndices="{[textArea, btnMicrophone, btnListenOnly, cancelBtn]}"/> + <common:TabIndexer id="tabIndexer" startIndex="1" tabIndices="{[windowTitle, btnMicrophone, btnListenOnly]}"/> </fx:Declarations> - <mx:VBox width="100%" height="100%" paddingBottom="5" paddingLeft="5" paddingRight="5" paddingTop="5" horizontalAlign="right"> - <mx:HBox width="100%" height="60"> - <mx:TextArea borderSkin="{null}" verticalScrollPolicy="off" - editable="false" id="textArea" - text="{ResourceUtil.getInstance().getString('bbb.audioSelection.title')}" - styleName="micSettingsWindowTitleStyle" - width="100%" height="100%" /> - </mx:HBox> + <mx:VBox width="100%" height="100%" paddingBottom="50" paddingLeft="80" paddingRight="80" paddingTop="0" horizontalAlign="center"> + <mx:TextArea borderSkin="{null}" verticalScrollPolicy="off" + editable="false" id="windowTitle" + text="{ResourceUtil.getInstance().getString('bbb.audioSelection.title')}" + styleName="micSettingsWindowTitleStyle" + width="100%" /> <mx:Box width="100%" height="56" verticalAlign="middle" horizontalAlign="center" verticalScrollPolicy="off" horizontalScrollPolicy="off" @@ -140,29 +143,31 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. id="audioBrowserHint" styleName="audioBroswerHintBoxStyle"> <mx:Text width="100%" textAlign="center" text="{ResourceUtil.getInstance().getString('bbb.clientstatus.webrtc.message')}" styleName="audioBroswerHintTextStyle"/> </mx:Box> - <mx:HRule width="100%" /> - <mx:HBox width="100%" height="100%"> + <mx:HBox width="100%" height="100%" styleName="audioSelectionsStyle"> <mx:VBox id="vboxMic" height="100%" width="30%" horizontalAlign="center" verticalAlign="middle"> - <mx:Image source="@Embed('assets/microphone80.png')" /> - <mx:Button id="btnMicrophone" click="onMicClick()" - label="{ResourceUtil.getInstance().getString('bbb.audioSelection.btnMicrophone.label')}" - accessibilityName="{ResourceUtil.getInstance().getString('bbb.audioSelection.btnMicrophone.toolTip')}"/> + <mx:Button id="btnMicrophone" buttonMode="true" styleName="btnMicrophoneStyle" width="140" height="140" + click="onMicClick()" + toolTip="{ResourceUtil.getInstance().getString('bbb.audioSelection.btnMicrophone.label')}" + accessibilityName="{ResourceUtil.getInstance().getString('bbb.audioSelection.btnMicrophone.toolTip')}" /> + <mx:Label text="{ResourceUtil.getInstance().getString('bbb.audioSelection.btnMicrophone.label')}" + styleName="audioSubtitle" /> </mx:VBox> - <mx:VRule id="vruleListen" height="100%" width="5%" /> <mx:VBox id="vboxListen" height="100%" width="30%" horizontalAlign="center" verticalAlign="middle"> - <mx:Image source="@Embed('assets/speaker80.png')" /> - <mx:Button id="btnListenOnly" click="onListenClick()" - label="{ResourceUtil.getInstance().getString('bbb.audioSelection.btnListenOnly.label')}" + <mx:Button id="btnListenOnly" width="140" height="140" buttonMode="true" styleName="btnListenOnlyStyle" + click="onListenClick()" + toolTip="{ResourceUtil.getInstance().getString('bbb.audioSelection.btnListenOnly.label')}" accessibilityName="{ResourceUtil.getInstance().getString('bbb.audioSelection.btnListenOnly.toolTip')}" /> + <mx:Label text="{ResourceUtil.getInstance().getString('bbb.audioSelection.btnListenOnly.label')}" + styleName="audioSubtitle" /> </mx:VBox> - <mx:VRule id="vrulePhone" height="100%" width="5%" /> <mx:VBox id="vboxPhone" height="100%" width="30%" horizontalAlign="center" verticalAlign="middle"> - <mx:Image source="@Embed('assets/phone80.png')" /> + <mx:Button id="btnPhone" + width="140" + height="140" + buttonMode="true" + styleName="btnPhoneStyle" /> <mx:Text id="txtPhone" width="100%" /> </mx:VBox> </mx:HBox> - <mx:HRule width="100%" /> - <mx:Button id="cancelBtn" label="{ResourceUtil.getInstance().getString('bbb.micSettings.cancel')}" accessibilityName="{ResourceUtil.getInstance().getString('bbb.micSettings.cancel.toolTip')}" - click="onCancelClicked()" styleName="micSettingsWindowPlaySoundButtonStyle" /> </mx:VBox> -</mx:TitleWindow> \ No newline at end of file +</mx:TitleWindow> diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/BBBSettings.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/BBBSettings.mxml index 8bc5dd2db50142fc8b392782ae9c720a2cb92383..d7b3b1a7c1235cdd482a0d85009dcb436f6df385 100644 --- a/bigbluebutton-client/src/org/bigbluebutton/main/views/BBBSettings.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/BBBSettings.mxml @@ -10,15 +10,11 @@ <fx:Script> <![CDATA[ - import mx.events.ItemClickEvent; - import mx.managers.PopUpManager; import mx.core.UIComponent; - - import org.bigbluebutton.common.Images; - import org.bigbluebutton.common.LogUtil; + import mx.managers.PopUpManager; + import org.bigbluebutton.main.events.BBBEvent; import org.bigbluebutton.util.i18n.ResourceUtil; - import org.bigbluebutton.common.events.SettingsComponentEvent; private function init():void { this.x = (this.parent.width - this.width) / 2; diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/CameraDisplaySettings.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/CameraDisplaySettings.mxml index 1b2a372a8d09fc0eb73f9886cc3f27da8a34a053..4a7247da16e7a02b5be923848efb776d4fa99af7 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/views/CameraDisplaySettings.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/CameraDisplaySettings.mxml @@ -36,7 +36,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. import mx.collections.ArrayList; import mx.events.CloseEvent; - import org.bigbluebutton.common.Images; import org.bigbluebutton.common.Media; import org.bigbluebutton.core.BBB; import org.bigbluebutton.core.PopUpUtil; @@ -47,8 +46,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. static public var PADDING_HORIZONTAL:Number = 6; static public var PADDING_VERTICAL:Number = 29; - private var images:Images = new Images(); - [Bindable] public var _videoProfiles:ArrayCollection = new ArrayCollection(); public var selectedVideoProfile:VideoProfile; @@ -130,6 +127,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. private function updateCamera():void { btnStartPublish.mouseEnabled = false; + btnStartPublish.enabled = false; selectedVideoProfile = cmbVideoProfile.selectedItem.profile as VideoProfile; if (camerasAvailable.length > cmbCameraSelector.selectedIndex) { @@ -146,8 +144,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. private function videoSuccess():void { btnStartPublish.mouseEnabled = true; + btnStartPublish.enabled = true; btnStartPublish.accessibilityName = ResourceUtil.getInstance().getString('bbb.publishVideo.startPublishBtn.toolTip'); - btnStartPublish.styleName = "cameraDisplaySettingsWindowStartBtn"; } private function videoFailure(reason:String):void { @@ -231,9 +229,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. </mx:Box> <mx:HBox width="100%" height="10%" horizontalAlign="center" horizontalGap="13" paddingRight="5"> - <mx:ComboBox id="cmbCameraSelector" styleName="cameraDisplaySettingsWindowCameraSelector" dataProvider="{camerasAvailable}" width="150" visible="true" labelField="label" change="updateCamera()" height="30"/> - <mx:ComboBox id="cmbVideoProfile" styleName="cameraDisplaySettingsWindowProfileComboStyle" - dataProvider="{_videoProfiles}" visible="false" change="updateCamera()" + <mx:ComboBox id="cmbCameraSelector" dataProvider="{camerasAvailable}" width="150" visible="true" labelField="label" change="updateCamera()" height="30"/> + <mx:ComboBox id="cmbVideoProfile" dataProvider="{_videoProfiles}" visible="false" change="updateCamera()" toolTip="{ResourceUtil.getInstance().getString('bbb.publishVideo.cmbResolution.tooltip')}" height="30" /> </mx:HBox> @@ -241,7 +238,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. <mx:HBox width="100%" height="10%" horizontalAlign="right" horizontalGap="13" paddingRight="5" paddingBottom="5" paddingTop="1"> <mx:Button id="btnStartPublish" toolTip="{ResourceUtil.getInstance().getString('bbb.publishVideo.startPublishBtn.toolTip')}" - click="startPublishing()" mouseEnabled="false" styleName="cameraDisplaySettingsWindowStartBtnDisabled" + click="startPublishing()" mouseEnabled="false" enabled="true" styleName="cameraDisplaySettingsWindowStartBtn" label="{ResourceUtil.getInstance().getString('bbb.publishVideo.startPublishBtn.labelText')}"/> <mx:Button id="btnClosePublish" click="onCancelClicked()" diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/ClientStatusItemRenderer.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/ClientStatusItemRenderer.mxml index 8e65701aa2a9f2c367cc7c19d1ecc50a93934a11..ed707c72b1d3d1a195ea9096f6321457091292ab 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/views/ClientStatusItemRenderer.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/ClientStatusItemRenderer.mxml @@ -11,13 +11,13 @@ switch (value.type) { case "success": - typeImg.source = typeImg.getStyle("successImage"); + typeImg.source = getStyle("iconSuccess"); break; case "warning": - typeImg.source = typeImg.getStyle("warningImage"); + typeImg.source = getStyle("iconWarning"); break; case "fail": - typeImg.source = typeImg.getStyle("failImage"); + typeImg.source = getStyle("iconFail"); break } titleLbl.text = value.title; @@ -31,7 +31,7 @@ } ]]> </fx:Script> - <mx:Image id="typeImg" width="34" height="34" styleName="statusImageStyle" /> + <mx:Image id="typeImg" width="34" height="34" /> <mx:VBox width="100%" verticalGap="0"> <mx:Label id="titleLbl" width="100%" styleName="statusTitleStyle"/> <mx:Text id="messageTxt" width="100%" styleName="statusMessageStyle"/> diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/FlashMicSettings.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/FlashMicSettings.mxml index 63af8c79019081b530d2844cd8dedbb800fd9987..4e6a78b9f2d5d44f928657c24159db94c0dad725 100644 --- a/bigbluebutton-client/src/org/bigbluebutton/main/views/FlashMicSettings.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/FlashMicSettings.mxml @@ -49,7 +49,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. import org.as3commons.logging.api.ILogger; import org.as3commons.logging.api.getClassLogger; - import org.bigbluebutton.common.Images; import org.bigbluebutton.common.Media; import org.bigbluebutton.core.Options; import org.bigbluebutton.core.PopUpUtil; @@ -85,9 +84,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. private var mic:Microphone; private var audioMicLevelDetected:int = 0; private var playingAudio:Boolean = false; - private var images:Images = new Images(); - - [Bindable] private var cancelIcon:Class = images.cancel; [Bindable] private var microphoneList:Array; private var doingEchoTest:Boolean = false; diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/GuestItem.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/GuestItem.mxml index ffcba46abaec489b21b648a7ab28d39c4ba34fb1..ad5309b71cf463312abb7c6c823529346fd23324 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/views/GuestItem.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/GuestItem.mxml @@ -27,11 +27,9 @@ <fx:Script> <![CDATA[ import com.asfusion.mate.events.Dispatcher; + import org.bigbluebutton.main.events.ResponseModeratorEvent; import org.bigbluebutton.util.i18n.ResourceUtil; - import mx.containers.HBox; - import mx.controls.Button; - import mx.controls.Spacer; private var dispatcher:Dispatcher = new Dispatcher(); @@ -47,7 +45,7 @@ sendResponseToServer(false); } - private function onAcceptUserBtnClick():void { + private function onAllowUserBtnClick():void { sendResponseToServer(true); } @@ -64,6 +62,6 @@ <mx:Label text="{username}" maxWidth="150" /> <mx:Spacer width="100%" /> <mx:Button styleName="denyButtonStyle" toolTip="{ResourceUtil.getInstance().getString('bbb.guests.denyBtn.toolTip')}" click="onRejectUserBtnClick()" /> - <mx:Button styleName="acceptButtonStyle" toolTip="{ResourceUtil.getInstance().getString('bbb.guests.allowBtn.toolTip')}" click="onAcceptUserBtnClick()" /> + <mx:Button styleName="allowButtonStyle" toolTip="{ResourceUtil.getInstance().getString('bbb.guests.allowBtn.toolTip')}" click="onAllowUserBtnClick()" /> </mx:HBox> diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/GuestWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/GuestWindow.mxml index 0410ff048c9ccc4089c8de9d1e3af62aebf6cb99..c2500aec3de807f6acecf37967ed66fe9591a723 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/views/GuestWindow.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/GuestWindow.mxml @@ -1,140 +1,146 @@ <?xml version="1.0" encoding="utf-8"?> <!-- - BigBlueButton open source conferencing system - http://www.bigbluebutton.org +BigBlueButton open source conferencing system - http://www.bigbluebutton.org - Copyright (c) 2010 BigBlueButton Inc. and by respective authors (see below). +Copyright (c) 2010 BigBlueButton Inc. and by respective authors (see below). - BigBlueButton is free software; you can redistribute it and/or modify it under the - terms of the GNU Lesser General Public License as published by the Free Software - Foundation; either version 2.1 of the License, or (at your option) any later - version. +BigBlueButton is free software; you can redistribute it and/or modify it under the +terms of the GNU Lesser General Public License as published by the Free Software +Foundation; either version 2.1 of the License, or (at your option) any later +version. - BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public License along - with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. +You should have received a copy of the GNU Lesser General Public License along +with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. - $Id: $ +$Id: $ --> <mx:TitleWindow xmlns:mx="library://ns.adobe.com/flex/mx" - xmlns:fx="http://ns.adobe.com/mxml/2009" - title="{ResourceUtil.getInstance().getString('bbb.guests.title')}" showCloseButton="false" creationComplete="init()" - x="0" y="0" layout="vertical" width="320" horizontalAlign="center" - xmlns:mate="http://mate.asfusion.com/" > - - <fx:Declarations> - <mate:Listener type="{BBBEvent.ACCEPT_ALL_WAITING_GUESTS}" method="acceptAllWaitingGuests" /> - <mate:Listener type="{BBBEvent.DENY_ALL_WAITING_GUESTS}" method="denyAllWaitingGuests" /> - <mate:Listener type="{RemoveGuestFromViewEvent.REMOVE_GUEST}" receive="{remove(event.userid)}" /> - </fx:Declarations> - - <fx:Script> - <![CDATA[ - import mx.managers.PopUpManager; - import com.asfusion.mate.events.Dispatcher; - import org.bigbluebutton.main.events.RemoveGuestEvent; - import org.bigbluebutton.main.events.ResponseModeratorEvent; - import org.bigbluebutton.main.events.RemoveGuestFromViewEvent; - import org.bigbluebutton.util.i18n.ResourceUtil; - import mx.controls.Button; - import mx.events.CloseEvent; - import org.bigbluebutton.main.events.BBBEvent; - - private var guestButtons:Object = new Object(); - [Bindable] private var numberOfGuests:Number = 0; - private var dispatcher:Dispatcher = new Dispatcher(); - - public function init():void { - //Uncomment this line to make titlewindow undraggable - //this.isPopUp = false; - } - - public function refreshGuestView(listOfGuests:Object):void { - for (var userid:String in listOfGuests) { - if(guestButtons[userid] == null) { - var guestItem:GuestItem = new GuestItem(); - guestItem.setUser(listOfGuests[userid], userid); - guestListBox.addChild(guestItem); - guestButtons[userid] = guestItem; - numberOfGuests++; - } - } - this.visible = true; - } - - public function sendResponseToAllGuests(resp:Boolean):void { - removeAllGuests(); - var respCommand:ResponseModeratorEvent = new ResponseModeratorEvent(ResponseModeratorEvent.RESPONSE_ALL); - respCommand.resp = resp; - dispatcher.dispatchEvent(respCommand); - } - - public function sendResponseToAllGuestsCheckBox(resp:Boolean):void { - if(rememberCheckBox.selected) { - var event:BBBEvent = new BBBEvent(BBBEvent.BROADCAST_GUEST_POLICY); - if (resp) { - event.payload['guestPolicy'] = "ALWAYS_ACCEPT"; - } else { - event.payload['guestPolicy'] = "ALWAYS_DENY"; - } - dispatcher.dispatchEvent(event); - } - sendResponseToAllGuests(resp); - } - - public function acceptAllWaitingGuests(event:BBBEvent):void { - sendResponseToAllGuests(true); - } - - public function denyAllWaitingGuests(event:BBBEvent):void { - sendResponseToAllGuests(false); - } - - public function removeAllGuests():void { - var removeGuestEvent:RemoveGuestEvent = new RemoveGuestEvent(RemoveGuestEvent.REMOVE_ALL); - dispatcher.dispatchEvent(removeGuestEvent); - - closeWindow(); - } - - public function remove(userid:String):void { - if (guestButtons[userid] != null) { - numberOfGuests = numberOfGuests - 1; - guestListBox.removeChild(guestButtons[userid]); - delete guestButtons[userid]; - - var removeGuestEvent:RemoveGuestEvent = new RemoveGuestEvent(); - removeGuestEvent.userid = userid; - dispatcher.dispatchEvent(removeGuestEvent); - - if (!hasGuest()) { - closeWindow(); - } - } - } - - public function hasGuest():Boolean { - return numberOfGuests > 0; - } - - public function closeWindow():void { - this.visible = false; - PopUpManager.removePopUp(this); - dispatchEvent(new CloseEvent(CloseEvent.CLOSE)); - } - - ]]> - </fx:Script> - <mx:Label text="{numberOfGuests > 1? ResourceUtil.getInstance().getString('bbb.guests.message.plural', [String(numberOfGuests)]): ResourceUtil.getInstance().getString('bbb.guests.message.singular', [String(numberOfGuests)])}"/> - <mx:HRule width="100%"/> - <mx:Button id="allowEveryoneBtn" label="{ResourceUtil.getInstance().getString('bbb.guests.allowEveryoneBtn.text')}" width="70%" click="sendResponseToAllGuestsCheckBox(true)" toolTip="{allowEveryoneBtn.label}"/> - <mx:Button id="denyEveryoneBtn" label="{ResourceUtil.getInstance().getString('bbb.guests.denyEveryoneBtn.text')}" width="70%" click="sendResponseToAllGuestsCheckBox(false)" toolTip="{denyEveryoneBtn.label}"/> - <mx:CheckBox id="rememberCheckBox" label="{ResourceUtil.getInstance().getString('bbb.guests.rememberAction.text')}"/> - <mx:HRule width="100%"/> - <mx:VBox id="guestListBox" width="100%" height="100%" maxHeight="200" paddingLeft="10" paddingRight="10" paddingBottom="2" /> - + xmlns:fx="http://ns.adobe.com/mxml/2009" + title="{ResourceUtil.getInstance().getString('bbb.guests.title')}" showCloseButton="false" creationComplete="init()" + x="0" y="0" layout="vertical" width="320" horizontalAlign="center" + xmlns:mate="http://mate.asfusion.com/" > + + <fx:Declarations> + <mate:Listener type="{BBBEvent.ACCEPT_ALL_WAITING_GUESTS}" method="acceptAllWaitingGuests" /> + <mate:Listener type="{BBBEvent.DENY_ALL_WAITING_GUESTS}" method="denyAllWaitingGuests" /> + <mate:Listener type="{RemoveGuestFromViewEvent.REMOVE_GUEST}" receive="{remove(event.userid)}" /> + </fx:Declarations> + + <fx:Script> + <![CDATA[ + import com.asfusion.mate.events.Dispatcher; + + import mx.controls.Button; + import mx.events.CloseEvent; + import mx.managers.PopUpManager; + + import org.bigbluebutton.core.model.LiveMeeting; + import org.bigbluebutton.core.model.users.GuestWaiting; + import org.bigbluebutton.main.events.BBBEvent; + import org.bigbluebutton.main.events.RemoveGuestEvent; + import org.bigbluebutton.main.events.RemoveGuestFromViewEvent; + import org.bigbluebutton.main.events.ResponseModeratorEvent; + import org.bigbluebutton.util.i18n.ResourceUtil; + + private var guestButtons:Object = new Object(); + [Bindable] private var numberOfGuests:Number = 0; + private var dispatcher:Dispatcher = new Dispatcher(); + + public function init():void { + //Uncomment this line to make titlewindow undraggable + //this.isPopUp = false; + } + + public function refreshGuestView():void { + var _guests: Array = LiveMeeting.inst().guestsWaiting.getGuests(); + for (var i:int = 0; i < _guests.length; i++) { + var _guest: GuestWaiting = _guests[i] as GuestWaiting; + if(guestButtons[_guest.intId] == null) { + var guestItem:GuestItem = new GuestItem(); + guestItem.setUser(_guest.name, _guest.intId); + guestListBox.addChild(guestItem); + guestButtons[_guest.intId] = guestItem; + numberOfGuests++; + } + } + this.visible = true; + } + + public function sendResponseToAllGuests(resp:Boolean):void { + removeAllGuests(); + var respCommand:ResponseModeratorEvent = new ResponseModeratorEvent(ResponseModeratorEvent.RESPONSE_ALL); + respCommand.resp = resp; + dispatcher.dispatchEvent(respCommand); + } + + public function sendResponseToAllGuestsCheckBox(resp:Boolean):void { + if(rememberCheckBox.selected) { + var event:BBBEvent = new BBBEvent(BBBEvent.BROADCAST_GUEST_POLICY); + if (resp) { + event.payload['guestPolicy'] = "ALWAYS_ACCEPT"; + } else { + event.payload['guestPolicy'] = "ALWAYS_DENY"; + } + dispatcher.dispatchEvent(event); + } + sendResponseToAllGuests(resp); + } + + public function acceptAllWaitingGuests(event:BBBEvent):void { + sendResponseToAllGuests(true); + } + + public function denyAllWaitingGuests(event:BBBEvent):void { + sendResponseToAllGuests(false); + } + + public function removeAllGuests():void { + var removeGuestEvent:RemoveGuestEvent = new RemoveGuestEvent(RemoveGuestEvent.REMOVE_ALL); + dispatcher.dispatchEvent(removeGuestEvent); + + closeWindow(); + } + + public function remove(userid:String):void { + if (guestButtons[userid] != null) { + numberOfGuests = numberOfGuests - 1; + guestListBox.removeChild(guestButtons[userid]); + delete guestButtons[userid]; + + var removeGuestEvent:RemoveGuestEvent = new RemoveGuestEvent(); + removeGuestEvent.userid = userid; + dispatcher.dispatchEvent(removeGuestEvent); + + if (!hasGuest()) { + closeWindow(); + } + } + } + + public function hasGuest():Boolean { + return numberOfGuests > 0; + } + + public function closeWindow():void { + this.visible = false; + PopUpManager.removePopUp(this); + //dispatchEvent(new CloseEvent(CloseEvent.CLOSE)); + } + + ]]> + </fx:Script> + <mx:Label text="{numberOfGuests > 1? ResourceUtil.getInstance().getString('bbb.guests.message.plural', [String(numberOfGuests)]): ResourceUtil.getInstance().getString('bbb.guests.message.singular', [String(numberOfGuests)])}"/> + <mx:HRule width="100%"/> + <mx:Button id="allowEveryoneBtn" label="{ResourceUtil.getInstance().getString('bbb.guests.allowEveryoneBtn.text')}" width="70%" click="sendResponseToAllGuestsCheckBox(true)" toolTip="{allowEveryoneBtn.label}"/> + <mx:Button id="denyEveryoneBtn" label="{ResourceUtil.getInstance().getString('bbb.guests.denyEveryoneBtn.text')}" width="70%" click="sendResponseToAllGuestsCheckBox(false)" toolTip="{denyEveryoneBtn.label}"/> + <mx:CheckBox id="rememberCheckBox" label="{ResourceUtil.getInstance().getString('bbb.guests.rememberAction.text')}"/> + <mx:HRule width="100%"/> + <mx:VBox id="guestListBox" width="100%" height="100%" maxHeight="200" paddingLeft="10" paddingRight="10" paddingBottom="2" /> + </mx:TitleWindow> diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/LoadingBar.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/LoadingBar.mxml index 4abf9fc5532cad365e0bb3a3c952b6395ed6bfd1..9612dcae0d49bb3b82e87166a511260ac857813c 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/views/LoadingBar.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/LoadingBar.mxml @@ -20,18 +20,28 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. --> -<mx:ProgressBar xmlns:mate="http://mate.asfusion.com/" xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:mx="library://ns.adobe.com/flex/mx" - labelPlacement="bottom" minimum="0" maximum="100" mode="manual" > - +<mx:ProgressBar xmlns:mate="http://mate.asfusion.com/" + xmlns:fx="http://ns.adobe.com/mxml/2009" + xmlns:mx="library://ns.adobe.com/flex/mx" + minimum="0" + maximum="100" + mode="manual"> + <fx:Declarations> - <mate:Listener type="{ModuleLoadEvent.MODULE_LOADING_STARTED}" method="moduleLoadingStarted" /> - <mate:Listener type="{ModuleLoadEvent.MODULE_LOAD_PROGRESS}" method="moduleLoadProgress" /> - <mate:Listener type="{ModuleLoadEvent.ALL_MODULES_LOADED}" method="allModulesLoaded" /> - <mate:Listener type="{PortTestEvent.TEST_RTMP}" method="testRTMP" /> - <mate:Listener type="{PortTestEvent.PORT_TEST_UPDATE}" method="testRTMPupdate" /> - <mate:Listener type="{PortTestEvent.TUNNELING_FAILED}" method="tunnelingFailed" /> + <mate:Listener type="{ModuleLoadEvent.MODULE_LOADING_STARTED}" + method="moduleLoadingStarted" /> + <mate:Listener type="{ModuleLoadEvent.MODULE_LOAD_PROGRESS}" + method="moduleLoadProgress" /> + <mate:Listener type="{ModuleLoadEvent.ALL_MODULES_LOADED}" + method="allModulesLoaded" /> + <mate:Listener type="{PortTestEvent.TEST_RTMP}" + method="testRTMP" /> + <mate:Listener type="{PortTestEvent.PORT_TEST_UPDATE}" + method="testRTMPupdate" /> + <mate:Listener type="{PortTestEvent.TUNNELING_FAILED}" + method="tunnelingFailed" /> </fx:Declarations> - + <fx:Script> <![CDATA[ import org.as3commons.logging.api.ILogger; @@ -40,58 +50,59 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. import org.bigbluebutton.main.events.ModuleLoadEvent; import org.bigbluebutton.main.events.PortTestEvent; import org.bigbluebutton.util.i18n.ResourceUtil; - - private static const LOGGER:ILogger = getClassLogger(LoadingBar); - - private var modules:Dictionary = new Dictionary(); - private var numModules:int = 0; - private var portUpdateStr:String = 'Connecting to the server'; - - private function moduleLoadingStarted(e:ModuleLoadEvent):void{ - numModules = BBB.getConfigManager().config.numberOfModules(); - this.label = ResourceUtil.getInstance().getString('bbb.mainshell.statusProgress.loading', [numModules]); - this.visible = true; - } - - private function moduleLoadProgress(e:ModuleLoadEvent):void{ - modules[e.moduleName] = e.progress; - updateProgress(); - } - - private function updateProgress():void{ - var totalProgress:Number = 0; - for (var key:Object in modules) { - var progress:Number = modules[key] as Number; - totalProgress += progress; - } - - ExternalInterface.call("setProgressBar", int(totalProgress/numModules)); - //LogUtil.debug("Progress: " + totalProgress); - this.setProgress(totalProgress/numModules, 100); - } - - private function allModulesLoaded(e:ModuleLoadEvent):void{ - ExternalInterface.call("removeProgressBar"); - if (parent != null) parent.removeChild(this); - } - - private function testRTMP(e:PortTestEvent):void{ - //- Cannot get locale string this early in loading process - portUpdateStr += "." - this.label = portUpdateStr; //ResourceUtil.getInstance().getString('bbb.mainshell.statusProgress.connecting'); - } - - private function testRTMPupdate(e:PortTestEvent):void{ - //- Cannot get locale string this early in loading process - portUpdateStr += "..."; - this.label = portUpdateStr; //ResourceUtil.getInstance().getString('bbb.mainshell.statusProgress.connecting'); - } - - private function tunnelingFailed(e:PortTestEvent):void{ - this.label = ResourceUtil.getInstance().getString('bbb.mainshell.statusProgress.cannotConnectServer'); - } - - + + private static const LOGGER:ILogger = getClassLogger(LoadingBar); + + private var modules:Dictionary = new Dictionary(); + + private var numModules:int = 0; + + private var portUpdateStr:String = 'Connecting to the server'; + + private function moduleLoadingStarted(e:ModuleLoadEvent):void { + numModules = BBB.getConfigManager().config.numberOfModules(); + this.label = ResourceUtil.getInstance().getString('bbb.mainshell.statusProgress.loading', [numModules]); + this.visible = true; + } + + private function moduleLoadProgress(e:ModuleLoadEvent):void { + modules[e.moduleName] = e.progress; + updateProgress(); + } + + private function updateProgress():void { + var totalProgress:Number = 0; + for (var key:Object in modules) { + var progress:Number = modules[key] as Number; + totalProgress += progress; + } + + ExternalInterface.call("setProgressBar", int(totalProgress / numModules)); + //LogUtil.debug("Progress: " + totalProgress); + this.setProgress(totalProgress / numModules, 100); + } + + private function allModulesLoaded(e:ModuleLoadEvent):void { + ExternalInterface.call("removeProgressBar"); + if (parent != null) + parent.removeChild(this); + } + + private function testRTMP(e:PortTestEvent):void { + //- Cannot get locale string this early in loading process + portUpdateStr += "." + this.label = portUpdateStr; //ResourceUtil.getInstance().getString('bbb.mainshell.statusProgress.connecting'); + } + + private function testRTMPupdate(e:PortTestEvent):void { + //- Cannot get locale string this early in loading process + portUpdateStr += "..."; + this.label = portUpdateStr; //ResourceUtil.getInstance().getString('bbb.mainshell.statusProgress.connecting'); + } + + private function tunnelingFailed(e:PortTestEvent):void { + this.label = ResourceUtil.getInstance().getString('bbb.mainshell.statusProgress.cannotConnectServer'); + } ]]> </fx:Script> </mx:ProgressBar> diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/LockSettings.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/LockSettings.mxml index bde6a51e43262ef524118081d0984bc134405ff9..126cca8c4ffb2b1dafc03d55812465ec9d2f3d21 100644 --- a/bigbluebutton-client/src/org/bigbluebutton/main/views/LockSettings.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/LockSettings.mxml @@ -32,16 +32,11 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. <![CDATA[ import mx.events.CloseEvent; - import org.bigbluebutton.common.Images; import org.bigbluebutton.core.PopUpUtil; import org.bigbluebutton.core.events.LockControlEvent; import org.bigbluebutton.core.vo.LockSettingsVO; import org.bigbluebutton.util.i18n.ResourceUtil; - private var images:Images = new Images(); - - [Bindable] private var cancelIcon:Class = images.cancel; - [Bindable] public var disableCam:Boolean = false; [Bindable] public var disableMic:Boolean = false; [Bindable] public var disablePubChat:Boolean = false; diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/MainApplicationShell.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/MainApplicationShell.mxml index 27bce1aad3cc85250a2f9a49b9ea97fd31bb0c13..27fdaad4d96cebf21fc1dc35876833ab069ee2ac 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/views/MainApplicationShell.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/MainApplicationShell.mxml @@ -31,7 +31,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. xmlns:api="org.bigbluebutton.main.api.*" xmlns:common="org.bigbluebutton.common.*" horizontalScrollPolicy="off" verticalScrollPolicy="off" - backgroundColor="white" styleName="mainVBox" creationComplete="initializeShell()" addedToStage="onAddedToStage()" verticalGap="0"> @@ -79,7 +78,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. <mate:Listener type="{BBBEvent.RETRIEVE_GUEST_POLICY}" method="setGuestPolicy"/> <mate:Listener type="{ConnectionFailedEvent.MODERATOR_DENIED_ME}" method="handleLogout" /> <mate:Listener type="{BBBEvent.MODERATOR_ALLOWED_ME_TO_JOIN}" method="guestAllowed" /> - <mate:Listener type="{RefreshGuestEvent.REFRESH_GUEST_VIEW}" method="refreshGuestView" /> + <mate:Listener type="{NewGuestWaitingEvent.NEW_GUEST_WAITING}" method="refreshGuestView" /> <mate:Listener type="{BBBEvent.REMOVE_GUEST_FROM_LIST}" method="removeGuestWindow" /> <mate:Listener type="{BBBEvent.WAITING_FOR_MODERATOR_ACCEPTANCE}" method="openWaitWindow" /> <mate:Listener type="{BBBEvent.RECONNECT_DISCONNECTED_EVENT}" method="closeWaitWindow"/> @@ -109,7 +108,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. import org.as3commons.logging.api.ILogger; import org.as3commons.logging.api.getClassLogger; import org.bigbluebutton.common.IBbbModuleWindow; - import org.bigbluebutton.common.Images; import org.bigbluebutton.common.events.AddUIComponentToMainCanvas; import org.bigbluebutton.common.events.CloseWindowEvent; import org.bigbluebutton.common.events.OpenWindowEvent; @@ -119,6 +117,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. import org.bigbluebutton.core.PopUpUtil; import org.bigbluebutton.core.UsersUtil; import org.bigbluebutton.core.events.LockControlEvent; + import org.bigbluebutton.core.events.NewGuestWaitingEvent; import org.bigbluebutton.core.events.SwitchedLayoutEvent; import org.bigbluebutton.core.vo.LockSettingsVO; import org.bigbluebutton.main.events.AppVersionEvent; @@ -131,7 +130,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. import org.bigbluebutton.main.events.MeetingNotFoundEvent; import org.bigbluebutton.main.events.ModuleLoadEvent; import org.bigbluebutton.main.events.NetworkStatsEvent; - import org.bigbluebutton.main.events.RefreshGuestEvent; import org.bigbluebutton.main.events.ShortcutEvent; import org.bigbluebutton.main.model.Guest; import org.bigbluebutton.main.model.ImageLoader; @@ -146,6 +144,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. import org.bigbluebutton.modules.phone.events.WebRTCEchoTestEvent; import org.bigbluebutton.modules.phone.events.WebRTCMediaEvent; import org.bigbluebutton.modules.phone.models.PhoneOptions; + import org.bigbluebutton.modules.users.model.UsersOptions; import org.bigbluebutton.modules.users.views.BreakoutRoomSettings; import org.bigbluebutton.modules.videoconf.events.ShareCameraRequestEvent; import org.bigbluebutton.util.i18n.ResourceUtil; @@ -154,7 +153,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. private var globalDispatcher:Dispatcher; private var dispState:String; //full-screen? - private var images:Images = new Images(); private var stoppedModules:ArrayCollection; private var logWindow:LogWindow; private var waitWindow:WaitingWindow = null; @@ -168,9 +166,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. private var localeVersion:String = 'old'; [Bindable] public var numberOfModules:int = 0; - [Bindable] private var fullscreen_icon:Class = images.full_screen; - [Bindable] private var logs_icon:Class = images.table; - private var receivedConfigLocaleVer:Boolean = false; private var receivedResourceLocaleVer:Boolean = false; @@ -184,15 +179,16 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. [Bindable] private var layoutOptions:LayoutOptions; [Bindable] private var brandingOptions:BrandingOptions; + [Bindable] private var usersOptions:UsersOptions; [Bindable] private var showToolbarOpt:Boolean = true; [Bindable] private var _showToolbar:Boolean = true; - private const DEFAULT_TOOLBAR_HEIGHT:Number = 32; + private const DEFAULT_TOOLBAR_HEIGHT:Number = 50; [Bindable] private var toolbarHeight:Number = DEFAULT_TOOLBAR_HEIGHT; [Bindable] private var toolbarPaddingTop:Number = 2; [Bindable] private var showFooterOpt:Boolean = true; [Bindable] private var _showFooter:Boolean = true; - [Bindable] private var footerHeight:Number = 24; + [Bindable] private var footerHeight:Number = 60; [Bindable] private var isTunneling:Boolean = false; @@ -221,7 +217,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. public function initOptions(e:Event):void { brandingOptions = Options.getOptions(BrandingOptions) as BrandingOptions; layoutOptions = Options.getOptions(LayoutOptions) as LayoutOptions; - + usersOptions = Options.getOptions(UsersOptions) as UsersOptions; + updateCopyrightText(); loadBackground(); @@ -428,7 +425,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. var appHeight:Number = parentApplication.height; mdiCanvas.width = appWidth; - mdiCanvas.height = appHeight - (_showFooter? footerHeight: 0) - (_showToolbar? toolbarHeight: 0); + mdiCanvas.height = appHeight - (_showFooter ? footerHeight: 0) - (_showToolbar ? toolbarHeight: 0); updateCanvasBackgroundDimensions(); } @@ -483,11 +480,11 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. dispState = stage.displayState + " (fullScreen=" + evt.fullScreen.toString() + ")"; if (evt.fullScreen) { LOGGER.debug("Switching to full screen"); - fullscreen_icon = images.exit_full_screen; + fullScreenBtn.styleName = "exitFullScreenButton" hideToolbars(); } else { LOGGER.debug("Switching to normal screen"); - fullscreen_icon = images.full_screen; + fullScreenBtn.styleName = "fullScreenButton" showToolbars(); } } @@ -499,9 +496,9 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. } } - private function refreshGuestView(evt:RefreshGuestEvent):void { + private function refreshGuestView(evt:NewGuestWaitingEvent):void { // do not show the guest window if the user isn't moderator or if he's waiting for acceptance - if (!UsersUtil.amIModerator() || UsersUtil.amIWaitingForAcceptance()) { + if (!UsersUtil.amIModerator() || UsersUtil.amIWaitingForAcceptance() && usersOptions.enableGuestUI) { closeGuestWindow(); return; } @@ -513,7 +510,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. guestWindow.x = systemManager.screen.width - guestWindow.width - 20; guestWindow.y = 20; } - guestWindow.refreshGuestView(evt.listOfGuests); + guestWindow.refreshGuestView(); } public function removeGuestWindow(evt:BBBEvent):void { @@ -1029,14 +1026,17 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. paddingTop="{toolbarPaddingTop}" updateComplete="updateToolbarHeight()" paddingBottom="0" /> - - <views:MainCanvas id="mdiCanvas" - horizontalScrollPolicy="off" - verticalScrollPolicy="off" - effectsLib="{flexlib.mdi.effects.effectsLib.MDIVistaEffects}" - width="100%" > + + <!-- MainCanvas height has to be forced or it will never show and the application will not continue loading --> + <views:MainCanvas id="mdiCanvas" + horizontalScrollPolicy="off" + verticalScrollPolicy="off" + styleName="mdiCanvasStyle" + effectsLib="{flexlib.mdi.effects.effectsLib.MDIVistaEffects}" + height="150" + width="100%"> <mx:Canvas id="backgroundPlaceHolder" width="100%" height="100%" /> - <views:LoadingBar id="progressBar" horizontalCenter="0" verticalCenter="0" width="50%" /> + <views:LoadingBar id="progressBar" horizontalCenter="0" verticalCenter="0" width="280" height="15"/> <views:BrandingLogo x="{this.width - 300}" y="{this.height - 300}" /> </views:MainCanvas> @@ -1064,8 +1064,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. visible="false" height="20" width="180" - accessibilityName="{ResourceUtil.getInstance().getString('bbb.mainToolbar.langSelector')}" - styleName="languageSelectorStyle"/> + accessibilityName="{ResourceUtil.getInstance().getString('bbb.mainToolbar.langSelector')}"/> <mx:Button width="20" height="20" @@ -1073,9 +1072,9 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. includeInLayout="{layoutOptions.showLogButton}" toolTip="{ResourceUtil.getInstance().getString('bbb.mainshell.logBtn.toolTip')}" id="logBtn" - icon="{logs_icon}" + styleName="logsButton" click="openLogWindow()"/> <mx:HBox id="addedBtns" /> - <mx:Button width="20" height="20" toolTip="{ResourceUtil.getInstance().getString('bbb.mainshell.fullscreenBtn.toolTip')}" id="fullScreen" icon="{fullscreen_icon}" click="toggleFullScreen()" /> + <mx:Button width="20" height="20" toolTip="{ResourceUtil.getInstance().getString('bbb.mainshell.fullscreenBtn.toolTip')}" id="fullScreenBtn" styleName="fullScreenButton" click="toggleFullScreen()" /> </mx:ControlBar> </mx:VBox> diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/MainToolbar.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/MainToolbar.mxml index 146172c1d89d8906eaec565688a3e184748ad82a..7bccd322c6303423ec9be381a2625d4a0025cd8c 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/views/MainToolbar.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/MainToolbar.mxml @@ -22,8 +22,10 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. <mx:ApplicationControlBar xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:fx="http://ns.adobe.com/mxml/2009" - xmlns:mate="http://mate.asfusion.com/" xmlns:common="org.bigbluebutton.common.*" + xmlns:mate="http://mate.asfusion.com/" + xmlns:common="org.bigbluebutton.common.*" xmlns:views="org.bigbluebutton.main.views.*" + xmlns:components="org.bigbluebutton.modules.phone.views.components.*" enabled="true" visible="{showToolbar}" initialize="init()"> @@ -50,44 +52,45 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. </fx:Declarations> <fx:Script> <![CDATA[ - import com.asfusion.mate.events.Dispatcher; - - import mx.binding.utils.BindingUtils; - import mx.controls.Alert; - import mx.core.FlexGlobals; - import mx.core.IToolTip; - import mx.core.UIComponent; - import mx.events.CloseEvent; - import mx.events.ToolTipEvent; - import mx.managers.PopUpManager; - - import org.as3commons.lang.ArrayUtils; - import org.as3commons.lang.StringUtils; - import org.as3commons.logging.api.ILogger; - import org.as3commons.logging.api.getClassLogger; - import org.bigbluebutton.common.IBbbToolbarComponent; - import org.bigbluebutton.common.events.SettingsComponentEvent; - import org.bigbluebutton.common.events.ToolbarButtonEvent; - import org.bigbluebutton.core.BBB; - import org.bigbluebutton.core.Options; - import org.bigbluebutton.core.UsersUtil; - import org.bigbluebutton.core.model.Config; - import org.bigbluebutton.core.model.LiveMeeting; - import org.bigbluebutton.main.events.BBBEvent; - import org.bigbluebutton.main.events.ConfigLoadedEvent; - import org.bigbluebutton.main.events.LogoutEvent; - import org.bigbluebutton.main.events.NetworkStatsEvent; - import org.bigbluebutton.main.events.SettingsEvent; - import org.bigbluebutton.main.events.ShortcutEvent; - import org.bigbluebutton.main.events.SuccessfulLoginEvent; - import org.bigbluebutton.main.model.NetworkStatsData; - import org.bigbluebutton.main.model.options.BrandingOptions; - import org.bigbluebutton.main.model.options.LayoutOptions; - import org.bigbluebutton.main.model.options.ShortcutKeysOptions; - import org.bigbluebutton.main.model.users.events.ChangeMyRole; - import org.bigbluebutton.main.model.users.events.ConferenceCreatedEvent; - import org.bigbluebutton.main.model.users.events.ConnectionFailedEvent; - import org.bigbluebutton.util.i18n.ResourceUtil; + import com.asfusion.mate.events.Dispatcher; + + import mx.binding.utils.BindingUtils; + import mx.controls.Alert; + import mx.core.FlexGlobals; + import mx.core.IToolTip; + import mx.core.UIComponent; + import mx.events.CloseEvent; + import mx.events.ToolTipEvent; + import mx.managers.PopUpManager; + + import org.as3commons.lang.ArrayUtils; + import org.as3commons.lang.StringUtils; + import org.as3commons.logging.api.ILogger; + import org.as3commons.logging.api.getClassLogger; + import org.bigbluebutton.common.IBbbToolbarComponent; + import org.bigbluebutton.common.events.SettingsComponentEvent; + import org.bigbluebutton.common.events.ToolbarButtonEvent; + import org.bigbluebutton.core.BBB; + import org.bigbluebutton.core.Options; + import org.bigbluebutton.core.UsersUtil; + import org.bigbluebutton.core.model.Config; + import org.bigbluebutton.core.model.LiveMeeting; + import org.bigbluebutton.main.events.BBBEvent; + import org.bigbluebutton.main.events.ConfigLoadedEvent; + import org.bigbluebutton.main.events.LogoutEvent; + import org.bigbluebutton.main.events.NetworkStatsEvent; + import org.bigbluebutton.main.events.SettingsEvent; + import org.bigbluebutton.main.events.ShortcutEvent; + import org.bigbluebutton.main.events.SuccessfulLoginEvent; + import org.bigbluebutton.main.model.NetworkStatsData; + import org.bigbluebutton.main.model.options.BrandingOptions; + import org.bigbluebutton.main.model.options.LayoutOptions; + import org.bigbluebutton.main.model.options.ShortcutKeysOptions; + import org.bigbluebutton.main.model.users.events.ChangeMyRole; + import org.bigbluebutton.main.model.users.events.ConferenceCreatedEvent; + import org.bigbluebutton.main.model.users.events.ConnectionFailedEvent; + import org.bigbluebutton.modules.users.model.UsersOptions; + import org.bigbluebutton.util.i18n.ResourceUtil; private static const LOGGER:ILogger = getClassLogger(MainToolbar); @@ -102,6 +105,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. [Bindable] private var showRecordButton:Boolean = false; [Bindable] public var toolbarOptions:LayoutOptions; [Bindable] private var brandingOptions:BrandingOptions; + [Bindable] private var usersOptions:UsersOptions; [Bindable] private var numButtons:int; @@ -125,6 +129,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. private function init():void{ toolbarOptions = Options.getOptions(LayoutOptions) as LayoutOptions; brandingOptions = Options.getOptions(BrandingOptions) as BrandingOptions; + usersOptions = Options.getOptions(UsersOptions) as UsersOptions; + numButtons = 0; // Accessibility isn't active till a few second after the client starts to load so we need a delay @@ -192,7 +198,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. } private function refreshModeratorButtonsVisibility(e:*):void { - showGuestSettingsButton = UsersUtil.amIModerator(); + showGuestSettingsButton = UsersUtil.amIModerator() && usersOptions.enableGuestUI; showRecordButton = UsersUtil.amIModerator(); } @@ -361,18 +367,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. for each (var button:UIComponent in addedBtns.getChildren()){ var toolbarComponent:IBbbToolbarComponent = button as IBbbToolbarComponent; - /*if (toolbarComponent.getAlignment() == ALIGN_LEFT){ - addedBtns.setChildIndex(button, 0); - //(addedBtns.getChildAt(0) as Button).tabIndex = 0; - } - else if (toolbarComponent.getAlignment() == ALIGN_RIGHT){ - addedBtns.setChildIndex(button, addedBtns.numChildren - 1); - //(addedBtns.getChildAt(0) as Button).tabIndex = addedBtns.numChildren - 1; - }*/ button.tabIndex = quickLinksIndexer.startIndex + 5; - //for (var i:int = 0; i < addedBtns.numChildren; i++){ - // (addedBtns.getChildAt(i) as Button).tabIndex = baseIndex + i; - //} } } @@ -390,10 +385,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. if (!StringUtils.isEmpty(brandingOptions.toolbarColor)) { setStyle("backgroundColor", brandingOptions.toolbarColor); } - - if (ArrayUtils.isNotEmpty(brandingOptions.toolbarColorAlphas)) { - setStyle("highlightAlphas", brandingOptions.toolbarColorAlphas); - } } private function onDisconnectTest():void{ @@ -487,7 +478,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. } private function hideLogo():void { - logoHolder.visible = logoHolder.includeInLayout = false; + logo.visible = logo.includeInLayout = false; } private function addSettingsComponent(e:SettingsComponentEvent = null):void { @@ -512,36 +503,33 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. <fx:Declarations> <common:TabIndexer id="quickLinksIndexer" startIndex="102" tabIndices="{[usersLinkBtn, webcamLinkButton, presentationLinkBtn, chatLinkBtn, captionLinkBtn]}"/> <common:TabIndexer id="buttonsIndexer" startIndex="{quickLinksIndexer.startIndex + numButtons + 10}" - tabIndices="{[recordBtn, muteMeBtn, webRTCAudioStatus, shortcutKeysBtn, helpBtn, btnLogout]}"/> + tabIndices="{[recordBtn, webRTCAudioStatus, shortcutKeysBtn, helpBtn, btnLogout]}"/> </fx:Declarations> - <mx:HBox id="logoHolder" paddingRight="12" > - <mx:Image id="logo" ioError="hideLogo()" /> - </mx:HBox> + <mx:Image id="logo" right="20" maxHeight="30" ioError="hideLogo()" /> <mx:HBox id="quickLinks" width="1" includeInLayout="false"> <mx:LinkButton id="usersLinkBtn" click="onQuickLinkClicked('users')" label="{ResourceUtil.getInstance().getString('bbb.users.quickLink.label')}" accessibilityDescription="{usersLinkBtn.label}" toolTip="{usersLinkBtn.label}" - height="22" styleName="quickWindowLinkStyle" /> + height="30" styleName="quickWindowLinkStyle" /> <mx:LinkButton id="webcamLinkButton" click="onQuickLinkClicked('webcams')" label="{ResourceUtil.getInstance().getString('bbb.videodock.quickLink.label')}" accessibilityDescription="{webcamLinkButton.label}" toolTip="{webcamLinkButton.label}" - height="22" styleName="quickWindowLinkStyle" /> + height="30" styleName="quickWindowLinkStyle" /> <mx:LinkButton id="presentationLinkBtn" click="onQuickLinkClicked('presentation')" label="{ResourceUtil.getInstance().getString('bbb.presentation.quickLink.label')}" accessibilityDescription="{presentationLinkBtn.label}" toolTip="{presentationLinkBtn.label}" - height="22" styleName="quickWindowLinkStyle" /> + height="30" styleName="quickWindowLinkStyle" /> <mx:LinkButton id="chatLinkBtn" click="onQuickLinkClicked('chat')" label="{ResourceUtil.getInstance().getString('bbb.chat.quickLink.label')}" accessibilityDescription="{chatLinkBtn.label}" toolTip="{chatLinkBtn.label}" - height="22" styleName="quickWindowLinkStyle" /> + height="30" styleName="quickWindowLinkStyle" /> <mx:LinkButton id="captionLinkBtn" click="onQuickLinkClicked('caption')" label="{ResourceUtil.getInstance().getString('bbb.caption.quickLink.label')}" accessibilityDescription="{captionLinkBtn.label}" toolTip="{captionLinkBtn.label}" - height="22" styleName="quickWindowLinkStyle" /> + height="20" styleName="quickWindowLinkStyle" /> </mx:HBox> - <mx:HBox id="addedBtns"/> + <mx:VRule styleName="toolbarSeparator" height="10" /> + <mx:Label id="meetingNameLbl" minWidth="1" styleName="meetingNameLabelStyle" /> + <mx:HBox id="addedBtns" width="100%" horizontalAlign="center"/> <views:RecordButton id="recordBtn" visible="{showRecordButton}" includeInLayout="{showRecordButton}"/> - <mx:VRule strokeWidth="2" height="100%" visible="{muteMeBtn.visible}" includeInLayout="{muteMeBtn.includeInLayout}"/> - <views:MuteMeButton id="muteMeBtn" height="20"/> - <views:WebRTCAudioStatus id="webRTCAudioStatus" height="20"/> - <mx:Label id="meetingNameLbl" width="100%" minWidth="1" styleName="meetingNameLabelStyle" /> + <views:WebRTCAudioStatus id="webRTCAudioStatus" height="30"/> <mx:Button id="bbbSettings" @@ -550,7 +538,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. toolTip="{ResourceUtil.getInstance().getString('bbb.settings.btn.toolTip')}" click="onSettingsButtonClick()" styleName="settingsButtonStyle" - height="22" + height="30" /> <!-- <mx:Button label="DISCONNECT!" click="BBB.initConnectionManager().forceClose()" height="22" toolTip="Click to simulate disconnection" /> @@ -560,14 +548,15 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. styleName="bandwidthButtonStyle" toolTip="dummy text" click="onNetStatsButtonClick()" - visible="{toolbarOptions.showNetworkMonitor}" /> + visible="{toolbarOptions.showNetworkMonitor}" + includeInLayout="{toolbarOptions.showNetworkMonitor}"/> <mx:Button id="shortcutKeysBtn" label="{ResourceUtil.getInstance().getString('bbb.mainToolbar.shortcutBtn')}" styleName="shortcutButtonStyle" - click="onShortcutButtonClick()" height="22" + click="onShortcutButtonClick()" height="30" toolTip="{ResourceUtil.getInstance().getString('bbb.mainToolbar.shortcutBtn.toolTip')}"/> - <mx:LinkButton id="helpBtn" visible="{showHelpBtn}" includeInLayout="{showHelpBtn}" label="?" click="onHelpButtonClicked()" height="22" + <mx:LinkButton id="helpBtn" visible="{showHelpBtn}" includeInLayout="{showHelpBtn}" label="?" click="onHelpButtonClicked()" height="30" styleName="helpLinkButtonStyle" toolTip="{ResourceUtil.getInstance().getString('bbb.mainToolbar.helpBtn')}" accessibilityName="{ResourceUtil.getInstance().getString('bbb.micSettings.access.helpButton')}"/> <mx:Button label="" id="btnLogout" styleName="logoutButtonStyle" - toolTip="{ResourceUtil.getInstance().getString('bbb.mainToolbar.logoutBtn.toolTip')}" right="10" click="confirmLogout()" height="22"/> + toolTip="{ResourceUtil.getInstance().getString('bbb.mainToolbar.logoutBtn.toolTip')}" right="10" click="confirmLogout()" height="30"/> </mx:ApplicationControlBar> diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/MuteMeButton.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/MuteMeButton.mxml deleted file mode 100755 index 73d765520cf91e2453378e902c53737f71659caf..0000000000000000000000000000000000000000 --- a/bigbluebutton-client/src/org/bigbluebutton/main/views/MuteMeButton.mxml +++ /dev/null @@ -1,236 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<!-- -BigBlueButton open source conferencing system - http://www.bigbluebutton.org - -Copyright (c) 2010 BigBlueButton Inc. and by respective authors (see below). - -BigBlueButton is free software; you can redistribute it and/or modify it under the -terms of the GNU Lesser General Public License as published by the Free Software -Foundation; either version 2.1 of the License, or (at your option) any later -version. - -BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License along -with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. - -$Id: $ ---> - -<flc:CanvasButton - xmlns:mx="library://ns.adobe.com/flex/mx" - xmlns:fx="http://ns.adobe.com/mxml/2009" - xmlns:flc="flexlib.controls.*" - xmlns:mate="http://mate.asfusion.com/" - visible="false" - includeInLayout="false" - creationComplete="onCreationComplete()" - toolTip="{UsersUtil.amIMuted() ? ResourceUtil.getInstance().getString('bbb.users.pushToTalk.toolTip') : ResourceUtil.getInstance().getString('bbb.users.pushToMute.toolTip')}" - click="toggleMuteMeState()" width="140" maxWidth="180" - mouseOver="mouseOverHandler()" - mouseOut="mouseOutHandler()" - paddingTop="0" - paddingBottom="0"> - - <fx:Declarations> - <mate:Listener type="{LocaleChangeEvent.LOCALE_CHANGED}" method="localeChanged" /> - <mate:Listener type="{ShortcutEvent.MUTE_ME_EVENT}" method="toggleMuteMeState" /> - <mate:Listener type="{EventConstants.USER_TALKING}" method="handleUserTalking" /> - <mate:Listener type="{LockControlEvent.CHANGED_LOCK_SETTINGS}" method="lockSettingsChanged" /> - <mate:Listener type="{ChangeMyRole.CHANGE_MY_ROLE_EVENT}" method="refreshRole" /> - <mate:Listener type="{BBBEvent.USER_VOICE_JOINED}" method="handleJoinedVoiceConferenceEvent" /> - <mate:Listener type="{BBBEvent.USER_VOICE_LEFT}" method="handleLeftVoiceConferenceEvent" /> - <mate:Listener type="{BBBEvent.USER_VOICE_MUTED}" method="handleVoiceMutedEvent" /> - </fx:Declarations> - - <fx:Script> - <![CDATA[ - import flash.filters.BitmapFilterQuality; - - import spark.filters.GlowFilter; - - import org.as3commons.logging.api.ILogger; - import org.as3commons.logging.api.getClassLogger; - import org.bigbluebutton.common.Images; - import org.bigbluebutton.common.events.LocaleChangeEvent; - import org.bigbluebutton.core.EventConstants; - import org.bigbluebutton.core.UsersUtil; - import org.bigbluebutton.core.events.CoreEvent; - import org.bigbluebutton.core.events.LockControlEvent; - import org.bigbluebutton.core.events.VoiceConfEvent; - import org.bigbluebutton.core.model.LiveMeeting; - import org.bigbluebutton.core.model.users.VoiceUser2x; - import org.bigbluebutton.main.events.BBBEvent; - import org.bigbluebutton.main.events.ShortcutEvent; - import org.bigbluebutton.main.model.users.events.ChangeMyRole; - import org.bigbluebutton.util.i18n.ResourceUtil; - - private static const LOGGER:ILogger = getClassLogger(MuteMeButton); - - private var muteMeRolled:Boolean = false; - - [Bindable] private var images:Images = new Images(); - - private function onCreationComplete():void { - LOGGER.debug("initialized"); - } - - private function handleUserTalking(e:CoreEvent):void { - //rest rolledOver when the data changes because onRollOut wont be called if the row moves - if (UsersUtil.isMe(e.message.userID)) { - if (e.message.talking){ - muteMeBtnImg.filters = [new GlowFilter(0x000000, 1, 6, 6, 2, BitmapFilterQuality.HIGH, false, false)]; - } else { - muteMeBtnImg.filters = []; - } - } - } - - private function localeChanged(e:Event):void { - updateMuteMeBtn(); - } - - private function refreshRole(e:ChangeMyRole):void { - updateMuteMeBtn(); - } - - private function lockSettingsChanged(e:Event):void { - if (UsersUtil.amIModerator() || UsersUtil.amIPresenter()){ - // Ignore lock setting changes as - // or presenter we are moderator. - return; - } - updateMuteMeBtn(); - } - - private function handleJoinedVoiceConferenceEvent(event:BBBEvent):void { - if (UsersUtil.isMe(event.payload.userID)) { - LOGGER.debug("User has joined the conference using flash"); - updateMuteMeBtn(); - muteMeBtnImg.filters = []; - } - } - - private function handleLeftVoiceConferenceEvent(event:BBBEvent):void { - if (UsersUtil.isMe(event.payload.userID)) { - LOGGER.debug("User has left the conference using flash"); - updateMuteMeBtn(); - } - } - - private function allowMuteUnmute():Boolean { - var me: VoiceUser2x = LiveMeeting.inst().voiceUsers.getUser(LiveMeeting.inst().me.id); - // I am in voice conference. - return (me != null && !LiveMeeting.inst().me.disableMyMic && !me.listenOnly); - } - - private function updateMuteMeBtn(placeholder:Boolean = false):void { - if (!allowMuteUnmute()) { - this.visible = this.includeInLayout = false; - } else { - this.visible = this.includeInLayout = true; - - var myVoiceUser: VoiceUser2x = LiveMeeting.inst().voiceUsers.getUser(LiveMeeting.inst().me.id); - - if (myVoiceUser != null) { - if (muteMeRolled) { - if (myVoiceUser.muted) { - muteMeBtnImg.source = images.audio; - muteMeBtnTxt.visible = true; - muteMeBtnTxt.includeInLayout = true; - muteMeBtnTxt.text = ResourceUtil.getInstance().getString("bbb.users.muteMeBtnTxt.talk"); - hboxMuteMe.setStyle("paddingTop",0); - } else { - muteMeBtnImg.source = images.audio_muted; - muteMeBtnTxt.visible = true; - muteMeBtnTxt.includeInLayout = true; - muteMeBtnTxt.text = ResourceUtil.getInstance().getString("bbb.users.muteMeBtnTxt.mute"); - hboxMuteMe.setStyle("paddingTop",0); - } - } else { - if (myVoiceUser.muted) { - muteMeBtnImg.source = images.audio_muted; - muteMeBtnTxt.visible = true; - muteMeBtnTxt.includeInLayout = true; - muteMeBtnTxt.text = ResourceUtil.getInstance().getString("bbb.users.muteMeBtnTxt.muted"); - hboxMuteMe.setStyle("paddingTop",0); - } else { - muteMeBtnImg.source = images.audio; - muteMeBtnTxt.visible = false; - muteMeBtnTxt.includeInLayout = false; - hboxMuteMe.setStyle("paddingTop",2); - //muteMeBtnTxt.text = ResourceUtil.getInstance().getString("bbb.users.muteMeBtnTxt.unmuted"); - } - } - } - } - } - - private function handleVoiceMutedEvent(event:BBBEvent):void { - if (UsersUtil.isMe(event.payload.userID)) { - LOGGER.debug("User has been muted/unmuted"); - if (muteMeRolled) { - if (! event.payload.muted) { - muteMeBtnImg.source = images.audio; - muteMeBtnTxt.visible = true; - muteMeBtnTxt.includeInLayout = true; - muteMeBtnTxt.text = ResourceUtil.getInstance().getString("bbb.users.muteMeBtnTxt.talk"); - hboxMuteMe.setStyle("paddingTop",0); - } else { - muteMeBtnImg.source = images.audio_muted; - muteMeBtnTxt.visible = true; - muteMeBtnTxt.includeInLayout = true; - muteMeBtnTxt.text = ResourceUtil.getInstance().getString("bbb.users.muteMeBtnTxt.mute"); - hboxMuteMe.setStyle("paddingTop",0); - } - } else { - if (event.payload.muted) { - muteMeBtnImg.source = images.audio_muted; - muteMeBtnTxt.visible = true; - muteMeBtnTxt.includeInLayout = true; - muteMeBtnTxt.text = ResourceUtil.getInstance().getString("bbb.users.muteMeBtnTxt.muted"); - hboxMuteMe.setStyle("paddingTop",0); - } else { - muteMeBtnImg.source = images.audio; - muteMeBtnTxt.visible = false; - muteMeBtnTxt.includeInLayout = false; - hboxMuteMe.setStyle("paddingTop",2); - //muteMeBtnTxt.text = ResourceUtil.getInstance().getString("bbb.users.muteMeBtnTxt.unmuted"); - } - } - } - } - - private function toggleMuteMeState(event:ShortcutEvent = null):void{ - if (UsersUtil.amIinVoiceConf()) { - this.setFocus(); - if (!allowMuteUnmute()) return; - - var e:VoiceConfEvent = new VoiceConfEvent(VoiceConfEvent.MUTE_USER); - e.userid = UsersUtil.getMyUserID(); - e.mute = ! UsersUtil.amIMuted(); - dispatchEvent(e); - } - } - - private function mouseOverHandler():void { - muteMeRolled = true; - updateMuteMeBtn(); - } - - private function mouseOutHandler():void { - muteMeRolled = false; - updateMuteMeBtn(); - } - ]]> - </fx:Script> - - <mx:HBox id="hboxMuteMe" verticalAlign="middle" horizontalAlign="center" horizontalGap="0" - paddingLeft="5" paddingTop="0" paddingRight="5" paddingBottom="0" width="100%"> - <mx:Image id="muteMeBtnImg" /> - <mx:Label id="muteMeBtnTxt" /> - </mx:HBox> -</flc:CanvasButton> diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/NetworkStatsWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/NetworkStatsWindow.mxml index c12d0ca05e24472a8d4afff4e95d3c20ff88765c..6aae09e52d2c9d5f2e7f6647c74e615582b43b26 100644 --- a/bigbluebutton-client/src/org/bigbluebutton/main/views/NetworkStatsWindow.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/NetworkStatsWindow.mxml @@ -38,16 +38,9 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. import flash.utils.Timer; - import mx.core.IFlexDisplayObject; - import mx.effects.Fade; - import mx.events.EffectEvent; - import mx.managers.PopUpManager; - import org.as3commons.logging.api.ILogger; import org.as3commons.logging.api.getClassLogger; - import org.bigbluebutton.common.Images; - import org.bigbluebutton.common.events.CloseWindowEvent; - import org.bigbluebutton.common.events.OpenWindowEvent; + import org.bigbluebutton.common.IBbbModuleWindow; import org.bigbluebutton.core.services.BandwidthMonitor; import org.bigbluebutton.main.model.NetworkStatsData; import org.bigbluebutton.util.i18n.ResourceUtil; @@ -57,9 +50,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. private var _globalDispatcher:Dispatcher = new Dispatcher(); private var _updateTimer:Timer = new Timer(1000); - private var _images:Images = new Images(); - [Bindable] private var _refreshIcon:Class = _images.refreshSmall; - private function onCreationComplete():void { this.windowControls.maximizeRestoreBtn.visible = false; this.windowControls.minimizeBtn.visible = false; @@ -109,7 +99,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. <mx:HBox horizontalGap="0"><mx:Label text="{ResourceUtil.getInstance().getString('bbb.bwmonitor.current')}: "/><mx:Label id="labelCurrentDownload" fontWeight="bold" text="-"/></mx:HBox> <mx:HBox visible="false" includeInLayout="false" horizontalGap="0"><mx:Label text="{ResourceUtil.getInstance().getString('bbb.bwmonitor.available')}: "/><mx:Label id="labelAvailableDownload" fontWeight="bold" text="-"/></mx:HBox> <mx:HBox horizontalGap="0"><mx:Label text="{ResourceUtil.getInstance().getString('bbb.bwmonitor.latency')}: "/><mx:Label id="labelDownloadLatency" fontWeight="bold" text="-"/></mx:HBox> - <mx:HBox horizontalGap="0" width="100%" ><mx:Spacer width="100%"/><mx:Button id="labelRefresh" icon="{_refreshIcon}" width="16" height="16" click="runBandwidthMeasurement()" /></mx:HBox> + <mx:HBox horizontalGap="0" width="100%" ><mx:Spacer width="100%"/><mx:Button id="labelRefresh" icon="{getStyle('iconRefresh')}" width="16" height="16" click="runBandwidthMeasurement()" /></mx:HBox> </mx:VBox> </mx:Panel> diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/ReconnectionPopup.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/ReconnectionPopup.mxml index e25be560f0445f5e3c08f3261ecf4bcdc6008aba..94f7ddc2420c1f955a6011b514d99301d291c3f1 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/views/ReconnectionPopup.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/ReconnectionPopup.mxml @@ -56,9 +56,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. paddingBottom="10" paddingTop="10" paddingLeft="10" - paddingRight="0" - > - <mx:Image id="typeImg" source="{typeImg.getStyle('refreshImage')}" width="34" height="34" styleName="statusImageStyle" /> + paddingRight="0"> + <mx:Image id="typeImg" source="{getStyle('iconRefresh')}" width="34" height="34" /> </mx:Box> <mx:Text selectable="false" diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/RecordButton.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/RecordButton.mxml index f940041326805b7ed1c68531cc3157dfbbf41545..f0fcca9a91099c45457298f1cf15ef7aaf2cb5b6 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/views/RecordButton.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/RecordButton.mxml @@ -26,7 +26,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. xmlns:views="org.bigbluebutton.main.views.*" styleName="recordButtonStyleNormal" click="confirmChangeRecordingStatus()" - height="24" + height="30" enabled="false" creationComplete="onCreationComplete()" visible="true" @@ -70,9 +70,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. private var layoutOptions:LayoutOptions = null; private var _confirmationAlert:Alert = null; - [Embed(source="/org/bigbluebutton/common/assets/images/record.png")] - private var recordReminderIcon:Class; - private function onCreationComplete():void { ResourceUtil.getInstance().addEventListener(Event.CHANGE, localeChanged); // Listen for locale changing } @@ -182,7 +179,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. var alert:Alert = Alert.show(ResourceUtil.getInstance().getString("bbb.mainToolbar.recordBtn..notification.message1") + "\n\n" + ResourceUtil.getInstance().getString("bbb.mainToolbar.recordBtn..notification.message2"), ResourceUtil.getInstance().getString("bbb.mainToolbar.recordBtn..notification.title"), Alert.OK, this); // we need to set transparency duration to avoid the blur effect when two alerts are displayed sequentially alert.setStyle("modalTransparencyDuration", 250); - alert.titleIcon = recordReminderIcon; + alert.titleIcon = getStyle('iconRecordReminder'); var newX:Number = this.x; var newY:Number = this.y + this.height + 5; diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/WarningButton.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/WarningButton.mxml index df5ee5b362a5bfa1c15c5e38b44266120fed0578..dcc6cdefa9f6a12deda2ef25e52228d12f13cee7 100644 --- a/bigbluebutton-client/src/org/bigbluebutton/main/views/WarningButton.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/WarningButton.mxml @@ -22,7 +22,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. <mx:Button xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:mate="http://mate.asfusion.com/" - styleName="warningButtonStyle" toolTip="{ResourceUtil.getInstance().getString('bbb.clientstatus.title')}" click="handleButtonClick();" move="handleMove();" diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/WebRTCAudioStatus.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/WebRTCAudioStatus.mxml index a1d98d2abf8b6702ee3832b8206ff00c70b34d9e..a37cf1990db34acf5d84f9c6153a06b4d08037cb 100644 --- a/bigbluebutton-client/src/org/bigbluebutton/main/views/WebRTCAudioStatus.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/WebRTCAudioStatus.mxml @@ -25,8 +25,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. xmlns:mate="http://mate.asfusion.com/" visible="false" includeInLayout="false" - creationComplete="onCreationComplete()" - styleName="webRTCAudioStatusStyle"> + creationComplete="onCreationComplete()"> <fx:Declarations> <mate:Listener type="{BBBEvent.WEBRTC_MONITOR_UPDATE_EVENT}" method="handleWebRTCMonitor" /> @@ -87,21 +86,21 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. } switch (true) { case rate > 0.50: - audioStatus.source = getStyle("weakAudioStatus"); + audioStatus.source = getStyle("iconWeakAudio"); toolTip = ResourceUtil.getInstance().getString('bbb.clientstatus.webrtc.weakStatus'); LOGGER.debug("Audio interval estimated loss rate: {0}", [rate]); break; case rate > 0.25: - audioStatus.source = getStyle("almostWeakAudioStatus"); + audioStatus.source = getStyle("iconAlmostWeakAudio"); toolTip = ResourceUtil.getInstance().getString('bbb.clientstatus.webrtc.almostWeakStatus'); LOGGER.debug("Audio interval estimated loss rate: {0}", [rate]); break; case rate > 0.1: - audioStatus.source = getStyle("almostStrongAudioStatus"); + audioStatus.source = getStyle("iconAlmostStrongAudio"); toolTip = ResourceUtil.getInstance().getString('bbb.clientstatus.webrtc.almostStrongStatus'); break; default: - audioStatus.source = getStyle("strongAudioStatus"); + audioStatus.source = getStyle("iconStrongAudio"); toolTip = ResourceUtil.getInstance().getString('bbb.clientstatus.webrtc.strongStatus'); break; } diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/chrome-change-mic-2.png b/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/chrome-change-mic-2.png deleted file mode 100755 index cd664085f71681dbf632285794848847a80aa353..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/chrome-change-mic-2.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/chrome-change-mic.png b/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/chrome-change-mic.png deleted file mode 100755 index 30e999e61ea2ac47a1493349b022c27d6fc30a10..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/chrome-change-mic.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/chrome-mic-permission.png b/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/chrome-mic-permission.png deleted file mode 100755 index 4a05fa0f01592400ecd96cc6756985214d940b06..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/chrome-mic-permission.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/chrome-mic-switch-done.png b/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/chrome-mic-switch-done.png deleted file mode 100755 index b750a983459be7faf4e2363b104680201dfb64ae..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/chrome-mic-switch-done.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/chrome-reload-page.png b/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/chrome-reload-page.png deleted file mode 100755 index 8057c9369280bd3859509312d02638dc8a9a02c2..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/chrome-reload-page.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/chrome-show-mics.png b/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/chrome-show-mics.png deleted file mode 100755 index 75024779a60ca57ccef3b335e3f1b58d86f27b1d..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/chrome-show-mics.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/chrome-switch-mic.png b/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/chrome-switch-mic.png deleted file mode 100755 index 0a544b233cc99e0f27cfb04cdd9cf904d4ae1554..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/chrome-switch-mic.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/chrome_allow.png b/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/chrome_allow.png deleted file mode 100644 index f5bccc25aefea3ef7dcd80436aff7d4599806fb2..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/chrome_allow.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/ff-mic-permission.png b/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/ff-mic-permission.png deleted file mode 100755 index fc76db6bbf29582c680f31fa6b0c2c36dd1462ed..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/ff-mic-permission.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/ff-share-mic.png b/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/ff-share-mic.png deleted file mode 100755 index caea95541b37d6a4e57a506b6cb65518d29f033d..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/ff-share-mic.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/ff-show-mic.png b/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/ff-show-mic.png deleted file mode 100755 index 2a048b28d011d72f9ebcc1163caa6faa9e093f09..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/ff-show-mic.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/microphone80.png b/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/microphone80.png deleted file mode 100755 index 224f29f1a66245032c2d89395c8c489ee4b0fecf..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/microphone80.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/phone80.png b/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/phone80.png deleted file mode 100755 index 5910d5785334b34949e546245cbf6cf9f800aad0..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/phone80.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/speaker80.png b/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/speaker80.png deleted file mode 100755 index 43bfa873435bf4e65d66f813a1ca0b5abe039b97..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/speaker80.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/broadcast/views/BroadcastWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/broadcast/views/BroadcastWindow.mxml index d4145f641664de29e7021e17a2bf93d924942396..11c9c09aa734674cc0850e67468316f1a42c2bb1 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/broadcast/views/BroadcastWindow.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/broadcast/views/BroadcastWindow.mxml @@ -22,8 +22,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:bcast="org.bigbluebutton.common.*" implements="org.bigbluebutton.common.IBbbModuleWindow" - styleNameFocus="broadcastStyleFocus" - styleNameNoFocus="broadcastStyleNoFocus" creationComplete="onCreationComplete()" visible="false" xmlns:mate="http://mate.asfusion.com/" showCloseButton="false" diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/caption/views/CaptionWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/caption/views/CaptionWindow.mxml index 31c4f52bc83bf8bcb574fba15d83b3d5aa9d84be..5b9147ab301c377b35659dc0a16585e198004e88 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/caption/views/CaptionWindow.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/caption/views/CaptionWindow.mxml @@ -253,6 +253,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. } ]]> </fx:Script> + <mx:Box width="100%" height="100%" horizontalAlign="left"> <containers:SuperTabNavigator id="captionTabs" width="100%" height="100%" minTabWidth="20" diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/AddChatTabBox.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/AddChatTabBox.mxml index 682954b985b71240d7b501974a4c659e5322bae2..ffd0217b893e67b6055c740f3f19bb9b0e952354 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/AddChatTabBox.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/AddChatTabBox.mxml @@ -30,6 +30,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. <fx:Declarations> <mate:Listener type="{LockControlEvent.CHANGED_LOCK_SETTINGS}" method="lockSettingsChanged" /> <mate:Listener type="{ChangeMyRole.CHANGE_MY_ROLE_EVENT}" method="refreshRole" /> + <mate:Listener type="{UserJoinedEvent.JOINED}" method="handleUserJoinedEvent" /> + <mate:Listener type="{UserLeftEvent.LEFT}" method="handleUserLeftEvent" /> </fx:Declarations> <fx:Script> @@ -46,6 +48,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. import org.bigbluebutton.core.events.CoreEvent; import org.bigbluebutton.core.events.LockControlEvent; import org.bigbluebutton.core.model.LiveMeeting; + import org.bigbluebutton.main.events.UserJoinedEvent; + import org.bigbluebutton.main.events.UserLeftEvent; import org.bigbluebutton.main.model.users.events.ChangeMyRole; import org.bigbluebutton.modules.chat.events.ChatNoiseEnabledEvent; import org.bigbluebutton.modules.chat.events.ChatOptionsEvent; @@ -60,8 +64,20 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. [Bindable] public var chatOptions:ChatOptions; + private var handler: ChatWindowEventHandler = new ChatWindowEventHandler(); + + private function handleUserLeftEvent(event: UserLeftEvent): void { + handler.handleUserLeftEvent(event.userID); + } + + + private function handleUserJoinedEvent(event: UserJoinedEvent):void { + handler.handleUserJoinedEvent(event); + } + private function onCreationComplete():void{ - users = UsersUtil.getUsers(); + handler.populateAllUsers() + users = handler.users; chatOptions = Options.getOptions(ChatOptions) as ChatOptions; if (!chatOptions.privateEnabled) { @@ -103,7 +119,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. if (!usersList.visible || !usersList.enabled) return; - var chatWithIntId:String = usersList.selectedItem.intId; + var chatWithIntId:String = usersList.selectedItem.userId; // Don't want to be chatting with ourself. if (UsersUtil.isMe(chatWithIntId)) return; diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatBox.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatBox.mxml index 8cebbd5232c0d834cc6ad9fea14fa804d33824c1..197f1f70629ac1111e4610cf10112f6eef78051f 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatBox.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatBox.mxml @@ -88,7 +88,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. import org.bigbluebutton.main.events.UserJoinedEvent; import org.bigbluebutton.main.events.UserLeftEvent; import org.bigbluebutton.main.model.users.events.ChangeMyRole; - import org.bigbluebutton.modules.chat.ChatConstants; import org.bigbluebutton.modules.chat.ChatUtil; import org.bigbluebutton.modules.chat.events.ChatEvent; import org.bigbluebutton.modules.chat.events.ChatHistoryEvent; @@ -689,11 +688,12 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. </mx:VBox> <mx:VBox verticalScrollPolicy="off" verticalAlign="middle" height="100%" > <mx:HBox horizontalGap="0"> - <mx:Button label="{ResourceUtil.getInstance().getString('bbb.chat.sendBtn')}" id="sendBtn" + <mx:Button id="sendBtn" styleName="chatControlBarSendButtonStyle" + width="40" height="40" toolTip="{ResourceUtil.getInstance().getString('bbb.chat.sendBtn.toolTip')}" click="sendMessages()" - accessibilityName="{ResourceUtil.getInstance().getString('bbb.chat.sendBtn.accessibilityName')}" height="100%"/> + accessibilityName="{ResourceUtil.getInstance().getString('bbb.chat.sendBtn.accessibilityName')}"/> </mx:HBox> <mx:ColorPicker id="cmpColorPicker" showTextField="false" width="100%" visible="{chatOptions.colorPickerIsVisible}" includeInLayout="{chatOptions.colorPickerIsVisible}" diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatWindow.mxml index cdbea595132debac19f111382f409ed70eb15680..3a3cf99d7a0c96b3e8ab080b18980f1805130243 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatWindow.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatWindow.mxml @@ -193,6 +193,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. ]]> </fx:Script> - + <views:ChatView id="chatView" chatOptions="{chatOptions}" includeInLayout="false"/> </CustomMdiWindow> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatWindowEventHandler.as b/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatWindowEventHandler.as new file mode 100755 index 0000000000000000000000000000000000000000..a00e298ceda2083cc08deb1a7a6b425bb46b1a7d --- /dev/null +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatWindowEventHandler.as @@ -0,0 +1,72 @@ +package org.bigbluebutton.modules.chat.views +{ + import mx.collections.ArrayCollection; + + import org.bigbluebutton.core.UsersUtil; + import org.bigbluebutton.core.model.LiveMeeting; + import org.bigbluebutton.core.model.users.User2x; + import org.bigbluebutton.main.events.UserJoinedEvent; + import org.bigbluebutton.modules.chat.views.model.ChatUser; + + public class ChatWindowEventHandler + { + [Bindable] public var users:ArrayCollection = new ArrayCollection(); + + + public function ChatWindowEventHandler() + { + users.refresh(); + } + + public function populateAllUsers():void { + getAllWebUsers(); + } + + private function getAllWebUsers():void { + var userIds: Array = LiveMeeting.inst().users.getUserIds(); + + for (var i:int = 0; i < userIds.length; i++) { + var userId: String = userIds[i] as String; + var user: User2x = UsersUtil.getUser2x(userId); + addUser(users, user); + } + + users.refresh(); + } + + public function handleUserJoinedEvent(event: UserJoinedEvent):void { + var user: User2x = UsersUtil.getUser(event.userID); + if (user != null) { + addUser(users, user); + users.refresh(); + } + } + + private function addUser(users: ArrayCollection, user: User2x):void { + var buser: ChatUser = new ChatUser(); + buser.userId = user.intId; + buser.name = user.name; + + // We want to remove the user if it's already in the collection and re-add it. + removeUser(user.intId, users); + + users.addItem(buser); + } + + private function removeUser(userId:String, users: ArrayCollection):void { + for (var i:int = 0; i < users.length; i++) { + var user:ChatUser = users.getItemAt(i) as ChatUser; + if (user.userId == userId) { + users.removeItemAt(i); + users.refresh(); + return; + } + } + } + + public function handleUserLeftEvent(userId: String):void { + removeUser(userId, users); + } + + } +} \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/model/ChatUser.as b/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/model/ChatUser.as new file mode 100755 index 0000000000000000000000000000000000000000..d5ee0824608722a055fba9f96ffd19aaf389bfc4 --- /dev/null +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/model/ChatUser.as @@ -0,0 +1,8 @@ +package org.bigbluebutton.modules.chat.views.model +{ + public class ChatUser + { + public var userId: String; + public var name: String; + } +} \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/layout/views/AddButton.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/layout/views/AddButton.mxml index 2910ecaaad80de67e8e2d68b6a799ab0a394ca59..94b426a23d5e074c7436cbe23a1b04acecf3e9d5 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/layout/views/AddButton.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/layout/views/AddButton.mxml @@ -24,7 +24,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. xmlns:views="org.bigbluebutton.modules.layout.views.*" creationComplete="init()" toolTip="{ResourceUtil.getInstance().getString('bbb.layout.addButton.toolTip')}" - styleName="addLayoutButtonStyle" click="onClick(event)" enabled="{UsersUtil.amIModerator()}"> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/layout/views/LayoutsCombo.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/layout/views/LayoutsCombo.mxml index f630449bd7295f07a280b31372a11efa79720432..dd739a75711b9bf3b597a8cea383cedf7f572656 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/layout/views/LayoutsCombo.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/layout/views/LayoutsCombo.mxml @@ -25,8 +25,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. prompt="{ResourceUtil.getInstance().getString('bbb.layout.combo.prompt')}" height="{LayoutButton.BUTTON_SIZE}" creationComplete="init()" change="onSelectedItemChanged(event)" - disabledColor="{getStyle('color')}" rowCount="10" width="240" - styleName="languageSelectorStyle" > + disabledColor="{getStyle('color')}" rowCount="10" width="240" > <fx:Declarations> <mate:Listener type="{SwitchedLayoutEvent.SWITCHED_LAYOUT_EVENT}" method="onLayoutChanged" /> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/layout/views/SaveButton.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/layout/views/SaveButton.mxml index 1109b80da55196664fcfa9e1a48d0a4967f92578..c2f610d68c5e28699b97cdd7cba097cd8d40b95a 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/layout/views/SaveButton.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/layout/views/SaveButton.mxml @@ -24,7 +24,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. xmlns:views="org.bigbluebutton.modules.layout.views.*" creationComplete="init()" toolTip="{ResourceUtil.getInstance().getString('bbb.layout.saveButton.toolTip')}" - styleName="saveLayoutButtonStyle" click="onClick(event)" enabled="{UsersUtil.amIModerator()}"> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/phone/maps/PhoneEventMapDelegate.as b/bigbluebutton-client/src/org/bigbluebutton/modules/phone/maps/PhoneEventMapDelegate.as index afb2cd2d0ebb0024618da54a2080b29b53b99985..3a916d4ffce22e0be1c5a6c85c8090cd552a5c0e 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/phone/maps/PhoneEventMapDelegate.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/phone/maps/PhoneEventMapDelegate.as @@ -1,76 +1,88 @@ /** -* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ -* -* Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below). -* -* This program is free software; you can redistribute it and/or modify it under the -* terms of the GNU Lesser General Public License as published by the Free Software -* Foundation; either version 3.0 of the License, or (at your option) any later -* version. -* -* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY -* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License along -* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. -* -*/ + * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ + * + * Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below). + * + * This program is free software; you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License as published by the Free Software + * Foundation; either version 3.0 of the License, or (at your option) any later + * version. + * + * BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License along + * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. + * + */ -package org.bigbluebutton.modules.phone.maps -{ +package org.bigbluebutton.modules.phone.maps { import com.asfusion.mate.events.Dispatcher; - + import org.bigbluebutton.common.events.ToolbarButtonEvent; import org.bigbluebutton.core.Options; import org.bigbluebutton.modules.phone.models.PhoneOptions; + import org.bigbluebutton.modules.phone.views.components.MuteMeButton; import org.bigbluebutton.modules.phone.views.components.ToolbarButton; - + public class PhoneEventMapDelegate { private var phoneOptions:PhoneOptions; + private var phoneButton:ToolbarButton; + + private var muteMeButton:MuteMeButton; + private var buttonOpen:Boolean = false; + private var globalDispatcher:Dispatcher; - + public function PhoneEventMapDelegate() { - phoneButton = new ToolbarButton(); globalDispatcher = new Dispatcher(); phoneOptions = Options.getOptions(PhoneOptions) as PhoneOptions; + phoneButton = new ToolbarButton(); + muteMeButton = new MuteMeButton(); } public function addToolbarButton():void { - phoneButton.toggle = true; - - if (phoneOptions.showButton) { - // Use the GLobal Dispatcher so that this message will be heard by the - // main application. - var event:ToolbarButtonEvent = new ToolbarButtonEvent(ToolbarButtonEvent.ADD); - event.button = phoneButton; - globalDispatcher.dispatchEvent(event); - buttonOpen = true; - } + if (phoneOptions.showButton) { + phoneButton.toggle = true; + muteMeButton.toggle = true; + + // Use the GLobal Dispatcher so that this message will be heard by the + // main application. + var eventPhone:ToolbarButtonEvent = new ToolbarButtonEvent(ToolbarButtonEvent.ADD); + eventPhone.button = phoneButton; + globalDispatcher.dispatchEvent(eventPhone); + buttonOpen = true; + + var eventMute:ToolbarButtonEvent = new ToolbarButtonEvent(ToolbarButtonEvent.ADD); + eventMute.button = muteMeButton; + globalDispatcher.dispatchEvent(eventMute); + buttonOpen = true; + } } - + public function removeToolbarButton():void { if (buttonOpen) { var event:ToolbarButtonEvent = new ToolbarButtonEvent(ToolbarButtonEvent.REMOVE); event.button = phoneButton; - globalDispatcher.dispatchEvent(event); - buttonOpen = false; + globalDispatcher.dispatchEvent(event); + buttonOpen = false; } } - + public function disableToolbarButton(listenOnlyCall:Boolean):void { - if (!listenOnlyCall) { + if (!listenOnlyCall && phoneButton) { phoneButton.selected = true; phoneButton.enabled = true; } } - + public function enableToolbarButton():void { phoneButton.selected = false; phoneButton.enabled = true; } } -} \ No newline at end of file +} diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/assets/images/headset.png b/bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/assets/images/headset.png deleted file mode 100644 index 41e20141a1bb9989836f9f69b4c80bd2556321fc..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/assets/images/headset.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/assets/images/headset_close.png b/bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/assets/images/headset_close.png deleted file mode 100755 index a69e50da75b59fefc1e3abc3482150e19549245d..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/assets/images/headset_close.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/assets/images/headset_open.png b/bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/assets/images/headset_open.png deleted file mode 100644 index 65bacb45bf7516a3db77593583d9278d75a6e5e4..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/assets/images/headset_open.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/assets/images/phone_sound.png b/bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/assets/images/phone_sound.png deleted file mode 100644 index 7fdf1c58c0a0498c7a0d35a42c6fb08c9e053b88..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/assets/images/phone_sound.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/assets/images/sound.png b/bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/assets/images/sound.png deleted file mode 100644 index 6056d234a9818d248987389d4a621e5c83ce0851..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/assets/images/sound.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/assets/images/sound_mute.png b/bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/assets/images/sound_mute.png deleted file mode 100644 index b652d2a71fc0e866d855c08f415b7ec057b3cee9..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/assets/images/sound_mute.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/components/MuteButton.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/components/MuteButton.mxml deleted file mode 100644 index 175b05c96806e02768a39c5a220f4ad805ab6f3f..0000000000000000000000000000000000000000 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/components/MuteButton.mxml +++ /dev/null @@ -1,117 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<!-- - BigBlueButton open source conferencing system - http://www.bigbluebutton.org - - Copyright (c) 2010 BigBlueButton Inc. and by respective authors (see below). - - BigBlueButton is free software; you can redistribute it and/or modify it under the - terms of the GNU Lesser General Public License as published by the Free Software - Foundation; either version 2.1 of the License, or (at your option) any later - version. - - BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License along - with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. - - $Id: $ ---> - -<mx:Button xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:mate="http://mate.asfusion.com/" - icon="{phoneIcon}" click="startSound()" label="BOOO!" - mouseOver = "mouseOverHandler(event)" - mouseOut = "mouseOutHandler(event)" - creationComplete = "initMuteButton()" - toolTip="{ResourceUtil.getInstance().getString('bbb.toolbar.phone.toolTip.mute')}" - implements="org.bigbluebutton.common.IBbbToolbarComponent"> - - <mate:Listener type="{ShortcutEvent.PAUSE_REMOTE_STREAM}" method="remoteClick" /> - - <fx:Script> - <![CDATA[ - import com.asfusion.mate.events.Dispatcher; - - import org.bigbluebutton.common.IBbbToolbarComponent; - import org.bigbluebutton.main.events.BBBEvent; - import org.bigbluebutton.main.events.ShortcutEvent; - import org.bigbluebutton.main.views.MainToolbar; - import org.bigbluebutton.modules.phone.views.assets.Images; - import org.bigbluebutton.util.i18n.ResourceUtil; - - private var images:Images = new Images(); - private var dispatcher:Dispatcher = new Dispatcher(); - private var talking:Boolean = false; - - public const MUTE_STATE:Number = 0; - public const LISTENING_STATE:Number = 1; - private var _currentState:Number = LISTENING_STATE; - - [Bindable] public var phoneIcon:Class = images.speakerActiveIcon; - - private function initMuteButton():void { - this.selected = true; - this.enabled = true; - phoneIcon = images.speakerActiveIcon; - } - - public function remoteClick(event:ShortcutEvent):void{ - startSound(); - } - - private function startSound():void { - this.enabled = false; - if (this.selected) { - muteLocalUser(); - this.selected = false; - phoneIcon = images.speakerInactiveIcon; - _currentState = MUTE_STATE; - this.toolTip = ResourceUtil.getInstance().getString('bbb.toolbar.phone.toolTip.unmute'); - } else { - unmuteLocalUser(); - this.selected = true; - phoneIcon = images.speakerActiveIcon; - _currentState = LISTENING_STATE; - this.toolTip = ResourceUtil.getInstance().getString('bbb.toolbar.phone.toolTip.mute'); - } - } - - public function muteLocalUser():void { - var e:BBBEvent = new BBBEvent("MUTE_AUDIO_VOICE_CONFERENCE"); - dispatcher.dispatchEvent(e); - } - - public function unmuteLocalUser():void { - var e:BBBEvent = new BBBEvent("UNMUTE_AUDIO_VOICE_CONFERENCE"); - dispatcher.dispatchEvent(e); - } - - private function mouseOverHandler(event:MouseEvent):void { - if (_currentState == LISTENING_STATE) { - phoneIcon = images.speakerInactiveIcon; - } else { - phoneIcon = images.speakerActiveIcon; - } - } - - private function mouseOutHandler(event:MouseEvent):void { - if (_currentState == LISTENING_STATE) { - phoneIcon = images.speakerActiveIcon; - } else { - phoneIcon = images.speakerInactiveIcon; - } - } - - // For whatever reason the tooltip does not update when localization is changed dynamically. Overrideing it here - override protected function resourcesChanged():void { - this.toolTip = ResourceUtil.getInstance().getString('bbb.toolbar.phone.toolTip.start'); - } - - public function getAlignment():String { - return MainToolbar.ALIGN_LEFT; - } - ]]> - </fx:Script> -</mx:Button> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/components/MuteMeButton.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/components/MuteMeButton.mxml new file mode 100755 index 0000000000000000000000000000000000000000..55ac14ac646565ef0de4b1b4b5552d20a3ea764f --- /dev/null +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/components/MuteMeButton.mxml @@ -0,0 +1,228 @@ +<?xml version="1.0" encoding="utf-8"?> + +<!-- +BigBlueButton open source conferencing system - http://www.bigbluebutton.org + +Copyright (c) 2010 BigBlueButton Inc. and by respective authors (see below). + +BigBlueButton is free software; you can redistribute it and/or modify it under the +terms of the GNU Lesser General Public License as published by the Free Software +Foundation; either version 2.1 of the License, or (at your option) any later +version. + +BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. + +$Id: $ +--> + +<mx:Button xmlns:mx="library://ns.adobe.com/flex/mx" + xmlns:fx="http://ns.adobe.com/mxml/2009" + xmlns:flc="flexlib.controls.*" + xmlns:mate="http://mate.asfusion.com/" + visible="false" + includeInLayout="false" + creationComplete="onCreationComplete()" + toolTip="{UsersUtil.amIMuted() ? ResourceUtil.getInstance().getString('bbb.users.pushToTalk.toolTip') : ResourceUtil.getInstance().getString('bbb.users.pushToMute.toolTip')}" + click="toggleMuteMeState()" + mouseOver="mouseOverHandler()" + mouseOut="mouseOutHandler()" + height="30" + styleName="muteMeDefaultButtonStyle" + implements="org.bigbluebutton.common.IBbbToolbarComponent"> + + <fx:Declarations> + <mate:Listener type="{LocaleChangeEvent.LOCALE_CHANGED}" + method="localeChanged" /> + <mate:Listener type="{ShortcutEvent.MUTE_ME_EVENT}" + method="toggleMuteMeState" /> + <mate:Listener type="{EventConstants.USER_TALKING}" + method="handleUserTalking" /> + <mate:Listener type="{LockControlEvent.CHANGED_LOCK_SETTINGS}" + method="lockSettingsChanged" /> + <mate:Listener type="{ChangeMyRole.CHANGE_MY_ROLE_EVENT}" + method="refreshRole" /> + <mate:Listener type="{BBBEvent.USER_VOICE_JOINED}" + method="handleJoinedVoiceConferenceEvent" /> + <mate:Listener type="{BBBEvent.USER_VOICE_LEFT}" + method="handleLeftVoiceConferenceEvent" /> + <mate:Listener type="{BBBEvent.USER_VOICE_MUTED}" + method="handleVoiceMutedEvent" /> + </fx:Declarations> + + <fx:Script> + <![CDATA[ + import flash.filters.BitmapFilterQuality; + import flash.filters.GlowFilter; + + import mx.core.mx_internal; + + import org.as3commons.logging.api.ILogger; + import org.as3commons.logging.api.getClassLogger; + import org.bigbluebutton.common.IBbbToolbarComponent; + import org.bigbluebutton.common.events.LocaleChangeEvent; + import org.bigbluebutton.core.EventConstants; + import org.bigbluebutton.core.UsersUtil; + import org.bigbluebutton.core.events.CoreEvent; + import org.bigbluebutton.core.events.LockControlEvent; + import org.bigbluebutton.core.events.VoiceConfEvent; + import org.bigbluebutton.core.model.LiveMeeting; + import org.bigbluebutton.core.model.users.VoiceUser2x; + import org.bigbluebutton.main.events.BBBEvent; + import org.bigbluebutton.main.events.ShortcutEvent; + import org.bigbluebutton.main.model.users.events.ChangeMyRole; + import org.bigbluebutton.main.views.MainToolbar; + import org.bigbluebutton.util.i18n.ResourceUtil; + + private static const LOGGER:ILogger = getClassLogger(MuteMeButton); + + private var muteMeRolled:Boolean = false; + + use namespace mx_internal; + + public function getAlignment():String { + return MainToolbar.ALIGN_LEFT; + } + + private function onCreationComplete():void { + LOGGER.debug("initialized"); + } + + private function handleUserTalking(e:CoreEvent):void { + //rest rolledOver when the data changes because onRollOut wont be called if the row moves + if (UsersUtil.isMe(e.message.userID)) { + if (e.message.talking) { + currentIcon.filters = [new GlowFilter(getStyle("glowFilterColor"), 1, 6, 6, 2, BitmapFilterQuality.HIGH, false, false)]; + } else { + currentIcon.filters = []; + } + } + } + + private function localeChanged(e:Event):void { + updateMuteMeBtn(); + } + + private function refreshRole(e:ChangeMyRole):void { + updateMuteMeBtn(); + } + + private function lockSettingsChanged(e:Event):void { + if (UsersUtil.amIModerator() || UsersUtil.amIPresenter()) { + // Ignore lock setting changes as + // or presenter we are moderator. + return; + } + updateMuteMeBtn(); + } + + private function handleJoinedVoiceConferenceEvent(event:BBBEvent):void { + if (UsersUtil.isMe(event.payload.userID)) { + LOGGER.debug("User has joined the conference using flash"); + updateMuteMeBtn(); + currentIcon.filters = []; + } + } + + private function handleLeftVoiceConferenceEvent(event:BBBEvent):void { + if (UsersUtil.isMe(event.payload.userID)) { + LOGGER.debug("User has left the conference using flash"); + updateMuteMeBtn(); + } + } + + private function allowMuteUnmute():Boolean { + var me:VoiceUser2x = LiveMeeting.inst().voiceUsers.getUser(LiveMeeting.inst().me.id); + // I am in voice conference. + return (me != null && !LiveMeeting.inst().me.disableMyMic && !me.listenOnly); + } + + private function updateMuteMeBtn(placeholder:Boolean = false):void { + if (!allowMuteUnmute()) { + this.visible = this.includeInLayout = false; + } else { + this.visible = this.includeInLayout = true; + + var myVoiceUser:VoiceUser2x = LiveMeeting.inst().voiceUsers.getUser(LiveMeeting.inst().me.id); + + if (myVoiceUser != null) { + if (muteMeRolled) { + if (myVoiceUser.muted) { + selected = true; + styleName = "muteMeOnButtonStyle"; + toolTip = ResourceUtil.getInstance().getString("bbb.users.muteMeBtnTxt.talk"); + } else { + selected = true; + styleName = "muteMeOffButtonStyle"; + toolTip = ResourceUtil.getInstance().getString("bbb.users.muteMeBtnTxt.mute"); + } + } else { + if (myVoiceUser.muted) { + selected = true; + styleName = "muteMeOffButtonStyle"; + toolTip = ResourceUtil.getInstance().getString("bbb.users.muteMeBtnTxt.muted"); + } else { + selected = false; + styleName = "muteMeDefaultButtonStyle"; + } + } + } + } + } + + private function handleVoiceMutedEvent(event:BBBEvent):void { + if (UsersUtil.isMe(event.payload.userID)) { + LOGGER.debug("User has been muted/unmuted"); + if (muteMeRolled) { + if (!event.payload.muted) { + selected = true; + styleName = "muteMeOnButtonStyle"; + toolTip = ResourceUtil.getInstance().getString("bbb.users.muteMeBtnTxt.talk"); + } else { + selected = true; + styleName = "muteMeOffButtonStyle"; + toolTip = ResourceUtil.getInstance().getString("bbb.users.muteMeBtnTxt.mute"); + } + } else { + if (event.payload.muted) { + selected = true; + styleName = "muteMeOffButtonStyle"; + toolTip = ResourceUtil.getInstance().getString("bbb.users.muteMeBtnTxt.muted"); + } else { + selected = false; + styleName = "muteMeOnButtonStyle"; + } + } + } + } + + private function toggleMuteMeState(event:ShortcutEvent = null):void { + if (UsersUtil.amIinVoiceConf()) { + this.setFocus(); + if (!allowMuteUnmute()) + return; + + var e:VoiceConfEvent = new VoiceConfEvent(VoiceConfEvent.MUTE_USER); + e.userid = UsersUtil.getMyUserID(); + e.mute = !UsersUtil.amIMuted(); + dispatchEvent(e); + } + } + + private function mouseOverHandler():void { + muteMeRolled = true; + updateMuteMeBtn(); + } + + private function mouseOutHandler():void { + muteMeRolled = false; + updateMuteMeBtn(); + } + ]]> + </fx:Script> + +</mx:Button> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/components/ToolbarButton.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/components/ToolbarButton.mxml index a7bf52df662c9aa4ffe9423f517b9c2e0db6e40b..9ffd0f2faf377c262867a029d908e450b25003af 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/components/ToolbarButton.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/components/ToolbarButton.mxml @@ -25,7 +25,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. mouseOver = "mouseOverHandler(event)" mouseOut = "mouseOutHandler(event)" creationComplete="onCreationComplete()" - height="24" + height="30" + width="40" toolTip="{ResourceUtil.getInstance().getString('bbb.toolbar.phone.toolTip.start')}" implements="org.bigbluebutton.common.IBbbToolbarComponent"> @@ -100,7 +101,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. if (_currentState == ACTIVE_STATE) this.styleName = "voiceConfInactiveButtonStyle"; else - this.styleName = "voiceConfActiveButtonStyle"; + this.styleName = "voiceConfOverButtonStyle"; } private function mouseOutHandler(event:MouseEvent):void { @@ -149,7 +150,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. } } - private function onUserJoinedConference():void { PhoneOptions.firstAudioJoin = false; @@ -236,7 +236,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. this.enabled = true; LOGGER.debug("onClosedAudioSelection enabled=[{0}] selected=[{1}]", [enabled, selected]); _currentState = DEFAULT_STATE; - this.styleName = "voiceConfDefaultButtonStyle"; + this.styleName = "voiceConfDefaultButtonStyle"; this.toolTip = ResourceUtil.getInstance().getString('bbb.toolbar.phone.toolTip.start'); joinDefaultListenOnlyMode(); } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/FileUploadWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/FileUploadWindow.mxml index dd3834352ef65031175d286e3cc84b9254c21eeb..1c82c4c1e879a305fdefe5de49345cd5bac659e6 100644 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/FileUploadWindow.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/FileUploadWindow.mxml @@ -28,7 +28,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. height="410" verticalScrollPolicy="off" horizontalScrollPolicy="off" - styleName="presentationFileUploadWindowStyle" + showCloseButton="true" initialize="initData();"> <fx:Declarations> @@ -57,7 +57,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. import org.as3commons.lang.StringUtils; import org.as3commons.logging.api.ILogger; import org.as3commons.logging.api.getClassLogger; - import org.bigbluebutton.common.Images; import org.bigbluebutton.core.Options; import org.bigbluebutton.core.UsersUtil; import org.bigbluebutton.modules.present.commands.UploadFileCommand; @@ -87,11 +86,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. [Bindable] private var presentationNamesAC:ArrayCollection; [BIndable] public var maxFileSize:Number; - private var images:Images = new Images(); - [Bindable] private var addIcon : Class = images.add; - [Bindable] private var bulletGoIcon : Class = images.bulletGo; - [Bindable] private var deleteIcon : Class = images.cancel; - private var thumbnailTimer:Timer = new Timer(5000); private var genThumbText:String = ResourceUtil.getInstance().getString('bbb.fileupload.genThumbText'); private var genThumbDots:String = "."; @@ -277,6 +271,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. if (!StringUtils.isEmpty(message)) { progressBar.label += message; } + // FIXME : to be localised okCancelBtn.label = "Ok"; } @@ -333,7 +328,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. click="selectFile()" styleName="presentationUploadChooseFileButtonStyle"/> <mx:Button id="uploadBtn" label="{ResourceUtil.getInstance().getString('bbb.fileupload.uploadBtn')}" toolTip="{ResourceUtil.getInstance().getString('bbb.fileupload.uploadBtn.toolTip')}" click="startUpload()" - enabled="false" icon="{bulletGoIcon}"/> + enabled="false" icon="{getStyle('iconGo')}"/> </mx:HBox> <mx:Box paddingLeft="5" paddingTop="5" visible="{presentOptions.enableDownload}" includeInLayout="{presentOptions.enableDownload}" > <mx:CheckBox id="letUserDownload" label="{ResourceUtil.getInstance().getString('bbb.fileupload.letUserDownload')}" selected="{presentOptions.enableDownload}" toolTip="{ResourceUtil.getInstance().getString('bbb.fileupload.letUserDownload.tooltip')}"/> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/PresentationWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/PresentationWindow.mxml index 5880591bfd2f7f40aff2fc45380f6891f0b6f10d..9bf1417bc5c17c33a758f24f66328e13b6284e66 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/PresentationWindow.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/PresentationWindow.mxml @@ -33,8 +33,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. verticalScrollPolicy="off" horizontalScrollPolicy="off" showControls="true" resize="resizeHandler()" - styleNameFocus="presentationWindowStyleFocus" - styleNameNoFocus="presentationWindowStyleNoFocus" implements="org.bigbluebutton.common.IBbbModuleWindow,org.bigbluebutton.modules.whiteboard.views.IWhiteboardReceiver" initialize="init()" creationComplete="onCreationComplete()" @@ -122,7 +120,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. [Bindable] private var DEFAULT_X_POSITION:Number = 237; [Bindable] private var DEFAULT_Y_POSITION:Number = 0; - private static const TOP_WINDOW_BORDER:Number = 54; + private static const TOP_WINDOW_BORDER:Number = 30; private static const WIDTH_PADDING:Number = 8; [Bindable] private var DEFAULT_WINDOW_WIDTH:Number = 510; @@ -398,8 +396,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. backButton.mouseEnabled = pageNumber != 1; forwardButton.mouseEnabled = pageNumber < PresentationModel.getInstance().getNumberOfPages(); - backButton.styleName = pageNumber != 1 ? "presentationBackButtonStyle" : "presentationBackButtonDisabledStyle"; - forwardButton.styleName = pageNumber < PresentationModel.getInstance().getNumberOfPages() ? "presentationForwardButtonStyle" : "presentationForwardButtonDisabledStyle"; + backButton.enabled = pageNumber != 1; + forwardButton.enabled = pageNumber < PresentationModel.getInstance().getNumberOfPages(); } private function displaySlideNumber(currentSlide:int):void { @@ -769,11 +767,9 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. if (downloadablePresentations.length > 0) { LOGGER.debug("Enabling download presentation button. There are {0} presentations available for downloading.", [downloadablePresentations.length]); downloadPres.enabled = true; - downloadPres.styleName = "presentationDownloadButtonStyle"; } else { LOGGER.debug("Disabling download presentation button. There are {0} presentations available for downloading.", [downloadablePresentations.length]); downloadPres.enabled = false; - downloadPres.styleName = "presentationDownloadButtonDisabledStyle"; } updateDownloadBtnTooltip(); } @@ -817,7 +813,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. <views:SlideView id="slideView" width="100%" height="100%" visible="false" mouseDown="mouseDown = true" mouseUp="mouseDown = false" verticalScrollPolicy="off" horizontalScrollPolicy="off"/> - <mx:ControlBar id="presCtrlBar" name="presCtrlBar" width="100%" verticalAlign="middle" styleName="presentationWindowControlsStyle" paddingTop="2" paddingBottom="2"> + <mx:ControlBar id="presCtrlBar" name="presCtrlBar" width="100%" verticalAlign="top" styleName="presentationWindowControlsStyle" paddingTop="2" paddingBottom="2"> <mx:Button id="pollStartBtn" visible="false" height="30" styleName="pollStartButtonStyle" toolTip="{ResourceUtil.getInstance().getString('bbb.polling.startButton.tooltip')}" click="onPollStartButtonClicked()" includeInLayout="{pollStartBtn.visible}"/> @@ -825,18 +821,19 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. click="quickPollClicked(event)" includeInLayout="{quickPollBtn.visible}" /> <mx:Button id="downloadPres" visible="{presentOptions.enableDownload}" - includeInLayout="{downloadPres.visible}" height="30" width="30" + includeInLayout="{downloadPres.visible}" height="30" + styleName="presentationDownloadButtonStyle" click="onDownloadButtonClicked()" creationComplete="updateDownloadBtn()"/> - <mx:HBox id="presenterControls" width="100%" height="100%" visible="false" includeInLayout="false" horizontalAlign="left"> - <mx:Button id="uploadPres" visible="false" height="30" width="30" styleName="presentationUploadButtonStyle" + <mx:HBox id="presenterControls" height="100%" width="100%" paddingTop="0" visible="false" includeInLayout="false" horizontalAlign="left" verticalAlign="top"> + <mx:Button id="uploadPres" visible="false" height="30" styleName="presentationUploadButtonStyle" toolTip="{ResourceUtil.getInstance().getString('bbb.presentation.uploadPresBtn.toolTip')}" click="onUploadButtonClicked()"/> <mx:Spacer width="100%" id="spacer1"/> - <mx:Button id="backButton" visible="false" width="45" height="30" styleName="presentationBackButtonStyle" + <mx:Button id="backButton" visible="false" height="30" styleName="presentationBackButtonStyle" toolTip="{ResourceUtil.getInstance().getString('bbb.presentation.backBtn.toolTip')}" click="goToPreviousSlide()"/> - <mx:Button id="btnSlideNum" visible="false" label="" click="showThumbnails()" + <mx:Button id="btnSlideNum" visible="false" height="30" click="showThumbnails()" toolTip="{ResourceUtil.getInstance().getString('bbb.presentation.btnSlideNum.toolTip')}"/> - <mx:Button id="forwardButton" visible="false" width="45" height="30" styleName="presentationForwardButtonStyle" + <mx:Button id="forwardButton" visible="false" height="30" styleName="presentationForwardButtonStyle" toolTip="{ResourceUtil.getInstance().getString('bbb.presentation.forwardBtn.toolTip')}" click="goToNextSlide()"/> <mx:Spacer width="50%" id="spacer3"/> <mx:HSlider id="zoomSlider" visible="false" value="{slideView.zoomPercentage}" styleName="presentationZoomSliderStyle" @@ -844,10 +841,10 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. useHandCursor="true" snapInterval="5" allowTrackClick="true" liveDragging="true" dataTipFormatFunction="removeDecimalFromDataTip" change="onSliderZoom()" width="100" accessibilityName="{ResourceUtil.getInstance().getString('bbb.presentation.slider')}"/> - <mx:Button id="btnFitToWidth" visible="false" width="30" height="30" styleName="presentationFitToWidthButtonStyle" + <mx:Button id="btnFitToWidth" visible="false" height="30" styleName="presentationFitToWidthButtonStyle" toolTip="{ResourceUtil.getInstance().getString('bbb.presentation.fitToWidth.toolTip')}" click="onFitToPage(false)"/> - <mx:Button id="btnFitToPage" visible="false" width="30" height="30" styleName="presentationFitToPageButtonStyle" + <mx:Button id="btnFitToPage" visible="false" height="30" styleName="presentationFitToPageButtonStyle" toolTip="{ResourceUtil.getInstance().getString('bbb.presentation.fitToPage.toolTip')}" click="onFitToPage(true)"/> <!-- This spacer is to prevent the whiteboard toolbar from overlapping the fit-ot-page button --> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/UploadedPresentationRenderer.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/UploadedPresentationRenderer.mxml index d292bd5afa78bdf9e200c938a5cbcedbef2ab2a9..6bd0bf3043132d4a28ba74e5578d5b0ae2cffe21 100644 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/UploadedPresentationRenderer.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/UploadedPresentationRenderer.mxml @@ -2,7 +2,6 @@ <mx:HBox xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:fx="http://ns.adobe.com/mxml/2009" width="90%" - creationComplete="onCreationComplete()" verticalScrollPolicy="off" horizontalScrollPolicy="off" toolTip="{data as String}" @@ -13,7 +12,6 @@ import org.as3commons.logging.api.ILogger; import org.as3commons.logging.api.getClassLogger; - import org.bigbluebutton.common.Images; import org.bigbluebutton.modules.present.commands.ChangePresentationCommand; import org.bigbluebutton.modules.present.events.RemovePresentationEvent; import org.bigbluebutton.modules.present.events.UploadEvent; @@ -23,11 +21,6 @@ private var globalDispatch:Dispatcher = new Dispatcher(); - private function onCreationComplete():void { - var images:Images = new Images(); - isDownloadable.source = images.disk_grayscale; - } - private function showPresentation():void { LOGGER.debug("FileUploadWindow::showPresentation() {0}", [data.id]); var changePresCommand:ChangePresentationCommand = new ChangePresentationCommand(data.id); @@ -47,6 +40,7 @@ </fx:Script> <mx:Label id="presentationNameLabel" width="{this.width-isDownloadable.width-showBtn.width-deleteBtn.width-30}" text="{data.name as String}" styleName="presentationNameLabelStyle"/> <mx:Image id="isDownloadable" visible="{data.downloadable as Boolean}" + source="{getStyle('iconSave')}" toolTip="{ResourceUtil.getInstance().getString('bbb.filedownload.thisFileIsDownloadable')}" verticalAlign="middle" /> <mx:Button id="showBtn" label="{ResourceUtil.getInstance().getString('bbb.fileupload.showBtn')}" diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/assets/images/Cursor.png b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/assets/images/Cursor.png deleted file mode 100755 index 6e29c43729b8711191d7120348e15bbcfa236dd0..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/assets/images/Cursor.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/assets/images/Cursor2.png b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/assets/images/Cursor2.png deleted file mode 100755 index 34322af4391a5c275bc878054f37ef6f9efb855d..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/assets/images/Cursor2.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/assets/images/cursor3.png b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/assets/images/cursor3.png deleted file mode 100755 index c4c180383d8f15ef91e096b37290c1f770b9c746..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/assets/images/cursor3.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/managers/WebRTCDeskshareManager.as b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/managers/WebRTCDeskshareManager.as index 6c7af8cfaca7813c61e38bf2ebf47391ff6133d2..c412fa482777d479be13d6956f99f5cb2a7d654d 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/managers/WebRTCDeskshareManager.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/managers/WebRTCDeskshareManager.as @@ -26,6 +26,7 @@ package org.bigbluebutton.modules.screenshare.managers import org.as3commons.logging.api.getClassLogger; import org.bigbluebutton.core.Options; import org.bigbluebutton.core.UsersUtil; + import org.bigbluebutton.main.api.JSLog; import org.bigbluebutton.main.events.MadePresenterEvent; import org.bigbluebutton.modules.phone.models.WebRTCAudioStatus; import org.bigbluebutton.modules.screenshare.events.DeskshareToolbarEvent; @@ -50,6 +51,7 @@ package org.bigbluebutton.modules.screenshare.managers private var globalDispatcher:Dispatcher; private var sharing:Boolean = false; private var usingWebRTC:Boolean = false; + private var usingKurentoWebRTC:Boolean = false; private var chromeExtensionKey:String = null; private var options:ScreenshareOptions; @@ -108,7 +110,12 @@ package org.bigbluebutton.modules.screenshare.managers publishWindowManager.stopSharing(); if (ExternalInterface.available) { - ExternalInterface.call("vertoExitScreenShare"); + if(usingKurentoWebRTC) { + ExternalInterface.call("kurentoExitScreenShare"); + } + else { + ExternalInterface.call("vertoExitScreenShare"); + } } } @@ -125,16 +132,29 @@ package org.bigbluebutton.modules.screenshare.managers var voiceBridge:String = UsersUtil.getVoiceBridge(); var myName:String = UsersUtil.getMyUsername(); - - ExternalInterface.call( - 'vertoShareScreen', - videoTag, - voiceBridge, - myName, - null, - "onFail", - chromeExtensionKey - ); + var internalMeetingID:String = UsersUtil.getInternalMeetingID(); + + if(usingKurentoWebRTC) { + ExternalInterface.call( + 'kurentoShareScreen', + videoTag, + voiceBridge, + myName, + internalMeetingID, + "onFail", + chromeExtensionKey + ); + } else { + ExternalInterface.call( + 'vertoShareScreen', + videoTag, + voiceBridge, + myName, + null, + "onFail", + chromeExtensionKey + ); + } } } @@ -146,6 +166,7 @@ package org.bigbluebutton.modules.screenshare.managers chromeExtensionKey = options.chromeExtensionKey; } usingWebRTC = options.tryWebRTCFirst; + usingKurentoWebRTC = options.tryKurentoWebRTC; } public function handleMadePresenterEvent(e:MadePresenterEvent):void { @@ -166,8 +187,10 @@ package org.bigbluebutton.modules.screenshare.managers sends out fall back to java command */ private function cannotUseWebRTC (message:String):void { - LOGGER.debug("WebRTCDeskshareManager::handleStartSharingEvent - falling back to java"); + LOGGER.debug("Cannot use WebRTC Screensharing: " + message); + JSLog.warn("Cannot use WebRTC Screensharing: ", message); usingWebRTC = false; + usingKurentoWebRTC = false; // send out event to fallback to Java globalDispatcher.dispatchEvent(new UseJavaModeCommand()); }; @@ -176,6 +199,8 @@ package org.bigbluebutton.modules.screenshare.managers but not configured properly (no extension for example) */ private function webRTCWorksButNotConfigured (message:String):void { + LOGGER.debug("WebRTC Screenshare needs to be configured clientside: " + message); + JSLog.warn("WebRTC Screenshare needs to be configured clientside: ", message); publishWindowManager.openWindow(); globalDispatcher.dispatchEvent(new WebRTCPublishWindowChangeState(WebRTCPublishWindowChangeState.DISPLAY_INSTALL)); } @@ -184,7 +209,8 @@ package org.bigbluebutton.modules.screenshare.managers attempt to share */ private function webRTCWorksAndConfigured (message:String):void { - LOGGER.debug("WebRTCDeskshareManager::webRTCWorksAndConfigured"); + LOGGER.debug("WebRTC Screenshare works, start sharing: " + message); + JSLog.warn("WebRTC Screenshare works, start sharing: ", message); usingWebRTC = true; startWebRTCDeskshare(); } @@ -195,6 +221,7 @@ package org.bigbluebutton.modules.screenshare.managers if (WebRTCAudioStatus.getInstance().getDidWebRTCAudioFail()) { usingWebRTC = false; + usingKurentoWebRTC = false; globalDispatcher.dispatchEvent(new UseJavaModeCommand()); return; } @@ -237,6 +264,7 @@ package org.bigbluebutton.modules.screenshare.managers public function handleUseJavaModeCommand():void { LOGGER.debug("WebRTCDeskshareManager::handleUseJavaModeCommand"); usingWebRTC = false; + usingKurentoWebRTC = false; } public function handleRequestStartSharingEvent():void { diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/maps/WebRTCDeskshareEventMap.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/maps/WebRTCDeskshareEventMap.mxml index 9827d6e33b8029a3495e6fa719c6bc9f61339a92..cbc3c9181d7676e318b99c49622bb550d5fe326a 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/maps/WebRTCDeskshareEventMap.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/maps/WebRTCDeskshareEventMap.mxml @@ -45,7 +45,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. import org.bigbluebutton.modules.screenshare.events.WebRTCViewStreamEvent; import org.bigbluebutton.modules.screenshare.events.WebRTCViewWindowEvent; import org.bigbluebutton.modules.screenshare.managers.WebRTCDeskshareManager; - import org.bigbluebutton.modules.screenshare.services.red5.WebRTCConnectionEvent; ]]> </fx:Script> @@ -73,12 +72,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. <MethodInvoker generator="{WebRTCDeskshareManager}" method="handleRequestStopSharingEvent"/> </EventHandlers> -<!-- - <EventHandlers type="{ShareStartRequestResponseEvent.SHARE_START_REQUEST_RESPONSE}"> - <MethodInvoker generator="{WebRTCDeskshareManager}" method="handleShareStartRequestResponseEvent" arguments="{event}"/> - </EventHandlers> ---> - <EventHandlers type="{MadePresenterEvent.SWITCH_TO_PRESENTER_MODE}"> <MethodInvoker generator="{WebRTCDeskshareManager}" method="handleMadePresenterEvent" arguments="{event}"/> </EventHandlers> @@ -115,10 +108,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. <MethodInvoker generator="{WebRTCDeskshareManager}" method="handleRequestStopSharingEvent"/> </EventHandlers> - <EventHandlers type="{WebRTCConnectionEvent.SUCCESS}"> - <MethodInvoker generator="{WebRTCDeskshareManager}" method="handleConnectionSuccessEvent"/> - </EventHandlers> - <EventHandlers type="{StartedViewingEvent.STARTED_VIEWING_EVENT}"> <MethodInvoker generator="{WebRTCDeskshareManager}" method="handleStartedViewingEvent" arguments="{event.stream}"/> </EventHandlers> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/model/ScreenshareOptions.as b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/model/ScreenshareOptions.as index 3bb523d36ce297c15d6a3adb8a7e26583027be64..51476ac1c9e3dd3c39d629d28422ebae9c1300ec 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/model/ScreenshareOptions.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/model/ScreenshareOptions.as @@ -30,6 +30,9 @@ package org.bigbluebutton.modules.screenshare.model { [Bindable] public var tryWebRTCFirst:Boolean = false; + [Bindable] + public var tryKurentoWebRTC:Boolean = false; + [Bindable] public var chromeExtensionLink:String = ""; diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/services/MessageSender.as b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/services/MessageSender.as index 398da418b909bd6222c07278b0dfadb9f06d967d..47376512eecfe0a355aee7ace04b326f3fd6ebed 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/services/MessageSender.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/services/MessageSender.as @@ -20,10 +20,16 @@ package org.bigbluebutton.modules.screenshare.services { import org.bigbluebutton.modules.screenshare.services.red5.Connection; + import org.bigbluebutton.core.BBB; + import org.bigbluebutton.core.UsersUtil; + import org.bigbluebutton.core.managers.ConnectionManager; + import org.as3commons.logging.api.ILogger; + import org.as3commons.logging.api.getClassLogger; public class MessageSender { - private static const LOG:String = "SC::MessageSender - "; + private static const LOG:String = "SC::MessageSender - "; + private static const LOGGER:ILogger = getClassLogger(MessageSender); private var conn: Connection; public function MessageSender(conn: Connection) { @@ -56,6 +62,28 @@ package org.bigbluebutton.modules.screenshare.services public function sendClientPongMessage(meetingId: String, session: String, timestamp: Number):void { conn.sendClientPongMessage(meetingId, session, timestamp); - } + } + + public function queryForScreenshare():void { + var message:Object = { + header: {name: "GetScreenshareStatusReqMsg", meetingId: UsersUtil.getInternalMeetingID(), + userId: UsersUtil.getMyUserID()}, + body: {requestedBy: UsersUtil.getMyUserID()} + }; + + var _nc:ConnectionManager = BBB.initConnectionManager(); + _nc.sendMessage2x( + function(result:String):void { // On successful result + }, + function(status:String):void { // status - On error occurred + var logData:Object = UsersUtil.initLogData(); + logData.tags = ["apps"]; + logData.message = "Error occurred getting screenshare status."; + LOGGER.info(JSON.stringify(logData)); + }, + JSON.stringify(message) + ); //_netConnection.call + } + } -} \ No newline at end of file +} diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/services/WebRTCDeskshareService.as b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/services/WebRTCDeskshareService.as index f6513ee62416b7e298ab423877b252add6133a1c..d1b6ece946aaf716fc8865bb3b9d579915032e40 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/services/WebRTCDeskshareService.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/services/WebRTCDeskshareService.as @@ -24,27 +24,28 @@ package org.bigbluebutton.modules.screenshare.services import org.as3commons.logging.api.ILogger; import org.as3commons.logging.api.getClassLogger; - import org.bigbluebutton.modules.screenshare.services.red5.WebRTCConnection; + import org.bigbluebutton.modules.screenshare.services.red5.Connection; - /** - * The DeskShareProxy communicates with the Red5 deskShare server application - * @author Snap - * - */ public class WebRTCDeskshareService { private static const LOGGER:ILogger = getClassLogger(ScreenshareService); - private var conn:WebRTCConnection; + private var red5conn:Connection; private var module:ScreenshareModule; private var dispatcher:Dispatcher; + private var sender:MessageSender; + private var uri:String; private var room:String; public function WebRTCDeskshareService() { this.dispatcher = new Dispatcher(); + + red5conn = new Connection(room); + sender = new MessageSender(red5conn); + sender.queryForScreenshare(); } public function handleStartModuleEvent(module:ScreenshareModule):void { @@ -57,18 +58,14 @@ package org.bigbluebutton.modules.screenshare.services this.uri = uri; this.room = room; LOGGER.debug("Deskshare Service connecting to {0}", [uri]); - conn = new WebRTCConnection(room); //to red5 deskshare - - conn.setURI(uri); - conn.connect(); } public function getConnection():NetConnection{ - return conn.getConnection(); + return red5conn.getConnection(); } public function disconnect():void{ - conn.disconnect(); + red5conn.disconnect(); } } } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/services/red5/WebRTCConnection.as b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/services/red5/WebRTCConnection.as deleted file mode 100755 index a362e16fef74968067106e731f76f40dacf04104..0000000000000000000000000000000000000000 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/services/red5/WebRTCConnection.as +++ /dev/null @@ -1,330 +0,0 @@ -/** -* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ -* -* Copyright (c) 2015 BigBlueButton Inc. and by respective authors (see below). -* -* This program is free software; you can redistribute it and/or modify it under the -* terms of the GNU Lesser General Public License as published by the Free Software -* Foundation; either version 3.0 of the License, or (at your option) any later -* version. -* -* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY -* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License along -* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. -* -*/ - -package org.bigbluebutton.modules.screenshare.services.red5 -{ - import com.asfusion.mate.events.Dispatcher; - - import flash.events.AsyncErrorEvent; - import flash.events.NetStatusEvent; - import flash.events.SecurityErrorEvent; - import flash.events.TimerEvent; - import flash.net.NetConnection; - import flash.net.ObjectEncoding; - import flash.net.Responder; - import flash.utils.Timer; - - import mx.utils.ObjectUtil; - - import org.as3commons.logging.api.ILogger; - import org.as3commons.logging.api.getClassLogger; - import org.bigbluebutton.core.BBB; - import org.bigbluebutton.core.UsersUtil; - import org.bigbluebutton.core.managers.ReconnectionManager; - import org.bigbluebutton.main.events.BBBEvent; - import org.bigbluebutton.modules.screenshare.events.WebRTCViewStreamEvent; - import org.bigbluebutton.modules.screenshare.services.red5.WebRTCConnectionEvent; - - public class WebRTCConnection { - private static const LOGGER:ILogger = getClassLogger(Connection); - - private var nc:NetConnection; - private var uri:String; - private var retryTimer:Timer = null; - private var retryCount:int = 0; - private const MAX_RETRIES:int = 5; - private var responder:Responder; - private var width:Number; - private var height:Number; - private var room:String; - private var logoutOnUserCommand:Boolean = false; - private var reconnecting:Boolean = false; - private var wasPresenterBeforeDisconnect:Boolean = false; - - private var dispatcher:Dispatcher = new Dispatcher(); - - public function WebRTCConnection(room:String) { - this.room = room; - - responder = new Responder( - function(result:Object):void { - if (result != null && (result.publishing as Boolean)){ - width = result.width as Number; - height = result.height as Number; - LOGGER.debug("Desk Share stream is streaming [{0},{1}]", [width, height]); - var event:WebRTCViewStreamEvent = new WebRTCViewStreamEvent(WebRTCViewStreamEvent.START); - event.videoWidth = width; - event.videoHeight = height; - dispatcher.dispatchEvent(event); //TODO why? - } else { - LOGGER.debug("No screenshare stream being published"); - var connEvent:WebRTCConnectionEvent = new WebRTCConnectionEvent(); - connEvent.status = WebRTCConnectionEvent.NO_DESKSHARE_STREAM; - dispatcher.dispatchEvent(connEvent); //TODO why? - } - }, - function(status:Object):void{ - var checkFailedEvent:WebRTCConnectionEvent = new WebRTCConnectionEvent(); - checkFailedEvent.status = WebRTCConnectionEvent.FAIL_CHECK_FOR_DESKSHARE_STREAM; - dispatcher.dispatchEvent(checkFailedEvent); - LOGGER.debug("Error while trying to call remote mathod on server"); - } - ); - } - - public function connect(retry:Boolean = false):void { - nc = new NetConnection(); - nc.proxyType = "best"; - nc.objectEncoding = ObjectEncoding.AMF0; - nc.client = this; - - nc.addEventListener(AsyncErrorEvent.ASYNC_ERROR, debugAsyncErrorHandler); - nc.addEventListener(NetStatusEvent.NET_STATUS, debugNetStatusHandler); - nc.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); - nc.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); - - if (getURI().length == 0){ - LOGGER.error("please provide a valid URI connection string. URI Connection String missing"); - return; - } else if (nc.connected){ - LOGGER.error("You are already connected to {0}", [getURI()]); - return; - } - - LOGGER.debug("Trying to connect to [{0}] retry=[{1}]", [getURI(), retry]); - if (! (retryCount > 0)) { - var ce:WebRTCConnectionEvent = new WebRTCConnectionEvent(); - ce.status = WebRTCConnectionEvent.CONNECTING; - - dispatcher.dispatchEvent(ce); - } - - nc.connect(getURI(), UsersUtil.getInternalMeetingID()); - } - - private function connectTimeoutHandler(e:TimerEvent):void { - LOGGER.debug("Connection attempt to [{0}] timedout. Retrying.", [getURI()]); - retryTimer.stop(); - retryTimer = null; - - nc.close(); - nc = null; - - var ce:WebRTCConnectionEvent = new WebRTCConnectionEvent();; - - retryCount++; - if (retryCount < MAX_RETRIES) { - ce.status = WebRTCConnectionEvent.CONNECTING_RETRY; - ce.retryAttempts = retryCount; - dispatcher.dispatchEvent(ce); - - connect(false); - } else { - ce.status = WebRTCConnectionEvent.CONNECTING_MAX_RETRY; - dispatcher.dispatchEvent(ce); - } - } - - public function close():void{ - nc.close(); - } - - public function setURI(p_URI:String):void{ - uri = p_URI; - } - - public function getURI():String{ - return uri; - } - - public function onBWCheck(... rest):Number { - return 0; - } - - public function onBWDone(... rest):void { - var p_bw:Number; - if (rest.length > 0) p_bw = rest[0]; - // your application should do something here - // when the bandwidth check is complete - LOGGER.debug("bandwidth = {0} Kbps.", [p_bw]); - } - - private function netStatusHandler(event:NetStatusEvent):void { - LOGGER.debug("Connected to [" + getURI() + "]. [" + event.info.code + "]"); - - var logData:Object = {}; - logData.type = "ConnectionStatusChanged"; - logData.newStatus = event.info.code; - logData.connection = getURI(); - LOGGER.info(JSON.stringify(logData)); - - if (retryTimer) { - retryCount = 0; - LOGGER.debug("Cancelling retry timer."); - retryTimer.stop(); - retryTimer = null; - } - - var ce:WebRTCConnectionEvent = new WebRTCConnectionEvent(); - - switch(event.info.code){ - case "NetConnection.Connect.Failed": - if (reconnecting) { - var attemptFailedEvent:BBBEvent = new BBBEvent(BBBEvent.RECONNECT_CONNECTION_ATTEMPT_FAILED_EVENT); - attemptFailedEvent.payload.type = ReconnectionManager.DESKSHARE_CONNECTION; - dispatcher.dispatchEvent(attemptFailedEvent); - } - ce.status = WebRTCConnectionEvent.FAILED; - - dispatcher.dispatchEvent(ce); - break; - - case "NetConnection.Connect.Success": - ce.status = WebRTCConnectionEvent.SUCCESS; - if (reconnecting) { - reconnecting = false; - if (wasPresenterBeforeDisconnect) { - wasPresenterBeforeDisconnect = false; - // stopSharingDesktop(room, room) //TODO - } - - var attemptSucceeded:BBBEvent = new BBBEvent(BBBEvent.RECONNECT_CONNECTION_ATTEMPT_SUCCEEDED_EVENT); - attemptSucceeded.payload.type = ReconnectionManager.DESKSHARE_CONNECTION; - dispatcher.dispatchEvent(attemptSucceeded); - } - - // request desktop sharing info (as a late joiner) - LOGGER.debug("Sending [desktopSharing.requestDeskShareInfo] to server."); - var _nc:ConnectionManager = BBB.initConnectionManager(); - _nc.sendMessage("desktopSharing.requestDeskShareInfo", - function(result:String):void { // On successful result - LOGGER.debug(result); - }, - function(status:String):void { // status - On error occurred - LOGGER.error(status); - } - ); - - dispatcher.dispatchEvent(ce); - break; - - case "NetConnection.Connect.Rejected": - ce.status = WebRTCConnectionEvent.REJECTED; - dispatcher.dispatchEvent(ce); - break; - - case "NetConnection.Connect.Closed": - LOGGER.debug("Deskshare connection closed."); - ce.status = WebRTCConnectionEvent.CLOSED; - if (UsersUtil.amIPresenter()) { - // Let's keep our presenter status before disconnected. We can't - // tell the other user's to stop desktop sharing as our connection is broken. (ralam july 24, 2015) - wasPresenterBeforeDisconnect = true; - - } else { - // stopViewing(); //TODO - } - - if (!logoutOnUserCommand) { - reconnecting = true; - - var disconnectedEvent:BBBEvent = new BBBEvent(BBBEvent.RECONNECT_DISCONNECTED_EVENT); - disconnectedEvent.payload.type = ReconnectionManager.DESKSHARE_CONNECTION; - disconnectedEvent.payload.callback = connect; - disconnectedEvent.payload.callbackParameters = []; - dispatcher.dispatchEvent(disconnectedEvent); - } - break; - - case "NetConnection.Connect.InvalidApp": - ce.status = WebRTCConnectionEvent.INVALIDAPP; - dispatcher.dispatchEvent(ce); - break; - - case "NetConnection.Connect.AppShutdown": - ce.status = WebRTCConnectionEvent.APPSHUTDOWN; - dispatcher.dispatchEvent(ce); - break; - - case "NetConnection.Connect.NetworkChange": - // LOGGER.info("Detected network change. User might be on a wireless and - // temporarily dropped connection. Doing nothing. Just making a note."); - break; - - default : - // I dispatch DISCONNECTED incase someone just simply wants to know if we're not connected' - // rather than having to subscribe to the events individually - ce.status = WebRTCConnectionEvent.DISCONNECTED; - dispatcher.dispatchEvent(ce); - break; - } - } - - private function securityErrorHandler(event:SecurityErrorEvent):void{ - var ce:WebRTCConnectionEvent = new WebRTCConnectionEvent(); - ce.status = WebRTCConnectionEvent.SECURITYERROR; - dispatcher.dispatchEvent(ce); - } - - /** - * Check if anybody is publishing the stream for this room - * This method is useful for clients which have joined a room where somebody is already publishing - * - */ - private function checkIfStreamIsPublishing(room: String):void{ - LOGGER.debug("checking if desk share stream is publishing"); - var event:WebRTCConnectionEvent = new WebRTCConnectionEvent(); - event.status = WebRTCConnectionEvent.CHECK_FOR_DESKSHARE_STREAM; - dispatcher.dispatchEvent(event); // TODO anton send to akka-bbb-apps - - nc.call("screenshare.checkIfStreamIsPublishing", responder, room); - } - - public function disconnect():void{ - logoutOnUserCommand = true; - if (nc != null) nc.close(); - } - - public function connectionSuccessHandler():void{ - LOGGER.debug("Successully connection to {0}", [uri]); - - checkIfStreamIsPublishing(room); - } - - private function debugNetStatusHandler(e:NetStatusEvent):void { - LOGGER.debug("netStatusHandler target={0} info={1}", [e.target, ObjectUtil.toString(e.info)]); - } - - private function debugAsyncErrorHandler(e:AsyncErrorEvent):void { - LOGGER.debug("asyncErrorHandler target={0} info={1}", [e.target, e.text]); - } - - public function getConnection():NetConnection{ - return nc; - } - - public function connectionFailedHandler(e:WebRTCConnectionEvent):void{ - LOGGER.error("connection failed to {0} with message {1}", [uri, e.toString()]); - } - - public function connectionRejectedHandler(e:WebRTCConnectionEvent):void{ - LOGGER.error("connection rejected to {0} with message {1}", [uri, e.toString()]); - } - } -} diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/utils/WebRTCScreenshareUtility.as b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/utils/WebRTCScreenshareUtility.as index 43dd72d72592bbecdae62b18759929fd9ee498b5..be7b796c59434f79f9754c46457a1d4cb929fb66 100644 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/utils/WebRTCScreenshareUtility.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/utils/WebRTCScreenshareUtility.as @@ -43,7 +43,7 @@ package org.bigbluebutton.modules.screenshare.utils // https is required for verto and for peripheral sharing if (!BrowserCheck.isHttps()) { - cannotUseWebRTC("Requires Https"); + cannotUseWebRTC("WebRTC Screensharing requires an HTTPS connection"); return; } @@ -53,13 +53,13 @@ package org.bigbluebutton.modules.screenshare.utils // fail if you dont want to try webrtc first if (!options.tryWebRTCFirst) { - cannotUseWebRTC("not supposed to try WebRTC first (config.xml)"); + cannotUseWebRTC("WebRTC Screensharing is not priority over Java"); return; } // webrtc isnt even supported if (!BrowserCheck.isWebRTCSupported()) { - cannotUseWebRTC("Web browser doesn't support WebRTC"); + cannotUseWebRTC("Web browser does not support WebRTC"); return; } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/view/components/ScreensharePublishWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/view/components/ScreensharePublishWindow.mxml old mode 100755 new mode 100644 index c9e43e11972d7d622ec71605b80cb12b2464dd5e..680c4eaed981e830d8a081f2f6077c21acf6d02d --- a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/view/components/ScreensharePublishWindow.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/view/components/ScreensharePublishWindow.mxml @@ -21,79 +21,76 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. --> <common:CustomMdiWindow - xmlns:mx="library://ns.adobe.com/flex/mx" - xmlns:fx="http://ns.adobe.com/mxml/2009" + xmlns:mx="library://ns.adobe.com/flex/mx" + xmlns:fx="http://ns.adobe.com/mxml/2009" implements="org.bigbluebutton.common.IBbbModuleWindow" xmlns:mate="http://mate.asfusion.com/" xmlns:common="org.bigbluebutton.common.*" backgroundColor="#C0C0C0" initialize="init()" - creationComplete="onCreationComplete()" + creationComplete="onCreationComplete()" verticalScrollPolicy="off" horizontalScrollPolicy="off" width="700" height="350" title="{ResourceUtil.getInstance().getString('bbb.screensharePublish.title')}" resizable="false"> - - <fx:Declarations> - <mate:Listener type="{StartShareRequestSuccessEvent.START_SHARE_REQUEST_SUCCESS}" method="handleStartShareRequestSuccessEvent" /> - <!--mate:Listener type="{ScreenSharePausedEvent.SCREENSHARE_PAUSED}" method="handleScreenSharePausedEvent" /--> - <mate:Listener type="{ShareStoppedEvent.SHARE_STOPPED}" method="handleScreenShareShareStoppedEvent" /> - <mate:Listener type="{ViewStreamEvent.START}" method="handleStartViewStreamEvent" /> - <mate:Listener type="{MadePresenterEvent.SWITCH_TO_PRESENTER_MODE}" method="onChangedPresenter" /> - <mate:Listener type="{MadePresenterEvent.SWITCH_TO_VIEWER_MODE}" method="onChangedPresenter" /> - <mate:Listener type="{ViewStreamEvent.STOP}" method="closePublishWindow" /> - <mate:Listener type="{LocaleChangeEvent.LOCALE_CHANGED}" method="localeChanged" /> - <mate:Listener type="{StopSharingButtonEvent.STOP_SHARING}" method="stopSharingEvent" /> - <mate:Listener type="{ShortcutEvent.REMOTE_FOCUS_DESKTOP}" method="remoteFocus" /> - <mate:Listener type="{BBBEvent.RECONNECT_DISCONNECTED_EVENT}" method="handleDisconnectedEvent" /> - </fx:Declarations> - - <fx:Script> + + <fx:Declarations> + <mate:Listener type="{StartShareRequestSuccessEvent.START_SHARE_REQUEST_SUCCESS}" method="handleStartShareRequestSuccessEvent" /> + <!--mate:Listener type="{ScreenSharePausedEvent.SCREENSHARE_PAUSED}" method="handleScreenSharePausedEvent" /--> + <mate:Listener type="{ShareStoppedEvent.SHARE_STOPPED}" method="handleScreenShareShareStoppedEvent" /> + <mate:Listener type="{ViewStreamEvent.START}" method="handleStartViewStreamEvent" /> + <mate:Listener type="{MadePresenterEvent.SWITCH_TO_PRESENTER_MODE}" method="onChangedPresenter" /> + <mate:Listener type="{MadePresenterEvent.SWITCH_TO_VIEWER_MODE}" method="onChangedPresenter" /> + <mate:Listener type="{ViewStreamEvent.STOP}" method="closePublishWindow" /> + <mate:Listener type="{LocaleChangeEvent.LOCALE_CHANGED}" method="localeChanged" /> + <mate:Listener type="{StopSharingButtonEvent.STOP_SHARING}" method="stopSharingEvent" /> + <mate:Listener type="{ShortcutEvent.REMOTE_FOCUS_DESKTOP}" method="remoteFocus" /> + <mate:Listener type="{BBBEvent.RECONNECT_DISCONNECTED_EVENT}" method="handleDisconnectedEvent" /> + </fx:Declarations> + + <fx:Script> <![CDATA[ - import com.asfusion.mate.events.Dispatcher; - - import org.as3commons.logging.api.ILogger; - import org.as3commons.logging.api.getClassLogger; - import org.bigbluebutton.common.Images; - import org.bigbluebutton.common.events.LocaleChangeEvent; - import org.bigbluebutton.core.Options; - import org.bigbluebutton.core.UsersUtil; - import org.bigbluebutton.core.managers.ReconnectionManager; - import org.bigbluebutton.main.events.BBBEvent; - import org.bigbluebutton.main.events.MadePresenterEvent; - import org.bigbluebutton.main.events.ShortcutEvent; - import org.bigbluebutton.main.views.MainCanvas; - import org.bigbluebutton.modules.screenshare.events.RequestToPauseSharing; - import org.bigbluebutton.modules.screenshare.events.RequestToRestartSharing; - import org.bigbluebutton.modules.screenshare.events.RequestToStopSharing; - import org.bigbluebutton.modules.screenshare.events.ScreenSharePausedEvent; - import org.bigbluebutton.modules.screenshare.events.ShareStartEvent; - import org.bigbluebutton.modules.screenshare.events.ShareStoppedEvent; - import org.bigbluebutton.modules.screenshare.events.ShareWindowEvent; - import org.bigbluebutton.modules.screenshare.events.StartShareRequestSuccessEvent; - import org.bigbluebutton.modules.screenshare.events.StopSharingButtonEvent; - import org.bigbluebutton.modules.screenshare.events.ViewStreamEvent; - import org.bigbluebutton.modules.screenshare.model.ScreenshareModel; - import org.bigbluebutton.modules.screenshare.model.ScreenshareOptions; - import org.bigbluebutton.modules.screenshare.services.red5.Connection; - import org.bigbluebutton.util.i18n.ResourceUtil; - + import com.asfusion.mate.events.Dispatcher; + + import org.as3commons.logging.api.ILogger; + import org.as3commons.logging.api.getClassLogger; + import org.bigbluebutton.common.events.LocaleChangeEvent; + import org.bigbluebutton.core.Options; + import org.bigbluebutton.core.UsersUtil; + import org.bigbluebutton.core.managers.ReconnectionManager; + import org.bigbluebutton.main.events.BBBEvent; + import org.bigbluebutton.main.events.MadePresenterEvent; + import org.bigbluebutton.main.events.ShortcutEvent; + import org.bigbluebutton.main.views.MainCanvas; + import org.bigbluebutton.modules.screenshare.events.RequestToPauseSharing; + import org.bigbluebutton.modules.screenshare.events.RequestToRestartSharing; + import org.bigbluebutton.modules.screenshare.events.RequestToStopSharing; + import org.bigbluebutton.modules.screenshare.events.ScreenSharePausedEvent; + import org.bigbluebutton.modules.screenshare.events.ShareStartEvent; + import org.bigbluebutton.modules.screenshare.events.ShareStoppedEvent; + import org.bigbluebutton.modules.screenshare.events.ShareWindowEvent; + import org.bigbluebutton.modules.screenshare.events.StartShareRequestSuccessEvent; + import org.bigbluebutton.modules.screenshare.events.StopSharingButtonEvent; + import org.bigbluebutton.modules.screenshare.events.ViewStreamEvent; + import org.bigbluebutton.modules.screenshare.model.ScreenshareModel; + import org.bigbluebutton.modules.screenshare.model.ScreenshareOptions; + import org.bigbluebutton.modules.screenshare.services.red5.Connection; + import org.bigbluebutton.util.i18n.ResourceUtil; + + private static const LOGGER:ILogger = getClassLogger(ScreensharePublishWindow); - + public static const SCALE:Number = 5; private static const VID_HEIGHT_PAD:Number = 73; private static const VID_WIDTH_PAD:Number = 6; - - private var images:Images = new Images(); - [Bindable] public var bbbLogo:Class = images.bbb_logo; - + private var connection:Connection; private var uri:String; private var room:String; private var tunnel:Boolean = false; private var sharingFullScreen:Boolean = false; private var streaming:Boolean = false; - + private var video:Video; private var ns:NetStream; private var stream:String; @@ -102,23 +99,23 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. private var captureHeight:Number = Capabilities.screenResolutionY; private var captureWidth:Number = Capabilities.screenResolutionX; private var globalDispatcher:Dispatcher = new Dispatcher(); - + [Bindable] private var baseIndex:int; [Bindable] private var dsOptions:ScreenshareOptions; - + private var paused:Boolean = false; - + private var os:String; private var browser:String; - + [Bindable] private var shareTypeProvider:Array; - + private function init():void { - dsOptions = Options.getOptions(ScreenshareOptions) as ScreenshareOptions; + dsOptions = Options.getOptions(ScreenshareOptions) as ScreenshareOptions; baseIndex = dsOptions.baseTabIndex; } - + private function onCreationComplete():void { var fullOS:String = Capabilities.os; if (fullOS.indexOf("Windows") != -1) { @@ -131,81 +128,81 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. LOGGER.error("Browser not recognized, full value: {0}", [fullOS]); os = ""; } - + browser = ExternalInterface.call("determineBrowser")[0]; - + windowControls.maximizeRestoreBtn.enabled = false; - + titleBarOverlay.tabIndex = dsOptions.baseTabIndex; titleBarOverlay.focusEnabled = true; - + resourcesChanged(); - + focusManager.setFocus(titleBarOverlay); - + if (tunnel) { helpInfoBox.visible = helpInfoBox.includeInLayout = false; previewBox.visible = previewBox.includeInLayout = false; tunnelBox.visible = tunnelBox.includeInLayout = true; - + shareTypeBox.visible = false; cancelBtn.visible = cancelBtn.includeInLayout = true; startBtn.visible = startBtn.includeInLayout = false; stopBtn.visible = stopBtn.includeInLayout = false; } } - + private function remoteFocus(e:ShortcutEvent):void{ focusManager.setFocus(minimizeBtn); } - + public function get defaultWidth():int{ return this.width; } - + public function get defaultHeight():int{ return this.height; } - + public function set defaultHeight(height:int):void{ this.height = height; } - + public function set defaultWidth(width:int):void{ this.width = width; } - + public function getPrefferedPosition():String{ return MainCanvas.DESKTOP_SHARING_PUBLISH; } - + public function handleDisconnectedEvent(event:BBBEvent):void { if (event.payload.type == ReconnectionManager.DESKSHARE_CONNECTION) { - closeWindow(); + closeWindow(); } } - + /* * Implement resizeable interface. */ public function resetWidthAndHeight():void{/* do nothing */} - + public function initWindow(connection:Connection, uri:String, room:String, tunnel:Boolean):void { this.connection = connection; this.uri = uri; this.room = room; this.tunnel = tunnel; } - + private function handleStartShareRequestSuccessEvent(event:StartShareRequestSuccessEvent):void { - + } - + private function handleScreenShareShareStoppedEvent(event:ShareStoppedEvent):void { LOGGER.debug("handleScreenShareShareStoppedEvent reason="+event.reason); - + var showReason:Boolean = false; - + if (event.reason == "JWS_START_FAILED_REASON") { showReason = true; if (paused) { @@ -217,12 +214,12 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. showReason = true; jwsCrashedLbl.visible = jwsCrashedLbl.includeInLayout = true; } - + if (showReason) { helpInfoBox.visible = helpInfoBox.includeInLayout = false; previewBox.visible = previewBox.includeInLayout = false; errorBox.visible = errorBox.includeInLayout = true; - + shareTypeBox.visible = false; cancelBtn.visible = cancelBtn.includeInLayout = true; startBtn.visible = startBtn.includeInLayout = false; @@ -231,11 +228,11 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. closeWindow(); } } - + private function handleScreenSharePausedEvent(event:ScreenSharePausedEvent):void { if (videoWrapper != null && video != null && video.parent == videoWrapper) { videoWrapper.removeChild(video); - + if (paused) { LOGGER.debug("handleScreenSharePausedEvent - enable push button."); pauseBtn.enabled = true; @@ -248,7 +245,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. } } } - + public function shareScreen(fullScreen:Boolean):void { LOGGER.debug("Calling shareScreen"); startBtn.enabled = false; @@ -256,7 +253,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. dispatchEvent(shareStartEvent); startSharing(connection.getConnection(), uri, room, fullScreen); } - + private function startSharing(connection:NetConnection, uri:String, room:String, fullScreen:Boolean):void { var captureX:Number = 0; var captureY:Number = 0; @@ -266,22 +263,22 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. LOGGER.debug("StartScreensharing jnlp=" + jnlp + " token=" + authToken); ExternalInterface.call("startScreensharing", jnlp, UsersUtil.getInternalMeetingID(), authToken, fullScreen); } - + public function stopSharing():void { LOGGER.debug("Calling stopSharing"); if (streaming) { stopStream(); } - + var streamEvent:RequestToStopSharing = new RequestToStopSharing(); dispatchEvent(streamEvent); - + sharingFullScreen = false; streaming = false; - + //closeWindow(); } - + public function pauseSharing():void { LOGGER.debug("Calling pauseSharing"); if (!paused) { @@ -293,28 +290,28 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. } sharingFullScreen = false; streaming = false; - + pauseBtn.enabled = false; } else { paused = false; - + restartBtn.enabled = false; - + var restartSharingEvent:RequestToRestartSharing = new RequestToRestartSharing(); dispatchEvent(restartSharingEvent); } } - + public function stopSharingEvent(evt:StopSharingButtonEvent):void{ if (streaming) { stopStream(); } sharingFullScreen = false; streaming = false; - + closeWindow(); } - + private function handleStartViewStreamEvent(event:ViewStreamEvent):void{ LOGGER.debug("handleStartViewStreamEvent"); var width: int = ScreenshareModel.getInstance().width; @@ -322,44 +319,44 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. var streamId: String = ScreenshareModel.getInstance().streamId; startPreviewStream(connection.getConnection(), streamId, width, height); } - + private function startPreviewStream(nc:NetConnection, streamId:String, capWidth:Number, capHeight:Number):void{ - + switchView(false); - + LOGGER.debug("Viewing stream =[" + streamId + "]"); streaming = true; - + restartBtn.enabled = true; pauseBtn.visible = pauseBtn.includeInLayout = true; restartBtn.visible = restartBtn.includeInLayout = false; - + // Store capture dimensions so we can position cursor properly. captureWidth = capWidth; captureHeight = capHeight; - + var vidW:Number = captureWidth; var vidH:Number = captureHeight; - + // for some reason videoHolder's height is always '0' even when set to 100% so we have to do it manually videoWrapper.height = this.height - controlBar.height - this.titleBar.height - pauseBtn.height - publishView.getStyle('paddingTop') - publishView.getStyle('paddingBottom') - 10; videoWrapper.width = this.width - publishView.getStyle('paddingLeft') - publishView.getStyle('paddingRight') - 10; - + vidW = videoWrapper.width; vidH = videoWrapper.width * captureHeight / captureWidth; - + if (vidH > videoWrapper.height) { vidH = videoWrapper.height; vidW = videoWrapper.height * captureWidth / captureHeight; } - + LOGGER.debug("deskshare preview[" + captureWidth + "," + captureHeight + "][" + vidW + "," + vidH + "]"); video = new Video(vidW, vidH); - + videoWrapper.addChild(video); video.x = videoWrapper.width/2 - video.width/2; video.y = videoWrapper.height/2 - video.height/2; - + ns = new NetStream(nc); ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, onAsyncError); ns.addEventListener( NetStatusEvent.NET_STATUS, onNetStatus ); @@ -369,28 +366,28 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. ns.receiveAudio(false); video.attachNetStream(ns); ns.play(streamId); - + pauseBox.visible = pauseBox.includeInLayout = false; videoWrapper.visible = videoWrapper.includeInLayout = true; pauseBox.width = vidW; pauseBox.height = vidH; } - + public function onMetaData(info:Object):void{ LOGGER.debug("metadata: width=" + info.width + " height=" + info.height); } - + private function stopStream():void{ streaming = false; captureHeight = Capabilities.screenResolutionY; captureWidth = Capabilities.screenResolutionX; ns.close(); } - + private function onAsyncError(e:AsyncErrorEvent):void{ LOGGER.debug("VIdeoWindow::asyncerror " + e.toString()); } - + private function onNetStatus(e:NetStatusEvent):void{ switch(e.info.code){ case "NetStream.Publish.Start": @@ -405,21 +402,21 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. globalDispatcher.dispatchEvent(new BBBEvent(BBBEvent.DESKSHARE_STARTED)); } } - + private function onChangedPresenter(e:Event):void{ stopSharing(); closeWindow(); } - + private function closeWindow():void { dispatchEvent(new ShareWindowEvent(ShareWindowEvent.CLOSE)); } - + private function restartJava():void { shareScreen(sharingFullScreen); } - - + + /* * Override the close handler. We want the Event Map to send a message to * the MDIManager to close this window; @@ -428,53 +425,53 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. stopSharing(); closeWindow(); } - + override protected function resourcesChanged():void{ super.resourcesChanged(); this.title = ResourceUtil.getInstance().getString('bbb.screensharePublish.title'); - + if (titleBarOverlay != null) { titleBarOverlay.accessibilityName = ResourceUtil.getInstance().getString('bbb.screensharePublish.title'); } - + if (windowControls != null) { minimizeBtn.toolTip = ResourceUtil.getInstance().getString('bbb.screensharePublish.minimizeBtn.toolTip'); minimizeBtn.accessibilityName = ResourceUtil.getInstance().getString("bbb.screensharePublish.minimizeBtn.accessibilityName"); - + maximizeRestoreBtn.toolTip = ResourceUtil.getInstance().getString('bbb.screensharePublish.maximizeRestoreBtn.toolTip'); maximizeRestoreBtn.accessibilityName = ResourceUtil.getInstance().getString("bbb.screensharePublish.maximizeRestoreBtn.accessibilityName"); - + closeBtn.toolTip = ResourceUtil.getInstance().getString('bbb.screensharePublish.closeBtn.toolTip'); closeBtn.accessibilityName = ResourceUtil.getInstance().getString("bbb.screensharePublish.closeBtn.accessibilityName"); } - + shareTypeProvider = [ResourceUtil.getInstance().getString('bbb.screensharePublish.shareType.fullScreen'), ResourceUtil.getInstance().getString('bbb.screensharePublish.shareType.region')]; - + setHelpText(); } - + private function localeChanged(e:Event):void{ resourcesChanged(); } - + private function closePublishWindow(event:ViewStreamEvent):void{ stopStream(); closeWindow(); } - + private function isUsingMac():Boolean { return (Capabilities.os.indexOf("Mac") >= 0); } - + private function onHelpButtonClicked():void { var option:ScreenshareOptions = new ScreenshareOptions(); option.parseOptions(); - var DEFAULT_HELP_URL:String = dsOptions.help; + var DEFAULT_HELP_URL:String = dsOptions.help; LOGGER.debug("onHelpButtonClicked - " + DEFAULT_HELP_URL); navigateToURL(new URLRequest(DEFAULT_HELP_URL), "_blank") } - + private function setHelpText():void { if (helpBox != null) { var info:String = ""; @@ -509,44 +506,44 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. info += "Chrome"; } } - + if (info != "") { helpImg1.styleName = "publishHelp" + info + "1"; helpLbl1.text = ResourceUtil.getInstance().getString("bbb.screensharePublish.helpText."+info+"1"); - + helpImg2.styleName = "publishHelp" + info + "2"; helpLbl2.text = ResourceUtil.getInstance().getString("bbb.screensharePublish.helpText."+info+"2"); - + helpImg3.styleName = "publishHelp" + info + "3"; helpLbl3.text = ResourceUtil.getInstance().getString("bbb.screensharePublish.helpText."+info+"3"); - + helpImg4.styleName = "publishHelp" + info + "4"; helpLbl4.text = ResourceUtil.getInstance().getString("bbb.screensharePublish.helpText."+info+"4"); } } } - + private function onStartButtonClick():void { shareScreen(shareTypeCombo.selectedIndex == 0); } - + private function switchView(showHelp:Boolean):void { helpInfoBox.visible = helpInfoBox.includeInLayout = showHelp; previewBox.visible = !showHelp; - + shareTypeBox.visible = showHelp; cancelBtn.visible = cancelBtn.includeInLayout = showHelp; startBtn.visible = startBtn.includeInLayout = showHelp; stopBtn.visible = stopBtn.includeInLayout = !showHelp; } ]]> - </fx:Script> - - <fx:Declarations> - <common:TabIndexer id="tabIndexer" startIndex="{dsOptions.baseTabIndex + 1}" - tabIndices="{[minimizeBtn, maximizeRestoreBtn, closeBtn, helpButton, shareTypeCombo, startBtn, cancelBtn, stopBtn, pauseBtn, restartBtn]}"/> - </fx:Declarations> - + </fx:Script> + + <fx:Declarations> + <common:TabIndexer id="tabIndexer" startIndex="{dsOptions.baseTabIndex + 1}" + tabIndices="{[minimizeBtn, maximizeRestoreBtn, closeBtn, helpButton, shareTypeCombo, startBtn, cancelBtn, stopBtn, pauseBtn, restartBtn]}"/> + </fx:Declarations> + <!--http://stackoverflow.com/questions/369120/why-does-mxstates-have-trouble-being-resolved-to-a-component-implementation--> <mx:Box id="publishView" height="100%" width="100%" styleName="desktopShareViewStyle"> <mx:VBox id="helpInfoBox" width="100%" height="100%" verticalAlign="middle" verticalGap="12"> @@ -555,7 +552,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. text="{ResourceUtil.getInstance().getString('bbb.screensharePublish.commonHelpText.text')}" /> <mx:LinkButton id="helpButton" height="22" - label="?" + label="?" styleName="micSettingsWindowHelpButtonStyle" right="0" click="onHelpButtonClicked()" @@ -590,12 +587,12 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. </mx:Box> <mx:Button id="pauseBtn" click="pauseSharing()" - toolTip="{ResourceUtil.getInstance().getString('bbb.screensharePublish.pause.tooltip')}" + toolTip="{ResourceUtil.getInstance().getString('bbb.screensharePublish.pause.tooltip')}" label="{ResourceUtil.getInstance().getString('bbb.screensharePublish.pause.label')}" /> <mx:Button id="restartBtn" visible="false" includeInLayout="false" click="pauseSharing()" - toolTip="{ResourceUtil.getInstance().getString('bbb.screensharePublish.restart.tooltip')}" + toolTip="{ResourceUtil.getInstance().getString('bbb.screensharePublish.restart.tooltip')}" label="{ResourceUtil.getInstance().getString('bbb.screensharePublish.restart.label')}" /> </mx:VBox> <mx:VBox id="errorBox" width="100%" height="100%" visible="false" includeInLayout="false" horizontalAlign="center" verticalAlign="middle"> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/view/components/ScreenshareViewWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/view/components/ScreenshareViewWindow.mxml old mode 100755 new mode 100644 index 685f07f891bac5cf91c87d94c8bcd738979d4ea1..d4165714c7df333f5c04de5009a2d7621b4f53f8 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/view/components/ScreenshareViewWindow.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/view/components/ScreenshareViewWindow.mxml @@ -42,37 +42,33 @@ <fx:Script> <![CDATA[ - import mx.core.UIComponent; - - import flexlib.mdi.events.MDIWindowEvent; - - import org.as3commons.logging.api.ILogger; - import org.as3commons.logging.api.getClassLogger; - import org.bigbluebutton.common.Images; - import org.bigbluebutton.common.events.LocaleChangeEvent; - import org.bigbluebutton.core.Options; - import org.bigbluebutton.core.UsersUtil; - import org.bigbluebutton.core.managers.ReconnectionManager; - import org.bigbluebutton.main.api.JSLog; - import org.bigbluebutton.main.events.BBBEvent; - import org.bigbluebutton.main.views.MainCanvas; - import org.bigbluebutton.modules.screenshare.events.ViewStreamEvent; - import org.bigbluebutton.modules.screenshare.events.ViewWindowEvent; - import org.bigbluebutton.modules.screenshare.model.ScreenshareModel; - import org.bigbluebutton.modules.screenshare.model.ScreenshareOptions; - import org.bigbluebutton.modules.screenshare.services.red5.Connection; - import org.bigbluebutton.util.i18n.ResourceUtil; - - private static const LOG:String = "SC::ScreenshareViewWIndow - "; - private static const LOGGER:ILogger = getClassLogger(ScreenshareViewWindow); + import mx.core.UIComponent; + + import flexlib.mdi.events.MDIWindowEvent; + + import org.as3commons.logging.api.ILogger; + import org.as3commons.logging.api.getClassLogger; + import org.bigbluebutton.common.events.LocaleChangeEvent; + import org.bigbluebutton.core.Options; + import org.bigbluebutton.core.UsersUtil; + import org.bigbluebutton.core.managers.ReconnectionManager; + import org.bigbluebutton.main.api.JSLog; + import org.bigbluebutton.main.events.BBBEvent; + import org.bigbluebutton.main.views.MainCanvas; + import org.bigbluebutton.modules.screenshare.events.ViewStreamEvent; + import org.bigbluebutton.modules.screenshare.events.ViewWindowEvent; + import org.bigbluebutton.modules.screenshare.model.ScreenshareModel; + import org.bigbluebutton.modules.screenshare.model.ScreenshareOptions; + import org.bigbluebutton.modules.screenshare.services.red5.Connection; + import org.bigbluebutton.util.i18n.ResourceUtil; + + + private static const LOG:String = "SC::ScreenshareViewWIndow - "; + private static const LOGGER:ILogger = getClassLogger(ScreenshareViewWindow); private var screenHeight:Number = Capabilities.screenResolutionY; private var screenWidth:Number = Capabilities.screenResolutionX; - private var images:Images = new Images(); - <!-- [Bindable] public var fitToWidthIcon:Class = images.magnifier; --> - <!-- [Bindable] public var fitToActualSizeIcon:Class = images.mag_reset; --> - private var streamAvailable:Boolean = false; private var video:Video; diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/view/components/ToolbarButton.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/view/components/ToolbarButton.mxml index 963ee6bf30f68a4bec1aa72893e23c81e42728a4..610692d8531d5a1ab9e30f02b5052cae1f772f47 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/view/components/ToolbarButton.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/view/components/ToolbarButton.mxml @@ -24,7 +24,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:mate="http://mate.asfusion.com/" styleName="deskshareDefaultButtonStyle" - height="24" + height="30" toolTip="{ResourceUtil.getInstance().getString('bbb.toolbar.deskshare.toolTip.start')}" click="requestToStarSharing()" mouseOver = "mouseOverHandler(event)" @@ -105,7 +105,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. if(_currentState == ON_STATE) styleName="deskshareOffButtonStyle" else - styleName="deskshareOnButtonStyle" + styleName="deskshareOverButtonStyle" } private function mouseOutHandler(event:MouseEvent):void { diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/view/components/WebRTCDesktopPublishWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/view/components/WebRTCDesktopPublishWindow.mxml index ca46b75af1e0b47ed2b7e812f7afe748ee5ce524..2ce22a28807f670da60398dc767e6cc908661ed7 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/view/components/WebRTCDesktopPublishWindow.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/view/components/WebRTCDesktopPublishWindow.mxml @@ -48,33 +48,33 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. <fx:Script> <![CDATA[ - import org.bigbluebutton.core.Options; import com.asfusion.mate.events.Dispatcher; + import flash.external.ExternalInterface; + import mx.core.UIComponent; - + import org.as3commons.logging.api.ILogger; import org.as3commons.logging.api.getClassLogger; import org.bigbluebutton.common.IBbbModuleWindow; - import org.bigbluebutton.common.Images; import org.bigbluebutton.common.events.LocaleChangeEvent; + import org.bigbluebutton.core.Options; + import org.bigbluebutton.main.api.JSLog; import org.bigbluebutton.main.events.BBBEvent; import org.bigbluebutton.main.events.MadePresenterEvent; import org.bigbluebutton.main.events.ShortcutEvent; import org.bigbluebutton.main.views.MainCanvas; - import org.bigbluebutton.modules.screenshare.events.ShareEvent; + import org.bigbluebutton.modules.screenshare.events.DeskshareToolbarEvent; + import org.bigbluebutton.modules.screenshare.events.RequestToStartSharing; + import org.bigbluebutton.modules.screenshare.events.StopSharingButtonEvent; import org.bigbluebutton.modules.screenshare.events.UseJavaModeCommand; + import org.bigbluebutton.modules.screenshare.events.WebRTCPublishWindowChangeState; import org.bigbluebutton.modules.screenshare.events.WebRTCShareWindowEvent; - import org.bigbluebutton.modules.screenshare.events.StopSharingButtonEvent; import org.bigbluebutton.modules.screenshare.events.WebRTCStreamEvent; import org.bigbluebutton.modules.screenshare.events.WebRTCViewStreamEvent; - import org.bigbluebutton.modules.screenshare.events.WebRTCPublishWindowChangeState; import org.bigbluebutton.modules.screenshare.model.ScreenshareOptions; - import org.bigbluebutton.modules.screenshare.events.RequestToStartSharing; - import org.bigbluebutton.modules.screenshare.events.DeskshareToolbarEvent; import org.bigbluebutton.modules.screenshare.services.red5.WebRTCConnectionEvent; import org.bigbluebutton.util.i18n.ResourceUtil; - import org.bigbluebutton.main.api.JSLog; private static const LOGGER:ILogger = getClassLogger(WebRTCDesktopPublishWindow); @@ -82,9 +82,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. private static const VID_HEIGHT_PAD:Number = 73; private static const VID_WIDTH_PAD:Number = 6; - private var images:Images = new Images(); - [Bindable] public var bbbLogo:Class = images.bbb_logo; - private var connection:NetConnection; private var uri:String; private var useTLS:Boolean; diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/view/components/WebRTCDesktopViewWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/view/components/WebRTCDesktopViewWindow.mxml old mode 100755 new mode 100644 index ac0ce842a32a1d9472738745008b7e09721a2f3b..0070d88bdc1d4015d606af91c533f8e74f8c6962 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/view/components/WebRTCDesktopViewWindow.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/view/components/WebRTCDesktopViewWindow.mxml @@ -40,18 +40,20 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. <fx:Script> <![CDATA[ import mx.core.UIComponent; + import flexlib.mdi.events.MDIWindowEvent; - import org.as3commons.logging.api.ILogger; - import org.as3commons.logging.api.getClassLogger; - import org.bigbluebutton.common.IBbbModuleWindow; + + import org.as3commons.logging.api.ILogger; + import org.as3commons.logging.api.getClassLogger; + import org.bigbluebutton.common.IBbbModuleWindow; import org.bigbluebutton.common.events.LocaleChangeEvent; - import org.bigbluebutton.core.Options; - import org.bigbluebutton.main.views.MainCanvas; - import org.bigbluebutton.modules.screenshare.events.ViewStreamEvent; - import org.bigbluebutton.modules.screenshare.events.ViewWindowEvent; - import org.bigbluebutton.modules.screenshare.model.ScreenshareOptions; + import org.bigbluebutton.core.Options; + import org.bigbluebutton.main.views.MainCanvas; + import org.bigbluebutton.modules.screenshare.events.ViewStreamEvent; + import org.bigbluebutton.modules.screenshare.events.ViewWindowEvent; + import org.bigbluebutton.modules.screenshare.model.ScreenshareOptions; import org.bigbluebutton.modules.screenshare.services.red5.WebRTCConnectionEvent; - import org.bigbluebutton.util.i18n.ResourceUtil; + import org.bigbluebutton.util.i18n.ResourceUtil; public static const LOG:String = "Deskshare::DesktopViewWindow - "; private var screenHeight:Number = Capabilities.screenResolutionY; diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/SharedNotesWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/SharedNotesWindow.mxml index 56be80b2797fa23ee71229df4553015fee00c2f6..1884cb9e8a997dad08a6f6185163c14e883cfbb4 100644 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/SharedNotesWindow.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/SharedNotesWindow.mxml @@ -238,8 +238,6 @@ } private function updateUndoRedoButtons(undo:Boolean, redo:Boolean):void { - btnUndo.styleName = undo ? "sharedNotesEnabledUndoButtonStyle" : "sharedNotesDisabledUndoButtonStyle"; - btnRedo.styleName = redo ? "sharedNotesEnabledRedoButtonStyle" : "sharedNotesDisabledRedoButtonStyle"; btnUndo.enabled = undo; btnRedo.enabled = redo; } @@ -457,7 +455,7 @@ <mx:HBox width="100%" paddingTop="0"> <mx:HBox width="100%" horizontalAlign="left" paddingTop="0"> <mx:Button id="btnUndo" - styleName="sharedNotesDisabledUndoButtonStyle" + styleName="sharedNotesUndoButtonStyle" width="26" height="26" click="btnUndo_clickHandler(event)" @@ -465,7 +463,7 @@ enabled="false" visible="true"/> <mx:Button id="btnRedo" - styleName="sharedNotesDisabledRedoButtonStyle" + styleName="sharedNotesRedoButtonStyle" width="26" height="26" click="btnRedo_clickHandler(event)" diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/components/SharedNotesRichTextEditor.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/components/SharedNotesRichTextEditor.mxml index e28d325a02ed4e86a8c7579fdc89909c4a379e62..9c643320403e1184f4733697014a9bd203cdeae0 100644 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/components/SharedNotesRichTextEditor.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/components/SharedNotesRichTextEditor.mxml @@ -284,23 +284,22 @@ <fx:Script> <![CDATA[ - import org.as3commons.logging.api.ILogger; - import org.as3commons.logging.api.getClassLogger; - import flash.events.Event; + import flash.events.FocusEvent; + import flash.events.KeyboardEvent; + import flash.events.MouseEvent; import flash.events.TextEvent; - import flash.events.ContextMenuEvent; - import flash.ui.ContextMenuItem; - import flash.net.FileReference; - import flash.text.*; - - import org.bigbluebutton.modules.sharednotes.util.DiffPatch; - + import flash.text.TextFormat; + import mx.collections.ArrayCollection; import mx.controls.textClasses.TextRange; - import mx.core.mx_internal; import mx.core.IUITextField; import mx.core.UITextFormat; + import mx.core.mx_internal; + + import org.as3commons.logging.api.ILogger; + import org.as3commons.logging.api.getClassLogger; + import org.bigbluebutton.modules.sharednotes.util.DiffPatch; use namespace mx_internal; private static const LOGGER:ILogger = getClassLogger(SharedNotesRichTextEditor); @@ -1303,17 +1302,17 @@ <mx:Button id="boldButton" width="20" toggle="true" - icon="@Embed('assets/icon_style_bold.png')" + icon="{getStyle('iconBold')}" click="setTextStyles('bold', event.currentTarget.selected);"/> <mx:Button id="italicButton" width="20" toggle="true" - icon="@Embed('assets/icon_style_italic.png')" + icon="{getStyle('iconItalic')}" click="setTextStyles('italic', event.currentTarget.selected);"/> <mx:Button id="underlineButton" width="20" toggle="true" - icon="@Embed('assets/icon_style_underline.png')" + icon="{getStyle('iconUnderline')}" click="setTextStyles('underline', event.currentTarget.selected);"/> </mx:HBox> <mx:ColorPicker id="colorPicker" @@ -1326,17 +1325,17 @@ itemClick="setTextStyles('align', ToggleButtonBar(event.currentTarget).dataProvider.getItemAt(ToggleButtonBar(event.currentTarget).selectedIndex).action);"> <mx:dataProvider> <fx:Array> - <fx:Object icon="@Embed('assets/icon_align_left.png')" action="left"/> - <fx:Object icon="@Embed('assets/icon_align_center.png')" action="center"/> - <fx:Object icon="@Embed('assets/icon_align_right.png')" action="right"/> - <fx:Object icon="@Embed('assets/icon_align_justify.png')" action="justify"/> + <fx:Object icon="{getStyle('iconAlignLeft')}" action="left"/> + <fx:Object icon="{getStyle('iconAlignCenter')}" action="center"/> + <fx:Object icon="{getStyle('iconAlignRight')}" action="right"/> + <fx:Object icon="{getStyle('iconAlignJustify')}" action="justify"/> </fx:Array> </mx:dataProvider> </mx:ToggleButtonBar> <mx:Button id="bulletButton" width="20" toggle="true" - icon="@Embed('assets/icon_bullet.png')" + icon="{getStyle('iconBullet')}" click="setTextStyles('bullet', event.currentTarget.selected);" /> <mx:VRule height="{linkTextInput.height}"/> <mx:TextInput id="linkTextInput" diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/components/assets/icon_align_center.png b/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/components/assets/icon_align_center.png deleted file mode 100644 index 3fac48d0e751a944a2398b73e018e161bbb89e67..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/components/assets/icon_align_center.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/components/assets/icon_align_justify.png b/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/components/assets/icon_align_justify.png deleted file mode 100644 index bf4a6d6afa65c1effefe6270264c4189d40a806e..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/components/assets/icon_align_justify.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/components/assets/icon_align_left.png b/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/components/assets/icon_align_left.png deleted file mode 100644 index c9f45f6107b1b9b57e8b7ff88d6b0c1901b14bb6..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/components/assets/icon_align_left.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/components/assets/icon_align_right.png b/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/components/assets/icon_align_right.png deleted file mode 100644 index 1bdcda3dce26b6ee9d144fc43e4327277d4f7062..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/components/assets/icon_align_right.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/components/assets/icon_bullet.png b/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/components/assets/icon_bullet.png deleted file mode 100644 index a99e9a2b2cd051632df9a2706d3d7dd72497d095..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/components/assets/icon_bullet.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/components/assets/icon_style_bold.png b/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/components/assets/icon_style_bold.png deleted file mode 100644 index a0a71d1dabb40ee47d394c3f3b8b322e14c637f2..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/components/assets/icon_style_bold.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/components/assets/icon_style_italic.png b/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/components/assets/icon_style_italic.png deleted file mode 100644 index 2d0221df7b26caeeca91234617c4f77bf8614df1..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/components/assets/icon_style_italic.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/components/assets/icon_style_underline.png b/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/components/assets/icon_style_underline.png deleted file mode 100644 index 316b2f1d183be9093a49ab6410e7d5f5f9841af4..0000000000000000000000000000000000000000 Binary files a/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/components/assets/icon_style_underline.png and /dev/null differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/users/events/ViewCameraEvent.as b/bigbluebutton-client/src/org/bigbluebutton/modules/users/events/ViewCameraEvent.as index a1be60df854bc581fc356d89ed1b3c836360075f..53408e2551318dadf874029187dcedeb9de8533c 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/users/events/ViewCameraEvent.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/users/events/ViewCameraEvent.as @@ -24,16 +24,12 @@ package org.bigbluebutton.modules.users.events { public static const VIEW_CAMERA_EVENT:String = "VIEW_CAMERA_EVENT"; - public var stream:String; - public var viewedName:String; public var userID:String; - public function ViewCameraEvent(userID:String, stream:String, viewedName:String) + public function ViewCameraEvent(userID:String) { super(VIEW_CAMERA_EVENT,true); this.userID = userID; - this.stream = stream; - this.viewedName = viewedName; } } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/users/maps/UsersMainEventMap.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/users/maps/UsersMainEventMap.mxml index 0a3882a8e6951b30bb7a6b0ae2782c9b287462c9..2a67382431576c3e78d11a26678054975b9037b5 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/users/maps/UsersMainEventMap.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/users/maps/UsersMainEventMap.mxml @@ -194,7 +194,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. </EventHandlers> <EventHandlers type="{ResponseModeratorEvent.RESPONSE_ALL}" > - <MethodInvoker generator="{UserService}" method="responseToGuest" arguments="{event}" /> + <MethodInvoker generator="{UserService}" method="responseToAllGuest" arguments="{event}" /> </EventHandlers> <EventHandlers type="{BBBEvent.BROADCAST_GUEST_POLICY}" > diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/users/model/UsersOptions.as b/bigbluebutton-client/src/org/bigbluebutton/modules/users/model/UsersOptions.as index db9bc8ec71f950d706c53847a6bbf8f413847b13..cdfa54a4459669f95c145425107249e0a697a158 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/users/model/UsersOptions.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/users/model/UsersOptions.as @@ -33,6 +33,9 @@ package org.bigbluebutton.modules.users.model { [Bindable] public var enableSettingsButton:Boolean = true; + + [Bindable] + public var enableGuestUI:Boolean = false; public function UsersOptions() { name = "UsersModule"; diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/users/services/MessageReceiver.as b/bigbluebutton-client/src/org/bigbluebutton/modules/users/services/MessageReceiver.as index 08b0d4cb95571490c9d1ad6a0caa72f33a9d2f7b..c79b00bd666c9dcf2949b925c6dbcd19d1b3e542 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/users/services/MessageReceiver.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/users/services/MessageReceiver.as @@ -112,15 +112,9 @@ package org.bigbluebutton.modules.users.services case "GuestsWaitingForApprovalEvtMsg": handleGuestsWaitingForApprovalEvtMsg(message); break; - case "meetingEnded": - handleLogout(message); - break; case "MeetingEndingEvtMsg": handleMeetingEnding(message); break; - case "meetingHasEnded": - handleMeetingHasEnded(message); - break; case "meetingMuted": handleMeetingMuted(message); break; @@ -136,10 +130,10 @@ package org.bigbluebutton.modules.users.services case "UserEmojiChangedEvtMsg": handleEmojiStatusHand(message); break; - case "getRecordingStatusReply": + case "GetRecordingStatusRespMsg": handleGetRecordingStatusReply(message); break; - case "recordingStatusChanged": + case "RecordingStatusChangedEvtMsg": handleRecordingStatusChanged(message); break; case "user_listening_only": @@ -182,10 +176,10 @@ package org.bigbluebutton.modules.users.services case "ScreenshareRtmpBroadcastStoppedEvtMsg": handleScreenshareRtmpBroadcastStoppedEvtMsg(message); break; - case "get_guest_policy_reply": + case "GetGuestPolicyRespMsg": handleGetGuestPolicyReply(message); break; - case "guest_policy_changed": + case "GuestPolicyChangedEvtMsg": handleGuestPolicyChanged(message); break; case "guest_access_denied": @@ -274,6 +268,7 @@ package org.bigbluebutton.modules.users.services var guestWaiting: GuestWaiting = new GuestWaiting(guest.intId, guest.name, guest.role); LiveMeeting.inst().guestsWaiting.add(guestWaiting); } + private function handleGuestsWaitingForApprovalEvtMsg(msg: Object): void { var body: Object = msg.body as Object; var guests: Array = body.guests as Array; @@ -473,10 +468,6 @@ package org.bigbluebutton.modules.users.services return; } - - private function handleMeetingHasEnded(msg: Object):void { - LOGGER.debug("*** handleMeetingHasEnded {0} **** \n", [msg.msg]); - } private function handlePermissionsSettingsChanged(msg:Object):void { //LOGGER.debug("handlePermissionsSettingsChanged {0} \n", [msg.msg]); @@ -537,13 +528,16 @@ package org.bigbluebutton.modules.users.services } private function handleGetRecordingStatusReply(msg: Object):void { - var map:Object = JSON.parse(msg.msg); - sendRecordingStatusUpdate(map.recording); + var body:Object = msg.body as Object; + var recording: Boolean = body.recording as Boolean; + + sendRecordingStatusUpdate(recording); } private function handleRecordingStatusChanged(msg: Object):void { - var map:Object = JSON.parse(msg.msg); - sendRecordingStatusUpdate(map.recording); + var body:Object = msg.body as Object; + var recording: Boolean = body.recording as Boolean; + sendRecordingStatusUpdate(recording); } private function handleUserListeningOnly(msg: Object):void { @@ -565,23 +559,16 @@ package org.bigbluebutton.modules.users.services } - - - /** - * Called by the server to tell the client that the meeting has ended. - */ - public function handleLogout(msg:Object):void { - var endMeetingEvent:BBBEvent = new BBBEvent(BBBEvent.END_MEETING_EVENT); - dispatcher.dispatchEvent(endMeetingEvent); - } /** * This meeting is in the process of ending by the server */ public function handleMeetingEnding(msg:Object):void { // Avoid trying to reconnect - var endMeetingEvent:BBBEvent = new BBBEvent(BBBEvent.CANCEL_RECONNECTION_EVENT); - dispatcher.dispatchEvent(endMeetingEvent); + var cancelReconnectEvent:BBBEvent = new BBBEvent(BBBEvent.CANCEL_RECONNECTION_EVENT); + dispatcher.dispatchEvent(cancelReconnectEvent); + var endMeetingEvent:BBBEvent = new BBBEvent(BBBEvent.END_MEETING_EVENT); + dispatcher.dispatchEvent(endMeetingEvent); } public function handleAssignPresenterCallback(msg:Object):void { @@ -594,11 +581,13 @@ package org.bigbluebutton.modules.users.services UsersUtil.setUserAsPresent(newPresenterID, true); sendSwitchedPresenterEvent(true, newPresenterID); - var e:MadePresenterEvent = new MadePresenterEvent(MadePresenterEvent.SWITCH_TO_PRESENTER_MODE); - e.userID = newPresenterID; - e.presenterName = newPresenterName; - e.assignedBy = assignedBy; - dispatcher.dispatchEvent(e); + if (UsersUtil.getMyUserID() == newPresenterID) { + var e:MadePresenterEvent = new MadePresenterEvent(MadePresenterEvent.SWITCH_TO_PRESENTER_MODE); + e.userID = newPresenterID; + e.presenterName = newPresenterName; + e.assignedBy = assignedBy; + dispatcher.dispatchEvent(e); + } dispatcher.dispatchEvent(new UserStatusChangedEvent(newPresenterID)); } @@ -613,12 +602,13 @@ package org.bigbluebutton.modules.users.services UsersUtil.setUserAsPresent(oldPresenterID, false); sendSwitchedPresenterEvent(false, oldPresenterID); - var e:MadePresenterEvent = new MadePresenterEvent(MadePresenterEvent.SWITCH_TO_VIEWER_MODE); - e.userID = oldPresenterID; - e.presenterName = oldPresenterName; - e.assignedBy = assignedBy; - - dispatcher.dispatchEvent(e); + if (UsersUtil.getMyUserID() == oldPresenterID) { + var e:MadePresenterEvent = new MadePresenterEvent(MadePresenterEvent.SWITCH_TO_VIEWER_MODE); + e.userID = oldPresenterID; + e.presenterName = oldPresenterName; + e.assignedBy = assignedBy; + dispatcher.dispatchEvent(e); + } dispatcher.dispatchEvent(new UserStatusChangedEvent(oldPresenterID)); } @@ -667,7 +657,6 @@ package org.bigbluebutton.modules.users.services var webUser: User2x = UsersUtil.getUser(userId); if (webUser != null) { - webUser.streamNames.push(streamId); sendStreamStartedEvent(userId, webUser.name, streamId); } @@ -688,6 +677,8 @@ package org.bigbluebutton.modules.users.services logData.user.webcamStream = stream; LOGGER.info(JSON.stringify(logData)); + LiveMeeting.inst().webcams.remove(stream); + sendStreamStoppedEvent(userId, stream); } @@ -696,9 +687,6 @@ package org.bigbluebutton.modules.users.services dispatcher.dispatchEvent(new StreamStoppedEvent(userId, streamId)); } - - - private function handleBreakoutRoomsList(msg:Object):void{ for each(var room : Object in msg.body.rooms) @@ -771,24 +759,26 @@ package org.bigbluebutton.modules.users.services } } - - public function handleGuestPolicyChanged(msg:Object):void { - LOGGER.debug("*** handleGuestPolicyChanged " + msg.msg + " **** \n"); - var map:Object = JSON.parse(msg.msg); + var header: Object = msg.header as Object; + var body: Object = msg.body as Object; + var policy: String = body.policy as String; - var policy:BBBEvent = new BBBEvent(BBBEvent.RETRIEVE_GUEST_POLICY); - policy.payload['guestPolicy'] = map.guestPolicy; - dispatcher.dispatchEvent(policy); + var policyEvent:BBBEvent = new BBBEvent(BBBEvent.RETRIEVE_GUEST_POLICY); + policyEvent.payload['guestPolicy'] = policy; + dispatcher.dispatchEvent(policyEvent); } public function handleGetGuestPolicyReply(msg:Object):void { - LOGGER.debug("*** handleGetGuestPolicyReply " + msg.msg + " **** \n"); - var map:Object = JSON.parse(msg.msg); - - var policy:BBBEvent = new BBBEvent(BBBEvent.RETRIEVE_GUEST_POLICY); - policy.payload['guestPolicy'] = map.guestPolicy; - dispatcher.dispatchEvent(policy); + var header: Object = msg.header as Object; + var body: Object = msg.body as Object; + var policy: String = body.policy as String; + + LiveMeeting.inst().guestsWaiting.setGuestPolicy(policy); + + var policyEvent:BBBEvent = new BBBEvent(BBBEvent.RETRIEVE_GUEST_POLICY); + policyEvent.payload['guestPolicy'] = policyEvent; + dispatcher.dispatchEvent(policyEvent); } public function handleGuestAccessDenied(msg:Object):void { diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/users/services/MessageSender.as b/bigbluebutton-client/src/org/bigbluebutton/modules/users/services/MessageSender.as index 0c6267ebce0f94ba713f1edaf4eb553a3ab5853c..c738e59f43fa47a6d3cd68b5219c3fc3be54c161 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/users/services/MessageSender.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/users/services/MessageSender.as @@ -37,13 +37,20 @@ package org.bigbluebutton.modules.users.services import org.bigbluebutton.core.connection.messages.breakoutrooms.RequestBreakoutJoinURLMsg; import org.bigbluebutton.core.connection.messages.breakoutrooms.RequestBreakoutJoinURLMsgBody; import org.bigbluebutton.core.managers.ConnectionManager; + import org.bigbluebutton.core.model.LiveMeeting; + import org.bigbluebutton.core.model.users.GuestWaiting; public class MessageSender { private static const LOGGER:ILogger = getClassLogger(MessageSender); public function queryForParticipants():void { + var message:Object = { + header: {name: "GetUsersMeetingReqMsg", meetingId: UsersUtil.getInternalMeetingID(), userId: UsersUtil.getMyUserID()}, + body: {userId: UsersUtil.getMyUserID()} + }; + var _nc:ConnectionManager = BBB.initConnectionManager(); - _nc.sendMessage("participants.getParticipants", + _nc.sendMessage2x( function(result:String):void { // On successful result }, function(status:String):void { // status - On error occurred @@ -51,7 +58,7 @@ package org.bigbluebutton.modules.users.services logData.tags = ["apps"]; logData.message = "Error occured querying users."; LOGGER.info(JSON.stringify(logData)); - } + }, JSON.stringify(message) ); } @@ -572,8 +579,15 @@ package org.bigbluebutton.modules.users.services public function queryForGuestPolicy():void { LOGGER.debug("queryForGuestPolicy"); + + var message:Object = { + header: {name: "GetGuestPolicyReqMsg", meetingId: UsersUtil.getInternalMeetingID(), + userId: UsersUtil.getMyUserID()}, + body: {requestedBy: UsersUtil.getMyUserID()} + }; + var _nc:ConnectionManager = BBB.initConnectionManager(); - _nc.sendMessage("participants.getGuestPolicy", + _nc.sendMessage2x( function(result:String):void { // On successful result LOGGER.debug(result); }, @@ -582,14 +596,15 @@ package org.bigbluebutton.modules.users.services logData.tags = ["apps"]; logData.message = "Error occured query guest policy."; LOGGER.info(JSON.stringify(logData)); - } + }, + JSON.stringify(message) ); } public function setGuestPolicy(policy:String):void { LOGGER.debug("setGuestPolicy - new policy:[" + policy + "]"); var message:Object = { - header: {name: "SetGuestPolicyMsg", meetingId: UsersUtil.getInternalMeetingID(), + header: {name: "SetGuestPolicyCmdMsg", meetingId: UsersUtil.getInternalMeetingID(), userId: UsersUtil.getMyUserID()}, body: {policy: policy, setBy: UsersUtil.getMyUserID()} }; @@ -612,12 +627,17 @@ package org.bigbluebutton.modules.users.services public function responseToGuest(userId:String, response:Boolean):void { LOGGER.debug("responseToGuest - userId:[" + userId + "] response:[" + response + "]"); - var message:Object = new Object(); - message["userId"] = userId; - message["response"] = response; + var _guests: Array = new Array(); + _guests.push({guest: userId, approved: response}); + + var message:Object = { + header: {name: "GuestsWaitingApprovedMsg", meetingId: UsersUtil.getInternalMeetingID(), + userId: UsersUtil.getMyUserID()}, + body: {guests: _guests, approvedBy: UsersUtil.getMyUserID()} + }; var _nc:ConnectionManager = BBB.initConnectionManager(); - _nc.sendMessage("participants.responseToGuest", + _nc.sendMessage2x( function(result:String):void { // On successful result LOGGER.debug(result); }, @@ -627,12 +647,38 @@ package org.bigbluebutton.modules.users.services logData.message = "Error occured response guest."; LOGGER.info(JSON.stringify(logData)); }, - message + JSON.stringify(message) ); } public function responseToAllGuests(response:Boolean):void { - responseToGuest(null, response); + var _guestsWaiting: Array = LiveMeeting.inst().guestsWaiting.getGuests(); + var _guests: Array = new Array(); + + for (var i:int = 0; i < _guests.length; i++) { + var _guest: GuestWaiting = _guestsWaiting[i] as GuestWaiting; + _guests.push({guest: _guest.intId, approved: response}); + } + + var message:Object = { + header: {name: "GuestsWaitingApprovedMsg", meetingId: UsersUtil.getInternalMeetingID(), + userId: UsersUtil.getMyUserID()}, + body: {guests: _guests, approvedBy: UsersUtil.getMyUserID()} + }; + + var _nc:ConnectionManager = BBB.initConnectionManager(); + _nc.sendMessage2x( + function(result:String):void { // On successful result + LOGGER.debug(result); + }, + function(status:String):void { // status - On error occurred + var logData:Object = UsersUtil.initLogData(); + logData.tags = ["apps"]; + logData.message = "Error occured response guest."; + LOGGER.info(JSON.stringify(logData)); + }, + JSON.stringify(message) + ); } } } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/EmojiGrid.as b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/EmojiGrid.as index 2a4fcd84bbd717bb21dbb3c15dede941bd5c29a4..db93bb3cd90729fa9ee596f2bc7361301296412a 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/EmojiGrid.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/EmojiGrid.as @@ -19,19 +19,22 @@ package org.bigbluebutton.modules.users.views { import com.asfusion.mate.events.Dispatcher; + import flash.events.MouseEvent; + import mx.containers.HBox; import mx.containers.VBox; import mx.controls.Button; import mx.controls.Label; import mx.core.ScrollPolicy; import mx.events.FlexMouseEvent; - import org.bigbluebutton.common.Images; + import org.bigbluebutton.core.PopUpUtil; import org.bigbluebutton.core.model.LiveMeeting; import org.bigbluebutton.main.model.users.events.EmojiStatusEvent; import org.bigbluebutton.util.i18n.ResourceUtil; + // This class is likely to be removed for V2, We need to move the tooltips to MoodeMenu public class EmojiGrid extends VBox { private const EMOJIS:Array = ["raiseHand", "happy", "neutral", "sad", "confused", "away", "thumbsUp", "thumbsDown", "applause"]; diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/MediaItemRenderer.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/MediaItemRenderer.mxml index 18f82b1c61799f78e0e6d3a519b80c552877dc04..34a7b98d814832e4c4bb144cb954b287ea37bed5 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/MediaItemRenderer.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/MediaItemRenderer.mxml @@ -45,7 +45,6 @@ import mx.events.FlexEvent; import mx.events.MenuEvent; - import org.bigbluebutton.common.Images; import org.bigbluebutton.common.Role; import org.bigbluebutton.core.Options; import org.bigbluebutton.core.UsersUtil; @@ -60,9 +59,6 @@ import org.bigbluebutton.modules.users.model.UsersOptions; import org.bigbluebutton.util.i18n.ResourceUtil; - [Bindable] - private var images:Images = new Images(); - private var moderator:Boolean = false; [Bindable] private var rolledOver:Boolean = false; @@ -146,7 +142,7 @@ } private function viewCamera():void { - dispatchEvent(new ViewCameraEvent(data.userId, data.streamName, data.name)); + dispatchEvent(new ViewCameraEvent(data.userId)); } private function kickUser():void{ @@ -189,7 +185,7 @@ muteBtn.includeInLayout = true; } else { if (data.listenOnly) { - muteImg.source = images.sound; + muteImg.source = getStyle("iconSound"); muteImg.visible = true; muteImg.includeInLayout = true; muteBtn.visible = false; @@ -207,7 +203,7 @@ muteBtn.enabled = true; if(data.talking && !rolledOver){ - muteImg.filters = [new GlowFilter(0x000000, 1, 6, 6, 2, BitmapFilterQuality.HIGH, false, false)]; + muteImg.filters = [new GlowFilter(getStyle("glowFilterColor"), 1, 6, 6, 2, BitmapFilterQuality.HIGH, false, false)]; }else{ muteImg.filters = []; } @@ -255,31 +251,31 @@ if (!rolledOver) { if (data.inVoiceConf) { if (data.listenOnly) { - muteImg.source = images.sound; + muteImg.source = getStyle("iconSound"); } else if (data.muted) { - muteImg.source = images.audio_muted_20; + muteImg.source = getStyle("iconAudioMuted"); } else { - muteImg.source = images.audio_20; + muteImg.source = getStyle("iconAudio"); } } if ( data.locked && !data.presenter && ls.isAnythingLocked() ) { - lockImg.source = images.locked_20; + lockImg.source = getStyle("iconLock"); } else { lockImg.source = null; } } else { if (data.muted == rolledOverMute) - muteBtn.setStyle("icon", images.audio); + muteBtn.setStyle("icon", getStyle("iconAudio")); else - muteBtn.setStyle("icon", images.audio_muted); + muteBtn.setStyle("icon", getStyle("iconAudioMuted")); if (data.locked == rolledOverLock) - lockBtn.setStyle("icon", images.unlocked_20); + lockBtn.setStyle("icon", getStyle("iconUnlock")); else - lockBtn.setStyle("icon", images.locked_20); + lockBtn.setStyle("icon", getStyle("iconLock")); } } } @@ -304,13 +300,13 @@ if (data.role == Role.MODERATOR) { myMenuData.push({ label: ResourceUtil.getInstance().getString('bbb.users.usersGrid.mediaItemRenderer.demoteUser',[data.name]), - icon: images.user_delete, + icon: getStyle('iconDemote'), callback: demoteUser }); } else { myMenuData.push({ label: ResourceUtil.getInstance().getString('bbb.users.usersGrid.mediaItemRenderer.promoteUser',[data.name]), - icon: images.user_add, + icon: getStyle('iconPromote'), callback: promoteUser }); } @@ -318,7 +314,7 @@ if (options.allowKickUser) { myMenuData.push({ label: ResourceUtil.getInstance().getString('bbb.users.usersGrid.mediaItemRenderer.kickUser',[data.name]), - icon: images.eject_user_new, + icon: getStyle('iconEject'), callback: kickUser }); } @@ -349,16 +345,14 @@ ]]> </fx:Script> - <!--mx:Image id="talkingIcon" visible="{data.talking}" source="{images.sound_new}" width="20" height="16" - toolTip="{ResourceUtil.getInstance().getString('bbb.users.usersGrid.mediaItemRenderer.talking')}" /--> - <mx:Image id="webcamImg" visible="false" source="{images.webcam_new_20}" + <mx:Image id="webcamImg" visible="false" source="{getStyle('iconWebcam')}" width="20" height="20" toolTip="{ResourceUtil.getInstance().getString('bbb.users.usersGrid.mediaItemRenderer.webcam')}" /> - <mx:Button id="webcamBtn" visible="false" includeInLayout="false" icon="{images.webcam_new_20}" + <mx:Button id="webcamBtn" visible="false" includeInLayout="false" icon="{getStyle('iconWebcam')}" width="20" height="20" enabled="true" click="viewCamera()" toolTip="{ResourceUtil.getInstance().getString('bbb.users.usersGrid.mediaItemRenderer.webcamBtn')}" /> <mx:Image id="muteImg" visible="false" includeInLayout="true" width="20" height="20" /> - <mx:Button id="muteBtn" visible="false" includeInLayout="false" enabled="false" icon="{images.audio}" + <mx:Button id="muteBtn" visible="false" includeInLayout="false" enabled="false" icon="{getStyle('iconAudio')}" width="20" height="20" click="toggleMuteState()" mouseOver="muteMouseOverHandler()" mouseOut="muteMouseOutHandler()" @@ -374,7 +368,7 @@ width="20" height="20" click="openSettings()" - icon="{images.users_settings}" + icon="{getStyle('iconSettings')}" toolTip="{ResourceUtil.getInstance().getString('bbb.users.settings.buttonTooltip')}"/> <!-- Helper objects because using BindingUtil with data break when the itemRenderer is recycled --> <mx:Image id="muteInd" includeInLayout="false" visible="{data.muted}" /> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/MoodMenu.as b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/MoodMenu.as index eca992301a6520bf78fb63cb697d15efa8e84dc0..c3fe2d911b10a019d946c81eabcd3f12f0c008a7 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/MoodMenu.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/MoodMenu.as @@ -28,7 +28,8 @@ package org.bigbluebutton.modules.users.views { import mx.events.FlexMouseEvent; import mx.events.MenuEvent; import mx.managers.PopUpManager; - import org.bigbluebutton.common.Images; + + import org.as3commons.lang.StringUtils; import org.bigbluebutton.core.UsersUtil; import org.bigbluebutton.main.model.users.events.EmojiStatusEvent; import org.bigbluebutton.main.views.WellPositionedMenu; @@ -47,12 +48,12 @@ package org.bigbluebutton.modules.users.views { "beRightBack", "happy", "sad", + "confused", + "neutral", "clear"]; private var dispatcher:Dispatcher; - private var images:Images; - private var menu:Menu; private var _btn:Button; @@ -64,7 +65,6 @@ package org.bigbluebutton.modules.users.views { public function MoodMenu() { dispatcher = new Dispatcher(); - images = new Images(); addEventListener(FlexMouseEvent.MOUSE_DOWN_OUTSIDE, mouseDownOutsideHandler, false, 0, true); this.horizontalScrollPolicy = ScrollPolicy.OFF; this.verticalScrollPolicy = ScrollPolicy.OFF; @@ -85,7 +85,7 @@ package org.bigbluebutton.modules.users.views { var item:Object = { label: ResourceUtil.getInstance().getString('bbb.users.emojiStatus.' + mood), - icon: images["mood_" + mood] + icon: getStyle("iconMood" + StringUtils.capitalize(mood)) }; moods.addItem(item); diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/NameItemRenderer.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/NameItemRenderer.mxml index 44117564348b6145520215b005beacc911cb5785..7b6d46a5a90b7dedc3194d957641c4e1e1ff2dd0 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/NameItemRenderer.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/NameItemRenderer.mxml @@ -2,34 +2,38 @@ <!-- BigBlueButton open source conferencing system - http://www.bigbluebutton.org - + Copyright (c) 2010 BigBlueButton Inc. and by respective authors (see below). - - BigBlueButton is free software; you can redistribute it and/or modify it under the - terms of the GNU Lesser General Public License as published by the Free Software - Foundation; either version 2.1 of the License, or (at your option) any later - version. - - BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + + BigBlueButton is free software; you can redistribute it and/or modify it under the + terms of the GNU Lesser General Public License as published by the Free Software + Foundation; either version 2.1 of the License, or (at your option) any later + version. + + BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License along + + You should have received a copy of the GNU Lesser General Public License along with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. - + $Id: $ ---> +--> <mx:Box xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:fx="http://ns.adobe.com/mxml/2009" - verticalScrollPolicy="off" horizontalScrollPolicy="off"> + height="100%" + width="100%" + verticalAlign="middle" + verticalScrollPolicy="off" + horizontalScrollPolicy="off"> <fx:Script> <![CDATA[ import org.bigbluebutton.util.i18n.ResourceUtil; ]]> </fx:Script> - <mx:Label id="nameLabel" textAlign="left" text="{data.displayName} {data.me ? '(' + ResourceUtil.getInstance().getString('bbb.users.usersGrid.nameItemRenderer.youIdentifier') + ')' : ''}" - fontWeight="{data.me ? 'bold' : 'normal'}" - color="{data.me ? 0x003399 : 0x000000}" - toolTip="{data.name}"/> + <mx:Label id="nameLabel" width="100%" + text="{data.displayName} {data.me ? '(' + ResourceUtil.getInstance().getString('bbb.users.usersGrid.nameItemRenderer.youIdentifier') + ')' : ''}" + styleName="{data.me ? 'meNameRenderer' : 'nameRenderer'}" + toolTip="{data.name}" /> </mx:Box> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/RoomActionsRenderer.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/RoomActionsRenderer.mxml index 57ae62210183eb5733027ff490cd4d9f6f8693a7..b0534180d5db551c5be45a3a953de77cefbb72a5 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/RoomActionsRenderer.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/RoomActionsRenderer.mxml @@ -11,9 +11,10 @@ </fx:Declarations> <fx:Script> <![CDATA[ - import com.asfusion.mate.events.Dispatcher; - import mx.events.FlexEvent; - import org.bigbluebutton.common.Images; + import com.asfusion.mate.events.Dispatcher; + + import mx.events.FlexEvent; + import org.bigbluebutton.core.UsersUtil; import org.bigbluebutton.core.events.BreakoutRoomsReadyEvent; import org.bigbluebutton.core.model.LiveMeeting; @@ -23,9 +24,6 @@ private var globalDispatch:Dispatcher = new Dispatcher(); - [Bindable] - private var images:Images = new Images(); - [Bindable] private var moderator:Boolean = false; @@ -44,10 +42,10 @@ private function dataChangeHandler(event:FlexEvent):void { if (BreakoutRoom(data).listenStatus == BreakoutRoom.SELF) { - listenBtn.setStyle("icon", images.transferred); + listenBtn.setStyle("icon", getStyle("iconTransfer")); listenBtn.selected = true; } else { - listenBtn.setStyle("icon", images.transfer); + listenBtn.setStyle("icon", getStyle("iconTransferred")); listenBtn.selected = false; } } @@ -71,7 +69,7 @@ <mx:Button id="joinBtn" width="20" height="20" - icon="{images.join}" + icon="{getStyle('iconJoin')}" visible="{(breakoutRoomsReady && moderator) || (!moderator && data.invitedRecently)}" toolTip="{ResourceUtil.getInstance().getString('bbb.users.roomsGrid.join')}" click="requestBreakoutJoinUrl(event)" /> @@ -80,7 +78,7 @@ width="20" height="20" visible="{moderator && data.listenStatus != BreakoutRoom.OTHER && UsersUtil.amIinVoiceConf() || data.listenStatus == BreakoutRoom.SELF}" - icon="{images.transfer}" + icon="{getStyle('iconTransfer')}" toolTip="{ResourceUtil.getInstance().getString('bbb.users.roomsGrid.transfer')}" click="listenToBreakoutRoom(event)" /> </mx:HBox> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/StatusItemRenderer.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/StatusItemRenderer.mxml index 4e1e058dd3348703e30143ddde21caaf80aa6fcd..0dc0aa3f4ef99002c9c4acdfe40afce3d5a74c86 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/StatusItemRenderer.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/StatusItemRenderer.mxml @@ -38,20 +38,20 @@ <fx:Script> <![CDATA[ - import mx.binding.utils.BindingUtils; - import mx.binding.utils.ChangeWatcher; - import mx.events.FlexEvent; - import org.bigbluebutton.common.Images; - import org.bigbluebutton.common.Role; - import org.bigbluebutton.common.events.LocaleChangeEvent; - import org.bigbluebutton.core.UsersUtil; - import org.bigbluebutton.main.model.users.events.ChangeMyRole; - import org.bigbluebutton.main.model.users.events.EmojiStatusEvent; - import org.bigbluebutton.main.model.users.events.RoleChangeEvent; - import org.bigbluebutton.modules.users.events.UsersRollEvent; - import org.bigbluebutton.util.i18n.ResourceUtil; + import mx.binding.utils.BindingUtils; + import mx.binding.utils.ChangeWatcher; + import mx.events.FlexEvent; + + import org.as3commons.lang.StringUtils; + import org.bigbluebutton.common.Role; + import org.bigbluebutton.common.events.LocaleChangeEvent; + import org.bigbluebutton.core.UsersUtil; + import org.bigbluebutton.main.model.users.events.ChangeMyRole; + import org.bigbluebutton.main.model.users.events.EmojiStatusEvent; + import org.bigbluebutton.main.model.users.events.RoleChangeEvent; + import org.bigbluebutton.modules.users.events.UsersRollEvent; + import org.bigbluebutton.util.i18n.ResourceUtil; - private var images:Images = new Images(); private var rolledOver:Boolean = false; private var moderator:Boolean = false; @@ -102,25 +102,25 @@ private function updateRoleComponents() : void { if (rolledOver && !data.presenter && !data.voiceOnlyUser) { - roleBtn.setStyle("icon", images.presenter_new); + roleBtn.setStyle("icon", getStyle("iconPresenter")); roleBtn.toolTip = ResourceUtil.getInstance().getString('bbb.users.usersGrid.statusItemRenderer.changePresenter'); roleImg.visible = false; roleBtn.visible = true; roleBtn.enabled = true; } else if (data.presenter) { - roleImg.source = images.presenter_new; + roleImg.source = getStyle("iconPresenter"); roleImg.toolTip = ResourceUtil.getInstance().getString('bbb.users.usersGrid.statusItemRenderer.presenter'); roleImg.visible = true; roleBtn.visible = false; roleBtn.enabled = false; } else if (data.role == Role.MODERATOR) { - roleImg.source = images.moderator; + roleImg.source = getStyle("iconModerator"); roleImg.toolTip = ResourceUtil.getInstance().getString('bbb.users.usersGrid.statusItemRenderer.moderator'); roleImg.visible = true; roleBtn.visible = false; roleBtn.enabled = false; } else if (data.role == Role.VOICE_ONLY) { - roleImg.source = images.sound; + roleImg.source = getStyle("iconModeratorOnly"); roleImg.toolTip = ResourceUtil.getInstance().getString('bbb.users.usersGrid.statusItemRenderer.voiceOnlyUser'); roleImg.visible = true; roleBtn.visible = false; @@ -136,13 +136,13 @@ private function updateEmojiComponents() : void { if (rolledOver && data.hasEmojiStatus) { - emojiBtn.setStyle("icon", images["mood_" + data.emojiStatus]); + emojiBtn.setStyle("icon", getStyle("iconMood" + StringUtils.capitalize(data.emojiStatus))); emojiBtn.toolTip = ResourceUtil.getInstance().getString('bbb.users.usersGrid.statusItemRenderer.clearStatus') + " - " + data.emojiStatusTime.hours + ":" + data.emojiStatusTime.minutes + ":" + data.emojiStatusTime.seconds; emojiImg.visible = false; emojiBtn.visible = true; emojiBtn.enabled = true; } else if (data.hasEmojiStatus) { - emojiImg.source = images["mood_" + data.emojiStatus]; + emojiImg.source = getStyle("iconMood" + StringUtils.capitalize(data.emojiStatus)); emojiImg.toolTip = ResourceUtil.getInstance().getString('bbb.users.usersGrid.statusItemRenderer.' + data.emojiStatus) + " - " + data.emojiStatusTime.hours + ":" + data.emojiStatusTime.minutes + ":" + data.emojiStatusTime.seconds; emojiImg.visible = true; emojiBtn.visible = false; @@ -203,7 +203,7 @@ } ]]> </fx:Script> - <mx:Image id="emojiImg" visible="true" width="20" height="20" includeInLayout="{emojiImg.visible}" /> + <mx:Image id="emojiImg" visible="true" includeInLayout="{emojiImg.visible}" /> <mx:Button id="emojiBtn" visible="false" enabled="false" width="20" height="20" click="emojiBtnClicked()" includeInLayout="{emojiBtn.visible}" /> <mx:Image id="roleImg" visible="true" width="20" height="20" includeInLayout="{roleImg.visible}" /> 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 667f32c5f1e60684a331a100a1a6678831791b32..8b07cbfa7b61e06519c56e143076e1ca67e7dce3 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/UsersWindow.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/UsersWindow.mxml @@ -52,70 +52,77 @@ <mate:Listener type="{UserLeftEvent.LEFT}" method="handleUserLeftEvent" /> <mate:Listener type="{UserEmojiChangedEvent.USER_EMOJI_CHANGED}" method="handleUserEmojiChangedEvent" /> <mate:Listener type="{SwitchedPresenterEvent.SWITCHED_PRESENTER}" method="handleSwitchedPresenterEvent" /> + <mate:Listener type="{StoppedViewingWebcamEvent.STOPPED_VIEWING_WEBCAM}" method="handleStoppedViewingWebcamEvent" /> + <mate:Listener type="{StartedViewingWebcamEvent.STARTED_VIEWING_WEBCAM}" method="handleStartedViewingWebcamEvent" /> + <mate:Listener type="{StreamStartedEvent.STREAM_STARTED}" method="handleStreamStartedEvent" /> + <mate:Listener type="{StreamStoppedEvent.STREAM_STOPPED}" method="handleStreamStoppedEvent" /> - + </fx:Declarations> <fx:Script> <![CDATA[ - import com.asfusion.mate.events.Dispatcher; - - import flash.net.navigateToURL; - - import mx.binding.utils.BindingUtils; - import mx.collections.ArrayCollection; - import mx.controls.Alert; - import mx.controls.Menu; - import mx.controls.dataGridClasses.DataGridColumn; - import mx.controls.listClasses.IListItemRenderer; - import mx.core.FlexGlobals; - import mx.core.mx_internal; - import mx.events.CloseEvent; - import mx.events.CollectionEvent; - import mx.events.ListEvent; - import mx.events.MenuEvent; - import mx.managers.PopUpManager; - - import org.as3commons.logging.api.ILogger; - import org.as3commons.logging.api.getClassLogger; - import org.bigbluebutton.common.IBbbModuleWindow; - import org.bigbluebutton.common.Images; - import org.bigbluebutton.common.Role; - import org.bigbluebutton.common.events.LocaleChangeEvent; - import org.bigbluebutton.core.EventConstants; - import org.bigbluebutton.core.KeyboardUtil; - import org.bigbluebutton.core.PopUpUtil; - import org.bigbluebutton.core.TimerUtil; - import org.bigbluebutton.core.UsersUtil; - import org.bigbluebutton.core.events.BreakoutRoomsListUpdatedEvent; - import org.bigbluebutton.core.events.CoreEvent; - import org.bigbluebutton.core.events.LockControlEvent; - import org.bigbluebutton.core.events.UserEmojiChangedEvent; - import org.bigbluebutton.core.events.UserStatusChangedEvent; - import org.bigbluebutton.core.events.VoiceConfEvent; - import org.bigbluebutton.core.model.LiveMeeting; - import org.bigbluebutton.core.model.users.User2x; - import org.bigbluebutton.core.vo.LockSettingsVO; - import org.bigbluebutton.main.events.BBBEvent; - import org.bigbluebutton.main.events.BreakoutRoomEvent; - import org.bigbluebutton.main.events.ShortcutEvent; - import org.bigbluebutton.main.events.SwitchedPresenterEvent; - import org.bigbluebutton.main.events.UserJoinedEvent; - import org.bigbluebutton.main.events.UserLeftEvent; - import org.bigbluebutton.main.model.users.BreakoutRoom; - import org.bigbluebutton.main.model.users.events.ChangeMyRole; - import org.bigbluebutton.main.model.users.events.EmojiStatusEvent; - import org.bigbluebutton.main.model.users.events.KickUserEvent; - import org.bigbluebutton.main.model.users.events.RoleChangeEvent; - import org.bigbluebutton.main.views.MainCanvas; - import org.bigbluebutton.main.views.WellPositionedMenu; - import org.bigbluebutton.modules.phone.events.LeaveVoiceConferenceCommand; - import org.bigbluebutton.modules.users.events.MeetingMutedEvent; - import org.bigbluebutton.modules.users.events.UsersRollEvent; - import org.bigbluebutton.modules.users.model.BreakoutRoomsOptions; - import org.bigbluebutton.modules.users.model.UsersOptions; - import org.bigbluebutton.modules.users.views.model.BBBUser2x; - import org.bigbluebutton.modules.videoconf.events.StopBroadcastEvent; - import org.bigbluebutton.util.i18n.ResourceUtil; + import com.asfusion.mate.events.Dispatcher; + + import flash.net.navigateToURL; + + import mx.binding.utils.BindingUtils; + import mx.collections.ArrayCollection; + import mx.controls.Alert; + import mx.controls.Menu; + import mx.controls.dataGridClasses.DataGridColumn; + import mx.controls.listClasses.IListItemRenderer; + import mx.core.FlexGlobals; + import mx.core.mx_internal; + import mx.events.CloseEvent; + import mx.events.CollectionEvent; + import mx.events.ListEvent; + import mx.events.MenuEvent; + import mx.managers.PopUpManager; + + import org.as3commons.logging.api.ILogger; + import org.as3commons.logging.api.getClassLogger; + import org.bigbluebutton.common.IBbbModuleWindow; + import org.bigbluebutton.common.Role; + import org.bigbluebutton.common.events.LocaleChangeEvent; + import org.bigbluebutton.core.EventConstants; + import org.bigbluebutton.core.KeyboardUtil; + import org.bigbluebutton.core.PopUpUtil; + import org.bigbluebutton.core.TimerUtil; + import org.bigbluebutton.core.UsersUtil; + import org.bigbluebutton.core.events.BreakoutRoomsListUpdatedEvent; + import org.bigbluebutton.core.events.CoreEvent; + import org.bigbluebutton.core.events.LockControlEvent; + import org.bigbluebutton.core.events.UserEmojiChangedEvent; + import org.bigbluebutton.core.events.UserStatusChangedEvent; + import org.bigbluebutton.core.events.VoiceConfEvent; + import org.bigbluebutton.core.model.LiveMeeting; + import org.bigbluebutton.core.model.users.User2x; + import org.bigbluebutton.core.vo.LockSettingsVO; + import org.bigbluebutton.main.events.BBBEvent; + import org.bigbluebutton.main.events.BreakoutRoomEvent; + import org.bigbluebutton.main.events.ShortcutEvent; + import org.bigbluebutton.main.events.StartedViewingWebcamEvent; + import org.bigbluebutton.main.events.StoppedViewingWebcamEvent; + import org.bigbluebutton.main.events.SwitchedPresenterEvent; + import org.bigbluebutton.main.events.UserJoinedEvent; + import org.bigbluebutton.main.events.UserLeftEvent; + import org.bigbluebutton.main.model.users.BreakoutRoom; + import org.bigbluebutton.main.model.users.events.ChangeMyRole; + import org.bigbluebutton.main.model.users.events.EmojiStatusEvent; + import org.bigbluebutton.main.model.users.events.KickUserEvent; + import org.bigbluebutton.main.model.users.events.RoleChangeEvent; + import org.bigbluebutton.main.model.users.events.StreamStartedEvent; + import org.bigbluebutton.main.model.users.events.StreamStoppedEvent; + import org.bigbluebutton.main.views.MainCanvas; + import org.bigbluebutton.main.views.WellPositionedMenu; + import org.bigbluebutton.modules.phone.events.LeaveVoiceConferenceCommand; + import org.bigbluebutton.modules.users.events.MeetingMutedEvent; + import org.bigbluebutton.modules.users.events.UsersRollEvent; + import org.bigbluebutton.modules.users.model.BreakoutRoomsOptions; + import org.bigbluebutton.modules.users.model.UsersOptions; + import org.bigbluebutton.modules.users.views.model.BBBUser2x; + import org.bigbluebutton.modules.videoconf.events.StopBroadcastEvent; + import org.bigbluebutton.util.i18n.ResourceUtil; private static const LOGGER:ILogger = getClassLogger(UsersWindow); @@ -139,9 +146,6 @@ [Bindable] public var breakoutOptions:BreakoutRoomsOptions; - [Bindable] - private var images:Images = new Images(); - [Bindable] private var users:ArrayCollection = new ArrayCollection(); @@ -164,6 +168,10 @@ private const LISTEN_TO_BREAKOUT_ROOM:String = "Listen To Breakout Room"; private const JOIN_BREAKOUT_ROOM:String = "Join Breakout Room"; + private const STATUS_GRID_WIDTH:int = 56; + private const NAME_GRID_MIN_WIDTH:int = 80; + private const MEDIA_GRID_WIDTH:int = 112; + private var muteMeRolled:Boolean = false; private var handler: UsersWindowEventHandler = new UsersWindowEventHandler(); @@ -196,7 +204,22 @@ handler.handleUserLeftEvent(event.userID); } + private function handleStoppedViewingWebcamEvent(event: StoppedViewingWebcamEvent): void { + handler.handleStoppedViewingWebcamEvent(event); + } + private function handleStartedViewingWebcamEvent(event: StartedViewingWebcamEvent): void { + handler.handleStartedViewingWebcamEvent(event); + } + + private function handleStreamStartedEvent(event: StreamStartedEvent): void { + handler.handleStreamStartedEvent(event); + } + + private function handleStreamStoppedEvent(event: StreamStoppedEvent): void { + handler.handleStreamStoppedEvent(event); + } + private function handleUserJoinedEvent(event: UserJoinedEvent):void { handler.handleUserJoinedEvent(event); } @@ -354,18 +377,17 @@ private function openSettings():void { paramsMenuData = []; paramsMenuData.push({label: ResourceUtil.getInstance().getString('bbb.users.settings.clearAllStatus'), handler: resetEmojiStatuses}); - + if (!roomMuted) { - paramsMenuData.push({label: ResourceUtil.getInstance().getString('bbb.users.settings.muteAll'), icon: images.audio_muted, handler: muteAll}); - var presenter: User2x = UsersUtil.getPresenter(); - if (presenter != null) - paramsMenuData.push({label: ResourceUtil.getInstance().getString('bbb.users.settings.muteAllExcept') + ": " + - presenter.name, icon: images.audio_muted, handler: muteAlmostAll}); + paramsMenuData.push({label: ResourceUtil.getInstance().getString('bbb.users.settings.muteAll'), icon: getStyle('iconAudioMuted'), handler: muteAll}); + var presenter:User2x = UsersUtil.getPresenter(); + if (presenter != null) + paramsMenuData.push({label: ResourceUtil.getInstance().getString('bbb.users.settings.muteAllExcept') + ": " + presenter.name, icon: getStyle('iconAudioMuted'), handler: muteAlmostAll}); } else - paramsMenuData.push({label: ResourceUtil.getInstance().getString('bbb.users.settings.unmuteAll'), icon: images.audio, handler: muteAll}); - - paramsMenuData.push({label: ResourceUtil.getInstance().getString('bbb.users.settings.lockSettings'), icon: images.lock_open, handler: lockSettings}); - if (breakoutOptions.enabled && amIModerator && ! UsersUtil.isBreakout()) { + paramsMenuData.push({label: ResourceUtil.getInstance().getString('bbb.users.settings.unmuteAll'), icon: getStyle('iconAudio'), handler: muteAll}); + + paramsMenuData.push({label: ResourceUtil.getInstance().getString('bbb.users.settings.lockSettings'), icon: getStyle('iconLock'), handler: lockSettings}); + if (breakoutOptions.enabled && amIModerator && !UsersUtil.isBreakout()) { if (breakoutRoomsList.length == 0) { paramsMenuData.push({label: ResourceUtil.getInstance().getString('bbb.users.settings.breakoutRooms'), handler: breakoutRooms}); } else { @@ -384,7 +406,7 @@ paramsMenu.addEventListener(MenuEvent.ITEM_CLICK, menuClickHandler); paramsMenu.show(); } - + private function menuClickHandler(e:MenuEvent):void { if (paramsMenuData[e.index] != undefined && paramsMenuData[e.index].handler != undefined) { paramsMenuData[e.index].handler(); @@ -689,16 +711,19 @@ </fx:Declarations> <views:BBBDataGrid id="usersGrid" dataProvider="{users}" editable="false" sortableColumns="true" - dragEnabled="false" width="100%" height="100%" draggableColumns="false" + dragEnabled="false" width="100%" height="100%" draggableColumns="false" styleName="usersGridStyle" itemRollOver="onItemRollOver(event)" - itemRollOut="onItemRollOut(event)" + itemRollOut="onItemRollOut(event)" + showHeaders="false" + rowHeight="35" + minWidth="{STATUS_GRID_WIDTH + NAME_GRID_MIN_WIDTH + MEDIA_GRID_WIDTH}" accessibilityName="{ResourceUtil.getInstance().getString('bbb.users.usersGrid.accessibilityName')}" > <views:columns> - <mx:DataGridColumn dataField="userStatus" headerText="{ResourceUtil.getInstance().getString('bbb.users.usersGrid.statusItemRenderer')}" editable="false" width="56" resizable="false" + <mx:DataGridColumn dataField="userStatus" headerText="{ResourceUtil.getInstance().getString('bbb.users.usersGrid.statusItemRenderer')}" editable="false" width="{STATUS_GRID_WIDTH}" resizable="false" itemRenderer="org.bigbluebutton.modules.users.views.StatusItemRenderer" sortable="false" /> <mx:DataGridColumn dataField="name" headerText="{ResourceUtil.getInstance().getString('bbb.users.usersGrid.nameItemRenderer')}" editable="false" sortable="false" itemRenderer="org.bigbluebutton.modules.users.views.NameItemRenderer"/> - <mx:DataGridColumn dataField="media" headerText="{ResourceUtil.getInstance().getString('bbb.users.usersGrid.mediaItemRenderer')}" sortable="false" width="112" resizable="false" + <mx:DataGridColumn dataField="media" headerText="{ResourceUtil.getInstance().getString('bbb.users.usersGrid.mediaItemRenderer')}" sortable="false" width="{MEDIA_GRID_WIDTH}" resizable="false" itemRenderer="org.bigbluebutton.modules.users.views.MediaItemRenderer"/> </views:columns> </views:BBBDataGrid> @@ -736,10 +761,10 @@ </mx:VBox> <mx:ControlBar width="100%"> - <mx:Button id="emojiStatusBtn" icon="{images.mood}" width="30" height="30" + <mx:Button id="emojiStatusBtn" icon="{getStyle('iconMood')}" width="30" height="30" accessibilityName="{ResourceUtil.getInstance().getString('bbb.users.emojiStatusBtn.toolTip')}" toolTip="{ResourceUtil.getInstance().getString('bbb.users.emojiStatusBtn.toolTip')}" click="openEmojiStatusMenu()" /> - <mx:Button id="settingsBtn" icon="{images.users_settings}" width="30" height="30" + <mx:Button id="settingsBtn" icon="{getStyle('iconSettings')}" width="30" height="30" toolTip="{ResourceUtil.getInstance().getString('bbb.users.settings.buttonTooltip')}" click="openSettings()" /> <mx:VBox> <mx:Label text="{ResourceUtil.getInstance().getString('bbb.users.roomMuted.text')}" visible="{roomMuted}" includeInLayout="{roomMuted}" /> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/UsersWindowEventHandler.as b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/UsersWindowEventHandler.as index 48bbcf076d1c07f224dd8f576144ebbe9b4211cf..290b10907fadba3a3c58ed10ff141ef83278723d 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/UsersWindowEventHandler.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/UsersWindowEventHandler.as @@ -8,7 +8,11 @@ package org.bigbluebutton.modules.users.views import org.bigbluebutton.core.model.LiveMeeting; import org.bigbluebutton.core.model.users.User2x; import org.bigbluebutton.core.model.users.VoiceUser2x; + import org.bigbluebutton.main.events.StartedViewingWebcamEvent; + import org.bigbluebutton.main.events.StoppedViewingWebcamEvent; import org.bigbluebutton.main.events.UserJoinedEvent; + import org.bigbluebutton.main.model.users.events.StreamStartedEvent; + import org.bigbluebutton.main.model.users.events.StreamStoppedEvent; import org.bigbluebutton.modules.users.views.model.BBBUser2x; import org.bigbluebutton.modules.users.views.model.BBBVoiceUser2x; @@ -86,15 +90,14 @@ package org.bigbluebutton.modules.users.views users.refresh(); } - private function getWebcamStreamsForUser(userId: String): String { + private function getWebcamStreamsForUser(userId: String): Array { var streamIds: Array = LiveMeeting.inst().webcams.getStreamIdsForUser(userId); - var streams:String = ""; - for each(var stream:String in streamIds) { - streams = streams + stream + "|"; - } - //Remove last | - streams = streams.slice(0, streams.length-1); - return streams; + return streamIds; + } + + private function getWebcamStreamsViewingForUser(userId: String): Array { + var streamIds: Array = LiveMeeting.inst().webcams.getStreamIdsIAmViewingForUser(userId); + return streamIds; } private function addUser(users: ArrayCollection, user: User2x):void { @@ -107,7 +110,8 @@ package org.bigbluebutton.modules.users.views buser.locked = user.locked; buser.emojiStatus = user.emoji; buser.presenter = user.presenter; - buser.streamName = getWebcamStreamsForUser(buser.userId); + buser.streams = getWebcamStreamsForUser(buser.userId); + buser.viewedStream = getWebcamStreamsViewingForUser(buser.userId); buser.inVoiceConf = false; @@ -131,7 +135,6 @@ package org.bigbluebutton.modules.users.views var user: User2x = UsersUtil.getUser(event.userID); if (user != null) { addUser(users, user); - trace("!!!!!!!!!!!!!!!********* " + user.name + " " + user.presenter + " ********!!!!!!!!"); users.refresh(); } } @@ -153,8 +156,6 @@ package org.bigbluebutton.modules.users.views } } - - public function handleUserJoinedVoiceConfEvent(userId: String):void { var webUser: BBBUser2x = findUser(userId); if (webUser != null) { @@ -258,6 +259,32 @@ package org.bigbluebutton.modules.users.views users.refresh(); } + + private function refreshWebcamStreamsInfo(userId: String): void { + var user: BBBUser2x = findUser(userId); + if (user != null) { + user.streams = getWebcamStreamsForUser(user.userId); + user.viewedStream = getWebcamStreamsViewingForUser(user.userId); + } + users.refresh(); + } + + public function handleStoppedViewingWebcamEvent(event: StoppedViewingWebcamEvent): void { + refreshWebcamStreamsInfo(event.webcamUserID); + } + + public function handleStartedViewingWebcamEvent(event: StartedViewingWebcamEvent): void { + refreshWebcamStreamsInfo(event.webcamUserID); + } + + public function handleStreamStartedEvent(event: StreamStartedEvent): void { + refreshWebcamStreamsInfo(event.userID); + } + + public function handleStreamStoppedEvent(event: StreamStoppedEvent): void { + refreshWebcamStreamsInfo(event.userId); + } + private function findUser(userId: String): BBBUser2x { for (var i: int = 0; i < users.length; i++) { var user: BBBUser2x = users[i] as BBBUser2x; diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/model/BBBUser2x.as b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/model/BBBUser2x.as index d3de4cd74327a90fe4e405f6632b02163114d1ce..974682316761f6149ace0eb1e5f362a6544082e8 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/model/BBBUser2x.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/model/BBBUser2x.as @@ -19,15 +19,17 @@ package org.bigbluebutton.modules.users.views.model { import com.asfusion.mate.events.Dispatcher; + import flash.events.Event; + import org.as3commons.lang.ArrayUtils; import org.as3commons.logging.api.ILogger; import org.as3commons.logging.api.getClassLogger; import org.bigbluebutton.common.Role; - import org.bigbluebutton.main.model.users.events.StreamStartedEvent; - import org.bigbluebutton.util.i18n.ResourceUtil; import org.bigbluebutton.main.model.users.Status; import org.bigbluebutton.main.model.users.StatusCollection; + import org.bigbluebutton.main.model.users.events.StreamStartedEvent; + import org.bigbluebutton.util.i18n.ResourceUtil; public class BBBUser2x { private static const LOGGER:ILogger = getClassLogger(BBBUser2x); @@ -48,7 +50,7 @@ package org.bigbluebutton.modules.users.views.model [Bindable] public function get hasStream():Boolean { - return streamNames.length > 0; + return _streamNames.length > 0; } public function set hasStream(s:Boolean):void { throw new Error("hasStream cannot be set. It is derived directly from streamName"); @@ -56,59 +58,37 @@ package org.bigbluebutton.modules.users.views.model [Bindable] private var _viewingStream:Array = new Array(); - [Bindable] - public function get viewingStream():Array { - return _viewingStream; - } - public function set viewingStream(v:Array):void { - throw new Error("Please use the helpers addViewingStream or removeViewingStream to handle viewingStream"); - } - public function addViewingStream(streamName:String):Boolean { - if (isViewingStream(streamName)) { - return false; - } - - _viewingStream.push(streamName); - return true; - } - public function removeViewingStream(streamName:String):Boolean { - if (!isViewingStream(streamName)) { - return false; - } - - _viewingStream = _viewingStream.filter(function(item:*, index:int, array:Array):Boolean { return item != streamName; }); - return true; - } - private function isViewingStream(streamName:String):Boolean { - return _viewingStream.some(function(item:*, index:int, array:Array):Boolean { return item == streamName; }); - } + public function isViewingAllStreams():Boolean { - return _viewingStream.length == streamNames.length; + return _viewingStream.length == _streamNames.length; } - [Bindable] public var streamNames:Array = new Array(); + public function set viewedStream(streamIds: Array): void { + if (streamIds != null) { + _viewingStream = streamIds; + } + } + + private var _streamNames:Array = new Array(); [Bindable] - public function get streamName():String { - var streams:String = ""; - for each(var stream:String in streamNames) { - streams = streams + stream + "|"; - } - //Remove last | - streams = streams.slice(0, streams.length-1); - return streams; + public function get streams():Array { + return _streamNames; } private function hasThisStream(streamName:String):Boolean { - return streamNames.some(function(item:*, index:int, array:Array):Boolean { return item == streamName; }); + for each(var streamId:String in _streamNames) { + if (streamId == streamName) return true; + } + return false; } - public function set streamName(streamNames:String):void { - if(streamNames) { - var streamNamesList:Array = streamNames.split("|"); - for each(var streamName:String in streamNamesList) { - sharedWebcam(streamName); - } + public function set streams(streamIds:Array):void { + if (streamIds != null) { + _streamNames = streamIds; +// for each(var streamId:String in _streamNames) { +// sharedWebcam(streamId); +// } } } @@ -242,19 +222,12 @@ package org.bigbluebutton.modules.users.views.model public function sharedWebcam(stream: String):void { if(stream && stream != "" && !hasThisStream(stream)) { - streamNames.push(stream); sendStreamStartedEvent(stream); } buildStatus(); verifyMedia(); } - public function unsharedWebcam(stream: String):void { - streamNames = streamNames.filter(function(item:*, index:int, array:Array):Boolean { return item != stream }); - buildStatus(); - verifyMedia(); - } - public function presenterStatusChanged(presenter: Boolean):void { this.presenter = presenter; buildStatus(); @@ -270,18 +243,6 @@ package org.bigbluebutton.modules.users.views.model case "presenter": presenter=(status.value.toString().toUpperCase() == "TRUE") ? true : false; break; - case "hasStream": - var streamInfo:Array=String(status.value).split(/,/); - /** - * Cannot use this statement as new Boolean(expression) - * return true if the expression is a non-empty string not - * when the string equals "true". See Boolean class def. - * - * hasStream = new Boolean(String(streamInfo[0])); - */ - var streamNameInfo:Array=String(streamInfo[1]).split(/=/); - streamName=streamNameInfo[1]; - break; // @FIXME : check the coming status from the server case "emojiStatus": emojiStatus = status.value.toString(); diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/business/TalkingButtonOverlay.as b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/business/TalkingButtonOverlay.as index e47248693fb9e1e77ffa7ca85e6201a5ea1e37e1..cc8cfda4e16af7b0e3168c20c8cc81f1c28fe2aa 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/business/TalkingButtonOverlay.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/business/TalkingButtonOverlay.as @@ -25,12 +25,8 @@ package org.bigbluebutton.modules.videoconf.business import mx.containers.HBox; import mx.controls.Button; - import org.bigbluebutton.common.Images; - public class TalkingButtonOverlay extends HBox { - private var images:Images = new Images(); - private var buttons:Dictionary = new Dictionary; private var BUTTONS_SIZE:int = 20; private var BUTTONS_PADDING:int = 10; diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/assets/Images.as b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/events/AddStaticComponent.as old mode 100755 new mode 100644 similarity index 52% rename from bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/assets/Images.as rename to bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/events/AddStaticComponent.as index 6e589c6e697007498969051b0e9342720574168d..ea16613198e811c051fa7ada2a2cc88dce3180c0 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/assets/Images.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/events/AddStaticComponent.as @@ -1,13 +1,13 @@ /** * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ -* +* * Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below). * * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free Software * Foundation; either version 3.0 of the License, or (at your option) any later * version. -* +* * BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. @@ -16,34 +16,26 @@ * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. * */ - -package org.bigbluebutton.modules.phone.views.assets +package org.bigbluebutton.modules.videoconf.events { - [Bindable] - public class Images - { - [Embed(source="images/headset.png")] - public var headsetDefaultIcon:Class; - - [Embed(source="images/headset_close.png")] - public var headsetInactiveIcon:Class; + import flash.events.Event; - [Embed(source="images/headset_open.png")] - public var headsetActiveIcon:Class; + import mx.core.IUIComponent; - [Embed(source="images/headset.png")] - public var listenOnlyDefaultIcon:Class; - - [Embed(source="images/headset_close.png")] - public var listenOnlyInactiveIcon:Class; - - [Embed(source="images/headset_open.png")] - public var listenOnlyActiveIcon:Class; - - [Embed(source="images/sound.png")] - public var speakerActiveIcon:Class; - - [Embed(source="images/sound_mute.png")] - public var speakerInactiveIcon:Class; + public class AddStaticComponent extends Event + { + public static const ADD_STATIC_COMPONENT:String = "ADD_STATIC_COMPONENT"; + private var _component:IUIComponent; + + public function AddStaticComponent(component:IUIComponent) + { + super(ADD_STATIC_COMPONENT, true, false); + this._component = component; + } + + public function get component():IUIComponent + { + return _component; + } } -} +} \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/maps/VideoEventMap.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/maps/VideoEventMap.mxml index 098cac6328cf128b881d3cf5f61991ad9f0c01fe..2ec35ab8d59c9119782235ea0431e54f523167b6 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/maps/VideoEventMap.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/maps/VideoEventMap.mxml @@ -32,6 +32,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. import org.bigbluebutton.main.model.users.events.StreamStartedEvent; import org.bigbluebutton.main.model.users.events.StreamStoppedEvent; import org.bigbluebutton.modules.users.events.ViewCameraEvent; + import org.bigbluebutton.modules.videoconf.events.AddStaticComponent; import org.bigbluebutton.modules.videoconf.events.ClosePublishWindowEvent; import org.bigbluebutton.modules.videoconf.events.ConnectedEvent; import org.bigbluebutton.modules.videoconf.events.ShareCameraRequestEvent; @@ -87,7 +88,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. <EventHandlers type="{StreamStartedEvent.STREAM_STARTED}"> <ObjectBuilder generator="{VideoEventMapDelegate}" cache="global" constructorArguments="{scope.dispatcher}"/> - <MethodInvoker generator="{VideoEventMapDelegate}" method="viewCamera" arguments="{[event.userID, event.stream, event.user]}" /> + <MethodInvoker generator="{VideoEventMapDelegate}" method="viewCamera" arguments="{[event.userID]}" /> </EventHandlers> <EventHandlers type="{StreamStoppedEvent.STREAM_STOPPED}"> @@ -95,7 +96,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. </EventHandlers> <EventHandlers type="{ViewCameraEvent.VIEW_CAMERA_EVENT}"> - <MethodInvoker generator="{VideoEventMapDelegate}" method="viewCamera" arguments="{[event.userID, event.stream, event.viewedName]}" /> + <MethodInvoker generator="{VideoEventMapDelegate}" method="viewCamera" arguments="{[event.userID]}" /> </EventHandlers> <EventHandlers type="{UserJoinedEvent.JOINED}"> @@ -137,6 +138,10 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. <EventHandlers type="{BBBEvent.RECONNECT_DISCONNECTED_EVENT}"> <MethodInvoker generator="{VideoEventMapDelegate}" method="handleReconnectDisconnectedEvent" arguments="{event}"/> </EventHandlers> + + <EventHandlers type="{AddStaticComponent.ADD_STATIC_COMPONENT}"> + <MethodInvoker generator="{VideoEventMapDelegate}" method="addStaticComponent" arguments="{[event.component]}" /> + </EventHandlers> <!-- ~~~~~~~~~~~~~~~~~~ INJECTORS ~~~~~~~~~~~~~~~~~~~~~~~~~~~ --> </fx:Declarations> </EventMap> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/maps/VideoEventMapDelegate.as b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/maps/VideoEventMapDelegate.as index 201c5e7ae11dc6da1e1d24be92f30a292ce82c32..c89884088298f35bfd06d0b903c63f199ddd8886 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/maps/VideoEventMapDelegate.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/maps/VideoEventMapDelegate.as @@ -25,6 +25,7 @@ package org.bigbluebutton.modules.videoconf.maps import mx.collections.ArrayCollection; import mx.collections.ArrayList; + import mx.core.IUIComponent; import org.as3commons.logging.api.ILogger; import org.as3commons.logging.api.getClassLogger; @@ -109,11 +110,14 @@ package org.bigbluebutton.modules.videoconf.maps _videoDock.addChild(_graphics); } - public function viewCamera(userID:String, stream:String, name:String, mock:Boolean = false):void { + public function addStaticComponent(component:IUIComponent):void { + _graphics.addStaticComponent(component); + } + + public function viewCamera(userID:String):void { LOGGER.debug("VideoEventMapDelegate:: [{0}] viewCamera. ready = [{1}]", [me, _ready]); if (!_ready) return; - LOGGER.debug("VideoEventMapDelegate:: [{0}] Viewing [{1} stream [{2}]", [me, userID, stream]); if (! UsersUtil.isMe(userID)) { openViewWindowFor(userID); } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/GraphicsWrapper.as b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/GraphicsWrapper.as index f50f4e696e5449cfa1458aa985fb3d8f9d38b774..a33847af36c47ad5b271b09b803de54c6ceb16c3 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/GraphicsWrapper.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/GraphicsWrapper.as @@ -3,8 +3,11 @@ package org.bigbluebutton.modules.videoconf.views import flash.display.DisplayObject; import flash.events.MouseEvent; import flash.net.NetConnection; + import flash.utils.setTimeout; import mx.containers.Canvas; + import mx.core.UIComponent; + import mx.core.IUIComponent; import mx.events.FlexEvent; import org.as3commons.logging.api.ILogger; @@ -308,6 +311,20 @@ package org.bigbluebutton.modules.videoconf.views super.addChild(graphic); } + public function addStaticComponent(component:IUIComponent):void { + component.addEventListener(MouseEvent.CLICK, onVBoxClick); + component.addEventListener(FlexEvent.REMOVE, onChildRemove); + + setTimeout(onChildAdd, 150, null); + setTimeout(onChildAdd, 4000, null); + + component.addEventListener(FlexEvent.CREATION_COMPLETE, function(event:FlexEvent):void { + onChildAdd(event); + }); + + super.addChild(component as DisplayObject); + } + private function onChildAdd(event:FlexEvent):void { _minContentAspectRatio = minContentAspectRatio(); invalidateDisplayList(); diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/ToolbarPopupButton.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/ToolbarPopupButton.mxml index 2429b56d3ec0cdee66e7955ba82bedb78309f4c9..bcfa0b19b9986c2e5dfa05bd93e524dc0d89089b 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/ToolbarPopupButton.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/ToolbarPopupButton.mxml @@ -25,7 +25,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. xmlns:mate="http://mate.asfusion.com/" click="openPublishWindow()" initialize="init()" - height="24" + height="30" toolTip="{_currentState == ON_STATE ? ResourceUtil.getInstance().getString('bbb.toolbar.video.toolTip.stop') : ResourceUtil.getInstance().getString('bbb.toolbar.video.toolTip.start')}" visible="false" enabled="true" @@ -218,7 +218,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. if(_currentState == ON_STATE) this.styleName = "webcamOffButtonStyle"; else - this.styleName = "webcamOnButtonStyle"; + this.styleName = "webcamOverButtonStyle"; this.selected = false; } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/UserAvatar.as b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/UserAvatar.as index 4a88651d8ddabd76ab4fb44fe65a5afa52a0c5df..65a6aa23e324cbbbfc01f5aa636af0956b5796b1 100644 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/UserAvatar.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/UserAvatar.as @@ -3,8 +3,6 @@ package org.bigbluebutton.modules.videoconf.views import flash.display.Loader; import flash.events.Event; import flash.net.URLRequest; - import mx.events.FlexEvent; - import mx.utils.ObjectUtil; public class UserAvatar extends UserGraphic { diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/UserGraphic.as b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/UserGraphic.as index 72e2c13133a71dffebeb7278839fbf50870f5680..d9e3e3372cdd49e2ff1bfa62a2108dc8f679d9c9 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/UserGraphic.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/UserGraphic.as @@ -3,7 +3,8 @@ package org.bigbluebutton.modules.videoconf.views import flash.display.DisplayObject; import mx.containers.Canvas; - import mx.core.UIComponent; + import mx.core.UIComponent; + import org.bigbluebutton.core.model.users.User2x; import org.bigbluebutton.modules.videoconf.model.VideoConfOptions; diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/UserGraphicHolder.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/UserGraphicHolder.mxml index 585257ffa11749a2b67880a90e02ffa3af0aaee7..9fa6ac57f4e214a243a6e9e229350588558829ca 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/UserGraphicHolder.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/UserGraphicHolder.mxml @@ -34,27 +34,33 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. <mate:Listener type="{PresenterStatusEvent.PRESENTER_NAME_CHANGE}" method="handlePresenterChangedEvent" /> <mate:Listener type="{BBBEvent.USER_VOICE_LEFT}" method="handleUserVoiceChangedEvent" /> <mate:Listener type="{BBBEvent.USER_VOICE_MUTED}" method="handleUserVoiceChangedEvent" /> + <mate:Listener type="{StoppedViewingWebcamEvent.STOPPED_VIEWING_WEBCAM}" method="handleStoppedViewingWebcamEvent" /> + <mate:Listener type="{UserJoinedEvent.JOINED}" method="handleUserJoinedEvent" /> </fx:Declarations> <fx:Script> <![CDATA[ - import com.asfusion.mate.events.Dispatcher; - - import org.bigbluebutton.common.Images; - import org.bigbluebutton.common.Role; - import org.bigbluebutton.core.EventConstants; - import org.bigbluebutton.core.Options; - import org.bigbluebutton.core.UsersUtil; - import org.bigbluebutton.core.events.CoreEvent; - import org.bigbluebutton.core.events.VoiceConfEvent; - import org.bigbluebutton.core.model.LiveMeeting; - import org.bigbluebutton.core.model.VideoProfile; - import org.bigbluebutton.core.model.users.User2x; - import org.bigbluebutton.core.model.users.VoiceUser2x; - import org.bigbluebutton.main.events.BBBEvent; - import org.bigbluebutton.main.events.PresenterStatusEvent; - import org.bigbluebutton.modules.videoconf.model.VideoConfOptions; - import org.bigbluebutton.util.i18n.ResourceUtil; + import com.asfusion.mate.events.Dispatcher; + + import mx.core.UIComponent; + + import org.bigbluebutton.common.Role; + import org.bigbluebutton.core.EventConstants; + import org.bigbluebutton.core.Options; + import org.bigbluebutton.core.UsersUtil; + import org.bigbluebutton.core.events.CoreEvent; + import org.bigbluebutton.core.events.VoiceConfEvent; + import org.bigbluebutton.core.model.LiveMeeting; + import org.bigbluebutton.core.model.VideoProfile; + import org.bigbluebutton.core.model.users.User2x; + import org.bigbluebutton.core.model.users.VoiceUser2x; + import org.bigbluebutton.main.events.BBBEvent; + import org.bigbluebutton.main.events.PresenterStatusEvent; + import org.bigbluebutton.main.events.StoppedViewingWebcamEvent; + import org.bigbluebutton.main.events.UserJoinedEvent; + import org.bigbluebutton.modules.videoconf.events.AddStaticComponent; + import org.bigbluebutton.modules.videoconf.model.VideoConfOptions; + import org.bigbluebutton.util.i18n.ResourceUtil; private var videoOptions:VideoConfOptions; @@ -67,13 +73,17 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. [Bindable] private var _me:Boolean = false; private var _dispatcher:Dispatcher = new Dispatcher(); - private var _images:Images = new Images(); private var _user:User2x = null; private var _streamName:String = ""; private var _userId:String = ""; private var _hideMuteBtnTimer:Timer; + private var _newParent:DisplayObjectContainer; + private var _oldParent:DisplayObjectContainer = null; + private var _oldW:Number = 100; + private var _oldH:Number = 100; + protected function init():void { _hideMuteBtnTimer = new Timer(500, 1); _hideMuteBtnTimer.addEventListener(TimerEvent.TIMER, onHideMuteBtnTimerComplete); @@ -81,7 +91,18 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. } protected function onCreationComplete():void { - closeBtn.tabIndex = videoOptions.baseTabIndex + 10; + // There must be a better way! + _newParent = parent.parent.parent.parent.parent; + fullScreenIcon.source = getStyle("iconFullScreen"); + closeIcon.source = getStyle("iconClose"); + } + + private function handleUserJoinedEvent(event:UserJoinedEvent):void { + // this is just to enforce the update of the BBBUser reference when the user reconnect + if (user && event.userID == user.intId) { + userId = event.userID; + setUserProperties(); + } } public function set userId(value:String):void { @@ -160,6 +181,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. } public function shutdown():void { + if (isFullscreen()) onFullscreen(); video.shutdown(); } @@ -245,26 +267,26 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. var userIconVisibility:Boolean; if (user.presenter) { - userIcon.source = _images.presenter_white; + userIcon.source = getStyle("iconPresenter"); userIconVisibility = true; } else { if (user.role == Role.MODERATOR) { - userIcon.source = _images.moderator_white; + userIcon.source = getStyle("iconModerator"); userIconVisibility = true; } else { userIconVisibility = false; } } - userIconWrapper.visible = userIconWrapper.includeInLayout = userIconVisibility; + userIcon.visible = userIcon.includeInLayout = userIconVisibility; } } private function updateTalkingStatus():void { var voiceUser: VoiceUser2x = LiveMeeting.inst().voiceUsers.getUser(user.intId); if (voiceUser != null && voiceUser.talking) { - titleBox.setStyle("styleName", "videoToolbarBackgroundTalkingStyle"); + titleBox.styleName = "videoToolbarBackgroundTalkingStyle"; } else { - titleBox.setStyle("styleName", "videoToolbarBackgroundNotTalkingStyle"); + titleBox.styleName = "videoToolbarBackgroundNotTalkingStyle"; } } @@ -289,7 +311,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. } private function onHideMuteBtnTimerComplete(event:TimerEvent):void { - muteBtnWrapper.visible = false; + muteBtn.visible = false; } private function setMuteBtnVisibility(visible:Boolean):void { @@ -307,7 +329,69 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. private function showMuteBtn():void { _hideMuteBtnTimer.reset(); - muteBtnWrapper.visible = true; + muteBtn.visible = true; + } + + // Fullscreen video isn't a child of this module's wrapper so it must listen to it's close event + private function handleStoppedViewingWebcamEvent(event:StoppedViewingWebcamEvent):void { + if (user) { + if (user.intId == event.webcamUserID && video.streamName == event.streamName) { + handleCloseFullscreenStream(); + } + } + } + + private function handleCloseFullscreenStream():void { + if (isFullscreen()) { + shutdown(); + } + } + + private function isFullscreen():Boolean { + return _oldParent != null; + } + + protected function onFullscreen(event:MouseEvent = null):void { + if (isFullscreen()) { + fullScreenIcon.source = getStyle("iconFullScreen"); + var evt:AddStaticComponent = new AddStaticComponent(this); + _dispatcher.dispatchEvent(evt); + + _oldParent = null; + this.visible = true; + this.includeInLayout = true; + this.width = _oldW; + this.height = _oldH; + + for(var i2:uint = 0; i2 < _newParent.numChildren; i2++) { + if(_newParent.getChildAt(i2) != this) { + _newParent.getChildAt(i2).visible = true; + (_newParent.getChildAt(i2) as UIComponent).includeInLayout = true; + } + } + } else { + fullScreenIcon.source = getStyle("iconExitFullScreen"); + _oldParent = this.parent; + _oldW = this.width; + _oldH = this.height; + + _newParent.addChildAt(this, 0); + + this.percentHeight = 100; + this.percentWidth = 100; + + for(var i1:uint = 0; i1< _newParent.numChildren; i1++) { + if(_newParent.getChildAt(i1) != this) { + _newParent.getChildAt(i1).visible = false; + (_newParent.getChildAt(i1) as UIComponent).includeInLayout = false; + } + } + } + + if (event != null) { + event.stopImmediatePropagation(); + event.stopPropagation(); + } } ]]> @@ -321,48 +405,36 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. <mx:Canvas id="canvas" width="100%" height="100%" horizontalScrollPolicy="off" verticalScrollPolicy="off" > <views:UserAvatar id="avatar" width="100%" height="100%" visible="false" includeInLayout="false" /> <views:UserVideo id="video" width="100%" height="100%" visible="false" includeInLayout="false" /> - <mx:VBox id="overlay" width="100%" height="100%" > - <mx:HBox - id="titleBox" + <mx:HBox + id="titleBox" + width="100%" + height="20" + verticalAlign="middle" + paddingRight="5" + paddingLeft="5" + styleName="videoToolbarBackgroundNotTalkingStyle" > + <mx:Image id="userIcon" visible="false" includeInLayout="false" /> + <mx:Label + text="{_username + (_me? ' (' + ResourceUtil.getInstance().getString('bbb.users.usersGrid.nameItemRenderer.youIdentifier') + ')' : '')}" + fontWeight="{_me ? 'bold' : 'normal'}" width="100%" - verticalAlign="middle" - paddingRight="0" paddingLeft="0" - styleName="videoToolbarBackgroundNotTalkingStyle" > - <mx:Box id="userIconWrapper" visible="false" includeInLayout="false" paddingLeft="3" paddingRight="0" > - <mx:Image id="userIcon" /> - </mx:Box> - <mx:Label - text="{_username + (_me? ' (' + ResourceUtil.getInstance().getString('bbb.users.usersGrid.nameItemRenderer.youIdentifier') + ')' : '')}" - fontWeight="{_me ? 'bold' : 'normal'}" - width="100%" - paddingLeft="0" - minWidth="0" - truncateToFit="true" - styleName="videoToolbarLabelStyle" /> - <mx:Box paddingRight="5"> - <mx:Button id="closeBtn" styleName="closeBtnFocus" buttonMode="true" click="shutdown()" - toolTip="{ResourceUtil.getInstance().getString('bbb.video.streamClose.toolTip', [_username])}" /> - </mx:Box> - </mx:HBox> - <mx:Box - width="100%" - paddingTop="15" - paddingRight="15" - horizontalAlign="right" > - <mx:Box - id="muteBtnWrapper" - visible="false" - hideEffect="{fadeOut}" showEffect="{fadeIn}" > - <mx:Button - id="muteBtn" - styleName="talkingOverlayBtn" - buttonMode="true" - click="onMuteBtnClick(event)" - mouseOver="onMuteBtnMouseOver()" - mouseOut="onMuteBtnMouseOut()" /> - </mx:Box> - </mx:Box> - </mx:VBox> + minWidth="0" + truncateToFit="true" + styleName="videoToolbarLabelStyle" /> + <mx:Image id="fullScreenIcon" buttonMode="true" click="onFullscreen(event)" /> + <mx:Image id="closeIcon" buttonMode="true" click="shutdown()" + toolTip="{ResourceUtil.getInstance().getString('bbb.video.streamClose.toolTip', [_username])}"/> + </mx:HBox> + <mx:Button + id="muteBtn" + hideEffect="{fadeOut}" showEffect="{fadeIn}" + visible="false" + buttonMode="true" + click="onMuteBtnClick(event)" + mouseOver="onMuteBtnMouseOver()" + mouseOut="onMuteBtnMouseOut()" + right="8" + bottom="8"/> </mx:Canvas> </mx:VBox> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/UserVideo.as b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/UserVideo.as index e39339c5a172e45e525515b0f637279b188283dd..535fe0e71b7970ebafdeb53401a1c35bf82cc481 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/UserVideo.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/UserVideo.as @@ -11,13 +11,15 @@ package org.bigbluebutton.modules.videoconf.views import org.as3commons.logging.api.ILogger; import org.as3commons.logging.api.getClassLogger; import org.bigbluebutton.core.BBB; - import org.bigbluebutton.core.model.VideoProfile; import org.bigbluebutton.core.UsersUtil; + import org.bigbluebutton.core.model.LiveMeeting; + import org.bigbluebutton.core.model.VideoProfile; import org.bigbluebutton.main.events.BBBEvent; + import org.bigbluebutton.main.events.StartedViewingWebcamEvent; import org.bigbluebutton.main.events.StoppedViewingWebcamEvent; import org.bigbluebutton.main.views.VideoWithWarnings; import org.bigbluebutton.modules.videoconf.events.StartBroadcastEvent; - import org.bigbluebutton.modules.videoconf.events.StopBroadcastEvent; + import org.bigbluebutton.modules.videoconf.events.StopBroadcastEvent; public class UserVideo extends UserGraphic { private static const LOGGER:ILogger = getClassLogger(UserVideo); @@ -125,13 +127,29 @@ package org.bigbluebutton.modules.videoconf.views } private function stopViewing():void { + // Store that I stopped viewing this streamId; + var myUserId: String = UsersUtil.getMyUserID(); + LiveMeeting.inst().webcams.stoppedViewingStream(myUserId, _streamName); + var stopEvent:StoppedViewingWebcamEvent = new StoppedViewingWebcamEvent(); stopEvent.webcamUserID = user.intId; stopEvent.streamName = _streamName; _dispatcher.dispatchEvent(stopEvent); - user.removeViewingStream(_streamName); + } + private function startedViewing():void { + // Store that I started viewing this streamId; + var myUserId: String = UsersUtil.getMyUserID(); + LiveMeeting.inst().webcams.startedViewingStream(myUserId, _streamName); + + var startEvent:StartedViewingWebcamEvent = new StartedViewingWebcamEvent(); + startEvent.webcamUserID = user.intId; + startEvent.streamName = _streamName; + _dispatcher.dispatchEvent(startEvent); + + } + private function stopPublishing():void { var e:StopBroadcastEvent = new StopBroadcastEvent(); e.stream = _streamName; @@ -183,7 +201,8 @@ package org.bigbluebutton.modules.videoconf.views _ns.play(streamName); - user.addViewingStream(streamName); + startedViewing(); + invalidateDisplayList(); } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/VideoDock.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/VideoDock.mxml index 4141ad6bd4a6066db9497c40a82ca86a51b7d3c2..54edf184a89be2b758e8cbe2dc9c84763624194d 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/VideoDock.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/VideoDock.mxml @@ -26,8 +26,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. horizontalScrollPolicy="off" verticalScrollPolicy="off" implements="org.bigbluebutton.common.IBbbModuleWindow" - xmlns:mate="http://mate.asfusion.com/" styleNameFocus="videoDockStyleFocus" - layout="absolute" visible="true" styleNameNoFocus="videoDockStyleNoFocus" + xmlns:mate="http://mate.asfusion.com/" + layout="absolute" visible="true" showCloseButton="false" horizontalAlign="center" verticalAlign="middle" @@ -131,6 +131,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. } private function onLayoutChanged(e:SwitchedLayoutEvent):void { + // FIXME : chceck dark layout is still working if(e.layoutID != "bbb.layout.name.videochat"){ setStyle("styleNameFocus", "videoDockStyleFocus"); setStyle("styleNameNoFocus", "videoDockStyleNoFocus"); @@ -178,4 +179,5 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. ]]> </fx:Script> -</CustomMdiWindow> \ No newline at end of file + +</CustomMdiWindow> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/PollResultObject.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/PollResultObject.as index 1fa629f8b71f40afc20aeb7e0abbf31afdb81a43..594856ddb8416d1896930be986d15ec1c2a59cdc 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/PollResultObject.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/PollResultObject.as @@ -316,8 +316,8 @@ package org.bigbluebutton.modules.whiteboard.business.shapes if (localizedKey == null || localizedKey == "" || localizedKey == "undefined") { localizedKey = ar.key; } - var rs:Object = {a: localizedKey, v: ar.num_votes as Number}; - LOGGER.debug("poll result a=[{0}] v=[{1}]", [ar.key, ar.num_votes]); + var rs:Object = {a: localizedKey, v: ar.numVotes}; + LOGGER.debug("poll result a=[{0}] v=[{1}]", [ar.key, ar.numVotes]); ans.push(rs); } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardCanvas.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardCanvas.as index 644e03c03ecf599837101d500d66c9e66057e23e..477a6fa2baeeea81bf44fbeda0a4faa4d83bd366 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardCanvas.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardCanvas.as @@ -30,16 +30,12 @@ package org.bigbluebutton.modules.whiteboard.views { import mx.containers.Canvas; import mx.managers.CursorManager; - import org.bigbluebutton.common.Images; import org.bigbluebutton.core.UsersUtil; import org.bigbluebutton.main.events.MadePresenterEvent; import org.bigbluebutton.main.events.UserLeftEvent; import org.bigbluebutton.modules.whiteboard.WhiteboardCanvasDisplayModel; import org.bigbluebutton.modules.whiteboard.WhiteboardCanvasModel; - import org.bigbluebutton.modules.whiteboard.business.shapes.DrawObject; import org.bigbluebutton.modules.whiteboard.business.shapes.TextObject; - import org.bigbluebutton.modules.whiteboard.commands.GetWhiteboardAccessCommand; - import org.bigbluebutton.modules.whiteboard.commands.GetWhiteboardShapesCommand; import org.bigbluebutton.modules.whiteboard.events.WhiteboardAccessEvent; import org.bigbluebutton.modules.whiteboard.events.WhiteboardButtonEvent; import org.bigbluebutton.modules.whiteboard.events.WhiteboardCursorEvent; @@ -58,13 +54,6 @@ package org.bigbluebutton.modules.whiteboard.views { private var graphicObjectHolder:Canvas = new Canvas(); private var cursorObjectHolder:Canvas = new Canvas(); - private var images:Images = new Images(); - [Bindable] private var pencil_icon:Class = images.pencil_icon; - [Bindable] private var rectangle_icon:Class = images.square_icon; - [Bindable] private var triangle_icon:Class = images.triangle_icon; - [Bindable] private var ellipse_icon:Class = images.circle_icon; - [Bindable] private var line_icon:Class = images.line_icon; - [Bindable] private var text_icon:Class = images.text_icon; private var toolType:String = AnnotationType.PENCIL; private var whiteboardEnabled:Boolean = false; private var currentWhiteboardId:String; @@ -232,17 +221,17 @@ package org.bigbluebutton.modules.whiteboard.views { private function setCursor(toolType:String):void { if(toolType == AnnotationType.ELLIPSE) { - CursorManager.setCursor(ellipse_icon); + CursorManager.setCursor(getStyle("iconEllipse")); } else if(toolType == AnnotationType.RECTANGLE) { - CursorManager.setCursor(rectangle_icon); + CursorManager.setCursor(getStyle("iconRectangle")); } else if(toolType == AnnotationType.TRIANGLE) { - CursorManager.setCursor(triangle_icon); + CursorManager.setCursor(getStyle("iconTriangle")); } else if(toolType == AnnotationType.PENCIL) { - CursorManager.setCursor(pencil_icon, 2, -2, -22); + CursorManager.setCursor(getStyle("iconPencil")); } else if(toolType == AnnotationType.LINE) { - CursorManager.setCursor(line_icon); + CursorManager.setCursor(getStyle("iconLine")); } else if(toolType == AnnotationType.TEXT) { - CursorManager.setCursor(text_icon); + CursorManager.setCursor(getStyle("iconText")); } } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardToolbar.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardToolbar.mxml index 7168d0f04d3f40a0180d156fadd325b3281e3182..84c8f695dcb0c6078e9919ce81b9a1c5dc7aac9d 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardToolbar.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardToolbar.mxml @@ -26,11 +26,10 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. xmlns:view="org.bigbluebutton.modules.whiteboard.views.*" xmlns:wbBtns="org.bigbluebutton.modules.whiteboard.views.buttons.*" xmlns:common="org.bigbluebutton.common.*" - xmlns:mate="http://mate.asfusion.com/" + xmlns:mate="http://mate.asfusion.com/" creationComplete="onCreationComplete()" visible="{showWhiteboardToolbar}" includeInLayout="{showWhiteboardToolbar}" - styleName="whiteboardToolbarStyle" hideEffect="{fadeOut}" showEffect="{fadeIn}" xmlns:s="library://ns.adobe.com/flex/spark"> <fx:Declarations> @@ -41,25 +40,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. <mate:Listener type="{ChangeMyRole.CHANGE_MY_ROLE_EVENT}" method="refreshRole" /> </fx:Declarations> - <fx:Style> - .colorPickerStyle { - backgroundColor:#E5E6E7; - columnCount:13; - horizontalGap:0; - previewHeight:22; - previewWidth:50; - swatchGridBackgroundColor:#000000; - swatchGridBorderSize:0; - swatchHeight:60; - swatchHighlightColor:#FFFFFF; - swatchHighlightSize:1; - swatchWidth:12; - textFieldWidth:72; - verticalGap:0; - } - - </fx:Style> - <fx:Script> <![CDATA[ import com.asfusion.mate.core.GlobalDispatcher; @@ -71,13 +51,11 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. import org.as3commons.logging.api.ILogger; import org.as3commons.logging.api.getClassLogger; - import org.bigbluebutton.common.Images; import org.bigbluebutton.core.Options; import org.bigbluebutton.core.UsersUtil; import org.bigbluebutton.main.events.MadePresenterEvent; import org.bigbluebutton.main.events.ShortcutEvent; import org.bigbluebutton.main.model.users.events.ChangeMyRole; - import org.bigbluebutton.modules.present.events.DisplaySlideEvent; import org.bigbluebutton.modules.whiteboard.business.shapes.WhiteboardConstants; import org.bigbluebutton.modules.whiteboard.events.StopWhiteboardModuleEvent; import org.bigbluebutton.modules.whiteboard.events.WhiteboardAccessEvent; @@ -85,10 +63,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. import org.bigbluebutton.modules.whiteboard.views.models.WhiteboardOptions; import org.bigbluebutton.util.i18n.ResourceUtil; - private var images:Images = new Images(); - [Bindable] private var thick_icon:Class = images.whiteboard_thick; - [Bindable] private var thin_icon:Class = images.whiteboard_thin; - [Bindable] public var wbOptions:WhiteboardOptions; [Bindable] private var showWhiteboardToolbar:Boolean = false; @@ -119,45 +93,45 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. setToolType(e.graphicType, e.toolType); } - private function setToolType(graphicType:String, toolType:String):void { - if (graphicType == WhiteboardConstants.TYPE_CLEAR) { - canvas.sendClearToServer(); - } else if (graphicType == WhiteboardConstants.TYPE_UNDO) { - sendUndoCommand(); - } else { - canvas.setGraphicType(graphicType); - canvas.setTool(toolType); - - if (panzoomBtn != null) { - panzoomBtn.setTool(graphicType, toolType); - } - - if (scribbleBtn != null) { - scribbleBtn.setTool(graphicType, toolType); - } - - if (rectangleBtn != null) { - rectangleBtn.setTool(graphicType, toolType); - } - - if (circleBtn != null) { - circleBtn.setTool(graphicType, toolType); - } - - if (triangleBtn != null) { - triangleBtn.setTool(graphicType, toolType); - } - - if (lineBtn != null) { - lineBtn.setTool(graphicType, toolType); - } - - if (textBtn != null) { - textBtn.setTool(graphicType, toolType); - } - } - } - + private function setToolType(graphicType:String, toolType:String):void { + if (graphicType == WhiteboardConstants.TYPE_CLEAR) { + canvas.sendClearToServer(); + } else if (graphicType == WhiteboardConstants.TYPE_UNDO) { + sendUndoCommand(); + } else { + canvas.setGraphicType(graphicType); + canvas.setTool(toolType); + + if (panzoomBtn != null) { + panzoomBtn.setTool(graphicType, toolType); + } + + if (scribbleBtn != null) { + scribbleBtn.setTool(graphicType, toolType); + } + + if (rectangleBtn != null) { + rectangleBtn.setTool(graphicType, toolType); + } + + if (circleBtn != null) { + circleBtn.setTool(graphicType, toolType); + } + + if (triangleBtn != null) { + triangleBtn.setTool(graphicType, toolType); + } + + if (lineBtn != null) { + lineBtn.setTool(graphicType, toolType); + } + + if (textBtn != null) { + textBtn.setTool(graphicType, toolType); + } + } + } + protected function changeColor(e:Event):void { canvas.changeColor(e); } @@ -312,20 +286,15 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. tool itself (ex. line tool vs triangle tool, even though both are "shapes") --> <wbBtns:PanZoomButton id="panzoomBtn"/> - <mx:Spacer height="10"/> <wbBtns:ScribbleButton id="scribbleBtn"/> <wbBtns:RectangleButton id="rectangleBtn"/> <wbBtns:CircleButton id="circleBtn"/> <wbBtns:TriangleButton id="triangleBtn"/> <wbBtns:LineButton id="lineBtn"/> <wbBtns:TextButton id="textBtn"/> - - <mx:Spacer height="5"/> <wbBtns:ClearButton id="clearBtn"/> <wbBtns:UndoButton id="undoBtn"/> - <mx:Spacer height="5"/> - <!-- Properties that were removed from original color picker: @@ -343,12 +312,12 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. accessibilityName="{ResourceUtil.getInstance().getString('bbb.highlighter.toolbar.color')}"/> <mx:Spacer height="3"/> - <mx:Image source="{thick_icon}" horizontalAlign="center" width="30"/> + <mx:Image source="{getStyle('iconWhiteboardThick')}" horizontalAlign="center" width="30"/> <mx:VSlider height="50" id="sld" change="changeThickness(event)" toolTip="{ResourceUtil.getInstance().getString('bbb.highlighter.toolbar.thickness.accessibilityName')}" minimum="1" maximum="30" useHandCursor="true" value="2" showDataTip="true" snapInterval="1" dataTipOffset="0" labelOffset="0" accessibilityName="{ResourceUtil.getInstance().getString('bbb.highlighter.toolbar.thickness.accessibilityName')}" /> - <mx:Image source="{thin_icon}" horizontalAlign="center" width="30"/> + <mx:Image source="{getStyle('iconWhiteboardThin')}" horizontalAlign="center" width="30"/> <mx:Button id="multiUserBtn" click="changeMultiUser()" width="30" height="30" styleName="{multiUser ? 'multiUserWhiteboardOnButtonStyle' : 'multiUserWhiteboardOffButtonStyle'}"/> </mx:VBox> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/buttons/CircleButton.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/buttons/CircleButton.mxml index b63dec480eeafd483dab9e3caa9c4302e8b80b07..c71ea116a1fd1b776a7d49c6a2ffdd7b6dcf4367 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/buttons/CircleButton.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/buttons/CircleButton.mxml @@ -20,7 +20,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. --> <mx:Button xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:fx="http://ns.adobe.com/mxml/2009" - width="30" height="30" + width="40" height="40" click="onClick()" styleName="whiteboardCircleButtonStyle" toolTip="{ResourceUtil.getInstance().getString('bbb.highlighter.toolbar.ellipse')}" toggle="true" diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/buttons/ClearButton.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/buttons/ClearButton.mxml index ce2dbe379bd660a790bc4060387cc2a4e73dd61d..7efc02eef6665b18962abc008fcd8866afc1572c 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/buttons/ClearButton.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/buttons/ClearButton.mxml @@ -20,7 +20,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. --> <mx:Button xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:fx="http://ns.adobe.com/mxml/2009" - width="30" height="30" + width="40" height="40" click="onClick()" styleName="whiteboardClearButtonStyle" toolTip="{ResourceUtil.getInstance().getString('bbb.highlighter.toolbar.clear')}" accessibilityName="{ResourceUtil.getInstance().getString('bbb.highlighter.toolbar.clear.accessibilityName')}"> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/buttons/LineButton.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/buttons/LineButton.mxml index ea8b5ec6e29a69d7f450fa8d33e92611daf82d14..e3e4898a1ba12fe077f05bd7716d2754b3bfe314 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/buttons/LineButton.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/buttons/LineButton.mxml @@ -20,7 +20,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. --> <mx:Button xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:fx="http://ns.adobe.com/mxml/2009" - width="30" height="30" + width="40" height="40" click="onClick()" styleName="whiteboardLineButtonStyle" toolTip="{ResourceUtil.getInstance().getString('ltbcustom.bbb.highlighter.toolbar.line')}" toggle="true" accessibilityName="{ResourceUtil.getInstance().getString('ltbcustom.bbb.highlighter.toolbar.line.accessibilityName')}"> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/buttons/PanZoomButton.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/buttons/PanZoomButton.mxml index edcca5024505b3098affb84e129fc2781c556519..e44194549061a47cb1a4ddf25f85292e85bda239 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/buttons/PanZoomButton.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/buttons/PanZoomButton.mxml @@ -20,7 +20,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. --> <mx:Button xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:fx="http://ns.adobe.com/mxml/2009" - width="30" height="30" + width="40" height="40" click="onClick()" styleName="whiteboardPanZoomButtonStyle" toolTip="{ResourceUtil.getInstance().getString('bbb.highlighter.toolbar.panzoom')}" toggle="true" accessibilityName="{ResourceUtil.getInstance().getString('bbb.highlighter.toolbar.panzoom.accessibilityName')}"> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/buttons/RectangleButton.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/buttons/RectangleButton.mxml index 56dff134586dab39c96320137cd29f417e91b51b..6c6c1ce3f57a23a0a7c00a2986ea936d84f43763 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/buttons/RectangleButton.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/buttons/RectangleButton.mxml @@ -20,7 +20,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. --> <mx:Button xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:fx="http://ns.adobe.com/mxml/2009" - width="30" height="30" + width="40" height="40" click="onClick()" styleName="whiteboardRectangleButtonStyle" toolTip="{ResourceUtil.getInstance().getString('bbb.highlighter.toolbar.rectangle')}" toggle="true" accessibilityName="{ResourceUtil.getInstance().getString('bbb.highlighter.toolbar.rectangle.accessibilityName')}"> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/buttons/ScribbleButton.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/buttons/ScribbleButton.mxml index a2142cd8edf990a215fa8ef3d4833701602ee1ba..22e6d3d044c52b9d601d15ae49461e11e05e17e4 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/buttons/ScribbleButton.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/buttons/ScribbleButton.mxml @@ -20,7 +20,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. --> <mx:Button xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:fx="http://ns.adobe.com/mxml/2009" - width="30" height="30" + width="40" height="40" click="onClick()" styleName="whiteboardScribbleButtonStyle" toolTip="{ResourceUtil.getInstance().getString('bbb.highlighter.toolbar.pencil')}" toggle="true" selected="true" diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/buttons/TextButton.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/buttons/TextButton.mxml index 42447b76e9704f0f1c2f628395fee4bf8616907f..deace676b571ca94c6c31a3aaaf8e5f7587a2946 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/buttons/TextButton.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/buttons/TextButton.mxml @@ -20,7 +20,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. --> <mx:Button xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:fx="http://ns.adobe.com/mxml/2009" - width="30" height="30" + width="40" height="40" click="onClick()" styleName="whiteboardTextButtonStyle" toolTip="{ResourceUtil.getInstance().getString('ltbcustom.bbb.highlighter.toolbar.text')}" toggle="true" accessibilityName="{ResourceUtil.getInstance().getString('ltbcustom.bbb.highlighter.toolbar.text.accessibilityName')}"> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/buttons/TriangleButton.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/buttons/TriangleButton.mxml index 9a408920ba434459466fd7d935b60c92e65addef..623b879ab8be8be50679f10ad69f782c8ba22789 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/buttons/TriangleButton.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/buttons/TriangleButton.mxml @@ -20,7 +20,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. --> <mx:Button xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:fx="http://ns.adobe.com/mxml/2009" - width="30" height="30" + width="40" height="40" click="onClick()" styleName="whiteboardTriangleButtonStyle" toolTip="{ResourceUtil.getInstance().getString('ltbcustom.bbb.highlighter.toolbar.triangle')}" toggle="true" diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/buttons/UndoButton.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/buttons/UndoButton.mxml index 44b795ab30326b05f6257f1dcdebd0eb0e61fb8e..7a00823f456017233a86d306da45e40d60ceb061 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/buttons/UndoButton.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/buttons/UndoButton.mxml @@ -20,7 +20,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. --> <mx:Button xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:fx="http://ns.adobe.com/mxml/2009" - width="30" height="30" + width="40" height="40" click="onClick()" styleName="whiteboardUndoButtonStyle" toolTip="{ResourceUtil.getInstance().getString('bbb.highlighter.toolbar.undo')}" accessibilityName="{ResourceUtil.getInstance().getString('bbb.highlighter.toolbar.undo.accessibilityName')}"> diff --git a/bigbluebutton-config/bin/bbb-conf b/bigbluebutton-config/bin/bbb-conf index 953eec1cf0906e0288a34b129acd9992631fd0d0..22eb8bd8899cb6102d24ccb8ffd20fc68f00fbe1 100755 --- a/bigbluebutton-config/bin/bbb-conf +++ b/bigbluebutton-config/bin/bbb-conf @@ -292,7 +292,7 @@ stop_bigbluebutton () { if [ -f /usr/lib/systemd/system/bbb-webhooks.service ]; then WEBHOOKS=bbb-webhooks fi - systemctl stop red5 tomcat7 nginx freeswitch redis-server bbb-apps-akka bbb-fsesl-akka bbb-rap-archive-worker.service bbb-rap-process-worker.service bbb-rap-publish-worker.service bbb-rap-sanity-worker.service bbb-record-core.timer $HTML5 $WEBHOOKS + systemctl stop red5 tomcat7 nginx freeswitch redis-server bbb-apps-akka bbb-transcode-akka bbb-fsesl-akka bbb-rap-archive-worker.service bbb-rap-process-worker.service bbb-rap-publish-worker.service bbb-rap-sanity-worker.service bbb-record-core.timer $HTML5 $WEBHOOKS else /etc/init.d/monit stop @@ -325,6 +325,13 @@ stop_bigbluebutton () { if [ -f /etc/init.d/bbb-fsesl-akka ]; then /etc/init.d/bbb-fsesl-akka stop fi + + if [ -f /etc/init/bbb-transcode-akka.conf ]; then + service bbb-transcode-akka stop + fi + if [ -f /etc/init.d/bbb-transcode-akka ]; then + /etc/init.d/bbb-transcode-akka stop + fi fi } @@ -337,7 +344,7 @@ start_bigbluebutton () { if [ -f /usr/lib/systemd/system/bbb-webhooks.service ]; then WEBHOOKS=bbb-webhooks fi - systemctl start red5 tomcat7 nginx freeswitch redis-server bbb-apps-akka bbb-fsesl-akka bbb-record-core.timer $HTML5 $WEBHOOKS + systemctl start red5 tomcat7 nginx freeswitch redis-server bbb-apps-akka bbb-transcode-akka bbb-fsesl-akka bbb-record-core.timer $HTML5 $WEBHOOKS else $FREESWITCH_INIT_D start @@ -391,6 +398,13 @@ start_bigbluebutton () { /etc/init.d/bbb-fsesl-akka start fi + if [ -f /etc/init/bbb-transcode-akka.conf ]; then + service bbb-transcode-akka start + fi + if [ -f /etc/init.d/bbb-transcode-akka ]; then + /etc/init.d/bbb-transcode-akka start + fi + # # At this point the red5 and servlet container applications are starting up. @@ -453,7 +467,7 @@ start_bigbluebutton () { display_bigbluebutton_status () { if command -v systemctl >/dev/null; then - units="start red5 tomcat7 nginx freeswitch redis-server libreoffice bbb-apps-akka bbb-fsesl-akka" + units="start red5 tomcat7 nginx freeswitch redis-server libreoffice bbb-apps-akka bbb-transcode-akka bbb-fsesl-akka" for unit in $units; do echo "$unit: $(systemctl is-active $unit)" done @@ -1576,6 +1590,7 @@ if [ $ZIP ]; then tar rfh /tmp/$LOG_FILE.tar $SERVLET_LOGS > /dev/null 2>&1 tar rf /tmp/$LOG_FILE.tar /var/log/bigbluebutton/* > /dev/null 2>&1 tar rf /tmp/$LOG_FILE.tar /var/log/bbb-apps-akka > /dev/null 2>&1 + tar rf /tmp/$LOG_FILE.tar /var/log/bbb-transcode-akka > /dev/null 2>&1 tar rf /tmp/$LOG_FILE.tar /var/log/bbb-fsesl-akka > /dev/null 2>&1 tar rf /tmp/$LOG_FILE.tar /var/log/nginx/error.log > /dev/null 2>&1 if [ $DISTRIB_ID == "ubuntu" ]; then @@ -1877,6 +1892,10 @@ if [ $CLEAN ]; then rm -f /var/log/bbb-apps-akka/* fi + if [ -d /var/log/bbb-transcode-akka ]; then + rm -f /var/log/bbb-transcode-akka/* + fi + start_bigbluebutton check_state fi diff --git a/bigbluebutton-config/web/index.html b/bigbluebutton-config/web/index.html index 9080f6c93cee5bfbf7bbfff195dff6bd5ba3add2..b60d622dc31def623855743a07faa3b94c3a5995 100644 --- a/bigbluebutton-config/web/index.html +++ b/bigbluebutton-config/web/index.html @@ -262,7 +262,7 @@ <div class="row"> <div class="span twelve center"> <p>Copyright © 2017 BigBlueButton Inc.<br> - <small>Version <a href="http://docs.bigbluebutton.org/">1.1.0</a></small> + <small>Version <a href="http://docs.bigbluebutton.org/">2.0-dev</a></small> </p> </div> </div> diff --git a/bigbluebutton-html5/client/stylesheets/toggleSwitch.css b/bigbluebutton-html5/client/stylesheets/toggleSwitch.css index 3a869076233a1070187f5e11b10a7d161e4de139..97b3e600f6f8d28529bb32d5d7eb9f0b63ea6679 100644 --- a/bigbluebutton-html5/client/stylesheets/toggleSwitch.css +++ b/bigbluebutton-html5/client/stylesheets/toggleSwitch.css @@ -41,14 +41,14 @@ height: 1.5rem; padding: 0; border-radius: 2rem; - background-color: #B7E5DA; + background-color: #4E5A66; -webkit-transition: all 0.2s ease; -moz-transition: all 0.2s ease; transition: all 0.2s ease; } .react-toggle--checked .react-toggle-track { - background-color: #4DC0A2; + background-color: #4E5A66; } .react-toggle-track-check { @@ -119,13 +119,13 @@ } .react-toggle--focus .react-toggle-thumb { - -webkit-box-shadow: 0px 0px 3px 2px #53bdee; - -moz-box-shadow: 0px 0px 3px 2px #53bdee; - box-shadow: 0px 0px 2px 3px #53bdee; + -webkit-box-shadow: 0px 0px 3px 2px #0F70D7; + -moz-box-shadow: 0px 0px 3px 2px #0F70D7; + box-shadow: 0px 0px 2px 3px #0F70D7; } .react-toggle:active:not(.react-toggle--disabled) .react-toggle-thumb { - -webkit-box-shadow: 0px 0px 5px 5px #53bdee; - -moz-box-shadow: 0px 0px 5px 5px #53bdee; - box-shadow: 0px 0px 5px 5px #53bdee; + -webkit-box-shadow: 0px 0px 5px 5px #0F70D7; + -moz-box-shadow: 0px 0px 5px 5px #0F70D7; + box-shadow: 0px 0px 5px 5px #0F70D7; } diff --git a/bigbluebutton-html5/imports/api/1.1/audio/client/bridge/sip.js b/bigbluebutton-html5/imports/api/1.1/audio/client/bridge/sip.js index ad3e42d9f47abb6fe9a93dddbc86909e61803389..c01d378aff7c1e2907e778b3e00d475382feca7c 100644 --- a/bigbluebutton-html5/imports/api/1.1/audio/client/bridge/sip.js +++ b/bigbluebutton-html5/imports/api/1.1/audio/client/bridge/sip.js @@ -13,18 +13,18 @@ export default class SIPBridge extends BaseAudioBridge { this.userData = userData; } - joinListenOnly() { + joinListenOnly(stunServers, turnServers) { makeCall('listenOnlyToggle', true); - this._joinVoiceCallSIP({ isListenOnly: true }); + this._joinVoiceCallSIP({ isListenOnly: true, stunServers, turnServers }); } - joinMicrophone() { - this._joinVoiceCallSIP({ isListenOnly: false }); + joinMicrophone(stunServers, turnServers) { + this._joinVoiceCallSIP({ isListenOnly: false, stunServers, turnServers }); } // Periodically check the status of the WebRTC call, when a call has been established attempt to // hangup, retry if a call is in progress, send the leave voice conference message to BBB - exitAudio(isListenOnly, afterExitCall = () => {}) { + exitAudio(isListenOnly, afterExitCall = () => { }) { // To be called when the hangup is confirmed const hangupCallback = function () { console.log(`Exited Voice Conference, listenOnly=${isListenOnly}`); @@ -40,7 +40,7 @@ export default class SIPBridge extends BaseAudioBridge { triedHangup = false; // function to initiate call - const checkToHangupCall = ((context, afterExitCall = () => {}) => { + const checkToHangupCall = ((context, afterExitCall = () => { }) => { // if an attempt to hang up the call is made when the current session is not yet finished, // the request has no effect keep track in the session if we haven't tried a hangup if (window.getCallStatus() != null && !triedHangup) { @@ -96,8 +96,8 @@ export default class SIPBridge extends BaseAudioBridge { }; const stunsAndTurns = { - stun: this.userData.stuns, - turn: this.userData.turns, + stun: options.stunServers, + turn: options.turnServers, }; callIntoConference(extension, (audio) => { diff --git a/bigbluebutton-html5/imports/api/1.1/audio/client/manager/index.js b/bigbluebutton-html5/imports/api/1.1/audio/client/manager/index.js index 8092a0931503676d1d658f988c937200984c602e..62033062abb93c795f872fbcb691a5d3521edd12 100644 --- a/bigbluebutton-html5/imports/api/1.1/audio/client/manager/index.js +++ b/bigbluebutton-html5/imports/api/1.1/audio/client/manager/index.js @@ -1,3 +1,4 @@ +import Auth from '/imports/ui/services/auth'; import BaseAudioBridge from '../bridge/base'; import VertoBridge from '../bridge/verto'; import SIPBridge from '../bridge/sip'; @@ -24,12 +25,42 @@ export default class AudioManager { } joinAudio(listenOnly) { - if (listenOnly || this.microphoneLockEnforced) { - this.isListenOnly = true; - this.bridge.joinListenOnly(); - } else { - this.bridge.joinMicrophone(); - } + AudioManager.fetchServers().then(({ error, stunServers, turnServers }) => { + if (error) { + //We need to alert the user about this problem by some gui message. + console.error("Couldn't fetch the stuns/turns servers!"); + return; + } + + if (listenOnly || this.microphoneLockEnforced) { + this.isListenOnly = true; + this.bridge.joinListenOnly(stunServers, turnServers); + } else { + this.bridge.joinMicrophone(stunServers, turnServers); + } + }); + } + + // We use on the SIP an String Array, while in the server, it comes as + // an Array of objects, we need to map from Array<Object> to Array<String> + static mapToArray({ response, stunServers, turnServers }) { + const promise = new Promise((resolve) => { + if (response) { + resolve({ error: 404, stunServers: [], turnServers: [] }); + } + resolve({ + stunServers: stunServers.map(server => server.url), + turnServers: turnServers.map(server => server.url), + }); + }); + return promise; } + static fetchServers() { + const url = `/bigbluebutton/api/stuns?sessionToken=${Auth.sessionToken}`; + + return fetch(url) + .then(response => response.json()) + .then(json => AudioManager.mapToArray(json)); + } } diff --git a/bigbluebutton-html5/imports/api/1.1/polls/server/methods.js b/bigbluebutton-html5/imports/api/1.1/polls/server/methods.js index 388036fd5d2146b4aee3e8e08efad840e7d52b79..eb43752a9e5fc548885b4bfbd602894b5e61baf6 100644 --- a/bigbluebutton-html5/imports/api/1.1/polls/server/methods.js +++ b/bigbluebutton-html5/imports/api/1.1/polls/server/methods.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; -import publishVote from './methods/publishVote'; +import publishVote1x from './methods/publishVote'; import mapToAcl from '/imports/startup/mapToAcl'; Meteor.methods(mapToAcl(['methods.publishVote'], { - publishVote, + publishVote1x, })); diff --git a/bigbluebutton-html5/imports/api/1.1/users/server/methods/userLeaving.js b/bigbluebutton-html5/imports/api/1.1/users/server/methods/userLeaving.js index cb2dc8f56d3470ce90c1a92fbfd7004fc4b632ac..9ce7584fccb472ef5a255668facddd0bbbee9939 100755 --- a/bigbluebutton-html5/imports/api/1.1/users/server/methods/userLeaving.js +++ b/bigbluebutton-html5/imports/api/1.1/users/server/methods/userLeaving.js @@ -3,8 +3,7 @@ import { check } from 'meteor/check'; import RedisPubSub from '/imports/startup/server/redis'; import Logger from '/imports/startup/server/logger'; import Users from '/imports/api/1.1/users'; - -import setConnectionStatus from '../modifiers/setConnectionStatus'; +import Meetings from '/imports/api/1.1/meetings'; import listenOnlyToggle from './listenOnlyToggle'; const OFFLINE_CONNECTION_STATUS = 'offline'; @@ -26,13 +25,19 @@ export default function userLeaving(credentials, userId) { }; const User = Users.findOne(selector); + const Meeting = Meetings.findOne({ meetingId }); + + if (!Meeting) { + return null; + } + if (!User) { throw new Meteor.Error( 'user-not-found', `Could not find ${userId} in ${meetingId}: cannot complete userLeaving`); } if (User.user.connection_status === OFFLINE_CONNECTION_STATUS) { - return; + return null; } if (User.user.listenOnly) { @@ -46,14 +51,12 @@ export default function userLeaving(credentials, userId) { }, }; - const cb = (err, numChanged) => { + const cb = (err) => { if (err) { return Logger.error(`Invalidating user: ${err}`); } - if (numChanged) { - return Logger.info(`Invalidate user=${userId} meeting=${meetingId}`); - } + return Logger.info(`Invalidate user=${userId} meeting=${meetingId}`); }; Users.update(selector, modifier, cb); diff --git a/bigbluebutton-html5/imports/api/1.1/users/server/publishers.js b/bigbluebutton-html5/imports/api/1.1/users/server/publishers.js old mode 100644 new mode 100755 diff --git a/bigbluebutton-html5/imports/api/2.0/captions/index.js b/bigbluebutton-html5/imports/api/2.0/captions/index.js new file mode 100644 index 0000000000000000000000000000000000000000..e63f6a9f3ac56b695dfa81ecae1eb6da4acd8c32 --- /dev/null +++ b/bigbluebutton-html5/imports/api/2.0/captions/index.js @@ -0,0 +1 @@ +export default new Mongo.Collection('captions2x'); diff --git a/bigbluebutton-html5/imports/api/2.0/captions/server/eventHandlers.js b/bigbluebutton-html5/imports/api/2.0/captions/server/eventHandlers.js new file mode 100644 index 0000000000000000000000000000000000000000..fabeac9ce2932eb1b459b5e32f6f35aa87d917ed --- /dev/null +++ b/bigbluebutton-html5/imports/api/2.0/captions/server/eventHandlers.js @@ -0,0 +1,9 @@ +import RedisPubSub from '/imports/startup/server/redis2x'; +import handleCaptionHistory from './handlers/captionHistory'; +import handleCaptionUpdate from './handlers/captionUpdate'; +import handleCaptionOwnerUpdate from './handlers/captionOwnerUpdate'; + +// TODO +RedisPubSub.on('SendCaptionHistoryRespMsg', handleCaptionHistory); +RedisPubSub.on('EditCaptionHistoryEvtMsg', handleCaptionUpdate); +RedisPubSub.on('UpdateCaptionOwnerEvtMsg', handleCaptionOwnerUpdate); diff --git a/bigbluebutton-html5/imports/api/2.0/captions/server/handlers/captionHistory.js b/bigbluebutton-html5/imports/api/2.0/captions/server/handlers/captionHistory.js new file mode 100644 index 0000000000000000000000000000000000000000..46e175bbdadadf658ea486e7f932470dc3c7a727 --- /dev/null +++ b/bigbluebutton-html5/imports/api/2.0/captions/server/handlers/captionHistory.js @@ -0,0 +1,57 @@ +import _ from 'lodash'; +import Captions from '/imports/api/2.0/captions'; +import { check } from 'meteor/check'; +import addCaption from '../modifiers/addCaption'; + +export default function handleCaptionHistory({ body }, meetingId) { + const SERVER_CONFIG = Meteor.settings.app; + const CAPTION_CHUNK_LENGTH = SERVER_CONFIG.captionsChunkLength || 1000; + + const captionHistory = body.history; + + check(meetingId, String); + check(captionHistory, Object); + + const captionsAdded = []; + _.each(captionHistory, (caption, locale) => { + const ownerId = caption[0]; + let captions = caption[1].slice(0); + const chunks = []; + + if (captions.length === 0) { + chunks.push(''); + } else { + while (captions.length > 0) { + if (captions.length > CAPTION_CHUNK_LENGTH) { + chunks.push(captions.slice(0, CAPTION_CHUNK_LENGTH)); + captions = captions.slice(CAPTION_CHUNK_LENGTH); + } else { + chunks.push(captions); + captions = captions.slice(captions.length); + } + } + } + + const selectorToRemove = { + meetingId, + locale, + 'captionHistory.index': { $gt: (chunks.length - 1) }, + }; + + Captions.remove(selectorToRemove); + + chunks.forEach((chunkCaptions, index) => { + const captionHistoryObject = { + locale, + ownerId, + chunkCaptions, + index, + next: (index < chunks.length - 1) ? index + 1 : undefined, + }; + + captionsAdded.push(addCaption(meetingId, locale, captionHistoryObject)); + }); + }); + + return captionsAdded; +} diff --git a/bigbluebutton-html5/imports/api/2.0/captions/server/handlers/captionOwnerUpdate.js b/bigbluebutton-html5/imports/api/2.0/captions/server/handlers/captionOwnerUpdate.js new file mode 100644 index 0000000000000000000000000000000000000000..3f5572677e7864a98d147eb2f0142f0246cecd08 --- /dev/null +++ b/bigbluebutton-html5/imports/api/2.0/captions/server/handlers/captionOwnerUpdate.js @@ -0,0 +1,46 @@ +import Captions from '/imports/api/2.0/captions'; +import Logger from '/imports/startup/server/logger'; +import { check } from 'meteor/check'; +import addCaption from '../modifiers/addCaption'; + +export default function handleCaptionOwnerUpdate({ body }, meetingId) { + const { ownerId, locale } = body; + + check(meetingId, String); + check(locale, String); + check(ownerId, String); + + const selector = { + meetingId, + locale, + }; + + const modifier = { + $set: { + 'captionHistory.ownerId': ownerId, + }, + }; + + const Caption = Captions.findOne(selector); + + if (!Caption) { + const captionHistory = { + ownerId, + captions: '', + index: 0, + next: null, + }; + + return addCaption(meetingId, locale, captionHistory); + } + + const cb = (err) => { + if (err) { + return Logger.error(`Updating captions owner: ${err}`); + } + + return Logger.verbose(`Update caption owner locale=${locale} meeting=${meetingId}`); + }; + + return Captions.update(selector, modifier, { multi: true }, cb); +} diff --git a/bigbluebutton-html5/imports/api/2.0/captions/server/handlers/captionUpdate.js b/bigbluebutton-html5/imports/api/2.0/captions/server/handlers/captionUpdate.js new file mode 100644 index 0000000000000000000000000000000000000000..a55f9dab181d0976141096772cc07eb02a4af178 --- /dev/null +++ b/bigbluebutton-html5/imports/api/2.0/captions/server/handlers/captionUpdate.js @@ -0,0 +1,178 @@ +import Captions from '/imports/api/2.0/captions'; +import { check } from 'meteor/check'; +import addCaption from '../modifiers/addCaption'; + +export default function handleCaptionUpdate({ body }, meetingId) { + const SERVER_CONFIG = Meteor.settings.app; + const CAPTION_CHUNK_LENGTH = SERVER_CONFIG.captionsChunkLength || 1000; + + const { locale } = body; + + check(meetingId, String); + check(locale, String); + + const captionsObjects = Captions.find({ + meetingId, + locale, + }, { + sort: { + locale: 1, + 'captionHistory.index': 1, + }, + }).fetch(); + + const objectsToUpdate = []; + if (captionsObjects != null) { + let startIndex; + let endIndex; + let length = 0; + let current = captionsObjects[0]; + + // looking for a start index and end index + // (end index only for the case when they are in the same block) + while (current != null) { + length += current.captionHistory.captions.length; + + // if length is bigger than start index - we found our start index + if (length >= body.startIndex && startIndex == undefined) { + // check if it's a new character somewhere in the middle of captions text + if (length - 1 >= body.startIndex) { + startIndex = body.startIndex - (length - current.captionHistory.captions.length); + + // check to see if the endIndex is in the same object as startIndex + if (length - 1 >= body.endIndex) { + endIndex = body.endIndex - (length - current.captionHistory.captions.length); + const _captions = current.captionHistory.captions; + current.captionHistory.captions = _captions.slice(0, startIndex) + + body.text + + _captions.slice(endIndex); + objectsToUpdate.push(current); + break; + + // end index is not in the same object as startIndex, we will find it later + } else { + current.captionHistory.captions = current.captionHistory.captions.slice(0, startIndex) + + body.text; + objectsToUpdate.push(current); + break; + } + + // separate case for appending new characters to the very end of the string + } else if (current.captionHistory.next == null && + length == body.startIndex && + length == body.startIndex) { + startIndex = 1; + endIndex = 1; + current.captionHistory.captions += body.text; + objectsToUpdate.push(current); + } + } + + current = captionsObjects[current.captionHistory.next]; + } + + // looking for end index here if it wasn't in the same object as start index + if (startIndex != undefined && endIndex == undefined) { + current = captionsObjects[current.captionHistory.next]; + while (current != null) { + length += current.captionHistory.captions.length; + + // check to see if the endIndex is in the current object + if (length - 1 >= body.endIndex) { + endIndex = body.endIndex - (length - current.captionHistory.captions.length); + current.captionHistory.captions = current.captionHistory.captions.slice(endIndex); + objectsToUpdate.push(current); + + break; + + // if endIndex wasn't in the current object, that means this whole object was deleted + // initializing string to '' + } else { + current.captionHistory.captions = ''; + objectsToUpdate.push(current); + } + + current = captionsObjects[current.captionHistory.next]; + } + } + + // looking for the strings which exceed the limit and split them into multiple objects + let maxIndex = captionsObjects.length - 1; + for (let i = 0; i < objectsToUpdate.length; i++) { + if (objectsToUpdate[i].captionHistory.captions.length > CAPTION_CHUNK_LENGTH) { + // string is too large. Check if the next object exists and if it can + // accomodate the part of the string that exceeds the limits + const _nextIndex = objectsToUpdate[i].captionHistory.next; + if (_nextIndex != null && + captionsObjects[_nextIndex].captionHistory.captions.length < CAPTION_CHUNK_LENGTH) { + const extraString = objectsToUpdate[i].captionHistory.captions.slice(CAPTION_CHUNK_LENGTH); + + // could assign it directly, but our linter complained + let _captions = objectsToUpdate[i].captionHistory.captions; + _captions = _captions.slice(0, CAPTION_CHUNK_LENGTH); + objectsToUpdate[i].captionHistory.captions = _captions; + + // check to see if the next object was added to objectsToUpdate array + if (objectsToUpdate[i + 1] != null && + objectsToUpdate[i].captionHistory.next == objectsToUpdate[i + 1].captionHistory.index) { + objectsToUpdate[i + 1].captionHistory.captions = extraString + + objectsToUpdate[i + 1].captionHistory.captions; + + // next object wasn't added to objectsToUpdate array, adding it from captionsObjects array. + } else { + const nextObj = captionsObjects[objectsToUpdate[i].captionHistory.next]; + nextObj.captionHistory.captions = extraString + nextObj.captionHistory.captions; + objectsToUpdate.push(nextObj); + } + + // next object was full already, so we create another and insert it in between them + } else { + // need to take a current object out of the objectsToUpdate and add it back after + // every other object, so that Captions collection could be updated in a proper order + const tempObj = objectsToUpdate.splice(i, 1); + let extraString = tempObj[0].captionHistory.captions.slice(CAPTION_CHUNK_LENGTH); + + tempObj[0].captionHistory.captions = + tempObj[0].captionHistory.captions.slice(0, CAPTION_CHUNK_LENGTH); + + maxIndex += 1; + const tempIndex = tempObj[0].captionHistory.next; + tempObj[0].captionHistory.next = maxIndex; + + while (extraString.length != 0) { + const entry = { + meetingId, + locale, + captionHistory: { + locale, + ownerId: tempObj[0].captionHistory.ownerId, + captions: extraString.slice(0, CAPTION_CHUNK_LENGTH), + index: maxIndex, + next: null, + }, + }; + maxIndex += 1; + extraString = extraString.slice(CAPTION_CHUNK_LENGTH); + if (extraString.length > 0) { + entry.captionHistory.next = maxIndex; + } else { + entry.captionHistory.next = tempIndex; + } + + objectsToUpdate.push(entry); + } + + objectsToUpdate.push(tempObj[0]); + } + } + } + } + + const captionsAdded = []; + objectsToUpdate.forEach((entry) => { + const { _id, meetingId, locale, captionHistory } = entry; + captionsAdded.push(addCaption(meetingId, locale, captionHistory, _id)); + }); + + return captionsAdded; +} diff --git a/bigbluebutton-html5/imports/api/2.0/captions/server/index.js b/bigbluebutton-html5/imports/api/2.0/captions/server/index.js new file mode 100644 index 0000000000000000000000000000000000000000..92451ac76bf27410726e8f3cd2eebac46cd7b83e --- /dev/null +++ b/bigbluebutton-html5/imports/api/2.0/captions/server/index.js @@ -0,0 +1,3 @@ +import './eventHandlers'; +import './methods'; +import './publishers'; diff --git a/bigbluebutton-html5/imports/api/2.0/captions/server/methods.js b/bigbluebutton-html5/imports/api/2.0/captions/server/methods.js new file mode 100644 index 0000000000000000000000000000000000000000..1ce65c369863cac02b7c5224a46ab766a38cf8b3 --- /dev/null +++ b/bigbluebutton-html5/imports/api/2.0/captions/server/methods.js @@ -0,0 +1,4 @@ +import { Meteor } from 'meteor/meteor'; + +Meteor.methods({ +}); diff --git a/bigbluebutton-html5/imports/api/2.0/captions/server/modifiers/addCaption.js b/bigbluebutton-html5/imports/api/2.0/captions/server/modifiers/addCaption.js new file mode 100644 index 0000000000000000000000000000000000000000..53c850de8e578bd6c1a0f8cc062f66ec4a165426 --- /dev/null +++ b/bigbluebutton-html5/imports/api/2.0/captions/server/modifiers/addCaption.js @@ -0,0 +1,47 @@ +import { check } from 'meteor/check'; +import Captions from '/imports/api/2.0/captions'; +import Logger from '/imports/startup/server/logger'; + +export default function addCaption(meetingId, locale, captionHistory, id = false) { + check(meetingId, String); + check(locale, String); + check(captionHistory, Object); + + const selector = { + meetingId, + locale, + }; + + if (id) { + selector._id = id; + } else { + selector['captionHistory.index'] = captionHistory.index; + } + + const modifier = { + $set: { + meetingId, + locale, + 'captionHistory.locale': locale, + 'captionHistory.ownerId': captionHistory.ownerId, + 'captionHistory.captions': captionHistory.captions, + 'captionHistory.next': captionHistory.next, + 'captionHistory.index': captionHistory.index, + }, + }; + + const cb = (err, numChanged) => { + if (err) { + return Logger.error(`Adding caption2x to collection: ${err}`); + } + + const { insertedId } = numChanged; + if (insertedId) { + return Logger.verbose(`Added caption2x locale=${locale} meeting=${meetingId}`); + } + + return Logger.verbose(`Upserted caption2x locale=${locale} meeting=${meetingId}`); + }; + + return Captions.upsert(selector, modifier, cb); +} diff --git a/bigbluebutton-html5/imports/api/2.0/captions/server/modifiers/clearCaptions.js b/bigbluebutton-html5/imports/api/2.0/captions/server/modifiers/clearCaptions.js new file mode 100644 index 0000000000000000000000000000000000000000..1190c4a74ce97ff742f2ba4f805df5638836e060 --- /dev/null +++ b/bigbluebutton-html5/imports/api/2.0/captions/server/modifiers/clearCaptions.js @@ -0,0 +1,10 @@ +import Captions from '/imports/api/2.0/captions'; +import Logger from '/imports/startup/server/logger'; + +export default function clearCaptions(meetingId) { + if (meetingId) { + return Captions.remove({ meetingId }, Logger.info(`Cleared Captions2x (${meetingId})`)); + } + + return Captions.remove({}, Logger.info('Cleared Captions2x (all)')); +} diff --git a/bigbluebutton-html5/imports/api/2.0/captions/server/publishers.js b/bigbluebutton-html5/imports/api/2.0/captions/server/publishers.js new file mode 100644 index 0000000000000000000000000000000000000000..662e5dd419861563f015e8ef354aa72073b52c80 --- /dev/null +++ b/bigbluebutton-html5/imports/api/2.0/captions/server/publishers.js @@ -0,0 +1,24 @@ +import Captions from '/imports/api/2.0/captions'; +import { Meteor } from 'meteor/meteor'; +import { check } from 'meteor/check'; +import Logger from '/imports/startup/server/logger'; +import mapToAcl from '/imports/startup/mapToAcl'; + +function captions(credentials) { + const { meetingId, requesterUserId, requesterToken } = credentials; + + check(meetingId, String); + check(requesterUserId, String); + check(requesterToken, String); + + Logger.verbose(`Publishing Captions2x for ${meetingId} ${requesterUserId} ${requesterToken}`); + + return Captions.find({ meetingId }); +} + +function publish(...args) { + const boundCaptions = captions.bind(this); + return mapToAcl('subscriptions.captions', boundCaptions)(args); +} + +Meteor.publish('captions2x', publish); diff --git a/bigbluebutton-html5/imports/api/2.0/meetings/server/modifiers/addMeeting.js b/bigbluebutton-html5/imports/api/2.0/meetings/server/modifiers/addMeeting.js index 31b6414a633935c25670844c87b35de461d6a2b7..c47ec84f0dabf6a472312fb8af06602a2d99c4a2 100755 --- a/bigbluebutton-html5/imports/api/2.0/meetings/server/modifiers/addMeeting.js +++ b/bigbluebutton-html5/imports/api/2.0/meetings/server/modifiers/addMeeting.js @@ -11,11 +11,14 @@ export default function addMeeting(meeting) { check(meetingId, String); const selector = { - 'meetingProp.intId': meetingId, + meetingId, }; const modifier = { - $set: flat(meeting), + $set: Object.assign( + { meetingId }, + flat(meeting), + ), }; const cb = (err, numChanged) => { diff --git a/bigbluebutton-html5/imports/api/2.0/polls/index.js b/bigbluebutton-html5/imports/api/2.0/polls/index.js new file mode 100644 index 0000000000000000000000000000000000000000..03987a6c4f1ad325529ce6d5a9f133185364277e --- /dev/null +++ b/bigbluebutton-html5/imports/api/2.0/polls/index.js @@ -0,0 +1 @@ +export default new Mongo.Collection('polls2x'); diff --git a/bigbluebutton-html5/imports/api/2.0/polls/server/eventHandlers.js b/bigbluebutton-html5/imports/api/2.0/polls/server/eventHandlers.js new file mode 100644 index 0000000000000000000000000000000000000000..a626193c3446a6909c39f4118c9bccfb8ae9c69a --- /dev/null +++ b/bigbluebutton-html5/imports/api/2.0/polls/server/eventHandlers.js @@ -0,0 +1,10 @@ +import RedisPubSub from '/imports/startup/server/redis2x'; +import handlePollStarted from './handlers/pollStarted'; +import handlePollStopped from './handlers/pollStopped'; +import handlePollPublished from './handlers/pollPublished'; +import handleUserVoted from './handlers/userVoted'; + +RedisPubSub.on('PollShowResultEvtMsg', handlePollPublished); +RedisPubSub.on('PollStartedEvtMsg', handlePollStarted); +RedisPubSub.on('PollStoppedEvtMsg', handlePollStopped); +RedisPubSub.on('UserRespondedToPollEvtMsg', handleUserVoted); diff --git a/bigbluebutton-html5/imports/api/2.0/polls/server/handlers/pollPublished.js b/bigbluebutton-html5/imports/api/2.0/polls/server/handlers/pollPublished.js new file mode 100644 index 0000000000000000000000000000000000000000..e68bd916ed0623fa99e9516eb5f9ebc1cce92966 --- /dev/null +++ b/bigbluebutton-html5/imports/api/2.0/polls/server/handlers/pollPublished.js @@ -0,0 +1,10 @@ +import { check } from 'meteor/check'; +import removePoll from '../modifiers/removePoll'; + +export default function pollPublished({ body }, meetingId) { + const { pollId } = body; + + check(meetingId, String); + + return removePoll(meetingId, pollId); +} diff --git a/bigbluebutton-html5/imports/api/2.0/polls/server/handlers/pollStarted.js b/bigbluebutton-html5/imports/api/2.0/polls/server/handlers/pollStarted.js new file mode 100644 index 0000000000000000000000000000000000000000..a912fc8002fb10a6547a84825878ff52c584834a --- /dev/null +++ b/bigbluebutton-html5/imports/api/2.0/polls/server/handlers/pollStarted.js @@ -0,0 +1,13 @@ +import { check } from 'meteor/check'; +import addPoll from '../modifiers/addPoll'; + +export default function pollStarted({ body }, meetingId) { + const { userId } = body; + const { poll } = body; + + check(meetingId, String); + check(userId, String); + check(poll, Object); + + return addPoll(meetingId, userId, poll); +} diff --git a/bigbluebutton-html5/imports/api/2.0/polls/server/handlers/pollStopped.js b/bigbluebutton-html5/imports/api/2.0/polls/server/handlers/pollStopped.js new file mode 100644 index 0000000000000000000000000000000000000000..f6419daf7fdf006027301fca178bf1385919a611 --- /dev/null +++ b/bigbluebutton-html5/imports/api/2.0/polls/server/handlers/pollStopped.js @@ -0,0 +1,19 @@ +import { check } from 'meteor/check'; +import removePoll from '../modifiers/removePoll'; +import clearPolls from '../modifiers/clearPolls'; + +export default function pollStopped({ body }, meetingId) { + const { poll } = body; + + check(meetingId, String); + + if (poll) { + const { pollId } = poll; + + check(pollId, String); + + return removePoll(meetingId, pollId); + } + + return clearPolls(meetingId); +} diff --git a/bigbluebutton-html5/imports/api/2.0/polls/server/handlers/userVoted.js b/bigbluebutton-html5/imports/api/2.0/polls/server/handlers/userVoted.js new file mode 100644 index 0000000000000000000000000000000000000000..5b80a46d28386a9921d3653bf78801775411fdf2 --- /dev/null +++ b/bigbluebutton-html5/imports/api/2.0/polls/server/handlers/userVoted.js @@ -0,0 +1,13 @@ +import { check } from 'meteor/check'; +import updateVotes from '../modifiers/updateVotes'; + +export default function userVoted({ body }, meetingId) { + const { poll } = body; + const { presenterId } = body; + + check(meetingId, String); + check(poll, Object); + check(presenterId, String); + + return updateVotes(poll, meetingId, presenterId); +} diff --git a/bigbluebutton-html5/imports/api/2.0/polls/server/index.js b/bigbluebutton-html5/imports/api/2.0/polls/server/index.js new file mode 100644 index 0000000000000000000000000000000000000000..92451ac76bf27410726e8f3cd2eebac46cd7b83e --- /dev/null +++ b/bigbluebutton-html5/imports/api/2.0/polls/server/index.js @@ -0,0 +1,3 @@ +import './eventHandlers'; +import './methods'; +import './publishers'; diff --git a/bigbluebutton-html5/imports/api/2.0/polls/server/methods.js b/bigbluebutton-html5/imports/api/2.0/polls/server/methods.js new file mode 100644 index 0000000000000000000000000000000000000000..388036fd5d2146b4aee3e8e08efad840e7d52b79 --- /dev/null +++ b/bigbluebutton-html5/imports/api/2.0/polls/server/methods.js @@ -0,0 +1,7 @@ +import { Meteor } from 'meteor/meteor'; +import publishVote from './methods/publishVote'; +import mapToAcl from '/imports/startup/mapToAcl'; + +Meteor.methods(mapToAcl(['methods.publishVote'], { + publishVote, +})); diff --git a/bigbluebutton-html5/imports/api/2.0/polls/server/methods/publishVote.js b/bigbluebutton-html5/imports/api/2.0/polls/server/methods/publishVote.js new file mode 100644 index 0000000000000000000000000000000000000000..de9b9af100493ba2aed7fb1443f4ddca8db0988b --- /dev/null +++ b/bigbluebutton-html5/imports/api/2.0/polls/server/methods/publishVote.js @@ -0,0 +1,61 @@ +import RedisPubSub from '/imports/startup/server/redis2x'; +import { check } from 'meteor/check'; +import Polls from '/imports/api/2.0/polls'; +import Logger from '/imports/startup/server/logger'; + +export default function publishVote(credentials, pollId, pollAnswerId) { // TODO discuss location + const REDIS_CONFIG = Meteor.settings.redis; + const CHANNEL = REDIS_CONFIG.channels.toAkkaApps; + const EVENT_NAME = 'RespondToPollReqMsg'; + + const { meetingId, requesterUserId } = credentials; + + const currentPoll = Polls.findOne({ + users: requesterUserId, + meetingId, + 'poll.answers.id': pollAnswerId, + 'poll.id': pollId, + }); + + check(meetingId, String); + check(requesterUserId, String); + check(pollAnswerId, Number); + check(currentPoll.meetingId, String); + + const payload = { + requesterId: requesterUserId, + pollId: currentPoll.poll.id, + questionId: 0, + answerId: pollAnswerId, + }; + + const header = { + meetingId, + name: EVENT_NAME, + userId: requesterUserId, + }; + + const selector = { + users: requesterUserId, + meetingId, + 'poll.answers.id': pollAnswerId, + }; + + const modifier = { + $pull: { + users: requesterUserId, + }, + }; + + const cb = (err) => { + if (err) { + return Logger.error(`Updating Polls2x collection: ${err}`); + } + + return Logger.info(`Updating Polls2x collection (meetingId: ${meetingId}, + pollId: ${currentPoll.poll.id}!)`); + }; + + Polls.update(selector, modifier, cb); + return RedisPubSub.publish(CHANNEL, EVENT_NAME, meetingId, payload, header); +} diff --git a/bigbluebutton-html5/imports/api/2.0/polls/server/modifiers/addPoll.js b/bigbluebutton-html5/imports/api/2.0/polls/server/modifiers/addPoll.js new file mode 100644 index 0000000000000000000000000000000000000000..60ea311bcd4fbd12f0247560f7998a6a77b12031 --- /dev/null +++ b/bigbluebutton-html5/imports/api/2.0/polls/server/modifiers/addPoll.js @@ -0,0 +1,53 @@ +import Users from '/imports/api/2.0/users'; +import Polls from '/imports/api/2.0/polls'; +import Logger from '/imports/startup/server/logger'; +import { check } from 'meteor/check'; + +export default function addPoll(meetingId, requesterId, poll) { + check(poll, Object); + check(requesterId, String); + check(meetingId, String); + + let selector = { + meetingId, + }; + + const options = { + fields: { + 'user.userid': 1, + _id: 0, + }, + }; + + const userIds = Users.find(selector, options) + .fetch() + .map(user => user.user.userid); + + selector = { + meetingId, + requester: requesterId, + 'poll.id': poll.id, + }; + + const modifier = { + meetingId, + poll, + requester: requesterId, + users: userIds, + }; + + const cb = (err, numChanged) => { + if (err != null) { + return Logger.error(`Adding Poll2x to collection: ${poll.id}`); + } + + const { insertedId } = numChanged; + if (insertedId) { + return Logger.info(`Added Poll2x id=${poll.id}`); + } + + return Logger.info(`Upserted Poll2x id=${poll.id}`); + }; + + return Polls.upsert(selector, modifier, cb); +} diff --git a/bigbluebutton-html5/imports/api/2.0/polls/server/modifiers/clearPolls.js b/bigbluebutton-html5/imports/api/2.0/polls/server/modifiers/clearPolls.js new file mode 100644 index 0000000000000000000000000000000000000000..acbc6c86708447c3b4f1788af10d649d309bbff1 --- /dev/null +++ b/bigbluebutton-html5/imports/api/2.0/polls/server/modifiers/clearPolls.js @@ -0,0 +1,10 @@ +import Polls from '/imports/api/2.0/polls'; +import Logger from '/imports/startup/server/logger'; + +export default function clearPolls(meetingId) { + if (meetingId) { + return Polls.remove({ meetingId }, Logger.info(`Cleared Polls2x (${meetingId})`)); + } + + return Polls.remove({}, Logger.info('Cleared Polls2x (all)')); +} diff --git a/bigbluebutton-html5/imports/api/2.0/polls/server/modifiers/removePoll.js b/bigbluebutton-html5/imports/api/2.0/polls/server/modifiers/removePoll.js new file mode 100644 index 0000000000000000000000000000000000000000..672d5e5020d7fcacfe976f4f54545eb2e244eb20 --- /dev/null +++ b/bigbluebutton-html5/imports/api/2.0/polls/server/modifiers/removePoll.js @@ -0,0 +1,23 @@ +import Polls from '/imports/api/2.0/polls'; +import { check } from 'meteor/check'; +import Logger from '/imports/startup/server/logger'; + +export default function removePoll(meetingId, pollId) { + check(meetingId, String); + check(pollId, String); + + const selector = { + meetingId, + 'poll.id': pollId, + }; + + const cb = (err) => { + if (err) { + return Logger.error(`Removing Poll2x from collection: ${err}`); + } + + return Logger.info(`Removed Poll2x id=${pollId}`); + }; + + return Polls.remove(selector, cb); +} diff --git a/bigbluebutton-html5/imports/api/2.0/polls/server/modifiers/updateVotes.js b/bigbluebutton-html5/imports/api/2.0/polls/server/modifiers/updateVotes.js new file mode 100644 index 0000000000000000000000000000000000000000..399d6bea3147ffe4636ecf2bdd6c78fa6113d6da --- /dev/null +++ b/bigbluebutton-html5/imports/api/2.0/polls/server/modifiers/updateVotes.js @@ -0,0 +1,51 @@ +import Polls from '/imports/api/2.0/polls'; +import { check } from 'meteor/check'; +import Logger from '/imports/startup/server/logger'; + +export default function updateVotes(poll, meetingId, requesterId) { + check(meetingId, String); + check(requesterId, String); + check(poll, Object); + + const { + id, + answers, + } = poll; + + const { numResponders } = poll; + const { numRespondents } = poll; + + check(id, String); + check(answers, Array); + + check(numResponders, Number); + check(numRespondents, Number); + + const selector = { + meetingId, + requester: requesterId, + 'poll.id': id, + }; + + const modifier = { + $set: { + requester: requesterId, + poll: { + answers, + num_responders: numResponders, + num_respondents: numRespondents, + id, + }, + }, + }; + + const cb = (err) => { + if (err) { + return Logger.error(`Updating Polls2x collection: ${err}`); + } + + return Logger.info(`Updating Polls2x collection (meetingId: ${meetingId}, pollId: ${id}!)`); + }; + + return Polls.update(selector, modifier, cb); +} diff --git a/bigbluebutton-html5/imports/api/2.0/polls/server/publishers.js b/bigbluebutton-html5/imports/api/2.0/polls/server/publishers.js new file mode 100644 index 0000000000000000000000000000000000000000..63f24de3c22ae0d64854e49c3c698cb99304d9e1 --- /dev/null +++ b/bigbluebutton-html5/imports/api/2.0/polls/server/publishers.js @@ -0,0 +1,30 @@ +import { Meteor } from 'meteor/meteor'; +import { check } from 'meteor/check'; +import Logger from '/imports/startup/server/logger'; +import Polls from '/imports/api/2.0/polls'; +import mapToAcl from '/imports/startup/mapToAcl'; + +function polls(credentials) { + const { meetingId, requesterUserId, requesterToken } = credentials; + + check(meetingId, String); + check(requesterUserId, String); + check(requesterToken, String); + + Logger.info(`Publishing polls2x =${meetingId} ${requesterUserId} ${requesterToken}`); + + const selector = { + meetingId, + users: requesterUserId, + }; + + return Polls.find(selector); +} + +function publish(...args) { + const boundPolls = polls.bind(this); + return mapToAcl('subscriptions.polls', boundPolls)(args); +} + +Meteor.publish('polls2x', publish); + diff --git a/bigbluebutton-html5/imports/api/2.0/shapes/server/modifiers/addShape.js b/bigbluebutton-html5/imports/api/2.0/shapes/server/modifiers/addShape.js index 47029054c960560bcfd63a7aa976578a94596425..b8aff32e7e54e4085e37d46475216c7e4197ee62 100644 --- a/bigbluebutton-html5/imports/api/2.0/shapes/server/modifiers/addShape.js +++ b/bigbluebutton-html5/imports/api/2.0/shapes/server/modifiers/addShape.js @@ -3,7 +3,6 @@ import Logger from '/imports/startup/server/logger'; import Shapes from '/imports/api/2.0/shapes'; const SHAPE_TYPE_TEXT = 'text'; -const SHAPE_TYPE_POLL_RESULT = 'poll_result'; const SHAPE_TYPE_PENCIL = 'pencil'; export default function addShape(meetingId, whiteboardId, userId, shape) { @@ -49,13 +48,6 @@ export default function addShape(meetingId, whiteboardId, userId, shape) { 'shape.shape.dataPoints': shape.annotationInfo.dataPoints, }); break; - - case SHAPE_TYPE_POLL_RESULT: - /** - * TODO - * shape.annotationInfo.result = JSON.parse(shape.annotationInfo.result); - */ - break; case SHAPE_TYPE_PENCIL: modifier.$push = { 'shape.shape.points': { $each: shape.annotationInfo.points } }; break; @@ -66,7 +58,7 @@ export default function addShape(meetingId, whiteboardId, userId, shape) { 'shape.shape.id': shape.annotationInfo.id, 'shape.shape.square': shape.annotationInfo.square, 'shape.shape.transparency': shape.annotationInfo.transparency, - 'shape.shape.thickness': shape.annotationInfo.thickness, + 'shape.shape.thickness': shape.annotationInfo.thickness * 10, 'shape.shape.color': shape.annotationInfo.color, 'shape.shape.result': shape.annotationInfo.result, 'shape.shape.num_respondents': shape.annotationInfo.numRespondents, @@ -85,9 +77,7 @@ export default function addShape(meetingId, whiteboardId, userId, shape) { return Logger.info(`Added shape id=${shape.id} whiteboard=${whiteboardId}`); } - if (numChanged) { - return Logger.info(`Upserted shape id=${shape.id} whiteboard=${whiteboardId}`); - } + return Logger.info(`Upserted shape id=${shape.id} whiteboard=${whiteboardId}`); }; return Shapes.upsert(selector, modifier, cb); diff --git a/bigbluebutton-html5/imports/api/2.0/shapes/server/modifiers/removeShape.js b/bigbluebutton-html5/imports/api/2.0/shapes/server/modifiers/removeShape.js index 23823a41b2488e235f0be122f966dec0a7c3f667..8dbeb5c6cc5e004be15dcc81258310931335829b 100644 --- a/bigbluebutton-html5/imports/api/2.0/shapes/server/modifiers/removeShape.js +++ b/bigbluebutton-html5/imports/api/2.0/shapes/server/modifiers/removeShape.js @@ -13,14 +13,12 @@ export default function removeShape(meetingId, whiteboardId, shapeId) { 'shape.id': shapeId, }; - const cb = (err, numChanged) => { + const cb = (err) => { if (err) { return Logger.error(`Removing shape2x from collection: ${err}`); } - if (numChanged) { - return Logger.info(`Removed shape2x id=${shapeId} whiteboard=${whiteboardId}`); - } + return Logger.info(`Removed shape2x id=${shapeId} whiteboard=${whiteboardId}`); }; return Shapes.remove(selector, cb); diff --git a/bigbluebutton-html5/imports/api/2.0/users/server/handlers/validateAuthToken.js b/bigbluebutton-html5/imports/api/2.0/users/server/handlers/validateAuthToken.js index 9a655d7b0beb4a1792f0660b458f711ac0824fa3..b8d6d878e2f89a67ed5cba739ca2677d3c8e56c1 100755 --- a/bigbluebutton-html5/imports/api/2.0/users/server/handlers/validateAuthToken.js +++ b/bigbluebutton-html5/imports/api/2.0/users/server/handlers/validateAuthToken.js @@ -7,25 +7,15 @@ import addChat from '/imports/api/2.0/chat/server/modifiers/addChat'; import clearUserSystemMessages from '/imports/api/2.0/chat/server/modifiers/clearUserSystemMessages'; const addWelcomeChatMessage = (meetingId, userId) => { - const APP_CONFIG = Meteor.settings.public.app; const CHAT_CONFIG = Meteor.settings.public.chat; - const Meeting = Meetings.findOne({ 'meetingProp.intId': meetingId }); - - if (!Meeting) { - // TODO add meeting properly so it does not get reset - return; - } - - const welcomeMessage = APP_CONFIG.defaultWelcomeMessage - .concat(APP_CONFIG.defaultWelcomeMessageFooter) - .replace(/%%CONFNAME%%/, Meeting.meetingProp.name); + const Meeting = Meetings.findOne({ meetingId }); const message = { - chatType: CHAT_CONFIG.type_system, - message: welcomeMessage, + message: Meeting.welcomeProp.welcomeMsg, fromColor: '0x3399FF', toUserId: userId, + toUsername: CHAT_CONFIG.type_system, fromUserId: CHAT_CONFIG.type_system, fromUsername: '', fromTime: (new Date()).getTime(), diff --git a/bigbluebutton-html5/imports/api/2.0/users/server/methods.js b/bigbluebutton-html5/imports/api/2.0/users/server/methods.js index e922391cbc8126c3c95d7d8abc81ab22ddef7c42..e898b3ff4a886d6bd16364f2c4a2cf042f88aedd 100644 --- a/bigbluebutton-html5/imports/api/2.0/users/server/methods.js +++ b/bigbluebutton-html5/imports/api/2.0/users/server/methods.js @@ -4,12 +4,14 @@ import userLogout from './methods/userLogout'; import validateAuthToken from './methods/validateAuthToken'; import setEmojiStatus from './methods/setEmojiStatus'; import assignPresenter from './methods/assignPresenter'; +import listenOnlyToggle from './methods/listenOnlyToggle'; -Meteor.methods(mapToAcl(['methods.userLogout', 'methods.setEmojiStatus', 'methods.assignPresenter', +Meteor.methods(mapToAcl(['methods.userLogout', 'methods.setEmojiStatus', 'methods.assignPresenter', 'methods.listenOnlyToggle', ], { userLogout, setEmojiStatus, assignPresenter, + listenOnlyToggle, })); Meteor.methods({ validateAuthToken2x: validateAuthToken }); diff --git a/bigbluebutton-html5/imports/api/2.0/users/server/methods/listenOnlyToggle.js b/bigbluebutton-html5/imports/api/2.0/users/server/methods/listenOnlyToggle.js index 6880569b72b5c4ad87abeac0e74099a3d3f8f35a..45e28835052db9765a571e8346cbc1b7877a9327 100755 --- a/bigbluebutton-html5/imports/api/2.0/users/server/methods/listenOnlyToggle.js +++ b/bigbluebutton-html5/imports/api/2.0/users/server/methods/listenOnlyToggle.js @@ -7,7 +7,7 @@ import Users from '/imports/api/2.0/users'; export default function listenOnlyToggle(credentials, isJoining = true) { const REDIS_CONFIG = Meteor.settings.redis; - const CHANNEL = REDIS_CONFIG.channels.toBBBApps.meeting; + const CHANNEL = REDIS_CONFIG.channels.toAkkaApps; const { meetingId, requesterUserId } = credentials; @@ -18,40 +18,36 @@ export default function listenOnlyToggle(credentials, isJoining = true) { let EVENT_NAME; if (isJoining) { - EVENT_NAME = 'user_connected_to_global_audio'; + EVENT_NAME = 'UserConnectedToGlobalAudioMsg'; } else { - EVENT_NAME = 'user_disconnected_from_global_audio'; + EVENT_NAME = 'UserDisconnectedFromGlobalAudioMsg'; } - const Meeting = Meetings.findOne({ meetingId }); - if (!Meeting) { - throw new Meteor.Error( - 'meeting-not-found', 'You need a valid meeting to be able to toggle audio'); - } - - check(Meeting.voiceConf, String); - const User = Users.findOne({ - meetingId, userId: requesterUserId, }); + const Meeting = Meetings.findOne({ meetingId }); + if (!User) { throw new Meteor.Error( 'user-not-found', 'You need a valid user to be able to toggle audio'); } - check(User.user.name, String); + // check(User.user.name, String); + + const header = { + name: EVENT_NAME, + voiceConf: Meeting.voiceProp.voiceConf, + }; const payload = { - userid: requesterUserId, - meeting_id: meetingId, - voice_conf: Meeting.voiceConf, + userId: requesterUserId, name: User.user.name, }; Logger.verbose(`User '${requesterUserId}' ${isJoining ? 'joined' : 'left'} global audio from meeting '${meetingId}'`); - return RedisPubSub.publish(CHANNEL, EVENT_NAME, payload); + return RedisPubSub.publish(CHANNEL, EVENT_NAME, meetingId, payload, header); } diff --git a/bigbluebutton-html5/imports/startup/client/auth.js b/bigbluebutton-html5/imports/startup/client/auth.js index 68d10187d55cb6eaa0dffdddbb0689509a66e430..5d6617aa9677e7b9ccf1493d7fa5729d1ceedc43 100755 --- a/bigbluebutton-html5/imports/startup/client/auth.js +++ b/bigbluebutton-html5/imports/startup/client/auth.js @@ -21,7 +21,7 @@ export function joinRouteHandler(nextState, replace, callback) { .then((data) => { const { meetingID, internalUserID, authToken, logoutUrl } = data.response; - Auth.set(meetingID, internalUserID, authToken, logoutUrl); + Auth.set(meetingID, internalUserID, authToken, logoutUrl, sessionToken); replace({ pathname: '/' }); callback(); }); diff --git a/bigbluebutton-html5/imports/startup/client/base.jsx b/bigbluebutton-html5/imports/startup/client/base.jsx index b5288c6c02a596681a9ba01560b3ce912fcb53e2..d4f6dec0b17e756c731fc19f36d04b901ba6771a 100644 --- a/bigbluebutton-html5/imports/startup/client/base.jsx +++ b/bigbluebutton-html5/imports/startup/client/base.jsx @@ -85,7 +85,7 @@ Base.defaultProps = defaultProps; const SUBSCRIPTIONS_NAME = [ 'users2x', 'users', 'chat', 'chat2x', 'cursor', 'cursor2x', 'deskshare', 'meetings', 'meetings2x', - 'polls', 'presentations', 'presentations2x', 'shapes', 'shapes2x', 'slides', 'slides2x', 'captions', 'breakouts', 'breakouts2x', + 'polls', 'polls2x', 'presentations', 'presentations2x', 'shapes', 'shapes2x', 'slides', 'slides2x', 'captions', 'captions2x', 'breakouts', 'breakouts2x', ]; const BaseContainer = createContainer(({ params }) => { diff --git a/bigbluebutton-html5/imports/ui/components/actions-bar/styles.scss b/bigbluebutton-html5/imports/ui/components/actions-bar/styles.scss index 41cfea483e4db32592b77d1eaa8ed39c5cff4a19..b74ee7dfa20d98d04c4c65c2cabcd73f2cd340e3 100755 --- a/bigbluebutton-html5/imports/ui/components/actions-bar/styles.scss +++ b/bigbluebutton-html5/imports/ui/components/actions-bar/styles.scss @@ -1,4 +1,4 @@ -@import "../../stylesheets/variables/_all"; +@import "/imports/ui/stylesheets/variables/_all"; .actionsbar, .left, diff --git a/bigbluebutton-html5/imports/ui/components/app/component.jsx b/bigbluebutton-html5/imports/ui/components/app/component.jsx index d1c77ee64c54416eef6e53da600c84c786ce2bd8..73d262e4e71cbcfda7ec0d49b58ccbbb8ebe6c4e 100755 --- a/bigbluebutton-html5/imports/ui/components/app/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/app/component.jsx @@ -1,7 +1,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { defineMessages, injectIntl } from 'react-intl'; - +import Modal from 'react-modal'; import _ from 'lodash'; import ModalContainer from '../modal/container'; @@ -55,6 +55,10 @@ class App extends Component { } componentDidMount() { + const locale = this.props.locale; + + Modal.setAppElement('#app'); + document.getElementsByTagName('html')[0].lang = locale; document.getElementsByTagName('html')[0].style.fontSize = this.props.fontSize; } diff --git a/bigbluebutton-html5/imports/ui/components/app/container.jsx b/bigbluebutton-html5/imports/ui/components/app/container.jsx index 0db01f9d4b8b8bdf81d418beb1fb61aa79660f5f..646b83aa5b4e0231c484c3913619177e1f996a8b 100755 --- a/bigbluebutton-html5/imports/ui/components/app/container.jsx +++ b/bigbluebutton-html5/imports/ui/components/app/container.jsx @@ -5,7 +5,8 @@ import { defineMessages, injectIntl } from 'react-intl'; import Auth from '/imports/ui/services/auth'; import Users from '/imports/api/2.0/users'; -import Breakouts from '/imports/api/1.1/breakouts'; +import Breakouts from '/imports/api/2.0/breakouts'; +import Meetings from '/imports/api/2.0/meetings'; import ClosedCaptionsContainer from '/imports/ui/components/closed-captions/container'; @@ -36,6 +37,10 @@ const intlMessages = defineMessages({ id: 'app.guest.waiting', description: 'Message while a guest is waiting to be approved', }, + endMeetingMessage: { + id: 'app.error.meeting.ended', + description: 'You have logged out of the conference', + }, }); const AppContainer = (props) => { @@ -57,22 +62,32 @@ export default withRouter(injectIntl(withModalMounter(createContainer(( baseControls.updateLoadingState(intl.formatMessage(intlMessages.waitingApprovalMessage)); } + // Displayed error messages according to the mode (kicked, end meeting) + const sendToError = (code, message) => { + Auth.clearCredentials() + .then(() => { + router.push(`/error/${code}`); + baseControls.updateErrorState(message); + }); + }; + // Check if user is kicked out of the session Users.find({ userId: Auth.userID }).observeChanges({ changed(id, fields) { if (fields.user && fields.user.kicked) { - Auth.clearCredentials() - .then(() => { - router.push('/error/403'); - baseControls.updateErrorState( - intl.formatMessage(intlMessages.kickedMessage), - ); - }); + sendToError(403, intl.formatMessage(intlMessages.kickedMessage)); } }, }); - // Close the widow when the current breakout room ends + // forcelly logged out when the meeting is ended + Meetings.find({ meetingId: Auth.meetingID }).observeChanges({ + removed() { + sendToError(410, intl.formatMessage(intlMessages.endMeetingMessage)); + }, + }); + + // Close the widow when the current breakout room ends Breakouts.find({ breakoutMeetingId: Auth.meetingID }).observeChanges({ removed() { Auth.clearCredentials().then(window.close); diff --git a/bigbluebutton-html5/imports/ui/components/app/styles.scss b/bigbluebutton-html5/imports/ui/components/app/styles.scss index 78462f3599f0d4f08bf2f1acac4bacd2d48077f2..c9a985a9a999cd861479568d0eb74cac0fbd820a 100755 --- a/bigbluebutton-html5/imports/ui/components/app/styles.scss +++ b/bigbluebutton-html5/imports/ui/components/app/styles.scss @@ -1,4 +1,4 @@ -@import "../../stylesheets/variables/_all"; +@import "/imports/ui/stylesheets/variables/_all"; $navbar-height: 60px; // TODO: Change to NavBar real height $actionsbar-height: 50px; // TODO: Change to ActionsBar real height @@ -54,9 +54,7 @@ $bars-padding: $lg-padding-x - .45rem; // -.45 so user-list and chat title is al .content { @extend %full-page; - background-color: $color-background; padding: 0 .25%; - // position: relative; &:before, &:after { diff --git a/bigbluebutton-html5/imports/ui/components/audio/audio-modal/styles.scss b/bigbluebutton-html5/imports/ui/components/audio/audio-modal/styles.scss index da5fc7eab94b1ea92a13db8af1f23542006fc0fd..cb2ab49badc37e1631e33bd7d5d13b494d92aad0 100755 --- a/bigbluebutton-html5/imports/ui/components/audio/audio-modal/styles.scss +++ b/bigbluebutton-html5/imports/ui/components/audio/audio-modal/styles.scss @@ -1,5 +1,5 @@ -@import "../../../stylesheets/variables/_all"; -@import "../../modal/simple/styles"; +@import "/imports/ui/stylesheets/variables/_all"; +@import "/imports/ui/components/modal/simple/styles"; .overlay { @extend .overlay; @@ -16,14 +16,25 @@ padding: 2rem 0; } +.closeBtnWrapper { + display: flex; + justify-content: flex-end; +} + .closeBtn { - background-color: #FFFFFF; + background-color: $color-white; border: none; - display: flex; - justify-content: flex-end; i { color: $color-gray-light; } + + &:focus, + &:hover{ + background-color: #0a5eac; + i{ + color: $color-white; + } + } } Button.audioBtn { @@ -41,7 +52,8 @@ Button.audioBtn span:first-child { } // When hovering over a button of class audioBtn, change the border colour of first span-child -Button.audioBtn:hover span:first-child { +Button.audioBtn:hover span:first-child, +Button.audioBtn:focus span:first-child { border: 5px solid $color-primary; background-color: #f1f8ff; } @@ -64,7 +76,7 @@ Button.audioBtn:last-of-type { .backBtn { border: none; i { - color: $color-primary; + color: $color-link; } } @@ -132,8 +144,8 @@ Button.audioBtn:last-of-type { .select { background-color: #fff; border: 0; - border-bottom: 0.1rem solid $color-gray-lighter; - color: $color-gray-light; + border-bottom: 0.1rem solid $color-text; + color: $color-text; width: 100%; // appearance: none; height: 1.75rem; diff --git a/bigbluebutton-html5/imports/ui/components/audio/audio-notification/styles.scss b/bigbluebutton-html5/imports/ui/components/audio/audio-notification/styles.scss index 8d2fabb43efd98bbd2efb209fe8afbf6021f4c88..1033621bbdba24af89257aea1d57bf8a0342931c 100755 --- a/bigbluebutton-html5/imports/ui/components/audio/audio-notification/styles.scss +++ b/bigbluebutton-html5/imports/ui/components/audio/audio-notification/styles.scss @@ -1,4 +1,4 @@ -@import "../../../stylesheets/variables/_all"; +@import "/imports/ui/stylesheets/variables/_all"; $nb-default-color: $color-gray; $nb-default-bg: $color-white; diff --git a/bigbluebutton-html5/imports/ui/components/audio/audio-settings/component.jsx b/bigbluebutton-html5/imports/ui/components/audio/audio-settings/component.jsx index b7046fa92b15c6821ba03196509e36b5f52170fb..089a247f3b0ffc79c6dde6010ccb4520b73452f0 100755 --- a/bigbluebutton-html5/imports/ui/components/audio/audio-settings/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/audio/audio-settings/component.jsx @@ -79,26 +79,26 @@ class AudioSettings extends React.Component { <div className={styles.formElement}> <label className={cx(styles.label, styles.labelSmall)}> {intl.formatMessage(intlMessages.micSourceLabel)} + <DeviceSelector + value={this.state.inputDeviceId} + className={styles.select} + kind="audioinput" + onChange={this.handleInputChange} + /> </label> - <DeviceSelector - value={this.state.inputDeviceId} - className={styles.select} - kind="audioinput" - onChange={this.handleInputChange} - /> </div> </div> <div className={styles.col}> <div className={styles.formElement}> <label className={cx(styles.label, styles.labelSmall)}> {intl.formatMessage(intlMessages.speakerSourceLabel)} + <DeviceSelector + value={this.state.outputDeviceId} + className={styles.select} + kind="audiooutput" + onChange={this.handleOutputChange} + /> </label> - <DeviceSelector - value={this.state.outputDeviceId} - className={styles.select} - kind="audiooutput" - onChange={this.handleOutputChange} - /> </div> </div> </div> @@ -107,12 +107,12 @@ class AudioSettings extends React.Component { <div className={styles.col}> <div className={styles.formElement}> <label className={cx(styles.label, styles.labelSmall)}> - {intl.formatMessage(intlMessages.streamVolumeLabel)} + {intl.formatMessage(intlMessages.streamVolumeLabel)} + <AudioStreamVolume + deviceId={this.state.inputDeviceId} + className={styles.audioMeter} + /> </label> - <AudioStreamVolume - deviceId={this.state.inputDeviceId} - className={styles.audioMeter} - /> </div> </div> <div className={styles.col}> diff --git a/bigbluebutton-html5/imports/ui/components/audio/audio-test/styles.scss b/bigbluebutton-html5/imports/ui/components/audio/audio-test/styles.scss index 08041a99fc2c578a7973201bbb238df16d036402..b9ff81b24d83075b58b77c47453223500846bb26 100644 --- a/bigbluebutton-html5/imports/ui/components/audio/audio-test/styles.scss +++ b/bigbluebutton-html5/imports/ui/components/audio/audio-test/styles.scss @@ -1,4 +1,4 @@ -@import "../../../stylesheets/variables/all"; +@import "/imports/ui/stylesheets/variables/_all"; .testAudioBtn { border: none; diff --git a/bigbluebutton-html5/imports/ui/components/audio/enter-audio/component.jsx b/bigbluebutton-html5/imports/ui/components/audio/enter-audio/component.jsx index a7338fc002a1eb1b9a857a3f52b7c32c2e316cbd..3b0d7e83802956ecf6c355ecd4905f0dc9780b67 100755 --- a/bigbluebutton-html5/imports/ui/components/audio/enter-audio/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/audio/enter-audio/component.jsx @@ -13,14 +13,12 @@ class EnterAudio extends React.Component { } = this.props; return ( - <div> <Button label={intl.formatMessage(intlMessages.enterSessionLabel)} size={'md'} color={'primary'} onClick={this.props.handleJoin} /> - </div> ); } } diff --git a/bigbluebutton-html5/imports/ui/components/audio/join-audio/component.jsx b/bigbluebutton-html5/imports/ui/components/audio/join-audio/component.jsx index c0ae66ce1a76df1fa7142b2b04bc2f1234c3dc3d..10fc993dbd49c4805dc67fe95fd2408e74ac2ed7 100755 --- a/bigbluebutton-html5/imports/ui/components/audio/join-audio/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/audio/join-audio/component.jsx @@ -50,7 +50,7 @@ class JoinAudio extends React.Component { const { intl } = this.props; return ( <div> - <div className={styles.closeBtn}> + <div className={styles.closeBtnWrapper}> <Button className={styles.closeBtn} label={intl.formatMessage(intlMessages.closeLabel)} diff --git a/bigbluebutton-html5/imports/ui/components/audio/service.js b/bigbluebutton-html5/imports/ui/components/audio/service.js index dc86d205b6135d9439487334072482f1384235f6..98e24b1755a1a109f1b25bd5b802cdcb31bf161a 100755 --- a/bigbluebutton-html5/imports/ui/components/audio/service.js +++ b/bigbluebutton-html5/imports/ui/components/audio/service.js @@ -2,25 +2,23 @@ import Users from '/imports/api/2.0/users'; import Auth from '/imports/ui/services/auth'; import AudioManager from '/imports/api/1.1/audio/client/manager'; +import Meetings from '/imports/api/2.0/meetings'; let audioManager; + const init = () => { const userId = Auth.userID; const User = Users.findOne({ userId }); const username = User.user.name; - - const turns = []; - const stuns = []; - // FIX ME - const voiceBridge = 'Meeting.voiceConf'; + const Meeting = Meetings.findOne({ meetingId: User.meetingId }); + const voiceBridge = Meeting.voiceProp.voiceConf; + // FIX ME - const microphoneLockEnforced = 'Meeting.roomLockSettings.disableMic'; + const microphoneLockEnforced = false; const userData = { userId, username, - turns, - stuns, voiceBridge, microphoneLockEnforced, }; diff --git a/bigbluebutton-html5/imports/ui/components/button/styles.scss b/bigbluebutton-html5/imports/ui/components/button/styles.scss index 4d7b84befbd7a34c5ef5a8964481c52ebe7fea9b..31f7eb215261278d4e6305baf6db34c6c2a3150c 100755 --- a/bigbluebutton-html5/imports/ui/components/button/styles.scss +++ b/bigbluebutton-html5/imports/ui/components/button/styles.scss @@ -1,4 +1,4 @@ -@import "../../stylesheets/variables/_all"; +@import "/imports/ui/stylesheets/variables/_all"; $btn-default-color: $color-gray; $btn-default-bg: $color-white; @@ -104,7 +104,7 @@ $btn-jumbo-padding: $jumbo-padding-y $jumbo-padding-x; display: block; margin-top: $btn-spacing; font-size: 90%; - color: $color-white; + color: #fff; font-weight: normal; line-height: 1.5; text-align: center; @@ -137,7 +137,7 @@ $btn-jumbo-padding: $jumbo-padding-y $jumbo-padding-x; .icon { width: 1.28571429em; text-align: center; - color: $color-white; + color: #fff; .buttonWrapper & { font-size: 125%; diff --git a/bigbluebutton-html5/imports/ui/components/chat/message-form/message-form-actions/styles.scss b/bigbluebutton-html5/imports/ui/components/chat/message-form/message-form-actions/styles.scss index e522d8b85467c88a1c4197b9a0b99574c11faa92..0d56ef179f74efcc38d97be3cdc403754e4d82ca 100755 --- a/bigbluebutton-html5/imports/ui/components/chat/message-form/message-form-actions/styles.scss +++ b/bigbluebutton-html5/imports/ui/components/chat/message-form/message-form-actions/styles.scss @@ -1 +1 @@ -@import "../../../../stylesheets/variables/_all"; +@import "/imports/ui/stylesheets/variables/_all"; diff --git a/bigbluebutton-html5/imports/ui/components/chat/message-list/component.jsx b/bigbluebutton-html5/imports/ui/components/chat/message-list/component.jsx index ff81ef63514d3960e53f2bfab1406db79b7b97fc..5213fcbf487fa8456329db3adf4cd2dae8d6ac0f 100755 --- a/bigbluebutton-html5/imports/ui/components/chat/message-list/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/chat/message-list/component.jsx @@ -157,6 +157,8 @@ class MessageList extends Component { render() { const { messages, intl } = this.props; + const isEmpty = messages.length == 0; + return ( <div className={styles.messageListWrapper}> <div @@ -167,7 +169,7 @@ class MessageList extends Component { aria-live="polite" aria-atomic="false" aria-relevant="additions" - aria-label={intl.formatMessage(intlMessages.emptyLogLabel)} + aria-label={isEmpty ? intl.formatMessage(intlMessages.emptyLogLabel) : ''} > {messages.map(message => ( <MessageListItem diff --git a/bigbluebutton-html5/imports/ui/components/chat/message-list/message-list-item/styles.scss b/bigbluebutton-html5/imports/ui/components/chat/message-list/message-list-item/styles.scss index 11aa0c673a207b5d033ac2a89593cdcc8c1d2687..d154d1febf8dfb0a32c60e910ff4fad1fb784866 100755 --- a/bigbluebutton-html5/imports/ui/components/chat/message-list/message-list-item/styles.scss +++ b/bigbluebutton-html5/imports/ui/components/chat/message-list/message-list-item/styles.scss @@ -1,4 +1,4 @@ -@import "../../../../stylesheets/variables/_all"; +@import "/imports/ui/stylesheets/variables/_all"; .item { font-size: $font-size-base * .90; diff --git a/bigbluebutton-html5/imports/ui/components/chat/message-list/styles.scss b/bigbluebutton-html5/imports/ui/components/chat/message-list/styles.scss index 8b039f7317092be6764903f6a61fb496077a8d1a..dc4423d21822c73e2fede9f270334b9705a673b7 100755 --- a/bigbluebutton-html5/imports/ui/components/chat/message-list/styles.scss +++ b/bigbluebutton-html5/imports/ui/components/chat/message-list/styles.scss @@ -1,5 +1,5 @@ -@import "../../../stylesheets/variables/_all"; -@import "../../../stylesheets/mixins/_scrollable"; +@import "/imports/ui/stylesheets/variables/_all"; +@import "/imports/ui/stylesheets/mixins/_scrollable"; .messageListWrapper { display: flex; diff --git a/bigbluebutton-html5/imports/ui/components/closed-captions/service.js b/bigbluebutton-html5/imports/ui/components/closed-captions/service.js index 7849ab91c956df87e7cafd0666b92f7330dfa7b9..916293ce9af4ce8cc8eb78ce58d2f4ff0a9771b7 100755 --- a/bigbluebutton-html5/imports/ui/components/closed-captions/service.js +++ b/bigbluebutton-html5/imports/ui/components/closed-captions/service.js @@ -1,4 +1,4 @@ -import Captions from '/imports/api/1.1/captions'; +import Captions from '/imports/api/2.0/captions'; import Auth from '/imports/ui/services/auth'; import Settings from '/imports/ui/services/settings'; diff --git a/bigbluebutton-html5/imports/ui/components/dropdown/component.jsx b/bigbluebutton-html5/imports/ui/components/dropdown/component.jsx index 770a52303e6cfd480513b95f6a319d23127adc27..213e3da18a516d5c1dea576bd45f1a7e6391353e 100755 --- a/bigbluebutton-html5/imports/ui/components/dropdown/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/dropdown/component.jsx @@ -156,7 +156,8 @@ class Dropdown extends Component { className={cx(styles.dropdown, className)} aria-live={otherProps['aria-live']} aria-relevant={otherProps['aria-relevant']} - aria-haspopup={otherProps['aria-haspopup']}> + aria-haspopup={otherProps['aria-haspopup']} + aria-label={otherProps['aria-label']}> {trigger} {content} { this.state.isOpen ? diff --git a/bigbluebutton-html5/imports/ui/components/dropdown/list/item/component.jsx b/bigbluebutton-html5/imports/ui/components/dropdown/list/item/component.jsx index e2218bf463007de183a372e8d51ccdad214fca1d..025df0e61b0c5353cd6ba7e2ef16e6f05b35c99f 100755 --- a/bigbluebutton-html5/imports/ui/components/dropdown/list/item/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/dropdown/list/item/component.jsx @@ -55,11 +55,7 @@ export default class DropdownListItem extends Component { (<span id={this.labelID} key="labelledby" hidden>{label}</span>) : null } - { - description ? - (<span id={this.descID} key="describedby" hidden>{description}</span>) - : null - } + <span id={this.descID} key="describedby" hidden>{description}</span> </li> ); } diff --git a/bigbluebutton-html5/imports/ui/components/dropdown/list/title/component.jsx b/bigbluebutton-html5/imports/ui/components/dropdown/list/title/component.jsx index cf1b50aa5035134c6be8c6f07ff01020af34f20c..ccd1aba10519e881d4cdde61698388e245fedecf 100755 --- a/bigbluebutton-html5/imports/ui/components/dropdown/list/title/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/dropdown/list/title/component.jsx @@ -8,14 +8,19 @@ const propTypes = { export default class DropdownListTitle extends Component { + constructor(props) { + super(props); + this.labelID = _.uniqueId("labelContext-"); + } + render() { const { intl, description } = this.props; return ( - <div> - <li className={styles.title} aria-describedby="labelContext">{this.props.children}</li> - <div id="labelContext" aria-label={description} /> - </div> + <li className={styles.title} aria-describedby={this.labelID}> + {this.props.children} + <div id={this.labelID} aria-label={description} /> + </li> ); } } diff --git a/bigbluebutton-html5/imports/ui/components/dropdown/styles.scss b/bigbluebutton-html5/imports/ui/components/dropdown/styles.scss index 3dd1e63b9c8fe28485418f0b66df9c3c85fd8bb8..e10a8bec06f9f340caee2590767999a4e4f36417 100755 --- a/bigbluebutton-html5/imports/ui/components/dropdown/styles.scss +++ b/bigbluebutton-html5/imports/ui/components/dropdown/styles.scss @@ -1,5 +1,5 @@ -@import "../../stylesheets/variables/_all"; -@import "../../stylesheets/mixins/_scrollable"; +@import "/imports/ui/stylesheets/variables/_all"; +@import "/imports/ui/stylesheets/mixins/_scrollable"; $dropdown-bg: $color-white; $dropdown-color: $color-text; diff --git a/bigbluebutton-html5/imports/ui/components/error-screen/styles.scss b/bigbluebutton-html5/imports/ui/components/error-screen/styles.scss index 82dc94643ef22f0b7e1df161a26ad98ad9e96a8b..4be4198c41fa5e6a8907323994f8924235bba2a4 100644 --- a/bigbluebutton-html5/imports/ui/components/error-screen/styles.scss +++ b/bigbluebutton-html5/imports/ui/components/error-screen/styles.scss @@ -1,4 +1,4 @@ -@import '../../stylesheets/variables/palette'; +@import "/imports/ui/stylesheets/variables/palette"; $bg: $color-gray-dark; $color: $color-white; diff --git a/bigbluebutton-html5/imports/ui/components/loading-screen/styles.scss b/bigbluebutton-html5/imports/ui/components/loading-screen/styles.scss index a3b75a7d83f77df39be77be008655b0b3715b323..2398a89d8444f87a35f5cd9d2f0092e1a53b2134 100644 --- a/bigbluebutton-html5/imports/ui/components/loading-screen/styles.scss +++ b/bigbluebutton-html5/imports/ui/components/loading-screen/styles.scss @@ -1,4 +1,4 @@ -@import '../../stylesheets/variables/_all'; +@import "/imports/ui/stylesheets/variables/_all"; /* Variables * ========== diff --git a/bigbluebutton-html5/imports/ui/components/modal/base/styles.scss b/bigbluebutton-html5/imports/ui/components/modal/base/styles.scss index b1dd764206c7145649ba747495d0da2b3e00d5ea..7ce9aa63ec3ac2d369c842435c8d9ecec61159c6 100755 --- a/bigbluebutton-html5/imports/ui/components/modal/base/styles.scss +++ b/bigbluebutton-html5/imports/ui/components/modal/base/styles.scss @@ -1,5 +1,5 @@ -@import "../../../stylesheets/variables/_all"; -@import "../../../stylesheets/mixins/_scrollable"; +@import "/imports/ui/stylesheets/variables/_all"; +@import "/imports/ui/stylesheets/mixins/_scrollable"; .modal { @include scrollbox-vertical(); diff --git a/bigbluebutton-html5/imports/ui/components/modal/fullscreen/component.jsx b/bigbluebutton-html5/imports/ui/components/modal/fullscreen/component.jsx index 2a2f97379e948294fc46a064259a2ff0765e8670..21ff295afe9b64963d907b09d81774b4f577aa59 100755 --- a/bigbluebutton-html5/imports/ui/components/modal/fullscreen/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/modal/fullscreen/component.jsx @@ -61,15 +61,13 @@ class ModalFullscreen extends Component { className={styles.dismiss} label={dismiss.label} onClick={this.handleAction.bind(this, 'dismiss')} - aria-describedby={'modalDismissDescription'} - tabIndex={0} /> + aria-describedby={'modalDismissDescription'} /> <Button color={'primary'} className={styles.confirm} label={confirm.label} onClick={this.handleAction.bind(this, 'confirm')} - aria-describedby={'modalConfirmDescription'} - tabIndex={0} /> + aria-describedby={'modalConfirmDescription'} /> </div> </header> <div className={styles.content}> diff --git a/bigbluebutton-html5/imports/ui/components/modal/fullscreen/styles.scss b/bigbluebutton-html5/imports/ui/components/modal/fullscreen/styles.scss index 55917b4c0b754c69393e4ff239afa2df5d49ee01..047c079789402eb67a2f2071de5db47eca9fde6a 100755 --- a/bigbluebutton-html5/imports/ui/components/modal/fullscreen/styles.scss +++ b/bigbluebutton-html5/imports/ui/components/modal/fullscreen/styles.scss @@ -48,4 +48,6 @@ } .confirm { + color: $color-white !important; + background-color: $color-link !important; } diff --git a/bigbluebutton-html5/imports/ui/components/modal/simple/component.jsx b/bigbluebutton-html5/imports/ui/components/modal/simple/component.jsx index d14e339a8554b8601053bf180a481890633fabff..3fc68a761cffabdaf354dddc09be8010f87f5c96 100755 --- a/bigbluebutton-html5/imports/ui/components/modal/simple/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/modal/simple/component.jsx @@ -54,13 +54,12 @@ class ModalSimple extends Component { circle={true} hideLabel={true} onClick={this.handleDismiss.bind(this)} - aria-describedby={'modalDismissDescription'} - tabIndex={0} /> + aria-describedby={'modalDismissDescription'} /> </header> <div className={styles.content}> {this.props.children} </div> - <div id="modalConfirmDescription" hidden>{confirm.description}</div> + <div id="modalDismissDescription" hidden>{confirm.description}</div> </ModalBase> ); } diff --git a/bigbluebutton-html5/imports/ui/components/modal/simple/styles.scss b/bigbluebutton-html5/imports/ui/components/modal/simple/styles.scss index 9c0878314acf4c517499caec5ad347e76d83373c..baa112c8891d90a11f886cbaf90b07e1a5f01186 100644 --- a/bigbluebutton-html5/imports/ui/components/modal/simple/styles.scss +++ b/bigbluebutton-html5/imports/ui/components/modal/simple/styles.scss @@ -1,4 +1,4 @@ -@import "../../../stylesheets/variables/_all"; +@import "/imports/ui/stylesheets/variables/_all"; @import "../base/styles"; .modal { diff --git a/bigbluebutton-html5/imports/ui/components/polling/service.js b/bigbluebutton-html5/imports/ui/components/polling/service.js index f9e135adb39fefaf4d6ad9f1194d1a6efb66d4d5..3e39835c377de5075c02b92e9eb314629efd330f 100755 --- a/bigbluebutton-html5/imports/ui/components/polling/service.js +++ b/bigbluebutton-html5/imports/ui/components/polling/service.js @@ -1,5 +1,5 @@ import { makeCall } from '/imports/ui/services/api'; -import Polls from '/imports/api/1.1/polls'; +import Polls from '/imports/api/2.0/polls'; const mapPolls = function () { const poll = Polls.findOne({}); diff --git a/bigbluebutton-html5/imports/ui/components/presentation/presentation-toolbar/component.jsx b/bigbluebutton-html5/imports/ui/components/presentation/presentation-toolbar/component.jsx index c80a6f52194fc3f7c25976de7ccc97bddd40f088..1eafd134682b954715ba2939d09b791a89999ef4 100755 --- a/bigbluebutton-html5/imports/ui/components/presentation/presentation-toolbar/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/presentation/presentation-toolbar/component.jsx @@ -44,8 +44,6 @@ class PresentationToolbar extends Component { <option value={i} key={i} - role="option" - aria-controls="slideComponent" > Slide {i} </option>, @@ -72,7 +70,6 @@ class PresentationToolbar extends Component { role="button" aria-labelledby="prevSlideLabel" aria-describedby="prevSlideDescrip" - aria-controls="skipSlide slideComponent" disabled={!(currentSlideNum > 1)} color={'default'} icon={'left_arrow'} @@ -88,7 +85,6 @@ class PresentationToolbar extends Component { role="listbox" aria-labelledby="skipSlideLabel" aria-describedby="skipSlideDescrip" - aria-controls="slideComponent" aria-live="polite" aria-relevant="all" value={currentSlideNum} @@ -102,7 +98,6 @@ class PresentationToolbar extends Component { role="button" aria-labelledby="nextSlideLabel" aria-describedby="nextSlideDescrip" - aria-controls="skipSlide slideComponent" disabled={!(currentSlideNum < numberOfSlides)} color={'default'} icon={'right_arrow'} diff --git a/bigbluebutton-html5/imports/ui/components/presentation/presentation-toolbar/styles.scss b/bigbluebutton-html5/imports/ui/components/presentation/presentation-toolbar/styles.scss index 21f16387e8e26f10ed4b99a652305195631dd581..b20f7a7d980388942af52da02b672d8ae0f0f7f6 100755 --- a/bigbluebutton-html5/imports/ui/components/presentation/presentation-toolbar/styles.scss +++ b/bigbluebutton-html5/imports/ui/components/presentation/presentation-toolbar/styles.scss @@ -1,5 +1,5 @@ -@import "../../button/styles.scss"; -@import "../../../stylesheets/variables/_all"; +@import "/imports/ui/components/button/styles.scss"; +@import "/imports/ui/stylesheets/variables/_all"; $controls-color: #212121 !default; $controls-background: #F0F2F6 !default; diff --git a/bigbluebutton-html5/imports/ui/components/presentation/styles.scss b/bigbluebutton-html5/imports/ui/components/presentation/styles.scss index 3ef3a39e985273791b8411e22b86ec011c43a154..f2dd993b04ee1066abeaf31001384398b873bb52 100755 --- a/bigbluebutton-html5/imports/ui/components/presentation/styles.scss +++ b/bigbluebutton-html5/imports/ui/components/presentation/styles.scss @@ -1,4 +1,4 @@ -@import "../../stylesheets/variables/_all"; +@import "/imports/ui/stylesheets/variables/_all"; .enter { opacity: 0.01; diff --git a/bigbluebutton-html5/imports/ui/components/settings/service.js b/bigbluebutton-html5/imports/ui/components/settings/service.js index dbba3d19cc6054afaa6d58e879a6a87c911bfede..05ec67b42b0cf534c64f38bd72e2ebfea537d127 100644 --- a/bigbluebutton-html5/imports/ui/components/settings/service.js +++ b/bigbluebutton-html5/imports/ui/components/settings/service.js @@ -1,5 +1,5 @@ import Users from '/imports/api/2.0/users'; -import Captions from '/imports/api/1.1/captions'; +import Captions from '/imports/api/2.0/captions'; import Auth from '/imports/ui/services/auth'; import _ from 'lodash'; import Settings from '/imports/ui/services/settings'; diff --git a/bigbluebutton-html5/imports/ui/components/settings/submenus/application/component.jsx b/bigbluebutton-html5/imports/ui/components/settings/submenus/application/component.jsx index 8c2daab4080e19f6c016b475c7fd804ebf6e0170..fda261c824c23b0065afa8b13679f4b3eb73abce 100644 --- a/bigbluebutton-html5/imports/ui/components/settings/submenus/application/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/settings/submenus/application/component.jsx @@ -177,32 +177,29 @@ class ApplicationMenu extends BaseMenu { </div> </div> <div className={styles.col}> - <div - className={cx(styles.formElement, styles.pullContentRight)} - aria-labelledby="changeLangLabel" - > - <select - defaultValue={this.state.settings.locale} - className={styles.select} - onChange={this.handleSelectChange.bind(this, 'locale', availableLocales)} - > - <option disabled> - { availableLocales && - availableLocales.length ? - intl.formatMessage(intlMessages.languageOptionLabel) : - intl.formatMessage(intlMessages.noLocaleOptionLabel) } - </option> - {availableLocales ? availableLocales.map((locale, index) => - (<option key={index} value={locale.locale}> - {locale.name} - </option>), - ) : null } - </select> - </div> - <div - id="changeLangLabel" - aria-label={intl.formatMessage(intlMessages.ariaLanguageLabel)} - /> + <label aria-labelledby="changeLangLabel" className={cx(styles.formElement, styles.pullContentRight)}> + <select + defaultValue={this.state.settings.locale} + className={styles.select} + onChange={this.handleSelectChange.bind(this, 'locale', availableLocales)} + > + <option disabled> + { availableLocales && + availableLocales.length ? + intl.formatMessage(intlMessages.languageOptionLabel) : + intl.formatMessage(intlMessages.noLocaleOptionLabel) } + </option> + {availableLocales ? availableLocales.map((locale, index) => + (<option key={index} value={locale.locale}> + {locale.name} + </option>), + ) : null } + </select> + </label> + <div + id="changeLangLabel" + aria-label={intl.formatMessage(intlMessages.ariaLanguageLabel)} + /> </div> </div> <hr className={styles.separator} /> @@ -227,7 +224,7 @@ class ApplicationMenu extends BaseMenu { <div className={styles.col}> <Button onClick={() => this.handleIncreaseFontSize()} - color={'success'} + color={'primary'} icon={'add'} circle hideLabel @@ -237,7 +234,7 @@ class ApplicationMenu extends BaseMenu { <div className={styles.col}> <Button onClick={() => this.handleDecreaseFontSize()} - color={'success'} + color={'primary'} icon={'substract'} circle hideLabel diff --git a/bigbluebutton-html5/imports/ui/components/settings/submenus/closed-captions/component.jsx b/bigbluebutton-html5/imports/ui/components/settings/submenus/closed-captions/component.jsx index 58ef831be5fb23b4fe659daf63c0c98e58e798a9..7eff5472cd0c082bda5dd5d84fa815faaad1be11 100755 --- a/bigbluebutton-html5/imports/ui/components/settings/submenus/closed-captions/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/settings/submenus/closed-captions/component.jsx @@ -188,7 +188,7 @@ class ClosedCaptionsMenu extends BaseMenu { </div> </div> <div className={styles.col}> - <div + <label className={cx(styles.formElement, styles.pullContentRight)} aria-label={intl.formatMessage(intlMessages.languageLabel)} > @@ -209,7 +209,7 @@ class ClosedCaptionsMenu extends BaseMenu { </option>), ) : null } </select> - </div> + </label> </div> </div> @@ -222,7 +222,7 @@ class ClosedCaptionsMenu extends BaseMenu { </div> </div> <div className={styles.col}> - <div + <label className={cx(styles.formElement, styles.pullContentRight)} aria-label={intl.formatMessage(intlMessages.fontFamilyLabel)} > @@ -242,7 +242,7 @@ class ClosedCaptionsMenu extends BaseMenu { ) } </select> - </div> + </label> </div> </div> @@ -255,7 +255,7 @@ class ClosedCaptionsMenu extends BaseMenu { </div> </div> <div className={styles.col}> - <div + <label className={cx(styles.formElement, styles.pullContentRight)} aria-label={intl.formatMessage(intlMessages.fontSizeLabel)} > @@ -275,7 +275,7 @@ class ClosedCaptionsMenu extends BaseMenu { ) } </select> - </div> + </label> </div> </div> diff --git a/bigbluebutton-html5/imports/ui/components/settings/submenus/styles.scss b/bigbluebutton-html5/imports/ui/components/settings/submenus/styles.scss index 0b7df87b8f95edfb6a30b8f82dc308224567092c..d009a1876fa078a91b8d00219d42ec4da216c6ee 100644 --- a/bigbluebutton-html5/imports/ui/components/settings/submenus/styles.scss +++ b/bigbluebutton-html5/imports/ui/components/settings/submenus/styles.scss @@ -1,4 +1,4 @@ -@import "../../../stylesheets/variables/_all"; +@import "/imports/ui/stylesheets/variables/_all"; .title { color: $color-gray-dark; @@ -34,7 +34,7 @@ } .label { - color: $color-gray-light; + color: $color-gray-label; font-size: 0.9rem; margin-bottom: 0.5rem; } @@ -56,7 +56,7 @@ background-color: #fff; border: 0; border-bottom: 0.1rem solid $color-gray-lighter; - color: $color-gray-light; + color: $color-gray-label; width: 100%; // appearance: none; height: 1.75rem; diff --git a/bigbluebutton-html5/imports/ui/components/user-avatar/component.jsx b/bigbluebutton-html5/imports/ui/components/user-avatar/component.jsx index 928a9d4a37d4919a6cd3763a75623d4f5eb67aca..255fced1b1efd3912c99d927c3b2ef48ebd64215 100755 --- a/bigbluebutton-html5/imports/ui/components/user-avatar/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/user-avatar/component.jsx @@ -49,7 +49,7 @@ export default class UserAvatar extends Component { renderAvatarContent() { const user = this.props.user; - let content = <span aria-hidden="true">{user.name.slice(0, 2)}</span>; + let content = <span aria-hidden="true" className={styles.avatarText}>{user.name.slice(0, 2)}</span>; if (user.emoji.status !== 'none') { let iconEmoji; diff --git a/bigbluebutton-html5/imports/ui/components/user-avatar/styles.scss b/bigbluebutton-html5/imports/ui/components/user-avatar/styles.scss index c78fb3798f5715258f90c33b5ab8d780355ae04a..d7ef9d81893d3d4c5c91567fd214afc6722edc3b 100644 --- a/bigbluebutton-html5/imports/ui/components/user-avatar/styles.scss +++ b/bigbluebutton-html5/imports/ui/components/user-avatar/styles.scss @@ -1,10 +1,10 @@ -@import '../../stylesheets/variables/palette'; +@import "/imports/ui/stylesheets/variables/palette"; /* Variables * ========== */ $user-avatar-border: $color-gray-light; -$user-avatar-text: $user-avatar-border; +$user-avatar-text: $color-white; $voice-user-bg: $color-success; $voice-user-text: $color-gray-light; @@ -12,6 +12,10 @@ $voice-user-text: $color-gray-light; $moderator-text: $color-white; $moderator-bg: $color-primary; +.avatarText { + color: $user-avatar-text; +} + .userAvatar { // @extend .flex-column; flex-basis: 2.2rem; diff --git a/bigbluebutton-html5/imports/ui/components/user-list/chat-list-item/styles.scss b/bigbluebutton-html5/imports/ui/components/user-list/chat-list-item/styles.scss index eb2e80c3b7658e26b1246e0f54c1694285036618..c1b18eebe1f2649858d45503ccdcb359fb9c5836 100755 --- a/bigbluebutton-html5/imports/ui/components/user-list/chat-list-item/styles.scss +++ b/bigbluebutton-html5/imports/ui/components/user-list/chat-list-item/styles.scss @@ -1,4 +1,4 @@ -@import '../styles.scss'; +@import "../styles.scss"; .chatListItem { @extend %list-item; diff --git a/bigbluebutton-html5/imports/ui/components/user-list/styles.scss b/bigbluebutton-html5/imports/ui/components/user-list/styles.scss index f4965d67435cb39d0931029c0580f1903a81646c..c7fd224e6df5a7787e65a22080e7a73a08d0592c 100755 --- a/bigbluebutton-html5/imports/ui/components/user-list/styles.scss +++ b/bigbluebutton-html5/imports/ui/components/user-list/styles.scss @@ -1,5 +1,5 @@ -@import '../../stylesheets/variables/_all'; -@import '../../stylesheets/mixins/_scrollable'; +@import "/imports/ui/stylesheets/variables/_all"; +@import "/imports/ui/stylesheets/mixins/_scrollable"; /* Variables * ========== @@ -109,7 +109,7 @@ $user-icons-color-hover: $color-gray; } .smallTitle { - color: $color-text; + color: $color-heading; font-size: 0.9rem; font-weight: 700; text-transform: uppercase; diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-item/component.jsx b/bigbluebutton-html5/imports/ui/components/user-list/user-list-item/component.jsx index 85ddcff526277b48616a6efacc2c5492a7a81d1b..dcd7bfb7ad6574a88c45c7516c2a2efb192f8731 100755 --- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-item/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-item/component.jsx @@ -217,7 +217,6 @@ class UserListItem extends Component { }); } - renderUserContents() { const { user, diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-item/styles.scss b/bigbluebutton-html5/imports/ui/components/user-list/user-list-item/styles.scss index 99276d294b5a7273ba3c22a57dee4fa5bd5af9d1..92362b7531015adc7d094fcc00443ece5b1c024d 100755 --- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-item/styles.scss +++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-item/styles.scss @@ -1,4 +1,4 @@ -@import '../styles.scss'; +@import "../styles.scss"; .userListItem { @extend %list-item; diff --git a/bigbluebutton-html5/imports/ui/components/video-dock/styles.scss b/bigbluebutton-html5/imports/ui/components/video-dock/styles.scss index 0e2ddb19940049281cc6a9e4e4ebe8cb0a3e6f64..a37e967d4ce74c1e91f784b5d0fac052d3fd6009 100755 --- a/bigbluebutton-html5/imports/ui/components/video-dock/styles.scss +++ b/bigbluebutton-html5/imports/ui/components/video-dock/styles.scss @@ -1,4 +1,4 @@ -@import "../../stylesheets/variables/_all"; +@import "/imports/ui/stylesheets/variables/_all"; .videoDock { position: absolute; diff --git a/bigbluebutton-html5/imports/ui/components/whiteboard/shapes/poll/component.jsx b/bigbluebutton-html5/imports/ui/components/whiteboard/shapes/poll/component.jsx index c4ef2bac5bae468422c78a2d4f2fcb453afc89d8..68de4c08474f3fff942ed38578434d9521e605ca 100755 --- a/bigbluebutton-html5/imports/ui/components/whiteboard/shapes/poll/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/whiteboard/shapes/poll/component.jsx @@ -1,7 +1,5 @@ import React from 'react'; -import PropTypes from 'prop-types'; import { findDOMNode } from 'react-dom'; -import ShapeHelpers from '../helpers.js'; export default class PollDrawComponent extends React.Component { constructor(props) { @@ -78,9 +76,9 @@ export default class PollDrawComponent extends React.Component { // counting the total number of votes, finding the biggest number of votes this.props.shape.result.reduce((previousValue, currentValue, currentIndex, array) => { - votesTotal = previousValue + currentValue.num_votes; - if (maxNumVotes < currentValue.num_votes) { - maxNumVotes = currentValue.num_votes; + votesTotal = previousValue + currentValue.numVotes; + if (maxNumVotes < currentValue.numVotes) { + maxNumVotes = currentValue.numVotes; } return votesTotal; @@ -93,12 +91,12 @@ export default class PollDrawComponent extends React.Component { for (let i = 0; i < arrayLength; ++i) { const _tempArray = []; const _result = this.props.shape.result[i]; - _tempArray.push(_result.key, `${_result.num_votes}`); + _tempArray.push(_result.key, `${_result.numVotes}`); if (votesTotal === 0) { _tempArray.push('0%'); _tempArray.push(i); } else { - percResult = _result.num_votes / votesTotal * 100; + const percResult = _result.numVotes / votesTotal * 100; _tempArray.push(`${Math.round(percResult)}%`); _tempArray.push(i); } @@ -176,7 +174,7 @@ export default class PollDrawComponent extends React.Component { calcFontSize: this.state.calcFontSize + 1, }); - // we can't increase font-size anymore, start decreasing + // we can't increase font-size anymore, start decreasing } return this.setState({ fontSizeDirection: -1, @@ -191,8 +189,8 @@ export default class PollDrawComponent extends React.Component { calcFontSize: this.state.calcFontSize - 1, }); - // font size is fine for the current line, switch to the next line - // or finish with the font-size calculations if this we are at the end of the array + // font size is fine for the current line, switch to the next line + // or finish with the font-size calculations if this we are at the end of the array } if (this.state.currentLine < this.state.textArray.length - 1) { return this.setState({ @@ -295,10 +293,10 @@ export default class PollDrawComponent extends React.Component { let yNumVotes = this.state.innerRect.y + verticalPadding - magicNumber; const extendedTextArray = []; for (let i = 0; i < this.state.textArray.length; i++) { - if (this.state.maxNumVotes == 0 || this.props.shape.result[i].num_votes === 0) { + if (this.state.maxNumVotes == 0 || this.props.shape.result[i].numVotes === 0) { barWidth = 1; } else { - barWidth = this.props.shape.result[i].num_votes / this.state.maxNumVotes * maxBarWidth; + barWidth = this.props.shape.result[i].numVotes / this.state.maxNumVotes * maxBarWidth; } // coordinates and color of the text inside the line bar @@ -322,30 +320,30 @@ export default class PollDrawComponent extends React.Component { } extendedTextArray[i] = - { - key: `${this.props.shape.id}_${this.state.textArray[i][3]}`, - keyColumn: { - keyString: this.state.textArray[i][0], - xLeft, - yLeft, - }, - barColumn: { - votesString: this.state.textArray[i][1], - xBar, - yBar, - barWidth, - barHeight, - yNumVotes, - xNumVotes, - color, - numVotes: this.props.shape.result[i].num_votes, - }, - percentColumn: { - xRight, - yRight, - percentString: this.state.textArray[i][2], - }, - }; + { + key: `${this.props.shape.id}_${this.state.textArray[i][3]}`, + keyColumn: { + keyString: this.state.textArray[i][0], + xLeft, + yLeft, + }, + barColumn: { + votesString: this.state.textArray[i][1], + xBar, + yBar, + barWidth, + barHeight, + yNumVotes, + xNumVotes, + color, + numVotes: this.props.shape.result[i].numVotes, + }, + percentColumn: { + xRight, + yRight, + percentString: this.state.textArray[i][2], + }, + }; // changing the Y coordinate for all the objects yBar = yBar + barHeight + verticalPadding; @@ -435,7 +433,7 @@ export default class PollDrawComponent extends React.Component { x={line.barColumn.xNumVotes + line.barColumn.barWidth / 2} y={line.barColumn.yNumVotes + line.barColumn.barHeight / 2} dy={this.state.maxLineHeight / 2} - key={`${line.key}_num_votes`} + key={`${line.key}_numVotes`} fill={line.barColumn.color} > {line.barColumn.numVotes} @@ -491,8 +489,8 @@ export default class PollDrawComponent extends React.Component { return ( <g> {this.state.textArray.map(line => - this.renderLine(line), - ) + this.renderLine(line), + ) } <text fontFamily="Arial" @@ -500,7 +498,7 @@ export default class PollDrawComponent extends React.Component { ref={(ref) => { this[`${this.props.shape.id}_digit`] = ref; }} > <tspan> - 0 + 0 </tspan> </text> </g> @@ -512,7 +510,7 @@ export default class PollDrawComponent extends React.Component { <g> {this.state.prepareToDisplay ? this.renderTestStrings() - : + : this.renderPoll() } </g> diff --git a/bigbluebutton-html5/imports/ui/services/auth/index.js b/bigbluebutton-html5/imports/ui/services/auth/index.js index 2b63515fde11e05f706586cf0c31ae6a5cf9eaea..4b2c73f2f9c1d73815b792feaea7b66684da40f9 100644 --- a/bigbluebutton-html5/imports/ui/services/auth/index.js +++ b/bigbluebutton-html5/imports/ui/services/auth/index.js @@ -13,6 +13,7 @@ class Auth { this._meetingID = Storage.getItem('meetingID'); this._userID = Storage.getItem('userID'); this._authToken = Storage.getItem('authToken'); + this._sessionToken = Storage.getItem('sessionToken'); this._logoutURL = Storage.getItem('logoutURL'); this._loggedIn = { value: false, @@ -29,6 +30,15 @@ class Auth { Storage.setItem('meetingID', this._meetingID); } + set sessionToken(sessionToken) { + this._sessionToken = sessionToken; + Storage.setItem('sessionToken', this._sessionToken); + } + + get sessionToken() { + return this._sessionToken; + } + get userID() { return this._userID; } @@ -72,14 +82,16 @@ class Auth { requesterUserId: this.userID, requesterToken: this.token, logoutURL: this.logoutURL, + sessionToken: this.sessionToken, }; } - set(meetingId, requesterUserId, requesterToken, logoutURL) { + set(meetingId, requesterUserId, requesterToken, logoutURL, sessionToken) { this.meetingID = meetingId; this.userID = requesterUserId; this.token = requesterToken; this.logoutURL = logoutURL; + this.sessionToken = sessionToken; } clearCredentials(...args) { @@ -88,6 +100,7 @@ class Auth { this.token = null; this.loggedIn = false; this.logoutURL = null; + this.sessionToken = null; return Promise.resolve(...args); } diff --git a/bigbluebutton-html5/imports/ui/stylesheets/variables/palette.scss b/bigbluebutton-html5/imports/ui/stylesheets/variables/palette.scss index d29bf629b894a1358411d4a9aeea083f788c73a1..cce314291369d4ab61af3c1fed8dabff5a92e069 100755 --- a/bigbluebutton-html5/imports/ui/stylesheets/variables/palette.scss +++ b/bigbluebutton-html5/imports/ui/stylesheets/variables/palette.scss @@ -1,18 +1,20 @@ -$color-white: #F3F6F9 !default; +$color-white: #FFF !default; -$color-gray: #353B42 !default; -$color-gray-dark: #2A2D33 !default; +$color-gray: #4E5A66 !default; +$color-gray-dark: #06172A !default; $color-gray-light: #8B9AA8 !default; $color-gray-lighter: lighten($color-gray-light, 25%) !default; -$color-primary: #299AD5 !default; -$color-success: #4DC0A2 !default; -$color-danger: #EC6365 !default; +$color-primary: #0F70D7 !default; +$color-success: #008081 !default; +$color-danger: #DF2721 !default; $color-background: $color-gray-dark !default; -$color-text: #8A95A5 !default; -$color-heading: #4E525E !default; +$color-text: $color-gray !default; +$color-heading: $color-gray-dark !default; -$color-link: #3E9DD6 !default; +$color-link: $color-primary !default; $color-link-hover: darken($color-link, 15%) !default; + +$color-gray-label: $color-gray !default; diff --git a/bigbluebutton-html5/private/config/public/app.yaml b/bigbluebutton-html5/private/config/public/app.yaml index 5e8f65383379c0fb814690cb98222b8fb029eb7a..d08eedb4739c09f247ae8f6f7c7f3c8ced31c5b1 100755 --- a/bigbluebutton-html5/private/config/public/app.yaml +++ b/bigbluebutton-html5/private/config/public/app.yaml @@ -17,9 +17,7 @@ app: bbbServerVersion: "1.1-beta" copyright: "©2017 BigBlueButton Inc." html5ClientBuild: "HTML5_CLIENT_VERSION" - defaultWelcomeMessage: Welcome to %%CONFNAME%%!<br /><br />For help on using BigBlueButton see these (short) <a href="event:http://www.bigbluebutton.org/content/videos"><u>tutorial videos</u></a>.<br /><br />To join the audio bridge click the gear icon (upper-right hand corner). Use a headset to avoid causing background noise for others.<br /><br /><br /> lockOnJoin: true - defaultWelcomeMessageFooter: This server is running a build of <a href="http://docs.bigbluebutton.org/1.1/overview.html" target="_blank"><u>BigBlueButton 1.1-beta</u></a>. # Name displayed in the brower URL basename: '/html5client' diff --git a/bigbluebutton-html5/private/locales/en.json b/bigbluebutton-html5/private/locales/en.json index 91b5f43690590df41454ea759dc3aa186f73ee5a..8ac9c69492cefbac603d1d13010125708bd3a041 100755 --- a/bigbluebutton-html5/private/locales/en.json +++ b/bigbluebutton-html5/private/locales/en.json @@ -194,6 +194,7 @@ "app.audio.listenOnly.backLabel": "Back", "app.audio.listenOnly.closeLabel": "Close", "app.error.kicked": "You have been kicked out of the meeting", + "app.error.meeting.ended": "You have logged out of the conference", "app.dropdown.close": "Close", "app.error.500": "Ops, something went wrong", "app.error.404": "Not found", diff --git a/bigbluebutton-html5/server/main.js b/bigbluebutton-html5/server/main.js index 413665df66c7d521f68b1b164d63e205f2530246..1b86f4dcdebf0874c7012b334dac497a5e4220e3 100755 --- a/bigbluebutton-html5/server/main.js +++ b/bigbluebutton-html5/server/main.js @@ -16,6 +16,8 @@ import '/imports/api/2.0/meetings/server'; import '/imports/api/2.0/users/server'; import '/imports/api/2.0/shapes/server'; import '/imports/api/2.0/cursor/server'; +import '/imports/api/2.0/polls/server'; +import '/imports/api/2.0/captions/server'; import '/imports/api/2.0/presentations/server'; import '/imports/api/2.0/slides/server'; import '/imports/api/2.0/breakouts/server'; diff --git a/bigbluebutton-web/grails-app/conf/bigbluebutton.properties b/bigbluebutton-web/grails-app/conf/bigbluebutton.properties index 862c58a7e3c42db9b3d2bd6abed0f8ed1deddc97..ba3d86824b77445bf88f3534588e8b9e455b6316 100755 --- a/bigbluebutton-web/grails-app/conf/bigbluebutton.properties +++ b/bigbluebutton-web/grails-app/conf/bigbluebutton.properties @@ -115,6 +115,23 @@ defaultMaxUsers=0 # Current default is 0 (meeting doesn't end). defaultMeetingDuration=0 +# Number of minutes elapse of no activity before +# ending the meeting +maxInactivityTimeoutMinutes=120 + +# Send warning to moderators to warn that +# meeting would be ended due to inactivity +warnMinutesBeforeMax=5 + +# End meeting if no user joined within +# a period of time after meeting created. +meetingExpireIfNoUserJoinedInMinutes=5 + +# Number of minutes to end meeting when +# the last user left. +meetingExpireWhenLastUserLeftInMinutes=1 + + # Disable recording by default. # true - don't record even if record param in the api call is set to record # false - when record param is passed from api, override this default diff --git a/bigbluebutton-web/grails-app/conf/spring/resources.xml b/bigbluebutton-web/grails-app/conf/spring/resources.xml index 814fd1b7e4762f4a9a34f5c1d86240edba178fb8..cdcf588240eec0ec523b751f32d61e95776223c8 100755 --- a/bigbluebutton-web/grails-app/conf/spring/resources.xml +++ b/bigbluebutton-web/grails-app/conf/spring/resources.xml @@ -125,6 +125,10 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. <property name="defaultAvatarURL" value="${defaultAvatarURL}"/> <property name="defaultConfigURL" value="${defaultConfigURL}"/> <property name="defaultGuestPolicy" value="${defaultGuestPolicy}"/> + <property name="maxInactivityTimeoutMinutes" value="${maxInactivityTimeoutMinutes}"/> + <property name="warnMinutesBeforeMax" value="${warnMinutesBeforeMax}"/> + <property name="meetingExpireIfNoUserJoinedInMinutes" value="${meetingExpireIfNoUserJoinedInMinutes}"/> + <property name="meetingExpireWhenLastUserLeftInMinutes" value="${meetingExpireWhenLastUserLeftInMinutes}"/> </bean> <import resource="doc-conversion.xml"/> diff --git a/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/ApiController.groovy b/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/ApiController.groovy index ce15e41d7c8bcccb073235affd9a10bbf55f1cbb..cd3435bc83e8687a790954cc6a793d3a6177315b 100755 --- a/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/ApiController.groovy +++ b/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/ApiController.groovy @@ -1393,17 +1393,13 @@ class ApiController { println("Session token = [" + sessionToken + "]") } - if (!session[sessionToken]) { + if (meetingService.getUserSession(sessionToken) == null) reject = true; - } else { - if (meetingService.getUserSession(session[sessionToken]) == null) - reject = true; - else { - us = meetingService.getUserSession(session[sessionToken]); - meeting = meetingService.getMeeting(us.meetingID); - if (meeting == null || meeting.isForciblyEnded()) { - reject = true - } + else { + us = meetingService.getUserSession(sessionToken); + meeting = meetingService.getMeeting(us.meetingID); + if (meeting == null || meeting.isForciblyEnded()) { + reject = true } } diff --git a/deskshare/app/build.gradle b/deskshare/app/build.gradle index 1384db20f8bf5c339251cbd2a97b12740d261675..baf747da04698b45e35c999e7c861064f7c06835 100755 --- a/deskshare/app/build.gradle +++ b/deskshare/app/build.gradle @@ -20,6 +20,7 @@ task resolveDeps(type: Copy) { */ repositories { mavenCentral() + mavenLocal() add(new org.apache.ivy.plugins.resolver.ChainResolver()) { name = 'remote' returnFirst = true @@ -138,6 +139,8 @@ dependencies { compile 'redis.clients:jedis:1.5.1' providedCompile 'commons-pool:commons-pool:1.5.6' compile 'com.google.code.gson:gson:1.7.1' + + compile 'org.bigbluebutton:bbb-common-message:0.0.16' } test { diff --git a/deskshare/app/src/main/java/org/bigbluebutton/deskshare/server/red5/pubsub/GenericObjectPoolConfigWrapper.java b/deskshare/app/src/main/java/org/bigbluebutton/deskshare/server/red5/pubsub/GenericObjectPoolConfigWrapper.java new file mode 100644 index 0000000000000000000000000000000000000000..5d801d34935917aaba9647e79590cda9e233074a --- /dev/null +++ b/deskshare/app/src/main/java/org/bigbluebutton/deskshare/server/red5/pubsub/GenericObjectPoolConfigWrapper.java @@ -0,0 +1,138 @@ +/** +* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ +* +* Copyright (c) 2017 BigBlueButton Inc. and by respective authors (see below). +* +* This program is free software; you can redistribute it and/or modify it under the +* terms of the GNU Lesser General Public License as published by the Free Software +* Foundation; either version 3.0 of the License, or (at your option) any later +* version. +* +* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY +* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public License along +* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. +* +*/ +package org.bigbluebutton.deskshare.server.red5.pubsub; + +import org.apache.commons.pool.impl.GenericObjectPool; + +public class GenericObjectPoolConfigWrapper { + + private final GenericObjectPool.Config config; + + public GenericObjectPoolConfigWrapper() { + this.config = new GenericObjectPool.Config(); + } + + public GenericObjectPool.Config getConfig() { + return config; + } + + public int getMaxIdle() { + return this.config.maxIdle; + } + + public void setMaxIdle(int maxIdle) { + this.config.maxIdle = maxIdle; + } + + public int getMinIdle() { + return this.config.minIdle; + } + + public void setMinIdle(int minIdle) { + this.config.minIdle = minIdle; + } + + public int getMaxActive() { + return this.config.maxActive; + } + + public void setMaxActive(int maxActive) { + this.config.maxActive = maxActive; + } + + public long getMaxWait() { + return this.config.maxWait; + } + + public void setMaxWait(long maxWait) { + this.config.maxWait = maxWait; + } + + public byte getWhenExhaustedAction() { + return this.config.whenExhaustedAction; + } + + public void setWhenExhaustedAction(byte whenExhaustedAction) { + this.config.whenExhaustedAction = whenExhaustedAction; + } + + public boolean isTestOnBorrow() { + return this.config.testOnBorrow; + } + + public void setTestOnBorrow(boolean testOnBorrow) { + this.config.testOnBorrow = testOnBorrow; + } + + public boolean isTestOnReturn() { + return this.config.testOnReturn; + } + + public void setTestOnReturn(boolean testOnReturn) { + this.config.testOnReturn = testOnReturn; + } + + public boolean isTestWhileIdle() { + return this.config.testWhileIdle; + } + + public void setTestWhileIdle(boolean testWhileIdle) { + this.config.testWhileIdle = testWhileIdle; + } + + public long getTimeBetweenEvictionRunsMillis() { + return this.config.timeBetweenEvictionRunsMillis; + } + + public void setTimeBetweenEvictionRunsMillis(long timeBetweenEvictionRunsMillis) { + this.config.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis; + } + + public int getNumTestsPerEvictionRun() { + return this.config.numTestsPerEvictionRun; + } + + public void setNumTestsPerEvictionRun(int numTestsPerEvictionRun) { + this.config.numTestsPerEvictionRun = numTestsPerEvictionRun; + } + + public long getMinEvictableIdleTimeMillis() { + return this.config.minEvictableIdleTimeMillis; + } + + public void setMinEvictableIdleTimeMillis(long minEvictableIdleTimeMillis) { + this.config.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis; + } + + public long getSoftMinEvictableIdleTimeMillis() { + return this.config.softMinEvictableIdleTimeMillis; + } + + public void setSoftMinEvictableIdleTimeMillis(long softMinEvictableIdleTimeMillis) { + this.config.softMinEvictableIdleTimeMillis = softMinEvictableIdleTimeMillis; + } + + public boolean isLifo() { + return this.config.lifo; + } + + public void setLifo(boolean lifo) { + this.config.lifo = lifo; + } +} diff --git a/deskshare/app/src/main/java/org/bigbluebutton/deskshare/server/red5/pubsub/MessagePublisher.java b/deskshare/app/src/main/java/org/bigbluebutton/deskshare/server/red5/pubsub/MessagePublisher.java new file mode 100644 index 0000000000000000000000000000000000000000..a7da742c76f920597e53a4faf9f10e368cf37ae3 --- /dev/null +++ b/deskshare/app/src/main/java/org/bigbluebutton/deskshare/server/red5/pubsub/MessagePublisher.java @@ -0,0 +1,55 @@ +/** +* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ +* +* Copyright (c) 2017 BigBlueButton Inc. and by respective authors (see below). +* +* This program is free software; you can redistribute it and/or modify it under the +* terms of the GNU Lesser General Public License as published by the Free Software +* Foundation; either version 3.0 of the License, or (at your option) any later +* version. +* +* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY +* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public License along +* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. +* +*/ +package org.bigbluebutton.deskshare.server.red5.pubsub; + +import java.util.Map; +import java.util.HashMap; + +import org.bigbluebutton.common.messages.MessagingConstants; +import org.bigbluebutton.common.messages.Constants; +import org.bigbluebutton.common.messages.StartTranscoderRequestMessage; +import org.bigbluebutton.common.messages.StopTranscoderRequestMessage; +import org.bigbluebutton.deskshare.server.red5.pubsub.MessageSender; + +public class MessagePublisher { + + private MessageSender sender; + + public void setMessageSender(MessageSender sender) { + this.sender = sender; + } + + public void startH264ToH263TranscoderRequest(String meetingId, String streamName, String ipAddress) { + Map<String, String> params = new HashMap<String, String>(); + params.put(Constants.TRANSCODER_TYPE, Constants.TRANSCODE_H264_TO_H263); + params.put(Constants.MODULE, "deskShare"); + params.put(Constants.LOCAL_IP_ADDRESS, ipAddress); + params.put(Constants.DESTINATION_IP_ADDRESS, ipAddress); + params.put(Constants.INPUT, streamName); + // TODO: transcoderId is getting meetingId, this may have to change + StartTranscoderRequestMessage msg = new StartTranscoderRequestMessage(meetingId, meetingId, params); + sender.send(MessagingConstants.TO_BBB_TRANSCODE_SYSTEM_CHAN, msg.toJson()); + } + + public void stopTranscoderRequest(String meetingId) { + // TODO: transcoderId is getting meetingId, this may have to change + StopTranscoderRequestMessage msg = new StopTranscoderRequestMessage(meetingId, meetingId); + sender.send(MessagingConstants.TO_BBB_TRANSCODE_SYSTEM_CHAN, msg.toJson()); + } +} diff --git a/deskshare/app/src/main/java/org/bigbluebutton/deskshare/server/red5/pubsub/MessageSender.java b/deskshare/app/src/main/java/org/bigbluebutton/deskshare/server/red5/pubsub/MessageSender.java new file mode 100644 index 0000000000000000000000000000000000000000..25ef088b9fbbf685e3b7cf9237d87f326ef00f85 --- /dev/null +++ b/deskshare/app/src/main/java/org/bigbluebutton/deskshare/server/red5/pubsub/MessageSender.java @@ -0,0 +1,94 @@ +/** +* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ +* +* Copyright (c) 2017 BigBlueButton Inc. and by respective authors (see below). +* +* This program is free software; you can redistribute it and/or modify it under the +* terms of the GNU Lesser General Public License as published by the Free Software +* Foundation; either version 3.0 of the License, or (at your option) any later +* version. +* +* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY +* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public License along +* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. +* +*/ +package org.bigbluebutton.deskshare.server.red5.pubsub; + +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; +import java.util.concurrent.LinkedBlockingQueue; + +import org.red5.logging.Red5LoggerFactory; +import org.slf4j.Logger; + +import redis.clients.jedis.Jedis; +import redis.clients.jedis.JedisPool; + +public class MessageSender { + private static Logger log = Red5LoggerFactory.getLogger(MessageSender.class, "deskshare"); + + private JedisPool redisPool; + private volatile boolean sendMessage = false; + + private final Executor msgSenderExec = Executors.newSingleThreadExecutor(); + private final Executor runExec = Executors.newSingleThreadExecutor(); + private BlockingQueue<MessageToSend> messages = new LinkedBlockingQueue<MessageToSend>(); + + public void stop() { + sendMessage = false; + } + + public void start() { + log.info("Redis message publisher starting!"); + try { + sendMessage = true; + + Runnable messageSender = new Runnable() { + public void run() { + while (sendMessage) { + try { + MessageToSend msg = messages.take(); + publish(msg.getChannel(), msg.getMessage()); + } catch (InterruptedException e) { + log.warn("Failed to get message from queue."); + } + } + } + }; + msgSenderExec.execute(messageSender); + } catch (Exception e) { + log.error("Error subscribing to channels: " + e.getMessage()); + } + } + + public void send(String channel, String message) { + MessageToSend msg = new MessageToSend(channel, message); + messages.add(msg); + } + + private void publish(final String channel, final String message) { + Runnable task = new Runnable() { + public void run() { + Jedis jedis = redisPool.getResource(); + try { + jedis.publish(channel, message); + } catch(Exception e){ + log.warn("Cannot publish the message to redis", e); + } finally { + redisPool.returnResource(jedis); + } + } + }; + + runExec.execute(task); + } + + public void setRedisPool(JedisPool redisPool){ + this.redisPool = redisPool; + } +} diff --git a/deskshare/app/src/main/java/org/bigbluebutton/deskshare/server/red5/pubsub/MessageToSend.java b/deskshare/app/src/main/java/org/bigbluebutton/deskshare/server/red5/pubsub/MessageToSend.java new file mode 100644 index 0000000000000000000000000000000000000000..3a2ccb77538a9954bfb471cb33692b51d48b5a6a --- /dev/null +++ b/deskshare/app/src/main/java/org/bigbluebutton/deskshare/server/red5/pubsub/MessageToSend.java @@ -0,0 +1,37 @@ +/** +* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ +* +* Copyright (c) 2017 BigBlueButton Inc. and by respective authors (see below). +* +* This program is free software; you can redistribute it and/or modify it under the +* terms of the GNU Lesser General Public License as published by the Free Software +* Foundation; either version 3.0 of the License, or (at your option) any later +* version. +* +* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY +* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public License along +* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. +* +*/ +package org.bigbluebutton.deskshare.server.red5.pubsub; + +public class MessageToSend { + private final String channel; + private final String message; + + public MessageToSend(String channel, String message) { + this.channel = channel; + this.message = message; + } + + public String getChannel() { + return channel; + } + + public String getMessage() { + return message; + } +} diff --git a/deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/red5/DeskshareApplication.scala b/deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/red5/DeskshareApplication.scala index bae1803c4d9fa3e708ff6f9e91efac5f9f2253ee..74d53963759201bb11a18c4b1dd302f5f5dabdc6 100755 --- a/deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/red5/DeskshareApplication.scala +++ b/deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/red5/DeskshareApplication.scala @@ -27,6 +27,7 @@ import org.bigbluebutton.deskshare.server.RtmpClientAdapter import org.bigbluebutton.deskshare.server.stream.StreamManager import org.bigbluebutton.deskshare.server.socket.DeskShareServer import org.bigbluebutton.deskshare.server.MultiThreadedAppAdapter +import org.bigbluebutton.deskshare.server.red5.pubsub.MessagePublisher import scala.actors.Actor import scala.actors.Actor._ import net.lag.configgy.Configgy @@ -37,7 +38,7 @@ import org.red5.server.api.scope.{IScope} import org.red5.server.util.ScopeUtils import com.google.gson.Gson -class DeskshareApplication(streamManager: StreamManager, deskShareServer: DeskShareServer) extends MultiThreadedAppAdapter { +class DeskshareApplication(streamManager: StreamManager, deskShareServer: DeskShareServer, messagePublisher: MessagePublisher) extends MultiThreadedAppAdapter { private val deathSwitch = new CountDownLatch(1) // load our config file and configure logfiles. diff --git a/deskshare/app/src/main/webapp/WEB-INF/bbb-redis-pool.xml b/deskshare/app/src/main/webapp/WEB-INF/bbb-redis-pool.xml new file mode 100644 index 0000000000000000000000000000000000000000..68c5ba118d598d7cbf105815e8ddbcdbb9d14048 --- /dev/null +++ b/deskshare/app/src/main/webapp/WEB-INF/bbb-redis-pool.xml @@ -0,0 +1,64 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + +BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ + +Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below). + +This program is free software; you can redistribute it and/or modify it under the +terms of the GNU Lesser General Public License as published by the Free Software +Foundation; either version 3.0 of the License, or (at your option) any later +version. + +BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. + +--> +<beans xmlns="http://www.springframework.org/schema/beans" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:util="http://www.springframework.org/schema/util" + xsi:schemaLocation="http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans-2.5.xsd + http://www.springframework.org/schema/util + http://www.springframework.org/schema/util/spring-util-2.0.xsd"> + + <bean id="redisPool" class="redis.clients.jedis.JedisPool"> + <constructor-arg index="0"> + <bean factory-bean="config" factory-method="getConfig" /> + </constructor-arg> + <constructor-arg index="1" value="${redis.host}"/> + <constructor-arg index="2" value="${redis.port}"/> + </bean> + + <bean id="config" class="org.bigbluebutton.deskshare.server.red5.pubsub.GenericObjectPoolConfigWrapper"> + <!-- Action to take when trying to acquire a connection and all connections are taken --> + <property name="whenExhaustedAction"> + <!-- Fail-fast behaviour, we don't like to keep the kids waiting --> + <util:constant static-field="org.apache.commons.pool.impl.GenericObjectPool.WHEN_EXHAUSTED_FAIL"/> + <!-- Default behaviour, block the caller until a resource becomes available --> + <!--<util:constant static-field="org.apache.commons.pool.impl.GenericObjectPool.WHEN_EXHAUSTED_BLOCK" />--> + </property> + <!-- Maximum active connections to Redis instance --> + <property name="maxActive" value="12"/> + <!-- Number of connections to Redis that just sit there and do nothing --> + <property name="maxIdle" value="6"/> + <!-- Minimum number of idle connections to Redis - these can be seen as always open and ready to serve --> + <property name="minIdle" value="1"/> + <!-- Tests whether connection is dead when connection retrieval method is called --> + <property name="testOnBorrow" value="true"/> + <!-- Tests whether connection is dead when returning a connection to the pool --> + <property name="testOnReturn" value="true"/> + <!-- Tests whether connections are dead during idle periods --> + <property name="testWhileIdle" value="true"/> + <!-- Maximum number of connections to test in each idle check --> + <property name="numTestsPerEvictionRun" value="12"/> + <!-- Idle connection checking period --> + <property name="timeBetweenEvictionRunsMillis" value="60000"/> + <!-- Maximum time, in milliseconds, to wait for a resource when exausted action is set to WHEN_EXAUSTED_BLOCK --> + <property name="maxWait" value="5000"/> + </bean> +</beans> diff --git a/deskshare/app/src/main/webapp/WEB-INF/red5-web.xml b/deskshare/app/src/main/webapp/WEB-INF/red5-web.xml index f83f636841b7072675323e869ac65c5f8f6bdc7f..928dfda8f743ee28d76d023c640d143be3065f9e 100755 --- a/deskshare/app/src/main/webapp/WEB-INF/red5-web.xml +++ b/deskshare/app/src/main/webapp/WEB-INF/red5-web.xml @@ -39,6 +39,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. <bean id="web.handler" class="org.bigbluebutton.deskshare.server.red5.DeskshareApplication"> <constructor-arg ref="streamManager"/> <constructor-arg ref="deskShareServer"/> + <constructor-arg ref="messagePublisher"/> </bean> <bean id="deskshare.service" class="org.bigbluebutton.deskshare.server.stream.DeskshareService"> <constructor-arg ref="streamManager"/> @@ -71,4 +72,12 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. <constructor-arg index="1" value="${redis.port}"/> <constructor-arg index="2" value="${redis.keyExpiry}"/> </bean> + <bean id="messageSender" class="org.bigbluebutton.deskshare.server.red5.pubsub.MessageSender" + init-method="start" destroy-method="stop"> + <property name="redisPool" ref="redisPool"/> + </bean> + <bean id="messagePublisher" class="org.bigbluebutton.deskshare.server.red5.pubsub.MessagePublisher"> + <property name="messageSender" ref="messageSender"/> + </bean> + <import resource="bbb-redis-pool.xml"/> </beans> diff --git a/labs/kurento-screenshare/.gitignore b/labs/kurento-screenshare/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..40b878db5b1c97fc77049537a71bb2e249abe5dc --- /dev/null +++ b/labs/kurento-screenshare/.gitignore @@ -0,0 +1 @@ +node_modules/ \ No newline at end of file diff --git a/labs/kurento-screenshare/README.md b/labs/kurento-screenshare/README.md new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/labs/kurento-screenshare/config/default.yml b/labs/kurento-screenshare/config/default.yml new file mode 100644 index 0000000000000000000000000000000000000000..46b6e2629ecf6e34603f5a34c1288266d0583918 --- /dev/null +++ b/labs/kurento-screenshare/config/default.yml @@ -0,0 +1,8 @@ +kurentoUrl: "KURENTOURL" +kurentoIp: "KURENTOIP" +localIpAddress: "HOST" +acceptSelfSignedCertificate: false +redisHost : "127.0.0.1" +redisPort : "6379" +minVideoPort: 30000 +maxVideoPort: 33000 diff --git a/labs/kurento-screenshare/debug-start.sh b/labs/kurento-screenshare/debug-start.sh new file mode 100644 index 0000000000000000000000000000000000000000..b7c6990b40943deef6c8529bfec832f0d929927b --- /dev/null +++ b/labs/kurento-screenshare/debug-start.sh @@ -0,0 +1 @@ +node --inspect --debug-brk server.js diff --git a/labs/kurento-screenshare/keys/README.md b/labs/kurento-screenshare/keys/README.md new file mode 100644 index 0000000000000000000000000000000000000000..5bc681a1c8d2ece88651b6ee63d410536eae50f6 --- /dev/null +++ b/labs/kurento-screenshare/keys/README.md @@ -0,0 +1,2 @@ +This folder contains a dummy self-signed certificate only for demo purposses, +**DON'T USE IT IN PRODUCTION**. diff --git a/labs/kurento-screenshare/keys/server.crt b/labs/kurento-screenshare/keys/server.crt new file mode 100644 index 0000000000000000000000000000000000000000..65e608dad5d9fb19f68ac486e6189dfc67dcd2ff --- /dev/null +++ b/labs/kurento-screenshare/keys/server.crt @@ -0,0 +1,19 @@ +-----BEGIN CERTIFICATE----- +MIIDBjCCAe4CCQCuf5QfyX2oDDANBgkqhkiG9w0BAQsFADBFMQswCQYDVQQGEwJB +VTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0 +cyBQdHkgTHRkMB4XDTE0MDkyOTA5NDczNVoXDTE1MDkyOTA5NDczNVowRTELMAkG +A1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0 +IFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AMJOyOHJ+rJWJEQ7P7kKoWa31ff7hKNZxF6sYE5lFi3pBYWIY6kTN/iUaxJLROFo +FhoC/M/STY76rIryix474v/6cRoG8N+GQBEn4IAP1UitWzVO6pVvBaIt5IKlhhfm +YA1IMweCd03vLcaHTddNmFDBTks7QDwfenTaR5VjKYc3OtEhcG8dgLAnOjbbk2Hr +8wter2IeNgkhya3zyoXnTLT8m8IMg2mQaJs62Xlo9gs56urvVDWG4rhdGybj1uwU +ZiDYyP4CFCUHS6UVt12vADP8vjbwmss2ScGsIf0NjaU+MpSdEbB82z4b2NiN8Wq+ +rFA/JbvyeoWWHMoa7wkVs1MCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAYLRwV9fo +AOhJfeK199Tv6oXoNSSSe10pVLnYxPcczCVQ4b9SomKFJFbmwtPVGi6w3m+8mV7F +9I2WKyeBHzmzfW2utZNupVybxgzEjuFLOVytSPdsB+DcJomOi8W/Cf2Vk8Wykb/t +Ctr1gfOcI8rwEGKxm279spBs0u1snzoLyoimbMbiXbC82j1IiN3Jus08U07m/j7N +hRBCpeHjUHT3CRpvYyTRnt+AyBd8BiyJB7nWmcNI1DksXPfehd62MAFS9e1ZE+dH +Aavg/U8VpS7pcCQcPJvIJ2hehrt8L6kUk3YUYqZ0OeRZK27f2R5+wFlDF33esm3N +dCSsLJlXyqAQFg== +-----END CERTIFICATE----- diff --git a/labs/kurento-screenshare/keys/server.csr b/labs/kurento-screenshare/keys/server.csr new file mode 100644 index 0000000000000000000000000000000000000000..6615b130471ce23cf8d980df5a308694ed06695b --- /dev/null +++ b/labs/kurento-screenshare/keys/server.csr @@ -0,0 +1,16 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIICijCCAXICAQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUx +ITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAMJOyOHJ+rJWJEQ7P7kKoWa31ff7hKNZxF6sYE5l +Fi3pBYWIY6kTN/iUaxJLROFoFhoC/M/STY76rIryix474v/6cRoG8N+GQBEn4IAP +1UitWzVO6pVvBaIt5IKlhhfmYA1IMweCd03vLcaHTddNmFDBTks7QDwfenTaR5Vj +KYc3OtEhcG8dgLAnOjbbk2Hr8wter2IeNgkhya3zyoXnTLT8m8IMg2mQaJs62Xlo +9gs56urvVDWG4rhdGybj1uwUZiDYyP4CFCUHS6UVt12vADP8vjbwmss2ScGsIf0N +jaU+MpSdEbB82z4b2NiN8Wq+rFA/JbvyeoWWHMoa7wkVs1MCAwEAAaAAMA0GCSqG +SIb3DQEBCwUAA4IBAQBMszYHMpklgTF/3h1zAzKXUD9NrtZp8eWhL06nwVjQX8Ai +EaCUiW0ypstokWcH9+30chd2OD++67NbxYUEucH8HrKpOoy6gs5L/mqgQ9Npz3OT +TB1HI4kGtpVuUQ5D7L0596tKzMX/CgW/hRcHWl+PDkwGhQs1qZcJ8QN+YP6AkRrO +5sDdDB/BLrB9PtBQbPrYIQcHQ7ooYWz/G+goqRxzZ6rt0aU2uAB6l7c82ADLAqFJ +qlw+xqVzEETVfqM5TXKK/wV3hgm4oSX5Q4SHLKF94ODOkWcnV4nfIKz7y+5XcQ3p +PrGimI1br07okC5rO9cgLCR0Ks20PPFcM0FvInW/ +-----END CERTIFICATE REQUEST----- diff --git a/labs/kurento-screenshare/keys/server.key b/labs/kurento-screenshare/keys/server.key new file mode 100644 index 0000000000000000000000000000000000000000..a69a0a279daf6a68b9eff057204cd05af1b27a5a --- /dev/null +++ b/labs/kurento-screenshare/keys/server.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEogIBAAKCAQEAwk7I4cn6slYkRDs/uQqhZrfV9/uEo1nEXqxgTmUWLekFhYhj +qRM3+JRrEktE4WgWGgL8z9JNjvqsivKLHjvi//pxGgbw34ZAESfggA/VSK1bNU7q +lW8Foi3kgqWGF+ZgDUgzB4J3Te8txodN102YUMFOSztAPB96dNpHlWMphzc60SFw +bx2AsCc6NtuTYevzC16vYh42CSHJrfPKhedMtPybwgyDaZBomzrZeWj2Cznq6u9U +NYbiuF0bJuPW7BRmINjI/gIUJQdLpRW3Xa8AM/y+NvCayzZJwawh/Q2NpT4ylJ0R +sHzbPhvY2I3xar6sUD8lu/J6hZYcyhrvCRWzUwIDAQABAoIBACwt56TW3MZxqZtN +8WYsUZheUispJ/ZQMcLo5JjOiSV1Jwk+gpJtyTse291z+bxagzP02/CQu4u32UVa +cmE0cp+LHO4zB8964dREwdm8P91fdS6Au/uwG5LNZniCFCQZAFvkv52Ef4XbzQen +uf4rKWerHBck6K0C5z/sZXxE6KtScE2ZLUmkhO0nkHM6MA6gFk2OMnB+oDTOWWPt +1mlreQlzuMYG/D4axviRYrOSYCE5Qu1SOw/DEOLQqqeBjQrKtAyOlFHZsIR6lBfe +KHMChPUcYIwaowt2DcqH/A+AFXRtaifa6DvH8Yul+2vAp47UEpaenVfM5bpN33XV +EzerjtECgYEA+xiXzblek67iQgRpc9eHSoqs4iRLhae8s8kpAG51Jz46Je+Dmium +XV769oiUGUxBeoUb7ryW+4MOzHJaA1BfGejQSvwLIB9e4cnikqnAArcqbcAcOCL1 +aYYDiSmSmN/AokNZlPKEBFXP9bzXrU9smQJWNTHlcRl7JXfnwF+jwNsCgYEAxhpE +SBr9vlUVHNh/S6C5i80NIYg6jCy2FgsmuzEqmcqV0pTyzegmq8bru+QmuvoUj2o4 +nVv4J9d1fLF6ECUVk9aK8UdJOOB6hAfurOdJCArgrsY/9t4uDzXfbPCdfSNQITE0 +XgeNGQX1EzvwwkBmyZKk0kLIr3syP8ZCWfXDROkCgYBR+dF1pJMv++R6UR5sZ20P +9P5ERj0xwXVl7MKqFWXCDhrFz9BTQPTrftrIKgbPy4mFCnf4FTHlov/t11dzxYWG +2+9Ey8yGDDfZ1yNVZn39ZPdBJXsRCLi+XrZAzYXCyyoEz6ArdJGNKMbgH2r6dfeq +bIzgiQ2zQvJlZSQQNiksCQKBgCgwzAmU8EXdHRttEOZXBU3HnBJhgP9PUuHGAWWY +4/uvjhXbAiekIbRX9xt3fiQQ+HrgIfxK3F246K0TlKAR5f7IWAf7Xm+bmz+OHG4X +vklTa6IJtpBvIwkS9PE1H75zm54gTW+GOKoK+12bm4zNZA0hIy9FPVHcvKUTpAJ8 +SdGBAoGAHLtJnB1NO4EgO6WtLQMXt7HrIbup8eZi8/82gC3422C+ooKIrYQ07qSw +nBOO/G0OB4yd6vCE2x5+TWSSCYGgG5A8aIv5qP76RP4hovGHxG/y2tfotw5UuOrh +nFWlTP4Urs8PeykvK9ao8r/T8BnPIC16U6ENYvAc0mRlFA2j1GA= +-----END RSA PRIVATE KEY----- diff --git a/labs/kurento-screenshare/lib/ConnectionManager.js b/labs/kurento-screenshare/lib/ConnectionManager.js new file mode 100644 index 0000000000000000000000000000000000000000..d44a52a72911b40a70a24eded7ddeb2f744ae9f2 --- /dev/null +++ b/labs/kurento-screenshare/lib/ConnectionManager.js @@ -0,0 +1,204 @@ +/* + * Lucas Fialho Zawacki + * Paulo Renato Lanzarin + * (C) Copyright 2017 Bigbluebutton + * + */ + +'use strict' + +const cookieParser = require('cookie-parser') +const express = require('express'); +const session = require('express-session') +const wsModule = require('./websocket'); +const http = require('http'); +const fs = require('fs'); +const BigBlueButtonGW = require('./bbb/pubsub/bbb-gw'); +var Screenshare = require('./screenshare'); +var C = require('./bbb/messages/Constants'); + +// Global variables + +module.exports = class ConnectionManager { + + constructor (settings, logger) { + this._logger = logger; + this._clientId = 0; + this._app = express(); + this._sessions = {}; + + this._setupExpressSession(); + this._setupHttpServer(); + } + + _setupExpressSession() { + this._app.use(cookieParser()); + + this._sessionHandler = session({ + secret : 'Shawarma', rolling : true, resave : true, saveUninitialized : true + }); + + this._app.use(this._sessionHandler); + } + + _setupHttpServer() { + let self = this; + /* + * Server startup + */ + this._httpServer = http.createServer(this._app).listen(3008, function() { + console.log(' [*] Running node-apps connection manager.'); + }); + + /* + * Management of sessions + */ + this._wss = new wsModule.Server({ + server : this._httpServer, + path : '/kurento-screenshare' + }); + + + // TODO isolate this + this._bbbGW = new BigBlueButtonGW(); + + this._bbbGW.addSubscribeChannel(C.FROM_BBB_TRANSCODE_SYSTEM_CHAN, function(error, redisWrapper) { + if(error) { + console.log(' Could not connect to transcoder redis channel, finishing app...'); + self._stopAll(); + } + console.log(' [server] Successfully subscribed to redis channel'); + }); + + + this._wss.on('connection', self._onNewConnection.bind(self)); + } + + _onNewConnection(webSocket) { + let self = this; + let sessionId; + let request = webSocket.upgradeReq; + let response = { + writeHead : {} + }; + + self._sessionHandler(request, response, function(err) { + sessionId = request.session.id + "_" + self.clientId++; + if (!self._sessions[sessionId]) { + self._sessions[sessionId] = {}; + } + + console.log('Connection received with sessionId ' + sessionId); + }); + + webSocket.on('error', function(error) { + console.log('Connection ' + sessionId + ' error'); + // stop(sessionId); + }); + + webSocket.on('close', function() { + console.log('Connection ' + sessionId + ' closed'); + self._stopSession(sessionId); + }); + + webSocket.on('message', function(_message) { + let message = JSON.parse(_message); + + let session; + + if (message.presenterId && self._sessions[sessionId][message.presenterId]) { + session = self._sessions[sessionId][message.presenterId]; + } + + switch (message.id) { + + case 'presenter': + console.log('Presenter message => [' + message.id + '] connection [' + sessionId + '][' + message.presenterId + '][' + message.voiceBridge + '][' + message.callerName + ']'); + + session = new Screenshare(webSocket, message.presenterId, self._bbbGW, message.voiceBridge, message.callerName, message.vh, message.vw); + + //session.on('message', self._assembleSessionMessage.bind(self)); + + self._sessions[sessionId][message.presenterId] = session; + + // starts presenter by sending sessionID, websocket and sdpoffer + session._startPresenter(sessionId, webSocket, message.sdpOffer, function(error, sdpAnswer) { + console.log(" Started presenter " + sessionId); + if (error) { + return webSocket.send(JSON.stringify({ + id : 'presenterResponse', + response : 'rejected', + message : error + })); + } + + webSocket.send(JSON.stringify({ + id : 'presenterResponse', + response : 'accepted', + sdpAnswer : sdpAnswer + })); + console.log(" [websocket] Sending presenterResponse \n" + sdpAnswer); + }); + break; + + case 'viewer': + console.log('Viewer message => [' + message.id + '] connection [' + sessionId + '][' + message.presenterId + '][' + message.voiceBridge + '][' + message.callerName + ']'); + + break; + case 'stop': + + console.log('[' + message.id + '] connection ' + sessionId); + + if (session) { + session._stop(sessionId); + } else { + console.log(" [stop] Why is there no session on STOP?"); + } + break; + + case 'onIceCandidate': + if (session) { + session._onIceCandidate(message.candidate); + } else { + console.log(" [iceCandidate] Why is there no session on ICE CANDIDATE?"); + } + break; + + case 'ping': + webSocket.send(JSON.stringify({ + id : 'pong', + response : 'accepted' + })); + break; + + default: + webSocket.sendMessage({ id : 'error', message : 'Invalid message ' + message }); + break; + } + }); + } + + _stopSession(sessionId) { + console.log(' [>] Stopping session ' + sessionId); + let sessionIds = Object.keys(this._sessions[sessionId]); + + for (let i = 0; i < sessionIds.length; i++) { + let session = this._sessions[sessionId][sessionIds[i]]; + session._stop(); + delete this._sessions[sessionId][sessionIds[i]]; + } + + delete this._sessions[sessionId]; + } + + _stopAll() { + console.log('\n [x] Stopping everything! '); + let sessionIds = Object.keys(this._sessions); + + for (let i = 0; i < sessionIds.length; i++) { + this._stopSession(sessionIds[i]); + } + + setTimeout(process.exit, 1000); + } + } diff --git a/labs/kurento-screenshare/lib/bbb/messages/Constants.js b/labs/kurento-screenshare/lib/bbb/messages/Constants.js new file mode 100644 index 0000000000000000000000000000000000000000..5722e20295293b81b965cf55ff7c826ecc5c509e --- /dev/null +++ b/labs/kurento-screenshare/lib/bbb/messages/Constants.js @@ -0,0 +1,82 @@ +"use strict"; +/** + * @classdesc + * Message constants for the communication with BigBlueButton + * @constructor + */ + function Constants () { + return { + // Media elements + WebRTC: "WebRtcEndpoint", + RTP: "RtpEndpoint", + AUDIO: "AUDIO", + VIDEO: "VIDEO", + ALL: "ALL", + + // Redis channels + FROM_BBB_TRANSCODE_SYSTEM_CHAN : "bigbluebutton:from-bbb-transcode:system", + FROM_VOICE_CONF_SYSTEM_CHAN: "from-voice-conf-redis-channel", + TO_BBB_TRANSCODE_SYSTEM_CHAN: "bigbluebutton:to-bbb-transcode:system", + + // RedisWrapper events + REDIS_MESSAGE : "redis_message", + + // Message identifiers 1x + START_TRANSCODER_REQUEST: "start_transcoder_request_message", + START_TRANSCODER_REPLY: "start_transcoder_reply_message", + STOP_TRANSCODER_REQUEST: "stop_transcoder_request_message", + STOP_TRANSCODER_REPLY: "stop_transcoder_reply_message", + DESKSHARE_RTMP_BROADCAST_STARTED: "deskshare_rtmp_broadcast_started_message", + DESKSHARE_RTMP_BROADCAST_STOPPED: "deskshare_rtmp_broadcast_stopped_message", + + //Message identifiers 2x + SCREENSHARE_RTMP_BROADCAST_STARTED_2x: "ScreenshareRtmpBroadcastStartedVoiceConfEvtMsg", + SCREENSHARE_RTMP_BROADCAST_STOPPED_2x: "ScreenshareRtmpBroadcastStoppedVoiceConfEvtMsg", + + // Redis messages fields + // Transcoder + USER_ID : "user_id", + OPTIONS: "options", + VOICE_CONF_ID : "voice_conf_id", + TRANSCODER_ID : "transcoder_id", + + // Screenshare + CONFERENCE_NAME: "voiceConf", + SCREENSHARE_CONF: "screenshareConf", + STREAM_URL: "stream", + TIMESTAMP: "timestamp", + VIDEO_WIDTH: "vidWidth", + VIDEO_HEIGHT: "vidHeight", + + // RTP params + MEETING_ID : "meeting_id", + VOICE_CONF : "voice_conf", + KURENTO_ENDPOINT_ID : "kurento_endpoint_id", + PARAMS : "params", + MEDIA_DESCRIPTION: "media_description", + LOCAL_IP_ADDRESS: "local_ip_address", + LOCAL_VIDEO_PORT: "local_video_port", + DESTINATION_IP_ADDRESS : "destination_ip_address", + DESTINATION_VIDEO_PORT : "destination_video_port", + REMOTE_VIDEO_PORT : "remote_video_port", + CODEC_NAME: "codec_name", + CODEC_ID: "codec_id", + CODEC_RATE: "codec_rate", + RTP_PROFILE: "rtp_profile", + SEND_RECEIVE: "send_receive", + FRAME_RATE: "frame_rate", + INPUT: "input", + KURENTO_TOKEN : "kurento_token", + SCREENSHARE: "deskShare", + STREAM_TYPE: "stream_type", + STREAM_TYPE_SCREENSHARE: "stream_type_deskshare", + STREAM_TYPE_VIDEO: "stream_type_video", + RTP_TO_RTMP: "transcode_rtp_to_rtmp", + TRANSCODER_CODEC: "codec", + TRANSCODER_TYPE: "transcoder_type", + CALLERNAME: "callername" + } +} + +module.exports = Constants(); + diff --git a/labs/kurento-screenshare/lib/bbb/messages/Messaging.js b/labs/kurento-screenshare/lib/bbb/messages/Messaging.js new file mode 100644 index 0000000000000000000000000000000000000000..b590a066d4856bbe397512b1a1c7b65053127d42 --- /dev/null +++ b/labs/kurento-screenshare/lib/bbb/messages/Messaging.js @@ -0,0 +1,65 @@ +var Constants = require('./Constants.js'); + +// Messages + +var OutMessage = require('./OutMessage.js'); + +var StartTranscoderRequestMessage = + require('./transcode/StartTranscoderRequestMessage.js')(Constants); +var StopTranscoderRequestMessage = + require('./transcode/StopTranscoderRequestMessage.js')(Constants); +var DeskShareRTMPBroadcastStartedEventMessage = + require('./screenshare/DeskShareRTMPBroadcastStartedEventMessage.js')(Constants); +var DeskShareRTMPBroadcastStoppedEventMessage = + require('./screenshare/DeskShareRTMPBroadcastStoppedEventMessage.js')(Constants); +var ScreenshareRTMPBroadcastStartedEventMessage2x = + require('./screenshare/ScreenshareRTMPBroadcastStartedEventMessage2x.js')(Constants); +var ScreenshareRTMPBroadcastStoppedEventMessage2x = + require('./screenshare/ScreenshareRTMPBroadcastStoppedEventMessage2x.js')(Constants); + + + /** + * @classdesc + * Messaging utils to assemble JSON/Redis BigBlueButton messages + * @constructor + */ +function Messaging() {} + +Messaging.prototype.generateStartTranscoderRequestMessage = + function(meetingId, transcoderId, params) { + var statrm = new StartTranscoderRequestMessage(meetingId, transcoderId, params); + return statrm.toJson(); +} + +Messaging.prototype.generateStopTranscoderRequestMessage = + function(meetingId, transcoderId) { + var stotrm = new StopTranscoderRequestMessage(meetingId, transcoderId); + return stotrm.toJson(); +} + +Messaging.prototype.generateDeskShareRTMPBroadcastStartedEvent = + function(conferenceName, streamUrl, vw, vh, timestamp) { + var stadrbem = new DeskShareRTMPBroadcastStartedEventMessage(conferenceName, streamUrl, vw, vh, timestamp); + return stadrbem.toJson(); +} + +Messaging.prototype.generateDeskShareRTMPBroadcastStoppedEvent = + function(conferenceName, streamUrl, vw, vh, timestamp) { + var stodrbem = new DeskShareRTMPBroadcastStoppedEventMessage(conferenceName, streamUrl, vw, vh, timestamp); + return stodrbem.toJson(); +} + +Messaging.prototype.generateScreenshareRTMPBroadcastStartedEvent2x = + function(conferenceName, screenshareConf, streamUrl, vw, vh, timestamp) { + var stadrbem = new ScreenshareRTMPBroadcastStartedEventMessage2x(conferenceName, screenshareConf, streamUrl, vw, vh, timestamp); + return stadrbem.toJson(); +} + +Messaging.prototype.generateScreenshareRTMPBroadcastStoppedEvent2x = + function(conferenceName, screenshareConf, streamUrl, vw, vh, timestamp) { + var stodrbem = new ScreenshareRTMPBroadcastStoppedEventMessage2x(conferenceName, screenshareConf, streamUrl, vw, vh, timestamp); + return stodrbem.toJson(); +} + +module.exports = new Messaging(); +module.exports.Constants = Constants; diff --git a/labs/kurento-screenshare/lib/bbb/messages/OutMessage.js b/labs/kurento-screenshare/lib/bbb/messages/OutMessage.js new file mode 100644 index 0000000000000000000000000000000000000000..04776dca76e6513f20259b2a47c339f2c175c5e3 --- /dev/null +++ b/labs/kurento-screenshare/lib/bbb/messages/OutMessage.js @@ -0,0 +1,35 @@ +/* + * (C) Copyright 2016 Mconf Tecnologia (http://mconf.com/) + */ + +/** + * @classdesc + * Base class for output messages sent to BBB + * @constructor + */ +function OutMessage(messageName) { + /** + * The header template of the message + * @type {Object} + */ + this.header = { + version: "0.0.1", + name: messageName + }; + + /** + * The payload of the message + * @type {Object} + */ + this.payload = null; + + /** + * Generates the JSON representation of the message + * @return {String} The JSON string of this message + */ + this.toJson = function () { + return JSON.stringify(this); + } +}; + +module.exports = OutMessage; diff --git a/labs/kurento-screenshare/lib/bbb/messages/OutMessage2x.js b/labs/kurento-screenshare/lib/bbb/messages/OutMessage2x.js new file mode 100644 index 0000000000000000000000000000000000000000..a6f9cafcfcd289d2ef95334743fb5c32f63bd8f6 --- /dev/null +++ b/labs/kurento-screenshare/lib/bbb/messages/OutMessage2x.js @@ -0,0 +1,52 @@ +/* + * (C) Copyright 2016 Mconf Tecnologia (http://mconf.com/) + */ + +/** + * @classdesc + * Base class for output messages sent to BBB + * 2x model + * @constructor + */ +function OutMessage2x(messageName, routing, headerFields) { + + + this.envelope = { + name: messageName, + routing: routing + } + /** + * The header template of the message + * @type {Object} + */ + this.core = { + header : { + name: messageName + } + } + + // Copy header fiels to the header object + var keys1 = Object.keys(headerFields); + for (var k=0; k < keys1.length; k++) { + var key = keys1[k]; + if (typeof this.core.header[key] === 'undefined') { + this.core.header[key] = headerFields[key]; + } + } + + /** + * The body of the message + * @type {Object} + */ + this.core.body = null; + + /** + * Generates the JSON representation of the message + * @return {String} The JSON string of this message + */ + this.toJson = function () { + return JSON.stringify(this); + } +}; + +module.exports = OutMessage2x; diff --git a/labs/kurento-screenshare/lib/bbb/messages/screenshare/DeskShareRTMPBroadcastStartedEventMessage.js b/labs/kurento-screenshare/lib/bbb/messages/screenshare/DeskShareRTMPBroadcastStartedEventMessage.js new file mode 100644 index 0000000000000000000000000000000000000000..34579de0bfa0854f7170d1e92efc7cb818b2cbee --- /dev/null +++ b/labs/kurento-screenshare/lib/bbb/messages/screenshare/DeskShareRTMPBroadcastStartedEventMessage.js @@ -0,0 +1,22 @@ +/* + * + */ + +var inherits = require('inherits'); +var OutMessage = require('../OutMessage'); + +module.exports = function (Constants) { + function DeskShareRTMPBroadcastStartedEventMessage (conferenceName, streamUrl, vw, vh, timestamp) { + DeskShareRTMPBroadcastStartedEventMessage.super_.call(this, Constants.DESKSHARE_RTMP_BROADCAST_STARTED); + + this.payload = {}; + this.payload[Constants.CONFERENCE_NAME] = conferenceName; + this.payload[Constants.STREAM_URL] = streamUrl; + this.payload[Constants.TIMESTAMP] = timestamp; + this.payload[Constants.VIDEO_WIDTH] = vw; + this.payload[Constants.VIDEO_HEIGHT] = vh; + }; + + inherits(DeskShareRTMPBroadcastStartedEventMessage, OutMessage); + return DeskShareRTMPBroadcastStartedEventMessage; +} diff --git a/labs/kurento-screenshare/lib/bbb/messages/screenshare/DeskShareRTMPBroadcastStoppedEventMessage.js b/labs/kurento-screenshare/lib/bbb/messages/screenshare/DeskShareRTMPBroadcastStoppedEventMessage.js new file mode 100644 index 0000000000000000000000000000000000000000..81e7125db7f9d7b61580f4dad93076387b6c8426 --- /dev/null +++ b/labs/kurento-screenshare/lib/bbb/messages/screenshare/DeskShareRTMPBroadcastStoppedEventMessage.js @@ -0,0 +1,22 @@ +/* + * + */ + +var inherits = require('inherits'); +var OutMessage = require('../OutMessage'); + +module.exports = function (Constants) { + function DeskShareRTMPBroadcastStoppedEventMessage (conferenceName, streamUrl, vw, vh, timestamp) { + DeskShareRTMPBroadcastStoppedEventMessage.super_.call(this, Constants.DESKSHARE_RTMP_BROADCAST_STOPPED); + + this.payload = {}; + this.payload[Constants.CONFERENCE_NAME] = conferenceName; + this.payload[Constants.STREAM_URL] = streamUrl; + this.payload[Constants.TIMESTAMP] = timestamp; + this.payload[Constants.VIDEO_WIDTH] = vw; + this.payload[Constants.VIDEO_HEIGHT] = vh; + }; + + inherits(DeskShareRTMPBroadcastStoppedEventMessage, OutMessage); + return DeskShareRTMPBroadcastStoppedEventMessage; +} diff --git a/labs/kurento-screenshare/lib/bbb/messages/screenshare/ScreenshareRTMPBroadcastStartedEventMessage2x.js b/labs/kurento-screenshare/lib/bbb/messages/screenshare/ScreenshareRTMPBroadcastStartedEventMessage2x.js new file mode 100644 index 0000000000000000000000000000000000000000..28867a2265f3a1d6393ebadc4936cc785e0be651 --- /dev/null +++ b/labs/kurento-screenshare/lib/bbb/messages/screenshare/ScreenshareRTMPBroadcastStartedEventMessage2x.js @@ -0,0 +1,25 @@ +/* + * + */ + +var inherits = require('inherits'); +var OutMessage2x = require('../OutMessage2x'); + +module.exports = function (C) { + function ScreenshareRTMPBroadcastStartedEventMessage2x (conferenceName, screenshareConf, + streamUrl, vw, vh, timestamp) { + ScreenshareRTMPBroadcastStartedEventMessage2x.super_.call(this, C.SCREENSHARE_RTMP_BROADCAST_STARTED_2x, + {voiceConf: conferenceName}, {voiceConf: conferenceName}); + + this.core.body = {}; + this.core.body[C.CONFERENCE_NAME] = conferenceName; + this.core.body[C.SCREENSHARE_CONF] = screenshareConf; + this.core.body[C.STREAM_URL] = streamUrl; + this.core.body[C.VIDEO_WIDTH] = vw; + this.core.body[C.VIDEO_HEIGHT] = vh; + this.core.body[C.TIMESTAMP] = timestamp; + }; + + inherits(ScreenshareRTMPBroadcastStartedEventMessage2x, OutMessage2x); + return ScreenshareRTMPBroadcastStartedEventMessage2x; +} diff --git a/labs/kurento-screenshare/lib/bbb/messages/screenshare/ScreenshareRTMPBroadcastStoppedEventMessage2x.js b/labs/kurento-screenshare/lib/bbb/messages/screenshare/ScreenshareRTMPBroadcastStoppedEventMessage2x.js new file mode 100644 index 0000000000000000000000000000000000000000..d02dfb2cd3a335518cf5a207880cbb4b17e8cf64 --- /dev/null +++ b/labs/kurento-screenshare/lib/bbb/messages/screenshare/ScreenshareRTMPBroadcastStoppedEventMessage2x.js @@ -0,0 +1,25 @@ +/* + * + */ + +var inherits = require('inherits'); +var OutMessage2x = require('../OutMessage2x'); + +module.exports = function (C) { + function ScreenshareRTMPBroadcastStoppedEventMessage2x (conferenceName, screenshareConf, + streamUrl, vw, vh, timestamp) { + ScreenshareRTMPBroadcastStoppedEventMessage2x.super_.call(this, C.SCREENSHARE_RTMP_BROADCAST_STOPPED_2x, + {voiceConf: conferenceName}, {voiceConf: conferenceName}); + + this.core.body = {}; + this.core.body[C.CONFERENCE_NAME] = conferenceName; + this.core.body[C.SCREENSHARE_CONF] = screenshareConf; + this.core.body[C.STREAM_URL] = streamUrl; + this.core.body[C.VIDEO_WIDTH] = vw; + this.core.body[C.VIDEO_HEIGHT] = vh; + this.core.body[C.TIMESTAMP] = timestamp; + }; + + inherits(ScreenshareRTMPBroadcastStoppedEventMessage2x, OutMessage2x); + return ScreenshareRTMPBroadcastStoppedEventMessage2x; +} diff --git a/labs/kurento-screenshare/lib/bbb/messages/transcode/StartTranscoderRequestMessage.js b/labs/kurento-screenshare/lib/bbb/messages/transcode/StartTranscoderRequestMessage.js new file mode 100644 index 0000000000000000000000000000000000000000..69d5f0890f7c38d94a62e99e41cd7672ba8269fe --- /dev/null +++ b/labs/kurento-screenshare/lib/bbb/messages/transcode/StartTranscoderRequestMessage.js @@ -0,0 +1,20 @@ +/* + * + */ + +var inherits = require('inherits'); +var OutMessage = require('../OutMessage'); + +module.exports = function (Constants) { + function StartTranscoderRequestMessage (meetingId, transcoderId, params) { + StartTranscoderRequestMessage.super_.call(this, Constants.START_TRANSCODER_REQUEST); + + this.payload = {}; + this.payload[Constants.MEETING_ID] = meetingId; + this.payload[Constants.TRANSCODER_ID] = transcoderId; + this.payload[Constants.PARAMS] = params; + }; + + inherits(StartTranscoderRequestMessage, OutMessage); + return StartTranscoderRequestMessage; +} diff --git a/labs/kurento-screenshare/lib/bbb/messages/transcode/StopTranscoderRequestMessage.js b/labs/kurento-screenshare/lib/bbb/messages/transcode/StopTranscoderRequestMessage.js new file mode 100644 index 0000000000000000000000000000000000000000..ad030d2c623252d385c8298bdf79c112caf12623 --- /dev/null +++ b/labs/kurento-screenshare/lib/bbb/messages/transcode/StopTranscoderRequestMessage.js @@ -0,0 +1,15 @@ +var inherits = require('inherits'); +var OutMessage = require('../OutMessage'); + +module.exports = function (Constants) { + function StopTranscoderRequestMessage (meetingId, transcoderId) { + StopTranscoderRequestMessage.super_.call(this, Constants.STOP_TRANSCODER_REQUEST); + + this.payload = {}; + this.payload[Constants.MEETING_ID] = meetingId; + this.payload[Constants.TRANSCODER_ID] = transcoderId; + }; + + inherits(StopTranscoderRequestMessage, OutMessage); + return StopTranscoderRequestMessage; +} diff --git a/labs/kurento-screenshare/lib/bbb/pubsub/RedisWrapper.js b/labs/kurento-screenshare/lib/bbb/pubsub/RedisWrapper.js new file mode 100644 index 0000000000000000000000000000000000000000..da92167e4169e8a03ee3d3cb3e03b78405c1049f --- /dev/null +++ b/labs/kurento-screenshare/lib/bbb/pubsub/RedisWrapper.js @@ -0,0 +1,97 @@ +/** + * @classdesc + * Redis wrapper class for connecting to Redis channels + */ + +/* Modules */ + +var redis = require('redis'); +var config = require('config'); +var Constants = require('../messages/Constants.js'); +var util = require('util'); +const EventEmitter = require('events').EventEmitter; +const _retryThreshold = 1000 * 60 * 60; +const _maxRetries = 10; + + +/* Public members */ + +var RedisWrapper = function(subpattern) { + // Redis PubSub client holders + this.redisCli = null; + this.redisPub = null; + // Pub and Sub channels/patterns + this.subpattern = subpattern; + EventEmitter.call(this); +} + +util.inherits(RedisWrapper, EventEmitter); + +RedisWrapper.prototype.startRedis = function(callback) { + var self = this; + if (this.redisCli) { + console.log(" [RedisWrapper] Redis Client already exists"); + callback(false, this); + } + + var options = { + host : config.get('redisHost'), + port : config.get('redisPort'), + //password: config.get('redis.password') + retry_strategy: redisRetry + }; + + this.redisCli = redis.createClient(options); + this.redisPub = redis.createClient(options); + + console.log(" [RedisWrapper] Trying to subscribe to redis channel"); + + this.redisCli.on("psubscribe", function (channel, count) { + console.log(" [RedisWrapper] Successfully subscribed to pattern [" + channel + "]"); + }); + + this.redisCli.on("pmessage", self.onMessage.bind(self)); + this.redisCli.psubscribe(this.subpattern); + + console.log(" [RedisWrapper] Started Redis client at " + options.host + ":" + options.port + + " for subscription pattern: " + this.subpattern); + + callback(false, this); +}; + +RedisWrapper.prototype.stopRedis = function(callback) { + if (this.redisCli){ + this.redisCli.quit(); + } + callback(false); +}; + +RedisWrapper.prototype.publishToChannel = function(message, channel) { + if(this.redisPub) { + console.log(" [RedisWrapper] Sending message to channel [" + channel + "]: " + message); + this.redisPub.publish(channel, message); + } +}; + +RedisWrapper.prototype.onMessage = function(pattern, channel, message) { + console.log(" [RedisWrapper] Message received from channel [" + channel + "] : " + message); + // use event emitter to throw new message + this.emit(Constants.REDIS_MESSAGE, message); +} + +/* Private members */ + +function redisRetry(options) { + if (options.error && options.error.code === 'ECONNREFUSED') { + return new Error('The server refused the connection'); + } + if (options.total_retry_time > _retryThreshold) { + return new Error('Retry time exhausted'); + } + if (options.times_connected > _maxRetries) { + return undefined; + } + return Math.max(options.attempt * 100, 3000); +}; + +module.exports = RedisWrapper; diff --git a/labs/kurento-screenshare/lib/bbb/pubsub/bbb-gw.js b/labs/kurento-screenshare/lib/bbb/pubsub/bbb-gw.js new file mode 100644 index 0000000000000000000000000000000000000000..51d7ac65bf27a1ba6635de502ab18af3f2e3c56b --- /dev/null +++ b/labs/kurento-screenshare/lib/bbb/pubsub/bbb-gw.js @@ -0,0 +1,84 @@ +/** + * @classdesc + * BigBlueButton redis gateway for bbb-screenshare node app + */ + +/* Modules */ + +var Constants = require('../messages/Constants.js'); +var RedisWrapper = require('./RedisWrapper.js'); +var config = require('config'); +var util = require('util'); +var EventEmitter = require('events').EventEmitter; + +/* Public members */ + +var BigBlueButtonGW = function () { + this.redisClients = null + EventEmitter.call(this); +}; + +util.inherits(BigBlueButtonGW, EventEmitter); + +BigBlueButtonGW.prototype.addSubscribeChannel = function (channel, callback) { + var self = this; + + if (this.redisClients === null) { + this.redisClients = {}; + } + + if (this.redisClients[channel]) { + return callback(null, this.redisClients[channel]); + } + + var wrobj = new RedisWrapper(channel); + this.redisClients[channel] = {}; + this.redisClients[channel] = wrobj; + wrobj.startRedis(function(error, redisCli) { + if(error) { + console.log(" [BigBlueButtonGW] Could not start redis client for channel " + channel); + return callback(error); + } + + console.log(" [BigBlueButtonGW] Added redis client to this.redisClients[" + channel + "]"); + wrobj.on(Constants.REDIS_MESSAGE, self.incomingMessage.bind(self)); + + return callback(null, wrobj); + }); +}; + +/** + * Capture messages from subscribed channels and emit an event with it's + * identifier and payload. Check Constants.js for the identifiers. + * + * @param {Object} message Redis message + */ +BigBlueButtonGW.prototype.incomingMessage = function (message) { + var msg = JSON.parse(message); + var header = msg.header; + var payload = msg.payload; + if (header){ + switch (header.name) { + case Constants.START_TRANSCODER_REPLY: + this.emit(Constants.START_TRANSCODER_REPLY, payload); + break; + case Constants.STOP_TRANSCODER_REPLY: + this.emit(Constants.STOP_TRANSCODER_REPLY, payload); + break; + default: + console.log(" [BigBlueButtonGW] Unknown Redis message with ID =>" + header.name); + } + } +}; + +BigBlueButtonGW.prototype.publish = function (message, channel, callback) { + for(var client in this.redisClients) { + if(typeof this.redisClients[client].publishToChannel === 'function') { + this.redisClients[client].publishToChannel(message, channel); + return callback(null); + } + } + return callback("Client not found"); +}; + +module.exports = BigBlueButtonGW; diff --git a/labs/kurento-screenshare/lib/h264-sdp.js b/labs/kurento-screenshare/lib/h264-sdp.js new file mode 100644 index 0000000000000000000000000000000000000000..8da8f6d525858749e22f22428680c9985a908f2b --- /dev/null +++ b/labs/kurento-screenshare/lib/h264-sdp.js @@ -0,0 +1,56 @@ +/* + * A module with the sole purpose of removing all non h264 options from an sdpOffer + * + * We use this to prevent any transcoding from the Kurento side if Firefox or Chrome offer VP8/VP9 as + * the default format. + */ + +var sdpTransform = require('sdp-transform'); + +exports.transform = function(sdp) { + + var mediaIndex = 0; + var res = sdpTransform.parse(sdp); + var validPayloads; + + if (res.media[0].type === 'audio') { + // Audio + res.media[mediaIndex].rtp = res.media[mediaIndex].rtp.filter(function(elem) { + return elem.codec === 'opus'; + }); + + validPayloads = res.media[mediaIndex].rtp.map(function(elem) { + return elem.payload; + }); + + res.media[mediaIndex].fmtp = res.media[mediaIndex].fmtp.filter(function(elem) { + return validPayloads.indexOf(elem.payload) >= 0; + }); + + res.media[mediaIndex].payloads = validPayloads.join(' '); + + mediaIndex += 1; + } + + // Video + res.media[mediaIndex].rtp = res.media[mediaIndex].rtp.filter(function(elem) { + return elem.codec === 'H264'; + }); + + validPayloads = res.media[mediaIndex].rtp.map(function(elem) { + return elem.payload; + }); + + res.media[mediaIndex].fmtp = res.media[mediaIndex].fmtp.filter(function(elem) { + return validPayloads.indexOf(elem.payload) >= 0; + }); + + res.media[mediaIndex].rtcpFb = res.media[mediaIndex].rtcpFb.filter(function(elem) { + return validPayloads.indexOf(elem.payload) >= 0; + }); + + res.media[mediaIndex].payloads = validPayloads.join(' '); + + return sdpTransform.write(res); +}; + diff --git a/labs/kurento-screenshare/lib/media-controller.js b/labs/kurento-screenshare/lib/media-controller.js new file mode 100644 index 0000000000000000000000000000000000000000..df9697ec6984deb5f425fbb7c210fba4b6ce62e6 --- /dev/null +++ b/labs/kurento-screenshare/lib/media-controller.js @@ -0,0 +1,141 @@ +'use strict' + +const Constants = require('./bbb/messages/Constants.js'); +const config = require('config'); +const kurento = require('kurento-client'); +const mediaServerClient = null; + +var _mediaPipelines = {}; +var _mediaElements= {}; + +function createMediaPipeline(id, callback) { + console.log(' [media] Creating media pipeline for ' + id); + getMediaServerClient(function (error, mediaServerClient) { + mediaServerClient.create('MediaPipeline', function(err, pipeline) { + if (error) { + console.log("Could not find media server at address " + kurentoUrl); + return callback(error); + } + return callback(null , pipeline); + }); + }); +}; + +function getMediaServerClient (callback) { + let kurentoUrl = config.get('kurentoUrl'); + if (mediaServerClient) { + callback(null, mediaServerClient); + } + else { + kurento(kurentoUrl, function(error, _mediaServerClient) { + if (error) { + console.log("Could not find media server at address " + kurentoUrl); + return callback(error, null); + } + + console.log(" [server] Initiating kurento client. Connecting to: " + kurentoUrl); + return callback(null, _mediaServerClient); + }); + } +}; + +/* Public members */ +module.exports = { + + createMediaElement : function (conference, type, callback) { + let self = this; + self.getMediaPipeline(conference, function(error, pipeline) { + + pipeline.create(type, function(error, mediaElement) { + if (error) { + return callback(error, null); + } + console.log(" [MediaController] Created [" + type + "] media element: " + mediaElement.id); + _mediaElements[mediaElement.id] = mediaElement; + return callback(null, mediaElement); + }); + }); + }, + + connectMediaElements : function (sourceId, sinkId, type, callback) { + let source = _mediaElements[sourceId]; + let sink = _mediaElements[sinkId]; + + if (source && sink) { + if (type === 'ALL') { + source.connect(sink, function (error) { + return callback (error); + }); + } else { + console.log(typeof source.connect); + source.connect(sink, type, function (error) { + return callback (error); + }); + } + } else { + return callback ("Failed to connect " + type + ": " + sourceId + " to " + sinkId); + } + }, + + releaseMediaElement : function (elementId) { + let mediaElement = _mediaElements[elementId]; + + if (typeof mediaElement !== 'undefined' && typeof mediaElement.release === 'function') { + mediaElement.release(); + } + }, + + releasePipeline: function (pipelineId) { + let MediaPipeline = _mediaPipelines[pipelineId]; + + if (typeof mediaElement !== 'undefined' && typeof mediaElement.release === 'function') { + mediaElement.release(); + } + }, + + processOffer : function (elementId, sdpOffer, callback) { + let mediaElement = _mediaElements[elementId]; + + if (typeof mediaElement !== 'undefined' && typeof mediaElement.processOffer === 'function') { + mediaElement.processOffer (sdpOffer, function (error, sdpAnswer) { + return callback (error, sdpAnswer); + }); + } else { + return callback (" [MediaController/processOffer] There is no element " + elementId, null); + } + }, + + getMediaPipeline : function(conference, callback) { + let self = this; + + if (_mediaPipelines[conference]) { + console.log(' [media] Pipeline already exists. ' + JSON.stringify(_mediaPipelines, null, 2)); + return callback(null, _mediaPipelines[conference]); + } else { + createMediaPipeline(conference, function(error, pipeline) { + _mediaPipelines[conference] = pipeline; + return callback(error, pipeline); + }); + } + }, + + addIceCandidate : function (elementId, candidate) { + let mediaElement = _mediaElements[elementId]; + + if (typeof mediaElement !== 'undefined' && typeof mediaElement.addIceCandidate === 'function') { + mediaElement.addIceCandidate(candidate); + } + }, + + gatherCandidates : function (elementId, callback) { + let mediaElement = _mediaElements[elementId]; + + if (typeof mediaElement !== 'undefined' && typeof mediaElement.gatherCandidates === 'function') { + mediaElement.gatherCandidates(function (error) { + return callback(error); + }); + } else { + return callback (" [MediaController/gatherCandidates] There is no element " + elementId, null); + } + }, +}; diff --git a/labs/kurento-screenshare/lib/media-handler.js b/labs/kurento-screenshare/lib/media-handler.js new file mode 100644 index 0000000000000000000000000000000000000000..2d1ab3815cb3d583be7a115c12ab6a1c6626fa92 --- /dev/null +++ b/labs/kurento-screenshare/lib/media-handler.js @@ -0,0 +1,99 @@ +var config = require('config'); +var kurento = require('kurento-client'); +var Constants = require('./bbb/messages/Constants'); + +var kurentoClient = null; +var mediaPipelines = {}; + +module.exports.getKurentoClient = function(kurentoUrl, callback) { + if (kurentoClient !== null) { + return callback(null, kurentoClient); + } + + kurento(kurentoUrl, function(error, _kurentoClient) { + if (error) { + console.log("Could not find media server at address " + kurentoUrl); + return callback("Could not find media server at address" + kurentoUrl + ". Exiting with error " + error); + } + + console.log(" [MediaHandler] Initiating kurento client. Connecting to: " + kurentoUrl); + + kurentoClient = _kurentoClient; + callback(null, kurentoClient); + }); +} + +module.exports.getMediaPipeline = function(id, callback) { + console.log(' [MediaHandler] Creating media pipeline for ' + id); + + if (mediaPipelines[id]) { + console.log(' [media] Pipeline already exists.'); + callback(null, mediaPipelines[id]); + } else { + kurentoClient.create('MediaPipeline', function(err, pipeline) { + mediaPipelines[id] = pipeline; + return callback(err, pipeline); + }); + } +} + +module.exports.generateSdp = function(remote_ip_address, remote_video_port) { + return "v=0\r\n" + + "o=- 0 0 IN IP4 " + remote_ip_address + "\r\n" + + "s=Kurento-SCREENSHARE\r\n" + + "c=IN IP4 " + remote_ip_address + "\r\n" + + "t=0 0\r\n" + + "m=video " + remote_video_port + " RTP/AVPF 96\r\n" + + "a=rtpmap:96 H264/90000\r\n" + + "a=ftmp:96\r\n"; +} + +module.exports.generateVideoSdp = function (sourceIpAddress, sourceVideoPort) { + return "v=0\r\n" + + "o=- 0 0 IN IP4 " + sourceIpAddress + "\r\n" + + "s=Kurento-SCREENSHARE\r\n" + + 'm=video ' + sourceVideoPort + ' ' + this.videoConfiguration.rtpProfile + ' ' + this.videoConfiguration.codecId + '\r\n' + + 'a=' + this.videoConfiguration.sendReceive + '\r\n' + + 'c=IN IP4 ' + sourceIpAddress + '\r\n' + + 'a=rtpmap:' + this.videoConfiguration.codecId + ' ' + this.videoConfiguration.codecName + '/' + this.videoConfiguration.codecRate + '\r\n' + + 'a=fmtp:' + this.videoConfiguration.codecId + '\r\n' + + 'a=rtcp-fb:' + this.videoConfiguration.codecId + ' ccm fir \r\n' + + 'a=rtcp-fb:' + this.videoConfiguration.codecId + ' nack \r\n' + + 'a=rtcp-fb:' + this.videoConfiguration.codecId + ' nack pli \r\n' + + 'a=rtcp-fb:' + this.videoConfiguration.codecId + ' goog-remb \r\n'; +}; + +module.exports.videoConfiguration = { + codecId: '96', + sendReceive: 'sendrecv', + rtpProfile: 'RTP/AVPF', + codecName: 'H264', + frameRate: '30.000000', + codecRate: '90000' +}; + +module.exports.generateStreamUrl = function (address, meeting, path) { + return "rtmp://" + address + "/video-broadcast/" + meeting + "/" + path; +} + +module.exports.generateTranscoderParams = function (localIp, destIp, sendPort, recvPort, input, streamType, transcoderType, codec, callername) { + var rtpParams = {}; + rtpParams[Constants.LOCAL_IP_ADDRESS] = localIp; + rtpParams[Constants.LOCAL_VIDEO_PORT] = sendPort; + rtpParams[Constants.DESTINATION_IP_ADDRESS] = destIp; + rtpParams[Constants.REMOTE_VIDEO_PORT] = recvPort; + rtpParams[Constants.INPUT] = input; + rtpParams[Constants.STREAM_TYPE] = streamType; + rtpParams[Constants.TRANSCODER_TYPE] = transcoderType; + rtpParams[Constants.TRANSCODER_CODEC] = codec; + rtpParams[Constants.CALLERNAME] = callername; + return rtpParams; +} + +module.exports.getPort = function (min_port, max_port) { + return Math.floor((Math.random() * (max_port - min_port + 1) + min_port)); +} + +module.exports.getVideoPort = function () { + return this.getPort(config.get('minVideoPort'), config.get('maxVideoPort')); +} diff --git a/labs/kurento-screenshare/lib/screenshare.js b/labs/kurento-screenshare/lib/screenshare.js new file mode 100644 index 0000000000000000000000000000000000000000..65927bef59e530f3d3d52e18399667eaa1e6846f --- /dev/null +++ b/labs/kurento-screenshare/lib/screenshare.js @@ -0,0 +1,223 @@ +/* + * Lucas Fialho Zawacki + * Paulo Renato Lanzarin + * (C) Copyright 2017 Bigbluebutton + * + */ + +'use strict' + +// Imports +const C = require('./bbb/messages/Constants'); +const MediaHandler = require('./media-handler'); +const Messaging = require('./bbb/messages/Messaging'); +const moment = require('moment'); +const h264_sdp = require('./h264-sdp'); +const now = moment(); +const MediaController = require('./media-controller'); + +// Global stuff +var sharedScreens = {}; +var rtpEndpoints = {}; + +const kurento = require('kurento-client'); +const config = require('config'); +const kurentoUrl = config.get('kurentoUrl'); +const kurentoIp = config.get('kurentoIp'); +const localIpAddress = config.get('localIpAddress'); + +if (config.get('acceptSelfSignedCertificate')) { + process.env.NODE_TLS_REJECT_UNAUTHORIZED=0; +} + +module.exports = class Screenshare { + constructor(ws, id, bbbgw, voiceBridge, caller, vh, vw) { + this._ws = ws; + this._id = id; + this._BigBlueButtonGW = bbbgw; + this._webRtcEndpoint = null; + this._rtpEndpoint = null; + this._voiceBridge = voiceBridge; + this._caller = caller; + this._streamUrl = ""; + this._vw = vw; + this._vh = vh; + this._candidatesQueue = []; + } + + // TODO isolate ICE + _onIceCandidate(_candidate) { + let candidate = kurento.getComplexType('IceCandidate')(_candidate); + + if (this._webRtcEndpoint) { + this._webRtcEndpoint.addIceCandidate(candidate); + } + else { + this._candidatesQueue.push(candidate); + } + }; + + _startPresenter(id, ws, sdpOffer, callback) { + let self = this; + let _callback = callback; + + // Force H264 on Firefox and Chrome + sdpOffer = h264_sdp.transform(sdpOffer); + console.log("Starting presenter for " + sdpOffer); + MediaController.createMediaElement(self._voiceBridge, C.WebRTC, function(error, webRtcEndpoint) { + if (error) { + console.log("Media elements error" + error); + return _callback(error); + } + MediaController.createMediaElement(self._voiceBridge, C.RTP, function(error, rtpEndpoint) { + if (error) { + console.log("Media elements error" + error); + return _callback(error); + } + + + while(self._candidatesQueue.length) { + let candidate = self._candidatesQueue.shift(); + MediaController.addIceCandidate(webRtcEndpoint.id, candidate); + } + + MediaController.connectMediaElements(webRtcEndpoint.id, rtpEndpoint.id, C.VIDEO, function(error) { + if (error) { + console.log("Media elements CONNECT error " + error); + //pipeline.release(); + return _callback(error); + } + + // It's a user sharing a Screen + sharedScreens[id] = webRtcEndpoint; + rtpEndpoints[id] = rtpEndpoint; + + // Store our endpoint + self._webRtcEndpoint = webRtcEndpoint; + self._rtpEndpoint = rtpEndpoint; + + self._webRtcEndpoint.on('OnIceCandidate', function(event) { + let candidate = kurento.getComplexType('IceCandidate')(event.candidate); + ws.sendMessage({ id : 'iceCandidate', cameraId: id, candidate : candidate }); + }); + + MediaController.processOffer(webRtcEndpoint.id, sdpOffer, function(error, webRtcSdpAnswer) { + if (error) { + console.log(" [webrtc] processOffer error => " + error + " for SDP " + sdpOffer); + //pipeline.release(); + return _callback(error); + } + + let sendVideoPort = MediaHandler.getVideoPort(); + + let rtpSdpOffer = MediaHandler.generateVideoSdp(localIpAddress, sendVideoPort); + console.log(" [rtpendpoint] RtpEndpoint processing => " + rtpSdpOffer); + + MediaController.gatherCandidates(webRtcEndpoint.id, function(error) { + if (error) { + return _callback(error); + } + + MediaController.processOffer(rtpEndpoint.id, rtpSdpOffer, function(error, rtpSdpAnswer) { + if (error) { + console.log(" [rtpendpoint] processOffer error => " + error + " for SDP " + rtpSdpOffer); + //pipeline.release(); + return _callback(error); + } + + console.log(" [rtpendpoint] KMS answer SDP => " + rtpSdpAnswer); + let recvVideoPort = rtpSdpAnswer.match(/m=video\s(\d*)/)[1]; + let rtpParams = MediaHandler.generateTranscoderParams(kurentoIp, localIpAddress, + sendVideoPort, recvVideoPort, self._voiceBridge, "stream_type_video", C.RTP_TO_RTMP, "copy", "caller"); + + self._rtpEndpoint.on('MediaFlowInStateChange', function(event) { + if (event.state === 'NOT_FLOWING') { + self._onRtpMediaNotFlowing(); + } + else if (event.state === 'FLOWING') { + self._onRtpMediaFlowing(self._voiceBridge, rtpParams); + } + }); + return _callback(null, webRtcSdpAnswer); + }); + }); + }); + }); + }); + }); + }; + + _stop() { + + console.log(' [stop] Releasing endpoints for ' + this._id); + + this._stopScreensharing(); + + if (this._webRtcEndpoint) { + MediaController.releaseMediaElement(this._webRtcEndpoint.id); + this._webRtcEndpoint = null; + } else { + console.log(" [webRtcEndpoint] PLEASE DONT TRY STOPPING THINGS TWICE"); + } + + if (this._rtpEndpoint) { + MediaController.releaseMediaElement(this._rtpEndpoint.id); + this._rtpEndpoint = null; + } else { + console.log(" [rtpEndpoint] PLEASE DONT TRY STOPPING THINGS TWICE"); + } + + console.log(' [stop] Screen is shared, releasing ' + this._id); + + delete sharedScreens[this._id]; + + delete this._candidatesQueue; + }; + + _stopScreensharing() { + let self = this; + let strm = Messaging.generateStopTranscoderRequestMessage(this._voiceBridge, this._voiceBridge); + + self._BigBlueButtonGW.publish(strm, C.TO_BBB_TRANSCODE_SYSTEM_CHAN, function(error) {}); + + self._BigBlueButtonGW.once(C.STOP_TRANSCODER_REPLY, function(payload) { + let meetingId = payload[C.MEETING_ID]; + let transcoderId = payload[C.TRANSCODER_ID]; + + if(self._voiceBridge === meetingId) { + // TODO correctly assemble this timestamp + let timestamp = now.format('hhmmss'); + let dsrstom = Messaging.generateScreenshareRTMPBroadcastStoppedEvent2x(self._voiceBridge, + self._voiceBridge, self._streamUrl, self._vw, self._vh, timestamp); + self._BigBlueButtonGW.publish(dsrstom, C.FROM_VOICE_CONF_SYSTEM_CHAN, function(error) {}); + } + }); + } + + _onRtpMediaFlowing(voiceBridge, rtpParams) { + let self = this; + let strm = Messaging.generateStartTranscoderRequestMessage(voiceBridge, voiceBridge, rtpParams); + + self._BigBlueButtonGW.once(C.START_TRANSCODER_REPLY, function(payload) { + let meetingId = payload[C.MEETING_ID]; + let transcoderId = payload[C.TRANSCODER_ID]; + + if(voiceBridge === meetingId) { + let output = payload["params"].output; + // TODO correctly assemble this timestamp + let timestamp = now.format('hhmmss'); + self._streamUrl = MediaHandler.generateStreamUrl(localIpAddress, voiceBridge, output); + let dsrbstam = Messaging.generateScreenshareRTMPBroadcastStartedEvent2x(self._voiceBridge, + self._voiceBridge, self._streamUrl, self._vw, self._vh, timestamp); + + self._BigBlueButtonGW.publish(dsrbstam, C.FROM_VOICE_CONF_SYSTEM_CHAN, function(error) {}); + } + }); + + self._BigBlueButtonGW.publish(strm, C.TO_BBB_TRANSCODE_SYSTEM_CHAN, function(error) {}); + }; + + _onRtpMediaNotFlowing() { + console.log(" [screenshare] TODO RTP NOT_FLOWING"); + }; +}; diff --git a/labs/kurento-screenshare/lib/websocket.js b/labs/kurento-screenshare/lib/websocket.js new file mode 100644 index 0000000000000000000000000000000000000000..c4fe9f6f18b220e8b4c43be58ec75004a6430124 --- /dev/null +++ b/labs/kurento-screenshare/lib/websocket.js @@ -0,0 +1,18 @@ +/* + * Simple wrapper around the ws library + * + */ + +var ws = require('ws'); + +ws.prototype.sendMessage = function(json) { + + return this.send(JSON.stringify(json), function(error) { + if(error) + console.log(' [server] Websocket error "' + error + '" on message "' + json.id + '"'); + }); + +}; + + +module.exports = ws; \ No newline at end of file diff --git a/labs/kurento-screenshare/package.json b/labs/kurento-screenshare/package.json new file mode 100644 index 0000000000000000000000000000000000000000..187a3ab8a3f2e70c689e740178834ba1fadb5146 --- /dev/null +++ b/labs/kurento-screenshare/package.json @@ -0,0 +1,23 @@ +{ + "name": "bbb-screenshare-video-kurento-bridge", + "version": "1.0.0", + "private": true, + "scripts": { + "start": "nodejs server.js", + "postinstall": "npm start" + }, + "dependencies": { + "cookie-parser": "^1.3.5", + "express": "~4.12.4", + "express-session": "~1.10.3", + "ws": "~1.0.1", + "kurento-client": "6.6.0", + "redis": "^2.6.2", + "sdp-transform": "*", + "moment": "*" + }, + "devDependencies": { + "config": "^1.26.1", + "js-yaml": "^3.8.3" + } +} diff --git a/labs/kurento-screenshare/server.js b/labs/kurento-screenshare/server.js new file mode 100755 index 0000000000000000000000000000000000000000..f645ac88a52ffa328944f6f775b868bda3b0ae34 --- /dev/null +++ b/labs/kurento-screenshare/server.js @@ -0,0 +1,11 @@ +/* + * Paulo Renato Lanzarin + * (C) Copyright 2017 Bigbluebutton + * + */ + +const ConnectionManager = require('./lib/ConnectionManager'); +const CM = new ConnectionManager(); + +process.on('SIGTERM', CM._stopAll.bind(CM)); +process.on('SIGINT', CM._stopAll.bind(CM)); diff --git a/record-and-playback/core/lib/recordandplayback.rb b/record-and-playback/core/lib/recordandplayback.rb index 329a14126423a7b4790fa7d71e420d89b8e122ea..80a7ef355f8fb1f5c26634e22d325e6f3f2bd8f0 100755 --- a/record-and-playback/core/lib/recordandplayback.rb +++ b/record-and-playback/core/lib/recordandplayback.rb @@ -199,4 +199,12 @@ module BigBlueButton size = BigBlueButton.get_dir_size(dir_name) BigBlueButton.add_tag_to_xml("#{dir_name}/metadata.xml", "//recording/download", "size", size) end + + def self.record_id_to_timestamp(r) + r.split("-")[1].to_i / 1000 + end + + def self.done_to_timestamp(r) + BigBlueButton.record_id_to_timestamp(File.basename(r, ".done")) + end end diff --git a/record-and-playback/core/lib/recordandplayback/generators/audio_processor.rb b/record-and-playback/core/lib/recordandplayback/generators/audio_processor.rb index c0e16b30539092f57b2f1161732812a150500360..0f8f2e80ed70e5c740ed3f99038acdcc74febf9f 100755 --- a/record-and-playback/core/lib/recordandplayback/generators/audio_processor.rb +++ b/record-and-playback/core/lib/recordandplayback/generators/audio_processor.rb @@ -26,11 +26,16 @@ require File.expand_path('../../edl', __FILE__) module BigBlueButton class AudioProcessor + + @audio_file = nil; + # Process the raw recorded audio to ogg file. # archive_dir - directory location of the raw archives. Assumes there is audio file and events.xml present. # file_basename - the file name of the audio output. '.webm' and '.ogg' will be added # def self.process(archive_dir, file_basename) + BigBlueButton.logger.info("AudioProcessor.process: Processing audio...") + audio_edl = BigBlueButton::AudioEvents.create_audio_edl(archive_dir) BigBlueButton::EDL::Audio.dump(audio_edl) @@ -41,20 +46,31 @@ module BigBlueButton audio_dir = "#{archive_dir}/audio" events_xml = "#{archive_dir}/events.xml" - wav_file = BigBlueButton::EDL::Audio.render(audio_edl, "#{audio_dir}/recording") + @audio_file = BigBlueButton::EDL::Audio.render(audio_edl, "#{audio_dir}/recording") ogg_format = { :extension => 'ogg', :parameters => [ [ '-c:a', 'libvorbis', '-q:a', '2', '-f', 'ogg' ] ] } - BigBlueButton::EDL.encode(wav_file, nil, ogg_format, file_basename) + BigBlueButton::EDL.encode(@audio_file, nil, ogg_format, file_basename) webm_format = { :extension => 'webm', :parameters => [ [ '-c:a', 'libvorbis', '-q:a', '2', '-f', 'webm' ] ], :postprocess => [ [ 'mkclean', '--quiet', ':input', ':output' ] ] } - BigBlueButton::EDL.encode(wav_file, nil, webm_format, file_basename) + BigBlueButton::EDL.encode(@audio_file, nil, webm_format, file_basename) + end + + def self.get_processed_audio_file(archive_dir, file_basename) + BigBlueButton.logger.info("AudioProcessor.get_processed_audio_file") + + if(@audio_file == nil) + BigBlueButton.logger.info("AudioProcessor.get_processed_audio_file: audio_file is null. Did you forget to call the process method before this? Processing...") + process(archive_dir,file_basename) + end + + return @audio_file end end end diff --git a/record-and-playback/core/lib/recordandplayback/generators/video.rb b/record-and-playback/core/lib/recordandplayback/generators/video.rb index ad89737f061f800e3f4753a1e66dfa66467f7d6e..1ac934303712a2b05836c7c9ad9c5506c23bbb11 100755 --- a/record-and-playback/core/lib/recordandplayback/generators/video.rb +++ b/record-and-playback/core/lib/recordandplayback/generators/video.rb @@ -35,22 +35,14 @@ module BigBlueButton FFMPEG::Movie.new(video).width end - def BigBlueButton.process_webcam_videos(target_dir, temp_dir, meeting_id, output_width, output_height, audio_offset) - BigBlueButton.logger.info("Processing webcam videos") - - # Process audio - audio_edl = BigBlueButton::AudioEvents.create_audio_edl( - "#{temp_dir}/#{meeting_id}") - BigBlueButton::EDL::Audio.dump(audio_edl) - - BigBlueButton.logger.info("Applying recording start stop events:") - audio_edl = BigBlueButton::Events.edl_match_recording_marks_audio(audio_edl, "#{temp_dir}/#{meeting_id}") - BigBlueButton::EDL::Audio.dump(audio_edl) + def self.is_video_valid?(video) + FFMPEG::Movie.new(video).valid? + end - audio_file = BigBlueButton::EDL::Audio.render( - audio_edl, "#{target_dir}/webcams") + def BigBlueButton.process_webcam_videos(target_dir, temp_dir, meeting_id, output_width, output_height, audio_offset, processed_audio_file) + BigBlueButton.logger.info("Processing webcam videos") - # Process webcam video + # Process user video (camera) webcam_edl = BigBlueButton::Events.create_webcam_edl( "#{temp_dir}/#{meeting_id}") user_video_edl = BigBlueButton::Events.edl_match_recording_marks_video(webcam_edl, "#{temp_dir}/#{meeting_id}") @@ -81,7 +73,7 @@ module BigBlueButton ] formats.each do |format| filename = BigBlueButton::EDL::encode( - audio_file, user_video_file, format, "#{target_dir}/webcams", audio_offset) + processed_audio_file, user_video_file, format, "#{target_dir}/webcams", audio_offset) end end diff --git a/record-and-playback/core/scripts/rap-process-worker.rb b/record-and-playback/core/scripts/rap-process-worker.rb index 5b26d69ccf5f3887d8983cac0b63f027ff7d9639..d0cf1e0c7123c720ea937f2992c903f4198cb800 100755 --- a/record-and-playback/core/scripts/rap-process-worker.rb +++ b/record-and-playback/core/scripts/rap-process-worker.rb @@ -27,7 +27,7 @@ def process_archived_meetings(recording_dir) sanity_done_files = Dir.glob("#{recording_dir}/status/sanity/*.done") FileUtils.mkdir_p("#{recording_dir}/status/processed") - sanity_done_files.each do |sanity_done| + sanity_done_files.sort{ |a,b| BigBlueButton.done_to_timestamp(a) <=> BigBlueButton.done_to_timestamp(b) }.each do |sanity_done| match = /([^\/]*).done$/.match(sanity_done) meeting_id = match[1] diff --git a/record-and-playback/core/scripts/rap-publish-worker.rb b/record-and-playback/core/scripts/rap-publish-worker.rb index e7fdb755decb0cdbd74f38f4bf87e4e61d4f8b5d..0ec57d8dc2779587f8955d99f36a7348bfda4def 100755 --- a/record-and-playback/core/scripts/rap-publish-worker.rb +++ b/record-and-playback/core/scripts/rap-publish-worker.rb @@ -27,7 +27,7 @@ def publish_processed_meetings(recording_dir) processed_done_files = Dir.glob("#{recording_dir}/status/processed/*.done") FileUtils.mkdir_p("#{recording_dir}/status/published") - processed_done_files.each do |processed_done| + processed_done_files.sort{ |a,b| BigBlueButton.done_to_timestamp(a) <=> BigBlueButton.done_to_timestamp(b) }.each do |processed_done| match = /([^\/]*)-([^\/-]*).done$/.match(processed_done) meeting_id = match[1] publish_type = match[2] diff --git a/record-and-playback/presentation/playback/presentation/0.9.0/css/foundation.css b/record-and-playback/presentation/playback/presentation/0.9.0/css/foundation.css index 837fbe3da5ca65b6daa12e0a7a205d920b073054..e6c0070c62ee8d9fd1e56248f11fc1886cb2dfec 100644 --- a/record-and-playback/presentation/playback/presentation/0.9.0/css/foundation.css +++ b/record-and-playback/presentation/playback/presentation/0.9.0/css/foundation.css @@ -63,7 +63,8 @@ body { font-weight: normal; line-height: 1.5; margin: 0; - padding: 0; + /* disable padding on body to handle the case when the playback is embedded in a third party app with a header + padding: 0; */ position: relative; } a:hover { diff --git a/record-and-playback/presentation/playback/presentation/0.9.0/lib/writing.js b/record-and-playback/presentation/playback/presentation/0.9.0/lib/writing.js index d4aaca97d532ceb78dceb7dc1639f59d7e2e59dc..285888050273d7e18aedc0d5383d1c75052bd1bb 100755 --- a/record-and-playback/presentation/playback/presentation/0.9.0/lib/writing.js +++ b/record-and-playback/presentation/playback/presentation/0.9.0/lib/writing.js @@ -105,6 +105,32 @@ function getViewboxAtTime(time) { } } +function setSlideAspect(time, imageWidth, imageHeight) { + var isDeskshare = mustShowDesktopVideo(time); + var aspectAtTime = getAspectAtTime(time); + if (aspectAtTime != undefined && aspectAtTime != 0 && !isDeskshare) { + currentSlideAspect = aspectAtTime; + } else { + currentSlideAspect = parseFloat((imageWidth/imageHeight)); + } +} + +function getAspectAtTime(time) { + var curr_t = parseFloat(time); + var key; + for (key in slideAspectValues) { + if(slideAspectValues.hasOwnProperty(key)) { + var arry = key.split(","); + if(arry[1] == "end") { + return slideAspectValues[key]; + } + else if ((parseFloat(arry[0]) <= curr_t) && (parseFloat(arry[1]) >= curr_t)) { + return slideAspectValues[key]; + } + } + } +} + function getCursorAtTime(time) { var coords = cursorValues[time]; if(coords) return coords.split(' '); @@ -162,16 +188,7 @@ function isThereDeskshareVideo() { } } -function resyncVideos() { - if (!isThereDeskshareVideo()) return; - var currentTime = Popcorn('#video').currentTime(); - var currentDeskshareVideoTime = Popcorn("#deskshare-video").currentTime(); - if (Math.abs(currentTime - currentDeskshareVideoTime) >= 0.1) - Popcorn("#deskshare-video").currentTime(currentTime); -} - function handlePresentationAreaContent(time) { - var meetingDuration = parseFloat(new Popcorn("#video").duration().toFixed(1)); if(time >= meetingDuration) return; @@ -188,7 +205,6 @@ function handlePresentationAreaContent(time) { sharingDesktop = false; } - resyncVideos(); resizeDeshareVideo(); } @@ -234,15 +250,15 @@ function runPopcorn() { var shapeelements = xmlDoc.getElementsByTagName("svg"); //get the array of values for the first shape (getDataPoints(0) is the first shape). - var array = $(shapeelements[0]).find("g").filter(function(){ //get all the lines from the svg file + var shapesArray = $(shapeelements[0]).find("g").filter(function(){ //get all the lines from the svg file return $(this).attr('class') == 'shape'; }); //create a map from timestamp to id list var timestampToId = {}; - for (var j = 0; j < array.length; j++) { - shapeTime = array[j].getAttribute("timestamp"); - shapeId = array[j].getAttribute("id"); + for (var j = 0; j < shapesArray.length; j++) { + shapeTime = shapesArray[j].getAttribute("timestamp"); + shapeId = shapesArray[j].getAttribute("id"); if (timestampToId[shapeTime] == undefined) { timestampToId[shapeTime] = new Array(0); @@ -251,13 +267,12 @@ function runPopcorn() { } //fill the times array with the times of the svg images. - for (var j = 0; j < array.length; j++) { - times[j] = array[j].getAttribute("timestamp"); + for (var j = 0; j < shapesArray.length; j++) { + times[j] = shapesArray[j].getAttribute("timestamp"); } var times_length = times.length; //get the length of the times array. - getPresentationText(); // PROCESS PANZOOMS.XML console.log("** Getting panzooms.xml"); @@ -281,6 +296,7 @@ function runPopcorn() { vboxValues[[panZoomArray[k].getAttribute("timestamp"), second_val]] = viewBoxes[k].childNodes[0].data; } + getPresentationText(); // PROCESS CURSOR.XML console.log("** Getting cursor.xml"); @@ -327,17 +343,17 @@ function runPopcorn() { svgobj.style.top = "0px"; var next_shape; var shape; - for (var j = 0; j < array.length - 1; j++) { //iterate through all the shapes and pick out the main ones - var time = array[j].getAttribute("timestamp"); - shape = array[j].getAttribute("shape"); - next_shape = array[j+1].getAttribute("shape"); + for (var j = 0; j < shapesArray.length - 1; j++) { //iterate through all the shapes and pick out the main ones + var time = shapesArray[j].getAttribute("timestamp"); + shape = shapesArray[j].getAttribute("shape"); + next_shape = shapesArray[j+1].getAttribute("shape"); - if(shape !== next_shape) { - main_shapes_ids.push(array[j].getAttribute("id")); - } + if(shape !== next_shape) { + main_shapes_ids.push(shapesArray[j].getAttribute("id")); + } } - if (array.length !== 0) { - main_shapes_ids.push(array[array.length-1].getAttribute("id")); //put last value into this array always! + if (shapesArray.length !== 0) { + main_shapes_ids.push(shapesArray[shapesArray.length-1].getAttribute("id")); //put last value into this array always! } var get_shapes_in_time = function(t) { @@ -366,19 +382,20 @@ function runPopcorn() { start: 1, // start time end: p.duration(), onFrame: function(options) { - //console.log("**Popcorn video onframe"); - if(!((p.paused() === true) && (p.seeking() === false))) { - var t = p.currentTime().toFixed(1); //get the time and round to 1 decimal place + var currentTime = p.currentTime(); + if ( (!p.paused() || p.seeking()) && (Math.abs(currentTime - lastFrameTime) >= 0.1) ) { + lastFrameTime = currentTime; + var t = currentTime.toFixed(1); //get the time and round to 1 decimal place current_shapes = get_shapes_in_time(t); //redraw everything (only way to make everything elegant) - for (var i = 0; i < array.length; i++) { - var time_s = array[i].getAttribute("timestamp"); + for (var i = 0; i < shapesArray.length; i++) { + var time_s = shapesArray[i].getAttribute("timestamp"); var time_f = parseFloat(time_s); - if(svgobj.contentDocument) shape = svgobj.contentDocument.getElementById(array[i].getAttribute("id")); - else shape = svgobj.getSVGDocument('svgfile').getElementById(array[i].getAttribute("id")); + if(svgobj.contentDocument) shape = svgobj.contentDocument.getElementById(shapesArray[i].getAttribute("id")); + else shape = svgobj.getSVGDocument('svgfile').getElementById(shapesArray[i].getAttribute("id")); if(shape != null) { var shape_i = shape.getAttribute("shape"); @@ -393,6 +410,8 @@ function runPopcorn() { } else { shape.style.visibility = "hidden"; } + } else { + shape.style.visibility = "hidden"; } } else if(time_s === t) { //for the shapes with the time specific to the current time // only makes visible the last drawing of a given shape @@ -416,8 +435,6 @@ function runPopcorn() { } var next_image = getImageAtTime(t); //fetch the name of the image at this time. - var imageXOffset = 0; - var imageYOffset = 0; if(current_image && (current_image !== next_image) && (next_image !== undefined)){ //changing slide image if(svgobj.contentDocument) { @@ -464,10 +481,11 @@ function runPopcorn() { else var thisimg = svgobj.getSVGDocument('svgfile').getElementById(current_image); if (thisimg) { - var imageWidth = parseInt(thisimg.getAttribute("width"), 10); - var imageHeight = parseInt(thisimg.getAttribute("height"), 10); + var imageWidth = parseFloat(thisimg.getAttribute("width")); + var imageHeight = parseFloat(thisimg.getAttribute("height")); setViewBox(t); + setSlideAspect(t,imageWidth,imageHeight); if (getCursorAtTime(t) != null && getCursorAtTime(t) != undefined && !$('#slide').hasClass('no-background')) { currentCursorVal = getCursorAtTime(t); @@ -598,11 +616,15 @@ function defineStartTime() { return temp_start_time; } +var lastFrameTime = 0.0; + +var shape; +var current_shapes = []; + var deskshare_image = null; var current_image = "image0"; var previous_image = null; var current_canvas; -var shape; var next_canvas; var next_image; var next_pgid; @@ -611,7 +633,7 @@ var svgfile; //current time var t; var len; -var current_shapes = []; +var meetingDuration; //coordinates for x and y for each second var panAndZoomTimes = []; var viewBoxes = []; @@ -623,6 +645,8 @@ var shapeId; var clearTimes = []; var main_shapes_ids = []; var vboxValues = {}; +var slideAspectValues = {}; +var currentSlideAspect = 0; var cursorValues = {}; var currentCursorVal; var imageAtTime = {}; @@ -685,8 +709,18 @@ function initPopcorn() { firstLoad = false; generateThumbnails(); - var p = Popcorn("#video"); - p.currentTime(defineStartTime()); + var startTime = defineStartTime(); + console.log("** startTime = " + startTime); + + Popcorn("#video").currentTime(startTime); + if(isThereDeskshareVideo()) + Popcorn("#deskshare-video").currentTime(startTime); + + //Popcorn documentation suggests this way to get the duration, since this information does not come with 'loadedmetadata' event. + Popcorn("#video").cue(2, function() { + meetingDuration = parseFloat(Popcorn("#video").duration().toFixed(1)); + console.log("** Meeting duration (seconds): " + meetingDuration); + }); } svgobj.addEventListener('load', function() { @@ -812,6 +846,75 @@ function processPresentationText(response) { } else { setPresentationTextFromTxt(images); } + + //at this point, we're sure that the array 'imageAtTime' is ready. Now, we need to set the aspects times to resize the slide div during the playback. + processSlideAspectTimes(); +} + +function processSlideAspectTimes() { + var key; + var lastAspectValue = 0; + for (key in vboxValues) { + if (vboxValues.hasOwnProperty(key)) { + var start_timestamp = key.split(",")[0]; + var stop_timestamp = key.split(",")[1]; + var vboxWidth = parseFloat(vboxValues[key].split(" ")[2]); + var vboxHeight = parseFloat(vboxValues[key].split(" ")[3]); + var aspectValue = processAspectValue(vboxWidth,vboxHeight,start_timestamp,lastAspectValue); + slideAspectValues[[start_timestamp, stop_timestamp]] = aspectValue; + lastAspectValue = aspectValue; + } + } +} + +function processAspectValue(vboxWidth, vboxHeight, time, lastAspectValue) { + var imageId; + if (time == "0.0") { + //a little hack 'cause function getImageAtTime with time = 0.0 returns the background image... + //we need the first slide instead + imageId = "image1"; + } + else { + imageId = getImageAtTime(time); + } + + if (imageId !== undefined) { + var image; + if (svgobj.contentDocument) { + image = svgobj.contentDocument.getElementById(imageId); + } + else { + image = svgobj.getSVGDocument('svgfile').getElementById(imageId); + } + + if (image) { + if(mustShowDesktopVideo(parseFloat(time))) { + return lastAspectValue; + } + + var imageWidth = parseFloat(image.getAttribute("width")); + var imageHeight = parseFloat(image.getAttribute("height")); + + //fit-to-width: returning vbox aspect + if(vboxWidth == imageWidth && vboxHeight < imageHeight) { + return parseFloat(vboxWidth/vboxHeight); + } + //fit-to-page: returning image aspect + else if(vboxWidth == imageWidth && vboxHeight == imageHeight) { + return parseFloat(imageWidth/imageHeight); + } + //if it's not fit-to-width neither fit-to-page we return the previous aspect + else { + return lastAspectValue; + } + } else { + console.log("processAspectValue: there is no image for the id = " + imageId); + return lastAspectValue; + } + } else { + console.log("processAspectValue: imageId undefined"); + return lastAspectValue; + } } function getPresentationText() { @@ -869,16 +972,10 @@ window.onresize = function(event) { var resizeSlides = function() { if (currentImage) { var $slide = $("#slide"); - - var imageWidth = parseInt(currentImage.getAttribute("width"), 10); - var imageHeight = parseInt(currentImage.getAttribute("height"), 10); - var imgRect = currentImage.getBoundingClientRect(); - var aspectRatio = imageWidth/imageHeight; - var max = aspectRatio * $slide.parent().outerHeight(); - $slide.css("max-width", max); - - var height = $slide.parent().width() / aspectRatio; - $slide.css("max-height", height); + var maxWidth = currentSlideAspect * $slide.parent().outerHeight(); + $slide.css("max-width", maxWidth); + var maxHeight = $slide.parent().width() / currentSlideAspect; + $slide.css("max-height", maxHeight); } }; diff --git a/record-and-playback/presentation/playback/presentation/0.9.0/playback.js b/record-and-playback/presentation/playback/presentation/0.9.0/playback.js index 89e26fa60db29f47f8caa70be9d46fa42c499bc1..bf25887891f18fcb41ce4e6ca59cf6c411e925de 100755 --- a/record-and-playback/presentation/playback/presentation/0.9.0/playback.js +++ b/record-and-playback/presentation/playback/presentation/0.9.0/playback.js @@ -123,6 +123,11 @@ var RECORDINGS = "/presentation/" + MEETINGID; var SLIDES_XML = RECORDINGS + '/slides_new.xml'; var SHAPES_SVG = RECORDINGS + '/shapes.svg'; var hasVideo = false; +var syncing = false; +var masterVideoSeeked = false; +var primaryMedia; +var secondaryMedias; +var allMedias; /* * Sets the title attribute in a thumbnail. @@ -342,7 +347,11 @@ load_video = function(){ //video.setAttribute('autoplay','autoplay'); document.getElementById("video-area").appendChild(video); - document.dispatchEvent(new CustomEvent('media-ready', {'detail': 'video'})); + + Popcorn("#video").on("canplayall", function() { + console.log("==Video loaded"); + document.dispatchEvent(new CustomEvent('media-ready', {'detail': 'video'})); + }); } load_audio = function() { @@ -376,7 +385,12 @@ load_audio = function() { //leave auto play turned off for accessiblity support //audio.setAttribute('autoplay','autoplay'); document.getElementById("audio-area").appendChild(audio); - document.dispatchEvent(new CustomEvent('media-ready', {'detail': 'audio'})); + + //remember: audio id is 'video' + Popcorn("#video").on("canplayall", function() { + console.log("==Audio loaded"); + document.dispatchEvent(new CustomEvent('media-ready', {'detail': 'audio'})); + }); } load_deskshare_video = function () { @@ -392,14 +406,88 @@ load_deskshare_video = function () { var presentationArea = document.getElementById("presentation-area"); presentationArea.insertBefore(deskshare_video,presentationArea.childNodes[0]); - $('#video').on("play", function() { - Popcorn('#deskshare-video').play(); + setSync(); + + Popcorn("#deskshare-video").on("canplayall", function() { + console.log("==Deskshare video loaded"); + document.dispatchEvent(new CustomEvent('media-ready', {'detail': 'deskshare'})); + }); +} + +function setSync() { + //master video + primaryMedia = Popcorn("#video"); + + //slave videos + secondaryMedias = [ Popcorn("#deskshare-video") ]; + + allMedias = [primaryMedia].concat(secondaryMedias); + + //when we play the master video, we play all other videos as well... + primaryMedia.on("play", function() { + for(i = 0; i < secondaryMedias.length ; i++) + secondaryMedias[i].play(); }); - $('#video').on("pause", function() { - Popcorn('#deskshare-video').pause(); + + //when we pause the master video, we sync + primaryMedia.on("pause", function() { + sync(); }); - document.dispatchEvent(new CustomEvent('media-ready', {'detail': 'deskshare'})); + primaryMedia.on("seeking", function() { + if(primaryMedia.played().length != 0) + masterVideoSeeked = true; + }); + + //when finished seeking, we sync all medias... + primaryMedia.on("seeked", function() { + if(primaryMedia.paused()) + sync(); + else + primaryMedia.pause(); + }); + + + for(i = 0; i < allMedias.length ; i++) { + + allMedias[i].on("waiting", function() { + //if one of the medias is 'waiting', we must sync + if(!primaryMedia.seeking() && !syncing) { + syncing = true; + //pause the master video, causing to pause and sync all videos... + console.log("syncing videos..."); + primaryMedia.pause(); + } + }); + + + allMedias[i].on("canplaythrough", function() { + if(syncing || masterVideoSeeked) { + var allMediasAreReady = true; + for(i = 0; i < allMedias.length ; i++) + allMediasAreReady &= (allMedias[i].media.readyState == 4) + + if(allMediasAreReady) { + syncing = false; + masterVideoSeeked = false; + //play the master video, causing to play all videos... + console.log("resuming..."); + primaryMedia.play(); + } + } + }); + } +} + +function sync() { + for(var i = 0; i < secondaryMedias.length ; i++) { + if(secondaryMedias[i].media.readyState > 1) { + secondaryMedias[i].pause(); + + //set the current time will fire a "canplaythrough" event to tell us that the video can be played... + secondaryMedias[i].currentTime(primaryMedia.currentTime()); + } + } } load_script = function(file){ diff --git a/record-and-playback/presentation/scripts/process/presentation.rb b/record-and-playback/presentation/scripts/process/presentation.rb index a14873ea72234334c78e0e0f0a97ccfe2276715c..996b893e3da3493b8235f2506c922570506f5ec3 100755 --- a/record-and-playback/presentation/scripts/process/presentation.rb +++ b/record-and-playback/presentation/scripts/process/presentation.rb @@ -1,4 +1,4 @@ - # Set encoding to utf-8 +# Set encoding to utf-8 # encoding: UTF-8 # @@ -225,7 +225,8 @@ if not FileTest.directory?(target_dir) webcam_height = presentation_props['deskshare_output_height'] end - BigBlueButton.process_webcam_videos(target_dir, temp_dir, meeting_id, webcam_width, webcam_height, presentation_props['audio_offset']) + processed_audio_file = BigBlueButton::AudioProcessor.get_processed_audio_file("#{temp_dir}/#{meeting_id}", "#{target_dir}/audio") + BigBlueButton.process_webcam_videos(target_dir, temp_dir, meeting_id, webcam_width, webcam_height, presentation_props['audio_offset'], processed_audio_file) end if !Dir["#{raw_archive_dir}/deskshare/*"].empty? and presentation_props['include_deskshare'] diff --git a/record-and-playback/presentation/scripts/publish/presentation.rb b/record-and-playback/presentation/scripts/publish/presentation.rb index 05b79abebff050953c8ecaf5ffaa544debf056e5..b4afd246128e4fd745f7380eb4bec43a41e83866 100755 --- a/record-and-playback/presentation/scripts/publish/presentation.rb +++ b/record-and-playback/presentation/scripts/publish/presentation.rb @@ -1018,6 +1018,10 @@ def processDeskshareEvents start_timestamp = (translateTimestamp(event[:start_timestamp].to_f) / 1000).round(1) stop_timestamp = (translateTimestamp(event[:stop_timestamp].to_f) / 1000).round(1) if (start_timestamp != stop_timestamp) + if !BigBlueButton.is_video_valid?("#{$deskshare_dir}/#{event[:stream]}") + BigBlueButton.logger.warn("#{event[:stream]} is not a valid video file, skipping...") + next + end video_width, video_height = getDeskshareVideoDimension(event[:stream]) $xml.event(:start_timestamp => start_timestamp, :stop_timestamp => stop_timestamp,