Merge branch 'master' into merge-bbb-1.1-dev-java8-with-master
Conflicts: akka-bbb-apps/build.sbt akka-bbb-apps/src/main/java/org/bigbluebutton/core/api/IBigBlueButtonInGW.java akka-bbb-apps/src/main/resources/application.conf akka-bbb-apps/src/main/scala/org/bigbluebutton/Boot.scala akka-bbb-apps/src/main/scala/org/bigbluebutton/core/BigBlueButtonActor.scala akka-bbb-apps/src/main/scala/org/bigbluebutton/core/BigBlueButtonInGW.scala akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MeetingActor.scala akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MeetingModel.scala akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MessageSenderActor.scala akka-bbb-apps/src/main/scala/org/bigbluebutton/core/RecorderActor.scala akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/InMessages.scala akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/OutMessages.scala akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/ValueObjects.scala akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/WhiteboardApp.scala akka-bbb-fsesl/build.sbt akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/pubsub/receivers/RedisMessageReceiver.java akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/freeswitch/ConnectionManager.java akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/freeswitch/FreeswitchApplication.java bbb-common-message/build.sbt bbb-common-message/src/main/java/org/bigbluebutton/common/messages/Constants.java bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MessagingConstants.java bbb-common-message/src/main/java/org/bigbluebutton/common/messages/Util.java bigbluebutton-apps/build.gradle bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/pubsub/redis/RedisPubSubMessageHandler.java bigbluebutton-apps/src/main/webapp/WEB-INF/red5-web.xml bigbluebutton-client/build.xml bigbluebutton-client/resources/config.xml.template bigbluebutton-client/resources/prod/BigBlueButton.html bigbluebutton-client/src/org/bigbluebutton/common/Images.as bigbluebutton-client/src/org/bigbluebutton/main/maps/ApplicationEventMap.mxml bigbluebutton-client/src/org/bigbluebutton/main/model/users/Conference.as bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/utils/JavaCheck.as bigbluebutton-client/src/org/bigbluebutton/modules/users/services/MessageReceiver.as bigbluebutton-web/build.gradle bigbluebutton-web/grails-app/conf/spring/resources.xml bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/ApiController.groovy bigbluebutton-web/src/java/org/bigbluebutton/api/MeetingService.java bigbluebutton-web/src/java/org/bigbluebutton/api/domain/Meeting.java bigbluebutton-web/src/java/org/bigbluebutton/api/messaging/MeetingMessageHandler.java bigbluebutton-web/src/java/org/bigbluebutton/api/messaging/RedisMessagingService.java record-and-playback/core/scripts/bigbluebutton.yml
This commit is contained in:
commit
58c239bc43
@ -1,170 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
||||
<head>
|
||||
<title></title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
||||
<style type="text/css" media="screen">
|
||||
html, body, #content { height:100%; }
|
||||
body { margin:0; padding:0; overflow:hidden; }
|
||||
#altContent { /* style alt content */ }
|
||||
.visually-hidden {
|
||||
position: absolute !important;
|
||||
clip: rect(1px 1px, 1px, 1px);
|
||||
clip: rect(1px, 1px, 1px, 1px);
|
||||
padding: 0 !important;
|
||||
border: 0 !important;
|
||||
height: 1px !important;
|
||||
width: 1px !important;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
#deployJavaPlugin {
|
||||
display : none;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script type="text/javascript" src="swfobject/swfobject.js"></script>
|
||||
<script src="lib/deployJava.js?v=264" language="javascript"></script>
|
||||
<script type="text/javascript">
|
||||
//swfobject.registerObject("BigBlueButton", "11", "expressInstall.swf");
|
||||
var flashvars = {};
|
||||
var params = {};
|
||||
params.quality = "high";
|
||||
params.bgcolor = "#869ca7";
|
||||
params.allowfullscreen = "true";
|
||||
params.wmode = "window";
|
||||
params.allowscriptaccess = "true";
|
||||
params.seamlesstabbing = "true";
|
||||
var attributes = {};
|
||||
attributes.id = "BigBlueButton";
|
||||
attributes.name = "BigBlueButton";
|
||||
attributes.align = "middle";
|
||||
attributes.tabIndex = 0;
|
||||
swfobject.embedSWF("BigBlueButton.swf?v=264", "altFlash", "100%", "100%", "11.0.0", "expressInstall.swf", flashvars, params, attributes, embedCallback);
|
||||
|
||||
function embedCallback(e) {
|
||||
// Work around pixel alignment bug with Chrome 21 on Mac.
|
||||
// See: http://code.google.com/p/bigbluebutton/issues/detail?id=1294
|
||||
var objs = $('object');
|
||||
objs.each(function(i, o) {
|
||||
var o = $(o);
|
||||
var top = o.offset().top;
|
||||
var left = o.offset().left;
|
||||
var roundtop = Math.round(top);
|
||||
var roundleft = Math.round(left);
|
||||
o.css("position", "relative");
|
||||
if (roundtop === top) {
|
||||
} else {
|
||||
o.css("top", roundtop - top);
|
||||
}
|
||||
if (roundleft === left) {
|
||||
} else {
|
||||
o.css("left", roundleft - left);
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
<script src="lib/jquery-1.5.1.min.js?v=264" language="javascript"></script>
|
||||
<script src="lib/bbblogger.js?v=264" language="javascript"></script>
|
||||
<script src="lib/bigbluebutton.js?v=264" language="javascript"></script>
|
||||
<script src="lib/bbb_localization.js?v=264" language="javascript"></script>
|
||||
<script src="lib/bbb_blinker.js?v=264" language="javascript"></script>
|
||||
<script src="lib/bbb_deskshare.js?v=264" language="javascript"></script>
|
||||
<script src="lib/bbb_api_bridge.js?v=264" language="javascript"></script>
|
||||
<script src="lib/sip.js?v=264" language="javascript"></script>
|
||||
<script src="lib/bbb_webrtc_bridge_sip.js?v=264" language="javascript"></script>
|
||||
<script src="lib/weburl_regex.js?v=264" language="javascript"></script>
|
||||
<script>
|
||||
window.chatLinkClicked = function(url) {
|
||||
window.open(url, '_blank');
|
||||
window.focus();
|
||||
}
|
||||
</script>
|
||||
<script type="text/javascript">
|
||||
function html5() {
|
||||
// no Flash detected on the client
|
||||
|
||||
var originalPath, request;
|
||||
originalPath = document.location.pathname;
|
||||
|
||||
// reuse code in a function to log an error when needed
|
||||
var reportError = function() {
|
||||
alert("Unable to load the HTML5 client!");
|
||||
BBBLog.debug("Could not redirect to html5client (the server side does not seem to be running)");
|
||||
}
|
||||
|
||||
var checkRequest = $.ajax({
|
||||
dataType: 'json',
|
||||
url: '/html5client/check'
|
||||
});
|
||||
|
||||
checkRequest.done(function(data) {
|
||||
if(typeof data.html5clientStatus !== "undefined" && data.html5clientStatus !== null) {
|
||||
if(data.html5clientStatus === "running") {
|
||||
// use the enter api to detect the meetingid, userid and authToken
|
||||
// for the attempted joining of the meeting
|
||||
// and reuse them to join via the HTML5 client
|
||||
var enterRequest = $.ajax({
|
||||
dataType: 'json',
|
||||
url: '/bigbluebutton/api/enter'
|
||||
});
|
||||
|
||||
enterRequest.done(function(enterData) {
|
||||
var authToken, meetingId, userId;
|
||||
|
||||
meetingId = enterData.response.meetingID;
|
||||
userId = enterData.response.externUserID;
|
||||
authToken = enterData.response.authToken;
|
||||
|
||||
if ((meetingId != null) && (userId != null) && (authToken != null)) {
|
||||
// redirect to the html5 client with the received info
|
||||
// format <IP>/html5client/<meetingId>/<userId>/<authToken>
|
||||
document.location.pathname = "/html5client/"+meetingId+"/"+userId+"/"+authToken;
|
||||
} else {
|
||||
// go back to the redirection page
|
||||
document.location.pathname = originalPath;
|
||||
}
|
||||
});
|
||||
|
||||
enterRequest.fail(function(enterData, textStatus, errorThrown){
|
||||
reportError();
|
||||
});
|
||||
}
|
||||
else {
|
||||
reportError();
|
||||
}
|
||||
}
|
||||
else {
|
||||
reportError();
|
||||
}
|
||||
});
|
||||
|
||||
checkRequest.fail(function(data, textStatus, errorThrown){
|
||||
reportError();
|
||||
});
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div>
|
||||
<audio id="remote-media" autoplay="autoplay"></audio>
|
||||
</div>
|
||||
|
||||
<div id="content">
|
||||
<div id="altFlash" style="width:50%; margin-left: auto; margin-right: auto; ">
|
||||
<h2>You need Flash installed and enabled in order to use the Flash client.</h2>
|
||||
<br/>
|
||||
<div style="width:50%; margin-left: auto; margin-right: auto; ">
|
||||
<a href="http://www.adobe.com/go/getflashplayer">
|
||||
<img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" />
|
||||
</a>
|
||||
<p style="margin-left:50px;" >OR</p>
|
||||
<button type="button" onclick="html5();"><h3>Launch the HTML5 client instead</h3></button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<button id="enterFlash" type="button" class="visually-hidden" onclick="startFlashFocus();" value="Click to focus the client"></button>
|
||||
<div id="clientReady" aria-atomic="false" aria-live="polite"></div>
|
||||
</body>
|
||||
</html>
|
72
Vagrantfile
vendored
72
Vagrantfile
vendored
@ -1,72 +0,0 @@
|
||||
# -*- mode: ruby -*-
|
||||
# vi: set ft=ruby :
|
||||
|
||||
# All Vagrant configuration is done below. The "2" in Vagrant.configure
|
||||
# configures the configuration version (we support older styles for
|
||||
# backwards compatibility). Please don't change it unless you know what
|
||||
# you're doing.
|
||||
Vagrant.configure(2) do |config|
|
||||
# The most common configuration options are documented and commented below.
|
||||
# For a complete reference, please see the online documentation at
|
||||
# https://docs.vagrantup.com.
|
||||
|
||||
# Every Vagrant development environment requires a box. You can search for
|
||||
# boxes at https://atlas.hashicorp.com/search.
|
||||
config.vm.box = "RIADVICE/bigbluebutton-dev"
|
||||
|
||||
# Disable automatic box update checking. If you disable this, then
|
||||
# boxes will only be checked for updates when the user runs
|
||||
# `vagrant box outdated`. This is not recommended.
|
||||
# config.vm.box_check_update = false
|
||||
|
||||
# Create a forwarded port mapping which allows access to a specific port
|
||||
# within the machine from a port on the host machine. In the example below,
|
||||
# accessing "localhost:8080" will access port 80 on the guest machine.
|
||||
# config.vm.network "forwarded_port", guest: 80, host: 8080
|
||||
|
||||
# Create a private network, which allows host-only access to the machine
|
||||
# using a specific IP.
|
||||
config.vm.network "private_network", ip: "192.168.33.22"
|
||||
|
||||
# Create a public network, which generally matched to bridged network.
|
||||
# Bridged networks make the machine appear as another physical device on
|
||||
# your network.
|
||||
# config.vm.network "public_network"
|
||||
|
||||
# Share an additional folder to the guest VM. The first argument is
|
||||
# the path on the host to the actual folder. The second argument is
|
||||
# the path on the guest to mount the folder. And the optional third
|
||||
# argument is a set of non-required options.
|
||||
config.vm.synced_folder ".", "/vagrant"
|
||||
|
||||
# Provider-specific configuration so you can fine-tune various
|
||||
# backing providers for Vagrant. These expose provider-specific options.
|
||||
# Example for VirtualBox:
|
||||
#
|
||||
config.vm.provider "virtualbox" do |vb|
|
||||
# Display the VirtualBox GUI when booting the machine
|
||||
# vb.gui = false
|
||||
|
||||
# Customize the amount of memory on the VM:
|
||||
vb.memory = "4096"
|
||||
vb.cpus = 2
|
||||
end
|
||||
#
|
||||
# View the documentation for the provider you are using for more
|
||||
# information on available options.
|
||||
|
||||
# Define a Vagrant Push strategy for pushing to Atlas. Other push strategies
|
||||
# such as FTP and Heroku are also available. See the documentation at
|
||||
# https://docs.vagrantup.com/v2/push/atlas.html for more information.
|
||||
# config.push.define "atlas" do |push|
|
||||
# push.app = "YOUR_ATLAS_USERNAME/YOUR_APPLICATION_NAME"
|
||||
# end
|
||||
|
||||
# Enable provisioning with a shell script. Additional provisioners such as
|
||||
# Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the
|
||||
# documentation for more information about their specific syntax and use.
|
||||
# config.vm.provision "shell", inline: <<-SHELL
|
||||
# sudo apt-get update
|
||||
# sudo apt-get install -y apache2
|
||||
# SHELL
|
||||
end
|
File diff suppressed because one or more lines are too long
@ -24,6 +24,8 @@ resolvers ++= Seq(
|
||||
"blindside-repos" at "http://blindside.googlecode.com/svn/repository/"
|
||||
)
|
||||
|
||||
resolvers += Resolver.sonatypeRepo("releases")
|
||||
|
||||
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.
|
||||
@ -58,9 +60,10 @@ libraryDependencies ++= {
|
||||
"com.google.code.gson" % "gson" % "2.5",
|
||||
"redis.clients" % "jedis" % "2.7.2",
|
||||
"org.apache.commons" % "commons-lang3" % "3.2",
|
||||
"org.bigbluebutton" % "bbb-common-message" % "0.0.17-SNAPSHOT",
|
||||
"org.bigbluebutton" % "bbb-common-message" % "0.0.18-SNAPSHOT",
|
||||
"io.spray" %% "spray-json" % "1.3.2"
|
||||
)}
|
||||
)
|
||||
}
|
||||
|
||||
seq(Revolver.settings: _*)
|
||||
|
||||
|
@ -31,7 +31,7 @@ public interface IBigBlueButtonInGW {
|
||||
|
||||
// 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);
|
||||
void registerUser(String roomName, String userid, String username, String role, String externUserID, String authToken, String avatarURL);
|
||||
void userEmojiStatus(String meetingId, String userId, String emojiStatus);
|
||||
void shareWebcam(String meetingId, String userId, String stream);
|
||||
void unshareWebcam(String meetingId, String userId, String stream);
|
||||
@ -56,7 +56,7 @@ public interface IBigBlueButtonInGW {
|
||||
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, Boolean talking);
|
||||
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);
|
||||
@ -112,4 +112,11 @@ public interface IBigBlueButtonInGW {
|
||||
void sendCaptionHistory(String meetingID, String requesterID);
|
||||
void updateCaptionOwner(String meetingID, String locale, String ownerID);
|
||||
void editCaptionHistory(String meetingID, String userID, Integer startIndex, Integer endIndex, String locale, String text);
|
||||
|
||||
// DeskShare
|
||||
void deskShareStarted(String conferenceName, String callerId, String callerIdName);
|
||||
void deskShareStopped(String conferenceName, String callerId, String callerIdName);
|
||||
void deskShareRTMPBroadcastStarted(String conferenceName, String streamname, int videoWidth, int videoHeight, String timestamp);
|
||||
void deskShareRTMPBroadcastStopped(String conferenceName, String streamname, int videoWidth, int videoHeight, String timestamp);
|
||||
void deskShareGetInfoRequest(String meetingId, String requesterId, String replyTo);
|
||||
}
|
||||
|
@ -0,0 +1,59 @@
|
||||
package org.bigbluebutton.core.pubsub.receivers;
|
||||
|
||||
import com.google.gson.JsonParser;
|
||||
import com.google.gson.JsonObject;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import org.bigbluebutton.common.messages.DeskShareStartedEventMessage;
|
||||
import org.bigbluebutton.common.messages.DeskShareStoppedEventMessage;
|
||||
import org.bigbluebutton.common.messages.DeskShareRTMPBroadcastStartedEventMessage;
|
||||
import org.bigbluebutton.common.messages.DeskShareRTMPBroadcastStoppedEventMessage;
|
||||
import org.bigbluebutton.common.messages.DeskShareGetInfoRequestMessage;
|
||||
import org.bigbluebutton.common.messages.MessagingConstants;
|
||||
import org.bigbluebutton.core.api.IBigBlueButtonInGW;
|
||||
|
||||
public class DeskShareMessageReceiver implements MessageHandler {
|
||||
|
||||
private IBigBlueButtonInGW bbbGW;
|
||||
private static final Logger log = LoggerFactory.getLogger(DeskShareMessageReceiver.class);
|
||||
public DeskShareMessageReceiver(IBigBlueButtonInGW bbbGW) {
|
||||
this.bbbGW = bbbGW;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleMessage(String pattern, String channel, String message) {
|
||||
if (channel.equalsIgnoreCase(MessagingConstants.FROM_VOICE_CONF_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();
|
||||
|
||||
if (DeskShareStartedEventMessage.DESKSHARE_STARTED_MESSAGE.equals(messageName)) {
|
||||
DeskShareStartedEventMessage msg = DeskShareStartedEventMessage.fromJson(message);
|
||||
log.info("^^^^^^^DESKSHARE STARTED^^^^^^");
|
||||
bbbGW.deskShareStarted(msg.conferenceName, msg.callerId, msg.callerIdName);
|
||||
} else if (DeskShareStoppedEventMessage.DESK_SHARE_STOPPED_MESSAGE.equals(messageName)) {
|
||||
DeskShareStoppedEventMessage msg = DeskShareStoppedEventMessage.fromJson(message);
|
||||
log.info("^^^^^^^DESKSHARE STOPPED^^^^^^");
|
||||
bbbGW.deskShareStopped(msg.conferenceName, msg.callerId, msg.callerIdName);
|
||||
} else if (DeskShareRTMPBroadcastStartedEventMessage.DESKSHARE_RTMP_BROADCAST_STARTED_MESSAGE.equals(messageName)) {
|
||||
log.info("^^^^^^^DESKSHARE_RTMP_BROADCAST_STARTED_MESSAGE^^^^^^");
|
||||
DeskShareRTMPBroadcastStartedEventMessage msg = DeskShareRTMPBroadcastStartedEventMessage.fromJson(message);
|
||||
bbbGW.deskShareRTMPBroadcastStarted(msg.conferenceName, msg.streamname, msg.vw, msg.vh, msg.timestamp);
|
||||
} else if (DeskShareRTMPBroadcastStoppedEventMessage.DESKSHARE_RTMP_BROADCAST_STOPPED_MESSAGE.equals(messageName)) {
|
||||
log.info("^^^^^^^DESKSHARE_RTMP_BROADCAST_STOPPED_MESSAGE^^^^^^");
|
||||
DeskShareRTMPBroadcastStoppedEventMessage msg = DeskShareRTMPBroadcastStoppedEventMessage.fromJson(message);
|
||||
bbbGW.deskShareRTMPBroadcastStopped(msg.conferenceName, msg.streamname, msg.vw, msg.vh, msg.timestamp);
|
||||
} else if (DeskShareGetInfoRequestMessage.GET_DESKTOP_SHARE_GET_INFO_REQUEST.equals(messageName)) {
|
||||
log.info("^^^^^^^GET_DESKTOP_SHARE_INFO_REQUEST^^^^^^");
|
||||
DeskShareGetInfoRequestMessage msg = DeskShareGetInfoRequestMessage.fromJson(message);
|
||||
bbbGW.deskShareGetInfoRequest(msg.meetingId, msg.requesterId, msg.replyTo);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -60,7 +60,7 @@ public class MeetingMessageReceiver implements MessageHandler {
|
||||
bbbGW.endMeeting(emm.meetingId);
|
||||
} else if (msg instanceof RegisterUserMessage) {
|
||||
RegisterUserMessage emm = (RegisterUserMessage) msg;
|
||||
bbbGW.registerUser(emm.meetingID, emm.internalUserId, emm.fullname, emm.role, emm.externUserID, emm.authToken);
|
||||
bbbGW.registerUser(emm.meetingID, emm.internalUserId, emm.fullname, emm.role, emm.externUserID, emm.authToken, emm.avatarURL);
|
||||
} else if (msg instanceof DestroyMeetingMessage) {
|
||||
DestroyMeetingMessage emm = (DestroyMeetingMessage) msg;
|
||||
bbbGW.destroyMeeting(emm.meetingId);
|
||||
@ -143,4 +143,4 @@ public class MeetingMessageReceiver implements MessageHandler {
|
||||
this.bbbGW = bbbGW;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -45,10 +45,13 @@ public class RedisMessageReceiver {
|
||||
|
||||
WhiteboardMessageReceiver whiteboardRx = new WhiteboardMessageReceiver(bbbGW);
|
||||
receivers.add(whiteboardRx);
|
||||
|
||||
|
||||
DeskShareMessageReceiver deskShareRx = new DeskShareMessageReceiver(bbbGW);
|
||||
receivers.add(deskShareRx);
|
||||
|
||||
PollingMessageReceiver pollRx = new PollingMessageReceiver(bbbGW);
|
||||
receivers.add(pollRx);
|
||||
|
||||
|
||||
MeetingMessageReceiver meetingRx = new MeetingMessageReceiver(bbbGW);
|
||||
receivers.add(meetingRx);
|
||||
|
||||
|
@ -149,7 +149,7 @@ public class UsersMessageReceiver implements MessageHandler{
|
||||
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.talking);
|
||||
bbbInGW.voiceUserJoined(msg.voiceConfId, msg.voiceUserId, msg.userId, msg.callerIdName, msg.callerIdNum, msg.muted, msg.avatarURL, msg.talking);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,28 @@
|
||||
/**
|
||||
* 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.core.recorders.events;
|
||||
|
||||
import org.bigbluebutton.core.service.recorder.RecordEvent;
|
||||
|
||||
public abstract class AbstractDeskShareRecordEvent extends RecordEvent {
|
||||
|
||||
public AbstractDeskShareRecordEvent() {
|
||||
setModule("DESKSHARE");
|
||||
}
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
package org.bigbluebutton.core.recorders.events;
|
||||
|
||||
public class DeskShareNotifyViewersRTMPRecordEvent extends
|
||||
AbstractDeskShareRecordEvent {
|
||||
|
||||
public DeskShareNotifyViewersRTMPRecordEvent() {
|
||||
super();
|
||||
setEvent("DeskShareNotifyViewersRTMP");
|
||||
}
|
||||
|
||||
public void setStreamPath(String streamPath) {
|
||||
eventMap.put("streamPath", streamPath);
|
||||
}
|
||||
|
||||
public void setBroadcasting(Boolean broadcasting) {
|
||||
eventMap.put("broadcasting", broadcasting.toString());
|
||||
}
|
||||
|
||||
public void setVideoWidth(int videoWidth) {
|
||||
eventMap.put("videoWidth", Integer.toString(videoWidth));
|
||||
}
|
||||
|
||||
public void setVideoHeight(int videoHeight) {
|
||||
eventMap.put("videoHeight", Integer.toString(videoHeight));
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
package org.bigbluebutton.core.recorders.events;
|
||||
|
||||
public class DeskShareStartRTMPRecordEvent extends
|
||||
AbstractDeskShareRecordEvent {
|
||||
|
||||
public DeskShareStartRTMPRecordEvent() {
|
||||
super();
|
||||
setEvent("DeskShareStartRTMP");
|
||||
}
|
||||
|
||||
public void setStreamPath(String streamPath) {
|
||||
eventMap.put("streamPath", streamPath);
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
package org.bigbluebutton.core.recorders.events;
|
||||
|
||||
public class DeskShareStopRTMPRecordEvent extends
|
||||
AbstractDeskShareRecordEvent {
|
||||
|
||||
public DeskShareStopRTMPRecordEvent() {
|
||||
super();
|
||||
setEvent("DeskShareStopRTMP");
|
||||
}
|
||||
|
||||
public void setStreamPath(String streamPath) {
|
||||
eventMap.put("streamPath", streamPath);
|
||||
}
|
||||
}
|
@ -1,13 +0,0 @@
|
||||
package org.bigbluebutton.core.service.chat;
|
||||
|
||||
public class ChatKeyUtil {
|
||||
public static final String CHAT_TYPE = "chatType";
|
||||
public static final String FROM_USERID = "fromUserID";
|
||||
public static final String FROM_USERNAME = "fromUsername";
|
||||
public static final String FROM_COLOR = "fromColor";
|
||||
public static final String FROM_TIME = "fromTime";
|
||||
public static final String FROM_TZ_OFFSET = "fromTimezoneOffset";
|
||||
public static final String TO_USERID = "toUserID";
|
||||
public static final String TO_USERNAME = "toUsername";
|
||||
public static final String MESSAGE = "message";
|
||||
}
|
@ -1,6 +0,0 @@
|
||||
package org.bigbluebutton.core.service.voice;
|
||||
|
||||
public class VoiceKeyUtil {
|
||||
public static final String MUTE = "mute";
|
||||
public static final String USERID = "userId";
|
||||
}
|
@ -50,4 +50,9 @@ services {
|
||||
moderatorPassword = "mp"
|
||||
viewerPassword = "ap"
|
||||
defaultPresentationURL = "http://localhost/default.pdf"
|
||||
}
|
||||
}
|
||||
|
||||
red5 {
|
||||
deskshareip="192.168.0.109"
|
||||
deskshareapp="video-broadcast"
|
||||
}
|
||||
|
@ -49,11 +49,10 @@ object Boot extends App with SystemConfiguration {
|
||||
outgoingEventBus.subscribe(recorderActor, "outgoingMessageChannel")
|
||||
outgoingEventBus.subscribe(newMessageSenderActor, "outgoingMessageChannel")
|
||||
|
||||
val bbbInGW = new BigBlueButtonInGW(system, eventBus, outGW)
|
||||
val bbbInGW = new BigBlueButtonInGW(system, eventBus, outGW, red5DeskShareIP, red5DeskShareApp)
|
||||
val redisMsgReceiver = new RedisMessageReceiver(bbbInGW)
|
||||
|
||||
val redisSubscriberActor = system.actorOf(AppsRedisSubscriberActor.props(redisMsgReceiver), "redis-subscriber")
|
||||
|
||||
val keepAliveRedisPublisher = new KeepAliveRedisPublisher(system, redisPublisher)
|
||||
|
||||
}
|
||||
|
@ -22,4 +22,6 @@ trait SystemConfiguration {
|
||||
lazy val bbbWebViewerPassword = Try(config.getString("services.viewerPassword")).getOrElse("changeme")
|
||||
lazy val bbbWebDefaultPresentationURL = Try(config.getString("services.defaultPresentationURL")).getOrElse("changeme")
|
||||
lazy val keysExpiresInSec = Try(config.getInt("redis.keyExpiry")).getOrElse(14 * 86400) // 14 days
|
||||
lazy val red5DeskShareIP = Try(config.getString("red5.deskshareip")).getOrElse("127.0.0.1")
|
||||
lazy val red5DeskShareApp = Try(config.getString("red5.deskshareapp")).getOrElse("")
|
||||
}
|
@ -5,23 +5,9 @@ import akka.actor.ActorLogging
|
||||
import akka.pattern.{ ask, pipe }
|
||||
import akka.util.Timeout
|
||||
import scala.concurrent.duration._
|
||||
import scala.collection.mutable.HashMap
|
||||
import org.bigbluebutton.core.bus._
|
||||
import org.bigbluebutton.core.api._
|
||||
import org.bigbluebutton.core.util._
|
||||
import org.bigbluebutton.core.api.ValidateAuthTokenTimedOut
|
||||
import scala.util.Success
|
||||
import scala.util.Failure
|
||||
import org.bigbluebutton.SystemConfiguration
|
||||
import org.bigbluebutton.core.recorders.events.VoiceUserJoinedRecordEvent
|
||||
import org.bigbluebutton.core.recorders.events.VoiceUserLeftRecordEvent
|
||||
import org.bigbluebutton.core.recorders.events.VoiceUserLockedRecordEvent
|
||||
import org.bigbluebutton.core.recorders.events.VoiceUserMutedRecordEvent
|
||||
import org.bigbluebutton.core.recorders.events.VoiceStartRecordingRecordEvent
|
||||
import org.bigbluebutton.core.recorders.events.VoiceUserTalkingRecordEvent
|
||||
import org.bigbluebutton.core.service.recorder.RecorderApplication
|
||||
import scala.collection._
|
||||
import com.google.gson.Gson
|
||||
|
||||
object BigBlueButtonActor extends SystemConfiguration {
|
||||
def props(system: ActorSystem,
|
||||
@ -45,7 +31,57 @@ class BigBlueButtonActor(val system: ActorSystem,
|
||||
case msg: PubSubPing => handlePubSubPingMessage(msg)
|
||||
case msg: ValidateAuthToken => handleValidateAuthToken(msg)
|
||||
case msg: GetAllMeetingsRequest => handleGetAllMeetingsRequest(msg)
|
||||
// case _ => // do nothing
|
||||
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 msg: DeskShareStartedRequest => handleDeskShareStartedRequest(msg)
|
||||
case msg: DeskShareStoppedRequest => handleDeskShareStoppedRequest(msg)
|
||||
case msg: DeskShareRTMPBroadcastStartedRequest => handleDeskShareRTMPBroadcastStartedRequest(msg)
|
||||
case msg: DeskShareRTMPBroadcastStoppedRequest => handleDeskShareRTMPBroadcastStoppedRequest(msg)
|
||||
case msg: DeskShareGetDeskShareInfoRequest => handleDeskShareGetDeskShareInfoRequest(msg)
|
||||
case _ => // do nothing
|
||||
}
|
||||
|
||||
private def findMeetingWithVoiceConfId(voiceConfId: String): Option[RunningMeeting] = {
|
||||
meetings.values.find(m => { m.mProps.voiceBridge == 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) {
|
||||
@ -162,9 +198,61 @@ class BigBlueButtonActor(val system: ActorSystem,
|
||||
|
||||
//send lock settings
|
||||
self ! (new GetLockSettings(id, "nodeJSapp"))
|
||||
|
||||
//send desktop sharing info
|
||||
self ! (new DeskShareGetDeskShareInfoRequest(id, "nodeJSapp", "nodeJSapp"))
|
||||
|
||||
}
|
||||
|
||||
outGW.send(new GetAllMeetingsReply(resultArray))
|
||||
}
|
||||
|
||||
private def handleDeskShareStartedRequest(msg: DeskShareStartedRequest) {
|
||||
log.info("handleDeskShareStartedRequest: msg.conferenceName=" + msg.conferenceName)
|
||||
findMeetingWithVoiceConfId(msg.conferenceName) foreach { m =>
|
||||
{
|
||||
// println(msg.conferenceName + " (in for each) handleDeskShareStartedRequest BBBActor ")
|
||||
m.actorRef ! msg
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private def handleDeskShareStoppedRequest(msg: DeskShareStoppedRequest) {
|
||||
log.info("handleDeskShareStoppedRequest msg.conferenceName=" + msg.conferenceName)
|
||||
findMeetingWithVoiceConfId(msg.conferenceName) foreach { m =>
|
||||
{
|
||||
// println(msg.conferenceName + " (in for each) handleDeskShareStoppedRequest BBBActor ")
|
||||
m.actorRef ! msg
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private def handleDeskShareRTMPBroadcastStartedRequest(msg: DeskShareRTMPBroadcastStartedRequest) {
|
||||
log.info("handleDeskShareRTMPBroadcastStartedRequest msg.conferenceName=" + msg.conferenceName)
|
||||
findMeetingWithVoiceConfId(msg.conferenceName) foreach { m =>
|
||||
{
|
||||
// println(msg.conferenceName + " (in for each) handleDeskShareRTMPBroadcastStartedRequest BBBActor ")
|
||||
m.actorRef ! msg
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private def handleDeskShareRTMPBroadcastStoppedRequest(msg: DeskShareRTMPBroadcastStoppedRequest) {
|
||||
log.info("handleDeskShareRTMPBroadcastStoppedRequest msg.conferenceName=" + msg.conferenceName)
|
||||
findMeetingWithVoiceConfId(msg.conferenceName) foreach { m =>
|
||||
{
|
||||
// println(msg.conferenceName + " (in for each) handleDeskShareRTMPBroadcastStoppedRequest BBBActor ")
|
||||
m.actorRef ! msg
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private def handleDeskShareGetDeskShareInfoRequest(msg: DeskShareGetDeskShareInfoRequest): Unit = {
|
||||
val m = meetings.values.find(m => {
|
||||
m.mProps.meetingID == msg.conferenceName
|
||||
})
|
||||
m foreach { mActor => mActor.actorRef ! msg }
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -26,13 +26,12 @@ import spray.json.JsonParser
|
||||
class BigBlueButtonInGW(
|
||||
val system: ActorSystem,
|
||||
eventBus: IncomingEventBus,
|
||||
outGW: OutMessageGateway) extends IBigBlueButtonInGW {
|
||||
outGW: OutMessageGateway,
|
||||
val red5DeskShareIP: String,
|
||||
val red5DeskShareApp: String) extends IBigBlueButtonInGW {
|
||||
|
||||
val log = Logging(system, getClass)
|
||||
|
||||
val bbbActor = system.actorOf(
|
||||
BigBlueButtonActor.props(system, eventBus, outGW), "bigbluebutton-actor")
|
||||
|
||||
val bbbActor = system.actorOf(BigBlueButtonActor.props(system, eventBus, outGW), "bigbluebutton-actor")
|
||||
eventBus.subscribe(bbbActor, "meeting-manager")
|
||||
|
||||
def handleBigBlueButtonMessage(message: IBigBlueButtonMessage) {
|
||||
@ -68,12 +67,10 @@ class BigBlueButtonInGW(
|
||||
msg.payload.viewerPassword,
|
||||
msg.payload.createTime,
|
||||
msg.payload.createDate,
|
||||
red5DeskShareIP, red5DeskShareApp,
|
||||
msg.payload.isBreakout)
|
||||
|
||||
eventBus.publish(
|
||||
BigBlueButtonEvent(
|
||||
"meeting-manager",
|
||||
new CreateMeeting(msg.payload.id, mProps)))
|
||||
eventBus.publish(BigBlueButtonEvent("meeting-manager", new CreateMeeting(msg.payload.id, mProps)))
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -137,9 +134,9 @@ class BigBlueButtonInGW(
|
||||
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): Unit = {
|
||||
def registerUser(meetingID: String, userID: String, name: String, role: String, extUserID: String, authToken: String, avatarURL: String): Unit = {
|
||||
val userRole = if (role == "MODERATOR") Role.MODERATOR else Role.VIEWER
|
||||
eventBus.publish(BigBlueButtonEvent(meetingID, new RegisterUser(meetingID, userID, name, userRole, extUserID, authToken)))
|
||||
eventBus.publish(BigBlueButtonEvent(meetingID, new RegisterUser(meetingID, userID, name, userRole, extUserID, authToken, avatarURL)))
|
||||
}
|
||||
|
||||
def sendLockSettings(meetingID: String, userId: String, settings: java.util.Map[String, java.lang.Boolean]) {
|
||||
@ -470,9 +467,9 @@ class BigBlueButtonInGW(
|
||||
}
|
||||
|
||||
def voiceUserJoined(voiceConfId: String, voiceUserId: String, userId: String, callerIdName: String,
|
||||
callerIdNum: String, muted: java.lang.Boolean, talking: java.lang.Boolean) {
|
||||
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, false /*hardcode listenOnly to false as the message for listenOnly is ConnectedToGlobalAudio*/ )))
|
||||
callerIdNum, muted, talking, avatarURL, false /*hardcode listenOnly to false as the message for listenOnly is ConnectedToGlobalAudio*/ )))
|
||||
}
|
||||
|
||||
def voiceUserLeft(voiceConfId: String, voiceUserId: String) {
|
||||
@ -497,10 +494,30 @@ class BigBlueButtonInGW(
|
||||
|
||||
/**
|
||||
* *******************************************************************
|
||||
* Message Interface for Polling
|
||||
* Message Interface for DeskShare
|
||||
* *****************************************************************
|
||||
*/
|
||||
def deskShareStarted(conferenceName: String, callerId: String, callerIdName: String) {
|
||||
bbbActor ! new DeskShareStartedRequest(conferenceName, callerId, callerIdName)
|
||||
}
|
||||
|
||||
def deskShareStopped(conferenceName: String, callerId: String, callerIdName: String) {
|
||||
bbbActor ! new DeskShareStoppedRequest(conferenceName, callerId, callerIdName)
|
||||
}
|
||||
|
||||
def deskShareRTMPBroadcastStarted(conferenceName: String, streamname: String, videoWidth: Int, videoHeight: Int, timestamp: String) {
|
||||
bbbActor ! new DeskShareRTMPBroadcastStartedRequest(conferenceName, streamname, videoWidth, videoHeight, timestamp)
|
||||
}
|
||||
|
||||
def deskShareRTMPBroadcastStopped(conferenceName: String, streamname: String, videoWidth: Int, videoHeight: Int, timestamp: String) {
|
||||
bbbActor ! new DeskShareRTMPBroadcastStoppedRequest(conferenceName, streamname, videoWidth, videoHeight, timestamp)
|
||||
}
|
||||
|
||||
def deskShareGetInfoRequest(meetingId: String, requesterId: String, replyTo: String): Unit = {
|
||||
bbbActor ! 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)))
|
||||
}
|
||||
|
@ -22,6 +22,8 @@ import org.bigbluebutton.core.pubsub.senders.UsersMessageToJsonConverter
|
||||
import org.bigbluebutton.common.messages._
|
||||
import org.bigbluebutton.core.pubsub.senders.WhiteboardMessageToJsonConverter
|
||||
import org.bigbluebutton.common.converters.ToJsonEncoder
|
||||
import org.bigbluebutton.common.messages.payload._
|
||||
import org.bigbluebutton.common.messages._
|
||||
import org.bigbluebutton.messages.payload._
|
||||
import org.bigbluebutton.messages._
|
||||
|
||||
|
@ -181,4 +181,74 @@ class MeetingActor(val mProps: MeetingProperties,
|
||||
case _ => // do nothing
|
||||
}
|
||||
|
||||
// Broadcast video stream,
|
||||
private def handleDeskShareStartedRequest(msg: DeskShareStartedRequest) {
|
||||
log.info("handleDeskShareStartedRequest: dsStarted=" + meetingModel.getDeskShareStarted())
|
||||
|
||||
if (!meetingModel.getDeskShareStarted()) {
|
||||
val timestamp = System.currentTimeMillis().toString()
|
||||
val streamPath = "rtmp://" + mProps.red5DeskShareIP + "/" + mProps.red5DeskShareApp +
|
||||
"/" + mProps.meetingID + "/" + mProps.meetingID + "-" + timestamp
|
||||
log.info("handleDeskShareStartedRequest: streamPath=" + streamPath)
|
||||
|
||||
// Tell FreeSwitch to broadcast to RTMP
|
||||
outGW.send(new DeskShareStartRTMPBroadcast(msg.conferenceName, streamPath))
|
||||
|
||||
meetingModel.setDeskShareStarted(true)
|
||||
}
|
||||
}
|
||||
|
||||
private def handleDeskShareStoppedRequest(msg: DeskShareStoppedRequest) {
|
||||
log.info("handleDeskShareStoppedRequest: dsStarted=" + meetingModel.getDeskShareStarted())
|
||||
|
||||
// Tell FreeSwitch to stop broadcasting to RTMP
|
||||
outGW.send(new DeskShareStopRTMPBroadcast(msg.conferenceName, meetingModel.getRTMPBroadcastingUrl()))
|
||||
|
||||
meetingModel.setDeskShareStarted(false)
|
||||
}
|
||||
|
||||
private def handleDeskShareRTMPBroadcastStartedRequest(msg: DeskShareRTMPBroadcastStartedRequest) {
|
||||
log.info("handleDeskShareRTMPBroadcastStartedRequest: isBroadcastingRTMP=" + meetingModel.isBroadcastingRTMP())
|
||||
|
||||
// only valid if not broadcasting yet
|
||||
if (!meetingModel.isBroadcastingRTMP()) {
|
||||
meetingModel.setRTMPBroadcastingUrl(msg.streamname)
|
||||
meetingModel.broadcastingRTMPStarted()
|
||||
meetingModel.setDesktopShareVideoWidth(msg.videoWidth)
|
||||
meetingModel.setDesktopShareVideoHeight(msg.videoHeight)
|
||||
log.info("START broadcast ALLOWED when isBroadcastingRTMP=false")
|
||||
|
||||
// Notify viewers in the meeting that there's an rtmp stream to view
|
||||
outGW.send(new DeskShareNotifyViewersRTMP(mProps.meetingID, msg.streamname, msg.videoWidth, msg.videoHeight, true))
|
||||
} else {
|
||||
log.info("START broadcast NOT ALLOWED when isBroadcastingRTMP=true")
|
||||
}
|
||||
}
|
||||
|
||||
private def handleDeskShareRTMPBroadcastStoppedRequest(msg: DeskShareRTMPBroadcastStoppedRequest) {
|
||||
log.info("handleDeskShareRTMPBroadcastStoppedRequest: isBroadcastingRTMP=" + meetingModel.isBroadcastingRTMP())
|
||||
|
||||
// only valid if currently broadcasting
|
||||
if (meetingModel.isBroadcastingRTMP()) {
|
||||
log.info("STOP broadcast ALLOWED when isBroadcastingRTMP=true")
|
||||
meetingModel.broadcastingRTMPStopped()
|
||||
|
||||
// notify viewers that RTMP broadcast stopped
|
||||
outGW.send(new DeskShareNotifyViewersRTMP(mProps.meetingID, meetingModel.getRTMPBroadcastingUrl(),
|
||||
msg.videoWidth, msg.videoHeight, false))
|
||||
} else {
|
||||
log.info("STOP broadcast NOT ALLOWED when isBroadcastingRTMP=false")
|
||||
}
|
||||
}
|
||||
|
||||
private def handleDeskShareGetDeskShareInfoRequest(msg: DeskShareGetDeskShareInfoRequest): Unit = {
|
||||
|
||||
log.info("handleDeskShareGetDeskShareInfoRequest: " + msg.conferenceName + "isBroadcasting=" + meetingModel.isBroadcastingRTMP())
|
||||
if (meetingModel.isBroadcastingRTMP()) {
|
||||
// if the meeting has an ongoing WebRTC Deskshare session, send a notification
|
||||
outGW.send(new DeskShareNotifyASingleViewer(mProps.meetingID, msg.requesterID, meetingModel.getRTMPBroadcastingUrl(),
|
||||
meetingModel.getDesktopShareVideoWidth(), meetingModel.getDesktopShareVideoHeight(), true))
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -6,7 +6,8 @@ import java.util.concurrent.TimeUnit
|
||||
case object StopMeetingActor
|
||||
case class MeetingProperties(meetingID: String, externalMeetingID: String, meetingName: String, recorded: Boolean,
|
||||
voiceBridge: 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,
|
||||
red5DeskShareIP: String, red5DeskShareApp: String, isBreakout: Boolean)
|
||||
|
||||
case class MeetingExtensionProp(maxExtensions: Int = 2, numExtensions: Int = 0, extendByMinutes: Int = 20,
|
||||
sendNotice: Boolean = true, sent15MinNotice: Boolean = false,
|
||||
@ -17,6 +18,7 @@ class MeetingModel {
|
||||
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
|
||||
@ -26,11 +28,69 @@ 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 = timeNowInMinutes;
|
||||
|
||||
def resetDesktopSharingParams() = {
|
||||
broadcastingRTMP = false
|
||||
deskShareStarted = false
|
||||
rtmpBroadcastingUrl = ""
|
||||
desktopShareVideoWidth = 0
|
||||
desktopShareVideoHeight = 0
|
||||
}
|
||||
|
||||
def getDeskShareStarted(): Boolean = {
|
||||
return deskShareStarted
|
||||
}
|
||||
|
||||
def setDeskShareStarted(b: Boolean) {
|
||||
deskShareStarted = b
|
||||
println("---deskshare status changed to:" + 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) {
|
||||
println("---RTMP broadcastUrl changed to:" + path)
|
||||
rtmpBroadcastingUrl = path
|
||||
}
|
||||
|
||||
def getRTMPBroadcastingUrl(): String = {
|
||||
rtmpBroadcastingUrl
|
||||
}
|
||||
|
||||
def isExtensionAllowed(): Boolean = extension.numExtensions < extension.maxExtensions
|
||||
def incNumExtension(): Int = {
|
||||
if (extension.numExtensions < extension.maxExtensions) {
|
||||
@ -66,4 +126,4 @@ class MeetingModel {
|
||||
def meetingHasEnded() = meetingEnded = true
|
||||
def hasMeetingEnded(): Boolean = meetingEnded
|
||||
def timeNowInMinutes(): Long = TimeUnit.NANOSECONDS.toMinutes(System.nanoTime())
|
||||
}
|
||||
}
|
||||
|
@ -12,6 +12,7 @@ import org.bigbluebutton.common.messages.StopRecordingVoiceConfRequestMessage
|
||||
import org.bigbluebutton.core.pubsub.senders.MeetingMessageToJsonConverter
|
||||
import org.bigbluebutton.core.pubsub.senders.PesentationMessageToJsonConverter
|
||||
import org.bigbluebutton.core.pubsub.senders.CaptionMessageToJsonConverter
|
||||
import org.bigbluebutton.core.pubsub.senders.DeskShareMessageToJsonConverter
|
||||
import org.bigbluebutton.common.messages.GetPresentationInfoReplyMessage
|
||||
import org.bigbluebutton.common.messages.PresentationRemovedMessage
|
||||
import org.bigbluebutton.core.apps.Page
|
||||
@ -128,6 +129,11 @@ class MessageSenderActor(val service: MessageSender)
|
||||
case msg: SendCaptionHistoryReply => handleSendCaptionHistoryReply(msg)
|
||||
case msg: UpdateCaptionOwnerReply => handleUpdateCaptionOwnerReply(msg)
|
||||
case msg: EditCaptionHistoryReply => handleEditCaptionHistoryReply(msg)
|
||||
case msg: DeskShareStartRTMPBroadcast => handleDeskShareStartRTMPBroadcast(msg)
|
||||
case msg: DeskShareStopRTMPBroadcast => handleDeskShareStopRTMPBroadcast(msg)
|
||||
case msg: DeskShareNotifyViewersRTMP => handleDeskShareNotifyViewersRTMP(msg)
|
||||
case msg: DeskShareNotifyASingleViewer => handleDeskShareNotifyASingleViewer(msg)
|
||||
case msg: DeskShareHangUp => handleDeskShareHangUp(msg)
|
||||
case _ => // do nothing
|
||||
}
|
||||
|
||||
@ -136,6 +142,31 @@ class MessageSenderActor(val service: MessageSender)
|
||||
service.send(MessagingConstants.FROM_USERS_CHANNEL, m.toJson)
|
||||
}
|
||||
|
||||
private def handleDeskShareHangUp(msg: DeskShareHangUp) {
|
||||
val json = DeskShareMessageToJsonConverter.getDeskShareHangUpToJson(msg)
|
||||
service.send(MessagingConstants.TO_VOICE_CONF_SYSTEM_CHAN, json)
|
||||
}
|
||||
|
||||
private def handleDeskShareStopRTMPBroadcast(msg: DeskShareStopRTMPBroadcast) {
|
||||
val json = DeskShareMessageToJsonConverter.getDeskShareStopRTMPBroadcastToJson(msg)
|
||||
service.send(MessagingConstants.TO_VOICE_CONF_SYSTEM_CHAN, json)
|
||||
}
|
||||
|
||||
private def handleDeskShareNotifyViewersRTMP(msg: DeskShareNotifyViewersRTMP) {
|
||||
val json = DeskShareMessageToJsonConverter.getDeskShareNotifyViewersRTMPToJson(msg)
|
||||
service.send(MessagingConstants.FROM_DESK_SHARE_CHANNEL, json)
|
||||
}
|
||||
|
||||
def handleDeskShareNotifyASingleViewer(msg: DeskShareNotifyASingleViewer) {
|
||||
val json = DeskShareMessageToJsonConverter.getDeskShareNotifyASingleViewerToJson(msg)
|
||||
service.send(MessagingConstants.FROM_DESK_SHARE_CHANNEL, json)
|
||||
}
|
||||
|
||||
private def handleDeskShareStartRTMPBroadcast(msg: DeskShareStartRTMPBroadcast) {
|
||||
val json = DeskShareMessageToJsonConverter.getDeskShareStartRTMPBroadcastToJson(msg)
|
||||
service.send(MessagingConstants.TO_VOICE_CONF_SYSTEM_CHAN, json)
|
||||
}
|
||||
|
||||
private def handleGetChatHistoryReply(msg: GetChatHistoryReply) {
|
||||
val json = ChatMessageToJsonConverter.getChatHistoryReplyToJson(msg)
|
||||
service.send(MessagingConstants.FROM_CHAT_CHANNEL, json)
|
||||
@ -526,6 +557,7 @@ class MessageSenderActor(val service: MessageSender)
|
||||
private def handleUserRegistered(msg: UserRegistered) {
|
||||
val json = UsersMessageToJsonConverter.userRegisteredToJson(msg)
|
||||
service.send(MessagingConstants.FROM_MEETING_CHANNEL, json)
|
||||
handleRegisteredUser(msg);
|
||||
}
|
||||
|
||||
private def handleUserStatusChange(msg: UserStatusChange) {
|
||||
|
@ -29,7 +29,11 @@ import org.bigbluebutton.core.recorders.events.ParticipantEndAndKickAllRecordEve
|
||||
import org.bigbluebutton.core.recorders.events.UndoShapeWhiteboardRecordEvent
|
||||
import org.bigbluebutton.core.recorders.events.ClearPageWhiteboardRecordEvent
|
||||
import org.bigbluebutton.core.recorders.events.AddShapeWhiteboardRecordEvent
|
||||
import org.bigbluebutton.core.service.whiteboard.WhiteboardKeyUtil
|
||||
import org.bigbluebutton.core.recorders.events.DeskShareStartRTMPRecordEvent
|
||||
import org.bigbluebutton.core.recorders.events.DeskShareStopRTMPRecordEvent
|
||||
import org.bigbluebutton.core.recorders.events.DeskShareNotifyViewersRTMPRecordEvent
|
||||
// import org.bigbluebutton.core.service.whiteboard.WhiteboardKeyUtil
|
||||
import org.bigbluebutton.common.messages.WhiteboardKeyUtil
|
||||
import org.bigbluebutton.core.recorders.events.ModifyTextWhiteboardRecordEvent
|
||||
import org.bigbluebutton.core.recorders.events.EditCaptionHistoryRecordEvent
|
||||
import scala.collection.immutable.StringOps
|
||||
@ -69,6 +73,9 @@ class RecorderActor(val recorder: RecorderApplication)
|
||||
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 _ => // do nothing
|
||||
}
|
||||
|
||||
@ -449,4 +456,33 @@ class RecorderActor(val recorder: RecorderApplication)
|
||||
recorder.record(msg.meetingID, ev);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private def handleDeskShareStartRTMPBroadcast(msg: DeskShareStartRTMPBroadcast) {
|
||||
val event = new DeskShareStartRTMPRecordEvent()
|
||||
event.setMeetingId(msg.conferenceName)
|
||||
event.setStreamPath(msg.streamPath)
|
||||
event.setTimestamp(TimestampGenerator.generateTimestamp)
|
||||
log.info("handleDeskShareStartRTMPBroadcast " + msg.conferenceName)
|
||||
recorder.record(msg.conferenceName, event)
|
||||
}
|
||||
|
||||
private def handleDeskShareStopRTMPBroadcast(msg: DeskShareStopRTMPBroadcast) {
|
||||
val event = new DeskShareStopRTMPRecordEvent()
|
||||
event.setMeetingId(msg.conferenceName)
|
||||
event.setStreamPath(msg.streamPath)
|
||||
event.setTimestamp(TimestampGenerator.generateTimestamp)
|
||||
log.info("handleDeskShareStopRTMPBroadcast " + msg.conferenceName)
|
||||
recorder.record(msg.conferenceName, event)
|
||||
}
|
||||
|
||||
private def handleDeskShareNotifyViewersRTMP(msg: DeskShareNotifyViewersRTMP) {
|
||||
val event = new DeskShareNotifyViewersRTMPRecordEvent()
|
||||
event.setMeetingId(msg.meetingID)
|
||||
event.setStreamPath(msg.streamPath)
|
||||
event.setBroadcasting(msg.broadcasting)
|
||||
event.setTimestamp(TimestampGenerator.generateTimestamp)
|
||||
|
||||
log.info("handleDeskShareNotifyViewersRTMP " + msg.meetingID)
|
||||
recorder.record(msg.meetingID, event)
|
||||
}
|
||||
}
|
||||
|
@ -78,7 +78,7 @@ case class GetLockSettings(meetingID: String, userId: String) extends InMessage
|
||||
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: Role,
|
||||
extUserID: String, authToken: String) extends InMessage
|
||||
extUserID: String, authToken: String, avatarURL: String) 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
|
||||
@ -165,7 +165,7 @@ case class EjectUserFromVoiceRequest(meetingID: String, userId: String, ejectedB
|
||||
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, listenOnly: Boolean) extends InMessage
|
||||
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
|
||||
@ -188,3 +188,10 @@ case class GetAllMeetingsRequest(meetingID: String /** Not used. Just to satisfy
|
||||
case class SendCaptionHistoryRequest(meetingID: String, requesterID: String) extends InMessage
|
||||
case class UpdateCaptionOwnerRequest(meetingID: String, locale: String, ownerID: String) extends InMessage
|
||||
case class EditCaptionHistoryRequest(meetingID: String, userID: String, startIndex: Integer, endIndex: Integer, locale: String, text: String) extends InMessage
|
||||
// DeskShare
|
||||
case class DeskShareStartedRequest(conferenceName: String, callerId: String, callerIdName: String)
|
||||
case class DeskShareStoppedRequest(conferenceName: String, callerId: String, callerIdName: String)
|
||||
case class DeskShareRTMPBroadcastStartedRequest(conferenceName: String, streamname: String, videoWidth: Int, videoHeight: Int, timestamp: String)
|
||||
case class DeskShareRTMPBroadcastStoppedRequest(conferenceName: String, streamname: String, videoWidth: Int, videoHeight: Int, timestamp: String)
|
||||
case class DeskShareGetDeskShareInfoRequest(conferenceName: String, requesterID: String, replyTo: String)
|
||||
|
||||
|
@ -15,7 +15,7 @@ case class VoiceRecordingStopped(meetingID: String, recorded: Boolean, recording
|
||||
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, recorded: Boolean, name: String,
|
||||
voiceBridge: String, duration: Integer, moderatorPass: String, viewerPass: String, createTime: Long, createDate: String) extends IOutMessage
|
||||
voiceBridge: String, duration: Int, moderatorPass: String, viewerPass: String, createTime: Long, createDate: String) extends IOutMessage
|
||||
case class MeetingMuted(meetingID: String, recorded: Boolean, meetingMuted: Boolean) extends IOutMessage
|
||||
case class MeetingEnded(meetingID: String, recorded: Boolean, voiceBridge: String) extends IOutMessage
|
||||
case class MeetingState(meetingID: String, recorded: Boolean, userId: String, permissions: Permissions, meetingMuted: Boolean) extends IOutMessage
|
||||
@ -148,6 +148,12 @@ case class GetAllMeetingsReply(meetings: Array[MeetingInfo]) extends IOutMessage
|
||||
case class SendCaptionHistoryReply(meetingID: String, recorded: Boolean, requesterID: String, history: Map[String, Array[String]]) extends IOutMessage
|
||||
case class UpdateCaptionOwnerReply(meetingID: String, recorded: Boolean, locale: String, ownerID: String) extends IOutMessage
|
||||
case class EditCaptionHistoryReply(meetingID: String, recorded: Boolean, userID: String, startIndex: Integer, endIndex: Integer, locale: String, text: String) extends IOutMessage
|
||||
// DeskShare
|
||||
case class DeskShareStartRTMPBroadcast(conferenceName: String, streamPath: String) extends IOutMessage
|
||||
case class DeskShareStopRTMPBroadcast(conferenceName: String, streamPath: String) extends IOutMessage
|
||||
case class DeskShareNotifyViewersRTMP(meetingID: String, streamPath: String, videoWidth: Int, videoHeight: Int, broadcasting: Boolean) extends IOutMessage
|
||||
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
|
||||
|
||||
// Value Objects
|
||||
case class MeetingVO(id: String, recorded: Boolean)
|
||||
|
@ -69,7 +69,8 @@ case class RegisteredUser(
|
||||
externId: String,
|
||||
name: String,
|
||||
role: Role.Role,
|
||||
authToken: String)
|
||||
authToken: String,
|
||||
avatarURL: String)
|
||||
|
||||
case class Voice(
|
||||
id: String,
|
||||
@ -94,6 +95,7 @@ case class UserVO(
|
||||
phoneUser: Boolean,
|
||||
voiceUser: VoiceUser,
|
||||
listenOnly: Boolean,
|
||||
avatarURL: String,
|
||||
joinedWeb: Boolean)
|
||||
|
||||
case class VoiceUser(
|
||||
@ -105,6 +107,7 @@ case class VoiceUser(
|
||||
locked: Boolean,
|
||||
muted: Boolean,
|
||||
talking: Boolean,
|
||||
avatarURL: String,
|
||||
listenOnly: Boolean)
|
||||
|
||||
case class MeetingConfig(name: String,
|
||||
@ -129,4 +132,9 @@ case class MeetingPasswords(moderatorPass: String, viewerPass: String)
|
||||
case class MeetingDuration(duration: Int = 0, createdTime: Long = 0,
|
||||
startTime: Long = 0, endTime: Long = 0)
|
||||
|
||||
case class MeetingInfo(meetingID: String, meetingName: String, recorded: Boolean, voiceBridge: String, duration: Int)
|
||||
case class MeetingInfo(
|
||||
meetingID: String,
|
||||
meetingName: String,
|
||||
recorded: Boolean,
|
||||
voiceBridge: String,
|
||||
duration: Long)
|
||||
|
@ -3,7 +3,8 @@ package org.bigbluebutton.core.apps
|
||||
import org.bigbluebutton.core.api._
|
||||
import scala.collection.mutable.HashMap
|
||||
import scala.collection.mutable.ArrayBuffer
|
||||
import org.bigbluebutton.core.service.whiteboard.WhiteboardKeyUtil
|
||||
import org.bigbluebutton.common.messages.WhiteboardKeyUtil
|
||||
// import org.bigbluebutton.core.service.whiteboard.WhiteboardKeyUtil
|
||||
import com.google.gson.Gson
|
||||
import java.util.ArrayList
|
||||
import org.bigbluebutton.core.OutMessageGateway
|
||||
|
@ -120,7 +120,7 @@ trait UsersApp {
|
||||
log.info("Register user failed. Mmeeting has ended. meetingId=" + mProps.meetingID + " userId=" + msg.userID)
|
||||
sendMeetingHasEnded(msg.userID)
|
||||
} else {
|
||||
val regUser = new RegisteredUser(msg.userID, msg.extUserID, msg.name, msg.role, msg.authToken)
|
||||
val regUser = new RegisteredUser(msg.userID, msg.extUserID, msg.name, msg.role, msg.authToken, msg.avatarURL)
|
||||
usersModel.addRegisteredUser(msg.authToken, regUser)
|
||||
|
||||
log.info("Register user success. meetingId=" + mProps.meetingID + " userId=" + msg.userID + " user=" + regUser)
|
||||
@ -246,6 +246,18 @@ trait UsersApp {
|
||||
+ ". Making user=[" + mod.userID + "] presenter.")
|
||||
assignNewPresenter(mod.userID, mod.name, mod.userID)
|
||||
}
|
||||
|
||||
if (meetingModel.isBroadcastingRTMP()) {
|
||||
// The presenter left during desktop sharing. Stop desktop sharing on FreeSWITCH
|
||||
outGW.send(new DeskShareHangUp(mProps.meetingID, mProps.voiceBridge))
|
||||
|
||||
// notify other clients to close their deskshare view
|
||||
outGW.send(new DeskShareNotifyViewersRTMP(mProps.meetingID, meetingModel.getRTMPBroadcastingUrl(),
|
||||
meetingModel.getDesktopShareVideoWidth(), meetingModel.getDesktopShareVideoHeight(), false))
|
||||
|
||||
// reset meeting info
|
||||
meetingModel.resetDesktopSharingParams()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -329,7 +341,7 @@ trait UsersApp {
|
||||
*/
|
||||
new VoiceUser(u.voiceUser.userId, msg.userID, ru.name, ru.name,
|
||||
joined = false, locked = false, muted = false,
|
||||
talking = false, listenOnly = u.listenOnly)
|
||||
talking = false, u.avatarURL, listenOnly = u.listenOnly)
|
||||
}
|
||||
}
|
||||
case None => {
|
||||
@ -339,7 +351,7 @@ trait UsersApp {
|
||||
*/
|
||||
new VoiceUser(msg.userID, msg.userID, ru.name, ru.name,
|
||||
joined = false, locked = false,
|
||||
muted = false, talking = false, listenOnly = false)
|
||||
muted = false, talking = false, ru.avatarURL, listenOnly = false)
|
||||
}
|
||||
}
|
||||
|
||||
@ -363,7 +375,7 @@ trait UsersApp {
|
||||
ru.role, emojiStatus = "none", presenter = false,
|
||||
hasStream = false, locked = getInitialLockStatus(ru.role),
|
||||
webcamStreams = new ListSet[String](), phoneUser = false, vu,
|
||||
listenOnly = vu.listenOnly, joinedWeb = true)
|
||||
listenOnly = vu.listenOnly, avatarURL = vu.avatarURL, joinedWeb = true)
|
||||
|
||||
usersModel.addUser(uvo)
|
||||
|
||||
@ -399,9 +411,9 @@ trait UsersApp {
|
||||
* and is reconnecting. Make the user as joined only in the voice conference. If we get a
|
||||
* user left voice conference message, then we will remove the user from the users list.
|
||||
*/
|
||||
switchUserToPhoneUser((new UserJoinedVoiceConfMessage(mProps.voiceBridge,
|
||||
switchUserToPhoneUser(new UserJoinedVoiceConfMessage(mProps.voiceBridge,
|
||||
vu.userId, u.userID, u.externUserID, vu.callerName,
|
||||
vu.callerNum, vu.muted, vu.talking, u.listenOnly)));
|
||||
vu.callerNum, vu.muted, vu.talking, vu.avatarURL, u.listenOnly));
|
||||
}
|
||||
|
||||
checkCaptionOwnerLogOut(u.userID)
|
||||
@ -438,7 +450,7 @@ trait UsersApp {
|
||||
* If user is not joined listenOnly then user is joined calling through phone or webrtc.
|
||||
*/
|
||||
val vu = new VoiceUser(msg.voiceUserId, webUserId, msg.callerIdName, msg.callerIdNum,
|
||||
joined = !msg.listenOnly, locked = false, muted = msg.muted, talking = msg.talking, listenOnly = msg.listenOnly)
|
||||
joined = !msg.listenOnly, locked = false, muted = msg.muted, talking = msg.talking, msg.avatarURL, listenOnly = msg.listenOnly)
|
||||
|
||||
/**
|
||||
* If user is not joined listenOnly then user is joined calling through phone or webrtc.
|
||||
@ -448,7 +460,7 @@ trait UsersApp {
|
||||
Role.VIEWER, emojiStatus = "none", presenter = false,
|
||||
hasStream = false, locked = getInitialLockStatus(Role.VIEWER),
|
||||
webcamStreams = new ListSet[String](),
|
||||
phoneUser = !msg.listenOnly, vu, listenOnly = msg.listenOnly, joinedWeb = false)
|
||||
phoneUser = !msg.listenOnly, vu, listenOnly = msg.listenOnly, avatarURL = msg.avatarURL, joinedWeb = false)
|
||||
|
||||
usersModel.addUser(uvo)
|
||||
|
||||
@ -482,7 +494,7 @@ trait UsersApp {
|
||||
case Some(user) => {
|
||||
val vu = new VoiceUser(msg.voiceUserId, msg.userId, msg.callerIdName,
|
||||
msg.callerIdNum, joined = true, locked = false,
|
||||
msg.muted, msg.talking, msg.listenOnly)
|
||||
msg.muted, msg.talking, msg.avatarURL, msg.listenOnly)
|
||||
val nu = user.copy(voiceUser = vu, listenOnly = msg.listenOnly)
|
||||
usersModel.addUser(nu)
|
||||
|
||||
@ -512,7 +524,7 @@ trait UsersApp {
|
||||
|
||||
val vu = new VoiceUser(msg.voiceUserId, msg.userId, msg.callerIdName,
|
||||
msg.callerIdNum, joined = true, locked = false,
|
||||
msg.muted, msg.talking, msg.listenOnly)
|
||||
msg.muted, msg.talking, msg.avatarURL, msg.listenOnly)
|
||||
val nu = user.copy(voiceUser = vu, listenOnly = msg.listenOnly)
|
||||
usersModel.addUser(nu)
|
||||
|
||||
@ -552,7 +564,7 @@ trait UsersApp {
|
||||
* Reset user's voice status.
|
||||
*/
|
||||
val vu = new VoiceUser(user.userID, user.userID, user.name, user.name,
|
||||
joined = false, locked = false, muted = false, talking = false, listenOnly = false)
|
||||
joined = false, locked = false, muted = false, talking = false, user.avatarURL, listenOnly = false)
|
||||
val nu = user.copy(voiceUser = vu, phoneUser = false, listenOnly = false)
|
||||
usersModel.addUser(nu)
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
package org.bigbluebutton.core.apps
|
||||
|
||||
import org.bigbluebutton.core.api._
|
||||
import org.bigbluebutton.core.service.whiteboard.WhiteboardKeyUtil
|
||||
import org.bigbluebutton.common.messages.WhiteboardKeyUtil
|
||||
import org.bigbluebutton.core.OutMessageGateway
|
||||
import org.bigbluebutton.core.LiveMeeting
|
||||
|
||||
@ -90,4 +90,4 @@ trait WhiteboardApp {
|
||||
val enabled = wbModel.isWhiteboardEnabled()
|
||||
outGW.send(new IsWhiteboardEnabledReply(mProps.meetingID, mProps.recorded, msg.requesterID, enabled, msg.replyTo))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -9,7 +9,7 @@ import scala.collection.JavaConversions._
|
||||
import java.util.ArrayList
|
||||
import org.bigbluebutton.common.messages.MessagingConstants
|
||||
import org.bigbluebutton.core.messaging.Util
|
||||
import org.bigbluebutton.core.service.chat.ChatKeyUtil
|
||||
import org.bigbluebutton.common.messages.ChatKeyUtil
|
||||
|
||||
object ChatMessageToJsonConverter {
|
||||
|
||||
|
@ -0,0 +1,39 @@
|
||||
package org.bigbluebutton.core.pubsub.senders
|
||||
|
||||
import org.bigbluebutton.core.api._
|
||||
import org.bigbluebutton.common.messages.DeskShareStartRTMPBroadcastEventMessage
|
||||
import org.bigbluebutton.common.messages.DeskShareStopRTMPBroadcastEventMessage
|
||||
import org.bigbluebutton.common.messages.DeskShareNotifyViewersRTMPEventMessage
|
||||
import org.bigbluebutton.common.messages.DeskShareNotifyASingleViewerEventMessage
|
||||
import org.bigbluebutton.common.messages.DeskShareHangUpEventMessage
|
||||
|
||||
object DeskShareMessageToJsonConverter {
|
||||
def getDeskShareHangUpToJson(msg: DeskShareHangUp): String = {
|
||||
val newMsg = new DeskShareHangUpEventMessage(msg.meetingID, msg.fsConferenceName, TimestampGenerator.getCurrentTime.toString())
|
||||
newMsg.toJson()
|
||||
}
|
||||
|
||||
def getDeskShareNotifyASingleViewerToJson(msg: DeskShareNotifyASingleViewer): String = {
|
||||
val newMsg = new DeskShareNotifyASingleViewerEventMessage(msg.meetingID, msg.userID,
|
||||
msg.streamPath, msg.broadcasting, msg.videoWidth, msg.videoHeight, TimestampGenerator.getCurrentTime.toString())
|
||||
newMsg.toJson()
|
||||
}
|
||||
|
||||
def getDeskShareStartRTMPBroadcastToJson(msg: DeskShareStartRTMPBroadcast): String = {
|
||||
val newMsg = new DeskShareStartRTMPBroadcastEventMessage(msg.conferenceName, msg.streamPath,
|
||||
TimestampGenerator.getCurrentTime.toString())
|
||||
newMsg.toJson()
|
||||
}
|
||||
|
||||
def getDeskShareStopRTMPBroadcastToJson(msg: DeskShareStopRTMPBroadcast): String = {
|
||||
val newMsg = new DeskShareStopRTMPBroadcastEventMessage(msg.conferenceName, msg.streamPath,
|
||||
TimestampGenerator.getCurrentTime.toString())
|
||||
newMsg.toJson()
|
||||
}
|
||||
|
||||
def getDeskShareNotifyViewersRTMPToJson(msg: DeskShareNotifyViewersRTMP): String = {
|
||||
val newMsg = new DeskShareNotifyViewersRTMPEventMessage(msg.meetingID, msg.streamPath,
|
||||
msg.broadcasting, msg.videoWidth, msg.videoHeight, TimestampGenerator.getCurrentTime.toString())
|
||||
newMsg.toJson()
|
||||
}
|
||||
}
|
@ -23,6 +23,7 @@ object UsersMessageToJsonConverter {
|
||||
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
|
||||
@ -46,6 +47,7 @@ object UsersMessageToJsonConverter {
|
||||
wuser += "name" -> user.name
|
||||
wuser += "role" -> user.role.toString()
|
||||
wuser += "authToken" -> user.authToken
|
||||
wuser += "avatarURL" -> user.avatarURL
|
||||
|
||||
mapAsJavaMap(wuser)
|
||||
}
|
||||
@ -429,4 +431,4 @@ object UsersMessageToJsonConverter {
|
||||
val header = Util.buildHeader(MessageNames.USER_LISTEN_ONLY, None)
|
||||
Util.buildJson(header, payload)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because one or more lines are too long
@ -24,6 +24,8 @@ resolvers ++= Seq(
|
||||
"blindside-repos" at "http://blindside.googlecode.com/svn/repository/"
|
||||
)
|
||||
|
||||
resolvers += Resolver.sonatypeRepo("releases")
|
||||
|
||||
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.
|
||||
@ -38,21 +40,21 @@ testOptions in Test += Tests.Argument(TestFrameworks.ScalaTest, "-h", "target/sc
|
||||
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" % "2.5",
|
||||
"redis.clients" % "jedis" % "2.1.0",
|
||||
"org.apache.commons" % "commons-lang3" % "3.2",
|
||||
"org.bigbluebutton" % "bbb-common-message" % "0.0.17-SNAPSHOT",
|
||||
"org.bigbluebutton" % "bbb-fsesl-client" % "0.0.3"
|
||||
)}
|
||||
"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" % "0.0.18-SNAPSHOT",
|
||||
"org.bigbluebutton" % "bbb-fsesl-client" % "0.0.4"
|
||||
)}
|
||||
|
||||
seq(Revolver.settings: _*)
|
||||
|
||||
|
@ -0,0 +1,73 @@
|
||||
<!-- http://wiki.freeswitch.org/wiki/Mod_conference -->
|
||||
<!-- None of these paths are real if you want any of these options you need to really set them up -->
|
||||
<configuration name="conference.conf" description="Audio Conference">
|
||||
<!-- Advertise certain presence on startup . -->
|
||||
<advertise>
|
||||
<room name="3001@$${domain}" status="FreeSWITCH"/>
|
||||
</advertise>
|
||||
|
||||
<!-- These are the default keys that map when you do not specify a caller control group -->
|
||||
<!-- Note: none and default are reserved names for group names. Disabled if dist-dtmf member flag is set. -->
|
||||
<caller-controls>
|
||||
<group name="default">
|
||||
<control action="mute" digits="0"/>
|
||||
<control action="deaf mute" digits="*"/>
|
||||
<control action="energy up" digits="9"/>
|
||||
<control action="energy equ" digits="8"/>
|
||||
<control action="energy dn" digits="7"/>
|
||||
<control action="vol talk up" digits="3"/>
|
||||
<control action="vol talk zero" digits="2"/>
|
||||
<control action="vol talk dn" digits="1"/>
|
||||
<control action="vol listen up" digits="6"/>
|
||||
<control action="vol listen zero" digits="5"/>
|
||||
<control action="vol listen dn" digits="4"/>
|
||||
<control action="hangup" digits="#"/>
|
||||
</group>
|
||||
</caller-controls>
|
||||
|
||||
<!-- Profiles are collections of settings you can reference by name. -->
|
||||
<profiles>
|
||||
|
||||
<!-- profile used for WebRTC Desktop Sharing -->
|
||||
<profile name="video-mcu-stereo">
|
||||
<param name="domain" value="$${domain}"/>
|
||||
<param name="rate" value="48000"/>
|
||||
<param name="channels" value="2"/>
|
||||
<param name="interval" value="20"/>
|
||||
<param name="energy-level" value="200"/>
|
||||
<!-- <param name="tts-engine" value="flite"/> -->
|
||||
<!-- <param name="tts-voice" value="kal16"/> -->
|
||||
|
||||
<!--remove audio for when user is alone since we hit this case every time-->
|
||||
<!--with -DESKSHARE conference. It has a single user only by default-->
|
||||
|
||||
<!--<param name="muted-sound" value="conference/conf-muted.wav"/>-->
|
||||
<!--<param name="unmuted-sound" value="conference/conf-unmuted.wav"/>-->
|
||||
<!-- <param name="alone-sound" value="conference/conf-alone.wav"/> -->
|
||||
<!-- <param name="moh-sound" value="local_stream://stereo"/> -->
|
||||
<!--<param name="enter-sound" value="tone_stream://%(200,0,500,600,700)"/>-->
|
||||
<!--<param name="exit-sound" value="tone_stream://%(500,0,300,200,100,50,25)"/>-->
|
||||
<!--<param name="kicked-sound" value="conference/conf-kicked.wav"/>-->
|
||||
<!--<param name="locked-sound" value="conference/conf-locked.wav"/>-->
|
||||
<!--<param name="is-locked-sound" value="conference/conf-is-locked.wav"/>-->
|
||||
<!--<param name="is-unlocked-sound" value="conference/conf-is-unlocked.wav"/>-->
|
||||
<!--<param name="pin-sound" value="conference/conf-pin.wav"/>-->
|
||||
<!--<param name="bad-pin-sound" value="conference/conf-bad-pin.wav"/>-->
|
||||
|
||||
<param name="caller-id-name" value="$${outbound_caller_name}"/>
|
||||
<param name="caller-id-number" value="$${outbound_caller_id}"/>
|
||||
<param name="comfort-noise" value="false"/>
|
||||
<param name="conference-flags" value="video-floor-only|video-required-for-canvas|rfc-4579|livearray-sync|minimize-video-encoding"/>
|
||||
|
||||
<param name="video-mode" value="mux"/> <!-- other values for video-mode are transcode or passthrough -->
|
||||
<param name="video-layout-name" value="1x1"/> <!-- 1x1 since we only have 1 video stream -->
|
||||
<param name="video-layout-name" value="group:grid"/>
|
||||
<param name="video-canvas-size" value="1920x1080"/>
|
||||
<param name="video-canvas-bgcolor" value="#333333"/>
|
||||
<param name="video-layout-bgcolor" value="#000000"/>
|
||||
<param name="video-codec-bandwidth" value="1mb"/>
|
||||
<param name="video-fps" value="15"/>
|
||||
</profile>
|
||||
|
||||
</profiles>
|
||||
</configuration>
|
@ -0,0 +1,30 @@
|
||||
<configuration name="verto.conf" description="HTML5 Verto Endpoint">
|
||||
|
||||
<settings>
|
||||
<param name="debug" value="10"/>
|
||||
</settings>
|
||||
|
||||
<profiles>
|
||||
<profile name="mine">
|
||||
<param name="bind-local" value="0.0.0.0:8081"/>
|
||||
<param name="bind-local" value="0.0.0.0:8082" secure="true"/>
|
||||
<param name="force-register-domain" value="$${domain}"/>
|
||||
<param name="secure-combined" value="$${certs_dir}/wss.pem"/>
|
||||
<param name="secure-chain" value="$${certs_dir}/wss.pem"/>
|
||||
<param name="userauth" value="true"/>
|
||||
<!-- setting this to true will allow anyone to register even with no account so use with care -->
|
||||
<param name="blind-reg" value="false"/>
|
||||
<param name="mcast-ip" value="224.1.1.1"/>
|
||||
<param name="mcast-port" value="1337"/>
|
||||
<param name="rtp-ip" value="$${local_ip_v4}"/>
|
||||
<!-- <param name="ext-rtp-ip" value=""/> -->
|
||||
<param name="local-network" value="localnet.auto"/>
|
||||
<param name="outbound-codec-string" value="opus,vp8"/>
|
||||
<param name="inbound-codec-string" value="opus,vp8"/>
|
||||
<param name="apply-candidate-acl" value="wan.auto"/>
|
||||
<param name="timer-name" value="soft"/>
|
||||
|
||||
</profile>
|
||||
</profiles>
|
||||
|
||||
</configuration>
|
34
akka-bbb-fsesl/fs_conf_files/conf/dialplan/default.xml
Normal file
34
akka-bbb-fsesl/fs_conf_files/conf/dialplan/default.xml
Normal file
@ -0,0 +1,34 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
NOTICE:
|
||||
|
||||
This context is usually accessed via authenticated callers on the sip profile on port 5060
|
||||
or transfered callers from the public context which arrived via the sip profile on port 5080.
|
||||
|
||||
Authenticated users will use the user_context variable on the user to determine what context
|
||||
they can access. You can also add a user in the directory with the cidr= attribute acl.conf.xml
|
||||
will build the domains ACL using this value.
|
||||
-->
|
||||
<!-- http://wiki.freeswitch.org/wiki/Dialplan_XML -->
|
||||
<include>
|
||||
<context name="default">
|
||||
<extension name="public_extensions">
|
||||
<condition field="destination_number" expression="^\d{5}$">
|
||||
<action application="log" data="INFO AAAAAA transferring to $1 XML public!!"/>
|
||||
<action application="transfer" data="${destination_number} XML public"/>
|
||||
</condition>
|
||||
</extension>
|
||||
|
||||
|
||||
<extension name="public_extensions">
|
||||
<condition field="destination_number" expression="^(\d{5})(-screen)$">
|
||||
<action application="log" data="INFO BB $1 $2 BBBB transferring to $1 XML public!!"/>
|
||||
<action application="transfer" data="$1 XML public"/>
|
||||
</condition>
|
||||
</extension>
|
||||
|
||||
<!-- other extensions -->
|
||||
|
||||
</context>
|
||||
</include>
|
||||
|
32
akka-bbb-fsesl/fs_conf_files/conf/dialplan/public.xml
Normal file
32
akka-bbb-fsesl/fs_conf_files/conf/dialplan/public.xml
Normal file
@ -0,0 +1,32 @@
|
||||
<!--
|
||||
NOTICE:
|
||||
|
||||
This context is usually accessed via the external sip profile listening on port 5080.
|
||||
|
||||
It is recommended to have separate inbound and outbound contexts. Not only for security
|
||||
but clearing up why you would need to do such a thing. You don't want outside un-authenticated
|
||||
callers hitting your default context which allows dialing calls thru your providers and results
|
||||
in Toll Fraud.
|
||||
-->
|
||||
|
||||
<!-- http://wiki.freeswitch.org/wiki/Dialplan_XML -->
|
||||
<include>
|
||||
<context name="public">
|
||||
|
||||
<!-- other extensions -->
|
||||
|
||||
<extension name="public_extensions">
|
||||
<condition field="destination_number" expression="^\d{5}$">
|
||||
<action application="log" data="INFO ************ redirecting ${destination_number} to ${destination_number}-DESKSHARE@video-mcu-stereo ***********" />
|
||||
<action application="answer"/>
|
||||
<action application="conference" data="${destination_number}-DESKSHARE@video-mcu-stereo"/>
|
||||
</condition>
|
||||
</extension>
|
||||
|
||||
<!--
|
||||
You can place files in the public directory to get included.
|
||||
-->
|
||||
<X-PRE-PROCESS cmd="include" data="public/*.xml"/>
|
||||
|
||||
</context>
|
||||
</include>
|
@ -7,6 +7,9 @@ import org.bigbluebutton.common.messages.MuteUserInVoiceConfRequestMessage;
|
||||
import org.bigbluebutton.common.messages.StartRecordingVoiceConfRequestMessage;
|
||||
import org.bigbluebutton.common.messages.StopRecordingVoiceConfRequestMessage;
|
||||
import org.bigbluebutton.common.messages.TransferUserToVoiceConfRequestMessage;
|
||||
import org.bigbluebutton.common.messages.DeskShareStartRTMPBroadcastEventMessage;
|
||||
import org.bigbluebutton.common.messages.DeskShareStopRTMPBroadcastEventMessage;
|
||||
import org.bigbluebutton.common.messages.DeskShareHangUpEventMessage;
|
||||
import org.bigbluebutton.freeswitch.voice.freeswitch.FreeswitchApplication;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
@ -58,12 +61,39 @@ public class RedisMessageReceiver {
|
||||
case StopRecordingVoiceConfRequestMessage.STOP_RECORD_VOICE_CONF_REQUEST:
|
||||
processStopRecordingVoiceConfRequestMessage(message);
|
||||
break;
|
||||
case DeskShareStartRTMPBroadcastEventMessage.DESKSHARE_START_RTMP_BROADCAST_MESSAGE:
|
||||
System.out.println("RedisMessageReceiver got DESKSHARE_START_RTMP_BROADCAST_MESSAGE");
|
||||
processDeskShareStartRTMPBroadcastEventMessage(message);
|
||||
break;
|
||||
case DeskShareStopRTMPBroadcastEventMessage.DESKSHARE_STOP_RTMP_BROADCAST_MESSAGE:
|
||||
System.out.println("RedisMessageReceiver got DESKSHARE_STOP_RTMP_BROADCAST_MESSAGE");
|
||||
processDeskShareStopRTMPBroadcastEventMessage(message);
|
||||
break;
|
||||
case DeskShareHangUpEventMessage.DESKSHARE_HANG_UP_MESSAGE:
|
||||
System.out.println("RedisMessageReceiver got DESKSHARE_HANG_UP_MESSAGE");
|
||||
processDeskShareHangUpEventMessage(message);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void processDeskShareStartRTMPBroadcastEventMessage(String json) {
|
||||
DeskShareStartRTMPBroadcastEventMessage msg = DeskShareStartRTMPBroadcastEventMessage.fromJson(json);
|
||||
fsApp.deskShareBroadcastRTMP(msg.conferenceName, msg.streamUrl, msg.timestamp, true);
|
||||
}
|
||||
|
||||
private void processDeskShareStopRTMPBroadcastEventMessage(String json) {
|
||||
DeskShareStopRTMPBroadcastEventMessage msg = DeskShareStopRTMPBroadcastEventMessage.fromJson(json);
|
||||
fsApp.deskShareBroadcastRTMP(msg.conferenceName, msg.streamUrl, msg.timestamp, false);
|
||||
}
|
||||
|
||||
private void processDeskShareHangUpEventMessage(String json) {
|
||||
DeskShareHangUpEventMessage msg = DeskShareHangUpEventMessage.fromJson(json);
|
||||
fsApp.deskShareHangUp(msg.conferenceName, msg.fsConferenceName, msg.timestamp);
|
||||
}
|
||||
|
||||
private void processEjectAllVoiceUsersRequestMessage(String json) {
|
||||
EjectAllUsersFromVoiceConfRequestMessage msg = EjectAllUsersFromVoiceConfRequestMessage
|
||||
.fromJson(json);
|
||||
|
@ -24,7 +24,10 @@ import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.LinkedBlockingQueue;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import org.bigbluebutton.freeswitch.voice.events.DeskShareStartedEvent;
|
||||
import org.bigbluebutton.freeswitch.voice.events.DeskShareEndedEvent;
|
||||
import org.bigbluebutton.freeswitch.voice.events.ConferenceEventListener;
|
||||
import org.bigbluebutton.freeswitch.voice.events.DeskShareRTMPBroadcastEvent;
|
||||
import org.bigbluebutton.freeswitch.voice.events.VoiceConferenceEvent;
|
||||
import org.bigbluebutton.freeswitch.voice.events.VoiceStartRecordingEvent;
|
||||
import org.bigbluebutton.freeswitch.voice.events.VoiceUserJoinedEvent;
|
||||
@ -61,7 +64,7 @@ public class FreeswitchConferenceEventListener implements ConferenceEventListene
|
||||
System.out.println("************** FreeswitchConferenceEventListener received voiceUserJoined ");
|
||||
VoiceUserJoinedEvent evt = (VoiceUserJoinedEvent) event;
|
||||
vcs.userJoinedVoiceConf(evt.getRoom(), evt.getVoiceUserId(), evt.getUserId(), evt.getCallerIdName(),
|
||||
evt.getCallerIdNum(), evt.getMuted(), evt.getSpeaking());
|
||||
evt.getCallerIdNum(), evt.getMuted(), evt.getSpeaking(), evt.getAvatarURL());
|
||||
} else if (event instanceof VoiceUserLeftEvent) {
|
||||
System.out.println("************** FreeswitchConferenceEventListener received VoiceUserLeftEvent ");
|
||||
VoiceUserLeftEvent evt = (VoiceUserLeftEvent) event;
|
||||
@ -78,13 +81,33 @@ public class FreeswitchConferenceEventListener implements ConferenceEventListene
|
||||
VoiceStartRecordingEvent evt = (VoiceStartRecordingEvent) event;
|
||||
System.out.println("************** FreeswitchConferenceEventListener VoiceStartRecordingEvent recording=[" + evt.startRecord() + "]");
|
||||
vcs.voiceConfRecordingStarted(evt.getRoom(), evt.getRecordingFilename(), evt.startRecord(), evt.getTimestamp());
|
||||
}
|
||||
} else if (event instanceof DeskShareStartedEvent) {
|
||||
DeskShareStartedEvent evt = (DeskShareStartedEvent) event;
|
||||
System.out.println("************** FreeswitchConferenceEventListener DeskShareStartedEvent");
|
||||
vcs.deskShareStarted(evt.getRoom(), evt.getCallerIdNum(), evt.getCallerIdName());
|
||||
} else if (event instanceof DeskShareEndedEvent) {
|
||||
DeskShareEndedEvent evt = (DeskShareEndedEvent) event;
|
||||
System.out.println("************** FreeswitchConferenceEventListener DeskShareEndedEvent");
|
||||
vcs.deskShareEnded(evt.getRoom(), evt.getCallerIdNum(), evt.getCallerIdName());
|
||||
} else if (event instanceof DeskShareRTMPBroadcastEvent) {
|
||||
if (((DeskShareRTMPBroadcastEvent) event).getBroadcast()) {
|
||||
DeskShareRTMPBroadcastEvent evt = (DeskShareRTMPBroadcastEvent) event;
|
||||
System.out.println("************** FreeswitchConferenceEventListener DeskShareRTMPBroadcastStartedEvent");
|
||||
vcs.deskShareRTMPBroadcastStarted(evt.getRoom(), evt.getBroadcastingStreamUrl(),
|
||||
evt.getVideoWidth(), evt.getVideoHeight(), evt.getTimestamp());
|
||||
} else {
|
||||
DeskShareRTMPBroadcastEvent evt = (DeskShareRTMPBroadcastEvent) event;
|
||||
System.out.println("************** FreeswitchConferenceEventListener DeskShareRTMPBroadcastStoppedEvent");
|
||||
vcs.deskShareRTMPBroadcastStopped(evt.getRoom(), evt.getBroadcastingStreamUrl(),
|
||||
evt.getVideoWidth(), evt.getVideoHeight(), evt.getTimestamp());
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
runExec.execute(task);
|
||||
}
|
||||
|
||||
|
||||
public void start() {
|
||||
sendMessages = true;
|
||||
Runnable sender = new Runnable() {
|
||||
@ -97,7 +120,7 @@ public class FreeswitchConferenceEventListener implements ConferenceEventListene
|
||||
} catch (InterruptedException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
@ -111,5 +134,5 @@ public class FreeswitchConferenceEventListener implements ConferenceEventListene
|
||||
public void handleConferenceEvent(VoiceConferenceEvent event) {
|
||||
queueMessage(event);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -3,10 +3,14 @@ package org.bigbluebutton.freeswitch.voice;
|
||||
public interface IVoiceConferenceService {
|
||||
void voiceConfRecordingStarted(String voiceConfId, String recordStream, Boolean recording, String timestamp);
|
||||
void userJoinedVoiceConf(String voiceConfId, String voiceUserId, String userId, String callerIdName,
|
||||
String callerIdNum, Boolean muted, Boolean speaking);
|
||||
String callerIdNum, Boolean muted, Boolean speaking, String avatarURL);
|
||||
void userLeftVoiceConf(String voiceConfId, String voiceUserId);
|
||||
void userLockedInVoiceConf(String voiceConfId, String voiceUserId, Boolean locked);
|
||||
void userMutedInVoiceConf(String voiceConfId, String voiceUserId, Boolean muted);
|
||||
void userTalkingInVoiceConf(String voiceConfId, String voiceUserId, Boolean talking);
|
||||
void deskShareStarted(String voiceConfId, String callerIdNum, String callerIdName);
|
||||
void deskShareEnded(String voiceConfId, String callerIdNum, String callerIdName);
|
||||
void deskShareRTMPBroadcastStarted(String room, String streamname, Integer videoWidth, Integer videoHeight, String timestamp);
|
||||
void deskShareRTMPBroadcastStopped(String room, String streamname, Integer videoWidth, Integer videoHeight, String timestamp);
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,39 @@
|
||||
/**
|
||||
* 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.freeswitch.voice.events;
|
||||
|
||||
public class DeskShareEndedEvent extends VoiceConferenceEvent {
|
||||
|
||||
private final String callerIdNum;
|
||||
private final String callerIdName;
|
||||
|
||||
public DeskShareEndedEvent(String room, String callerIdNum, String callerIdName) {
|
||||
super(room);
|
||||
this.callerIdName = callerIdName;
|
||||
this.callerIdNum = callerIdNum;
|
||||
}
|
||||
|
||||
public String getCallerIdNum() {
|
||||
return callerIdNum;
|
||||
}
|
||||
|
||||
public String getCallerIdName() {
|
||||
return callerIdName;
|
||||
}
|
||||
}
|
@ -0,0 +1,68 @@
|
||||
/**
|
||||
* 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.freeswitch.voice.events;
|
||||
|
||||
public class DeskShareRTMPBroadcastEvent extends VoiceConferenceEvent {
|
||||
|
||||
private String timestamp;
|
||||
private boolean broadcast;
|
||||
private String streamUrl;
|
||||
private Integer vw;
|
||||
private Integer vh;
|
||||
|
||||
private final String DESKSHARE_SUFFIX = "-DESKSHARE";
|
||||
|
||||
|
||||
public DeskShareRTMPBroadcastEvent(String room, boolean broadcast) {
|
||||
super(room);
|
||||
this.broadcast = broadcast;
|
||||
}
|
||||
|
||||
public void setTimestamp(String timestamp) {
|
||||
this.timestamp = timestamp;
|
||||
}
|
||||
|
||||
public void setBroadcastingStreamUrl(String streamUrl) {
|
||||
this.streamUrl = streamUrl;
|
||||
}
|
||||
|
||||
public void setVideoWidth(Integer vw) {this.vw = vw;}
|
||||
|
||||
public void setVideoHeight(Integer vh) {this.vh = vh;}
|
||||
|
||||
public Integer getVideoHeight() {return vh;}
|
||||
|
||||
public Integer getVideoWidth() {return vw;}
|
||||
|
||||
public String getTimestamp() {
|
||||
return timestamp;
|
||||
}
|
||||
|
||||
public String getBroadcastingStreamUrl()
|
||||
{
|
||||
if (streamUrl.endsWith(DESKSHARE_SUFFIX)) {
|
||||
streamUrl = streamUrl.replace(DESKSHARE_SUFFIX, "");
|
||||
}
|
||||
return streamUrl;
|
||||
}
|
||||
|
||||
public boolean getBroadcast() {
|
||||
return broadcast;
|
||||
}
|
||||
}
|
@ -0,0 +1,39 @@
|
||||
/**
|
||||
* 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.freeswitch.voice.events;
|
||||
|
||||
public class DeskShareStartedEvent extends VoiceConferenceEvent {
|
||||
|
||||
private final String callerIdNum;
|
||||
private final String callerIdName;
|
||||
|
||||
public DeskShareStartedEvent(String room, String callerIdNum, String callerIdName) {
|
||||
super(room);
|
||||
this.callerIdName = callerIdName;
|
||||
this.callerIdNum = callerIdNum;
|
||||
}
|
||||
|
||||
public String getCallerIdNum() {
|
||||
return callerIdNum;
|
||||
}
|
||||
|
||||
public String getCallerIdName() {
|
||||
return callerIdName;
|
||||
}
|
||||
}
|
@ -27,10 +27,11 @@ public class VoiceUserJoinedEvent extends VoiceConferenceEvent {
|
||||
private final Boolean speaking;
|
||||
private final Boolean locked = false;
|
||||
private final String userId;
|
||||
private final String avatarURL;
|
||||
|
||||
public VoiceUserJoinedEvent(String userId, String voiceUserId, String room,
|
||||
String callerIdNum, String callerIdName,
|
||||
Boolean muted, Boolean speaking) {
|
||||
Boolean muted, Boolean speaking, String avatarURL) {
|
||||
super(room);
|
||||
this.userId = userId;
|
||||
this.voiceUserId = voiceUserId;
|
||||
@ -38,6 +39,7 @@ public class VoiceUserJoinedEvent extends VoiceConferenceEvent {
|
||||
this.callerIdNum = callerIdNum;
|
||||
this.muted = muted;
|
||||
this.speaking = speaking;
|
||||
this.avatarURL = avatarURL;
|
||||
}
|
||||
|
||||
public String getUserId() {
|
||||
@ -67,4 +69,8 @@ public class VoiceUserJoinedEvent extends VoiceConferenceEvent {
|
||||
public Boolean isLocked() {
|
||||
return locked;
|
||||
}
|
||||
|
||||
public String getAvatarURL() {
|
||||
return avatarURL;
|
||||
}
|
||||
}
|
||||
|
@ -22,7 +22,6 @@ import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.concurrent.ScheduledFuture;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import org.bigbluebutton.freeswitch.voice.events.ConferenceEventListener;
|
||||
import org.bigbluebutton.freeswitch.voice.freeswitch.actions.BroadcastConferenceCommand;
|
||||
import org.bigbluebutton.freeswitch.voice.freeswitch.actions.EjectAllUsersCommand;
|
||||
@ -31,6 +30,7 @@ import org.bigbluebutton.freeswitch.voice.freeswitch.actions.GetAllUsersCommand;
|
||||
import org.bigbluebutton.freeswitch.voice.freeswitch.actions.MuteUserCommand;
|
||||
import org.bigbluebutton.freeswitch.voice.freeswitch.actions.RecordConferenceCommand;
|
||||
import org.bigbluebutton.freeswitch.voice.freeswitch.actions.TransferUsetToMeetingCommand;
|
||||
import org.bigbluebutton.freeswitch.voice.freeswitch.actions.*;
|
||||
import org.freeswitch.esl.client.inbound.Client;
|
||||
import org.freeswitch.esl.client.inbound.InboundConnectionFailure;
|
||||
import org.freeswitch.esl.client.manager.ManagerConnection;
|
||||
@ -157,4 +157,22 @@ public class ConnectionManager {
|
||||
rcc.handleResponse(response, conferenceEventListener);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void broadcastRTMP(DeskShareBroadcastRTMPCommand rtmp) {
|
||||
Client c = manager.getESLClient();
|
||||
if (c.canSend()) {
|
||||
System.out.println("ConnectionManager: send to FS: broadcastRTMP " + rtmp.getCommandArgs());
|
||||
EslMessage response = c.sendSyncApiCommand(rtmp.getCommand(), rtmp.getCommandArgs());
|
||||
rtmp.handleResponse(response, conferenceEventListener);
|
||||
}
|
||||
}
|
||||
|
||||
public void hangUp(DeskShareHangUpCommand huCmd) {
|
||||
Client c = manager.getESLClient();
|
||||
if (c.canSend()) {
|
||||
System.out.println("ConnectionManager: send to FS: hangUp " + huCmd.getCommandArgs());
|
||||
EslMessage response = c.sendSyncApiCommand(huCmd.getCommand(), huCmd.getCommandArgs());
|
||||
huCmd.handleResponse(response, conferenceEventListener);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -7,6 +7,10 @@ import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import org.bigbluebutton.freeswitch.voice.events.ConferenceEventListener;
|
||||
import org.bigbluebutton.freeswitch.voice.events.DeskShareEndedEvent;
|
||||
import org.bigbluebutton.freeswitch.voice.events.DeskShareStartedEvent;
|
||||
import org.bigbluebutton.freeswitch.voice.events.DeskShareRTMPBroadcastEvent;
|
||||
import org.bigbluebutton.freeswitch.voice.events.VoiceConferenceEvent;
|
||||
import org.bigbluebutton.freeswitch.voice.events.VoiceStartRecordingEvent;
|
||||
import org.bigbluebutton.freeswitch.voice.events.VoiceUserJoinedEvent;
|
||||
import org.bigbluebutton.freeswitch.voice.events.VoiceUserLeftEvent;
|
||||
@ -22,11 +26,15 @@ public class ESLEventListener implements IEslEventListener {
|
||||
private static final String STOP_TALKING_EVENT = "stop-talking";
|
||||
private static final String START_RECORDING_EVENT = "start-recording";
|
||||
private static final String STOP_RECORDING_EVENT = "stop-recording";
|
||||
|
||||
|
||||
private static final String DESKSHARE_CONFERENCE_NAME_SUFFIX = "-DESKSHARE";
|
||||
private static final String DESKSHARE_CALLER_NAME_SUFFIX = " (Screen)";
|
||||
private static final String DESKSHARE_CALLER_ID_SUFFIX = " (screen)";
|
||||
|
||||
private final ConferenceEventListener conferenceEventListener;
|
||||
|
||||
public ESLEventListener(ConferenceEventListener conferenceEventListener) {
|
||||
this.conferenceEventListener = conferenceEventListener;
|
||||
this.conferenceEventListener = conferenceEventListener;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -50,7 +58,7 @@ public class ESLEventListener implements IEslEventListener {
|
||||
|
||||
@Override
|
||||
public void conferenceEventJoin(String uniqueId, String confName, int confSize, EslEvent event) {
|
||||
|
||||
|
||||
Integer memberId = this.getMemberIdFromEvent(event);
|
||||
Map<String, String> headers = event.getEventHeaders();
|
||||
String callerId = this.getCallerIdFromEvent(event);
|
||||
@ -59,29 +67,52 @@ public class ESLEventListener implements IEslEventListener {
|
||||
boolean speaking = headers.get("Talking").equals("true") ? true : false;
|
||||
|
||||
String voiceUserId = callerIdName;
|
||||
|
||||
|
||||
System.out.println("User joined voice conference, user=[" + callerIdName + "], conf=[" + confName + "]");
|
||||
|
||||
|
||||
Matcher gapMatcher = GLOBAL_AUDION_PATTERN.matcher(callerIdName);
|
||||
if (gapMatcher.matches()) {
|
||||
System.out.println("Ignoring GLOBAL AUDIO USER [" + callerIdName + "]");
|
||||
return;
|
||||
System.out.println("Ignoring GLOBAL AUDIO USER [" + callerIdName + "]");
|
||||
return;
|
||||
}
|
||||
|
||||
Matcher matcher = CALLERNAME_PATTERN.matcher(callerIdName);
|
||||
if (matcher.matches()) {
|
||||
voiceUserId = matcher.group(1).trim();
|
||||
callerIdName = matcher.group(2).trim();
|
||||
}
|
||||
|
||||
VoiceUserJoinedEvent pj = new VoiceUserJoinedEvent(voiceUserId, memberId.toString(), confName, callerId, callerIdName, muted, speaking);
|
||||
// Deskstop sharing conferences have their name in the form ddddd-DESKSHARE
|
||||
// Deskstop sharing conferences have the user with the desktop video displayed in this way:
|
||||
// username (Screen) and usernum (screen)
|
||||
if (confName.endsWith(DESKSHARE_CONFERENCE_NAME_SUFFIX) &&
|
||||
callerId.endsWith(DESKSHARE_CALLER_ID_SUFFIX) &&
|
||||
callerIdName.endsWith(DESKSHARE_CALLER_NAME_SUFFIX)) {
|
||||
DeskShareStartedEvent dsStart = new DeskShareStartedEvent(confName, callerId, callerIdName);
|
||||
conferenceEventListener.handleConferenceEvent(dsStart);
|
||||
}
|
||||
|
||||
Matcher matcher = CALLERNAME_PATTERN.matcher(callerIdName);
|
||||
if (matcher.matches()) {
|
||||
voiceUserId = matcher.group(1).trim();
|
||||
callerIdName = matcher.group(2).trim();
|
||||
}
|
||||
|
||||
VoiceUserJoinedEvent pj = new VoiceUserJoinedEvent(voiceUserId, memberId.toString(), confName, callerId, callerIdName, muted, speaking, "");
|
||||
conferenceEventListener.handleConferenceEvent(pj);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void conferenceEventLeave(String uniqueId, String confName, int confSize, EslEvent event) {
|
||||
public void conferenceEventLeave(String uniqueId, String confName, int confSize, EslEvent event) {
|
||||
Integer memberId = this.getMemberIdFromEvent(event);
|
||||
System.out.println("User left voice conference, user=[" + memberId.toString() + "], conf=[" + confName + "]");
|
||||
String callerId = this.getCallerIdFromEvent(event);
|
||||
String callerIdName = this.getCallerIdNameFromEvent(event);
|
||||
|
||||
// Deskstop sharing conferences have their name in the form ddddd-DESKSHARE
|
||||
// Deskstop sharing conferences have the user with the desktop video displayed in this way:
|
||||
// username (Screen) and usernum (screen)
|
||||
if (confName.endsWith(DESKSHARE_CONFERENCE_NAME_SUFFIX) &&
|
||||
callerId.endsWith(DESKSHARE_CALLER_ID_SUFFIX) &&
|
||||
callerIdName.endsWith(DESKSHARE_CALLER_NAME_SUFFIX)) {
|
||||
DeskShareEndedEvent dsEnd = new DeskShareEndedEvent(confName, callerId, callerIdName);
|
||||
conferenceEventListener.handleConferenceEvent(dsEnd);
|
||||
}
|
||||
|
||||
VoiceUserLeftEvent pl = new VoiceUserLeftEvent(memberId.toString(), confName);
|
||||
conferenceEventListener.handleConferenceEvent(pl);
|
||||
}
|
||||
@ -117,12 +148,12 @@ public class ESLEventListener implements IEslEventListener {
|
||||
|
||||
if (action.equals(START_TALKING_EVENT)) {
|
||||
pt = new VoiceUserTalkingEvent(memberId.toString(), confName, true);
|
||||
conferenceEventListener.handleConferenceEvent(pt);
|
||||
conferenceEventListener.handleConferenceEvent(pt);
|
||||
} else if (action.equals(STOP_TALKING_EVENT)) {
|
||||
pt = new VoiceUserTalkingEvent(memberId.toString(), confName, false);
|
||||
conferenceEventListener.handleConferenceEvent(pt);
|
||||
conferenceEventListener.handleConferenceEvent(pt);
|
||||
} else {
|
||||
System.out.println("Unknown conference Action [" + action + "]");
|
||||
System.out.println("Unknown conference Action [" + action + "]");
|
||||
}
|
||||
}
|
||||
|
||||
@ -133,52 +164,80 @@ public class ESLEventListener implements IEslEventListener {
|
||||
|
||||
@Override
|
||||
public void conferenceEventThreadRun(String uniqueId, String confName, int confSize, EslEvent event) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
//@Override
|
||||
public void conferenceEventRecord(String uniqueId, String confName, int confSize, EslEvent event) {
|
||||
String action = event.getEventHeaders().get("Action");
|
||||
|
||||
if(action == null) {
|
||||
String action = event.getEventHeaders().get("Action");
|
||||
|
||||
if(action == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
System.out.println("Handling conferenceEventRecord " + action);
|
||||
|
||||
if (action.equals(START_RECORDING_EVENT)) {
|
||||
VoiceStartRecordingEvent sre = new VoiceStartRecordingEvent(confName, true);
|
||||
sre.setRecordingFilename(getRecordFilenameFromEvent(event));
|
||||
sre.setTimestamp(genTimestamp().toString());
|
||||
|
||||
System.out.println("Voice conference recording started. file=[" + getRecordFilenameFromEvent(event) + "], conf=[" + confName + "]");
|
||||
|
||||
conferenceEventListener.handleConferenceEvent(sre);
|
||||
} else if (action.equals(STOP_RECORDING_EVENT)) {
|
||||
VoiceStartRecordingEvent srev = new VoiceStartRecordingEvent(confName, false);
|
||||
srev.setRecordingFilename(getRecordFilenameFromEvent(event));
|
||||
srev.setTimestamp(genTimestamp().toString());
|
||||
|
||||
System.out.println("Voice conference recording stopped. file=[" + getRecordFilenameFromEvent(event) + "], conf=[" + confName + "]");
|
||||
conferenceEventListener.handleConferenceEvent(srev);
|
||||
} else {
|
||||
System.out.println("Processing UNKNOWN conference Action " + action + "]");
|
||||
}
|
||||
|
||||
if (action.equals(START_RECORDING_EVENT)) {
|
||||
if (confName.endsWith(DESKSHARE_CONFERENCE_NAME_SUFFIX)){
|
||||
if (isRTMPStream(event)) {
|
||||
DeskShareRTMPBroadcastEvent rtmp = new DeskShareRTMPBroadcastEvent(confName, true);
|
||||
rtmp.setBroadcastingStreamUrl(getStreamUrl(event));
|
||||
rtmp.setVideoHeight(Integer.parseInt(getBroadcastParameter(event, "vh")));
|
||||
rtmp.setVideoWidth(Integer.parseInt(getBroadcastParameter(event, "vw")));
|
||||
rtmp.setTimestamp(genTimestamp().toString());
|
||||
|
||||
System.out.println("DeskShare conference broadcast started. url=["
|
||||
+ getStreamUrl(event) + "], conf=[" + confName + "]");
|
||||
conferenceEventListener.handleConferenceEvent(rtmp);
|
||||
}
|
||||
} else {
|
||||
VoiceStartRecordingEvent sre = new VoiceStartRecordingEvent(confName, true);
|
||||
sre.setRecordingFilename(getRecordFilenameFromEvent(event));
|
||||
sre.setTimestamp(genTimestamp().toString());
|
||||
|
||||
System.out.println("Voice conference recording started. file=["
|
||||
+ getRecordFilenameFromEvent(event) + "], conf=[" + confName + "]");
|
||||
conferenceEventListener.handleConferenceEvent(sre);
|
||||
}
|
||||
} else if (action.equals(STOP_RECORDING_EVENT)) {
|
||||
if (confName.endsWith(DESKSHARE_CONFERENCE_NAME_SUFFIX)){
|
||||
if (isRTMPStream(event)) {
|
||||
DeskShareRTMPBroadcastEvent rtmp = new DeskShareRTMPBroadcastEvent(confName, false);
|
||||
rtmp.setBroadcastingStreamUrl(getStreamUrl(event));
|
||||
rtmp.setVideoHeight(Integer.parseInt(getBroadcastParameter(event, "vh")));
|
||||
rtmp.setVideoWidth(Integer.parseInt(getBroadcastParameter(event, "vw")));
|
||||
rtmp.setTimestamp(genTimestamp().toString());
|
||||
|
||||
System.out.println("DeskShare conference broadcast stopped. url=["
|
||||
+ getStreamUrl(event) + "], conf=[" + confName + "]");
|
||||
conferenceEventListener.handleConferenceEvent(rtmp);
|
||||
}
|
||||
} else {
|
||||
VoiceStartRecordingEvent sre = new VoiceStartRecordingEvent(confName, false);
|
||||
sre.setRecordingFilename(getRecordFilenameFromEvent(event));
|
||||
sre.setTimestamp(genTimestamp().toString());
|
||||
System.out.println("Voice conference recording stopped. file=["
|
||||
+ getRecordFilenameFromEvent(event) + "], conf=[" + confName + "]");
|
||||
conferenceEventListener.handleConferenceEvent(sre);
|
||||
}
|
||||
}
|
||||
|
||||
else {
|
||||
System.out.println("Processing UNKNOWN conference Action " + action + "]");
|
||||
}
|
||||
}
|
||||
|
||||
private Long genTimestamp() {
|
||||
return TimeUnit.NANOSECONDS.toMillis(System.nanoTime());
|
||||
return TimeUnit.NANOSECONDS.toMillis(System.nanoTime());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void eventReceived(EslEvent event) {
|
||||
System.out.println("ESL Event Listener received event=[" + event.getEventName() + "]");
|
||||
@Override
|
||||
public void eventReceived(EslEvent event) {
|
||||
System.out.println("ESL Event Listener received event=[" + event.getEventName() + "]");
|
||||
// if (event.getEventName().equals(FreeswitchHeartbeatMonitor.EVENT_HEARTBEAT)) {
|
||||
//// setChanged();
|
||||
// notifyObservers(event);
|
||||
// return;
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
private Integer getMemberIdFromEvent(EslEvent e) {
|
||||
return new Integer(e.getEventHeaders().get("Member-ID"));
|
||||
@ -191,8 +250,52 @@ public class ESLEventListener implements IEslEventListener {
|
||||
private String getCallerIdNameFromEvent(EslEvent e) {
|
||||
return e.getEventHeaders().get("Caller-Caller-ID-Name");
|
||||
}
|
||||
|
||||
|
||||
private String getRecordFilenameFromEvent(EslEvent e) {
|
||||
return e.getEventHeaders().get("Path");
|
||||
return e.getEventHeaders().get("Path");
|
||||
}
|
||||
|
||||
// Distinguish between recording to a file:
|
||||
// /path/to/a/file.mp4
|
||||
// and broadcasting a stream:
|
||||
// {channels=2,samplerate=48000,vw=1920,vh=1080,fps=15.00}rtmp://192.168.0.109/live/abc/dev-test
|
||||
private Boolean isRTMPStream(EslEvent e) {
|
||||
String path = e.getEventHeaders().get("Path");
|
||||
|
||||
if (path.contains("rtmp") && path.contains("channels")
|
||||
&& path.contains("samplerate") && path.contains("vw")
|
||||
&& path.contains("vh") && path.contains("fps")) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// returns a String so that we can parse to an int or double depending on the param
|
||||
private String getBroadcastParameter(EslEvent e, String param) {
|
||||
String path = e.getEventHeaders().get("Path");
|
||||
if (isRTMPStream(e)) {
|
||||
String temp = path.substring(path.indexOf("{") + 1, path.indexOf("}"));
|
||||
String[] arr = temp.split(",");
|
||||
for (int i = 0; i < 5; i++) {
|
||||
if (arr[i].startsWith(param)) {
|
||||
return arr[i].substring(arr[i].indexOf('=') + 1);
|
||||
}
|
||||
}
|
||||
return "0";
|
||||
} else {
|
||||
return "0";
|
||||
}
|
||||
}
|
||||
|
||||
// Obtain the rtmp url from the event (if any):
|
||||
private String getStreamUrl(EslEvent e) {
|
||||
String path = e.getEventHeaders().get("Path");
|
||||
if (isRTMPStream(e)){
|
||||
return path.substring(path.lastIndexOf("}") + 1);
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,21 +1,21 @@
|
||||
/**
|
||||
* 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) 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.freeswitch.voice.freeswitch;
|
||||
|
||||
import java.io.File;
|
||||
@ -24,7 +24,6 @@ import java.util.concurrent.Executor;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.LinkedBlockingQueue;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import org.bigbluebutton.freeswitch.voice.freeswitch.actions.BroadcastConferenceCommand;
|
||||
import org.bigbluebutton.freeswitch.voice.freeswitch.actions.EjectAllUsersCommand;
|
||||
import org.bigbluebutton.freeswitch.voice.freeswitch.actions.EjectUserCommand;
|
||||
@ -33,6 +32,7 @@ import org.bigbluebutton.freeswitch.voice.freeswitch.actions.GetAllUsersCommand;
|
||||
import org.bigbluebutton.freeswitch.voice.freeswitch.actions.MuteUserCommand;
|
||||
import org.bigbluebutton.freeswitch.voice.freeswitch.actions.RecordConferenceCommand;
|
||||
import org.bigbluebutton.freeswitch.voice.freeswitch.actions.TransferUsetToMeetingCommand;
|
||||
import org.bigbluebutton.freeswitch.voice.freeswitch.actions.*;
|
||||
|
||||
public class FreeswitchApplication {
|
||||
|
||||
@ -62,17 +62,6 @@ public class FreeswitchApplication {
|
||||
}
|
||||
}
|
||||
|
||||
public void getAllUsers(String voiceConfId) {
|
||||
GetAllUsersCommand prc = new GetAllUsersCommand(voiceConfId, USER);
|
||||
queueMessage(prc);
|
||||
}
|
||||
|
||||
public void muteUser(String voiceConfId, String voiceUserId, Boolean mute) {
|
||||
MuteUserCommand mpc = new MuteUserCommand(voiceConfId, voiceUserId,
|
||||
mute, USER);
|
||||
queueMessage(mpc);
|
||||
}
|
||||
|
||||
public void transferUserToMeeting(String voiceConfId,
|
||||
String targetVoiceConfId, String voiceUserId) {
|
||||
TransferUsetToMeetingCommand tutmc = new TransferUsetToMeetingCommand(
|
||||
@ -80,82 +69,6 @@ public class FreeswitchApplication {
|
||||
queueMessage(tutmc);
|
||||
}
|
||||
|
||||
public void eject(String voiceConfId, String voiceUserId) {
|
||||
EjectUserCommand mpc = new EjectUserCommand(voiceConfId, voiceUserId,
|
||||
USER);
|
||||
queueMessage(mpc);
|
||||
}
|
||||
|
||||
public void ejectAll(String voiceConfId) {
|
||||
EjectAllUsersCommand mpc = new EjectAllUsersCommand(voiceConfId, USER);
|
||||
queueMessage(mpc);
|
||||
}
|
||||
|
||||
private Long genTimestamp() {
|
||||
return TimeUnit.NANOSECONDS.toMillis(System.nanoTime());
|
||||
}
|
||||
|
||||
public void startRecording(String voiceConfId, String meetingid) {
|
||||
String RECORD_DIR = "/var/freeswitch/meetings";
|
||||
String voicePath = RECORD_DIR + File.separatorChar + meetingid + "-"
|
||||
+ genTimestamp() + ".wav";
|
||||
|
||||
RecordConferenceCommand rcc = new RecordConferenceCommand(voiceConfId,
|
||||
USER, true, voicePath);
|
||||
queueMessage(rcc);
|
||||
}
|
||||
|
||||
public void stopRecording(String voiceConfId, String meetingid,
|
||||
String voicePath) {
|
||||
RecordConferenceCommand rcc = new RecordConferenceCommand(voiceConfId,
|
||||
USER, false, voicePath);
|
||||
queueMessage(rcc);
|
||||
}
|
||||
|
||||
private void sendMessageToFreeswitch(final FreeswitchCommand command) {
|
||||
Runnable task = new Runnable() {
|
||||
public void run() {
|
||||
if (command instanceof GetAllUsersCommand) {
|
||||
GetAllUsersCommand cmd = (GetAllUsersCommand) command;
|
||||
System.out
|
||||
.println("Sending PopulateRoomCommand for conference = ["
|
||||
+ cmd.getRoom() + "]");
|
||||
manager.getUsers(cmd);
|
||||
} else if (command instanceof MuteUserCommand) {
|
||||
MuteUserCommand cmd = (MuteUserCommand) command;
|
||||
System.out
|
||||
.println("Sending MuteParticipantCommand for conference = ["
|
||||
+ cmd.getRoom() + "]");
|
||||
manager.mute(cmd);
|
||||
} else if (command instanceof EjectUserCommand) {
|
||||
EjectUserCommand cmd = (EjectUserCommand) command;
|
||||
System.out
|
||||
.println("Sending EjectParticipantCommand for conference = ["
|
||||
+ cmd.getRoom() + "]");
|
||||
manager.eject(cmd);
|
||||
} else if (command instanceof EjectAllUsersCommand) {
|
||||
EjectAllUsersCommand cmd = (EjectAllUsersCommand) command;
|
||||
System.out
|
||||
.println("Sending EjectAllUsersCommand for conference = ["
|
||||
+ cmd.getRoom() + "]");
|
||||
manager.ejectAll(cmd);
|
||||
} else if (command instanceof TransferUsetToMeetingCommand) {
|
||||
TransferUsetToMeetingCommand cmd = (TransferUsetToMeetingCommand) command;
|
||||
System.out
|
||||
.println("Sending TransferUsetToMeetingCommand for conference = ["
|
||||
+ cmd.getRoom() + "]");
|
||||
manager.tranfer(cmd);
|
||||
} else if (command instanceof RecordConferenceCommand) {
|
||||
manager.record((RecordConferenceCommand) command);
|
||||
} else if (command instanceof BroadcastConferenceCommand) {
|
||||
manager.broadcast((BroadcastConferenceCommand) command);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
runExec.execute(task);
|
||||
}
|
||||
|
||||
public void start() {
|
||||
sendMessages = true;
|
||||
Runnable sender = new Runnable() {
|
||||
@ -169,15 +82,94 @@ public class FreeswitchApplication {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
};
|
||||
msgSenderExec.execute(sender);
|
||||
}
|
||||
|
||||
public void stop() {
|
||||
sendMessages = false;
|
||||
public void getAllUsers(String voiceConfId) {
|
||||
GetAllUsersCommand prc = new GetAllUsersCommand(voiceConfId, USER);
|
||||
queueMessage(prc);
|
||||
}
|
||||
|
||||
public void muteUser(String voiceConfId, String voiceUserId, Boolean mute) {
|
||||
MuteUserCommand mpc = new MuteUserCommand(voiceConfId, voiceUserId, mute, USER);
|
||||
queueMessage(mpc);
|
||||
}
|
||||
|
||||
}
|
||||
public void eject(String voiceConfId, String voiceUserId) {
|
||||
EjectUserCommand mpc = new EjectUserCommand(voiceConfId, voiceUserId, USER);
|
||||
queueMessage(mpc);
|
||||
}
|
||||
|
||||
public void ejectAll(String voiceConfId) {
|
||||
EjectAllUsersCommand mpc = new EjectAllUsersCommand(voiceConfId, USER);
|
||||
queueMessage(mpc);
|
||||
}
|
||||
|
||||
private Long genTimestamp() {
|
||||
return TimeUnit.NANOSECONDS.toMillis(System.nanoTime());
|
||||
}
|
||||
|
||||
public void startRecording(String voiceConfId, String meetingid){
|
||||
String RECORD_DIR = "/var/freeswitch/meetings";
|
||||
String voicePath = RECORD_DIR + File.separatorChar + meetingid + "-" + genTimestamp() + ".wav";
|
||||
|
||||
RecordConferenceCommand rcc = new RecordConferenceCommand(voiceConfId, USER, true, voicePath);
|
||||
queueMessage(rcc);
|
||||
}
|
||||
|
||||
public void stopRecording(String voiceConfId, String meetingid, String voicePath){
|
||||
RecordConferenceCommand rcc = new RecordConferenceCommand(voiceConfId, USER, false, voicePath);
|
||||
queueMessage(rcc);
|
||||
}
|
||||
|
||||
public void deskShareBroadcastRTMP(String voiceConfId, String streamUrl, String timestamp, Boolean broadcast){
|
||||
DeskShareBroadcastRTMPCommand rtmp = new DeskShareBroadcastRTMPCommand(voiceConfId, USER, streamUrl, timestamp, broadcast);
|
||||
queueMessage(rtmp);
|
||||
}
|
||||
|
||||
public void deskShareHangUp(String voiceConfId, String fsConferenceName, String timestamp){
|
||||
DeskShareHangUpCommand huCmd = new DeskShareHangUpCommand(voiceConfId, fsConferenceName, USER, timestamp);
|
||||
queueMessage(huCmd);
|
||||
}
|
||||
private void sendMessageToFreeswitch(final FreeswitchCommand command) {
|
||||
Runnable task = new Runnable() {
|
||||
public void run() {
|
||||
if (command instanceof GetAllUsersCommand) {
|
||||
GetAllUsersCommand cmd = (GetAllUsersCommand) command;
|
||||
System.out.println("Sending PopulateRoomCommand for conference = [" + cmd.getRoom() + "]");
|
||||
manager.getUsers(cmd);
|
||||
} else if (command instanceof MuteUserCommand) {
|
||||
MuteUserCommand cmd = (MuteUserCommand) command;
|
||||
System.out.println("Sending MuteParticipantCommand for conference = [" + cmd.getRoom() + "]");
|
||||
manager.mute(cmd);
|
||||
} else if (command instanceof EjectUserCommand) {
|
||||
EjectUserCommand cmd = (EjectUserCommand) command;
|
||||
System.out.println("Sending EjectParticipantCommand for conference = [" + cmd.getRoom() + "]");
|
||||
manager.eject(cmd);
|
||||
} else if (command instanceof EjectAllUsersCommand) {
|
||||
EjectAllUsersCommand cmd = (EjectAllUsersCommand) command;
|
||||
System.out.println("Sending EjectAllUsersCommand for conference = [" + cmd.getRoom() + "]");
|
||||
manager.ejectAll(cmd);
|
||||
} else if (command instanceof RecordConferenceCommand) {
|
||||
manager.record((RecordConferenceCommand) command);
|
||||
} else if (command instanceof DeskShareBroadcastRTMPCommand) {
|
||||
manager.broadcastRTMP((DeskShareBroadcastRTMPCommand)command);
|
||||
} else if (command instanceof DeskShareHangUpCommand) {
|
||||
DeskShareHangUpCommand cmd = (DeskShareHangUpCommand) command;
|
||||
manager.hangUp(cmd);
|
||||
} else if (command instanceof BroadcastConferenceCommand) {
|
||||
manager.broadcast((BroadcastConferenceCommand) command);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
runExec.execute(task);
|
||||
}
|
||||
|
||||
public void stop() {
|
||||
sendMessages = false;
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,58 @@
|
||||
/**
|
||||
* 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.freeswitch.voice.freeswitch.actions;
|
||||
|
||||
import org.bigbluebutton.freeswitch.voice.events.ConferenceEventListener;
|
||||
import org.freeswitch.esl.client.transport.message.EslMessage;
|
||||
|
||||
public class DeskShareBroadcastRTMPCommand extends FreeswitchCommand {
|
||||
|
||||
private String broadcastPath;
|
||||
private boolean broadcast;
|
||||
private String timestamp;
|
||||
private final String DESKSHARE_SUFFIX = "-DESKSHARE";
|
||||
|
||||
public DeskShareBroadcastRTMPCommand(String room, String requesterId, String broadcastPath, String timestamp, boolean broadcast){
|
||||
super(room, requesterId);
|
||||
this.broadcastPath = broadcastPath;
|
||||
this.broadcast = broadcast;
|
||||
this.timestamp = timestamp;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String getCommandArgs() {
|
||||
String action = "norecord";
|
||||
if (broadcast) {
|
||||
action = "record";
|
||||
}
|
||||
|
||||
String room = getRoom();
|
||||
if (!room.endsWith(DESKSHARE_SUFFIX)) {
|
||||
room = room + DESKSHARE_SUFFIX;
|
||||
}
|
||||
|
||||
return SPACE + room + SPACE + action + SPACE + broadcastPath;
|
||||
}
|
||||
|
||||
public void handleResponse(EslMessage response, ConferenceEventListener eventListener) {
|
||||
//Test for Known Conference
|
||||
System.out.println("\nDeskShareBroadcastRTMPCommand\n");
|
||||
}
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
package org.bigbluebutton.freeswitch.voice.freeswitch.actions;
|
||||
|
||||
import org.bigbluebutton.freeswitch.voice.events.ConferenceEventListener;
|
||||
import org.freeswitch.esl.client.transport.message.EslMessage;
|
||||
|
||||
/**
|
||||
* Created by anton on 07/01/16.
|
||||
*/
|
||||
public class DeskShareHangUpCommand extends FreeswitchCommand {
|
||||
private String timestamp;
|
||||
private String fsConferenceName;
|
||||
private final String DESKSHARE_SUFFIX = "-DESKSHARE";
|
||||
|
||||
public DeskShareHangUpCommand(String room, String fsConferenceName, String requesterId, String timestamp){
|
||||
super(room, requesterId);
|
||||
this.timestamp = timestamp;
|
||||
this.fsConferenceName = fsConferenceName;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String getCommandArgs() {
|
||||
String action = "kick all";
|
||||
|
||||
if(!fsConferenceName.endsWith(DESKSHARE_SUFFIX)) {
|
||||
fsConferenceName = fsConferenceName + DESKSHARE_SUFFIX;
|
||||
}
|
||||
return SPACE + fsConferenceName + SPACE + action;
|
||||
}
|
||||
|
||||
public void handleResponse(EslMessage response, ConferenceEventListener eventListener) {
|
||||
System.out.println("\nDeskShareHangUpCommand\n");
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,50 @@
|
||||
/**
|
||||
* 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.freeswitch.voice.freeswitch.actions;
|
||||
|
||||
import org.bigbluebutton.freeswitch.voice.events.ConferenceEventListener;
|
||||
import org.freeswitch.esl.client.transport.message.EslMessage;
|
||||
|
||||
public class DeskShareRecordCommand extends FreeswitchCommand {
|
||||
|
||||
private String recordPath;
|
||||
private boolean record;
|
||||
|
||||
public DeskShareRecordCommand(String room, String requesterId, boolean record, String recordPath){
|
||||
super(room, requesterId);
|
||||
this.recordPath = recordPath;
|
||||
this.record = record;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String getCommandArgs() {
|
||||
String action = "norecord";
|
||||
if (record)
|
||||
action = "record";
|
||||
|
||||
System.out.println("\n\n\n\n\n DESKSHARE RECORD " + record + "\n\n\n\n");
|
||||
return SPACE + getRoom() + SPACE + action + SPACE + recordPath;
|
||||
}
|
||||
|
||||
public void handleResponse(EslMessage response, ConferenceEventListener eventListener) {
|
||||
//Test for Known Conference
|
||||
System.out.println("\n\n\n\n\nLALALALLALA\n\n\n\n");
|
||||
}
|
||||
}
|
@ -99,7 +99,7 @@ public class GetAllUsersCommand extends FreeswitchCommand {
|
||||
}
|
||||
|
||||
pj = new VoiceUserJoinedEvent(voiceUserId, member.getId().toString(), confXML.getConferenceRoom(),
|
||||
callerId, callerIdName, member.getMuted(), member.getSpeaking());
|
||||
callerId, callerIdName, member.getMuted(), member.getSpeaking(), null);
|
||||
eventListener.handleConferenceEvent(pj);
|
||||
}
|
||||
|
||||
|
@ -2,11 +2,20 @@ package org.bigbluebutton.freeswitch
|
||||
|
||||
import org.bigbluebutton.freeswitch.voice.IVoiceConferenceService
|
||||
import org.bigbluebutton.endpoint.redis.RedisPublisher
|
||||
import org.bigbluebutton.common.messages._
|
||||
import org.bigbluebutton.common.messages.VoiceConfRecordingStartedMessage
|
||||
import org.bigbluebutton.common.messages.UserJoinedVoiceConfMessage
|
||||
import org.bigbluebutton.common.messages.UserLeftVoiceConfMessage
|
||||
import org.bigbluebutton.common.messages.UserMutedInVoiceConfMessage
|
||||
import org.bigbluebutton.common.messages.UserTalkingInVoiceConfMessage
|
||||
import org.bigbluebutton.common.messages.DeskShareStartedEventMessage
|
||||
import org.bigbluebutton.common.messages.DeskShareStoppedEventMessage
|
||||
import org.bigbluebutton.common.messages.DeskShareRTMPBroadcastStartedEventMessage
|
||||
import org.bigbluebutton.common.messages.DeskShareRTMPBroadcastStoppedEventMessage
|
||||
|
||||
class VoiceConferenceService(sender: RedisPublisher) extends IVoiceConferenceService {
|
||||
|
||||
val FROM_VOICE_CONF_SYSTEM_CHAN = "bigbluebutton:from-voice-conf:system";
|
||||
private final val DESKSHARE_CONFERENCE_NAME_SUFFIX = "-DESKSHARE"
|
||||
|
||||
def voiceConfRecordingStarted(voiceConfId: String, recordStream: String, recording: java.lang.Boolean, timestamp: String) {
|
||||
val msg = new VoiceConfRecordingStartedMessage(voiceConfId, recordStream, recording, timestamp)
|
||||
@ -14,9 +23,9 @@ class VoiceConferenceService(sender: RedisPublisher) extends IVoiceConferenceSer
|
||||
}
|
||||
|
||||
def userJoinedVoiceConf(voiceConfId: String, voiceUserId: String, userId: String, callerIdName: String,
|
||||
callerIdNum: String, muted: java.lang.Boolean, talking: java.lang.Boolean) {
|
||||
callerIdNum: String, muted: java.lang.Boolean, talking: java.lang.Boolean, avatarURL: String) {
|
||||
// println("******** FreeswitchConferenceService received voiceUserJoined vui=[" + userId + "] wui=[" + webUserId + "]")
|
||||
val msg = new UserJoinedVoiceConfMessage(voiceConfId, voiceUserId, userId, callerIdName, callerIdNum, muted, talking)
|
||||
val msg = new UserJoinedVoiceConfMessage(voiceConfId, voiceUserId, userId, callerIdName, callerIdNum, muted, talking, avatarURL)
|
||||
sender.publish(FROM_VOICE_CONF_SYSTEM_CHAN, msg.toJson())
|
||||
}
|
||||
|
||||
@ -41,4 +50,33 @@ class VoiceConferenceService(sender: RedisPublisher) extends IVoiceConferenceSer
|
||||
val msg = new UserTalkingInVoiceConfMessage(voiceConfId, voiceUserId, talking)
|
||||
sender.publish(FROM_VOICE_CONF_SYSTEM_CHAN, msg.toJson())
|
||||
}
|
||||
}
|
||||
|
||||
def deskShareStarted(voiceConfId: String, callerIdNum: String, callerIdName: String) {
|
||||
val trimmedVoiceConfId = voiceConfId.replace(DESKSHARE_CONFERENCE_NAME_SUFFIX, "")
|
||||
println("******** FreeswitchConferenceService send deskShareStarted to BBB " + trimmedVoiceConfId)
|
||||
val msg = new DeskShareStartedEventMessage(trimmedVoiceConfId, callerIdNum, callerIdName)
|
||||
sender.publish(FROM_VOICE_CONF_SYSTEM_CHAN, msg.toJson())
|
||||
}
|
||||
|
||||
def deskShareEnded(voiceConfId: String, callerIdNum: String, callerIdName: String) {
|
||||
val trimmedVoiceConfId = voiceConfId.replace(DESKSHARE_CONFERENCE_NAME_SUFFIX, "")
|
||||
println("******** FreeswitchConferenceService send deskShareStopped to BBB " + trimmedVoiceConfId)
|
||||
val msg = new DeskShareStoppedEventMessage(trimmedVoiceConfId, callerIdNum, callerIdName)
|
||||
sender.publish(FROM_VOICE_CONF_SYSTEM_CHAN, msg.toJson())
|
||||
}
|
||||
|
||||
def deskShareRTMPBroadcastStarted(voiceConfId: String, streamname: String, vw: java.lang.Integer, vh: java.lang.Integer, timestamp: String) {
|
||||
val trimmedVoiceConfId = voiceConfId.replace(DESKSHARE_CONFERENCE_NAME_SUFFIX, "")
|
||||
println("******** FreeswitchConferenceService send deskShareRTMPBroadcastStarted to BBB " + trimmedVoiceConfId)
|
||||
val msg = new DeskShareRTMPBroadcastStartedEventMessage(trimmedVoiceConfId, streamname, vw, vh, timestamp)
|
||||
sender.publish(FROM_VOICE_CONF_SYSTEM_CHAN, msg.toJson())
|
||||
}
|
||||
|
||||
def deskShareRTMPBroadcastStopped(voiceConfId: String, streamname: String, vw: java.lang.Integer, vh: java.lang.Integer, timestamp: String) {
|
||||
val trimmedVoiceConfId = voiceConfId.replace(DESKSHARE_CONFERENCE_NAME_SUFFIX, "")
|
||||
println("******** FreeswitchConferenceService send deskShareRTMPBroadcastStopped to BBB " + trimmedVoiceConfId)
|
||||
val msg = new DeskShareRTMPBroadcastStoppedEventMessage(trimmedVoiceConfId, streamname, vw, vh, timestamp)
|
||||
sender.publish(FROM_VOICE_CONF_SYSTEM_CHAN, msg.toJson())
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -98,7 +98,7 @@ if (request.getParameterMap().isEmpty()) {
|
||||
String ip = BigBlueButtonURL.split("\\/bigbluebutton")[0];
|
||||
|
||||
// redirect towards the html5 client which is waiting for the following parameters
|
||||
String html5url = ip + "/html5client/" + meetingId + "/" + userId + "/" + authToken;
|
||||
String html5url = ip + "/html5client/join/" + meetingId + "/" + userId + "/" + authToken;
|
||||
|
||||
if (joinURL.startsWith("http://") || joinURL.startsWith("https://")) {
|
||||
%>
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,137 +0,0 @@
|
||||
format version: 5
|
||||
output mode:
|
||||
1 items
|
||||
0 -> multiple
|
||||
output directories:
|
||||
2 items
|
||||
D:\bbb\bbb-common-message\src\test\java -> D:\bbb\bbb-common-message\target\test-classes
|
||||
D:\bbb\bbb-common-message\src\test\scala -> D:\bbb\bbb-common-message\target\test-classes
|
||||
compile options:
|
||||
8 items
|
||||
0 -> -javabootclasspath
|
||||
1 -> C:\Program Files\Java\jdk1.7.0_80\jre\lib\resources.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\rt.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\jce.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\ext\zipfs.jar
|
||||
2 -> -javaextdirs
|
||||
3 ->
|
||||
4 -> -bootclasspath
|
||||
5 -> D:\Ghazi\Softs\eclipse-scala\plugins\org.scala-lang.scala-library_2.11.7.v20150622-112736-1fbce4612c.jar
|
||||
6 -> -encoding
|
||||
7 -> UTF-8
|
||||
javac options:
|
||||
0 items
|
||||
compiler version:
|
||||
1 items
|
||||
0 -> 2.11.7
|
||||
compile order:
|
||||
1 items
|
||||
0 -> Mixed
|
||||
name hashing:
|
||||
1 items
|
||||
0 -> false
|
||||
products:
|
||||
1 items
|
||||
D:\bbb\bbb-common-message\src\test\java\org\bigbluebutton\common\messages\StartCustomPollRequestMessageTest.java -> D:\bbb\bbb-common-message\target\test-classes\org\bigbluebutton\common\messages\StartCustomPollRequestMessageTest.class
|
||||
binary dependencies:
|
||||
3 items
|
||||
D:\bbb\bbb-common-message\src\test\java\org\bigbluebutton\common\messages\StartCustomPollRequestMessageTest.java -> C:\Program Files\Java\jre1.8.0_74\lib\rt.jar
|
||||
D:\bbb\bbb-common-message\src\test\java\org\bigbluebutton\common\messages\StartCustomPollRequestMessageTest.java -> D:\bbb\bbb-common-message\lib_managed\jars\com.google.code.gson\gson\gson-1.7.1.jar
|
||||
D:\bbb\bbb-common-message\src\test\java\org\bigbluebutton\common\messages\StartCustomPollRequestMessageTest.java -> D:\bbb\bbb-common-message\lib_managed\jars\junit\junit\junit-4.11.jar
|
||||
direct source dependencies:
|
||||
1 items
|
||||
D:\bbb\bbb-common-message\src\test\java\org\bigbluebutton\common\messages\StartCustomPollRequestMessageTest.java -> D:\bbb\bbb-common-message\src\test\java\org\bigbluebutton\common\messages\StartCustomPollRequestMessageTest.java
|
||||
direct external dependencies:
|
||||
3 items
|
||||
D:\bbb\bbb-common-message\src\test\java\org\bigbluebutton\common\messages\StartCustomPollRequestMessageTest.java -> org.bigbluebutton.common.messages.MessageHeader
|
||||
D:\bbb\bbb-common-message\src\test\java\org\bigbluebutton\common\messages\StartCustomPollRequestMessageTest.java -> org.bigbluebutton.common.messages.StartCustomPollRequestMessage
|
||||
D:\bbb\bbb-common-message\src\test\java\org\bigbluebutton\common\messages\StartCustomPollRequestMessageTest.java -> org.bigbluebutton.common.messages.payload.StartCustomPollRequestMessagePayload
|
||||
public inherited source dependencies:
|
||||
0 items
|
||||
public inherited external dependencies:
|
||||
0 items
|
||||
member reference internal dependencies:
|
||||
0 items
|
||||
member reference external dependencies:
|
||||
0 items
|
||||
inheritance internal dependencies:
|
||||
0 items
|
||||
inheritance external dependencies:
|
||||
0 items
|
||||
class names:
|
||||
1 items
|
||||
D:\bbb\bbb-common-message\src\test\java\org\bigbluebutton\common\messages\StartCustomPollRequestMessageTest.java -> org.bigbluebutton.common.messages.StartCustomPollRequestMessageTest
|
||||
used names:
|
||||
0 items
|
||||
product stamps:
|
||||
1 items
|
||||
D:\bbb\bbb-common-message\target\test-classes\org\bigbluebutton\common\messages\StartCustomPollRequestMessageTest.class -> lastModified(1458139331787)
|
||||
source stamps:
|
||||
8 items
|
||||
D:\bbb\bbb-common-message\src\test\java\org\bigbluebutton\common\messages\StartCustomPollRequestMessageTest.java -> hash(30de8c7c976e4a9ec060fb37ccdd975eb08acd4e)
|
||||
D:\bbb\bbb-common-message\src\test\java\org\bigbluebutton\messages\BreakoutRoomsListTest.java -> hash(7277621ead94ec31af85b4e688a6838622f917d7)
|
||||
D:\bbb\bbb-common-message\src\test\java\org\bigbluebutton\messages\CreateBreakoutRoomRequestTest.java -> hash(00d1388f6ba3942b96bf718705c58e8749884ba0)
|
||||
D:\bbb\bbb-common-message\src\test\java\org\bigbluebutton\messages\CreateBreakoutRoomsRequestTest.java -> hash(613e4f0b3da37a9d4e3524b7042b4ad7bc43ff3f)
|
||||
D:\bbb\bbb-common-message\src\test\java\org\bigbluebutton\messages\CreateMeetingRequestTest.java -> hash(0b173a7414b06d0d2f58300ba0fc782ffd5eec50)
|
||||
D:\bbb\bbb-common-message\src\test\java\org\bigbluebutton\messages\ValidateAuthTokenReplyTest.java -> hash(a83d0096f4a9119943f5e47ae0140c361964bea8)
|
||||
D:\bbb\bbb-common-message\src\test\java\org\bigbluebutton\messages\ValidateAuthTokenRequestTest.java -> hash(dee673384778e690d38b75e4da0740163a5e4ac1)
|
||||
D:\bbb\bbb-common-message\src\test\java\org\bigbluebutton\messages\ValidateAuthTokenRequestTimedoutTest.java -> hash(a87da3d1d11948c7863797a73684154372fb3d5e)
|
||||
binary stamps:
|
||||
3 items
|
||||
C:\Program Files\Java\jre1.8.0_74\lib\rt.jar -> lastModified(1455481607050)
|
||||
D:\bbb\bbb-common-message\lib_managed\jars\com.google.code.gson\gson\gson-1.7.1.jar -> lastModified(1440005808493)
|
||||
D:\bbb\bbb-common-message\lib_managed\jars\junit\junit\junit-4.11.jar -> lastModified(1440005808536)
|
||||
class names:
|
||||
3 items
|
||||
C:\Program Files\Java\jre1.8.0_74\lib\rt.jar -> java.lang.Object
|
||||
D:\bbb\bbb-common-message\lib_managed\jars\com.google.code.gson\gson\gson-1.7.1.jar -> com.google.gson.Gson
|
||||
D:\bbb\bbb-common-message\lib_managed\jars\junit\junit\junit-4.11.jar -> org.junit.Assert
|
||||
internal apis:
|
||||
8 items
|
||||
D:\bbb\bbb-common-message\src\test\java\org\bigbluebutton\common\messages\StartCustomPollRequestMessageTest.java ->
|
||||
rO0ABXNyABB4c2J0aS5hcGkuU291cmNlFlpwRASfbtoCAAZJAAdhcGlIYXNoWgAIaGFzTWFjcm9MABhfaW50ZXJuYWxPbmx5X25hbWVIYXNoZXN0ACRMeHNidGkvYXBpL19pbnRlcm5hbE9ubHlfTmFtZUhhc2hlcztMAANhcGl0ABVMeHNidGkvYXBpL1NvdXJjZUFQSTtMAAtjb21waWxhdGlvbnQAF0x4c2J0aS9hcGkvQ29tcGlsYXRpb247WwAEaGFzaHQAAltCeHA0b5kCAHNyACJ4c2J0aS5hcGkuX2ludGVybmFsT25seV9OYW1lSGFzaGVzVNq+mfrU7EwCAAJbAA9pbXBsaWNpdE1lbWJlcnN0ACNbTHhzYnRpL2FwaS9faW50ZXJuYWxPbmx5X05hbWVIYXNoO1sADnJlZ3VsYXJNZW1iZXJzcQB+AAd4cHVyACNbTHhzYnRpLmFwaS5faW50ZXJuYWxPbmx5X05hbWVIYXNoO0lagLbdlov0AgAAeHAAAAAAdXEAfgAJAAAAAHNyABN4c2J0aS5hcGkuU291cmNlQVBJuV6n+SkjOKQCAAJbAAtkZWZpbml0aW9uc3QAF1tMeHNidGkvYXBpL0RlZmluaXRpb247WwAIcGFja2FnZXN0ABRbTHhzYnRpL2FwaS9QYWNrYWdlO3hwdXIAF1tMeHNidGkuYXBpLkRlZmluaXRpb247iMlc57TjXg4CAAB4cAAAAAJzcgATeHNidGkuYXBpLkNsYXNzTGlrZYM0HKHfsJdsAgAETAAOZGVmaW5pdGlvblR5cGV0ABpMeHNidGkvYXBpL0RlZmluaXRpb25UeXBlO1sAEHNhdmVkQW5ub3RhdGlvbnN0ABNbTGphdmEvbGFuZy9TdHJpbmc7TAAIc2VsZlR5cGV0ABBMeHNidGkvYXBpL0xhenk7TAAJc3RydWN0dXJlcQB+ABV4cgAheHNidGkuYXBpLlBhcmFtZXRlcml6ZWREZWZpbml0aW9u+RFusdVQPOICAAFbAA50eXBlUGFyYW1ldGVyc3QAGltMeHNidGkvYXBpL1R5cGVQYXJhbWV0ZXI7eHIAFHhzYnRpLmFwaS5EZWZpbml0aW9uhyob6HFC40YCAARMAAZhY2Nlc3N0ABJMeHNidGkvYXBpL0FjY2VzcztbAAthbm5vdGF0aW9uc3QAF1tMeHNidGkvYXBpL0Fubm90YXRpb247TAAJbW9kaWZpZXJzdAAVTHhzYnRpL2FwaS9Nb2RpZmllcnM7TAAEbmFtZXQAEkxqYXZhL2xhbmcvU3RyaW5nO3hwc3IAEHhzYnRpLmFwaS5QdWJsaWO6WD2ubC1gQgIAAHhyABB4c2J0aS5hcGkuQWNjZXNz3WKa+B1jMUgCAAB4cHVyABdbTHhzYnRpLmFwaS5Bbm5vdGF0aW9uO+uX6xkQ9o1IAgAAeHAAAAAAc3IAE3hzYnRpLmFwaS5Nb2RpZmllcnPHERMhaZzcJAIAAUIABWZsYWdzeHAAdABDb3JnLmJpZ2JsdWVidXR0b24uY29tbW9uLm1lc3NhZ2VzLlN0YXJ0Q3VzdG9tUG9sbFJlcXVlc3RNZXNzYWdlVGVzdHVyABpbTHhzYnRpLmFwaS5UeXBlUGFyYW1ldGVyO9ltJg8onfK2AgAAeHAAAAAAfnIAGHhzYnRpLmFwaS5EZWZpbml0aW9uVHlwZQAAAAAAAAAAEgAAeHIADmphdmEubGFuZy5FbnVtAAAAAAAAAAASAAB4cHQACENsYXNzRGVmdXIAE1tMamF2YS5sYW5nLlN0cmluZzut0lbn6R17RwIAAHhwAAAAAnQADm9yZy5qdW5pdC5UZXN0dAAMc2NhbGEudGhyb3dzc3IAE3hzYnRpLlNhZmVMYXp5JEltcGw7kU8R9EVMyQIAA1oACGJpdG1hcCQwTAACX3R0ABJMamF2YS9sYW5nL09iamVjdDtMAARldmFsdAARTHNjYWxhL0Z1bmN0aW9uMDt4cgAWeHNidGkuYXBpLkFic3RyYWN0TGF6edN3tQFfu+egAgAAeHABc3IAE3hzYnRpLmFwaS5FbXB0eVR5cGW8/Z5GSTuJJAIAAHhyABR4c2J0aS5hcGkuU2ltcGxlVHlwZXJ4YoghI79AAgAAeHIADnhzYnRpLmFwaS5UeXBlP2rZIRZJqsoCAAB4cHBzcQB+ADABc3IAE3hzYnRpLmFwaS5TdHJ1Y3R1cmWpqvmAk2/YAAIAA0wACGRlY2xhcmVkcQB+ABVMAAlpbmhlcml0ZWRxAH4AFUwAB3BhcmVudHNxAH4AFXhxAH4AN3NxAH4AMAF1cQB+ABAAAAAAcHNxAH4AMAF1cQB+ABAAAAAAcHNxAH4AMAF1cgARW0x4c2J0aS5hcGkuVHlwZTt0/6Vae/npQQIAAHhwAAAAAXNyABR4c2J0aS5hcGkuUHJvamVjdGlvbvPSjVTpRaQtAgACTAACaWRxAH4AHEwABnByZWZpeHQAFkx4c2J0aS9hcGkvU2ltcGxlVHlwZTt4cQB+ADZ0AAZPYmplY3RzcgATeHNidGkuYXBpLlNpbmdsZXRvbvynX/jPVuRGAgABTAAEcGF0aHQAEEx4c2J0aS9hcGkvUGF0aDt4cQB+ADZzcgAOeHNidGkuYXBpLlBhdGibPVwIzqUnhAIAAVsACmNvbXBvbmVudHN0ABpbTHhzYnRpL2FwaS9QYXRoQ29tcG9uZW50O3hwdXIAGltMeHNidGkuYXBpLlBhdGhDb21wb25lbnQ7Q9oJdC1nFnQCAAB4cAAAAANzcgAMeHNidGkuYXBpLklkmDJsizdTxEACAAFMAAJpZHEAfgAceHIAF3hzYnRpLmFwaS5QYXRoQ29tcG9uZW50X5oiWy6Gn7wCAAB4cHQABGphdmFzcQB+AE90AARsYW5nc3IADnhzYnRpLmFwaS5UaGlz2wntpsxaQFwCAAB4cQB+AFBwcHNxAH4AEnEAfgAgcQB+ACJxAH4AJHEAfgAlcQB+ACd+cQB+ACh0AAZNb2R1bGV1cQB+ACwAAAAAc3EAfgAwAXEAfgA4cHNxAH4AMAFzcQB+ADpzcQB+ADABdXEAfgAQAAAAAHBzcQB+ADABdXEAfgAQAAAAAHBzcQB+ADABdXEAfgBBAAAAAHBwdXIAFFtMeHNidGkuYXBpLlBhY2thZ2U7WxMZN3CnJ6ECAAB4cAAAAAFzcgAReHNidGkuYXBpLlBhY2thZ2V+WY/2rs45WAIAAUwABG5hbWVxAH4AHHhwdAAhb3JnLmJpZ2JsdWVidXR0b24uY29tbW9uLm1lc3NhZ2Vzc3IAFXhzYnRpLmFwaS5Db21waWxhdGlvbu364MNq6KBCAgACSgAJc3RhcnRUaW1lWwAHb3V0cHV0c3QAGltMeHNidGkvYXBpL091dHB1dFNldHRpbmc7eHAAAAFTf+B7nXVyABpbTHhzYnRpLmFwaS5PdXRwdXRTZXR0aW5nO39qwvOnh6VCAgAAeHAAAAACc3IAF3hzYnRpLmFwaS5PdXRwdXRTZXR0aW5netmaR3T7HXsCAAJMAA9vdXRwdXREaXJlY3RvcnlxAH4AHEwAD3NvdXJjZURpcmVjdG9yeXEAfgAceHB0AC1EOlxiYmJcYmJiLWNvbW1vbi1tZXNzYWdlXHRhcmdldFx0ZXN0LWNsYXNzZXN0AChEOlxiYmJcYmJiLWNvbW1vbi1tZXNzYWdlXHNyY1x0ZXN0XHNjYWxhc3EAfgBudAAtRDpcYmJiXGJiYi1jb21tb24tbWVzc2FnZVx0YXJnZXRcdGVzdC1jbGFzc2VzdAAnRDpcYmJiXGJiYi1jb21tb24tbWVzc2FnZVxzcmNcdGVzdFxqYXZhdXIAAltCrPMX+AYIVOACAAB4cAAAABQw3ox8l25KnsBg+zfM3ZdesIrNTg==
|
||||
D:\bbb\bbb-common-message\src\test\java\org\bigbluebutton\messages\BreakoutRoomsListTest.java ->
|
||||
rO0ABXNyABB4c2J0aS5hcGkuU291cmNlFlpwRASfbtoCAAZJAAdhcGlIYXNoWgAIaGFzTWFjcm9MABhfaW50ZXJuYWxPbmx5X25hbWVIYXNoZXN0ACRMeHNidGkvYXBpL19pbnRlcm5hbE9ubHlfTmFtZUhhc2hlcztMAANhcGl0ABVMeHNidGkvYXBpL1NvdXJjZUFQSTtMAAtjb21waWxhdGlvbnQAF0x4c2J0aS9hcGkvQ29tcGlsYXRpb247WwAEaGFzaHQAAltCeHC4IVHqAHNyACJ4c2J0aS5hcGkuX2ludGVybmFsT25seV9OYW1lSGFzaGVzVNq+mfrU7EwCAAJbAA9pbXBsaWNpdE1lbWJlcnN0ACNbTHhzYnRpL2FwaS9faW50ZXJuYWxPbmx5X05hbWVIYXNoO1sADnJlZ3VsYXJNZW1iZXJzcQB+AAd4cHVyACNbTHhzYnRpLmFwaS5faW50ZXJuYWxPbmx5X05hbWVIYXNoO0lagLbdlov0AgAAeHAAAAAAdXEAfgAJAAAAAHNyABN4c2J0aS5hcGkuU291cmNlQVBJuV6n+SkjOKQCAAJbAAtkZWZpbml0aW9uc3QAF1tMeHNidGkvYXBpL0RlZmluaXRpb247WwAIcGFja2FnZXN0ABRbTHhzYnRpL2FwaS9QYWNrYWdlO3hwdXIAF1tMeHNidGkuYXBpLkRlZmluaXRpb247iMlc57TjXg4CAAB4cAAAAAB1cgAUW0x4c2J0aS5hcGkuUGFja2FnZTtbExk3cKcnoQIAAHhwAAAAAHNyABV4c2J0aS5hcGkuQ29tcGlsYXRpb27t+uDDauigQgIAAkoACXN0YXJ0VGltZVsAB291dHB1dHN0ABpbTHhzYnRpL2FwaS9PdXRwdXRTZXR0aW5nO3hwAAABU3/ge511cgAaW0x4c2J0aS5hcGkuT3V0cHV0U2V0dGluZzt/asLzp4elQgIAAHhwAAAAAnNyABd4c2J0aS5hcGkuT3V0cHV0U2V0dGluZ3rZmkd0+x17AgACTAAPb3V0cHV0RGlyZWN0b3J5dAASTGphdmEvbGFuZy9TdHJpbmc7TAAPc291cmNlRGlyZWN0b3J5cQB+ABp4cHQALUQ6XGJiYlxiYmItY29tbW9uLW1lc3NhZ2VcdGFyZ2V0XHRlc3QtY2xhc3Nlc3QAKEQ6XGJiYlxiYmItY29tbW9uLW1lc3NhZ2Vcc3JjXHRlc3Rcc2NhbGFzcQB+ABl0AC1EOlxiYmJcYmJiLWNvbW1vbi1tZXNzYWdlXHRhcmdldFx0ZXN0LWNsYXNzZXN0ACdEOlxiYmJcYmJiLWNvbW1vbi1tZXNzYWdlXHNyY1x0ZXN0XGphdmF1cgACW0Ks8xf4BghU4AIAAHhwAAAAFHJ3Yh6tlOwxr4W05oimg4Yi+RfX
|
||||
D:\bbb\bbb-common-message\src\test\java\org\bigbluebutton\messages\CreateBreakoutRoomRequestTest.java ->
|
||||
rO0ABXNyABB4c2J0aS5hcGkuU291cmNlFlpwRASfbtoCAAZJAAdhcGlIYXNoWgAIaGFzTWFjcm9MABhfaW50ZXJuYWxPbmx5X25hbWVIYXNoZXN0ACRMeHNidGkvYXBpL19pbnRlcm5hbE9ubHlfTmFtZUhhc2hlcztMAANhcGl0ABVMeHNidGkvYXBpL1NvdXJjZUFQSTtMAAtjb21waWxhdGlvbnQAF0x4c2J0aS9hcGkvQ29tcGlsYXRpb247WwAEaGFzaHQAAltCeHC4IVHqAHNyACJ4c2J0aS5hcGkuX2ludGVybmFsT25seV9OYW1lSGFzaGVzVNq+mfrU7EwCAAJbAA9pbXBsaWNpdE1lbWJlcnN0ACNbTHhzYnRpL2FwaS9faW50ZXJuYWxPbmx5X05hbWVIYXNoO1sADnJlZ3VsYXJNZW1iZXJzcQB+AAd4cHVyACNbTHhzYnRpLmFwaS5faW50ZXJuYWxPbmx5X05hbWVIYXNoO0lagLbdlov0AgAAeHAAAAAAdXEAfgAJAAAAAHNyABN4c2J0aS5hcGkuU291cmNlQVBJuV6n+SkjOKQCAAJbAAtkZWZpbml0aW9uc3QAF1tMeHNidGkvYXBpL0RlZmluaXRpb247WwAIcGFja2FnZXN0ABRbTHhzYnRpL2FwaS9QYWNrYWdlO3hwdXIAF1tMeHNidGkuYXBpLkRlZmluaXRpb247iMlc57TjXg4CAAB4cAAAAAB1cgAUW0x4c2J0aS5hcGkuUGFja2FnZTtbExk3cKcnoQIAAHhwAAAAAHNyABV4c2J0aS5hcGkuQ29tcGlsYXRpb27t+uDDauigQgIAAkoACXN0YXJ0VGltZVsAB291dHB1dHN0ABpbTHhzYnRpL2FwaS9PdXRwdXRTZXR0aW5nO3hwAAABU3/ge511cgAaW0x4c2J0aS5hcGkuT3V0cHV0U2V0dGluZzt/asLzp4elQgIAAHhwAAAAAnNyABd4c2J0aS5hcGkuT3V0cHV0U2V0dGluZ3rZmkd0+x17AgACTAAPb3V0cHV0RGlyZWN0b3J5dAASTGphdmEvbGFuZy9TdHJpbmc7TAAPc291cmNlRGlyZWN0b3J5cQB+ABp4cHQALUQ6XGJiYlxiYmItY29tbW9uLW1lc3NhZ2VcdGFyZ2V0XHRlc3QtY2xhc3Nlc3QAKEQ6XGJiYlxiYmItY29tbW9uLW1lc3NhZ2Vcc3JjXHRlc3Rcc2NhbGFzcQB+ABl0AC1EOlxiYmJcYmJiLWNvbW1vbi1tZXNzYWdlXHRhcmdldFx0ZXN0LWNsYXNzZXN0ACdEOlxiYmJcYmJiLWNvbW1vbi1tZXNzYWdlXHNyY1x0ZXN0XGphdmF1cgACW0Ks8xf4BghU4AIAAHhwAAAAFADROI9ro5Qrlr9xhwXFjodJiEug
|
||||
D:\bbb\bbb-common-message\src\test\java\org\bigbluebutton\messages\CreateBreakoutRoomsRequestTest.java ->
|
||||
rO0ABXNyABB4c2J0aS5hcGkuU291cmNlFlpwRASfbtoCAAZJAAdhcGlIYXNoWgAIaGFzTWFjcm9MABhfaW50ZXJuYWxPbmx5X25hbWVIYXNoZXN0ACRMeHNidGkvYXBpL19pbnRlcm5hbE9ubHlfTmFtZUhhc2hlcztMAANhcGl0ABVMeHNidGkvYXBpL1NvdXJjZUFQSTtMAAtjb21waWxhdGlvbnQAF0x4c2J0aS9hcGkvQ29tcGlsYXRpb247WwAEaGFzaHQAAltCeHC4IVHqAHNyACJ4c2J0aS5hcGkuX2ludGVybmFsT25seV9OYW1lSGFzaGVzVNq+mfrU7EwCAAJbAA9pbXBsaWNpdE1lbWJlcnN0ACNbTHhzYnRpL2FwaS9faW50ZXJuYWxPbmx5X05hbWVIYXNoO1sADnJlZ3VsYXJNZW1iZXJzcQB+AAd4cHVyACNbTHhzYnRpLmFwaS5faW50ZXJuYWxPbmx5X05hbWVIYXNoO0lagLbdlov0AgAAeHAAAAAAdXEAfgAJAAAAAHNyABN4c2J0aS5hcGkuU291cmNlQVBJuV6n+SkjOKQCAAJbAAtkZWZpbml0aW9uc3QAF1tMeHNidGkvYXBpL0RlZmluaXRpb247WwAIcGFja2FnZXN0ABRbTHhzYnRpL2FwaS9QYWNrYWdlO3hwdXIAF1tMeHNidGkuYXBpLkRlZmluaXRpb247iMlc57TjXg4CAAB4cAAAAAB1cgAUW0x4c2J0aS5hcGkuUGFja2FnZTtbExk3cKcnoQIAAHhwAAAAAHNyABV4c2J0aS5hcGkuQ29tcGlsYXRpb27t+uDDauigQgIAAkoACXN0YXJ0VGltZVsAB291dHB1dHN0ABpbTHhzYnRpL2FwaS9PdXRwdXRTZXR0aW5nO3hwAAABU3/ge511cgAaW0x4c2J0aS5hcGkuT3V0cHV0U2V0dGluZzt/asLzp4elQgIAAHhwAAAAAnNyABd4c2J0aS5hcGkuT3V0cHV0U2V0dGluZ3rZmkd0+x17AgACTAAPb3V0cHV0RGlyZWN0b3J5dAASTGphdmEvbGFuZy9TdHJpbmc7TAAPc291cmNlRGlyZWN0b3J5cQB+ABp4cHQALUQ6XGJiYlxiYmItY29tbW9uLW1lc3NhZ2VcdGFyZ2V0XHRlc3QtY2xhc3Nlc3QAKEQ6XGJiYlxiYmItY29tbW9uLW1lc3NhZ2Vcc3JjXHRlc3Rcc2NhbGFzcQB+ABl0AC1EOlxiYmJcYmJiLWNvbW1vbi1tZXNzYWdlXHRhcmdldFx0ZXN0LWNsYXNzZXN0ACdEOlxiYmJcYmJiLWNvbW1vbi1tZXNzYWdlXHNyY1x0ZXN0XGphdmF1cgACW0Ks8xf4BghU4AIAAHhwAAAAFGE+Tws9o3qdTjUktwQrSte8Q/8/
|
||||
D:\bbb\bbb-common-message\src\test\java\org\bigbluebutton\messages\CreateMeetingRequestTest.java ->
|
||||
rO0ABXNyABB4c2J0aS5hcGkuU291cmNlFlpwRASfbtoCAAZJAAdhcGlIYXNoWgAIaGFzTWFjcm9MABhfaW50ZXJuYWxPbmx5X25hbWVIYXNoZXN0ACRMeHNidGkvYXBpL19pbnRlcm5hbE9ubHlfTmFtZUhhc2hlcztMAANhcGl0ABVMeHNidGkvYXBpL1NvdXJjZUFQSTtMAAtjb21waWxhdGlvbnQAF0x4c2J0aS9hcGkvQ29tcGlsYXRpb247WwAEaGFzaHQAAltCeHC4IVHqAHNyACJ4c2J0aS5hcGkuX2ludGVybmFsT25seV9OYW1lSGFzaGVzVNq+mfrU7EwCAAJbAA9pbXBsaWNpdE1lbWJlcnN0ACNbTHhzYnRpL2FwaS9faW50ZXJuYWxPbmx5X05hbWVIYXNoO1sADnJlZ3VsYXJNZW1iZXJzcQB+AAd4cHVyACNbTHhzYnRpLmFwaS5faW50ZXJuYWxPbmx5X05hbWVIYXNoO0lagLbdlov0AgAAeHAAAAAAdXEAfgAJAAAAAHNyABN4c2J0aS5hcGkuU291cmNlQVBJuV6n+SkjOKQCAAJbAAtkZWZpbml0aW9uc3QAF1tMeHNidGkvYXBpL0RlZmluaXRpb247WwAIcGFja2FnZXN0ABRbTHhzYnRpL2FwaS9QYWNrYWdlO3hwdXIAF1tMeHNidGkuYXBpLkRlZmluaXRpb247iMlc57TjXg4CAAB4cAAAAAB1cgAUW0x4c2J0aS5hcGkuUGFja2FnZTtbExk3cKcnoQIAAHhwAAAAAHNyABV4c2J0aS5hcGkuQ29tcGlsYXRpb27t+uDDauigQgIAAkoACXN0YXJ0VGltZVsAB291dHB1dHN0ABpbTHhzYnRpL2FwaS9PdXRwdXRTZXR0aW5nO3hwAAABU3/ge511cgAaW0x4c2J0aS5hcGkuT3V0cHV0U2V0dGluZzt/asLzp4elQgIAAHhwAAAAAnNyABd4c2J0aS5hcGkuT3V0cHV0U2V0dGluZ3rZmkd0+x17AgACTAAPb3V0cHV0RGlyZWN0b3J5dAASTGphdmEvbGFuZy9TdHJpbmc7TAAPc291cmNlRGlyZWN0b3J5cQB+ABp4cHQALUQ6XGJiYlxiYmItY29tbW9uLW1lc3NhZ2VcdGFyZ2V0XHRlc3QtY2xhc3Nlc3QAKEQ6XGJiYlxiYmItY29tbW9uLW1lc3NhZ2Vcc3JjXHRlc3Rcc2NhbGFzcQB+ABl0AC1EOlxiYmJcYmJiLWNvbW1vbi1tZXNzYWdlXHRhcmdldFx0ZXN0LWNsYXNzZXN0ACdEOlxiYmJcYmJiLWNvbW1vbi1tZXNzYWdlXHNyY1x0ZXN0XGphdmF1cgACW0Ks8xf4BghU4AIAAHhwAAAAFAsXOnQUsG0NL1gwC6D8eC/9XuxQ
|
||||
D:\bbb\bbb-common-message\src\test\java\org\bigbluebutton\messages\ValidateAuthTokenReplyTest.java ->
|
||||
rO0ABXNyABB4c2J0aS5hcGkuU291cmNlFlpwRASfbtoCAAZJAAdhcGlIYXNoWgAIaGFzTWFjcm9MABhfaW50ZXJuYWxPbmx5X25hbWVIYXNoZXN0ACRMeHNidGkvYXBpL19pbnRlcm5hbE9ubHlfTmFtZUhhc2hlcztMAANhcGl0ABVMeHNidGkvYXBpL1NvdXJjZUFQSTtMAAtjb21waWxhdGlvbnQAF0x4c2J0aS9hcGkvQ29tcGlsYXRpb247WwAEaGFzaHQAAltCeHC4IVHqAHNyACJ4c2J0aS5hcGkuX2ludGVybmFsT25seV9OYW1lSGFzaGVzVNq+mfrU7EwCAAJbAA9pbXBsaWNpdE1lbWJlcnN0ACNbTHhzYnRpL2FwaS9faW50ZXJuYWxPbmx5X05hbWVIYXNoO1sADnJlZ3VsYXJNZW1iZXJzcQB+AAd4cHVyACNbTHhzYnRpLmFwaS5faW50ZXJuYWxPbmx5X05hbWVIYXNoO0lagLbdlov0AgAAeHAAAAAAdXEAfgAJAAAAAHNyABN4c2J0aS5hcGkuU291cmNlQVBJuV6n+SkjOKQCAAJbAAtkZWZpbml0aW9uc3QAF1tMeHNidGkvYXBpL0RlZmluaXRpb247WwAIcGFja2FnZXN0ABRbTHhzYnRpL2FwaS9QYWNrYWdlO3hwdXIAF1tMeHNidGkuYXBpLkRlZmluaXRpb247iMlc57TjXg4CAAB4cAAAAAB1cgAUW0x4c2J0aS5hcGkuUGFja2FnZTtbExk3cKcnoQIAAHhwAAAAAHNyABV4c2J0aS5hcGkuQ29tcGlsYXRpb27t+uDDauigQgIAAkoACXN0YXJ0VGltZVsAB291dHB1dHN0ABpbTHhzYnRpL2FwaS9PdXRwdXRTZXR0aW5nO3hwAAABU3/ge511cgAaW0x4c2J0aS5hcGkuT3V0cHV0U2V0dGluZzt/asLzp4elQgIAAHhwAAAAAnNyABd4c2J0aS5hcGkuT3V0cHV0U2V0dGluZ3rZmkd0+x17AgACTAAPb3V0cHV0RGlyZWN0b3J5dAASTGphdmEvbGFuZy9TdHJpbmc7TAAPc291cmNlRGlyZWN0b3J5cQB+ABp4cHQALUQ6XGJiYlxiYmItY29tbW9uLW1lc3NhZ2VcdGFyZ2V0XHRlc3QtY2xhc3Nlc3QAKEQ6XGJiYlxiYmItY29tbW9uLW1lc3NhZ2Vcc3JjXHRlc3Rcc2NhbGFzcQB+ABl0AC1EOlxiYmJcYmJiLWNvbW1vbi1tZXNzYWdlXHRhcmdldFx0ZXN0LWNsYXNzZXN0ACdEOlxiYmJcYmJiLWNvbW1vbi1tZXNzYWdlXHNyY1x0ZXN0XGphdmF1cgACW0Ks8xf4BghU4AIAAHhwAAAAFKg9AJb0qRGZQ/XkeuAUDDYZZL6o
|
||||
D:\bbb\bbb-common-message\src\test\java\org\bigbluebutton\messages\ValidateAuthTokenRequestTest.java ->
|
||||
rO0ABXNyABB4c2J0aS5hcGkuU291cmNlFlpwRASfbtoCAAZJAAdhcGlIYXNoWgAIaGFzTWFjcm9MABhfaW50ZXJuYWxPbmx5X25hbWVIYXNoZXN0ACRMeHNidGkvYXBpL19pbnRlcm5hbE9ubHlfTmFtZUhhc2hlcztMAANhcGl0ABVMeHNidGkvYXBpL1NvdXJjZUFQSTtMAAtjb21waWxhdGlvbnQAF0x4c2J0aS9hcGkvQ29tcGlsYXRpb247WwAEaGFzaHQAAltCeHC4IVHqAHNyACJ4c2J0aS5hcGkuX2ludGVybmFsT25seV9OYW1lSGFzaGVzVNq+mfrU7EwCAAJbAA9pbXBsaWNpdE1lbWJlcnN0ACNbTHhzYnRpL2FwaS9faW50ZXJuYWxPbmx5X05hbWVIYXNoO1sADnJlZ3VsYXJNZW1iZXJzcQB+AAd4cHVyACNbTHhzYnRpLmFwaS5faW50ZXJuYWxPbmx5X05hbWVIYXNoO0lagLbdlov0AgAAeHAAAAAAdXEAfgAJAAAAAHNyABN4c2J0aS5hcGkuU291cmNlQVBJuV6n+SkjOKQCAAJbAAtkZWZpbml0aW9uc3QAF1tMeHNidGkvYXBpL0RlZmluaXRpb247WwAIcGFja2FnZXN0ABRbTHhzYnRpL2FwaS9QYWNrYWdlO3hwdXIAF1tMeHNidGkuYXBpLkRlZmluaXRpb247iMlc57TjXg4CAAB4cAAAAAB1cgAUW0x4c2J0aS5hcGkuUGFja2FnZTtbExk3cKcnoQIAAHhwAAAAAHNyABV4c2J0aS5hcGkuQ29tcGlsYXRpb27t+uDDauigQgIAAkoACXN0YXJ0VGltZVsAB291dHB1dHN0ABpbTHhzYnRpL2FwaS9PdXRwdXRTZXR0aW5nO3hwAAABU3/ge511cgAaW0x4c2J0aS5hcGkuT3V0cHV0U2V0dGluZzt/asLzp4elQgIAAHhwAAAAAnNyABd4c2J0aS5hcGkuT3V0cHV0U2V0dGluZ3rZmkd0+x17AgACTAAPb3V0cHV0RGlyZWN0b3J5dAASTGphdmEvbGFuZy9TdHJpbmc7TAAPc291cmNlRGlyZWN0b3J5cQB+ABp4cHQALUQ6XGJiYlxiYmItY29tbW9uLW1lc3NhZ2VcdGFyZ2V0XHRlc3QtY2xhc3Nlc3QAKEQ6XGJiYlxiYmItY29tbW9uLW1lc3NhZ2Vcc3JjXHRlc3Rcc2NhbGFzcQB+ABl0AC1EOlxiYmJcYmJiLWNvbW1vbi1tZXNzYWdlXHRhcmdldFx0ZXN0LWNsYXNzZXN0ACdEOlxiYmJcYmJiLWNvbW1vbi1tZXNzYWdlXHNyY1x0ZXN0XGphdmF1cgACW0Ks8xf4BghU4AIAAHhwAAAAFN7mczhHeOaQ04t15NoHQBY6XkrB
|
||||
D:\bbb\bbb-common-message\src\test\java\org\bigbluebutton\messages\ValidateAuthTokenRequestTimedoutTest.java ->
|
||||
rO0ABXNyABB4c2J0aS5hcGkuU291cmNlFlpwRASfbtoCAAZJAAdhcGlIYXNoWgAIaGFzTWFjcm9MABhfaW50ZXJuYWxPbmx5X25hbWVIYXNoZXN0ACRMeHNidGkvYXBpL19pbnRlcm5hbE9ubHlfTmFtZUhhc2hlcztMAANhcGl0ABVMeHNidGkvYXBpL1NvdXJjZUFQSTtMAAtjb21waWxhdGlvbnQAF0x4c2J0aS9hcGkvQ29tcGlsYXRpb247WwAEaGFzaHQAAltCeHC4IVHqAHNyACJ4c2J0aS5hcGkuX2ludGVybmFsT25seV9OYW1lSGFzaGVzVNq+mfrU7EwCAAJbAA9pbXBsaWNpdE1lbWJlcnN0ACNbTHhzYnRpL2FwaS9faW50ZXJuYWxPbmx5X05hbWVIYXNoO1sADnJlZ3VsYXJNZW1iZXJzcQB+AAd4cHVyACNbTHhzYnRpLmFwaS5faW50ZXJuYWxPbmx5X05hbWVIYXNoO0lagLbdlov0AgAAeHAAAAAAdXEAfgAJAAAAAHNyABN4c2J0aS5hcGkuU291cmNlQVBJuV6n+SkjOKQCAAJbAAtkZWZpbml0aW9uc3QAF1tMeHNidGkvYXBpL0RlZmluaXRpb247WwAIcGFja2FnZXN0ABRbTHhzYnRpL2FwaS9QYWNrYWdlO3hwdXIAF1tMeHNidGkuYXBpLkRlZmluaXRpb247iMlc57TjXg4CAAB4cAAAAAB1cgAUW0x4c2J0aS5hcGkuUGFja2FnZTtbExk3cKcnoQIAAHhwAAAAAHNyABV4c2J0aS5hcGkuQ29tcGlsYXRpb27t+uDDauigQgIAAkoACXN0YXJ0VGltZVsAB291dHB1dHN0ABpbTHhzYnRpL2FwaS9PdXRwdXRTZXR0aW5nO3hwAAABU3/ge511cgAaW0x4c2J0aS5hcGkuT3V0cHV0U2V0dGluZzt/asLzp4elQgIAAHhwAAAAAnNyABd4c2J0aS5hcGkuT3V0cHV0U2V0dGluZ3rZmkd0+x17AgACTAAPb3V0cHV0RGlyZWN0b3J5dAASTGphdmEvbGFuZy9TdHJpbmc7TAAPc291cmNlRGlyZWN0b3J5cQB+ABp4cHQALUQ6XGJiYlxiYmItY29tbW9uLW1lc3NhZ2VcdGFyZ2V0XHRlc3QtY2xhc3Nlc3QAKEQ6XGJiYlxiYmItY29tbW9uLW1lc3NhZ2Vcc3JjXHRlc3Rcc2NhbGFzcQB+ABl0AC1EOlxiYmJcYmJiLWNvbW1vbi1tZXNzYWdlXHRhcmdldFx0ZXN0LWNsYXNzZXN0ACdEOlxiYmJcYmJiLWNvbW1vbi1tZXNzYWdlXHNyY1x0ZXN0XGphdmF1cgACW0Ks8xf4BghU4AIAAHhwAAAAFKh9o9HRGUjHhjeXpzaEFUNy+z1e
|
||||
external apis:
|
||||
3 items
|
||||
org.bigbluebutton.common.messages.MessageHeader ->
|
||||
rO0ABXNyABB4c2J0aS5hcGkuU291cmNlFlpwRASfbtoCAAZJAAdhcGlIYXNoWgAIaGFzTWFjcm9MABhfaW50ZXJuYWxPbmx5X25hbWVIYXNoZXN0ACRMeHNidGkvYXBpL19pbnRlcm5hbE9ubHlfTmFtZUhhc2hlcztMAANhcGl0ABVMeHNidGkvYXBpL1NvdXJjZUFQSTtMAAtjb21waWxhdGlvbnQAF0x4c2J0aS9hcGkvQ29tcGlsYXRpb247WwAEaGFzaHQAAltCeHC1jHPaAHNyACJ4c2J0aS5hcGkuX2ludGVybmFsT25seV9OYW1lSGFzaGVzVNq+mfrU7EwCAAJbAA9pbXBsaWNpdE1lbWJlcnN0ACNbTHhzYnRpL2FwaS9faW50ZXJuYWxPbmx5X05hbWVIYXNoO1sADnJlZ3VsYXJNZW1iZXJzcQB+AAd4cHVyACNbTHhzYnRpLmFwaS5faW50ZXJuYWxPbmx5X05hbWVIYXNoO0lagLbdlov0AgAAeHAAAAAAdXEAfgAJAAAAAHNyABN4c2J0aS5hcGkuU291cmNlQVBJuV6n+SkjOKQCAAJbAAtkZWZpbml0aW9uc3QAF1tMeHNidGkvYXBpL0RlZmluaXRpb247WwAIcGFja2FnZXN0ABRbTHhzYnRpL2FwaS9QYWNrYWdlO3hwdXIAF1tMeHNidGkuYXBpLkRlZmluaXRpb247iMlc57TjXg4CAAB4cAAAAAJzcgATeHNidGkuYXBpLkNsYXNzTGlrZYM0HKHfsJdsAgAETAAOZGVmaW5pdGlvblR5cGV0ABpMeHNidGkvYXBpL0RlZmluaXRpb25UeXBlO1sAEHNhdmVkQW5ub3RhdGlvbnN0ABNbTGphdmEvbGFuZy9TdHJpbmc7TAAIc2VsZlR5cGV0ABBMeHNidGkvYXBpL0xhenk7TAAJc3RydWN0dXJlcQB+ABV4cgAheHNidGkuYXBpLlBhcmFtZXRlcml6ZWREZWZpbml0aW9u+RFusdVQPOICAAFbAA50eXBlUGFyYW1ldGVyc3QAGltMeHNidGkvYXBpL1R5cGVQYXJhbWV0ZXI7eHIAFHhzYnRpLmFwaS5EZWZpbml0aW9uhyob6HFC40YCAARMAAZhY2Nlc3N0ABJMeHNidGkvYXBpL0FjY2VzcztbAAthbm5vdGF0aW9uc3QAF1tMeHNidGkvYXBpL0Fubm90YXRpb247TAAJbW9kaWZpZXJzdAAVTHhzYnRpL2FwaS9Nb2RpZmllcnM7TAAEbmFtZXQAEkxqYXZhL2xhbmcvU3RyaW5nO3hwc3IAEHhzYnRpLmFwaS5QdWJsaWO6WD2ubC1gQgIAAHhyABB4c2J0aS5hcGkuQWNjZXNz3WKa+B1jMUgCAAB4cHVyABdbTHhzYnRpLmFwaS5Bbm5vdGF0aW9uO+uX6xkQ9o1IAgAAeHAAAAAAc3IAE3hzYnRpLmFwaS5Nb2RpZmllcnPHERMhaZzcJAIAAUIABWZsYWdzeHAAdAAvb3JnLmJpZ2JsdWVidXR0b24uY29tbW9uLm1lc3NhZ2VzLk1lc3NhZ2VIZWFkZXJ1cgAaW0x4c2J0aS5hcGkuVHlwZVBhcmFtZXRlcjvZbSYPKJ3ytgIAAHhwAAAAAH5yABh4c2J0aS5hcGkuRGVmaW5pdGlvblR5cGUAAAAAAAAAABIAAHhyAA5qYXZhLmxhbmcuRW51bQAAAAAAAAAAEgAAeHB0AAhDbGFzc0RlZnVyABNbTGphdmEubGFuZy5TdHJpbmc7rdJW5+kde0cCAAB4cAAAAAF0AAxzY2FsYS50aHJvd3NzcgATeHNidGkuU2FmZUxhenkkSW1wbDuRTxH0RUzJAgADWgAIYml0bWFwJDBMAAJfdHQAEkxqYXZhL2xhbmcvT2JqZWN0O0wABGV2YWx0ABFMc2NhbGEvRnVuY3Rpb24wO3hyABZ4c2J0aS5hcGkuQWJzdHJhY3RMYXp503e1AV+756ACAAB4cAFzcgATeHNidGkuYXBpLkVtcHR5VHlwZbz9nkZJO4kkAgAAeHIAFHhzYnRpLmFwaS5TaW1wbGVUeXBlcnhiiCEjv0ACAAB4cgAOeHNidGkuYXBpLlR5cGU/atkhFkmqygIAAHhwcHNxAH4ALwFzcgATeHNidGkuYXBpLlN0cnVjdHVyZamq+YCTb9gAAgADTAAIZGVjbGFyZWRxAH4AFUwACWluaGVyaXRlZHEAfgAVTAAHcGFyZW50c3EAfgAVeHEAfgA2c3EAfgAvAXVxAH4AEAAAAABwc3EAfgAvAXVxAH4AEAAAAABwc3EAfgAvAXVyABFbTHhzYnRpLmFwaS5UeXBlO3T/pVp7+elBAgAAeHAAAAABc3IAFHhzYnRpLmFwaS5Qcm9qZWN0aW9u89KNVOlFpC0CAAJMAAJpZHEAfgAcTAAGcHJlZml4dAAWTHhzYnRpL2FwaS9TaW1wbGVUeXBlO3hxAH4ANXQABk9iamVjdHNyABN4c2J0aS5hcGkuU2luZ2xldG9u/Kdf+M9W5EYCAAFMAARwYXRodAAQTHhzYnRpL2FwaS9QYXRoO3hxAH4ANXNyAA54c2J0aS5hcGkuUGF0aJs9XAjOpSeEAgABWwAKY29tcG9uZW50c3QAGltMeHNidGkvYXBpL1BhdGhDb21wb25lbnQ7eHB1cgAaW0x4c2J0aS5hcGkuUGF0aENvbXBvbmVudDtD2gl0LWcWdAIAAHhwAAAAA3NyAAx4c2J0aS5hcGkuSWSYMmyLN1PEQAIAAUwAAmlkcQB+ABx4cgAXeHNidGkuYXBpLlBhdGhDb21wb25lbnRfmiJbLoafvAIAAHhwdAAEamF2YXNxAH4ATnQABGxhbmdzcgAOeHNidGkuYXBpLlRoaXPbCe2mzFpAXAIAAHhxAH4AT3Bwc3EAfgAScQB+ACBxAH4AInEAfgAkcQB+ACVxAH4AJ35xAH4AKHQABk1vZHVsZXVxAH4ALAAAAABzcQB+AC8BcQB+ADdwc3EAfgAvAXNxAH4AOXNxAH4ALwF1cQB+ABAAAAAAcHNxAH4ALwF1cQB+ABAAAAAAcHNxAH4ALwF1cQB+AEAAAAAAcHB1cgAUW0x4c2J0aS5hcGkuUGFja2FnZTtbExk3cKcnoQIAAHhwAAAAAXNyABF4c2J0aS5hcGkuUGFja2FnZX5Zj/auzjlYAgABTAAEbmFtZXEAfgAceHB0ACFvcmcuYmlnYmx1ZWJ1dHRvbi5jb21tb24ubWVzc2FnZXNzcgAVeHNidGkuYXBpLkNvbXBpbGF0aW9u7frgw2rooEICAAJKAAlzdGFydFRpbWVbAAdvdXRwdXRzdAAaW0x4c2J0aS9hcGkvT3V0cHV0U2V0dGluZzt4cAAAAVLvfCYVdXIAGltMeHNidGkuYXBpLk91dHB1dFNldHRpbmc7f2rC86eHpUICAAB4cAAAAAJzcgAXeHNidGkuYXBpLk91dHB1dFNldHRpbmd62ZpHdPsdewIAAkwAD291dHB1dERpcmVjdG9yeXEAfgAcTAAPc291cmNlRGlyZWN0b3J5cQB+ABx4cHQAKEQ6XGJiYlxiYmItY29tbW9uLW1lc3NhZ2VcdGFyZ2V0XGNsYXNzZXN0AChEOlxiYmJcYmJiLWNvbW1vbi1tZXNzYWdlXHNyY1xtYWluXHNjYWxhc3EAfgBtdAAoRDpcYmJiXGJiYi1jb21tb24tbWVzc2FnZVx0YXJnZXRcY2xhc3Nlc3QAJ0Q6XGJiYlxiYmItY29tbW9uLW1lc3NhZ2Vcc3JjXG1haW5camF2YXVyAAJbQqzzF/gGCFTgAgAAeHAAAAAUUqHbDR36cSvQL5OY+Lzv/3X5zc8=
|
||||
org.bigbluebutton.common.messages.StartCustomPollRequestMessage ->
|
||||
rO0ABXNyABB4c2J0aS5hcGkuU291cmNlFlpwRASfbtoCAAZJAAdhcGlIYXNoWgAIaGFzTWFjcm9MABhfaW50ZXJuYWxPbmx5X25hbWVIYXNoZXN0ACRMeHNidGkvYXBpL19pbnRlcm5hbE9ubHlfTmFtZUhhc2hlcztMAANhcGl0ABVMeHNidGkvYXBpL1NvdXJjZUFQSTtMAAtjb21waWxhdGlvbnQAF0x4c2J0aS9hcGkvQ29tcGlsYXRpb247WwAEaGFzaHQAAltCeHCUnh8qAHNyACJ4c2J0aS5hcGkuX2ludGVybmFsT25seV9OYW1lSGFzaGVzVNq+mfrU7EwCAAJbAA9pbXBsaWNpdE1lbWJlcnN0ACNbTHhzYnRpL2FwaS9faW50ZXJuYWxPbmx5X05hbWVIYXNoO1sADnJlZ3VsYXJNZW1iZXJzcQB+AAd4cHVyACNbTHhzYnRpLmFwaS5faW50ZXJuYWxPbmx5X05hbWVIYXNoO0lagLbdlov0AgAAeHAAAAAAdXEAfgAJAAAAAHNyABN4c2J0aS5hcGkuU291cmNlQVBJuV6n+SkjOKQCAAJbAAtkZWZpbml0aW9uc3QAF1tMeHNidGkvYXBpL0RlZmluaXRpb247WwAIcGFja2FnZXN0ABRbTHhzYnRpL2FwaS9QYWNrYWdlO3hwdXIAF1tMeHNidGkuYXBpLkRlZmluaXRpb247iMlc57TjXg4CAAB4cAAAAAJzcgATeHNidGkuYXBpLkNsYXNzTGlrZYM0HKHfsJdsAgAETAAOZGVmaW5pdGlvblR5cGV0ABpMeHNidGkvYXBpL0RlZmluaXRpb25UeXBlO1sAEHNhdmVkQW5ub3RhdGlvbnN0ABNbTGphdmEvbGFuZy9TdHJpbmc7TAAIc2VsZlR5cGV0ABBMeHNidGkvYXBpL0xhenk7TAAJc3RydWN0dXJlcQB+ABV4cgAheHNidGkuYXBpLlBhcmFtZXRlcml6ZWREZWZpbml0aW9u+RFusdVQPOICAAFbAA50eXBlUGFyYW1ldGVyc3QAGltMeHNidGkvYXBpL1R5cGVQYXJhbWV0ZXI7eHIAFHhzYnRpLmFwaS5EZWZpbml0aW9uhyob6HFC40YCAARMAAZhY2Nlc3N0ABJMeHNidGkvYXBpL0FjY2VzcztbAAthbm5vdGF0aW9uc3QAF1tMeHNidGkvYXBpL0Fubm90YXRpb247TAAJbW9kaWZpZXJzdAAVTHhzYnRpL2FwaS9Nb2RpZmllcnM7TAAEbmFtZXQAEkxqYXZhL2xhbmcvU3RyaW5nO3hwc3IAEHhzYnRpLmFwaS5QdWJsaWO6WD2ubC1gQgIAAHhyABB4c2J0aS5hcGkuQWNjZXNz3WKa+B1jMUgCAAB4cHVyABdbTHhzYnRpLmFwaS5Bbm5vdGF0aW9uO+uX6xkQ9o1IAgAAeHAAAAAAc3IAE3hzYnRpLmFwaS5Nb2RpZmllcnPHERMhaZzcJAIAAUIABWZsYWdzeHAAdAA/b3JnLmJpZ2JsdWVidXR0b24uY29tbW9uLm1lc3NhZ2VzLlN0YXJ0Q3VzdG9tUG9sbFJlcXVlc3RNZXNzYWdldXIAGltMeHNidGkuYXBpLlR5cGVQYXJhbWV0ZXI72W0mDyid8rYCAAB4cAAAAAB+cgAYeHNidGkuYXBpLkRlZmluaXRpb25UeXBlAAAAAAAAAAASAAB4cgAOamF2YS5sYW5nLkVudW0AAAAAAAAAABIAAHhwdAAIQ2xhc3NEZWZ1cgATW0xqYXZhLmxhbmcuU3RyaW5nO63SVufpHXtHAgAAeHAAAAABdAAMc2NhbGEudGhyb3dzc3IAE3hzYnRpLlNhZmVMYXp5JEltcGw7kU8R9EVMyQIAA1oACGJpdG1hcCQwTAACX3R0ABJMamF2YS9sYW5nL09iamVjdDtMAARldmFsdAARTHNjYWxhL0Z1bmN0aW9uMDt4cgAWeHNidGkuYXBpLkFic3RyYWN0TGF6edN3tQFfu+egAgAAeHABc3IAE3hzYnRpLmFwaS5FbXB0eVR5cGW8/Z5GSTuJJAIAAHhyABR4c2J0aS5hcGkuU2ltcGxlVHlwZXJ4YoghI79AAgAAeHIADnhzYnRpLmFwaS5UeXBlP2rZIRZJqsoCAAB4cHBzcQB+AC8Bc3IAE3hzYnRpLmFwaS5TdHJ1Y3R1cmWpqvmAk2/YAAIAA0wACGRlY2xhcmVkcQB+ABVMAAlpbmhlcml0ZWRxAH4AFUwAB3BhcmVudHNxAH4AFXhxAH4ANnNxAH4ALwF1cQB+ABAAAAAAcHNxAH4ALwF1cQB+ABAAAAAAcHNxAH4ALwF1cgARW0x4c2J0aS5hcGkuVHlwZTt0/6Vae/npQQIAAHhwAAAAAnNyABR4c2J0aS5hcGkuUHJvamVjdGlvbvPSjVTpRaQtAgACTAACaWRxAH4AHEwABnByZWZpeHQAFkx4c2J0aS9hcGkvU2ltcGxlVHlwZTt4cQB+ADV0AAZPYmplY3RzcgATeHNidGkuYXBpLlNpbmdsZXRvbvynX/jPVuRGAgABTAAEcGF0aHQAEEx4c2J0aS9hcGkvUGF0aDt4cQB+ADVzcgAOeHNidGkuYXBpLlBhdGibPVwIzqUnhAIAAVsACmNvbXBvbmVudHN0ABpbTHhzYnRpL2FwaS9QYXRoQ29tcG9uZW50O3hwdXIAGltMeHNidGkuYXBpLlBhdGhDb21wb25lbnQ7Q9oJdC1nFnQCAAB4cAAAAANzcgAMeHNidGkuYXBpLklkmDJsizdTxEACAAFMAAJpZHEAfgAceHIAF3hzYnRpLmFwaS5QYXRoQ29tcG9uZW50X5oiWy6Gn7wCAAB4cHQABGphdmFzcQB+AE50AARsYW5nc3IADnhzYnRpLmFwaS5UaGlz2wntpsxaQFwCAAB4cQB+AE9zcQB+AEJ0ABVJQmlnQmx1ZUJ1dHRvbk1lc3NhZ2VzcQB+AEZzcQB+AEl1cQB+AEwAAAAFc3EAfgBOdAADb3Jnc3EAfgBOdAANYmlnYmx1ZWJ1dHRvbnNxAH4ATnQABmNvbW1vbnNxAH4ATnQACG1lc3NhZ2VzcQB+AFVwcHNxAH4AEnEAfgAgcQB+ACJxAH4AJHEAfgAlcQB+ACd+cQB+ACh0AAZNb2R1bGV1cQB+ACwAAAAAc3EAfgAvAXEAfgA3cHNxAH4ALwFzcQB+ADlzcQB+AC8BdXEAfgAQAAAAAHBzcQB+AC8BdXEAfgAQAAAAAHBzcQB+AC8BdXEAfgBAAAAAAHBwdXIAFFtMeHNidGkuYXBpLlBhY2thZ2U7WxMZN3CnJ6ECAAB4cAAAAAFzcgAReHNidGkuYXBpLlBhY2thZ2V+WY/2rs45WAIAAUwABG5hbWVxAH4AHHhwdAAhb3JnLmJpZ2JsdWVidXR0b24uY29tbW9uLm1lc3NhZ2Vzc3IAFXhzYnRpLmFwaS5Db21waWxhdGlvbu364MNq6KBCAgACSgAJc3RhcnRUaW1lWwAHb3V0cHV0c3QAGltMeHNidGkvYXBpL091dHB1dFNldHRpbmc7eHAAAAFS73wmFXVyABpbTHhzYnRpLmFwaS5PdXRwdXRTZXR0aW5nO39qwvOnh6VCAgAAeHAAAAACc3IAF3hzYnRpLmFwaS5PdXRwdXRTZXR0aW5netmaR3T7HXsCAAJMAA9vdXRwdXREaXJlY3RvcnlxAH4AHEwAD3NvdXJjZURpcmVjdG9yeXEAfgAceHB0AChEOlxiYmJcYmJiLWNvbW1vbi1tZXNzYWdlXHRhcmdldFxjbGFzc2VzdAAoRDpcYmJiXGJiYi1jb21tb24tbWVzc2FnZVxzcmNcbWFpblxzY2FsYXNxAH4AenQAKEQ6XGJiYlxiYmItY29tbW9uLW1lc3NhZ2VcdGFyZ2V0XGNsYXNzZXN0ACdEOlxiYmJcYmJiLWNvbW1vbi1tZXNzYWdlXHNyY1xtYWluXGphdmF1cgACW0Ks8xf4BghU4AIAAHhwAAAAFAioGqdQNl4/UhiqNwOoAfmiyZIt
|
||||
org.bigbluebutton.common.messages.payload.StartCustomPollRequestMessagePayload ->
|
||||
rO0ABXNyABB4c2J0aS5hcGkuU291cmNlFlpwRASfbtoCAAZJAAdhcGlIYXNoWgAIaGFzTWFjcm9MABhfaW50ZXJuYWxPbmx5X25hbWVIYXNoZXN0ACRMeHNidGkvYXBpL19pbnRlcm5hbE9ubHlfTmFtZUhhc2hlcztMAANhcGl0ABVMeHNidGkvYXBpL1NvdXJjZUFQSTtMAAtjb21waWxhdGlvbnQAF0x4c2J0aS9hcGkvQ29tcGlsYXRpb247WwAEaGFzaHQAAltCeHBDEceaAHNyACJ4c2J0aS5hcGkuX2ludGVybmFsT25seV9OYW1lSGFzaGVzVNq+mfrU7EwCAAJbAA9pbXBsaWNpdE1lbWJlcnN0ACNbTHhzYnRpL2FwaS9faW50ZXJuYWxPbmx5X05hbWVIYXNoO1sADnJlZ3VsYXJNZW1iZXJzcQB+AAd4cHVyACNbTHhzYnRpLmFwaS5faW50ZXJuYWxPbmx5X05hbWVIYXNoO0lagLbdlov0AgAAeHAAAAAAdXEAfgAJAAAAAHNyABN4c2J0aS5hcGkuU291cmNlQVBJuV6n+SkjOKQCAAJbAAtkZWZpbml0aW9uc3QAF1tMeHNidGkvYXBpL0RlZmluaXRpb247WwAIcGFja2FnZXN0ABRbTHhzYnRpL2FwaS9QYWNrYWdlO3hwdXIAF1tMeHNidGkuYXBpLkRlZmluaXRpb247iMlc57TjXg4CAAB4cAAAAAJzcgATeHNidGkuYXBpLkNsYXNzTGlrZYM0HKHfsJdsAgAETAAOZGVmaW5pdGlvblR5cGV0ABpMeHNidGkvYXBpL0RlZmluaXRpb25UeXBlO1sAEHNhdmVkQW5ub3RhdGlvbnN0ABNbTGphdmEvbGFuZy9TdHJpbmc7TAAIc2VsZlR5cGV0ABBMeHNidGkvYXBpL0xhenk7TAAJc3RydWN0dXJlcQB+ABV4cgAheHNidGkuYXBpLlBhcmFtZXRlcml6ZWREZWZpbml0aW9u+RFusdVQPOICAAFbAA50eXBlUGFyYW1ldGVyc3QAGltMeHNidGkvYXBpL1R5cGVQYXJhbWV0ZXI7eHIAFHhzYnRpLmFwaS5EZWZpbml0aW9uhyob6HFC40YCAARMAAZhY2Nlc3N0ABJMeHNidGkvYXBpL0FjY2VzcztbAAthbm5vdGF0aW9uc3QAF1tMeHNidGkvYXBpL0Fubm90YXRpb247TAAJbW9kaWZpZXJzdAAVTHhzYnRpL2FwaS9Nb2RpZmllcnM7TAAEbmFtZXQAEkxqYXZhL2xhbmcvU3RyaW5nO3hwc3IAEHhzYnRpLmFwaS5QdWJsaWO6WD2ubC1gQgIAAHhyABB4c2J0aS5hcGkuQWNjZXNz3WKa+B1jMUgCAAB4cHVyABdbTHhzYnRpLmFwaS5Bbm5vdGF0aW9uO+uX6xkQ9o1IAgAAeHAAAAAAc3IAE3hzYnRpLmFwaS5Nb2RpZmllcnPHERMhaZzcJAIAAUIABWZsYWdzeHAAdABOb3JnLmJpZ2JsdWVidXR0b24uY29tbW9uLm1lc3NhZ2VzLnBheWxvYWQuU3RhcnRDdXN0b21Qb2xsUmVxdWVzdE1lc3NhZ2VQYXlsb2FkdXIAGltMeHNidGkuYXBpLlR5cGVQYXJhbWV0ZXI72W0mDyid8rYCAAB4cAAAAAB+cgAYeHNidGkuYXBpLkRlZmluaXRpb25UeXBlAAAAAAAAAAASAAB4cgAOamF2YS5sYW5nLkVudW0AAAAAAAAAABIAAHhwdAAIQ2xhc3NEZWZ1cgATW0xqYXZhLmxhbmcuU3RyaW5nO63SVufpHXtHAgAAeHAAAAABdAAMc2NhbGEudGhyb3dzc3IAE3hzYnRpLlNhZmVMYXp5JEltcGw7kU8R9EVMyQIAA1oACGJpdG1hcCQwTAACX3R0ABJMamF2YS9sYW5nL09iamVjdDtMAARldmFsdAARTHNjYWxhL0Z1bmN0aW9uMDt4cgAWeHNidGkuYXBpLkFic3RyYWN0TGF6edN3tQFfu+egAgAAeHABc3IAE3hzYnRpLmFwaS5FbXB0eVR5cGW8/Z5GSTuJJAIAAHhyABR4c2J0aS5hcGkuU2ltcGxlVHlwZXJ4YoghI79AAgAAeHIADnhzYnRpLmFwaS5UeXBlP2rZIRZJqsoCAAB4cHBzcQB+AC8Bc3IAE3hzYnRpLmFwaS5TdHJ1Y3R1cmWpqvmAk2/YAAIAA0wACGRlY2xhcmVkcQB+ABVMAAlpbmhlcml0ZWRxAH4AFUwAB3BhcmVudHNxAH4AFXhxAH4ANnNxAH4ALwF1cQB+ABAAAAAAcHNxAH4ALwF1cQB+ABAAAAAAcHNxAH4ALwF1cgARW0x4c2J0aS5hcGkuVHlwZTt0/6Vae/npQQIAAHhwAAAAAXNyABR4c2J0aS5hcGkuUHJvamVjdGlvbvPSjVTpRaQtAgACTAACaWRxAH4AHEwABnByZWZpeHQAFkx4c2J0aS9hcGkvU2ltcGxlVHlwZTt4cQB+ADV0AAZPYmplY3RzcgATeHNidGkuYXBpLlNpbmdsZXRvbvynX/jPVuRGAgABTAAEcGF0aHQAEEx4c2J0aS9hcGkvUGF0aDt4cQB+ADVzcgAOeHNidGkuYXBpLlBhdGibPVwIzqUnhAIAAVsACmNvbXBvbmVudHN0ABpbTHhzYnRpL2FwaS9QYXRoQ29tcG9uZW50O3hwdXIAGltMeHNidGkuYXBpLlBhdGhDb21wb25lbnQ7Q9oJdC1nFnQCAAB4cAAAAANzcgAMeHNidGkuYXBpLklkmDJsizdTxEACAAFMAAJpZHEAfgAceHIAF3hzYnRpLmFwaS5QYXRoQ29tcG9uZW50X5oiWy6Gn7wCAAB4cHQABGphdmFzcQB+AE50AARsYW5nc3IADnhzYnRpLmFwaS5UaGlz2wntpsxaQFwCAAB4cQB+AE9wcHNxAH4AEnEAfgAgcQB+ACJxAH4AJHEAfgAlcQB+ACd+cQB+ACh0AAZNb2R1bGV1cQB+ACwAAAAAc3EAfgAvAXEAfgA3cHNxAH4ALwFzcQB+ADlzcQB+AC8BdXEAfgAQAAAAAHBzcQB+AC8BdXEAfgAQAAAAAHBzcQB+AC8BdXEAfgBAAAAAAHBwdXIAFFtMeHNidGkuYXBpLlBhY2thZ2U7WxMZN3CnJ6ECAAB4cAAAAAFzcgAReHNidGkuYXBpLlBhY2thZ2V+WY/2rs45WAIAAUwABG5hbWVxAH4AHHhwdAApb3JnLmJpZ2JsdWVidXR0b24uY29tbW9uLm1lc3NhZ2VzLnBheWxvYWRzcgAVeHNidGkuYXBpLkNvbXBpbGF0aW9u7frgw2rooEICAAJKAAlzdGFydFRpbWVbAAdvdXRwdXRzdAAaW0x4c2J0aS9hcGkvT3V0cHV0U2V0dGluZzt4cAAAAVLvfCYVdXIAGltMeHNidGkuYXBpLk91dHB1dFNldHRpbmc7f2rC86eHpUICAAB4cAAAAAJzcgAXeHNidGkuYXBpLk91dHB1dFNldHRpbmd62ZpHdPsdewIAAkwAD291dHB1dERpcmVjdG9yeXEAfgAcTAAPc291cmNlRGlyZWN0b3J5cQB+ABx4cHQAKEQ6XGJiYlxiYmItY29tbW9uLW1lc3NhZ2VcdGFyZ2V0XGNsYXNzZXN0AChEOlxiYmJcYmJiLWNvbW1vbi1tZXNzYWdlXHNyY1xtYWluXHNjYWxhc3EAfgBtdAAoRDpcYmJiXGJiYi1jb21tb24tbWVzc2FnZVx0YXJnZXRcY2xhc3Nlc3QAJ0Q6XGJiYlxiYmItY29tbW9uLW1lc3NhZ2Vcc3JjXG1haW5camF2YXVyAAJbQqzzF/gGCFTgAgAAeHAAAAAUtra1/474+FAArE/LUhsDV5gbWrM=
|
||||
source infos:
|
||||
8 items
|
||||
D:\bbb\bbb-common-message\src\test\java\org\bigbluebutton\common\messages\StartCustomPollRequestMessageTest.java ->
|
||||
AAAAAAAAAAA=
|
||||
D:\bbb\bbb-common-message\src\test\java\org\bigbluebutton\messages\BreakoutRoomsListTest.java ->
|
||||
AAAAAAAAAAA=
|
||||
D:\bbb\bbb-common-message\src\test\java\org\bigbluebutton\messages\CreateBreakoutRoomRequestTest.java ->
|
||||
AAAAAAAAAAA=
|
||||
D:\bbb\bbb-common-message\src\test\java\org\bigbluebutton\messages\CreateBreakoutRoomsRequestTest.java ->
|
||||
AAAAAAAAAAA=
|
||||
D:\bbb\bbb-common-message\src\test\java\org\bigbluebutton\messages\CreateMeetingRequestTest.java ->
|
||||
AAAAAAAAAAA=
|
||||
D:\bbb\bbb-common-message\src\test\java\org\bigbluebutton\messages\ValidateAuthTokenReplyTest.java ->
|
||||
AAAAAAAAAAA=
|
||||
D:\bbb\bbb-common-message\src\test\java\org\bigbluebutton\messages\ValidateAuthTokenRequestTest.java ->
|
||||
AAAAAAAAAAA=
|
||||
D:\bbb\bbb-common-message\src\test\java\org\bigbluebutton\messages\ValidateAuthTokenRequestTimedoutTest.java ->
|
||||
AAAAAAAAAAA=
|
||||
compilations:
|
||||
6 items
|
||||
0 -> rO0ABXNyABV4c2J0aS5hcGkuQ29tcGlsYXRpb27t+uDDauigQgIAAkoACXN0YXJ0VGltZVsAB291dHB1dHN0ABpbTHhzYnRpL2FwaS9PdXRwdXRTZXR0aW5nO3hwAAABUu97VvZ1cgAaW0x4c2J0aS5hcGkuT3V0cHV0U2V0dGluZzt/asLzp4elQgIAAHhwAAAAAnNyABd4c2J0aS5hcGkuT3V0cHV0U2V0dGluZ3rZmkd0+x17AgACTAAPb3V0cHV0RGlyZWN0b3J5dAASTGphdmEvbGFuZy9TdHJpbmc7TAAPc291cmNlRGlyZWN0b3J5cQB+AAZ4cHQALUQ6XGJiYlxiYmItY29tbW9uLW1lc3NhZ2VcdGFyZ2V0XHRlc3QtY2xhc3Nlc3QAKEQ6XGJiYlxiYmItY29tbW9uLW1lc3NhZ2Vcc3JjXHRlc3Rcc2NhbGFzcQB+AAV0AC1EOlxiYmJcYmJiLWNvbW1vbi1tZXNzYWdlXHRhcmdldFx0ZXN0LWNsYXNzZXN0ACdEOlxiYmJcYmJiLWNvbW1vbi1tZXNzYWdlXHNyY1x0ZXN0XGphdmE=
|
||||
1 -> rO0ABXNyABV4c2J0aS5hcGkuQ29tcGlsYXRpb27t+uDDauigQgIAAkoACXN0YXJ0VGltZVsAB291dHB1dHN0ABpbTHhzYnRpL2FwaS9PdXRwdXRTZXR0aW5nO3hwAAABUu98LnR1cgAaW0x4c2J0aS5hcGkuT3V0cHV0U2V0dGluZzt/asLzp4elQgIAAHhwAAAAAnNyABd4c2J0aS5hcGkuT3V0cHV0U2V0dGluZ3rZmkd0+x17AgACTAAPb3V0cHV0RGlyZWN0b3J5dAASTGphdmEvbGFuZy9TdHJpbmc7TAAPc291cmNlRGlyZWN0b3J5cQB+AAZ4cHQALUQ6XGJiYlxiYmItY29tbW9uLW1lc3NhZ2VcdGFyZ2V0XHRlc3QtY2xhc3Nlc3QAKEQ6XGJiYlxiYmItY29tbW9uLW1lc3NhZ2Vcc3JjXHRlc3Rcc2NhbGFzcQB+AAV0AC1EOlxiYmJcYmJiLWNvbW1vbi1tZXNzYWdlXHRhcmdldFx0ZXN0LWNsYXNzZXN0ACdEOlxiYmJcYmJiLWNvbW1vbi1tZXNzYWdlXHNyY1x0ZXN0XGphdmE=
|
||||
2 -> rO0ABXNyABV4c2J0aS5hcGkuQ29tcGlsYXRpb27t+uDDauigQgIAAkoACXN0YXJ0VGltZVsAB291dHB1dHN0ABpbTHhzYnRpL2FwaS9PdXRwdXRTZXR0aW5nO3hwAAABUzbzjtV1cgAaW0x4c2J0aS5hcGkuT3V0cHV0U2V0dGluZzt/asLzp4elQgIAAHhwAAAAAnNyABd4c2J0aS5hcGkuT3V0cHV0U2V0dGluZ3rZmkd0+x17AgACTAAPb3V0cHV0RGlyZWN0b3J5dAASTGphdmEvbGFuZy9TdHJpbmc7TAAPc291cmNlRGlyZWN0b3J5cQB+AAZ4cHQALUQ6XGJiYlxiYmItY29tbW9uLW1lc3NhZ2VcdGFyZ2V0XHRlc3QtY2xhc3Nlc3QAKEQ6XGJiYlxiYmItY29tbW9uLW1lc3NhZ2Vcc3JjXHRlc3Rcc2NhbGFzcQB+AAV0AC1EOlxiYmJcYmJiLWNvbW1vbi1tZXNzYWdlXHRhcmdldFx0ZXN0LWNsYXNzZXN0ACdEOlxiYmJcYmJiLWNvbW1vbi1tZXNzYWdlXHNyY1x0ZXN0XGphdmE=
|
||||
3 -> rO0ABXNyABV4c2J0aS5hcGkuQ29tcGlsYXRpb27t+uDDauigQgIAAkoACXN0YXJ0VGltZVsAB291dHB1dHN0ABpbTHhzYnRpL2FwaS9PdXRwdXRTZXR0aW5nO3hwAAABUzb2Kqd1cgAaW0x4c2J0aS5hcGkuT3V0cHV0U2V0dGluZzt/asLzp4elQgIAAHhwAAAAAnNyABd4c2J0aS5hcGkuT3V0cHV0U2V0dGluZ3rZmkd0+x17AgACTAAPb3V0cHV0RGlyZWN0b3J5dAASTGphdmEvbGFuZy9TdHJpbmc7TAAPc291cmNlRGlyZWN0b3J5cQB+AAZ4cHQALUQ6XGJiYlxiYmItY29tbW9uLW1lc3NhZ2VcdGFyZ2V0XHRlc3QtY2xhc3Nlc3QAKEQ6XGJiYlxiYmItY29tbW9uLW1lc3NhZ2Vcc3JjXHRlc3Rcc2NhbGFzcQB+AAV0AC1EOlxiYmJcYmJiLWNvbW1vbi1tZXNzYWdlXHRhcmdldFx0ZXN0LWNsYXNzZXN0ACdEOlxiYmJcYmJiLWNvbW1vbi1tZXNzYWdlXHNyY1x0ZXN0XGphdmE=
|
||||
4 -> rO0ABXNyABV4c2J0aS5hcGkuQ29tcGlsYXRpb27t+uDDauigQgIAAkoACXN0YXJ0VGltZVsAB291dHB1dHN0ABpbTHhzYnRpL2FwaS9PdXRwdXRTZXR0aW5nO3hwAAABU2JpMJp1cgAaW0x4c2J0aS5hcGkuT3V0cHV0U2V0dGluZzt/asLzp4elQgIAAHhwAAAAAnNyABd4c2J0aS5hcGkuT3V0cHV0U2V0dGluZ3rZmkd0+x17AgACTAAPb3V0cHV0RGlyZWN0b3J5dAASTGphdmEvbGFuZy9TdHJpbmc7TAAPc291cmNlRGlyZWN0b3J5cQB+AAZ4cHQALUQ6XGJiYlxiYmItY29tbW9uLW1lc3NhZ2VcdGFyZ2V0XHRlc3QtY2xhc3Nlc3QAKEQ6XGJiYlxiYmItY29tbW9uLW1lc3NhZ2Vcc3JjXHRlc3Rcc2NhbGFzcQB+AAV0AC1EOlxiYmJcYmJiLWNvbW1vbi1tZXNzYWdlXHRhcmdldFx0ZXN0LWNsYXNzZXN0ACdEOlxiYmJcYmJiLWNvbW1vbi1tZXNzYWdlXHNyY1x0ZXN0XGphdmE=
|
||||
5 -> rO0ABXNyABV4c2J0aS5hcGkuQ29tcGlsYXRpb27t+uDDauigQgIAAkoACXN0YXJ0VGltZVsAB291dHB1dHN0ABpbTHhzYnRpL2FwaS9PdXRwdXRTZXR0aW5nO3hwAAABU3/ge511cgAaW0x4c2J0aS5hcGkuT3V0cHV0U2V0dGluZzt/asLzp4elQgIAAHhwAAAAAnNyABd4c2J0aS5hcGkuT3V0cHV0U2V0dGluZ3rZmkd0+x17AgACTAAPb3V0cHV0RGlyZWN0b3J5dAASTGphdmEvbGFuZy9TdHJpbmc7TAAPc291cmNlRGlyZWN0b3J5cQB+AAZ4cHQALUQ6XGJiYlxiYmItY29tbW9uLW1lc3NhZ2VcdGFyZ2V0XHRlc3QtY2xhc3Nlc3QAKEQ6XGJiYlxiYmItY29tbW9uLW1lc3NhZ2Vcc3JjXHRlc3Rcc2NhbGFzcQB+AAV0AC1EOlxiYmJcYmJiLWNvbW1vbi1tZXNzYWdlXHRhcmdldFx0ZXN0LWNsYXNzZXN0ACdEOlxiYmJcYmJiLWNvbW1vbi1tZXNzYWdlXHNyY1x0ZXN0XGphdmE=
|
@ -2,7 +2,7 @@ name := "bbb-common-message"
|
||||
|
||||
organization := "org.bigbluebutton"
|
||||
|
||||
version := "0.0.17-SNAPSHOT"
|
||||
version := "0.0.18-SNAPSHOT"
|
||||
|
||||
// We want to have our jar files in lib_managed dir.
|
||||
// This way we'll have the right path when we import
|
||||
@ -51,15 +51,13 @@ publishTo := Some(Resolver.file("file", new File(Path.userHome.absolutePath+"/.
|
||||
|
||||
// Comment this out when publishing to local maven repo using SNAPSHOT version.
|
||||
// To push to sonatype "sbt publishSigned"
|
||||
/*
|
||||
publishTo := {
|
||||
val nexus = "https://oss.sonatype.org/"
|
||||
if (isSnapshot.value)
|
||||
Some("snapshots" at nexus + "content/repositories/snapshots")
|
||||
else
|
||||
Some("releases" at nexus + "service/local/staging/deploy/maven2")
|
||||
}
|
||||
*/
|
||||
//publishTo := {
|
||||
// val nexus = "https://oss.sonatype.org/"
|
||||
// if (isSnapshot.value)
|
||||
// Some("snapshots" at nexus + "content/repositories/snapshots")
|
||||
// else
|
||||
// Some("releases" at nexus + "service/local/staging/deploy/maven2")
|
||||
//}
|
||||
|
||||
// Enables publishing to maven repo
|
||||
publishMavenStyle := true
|
||||
|
@ -32,7 +32,7 @@ public class FromJsonDecoder {
|
||||
StartCustomPollRequestMessage msg = gson.fromJson(message, StartCustomPollRequestMessage.class);
|
||||
return msg;
|
||||
} else {
|
||||
System.out.println("Unknown message name=[" + messageName + "]");
|
||||
// System.out.println("Unknown message name=[" + messageName + "]");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
@ -131,4 +131,11 @@ public class Constants {
|
||||
public static final String TEXT = "text";
|
||||
public static final String OWNER_ID = "owner_id";
|
||||
public static final String CAPTION_HISTORY = "caption_history";
|
||||
public static final String AVATAR_URL = "avatarURL";
|
||||
public static final String STUNS = "stuns";
|
||||
public static final String TURNS = "turns";
|
||||
public static final String USERNAME = "username";
|
||||
public static final String URL = "url";
|
||||
public static final String TTL = "ttl";
|
||||
public static final String PASSWORD = "password";
|
||||
}
|
||||
|
@ -0,0 +1,61 @@
|
||||
package org.bigbluebutton.common.messages;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
/**
|
||||
* Created by anton on 21/12/15.
|
||||
*/
|
||||
public class DeskShareGetInfoRequestMessage {
|
||||
public static final String GET_DESKTOP_SHARE_GET_INFO_REQUEST = "desktop_share_get_info_request";
|
||||
public static final String VERSION = "0.0.1";
|
||||
|
||||
public final String meetingId;
|
||||
public final String requesterId;
|
||||
public final String replyTo;
|
||||
|
||||
|
||||
public DeskShareGetInfoRequestMessage(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_DESKTOP_SHARE_GET_INFO_REQUEST, VERSION, null);
|
||||
|
||||
return MessageBuilder.buildJson(header, payload);
|
||||
}
|
||||
|
||||
public static DeskShareGetInfoRequestMessage 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_DESKTOP_SHARE_GET_INFO_REQUEST.equals(messageName)) {
|
||||
if (payload.has(Constants.MEETING_ID)
|
||||
&& payload.has(Constants.REPLY_TO)
|
||||
&& payload.has(Constants.REQUESTER_ID)) {
|
||||
String id = payload.get(Constants.MEETING_ID).getAsString();
|
||||
String requesterId = payload.get(Constants.REQUESTER_ID).getAsString();
|
||||
String replyTo = payload.get(Constants.REPLY_TO).getAsString();
|
||||
return new DeskShareGetInfoRequestMessage(id, requesterId, replyTo);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,68 @@
|
||||
package org.bigbluebutton.common.messages;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
/**
|
||||
* Created by anton on 07/01/16.
|
||||
*/
|
||||
|
||||
// akka-bbb-apps to akka-bbb-fsesl
|
||||
public class DeskShareHangUpEventMessage {
|
||||
public static final String DESKSHARE_HANG_UP_MESSAGE = "deskshare_hang_up_message";
|
||||
public static final String VERSION = "0.0.1";
|
||||
|
||||
public static final String CONFERENCE_NAME = "conference_name";
|
||||
public static final String FS_CONFERENCE_NAME = "fs_conference_name";
|
||||
public static final String TIMESTAMP = "timestamp";
|
||||
|
||||
public final String conferenceName;
|
||||
public final String timestamp;
|
||||
public final String fsConferenceName;
|
||||
|
||||
public DeskShareHangUpEventMessage(String conferenceName, String fsConferenceName, String timestamp) {
|
||||
this.conferenceName = conferenceName;
|
||||
this.fsConferenceName = fsConferenceName;
|
||||
this.timestamp = timestamp;
|
||||
}
|
||||
|
||||
public String toJson() {
|
||||
HashMap<String, Object> payload = new HashMap<String, Object>();
|
||||
payload.put(CONFERENCE_NAME, conferenceName);
|
||||
payload.put(FS_CONFERENCE_NAME, fsConferenceName);
|
||||
payload.put(TIMESTAMP, timestamp);
|
||||
|
||||
java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(DESKSHARE_HANG_UP_MESSAGE, VERSION, null);
|
||||
|
||||
return MessageBuilder.buildJson(header, payload);
|
||||
}
|
||||
|
||||
public static DeskShareHangUpEventMessage 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 (DESKSHARE_HANG_UP_MESSAGE.equals(messageName)) {
|
||||
if (payload.has(CONFERENCE_NAME)
|
||||
&& payload.has(FS_CONFERENCE_NAME)
|
||||
&& payload.has(TIMESTAMP)) {
|
||||
String conferenceName = payload.get(CONFERENCE_NAME).getAsString();
|
||||
String fsConferenceName = payload.get(FS_CONFERENCE_NAME).getAsString();
|
||||
String timestamp = payload.get(TIMESTAMP).getAsString();
|
||||
|
||||
return new DeskShareHangUpEventMessage(conferenceName, fsConferenceName, timestamp);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,93 @@
|
||||
package org.bigbluebutton.common.messages;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
//Message from bbb-akka-apps to bigbluebutton-apps (in red5)
|
||||
public class DeskShareNotifyASingleViewerEventMessage {
|
||||
|
||||
|
||||
|
||||
public static final String DESK_SHARE_NOTIFY_A_SINGLE_VIEWER = "desk_share_notify_a_single_viewer";
|
||||
public static final String VERSION = "0.0.1";
|
||||
|
||||
public static final String MEETING_ID = "meeting_id";
|
||||
public static final String USER_ID = "userid";
|
||||
public static final String STREAM_PATH = "stream_path";
|
||||
public static final String BROADCASTING = "broadcasting";
|
||||
public static final String TIMESTAMP = "timestamp";
|
||||
public static final String VIDEO_WIDTH = "vw";
|
||||
public static final String VIDEO_HEIGHT = "vh";
|
||||
|
||||
public final String meetingId;
|
||||
public final String userId;
|
||||
public final String streamPath;
|
||||
public final boolean broadcasting;
|
||||
public final String timestamp;
|
||||
public final int vw;
|
||||
public final int vh;
|
||||
|
||||
public DeskShareNotifyASingleViewerEventMessage(String meetingId, String userId, String streamPath,
|
||||
boolean broadcasting, int vw, int vh, String timestamp) {
|
||||
this.meetingId = meetingId;
|
||||
this.userId=userId;
|
||||
this.streamPath = streamPath;
|
||||
this.broadcasting = broadcasting;
|
||||
this.timestamp = timestamp;
|
||||
this.vw = vw;
|
||||
this.vh = vh;
|
||||
}
|
||||
|
||||
public String toJson() {
|
||||
HashMap<String, Object> payload = new HashMap<String, Object>();
|
||||
payload.put(MEETING_ID, meetingId);
|
||||
payload.put(USER_ID, userId);
|
||||
payload.put(STREAM_PATH, streamPath);
|
||||
payload.put(BROADCASTING, broadcasting);
|
||||
payload.put(TIMESTAMP, timestamp);
|
||||
payload.put(VIDEO_HEIGHT, vh);
|
||||
payload.put(VIDEO_WIDTH, vw);
|
||||
|
||||
java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(DESK_SHARE_NOTIFY_A_SINGLE_VIEWER, VERSION, null);
|
||||
|
||||
return MessageBuilder.buildJson(header, payload);
|
||||
}
|
||||
|
||||
public static DeskShareNotifyASingleViewerEventMessage 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 (DESK_SHARE_NOTIFY_A_SINGLE_VIEWER.equals(messageName)) {
|
||||
if (payload.has(MEETING_ID)
|
||||
&& payload.has(USER_ID)
|
||||
&& payload.has(BROADCASTING)
|
||||
&& payload.has(TIMESTAMP)
|
||||
&& payload.has(VIDEO_HEIGHT)
|
||||
&& payload.has(VIDEO_WIDTH)
|
||||
&& payload.has(STREAM_PATH)) {
|
||||
String meetingId = payload.get(MEETING_ID).getAsString();
|
||||
String userId = payload.get(USER_ID).getAsString();
|
||||
String streamPath = payload.get(STREAM_PATH).getAsString();
|
||||
boolean broadcasting = payload.get(BROADCASTING).getAsBoolean();
|
||||
String timestamp = payload.get(TIMESTAMP).getAsString();
|
||||
int vh = payload.get(VIDEO_HEIGHT).getAsInt();
|
||||
int vw = payload.get(VIDEO_WIDTH).getAsInt();
|
||||
|
||||
return new DeskShareNotifyASingleViewerEventMessage(meetingId, userId, streamPath,
|
||||
broadcasting, vw, vh, timestamp);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,83 @@
|
||||
package org.bigbluebutton.common.messages;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
|
||||
//Message from bbb-akka-apps to bbb-apps-red5
|
||||
public class DeskShareNotifyViewersRTMPEventMessage {
|
||||
public static final String DESK_SHARE_NOTIFY_VIEWERS_RTMP = "desk_share_notify_viewers_rtmp";
|
||||
public static final String VERSION = "0.0.1";
|
||||
|
||||
public static final String MEETING_ID = "meeting_id";
|
||||
public static final String STREAM_PATH = "stream_path";
|
||||
public static final String BROADCASTING = "broadcasting";
|
||||
public static final String VIDEO_WIDTH = "vw";
|
||||
public static final String VIDEO_HEIGHT = "vh";
|
||||
|
||||
public static final String TIMESTAMP = "timestamp";
|
||||
public final String meetingId;
|
||||
public final String streamPath;
|
||||
public final boolean broadcasting;
|
||||
public final String timestamp;
|
||||
public final int vw;
|
||||
public final int vh;
|
||||
|
||||
public DeskShareNotifyViewersRTMPEventMessage(String meetingId, String streamPath,
|
||||
boolean broadcasting, int vw, int vh, String timestamp) {
|
||||
this.meetingId = meetingId;
|
||||
this.streamPath = streamPath;
|
||||
this.broadcasting = broadcasting;
|
||||
this.timestamp = timestamp;
|
||||
this.vw = vw;
|
||||
this.vh = vh;
|
||||
}
|
||||
|
||||
public String toJson() {
|
||||
HashMap<String, Object> payload = new HashMap<String, Object>();
|
||||
payload.put(MEETING_ID, meetingId);
|
||||
payload.put(STREAM_PATH, streamPath);
|
||||
payload.put(BROADCASTING, broadcasting);
|
||||
payload.put(TIMESTAMP, timestamp);
|
||||
payload.put(VIDEO_HEIGHT, vh);
|
||||
payload.put(VIDEO_WIDTH, vw);
|
||||
|
||||
java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(DESK_SHARE_NOTIFY_VIEWERS_RTMP, VERSION, null);
|
||||
|
||||
return MessageBuilder.buildJson(header, payload);
|
||||
}
|
||||
|
||||
public static DeskShareNotifyViewersRTMPEventMessage 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 (DESK_SHARE_NOTIFY_VIEWERS_RTMP.equals(messageName)) {
|
||||
if (payload.has(MEETING_ID)
|
||||
&& payload.has(BROADCASTING)
|
||||
&& payload.has(TIMESTAMP)
|
||||
&& payload.has(VIDEO_HEIGHT)
|
||||
&& payload.has(VIDEO_WIDTH)
|
||||
&& payload.has(STREAM_PATH)) {
|
||||
String meetingId = payload.get(MEETING_ID).getAsString();
|
||||
String streamPath = payload.get(STREAM_PATH).getAsString();
|
||||
boolean broadcasting = payload.get(BROADCASTING).getAsBoolean();
|
||||
String timestamp = payload.get(TIMESTAMP).getAsString();
|
||||
int vh = payload.get(VIDEO_HEIGHT).getAsInt();
|
||||
int vw = payload.get(VIDEO_WIDTH).getAsInt();
|
||||
|
||||
return new DeskShareNotifyViewersRTMPEventMessage(meetingId, streamPath, broadcasting, vw, vh, timestamp);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,75 @@
|
||||
package org.bigbluebutton.common.messages;
|
||||
|
||||
import java.util.HashMap;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
|
||||
|
||||
public class DeskShareRTMPBroadcastStartedEventMessage {
|
||||
public static final String DESKSHARE_RTMP_BROADCAST_STARTED_MESSAGE = "deskshare_rtmp_broadcast_started_message";
|
||||
public static final String VERSION = "0.0.1";
|
||||
|
||||
public static final String CONFERENCE_NAME = "conference_name";
|
||||
public static final String STREAMNAME = "streamname";
|
||||
public static final String TIMESTAMP = "timestamp";
|
||||
public static final String VIDEO_WIDTH = "vw";
|
||||
public static final String VIDEO_HEIGHT = "vh";
|
||||
|
||||
public final String conferenceName;
|
||||
public final String streamname;
|
||||
public final String timestamp;
|
||||
public final int vw;
|
||||
public final int vh;
|
||||
|
||||
public DeskShareRTMPBroadcastStartedEventMessage(String conferenceName, String streamname, int vw, int vh, String timestamp) {
|
||||
this.conferenceName = conferenceName;
|
||||
this.streamname = streamname;
|
||||
this.timestamp = timestamp;
|
||||
this.vw = vw;
|
||||
this.vh = vh;
|
||||
}
|
||||
|
||||
public String toJson() {
|
||||
HashMap<String, Object> payload = new HashMap<String, Object>();
|
||||
payload.put(CONFERENCE_NAME, conferenceName);
|
||||
payload.put(STREAMNAME, streamname);
|
||||
payload.put(TIMESTAMP, timestamp);
|
||||
payload.put(VIDEO_HEIGHT, vh);
|
||||
payload.put(VIDEO_WIDTH, vw);
|
||||
|
||||
java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(DESKSHARE_RTMP_BROADCAST_STARTED_MESSAGE, VERSION, null);
|
||||
|
||||
return MessageBuilder.buildJson(header, payload);
|
||||
}
|
||||
|
||||
public static DeskShareRTMPBroadcastStartedEventMessage 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 (DESKSHARE_RTMP_BROADCAST_STARTED_MESSAGE.equals(messageName)) {
|
||||
if (payload.has(CONFERENCE_NAME)
|
||||
&& payload.has(TIMESTAMP)
|
||||
&& payload.has(VIDEO_HEIGHT)
|
||||
&& payload.has(VIDEO_WIDTH)
|
||||
&& payload.has(STREAMNAME)) {
|
||||
String conferenceName = payload.get(CONFERENCE_NAME).getAsString();
|
||||
String streamname = payload.get(STREAMNAME).getAsString();
|
||||
String timestamp = payload.get(TIMESTAMP).getAsString();
|
||||
int vh = payload.get(VIDEO_HEIGHT).getAsInt();
|
||||
int vw = payload.get(VIDEO_WIDTH).getAsInt();
|
||||
|
||||
return new DeskShareRTMPBroadcastStartedEventMessage(conferenceName, streamname, vw, vh, timestamp);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,76 @@
|
||||
package org.bigbluebutton.common.messages;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
|
||||
|
||||
public class DeskShareRTMPBroadcastStoppedEventMessage {
|
||||
public static final String DESKSHARE_RTMP_BROADCAST_STOPPED_MESSAGE = "deskshare_rtmp_broadcast_stopped_message";
|
||||
public static final String VERSION = "0.0.1";
|
||||
|
||||
public static final String CONFERENCE_NAME = "conference_name";
|
||||
public static final String STREAMNAME = "streamname";
|
||||
public static final String TIMESTAMP = "timestamp";
|
||||
public static final String VIDEO_WIDTH = "vw";
|
||||
public static final String VIDEO_HEIGHT = "vh";
|
||||
|
||||
public final String conferenceName;
|
||||
public final String streamname;
|
||||
public final String timestamp;
|
||||
public final int vw;
|
||||
public final int vh;
|
||||
|
||||
public DeskShareRTMPBroadcastStoppedEventMessage(String conferenceName, String streamname, int vw, int vh, String timestamp) {
|
||||
this.conferenceName = conferenceName;
|
||||
this.streamname = streamname;
|
||||
this.timestamp = timestamp;
|
||||
this.vw = vw;
|
||||
this.vh = vh;
|
||||
}
|
||||
|
||||
public String toJson() {
|
||||
HashMap<String, Object> payload = new HashMap<String, Object>();
|
||||
payload.put(CONFERENCE_NAME, conferenceName);
|
||||
payload.put(STREAMNAME, streamname);
|
||||
payload.put(TIMESTAMP, timestamp);
|
||||
payload.put(VIDEO_HEIGHT, vh);
|
||||
payload.put(VIDEO_WIDTH, vw);
|
||||
|
||||
java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(DESKSHARE_RTMP_BROADCAST_STOPPED_MESSAGE, VERSION, null);
|
||||
|
||||
return MessageBuilder.buildJson(header, payload);
|
||||
}
|
||||
|
||||
public static DeskShareRTMPBroadcastStoppedEventMessage 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 (DESKSHARE_RTMP_BROADCAST_STOPPED_MESSAGE.equals(messageName)) {
|
||||
if (payload.has(CONFERENCE_NAME)
|
||||
&& payload.has(TIMESTAMP)
|
||||
&& payload.has(VIDEO_HEIGHT)
|
||||
&& payload.has(VIDEO_WIDTH)
|
||||
&& payload.has(STREAMNAME)) {
|
||||
String conferenceName = payload.get(CONFERENCE_NAME).getAsString();
|
||||
String streamname = payload.get(STREAMNAME).getAsString();
|
||||
String timestamp = payload.get(TIMESTAMP).getAsString();
|
||||
int vh = payload.get(VIDEO_HEIGHT).getAsInt();
|
||||
int vw = payload.get(VIDEO_WIDTH).getAsInt();
|
||||
|
||||
return new DeskShareRTMPBroadcastStoppedEventMessage(conferenceName, streamname, vw, vh, timestamp);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,63 @@
|
||||
package org.bigbluebutton.common.messages;
|
||||
|
||||
import java.util.HashMap;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
|
||||
|
||||
public class DeskShareStartRTMPBroadcastEventMessage {
|
||||
public static final String DESKSHARE_START_RTMP_BROADCAST_MESSAGE = "deskshare_start_rtmp_broadcast_message";
|
||||
public static final String VERSION = "0.0.1";
|
||||
|
||||
public static final String CONFERENCE_NAME = "conference_name";
|
||||
public static final String STREAMURL = "stream_url";
|
||||
public static final String TIMESTAMP = "timestamp";
|
||||
|
||||
public final String conferenceName;
|
||||
public final String streamUrl;
|
||||
public final String timestamp;
|
||||
|
||||
public DeskShareStartRTMPBroadcastEventMessage(String conferenceName, String streamUrl, String timestamp) {
|
||||
this.conferenceName = conferenceName;
|
||||
this.streamUrl = streamUrl;
|
||||
this.timestamp = timestamp;
|
||||
}
|
||||
|
||||
public String toJson() {
|
||||
HashMap<String, Object> payload = new HashMap<String, Object>();
|
||||
payload.put(CONFERENCE_NAME, conferenceName);
|
||||
payload.put(STREAMURL, streamUrl);
|
||||
payload.put(TIMESTAMP, timestamp);
|
||||
|
||||
java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(DESKSHARE_START_RTMP_BROADCAST_MESSAGE, VERSION, null);
|
||||
|
||||
return MessageBuilder.buildJson(header, payload);
|
||||
}
|
||||
|
||||
public static DeskShareStartRTMPBroadcastEventMessage 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 (DESKSHARE_START_RTMP_BROADCAST_MESSAGE.equals(messageName)) {
|
||||
if (payload.has(CONFERENCE_NAME)
|
||||
&& payload.has(TIMESTAMP)
|
||||
&& payload.has(STREAMURL)) {
|
||||
String conferenceName = payload.get(CONFERENCE_NAME).getAsString();
|
||||
String streamUrl = payload.get(STREAMURL).getAsString();
|
||||
String timestamp = payload.get(TIMESTAMP).getAsString();
|
||||
|
||||
return new DeskShareStartRTMPBroadcastEventMessage(conferenceName, streamUrl, timestamp);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,63 @@
|
||||
package org.bigbluebutton.common.messages;
|
||||
|
||||
import java.util.HashMap;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
|
||||
//Message from FreeSwitch to bbb-akka-apps
|
||||
public class DeskShareStartedEventMessage {
|
||||
public static final String DESKSHARE_STARTED_MESSAGE = "deskshare_start_message";
|
||||
public static final String VERSION = "0.0.1";
|
||||
|
||||
public static final String CONFERENCE_NAME = "conference_name";
|
||||
public static final String CALLER_ID = "caller_id";
|
||||
public static final String CALLER_ID_NAME = "caller_id_name";
|
||||
|
||||
public final String conferenceName;
|
||||
public final String callerId;
|
||||
public final String callerIdName;
|
||||
|
||||
public DeskShareStartedEventMessage(String conferenceName, String callerId, String callerIdName) {
|
||||
this.conferenceName = conferenceName;
|
||||
this.callerId = callerId;
|
||||
this.callerIdName = callerIdName;
|
||||
}
|
||||
|
||||
public String toJson() {
|
||||
HashMap<String, Object> payload = new HashMap<String, Object>();
|
||||
payload.put(CONFERENCE_NAME, conferenceName);
|
||||
payload.put(CALLER_ID_NAME, callerIdName);
|
||||
payload.put(CALLER_ID, callerId);
|
||||
|
||||
java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(DESKSHARE_STARTED_MESSAGE, VERSION, null);
|
||||
|
||||
return MessageBuilder.buildJson(header, payload);
|
||||
}
|
||||
|
||||
public static DeskShareStartedEventMessage 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 (DESKSHARE_STARTED_MESSAGE.equals(messageName)) {
|
||||
if (payload.has(CONFERENCE_NAME)
|
||||
&& payload.has(CALLER_ID)
|
||||
&& payload.has(CALLER_ID_NAME)) {
|
||||
String conferenceName = payload.get(CONFERENCE_NAME).getAsString();
|
||||
String callerId = payload.get(CALLER_ID_NAME).getAsString();
|
||||
String callerIdName = payload.get(CALLER_ID_NAME).getAsString();
|
||||
|
||||
return new DeskShareStartedEventMessage(conferenceName, callerId, callerIdName);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,63 @@
|
||||
package org.bigbluebutton.common.messages;
|
||||
|
||||
import java.util.HashMap;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
|
||||
|
||||
public class DeskShareStopRTMPBroadcastEventMessage {
|
||||
public static final String DESKSHARE_STOP_RTMP_BROADCAST_MESSAGE = "deskshare_stop_rtmp_broadcast_message";
|
||||
public static final String VERSION = "0.0.1";
|
||||
|
||||
public static final String CONFERENCE_NAME = "conference_name";
|
||||
public static final String STREAMURL = "stream_url";
|
||||
public static final String TIMESTAMP = "timestamp";
|
||||
|
||||
public final String conferenceName;
|
||||
public final String streamUrl;
|
||||
public final String timestamp;
|
||||
|
||||
public DeskShareStopRTMPBroadcastEventMessage(String conferenceName, String streamUrl, String timestamp) {
|
||||
this.conferenceName = conferenceName;
|
||||
this.streamUrl = streamUrl;
|
||||
this.timestamp = timestamp;
|
||||
}
|
||||
|
||||
public String toJson() {
|
||||
HashMap<String, Object> payload = new HashMap<String, Object>();
|
||||
payload.put(CONFERENCE_NAME, conferenceName);
|
||||
payload.put(STREAMURL, streamUrl);
|
||||
payload.put(TIMESTAMP, timestamp);
|
||||
|
||||
java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(DESKSHARE_STOP_RTMP_BROADCAST_MESSAGE, VERSION, null);
|
||||
|
||||
return MessageBuilder.buildJson(header, payload);
|
||||
}
|
||||
|
||||
public static DeskShareStopRTMPBroadcastEventMessage 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 (DESKSHARE_STOP_RTMP_BROADCAST_MESSAGE.equals(messageName)) {
|
||||
if (payload.has(CONFERENCE_NAME)
|
||||
&& payload.has(TIMESTAMP)
|
||||
&& payload.has(STREAMURL)) {
|
||||
String conferenceName = payload.get(CONFERENCE_NAME).getAsString();
|
||||
String streamUrl = payload.get(STREAMURL).getAsString();
|
||||
String timestamp = payload.get(TIMESTAMP).getAsString();
|
||||
|
||||
return new DeskShareStopRTMPBroadcastEventMessage(conferenceName, streamUrl, timestamp);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,63 @@
|
||||
package org.bigbluebutton.common.messages;
|
||||
|
||||
import java.util.HashMap;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
|
||||
//Message from FreeSwitch to bbb-akka-apps
|
||||
public class DeskShareStoppedEventMessage {
|
||||
public static final String DESK_SHARE_STOPPED_MESSAGE = "desk_share_stopped_message";
|
||||
public static final String VERSION = "0.0.1";
|
||||
|
||||
public static final String CONFERENCE_NAME = "conference_name";
|
||||
public static final String CALLER_ID = "caller_id";
|
||||
public static final String CALLER_ID_NAME = "caller_id_name";
|
||||
|
||||
public final String conferenceName;
|
||||
public final String callerId;
|
||||
public final String callerIdName;
|
||||
|
||||
public DeskShareStoppedEventMessage(String conferenceName, String callerId, String callerIdName) {
|
||||
this.conferenceName = conferenceName;
|
||||
this.callerId = callerId;
|
||||
this.callerIdName = callerIdName;
|
||||
}
|
||||
|
||||
public String toJson() {
|
||||
HashMap<String, Object> payload = new HashMap<String, Object>();
|
||||
payload.put(CONFERENCE_NAME, conferenceName);
|
||||
payload.put(CALLER_ID_NAME, callerIdName);
|
||||
payload.put(CALLER_ID, callerId);
|
||||
|
||||
java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(DESK_SHARE_STOPPED_MESSAGE, VERSION, null);
|
||||
|
||||
return MessageBuilder.buildJson(header, payload);
|
||||
}
|
||||
|
||||
public static DeskShareStoppedEventMessage 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 (DESK_SHARE_STOPPED_MESSAGE.equals(messageName)) {
|
||||
if (payload.has(CONFERENCE_NAME)
|
||||
&& payload.has(CALLER_ID)
|
||||
&& payload.has(CALLER_ID_NAME)) {
|
||||
String conferenceName = payload.get(CONFERENCE_NAME).getAsString();
|
||||
String callerId = payload.get(CALLER_ID_NAME).getAsString();
|
||||
String callerIdName = payload.get(CALLER_ID_NAME).getAsString();
|
||||
|
||||
return new DeskShareStoppedEventMessage(conferenceName, callerId, callerIdName);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
|
||||
}
|
||||
}
|
@ -30,6 +30,7 @@ public class MessagingConstants {
|
||||
public static final String FROM_CHAT_CHANNEL = FROM_BBB_APPS_CHANNEL + ":chat";
|
||||
public static final String FROM_WHITEBOARD_CHANNEL = FROM_BBB_APPS_CHANNEL + ":whiteboard";
|
||||
public static final String FROM_CAPTION_CHANNEL = FROM_BBB_APPS_CHANNEL + ":caption";
|
||||
public static final String FROM_DESK_SHARE_CHANNEL = FROM_BBB_APPS_CHANNEL + ":deskshare";
|
||||
|
||||
public static final String TO_BBB_APPS_CHANNEL = "bigbluebutton:to-bbb-apps";
|
||||
public static final String TO_BBB_APPS_PATTERN = TO_BBB_APPS_CHANNEL + ":*";
|
||||
@ -44,7 +45,9 @@ public class MessagingConstants {
|
||||
public static final String TO_CAPTION_CHANNEL = TO_BBB_APPS_CHANNEL + ":caption";
|
||||
|
||||
public static final String BBB_APPS_KEEP_ALIVE_CHANNEL = "bigbluebutton:from-bbb-apps:keepalive";
|
||||
|
||||
|
||||
public static final String TO_BBB_HTML5_CHANNEL = "bigbluebutton:to-bbb-html5";
|
||||
|
||||
public static final String TO_VOICE_CONF_CHANNEL = "bigbluebutton:to-voice-conf";
|
||||
public static final String TO_VOICE_CONF_PATTERN = TO_VOICE_CONF_CHANNEL + ":*";
|
||||
public static final String TO_VOICE_CONF_SYSTEM_CHAN = TO_VOICE_CONF_CHANNEL + ":system";
|
||||
|
@ -14,14 +14,16 @@ public class RegisterUserMessage implements IBigBlueButtonMessage {
|
||||
public final String role;
|
||||
public final String externUserID;
|
||||
public final String authToken;
|
||||
public final String avatarURL;
|
||||
|
||||
public RegisterUserMessage(String meetingID, String internalUserId, String fullname, String role, String externUserID, String authToken) {
|
||||
public RegisterUserMessage(String meetingID, String internalUserId, String fullname, String role, String externUserID, String authToken, String avatarURL) {
|
||||
this.meetingID = meetingID;
|
||||
this.internalUserId = internalUserId;
|
||||
this.fullname = fullname;
|
||||
this.role = role;
|
||||
this.externUserID = externUserID;
|
||||
this.authToken = authToken;
|
||||
this.avatarURL = avatarURL;
|
||||
}
|
||||
|
||||
public String toJson() {
|
||||
@ -33,6 +35,7 @@ public class RegisterUserMessage implements IBigBlueButtonMessage {
|
||||
payload.put(Constants.ROLE, role);
|
||||
payload.put(Constants.EXT_USER_ID, externUserID);
|
||||
payload.put(Constants.AUTH_TOKEN, authToken);
|
||||
payload.put(Constants.AVATAR_URL, avatarURL);
|
||||
|
||||
java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(REGISTER_USER, VERSION, null);
|
||||
|
||||
@ -60,9 +63,10 @@ public class RegisterUserMessage implements IBigBlueButtonMessage {
|
||||
String role = payload.get(Constants.ROLE).getAsString();
|
||||
String externUserID = payload.get(Constants.EXT_USER_ID).getAsString();
|
||||
String authToken = payload.get(Constants.AUTH_TOKEN).getAsString();
|
||||
String avatarURL = payload.get(Constants.AVATAR_URL).getAsString();
|
||||
|
||||
//use externalUserId twice - once for external, once for internal
|
||||
return new RegisterUserMessage(meetingID, externUserID, fullname, role, externUserID, authToken);
|
||||
return new RegisterUserMessage(meetingID, externUserID, fullname, role, externUserID, authToken, avatarURL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,74 @@
|
||||
package org.bigbluebutton.common.messages;
|
||||
|
||||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class SendStunTurnInfoReplyMessage {
|
||||
public static final String SEND_STUN_TURN_INFO_REPLY_MESSAGE = "send_stun_turn_info_reply_message";
|
||||
public static final String VERSION = "0.0.1";
|
||||
|
||||
public final String meetingId;
|
||||
public final String requesterId;
|
||||
public final ArrayList<String> stuns;
|
||||
public final ArrayList<Map<String, Object>> turns;
|
||||
|
||||
public SendStunTurnInfoReplyMessage(String meetingId, String requesterId, ArrayList<String> stuns,
|
||||
ArrayList<Map<String, Object>> turns) {
|
||||
this.meetingId = meetingId;
|
||||
this.requesterId = requesterId;
|
||||
this.stuns = stuns;
|
||||
this.turns = turns;
|
||||
}
|
||||
|
||||
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.STUNS, stuns);
|
||||
payload.put(Constants.TURNS, turns);
|
||||
|
||||
java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(SEND_STUN_TURN_INFO_REPLY_MESSAGE, VERSION, null);
|
||||
|
||||
return MessageBuilder.buildJson(header, payload);
|
||||
}
|
||||
|
||||
public static SendStunTurnInfoReplyMessage 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_STUN_TURN_INFO_REPLY_MESSAGE.equals(messageName)) {
|
||||
if (payload.has(Constants.MEETING_ID)
|
||||
&& payload.has(Constants.STUNS)
|
||||
&& payload.has(Constants.TURNS)
|
||||
&& payload.has(Constants.REQUESTER_ID)) {
|
||||
String meetingId = payload.get(Constants.MEETING_ID).getAsString();
|
||||
String requesterId = payload.get(Constants.REQUESTER_ID).getAsString();
|
||||
|
||||
Util util = new Util();
|
||||
JsonArray stunsArray = (JsonArray) payload.get(Constants.STUNS);
|
||||
ArrayList<String> stunsArrayList = util.extractStuns(stunsArray);
|
||||
|
||||
JsonArray turnsArray = (JsonArray) payload.get(Constants.TURNS);
|
||||
ArrayList<Map<String, Object>> turnsArrayList = util.extractTurns(turnsArray);
|
||||
|
||||
return new SendStunTurnInfoReplyMessage(meetingId, requesterId, stunsArrayList, turnsArrayList);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,58 @@
|
||||
package org.bigbluebutton.common.messages;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
/**
|
||||
* Created by anton on 05/02/16.
|
||||
*/
|
||||
public class SendStunTurnInfoRequestMessage {
|
||||
public static final String SEND_STUN_TURN_INFO_REQUEST_MESSAGE = "send_stun_turn_info_request_message";
|
||||
public static final String VERSION = "0.0.1";
|
||||
|
||||
public final String meetingId;
|
||||
public final String requesterId;
|
||||
|
||||
|
||||
public SendStunTurnInfoRequestMessage(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(SEND_STUN_TURN_INFO_REQUEST_MESSAGE, VERSION, null);
|
||||
|
||||
return MessageBuilder.buildJson(header, payload);
|
||||
}
|
||||
|
||||
public static SendStunTurnInfoRequestMessage 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_STUN_TURN_INFO_REQUEST_MESSAGE.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 SendStunTurnInfoRequestMessage(meetingId, requesterId);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -16,6 +16,7 @@ public class UserJoinedVoiceConfMessage {
|
||||
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;
|
||||
@ -24,9 +25,10 @@ public class UserJoinedVoiceConfMessage {
|
||||
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 callerIdName, String callerIdNum, Boolean muted, Boolean talking, String avatarURL) {
|
||||
this.voiceConfId = voiceConfId;
|
||||
this.voiceUserId = voiceUserId;
|
||||
this.userId = userId;
|
||||
@ -34,6 +36,7 @@ public class UserJoinedVoiceConfMessage {
|
||||
this.callerIdNum = callerIdNum;
|
||||
this.muted = muted;
|
||||
this.talking = talking;
|
||||
this.avatarURL = avatarURL;
|
||||
}
|
||||
|
||||
public String toJson() {
|
||||
@ -45,6 +48,7 @@ public class UserJoinedVoiceConfMessage {
|
||||
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);
|
||||
|
||||
@ -76,7 +80,8 @@ public class UserJoinedVoiceConfMessage {
|
||||
String callerIdNum = payload.get(CALLER_ID_NUM).getAsString();
|
||||
Boolean muted = payload.get(MUTED).getAsBoolean();
|
||||
Boolean talking = payload.get(TALKING).getAsBoolean();
|
||||
return new UserJoinedVoiceConfMessage(voiceConfId, voiceUserId, userId, callerIdName, callerIdNum, muted, talking);
|
||||
String avatarURL = payload.get(AVATAR_URL).getAsString();
|
||||
return new UserJoinedVoiceConfMessage(voiceConfId, voiceUserId, userId, callerIdName, callerIdNum, muted, talking, avatarURL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -88,6 +88,7 @@ public class Util {
|
||||
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();
|
||||
|
||||
JsonArray webcamStreamJArray = user.get(Constants.WEBCAM_STREAM).getAsJsonArray();
|
||||
ArrayList<String> webcamStreams = extractWebcamStreams(webcamStreamJArray);
|
||||
@ -103,6 +104,7 @@ public class Util {
|
||||
userMap.put("locked", locked);
|
||||
userMap.put("role", role);
|
||||
userMap.put("presenter", presenter);
|
||||
userMap.put("avatarURL", avatarURL);
|
||||
|
||||
JsonObject vu = (JsonObject) user.get(Constants.VOICEUSER);
|
||||
|
||||
@ -117,6 +119,52 @@ public class Util {
|
||||
|
||||
}
|
||||
|
||||
|
||||
public ArrayList<String> extractStuns(JsonArray stunsArray) {
|
||||
ArrayList<String> collection = new ArrayList<String>();
|
||||
Iterator<JsonElement> stunIter = stunsArray.iterator();
|
||||
while (stunIter.hasNext()) {
|
||||
JsonElement aStun = stunIter.next();
|
||||
if (aStun != null) {
|
||||
collection.add(aStun.getAsString());
|
||||
}
|
||||
}
|
||||
|
||||
return collection;
|
||||
}
|
||||
|
||||
|
||||
public ArrayList<Map<String, Object>> extractTurns(JsonArray turnsArray) {
|
||||
ArrayList<Map<String, Object>> collection = new ArrayList<Map<String, Object>>();
|
||||
Iterator<JsonElement> turnIter = turnsArray.iterator();
|
||||
while (turnIter.hasNext()){
|
||||
JsonElement aTurn = turnIter.next();
|
||||
Map<String, Object> turnMap = extractATurn((JsonObject)aTurn);
|
||||
if (turnMap != null) {
|
||||
collection.add(turnMap);
|
||||
}
|
||||
}
|
||||
return collection;
|
||||
}
|
||||
|
||||
private Map<String,Object> extractATurn(JsonObject aTurn) {
|
||||
if (aTurn.has(Constants.USERNAME)
|
||||
&& aTurn.has(Constants.TTL)
|
||||
&& aTurn.has(Constants.URL)
|
||||
&& aTurn.has(Constants.PASSWORD)) {
|
||||
|
||||
Map<String, Object> turnMap = new HashMap<String, Object>();
|
||||
|
||||
turnMap.put(Constants.USERNAME, aTurn.get(Constants.USERNAME).getAsString());
|
||||
turnMap.put(Constants.URL, aTurn.get(Constants.URL).getAsString());
|
||||
turnMap.put(Constants.PASSWORD, aTurn.get(Constants.PASSWORD).getAsString());
|
||||
turnMap.put(Constants.TTL, aTurn.get(Constants.TTL).getAsInt());
|
||||
|
||||
return turnMap;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public ArrayList<Map<String, Object>> extractChatHistory(JsonArray history) {
|
||||
ArrayList<Map<String, Object>> collection = new ArrayList<Map<String, Object>>();
|
||||
Iterator<JsonElement> historyIter = history.iterator();
|
||||
@ -161,7 +209,7 @@ public class Util {
|
||||
|
||||
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();
|
||||
@ -170,39 +218,39 @@ public class Util {
|
||||
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)
|
||||
@ -298,11 +346,11 @@ public class Util {
|
||||
}
|
||||
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();
|
||||
@ -311,41 +359,41 @@ public class Util {
|
||||
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")
|
||||
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);
|
||||
@ -357,7 +405,7 @@ public class Util {
|
||||
page.put("yOffset", yOffset);
|
||||
page.put("widthRatio", widthRatio);
|
||||
page.put("heightRatio", heightRatio);
|
||||
|
||||
|
||||
pages.add(page);
|
||||
}
|
||||
}
|
||||
@ -366,7 +414,7 @@ public class Util {
|
||||
|
||||
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();
|
||||
@ -376,7 +424,7 @@ public class Util {
|
||||
}
|
||||
|
||||
public Map<String, Object> extractPresentation(JsonObject presObj) {
|
||||
if (presObj.has(Constants.ID) && presObj.has(Constants.NAME)
|
||||
if (presObj.has(Constants.ID) && presObj.has(Constants.NAME)
|
||||
&& presObj.has(Constants.CURRENT) && presObj.has(Constants.PAGES)) {
|
||||
Map<String, Object> pres = new HashMap<String, Object>();
|
||||
|
||||
@ -391,7 +439,7 @@ public class Util {
|
||||
JsonArray pagesJsonArray = presObj.get(Constants.PAGES).getAsJsonArray();
|
||||
|
||||
ArrayList<Map<String, Object>> pages = extractPresentationPages(pagesJsonArray);
|
||||
// store the pages in the presentation
|
||||
// store the pages in the presentation
|
||||
pres.put(Constants.PAGES, pages);
|
||||
|
||||
// add this presentation into our presentations list
|
||||
@ -415,20 +463,20 @@ public class Util {
|
||||
}
|
||||
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();
|
||||
|
||||
@ -441,10 +489,10 @@ public class Util {
|
||||
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();
|
||||
@ -455,13 +503,13 @@ public class Util {
|
||||
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;
|
||||
@ -486,13 +534,13 @@ public class Util {
|
||||
|
||||
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);
|
||||
}
|
||||
@ -580,30 +628,30 @@ public class Util {
|
||||
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);
|
||||
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();
|
||||
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();
|
||||
@ -614,12 +662,12 @@ public class Util {
|
||||
collection.add(answerMap);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
pollMap.put(Constants.ID, id);
|
||||
pollMap.put(ANSWERS, collection);
|
||||
pollMap.put(ANSWERS, collection);
|
||||
}
|
||||
|
||||
|
||||
|
||||
return pollMap;
|
||||
}
|
||||
|
||||
@ -629,27 +677,26 @@ public class Util {
|
||||
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(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();
|
||||
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();
|
||||
@ -660,14 +707,14 @@ public class Util {
|
||||
collection.add(answerMap);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
pollMap.put(Constants.ID, id);
|
||||
pollMap.put(NUM_RESPONDENTS, numRespondents);
|
||||
pollMap.put(NUM_RESPONDERS, numResponders);
|
||||
pollMap.put(ANSWERS, collection);
|
||||
pollMap.put(ANSWERS, collection);
|
||||
}
|
||||
|
||||
|
||||
|
||||
return pollMap;
|
||||
}
|
||||
|
||||
@ -693,4 +740,4 @@ public class Util {
|
||||
return collection;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1,17 +1,14 @@
|
||||
package org.bigbluebutton.core.service.whiteboard;
|
||||
package org.bigbluebutton.common.messages;
|
||||
|
||||
public class WhiteboardKeyUtil {
|
||||
|
||||
public static final String TEXT_TYPE = "text";
|
||||
public static final String PENCIL_TYPE = "pencil";
|
||||
public static final String RECTANGLE_TYPE = "rectangle";
|
||||
public static final String ELLIPSE_TYPE = "ellipse";
|
||||
public static final String TRIANGLE_TYPE = "triangle";
|
||||
public static final String LINE_TYPE = "line";
|
||||
public static final String POLL_RESULT_TYPE = "poll_result";
|
||||
|
||||
public static final String TEXT_CREATED_STATUS = "textCreated";
|
||||
public static final String DRAW_START_STATUS = "DRAW_START";
|
||||
public static final String DRAW_END_STATUS = "DRAW_END";
|
||||
|
||||
public static final String POLL_RESULT_TYPE = "poll_result";
|
||||
}
|
@ -6,7 +6,7 @@ description := "BigBlueButton custom FS-ESL client built on top of FS-ESL Java l
|
||||
|
||||
organization := "org.bigbluebutton"
|
||||
|
||||
version := "0.0.3"
|
||||
version := "0.0.4"
|
||||
|
||||
// We want to have our jar files in lib_managed dir.
|
||||
// This way we'll have the right path when we import
|
||||
@ -44,18 +44,15 @@ crossPaths := false
|
||||
// This forbids including Scala related libraries into the dependency
|
||||
autoScalaLibrary := false
|
||||
|
||||
//publishTo := Some(Resolver.file("file", new File(Path.userHome.absolutePath+"/.m2/repository")))
|
||||
publishTo := Some(Resolver.file("file", new File(Path.userHome.absolutePath+"/.m2/repository")))
|
||||
|
||||
|
||||
publishTo := Some(Resolver.file("file", new File(Path.userHome.absolutePath+"/dev/repo/maven-repo/releases" )) )
|
||||
|
||||
publishTo := {
|
||||
val nexus = "https://oss.sonatype.org/"
|
||||
if (isSnapshot.value)
|
||||
Some("snapshots" at nexus + "content/repositories/snapshots")
|
||||
else
|
||||
Some("releases" at nexus + "service/local/staging/deploy/maven2")
|
||||
}
|
||||
//publishTo := {
|
||||
// val nexus = "https://oss.sonatype.org/"
|
||||
// if (isSnapshot.value)
|
||||
// Some("snapshots" at nexus + "content/repositories/snapshots")
|
||||
// else
|
||||
// Some("releases" at nexus + "service/local/staging/deploy/maven2")
|
||||
//}
|
||||
|
||||
|
||||
// Enables publishing to maven repo
|
||||
@ -80,4 +77,4 @@ pomExtra := (
|
||||
|
||||
licenses := Seq("Apache License, Version 2.0" -> url("http://opensource.org/licenses/Apache-2.0"))
|
||||
|
||||
homepage := Some(url("http://www.bigbluebutton.org"))
|
||||
homepage := Some(url("http://www.bigbluebutton.org"))
|
||||
|
@ -475,26 +475,21 @@ public class Client
|
||||
System.out.println("##### Client member_add_file_data");
|
||||
listener.conferenceEventPlayFile(uniqueId, confName, confSize, event);
|
||||
return;
|
||||
//API has changed between freeswitch 1.4 and 1.6
|
||||
} else if (eventFunc.equals("conf_api_sub_transfer") || eventFunc.equals("conference_api_sub_transfer")) {
|
||||
//Member transfered to another conf...
|
||||
listener.conferenceEventTransfer(uniqueId, confName, confSize, event);
|
||||
return;
|
||||
//API has changed between freeswitch 1.4 and 1.6
|
||||
} else if (eventFunc.equals("conference_add_member") || eventFunc.equals("conference_member_add")) {
|
||||
System.out.println("##### Client conference_add_member");
|
||||
listener.conferenceEventJoin(uniqueId, confName, confSize, event);
|
||||
return;
|
||||
//API has changed between freeswitch 1.4 and 1.6
|
||||
} else if (eventFunc.equals("conference_del_member") || eventFunc.equals("conference_member_del")) {
|
||||
System.out.println("##### Client conference_del_member");
|
||||
listener.conferenceEventLeave(uniqueId, confName, confSize, event);
|
||||
return;
|
||||
//API has changed between freeswitch 1.4 and 1.6
|
||||
} else if (eventFunc.equals("conf_api_sub_mute") || eventFunc.equals("conference_api_sub_mute")) {
|
||||
listener.conferenceEventMute(uniqueId, confName, confSize, event);
|
||||
return;
|
||||
//API has changed between freeswitch 1.4 and 1.6
|
||||
} else if (eventFunc.equals("conf_api_sub_unmute") || eventFunc.equals("conference_api_sub_unmute")) {
|
||||
listener.conferenceEventUnMute(uniqueId, confName, confSize, event);
|
||||
return;
|
||||
|
@ -179,7 +179,11 @@ public class VideoApplication extends MultiThreadedApplicationAdapter {
|
||||
String meetingId = conn.getScope().getName();
|
||||
String streamId = stream.getPublishedName();
|
||||
|
||||
publisher.userSharedWebcamMessage(meetingId, userId, streamId);
|
||||
//publisher.userSharedWebcamMessage(meetingId, userId, streamId);
|
||||
log.info("^^^^^^^^^^^publisher.userSharedWebcamMessage(meetingId, userId, streamId);");
|
||||
|
||||
|
||||
|
||||
VideoStreamListener listener = new VideoStreamListener(conn.getScope(), stream, recordVideoStream, userId, packetTimeout);
|
||||
listener.setEventRecordingService(recordingService);
|
||||
stream.addStreamListener(listener);
|
||||
@ -212,7 +216,10 @@ public class VideoApplication extends MultiThreadedApplicationAdapter {
|
||||
String meetingId = conn.getScope().getName();
|
||||
String streamId = stream.getPublishedName();
|
||||
|
||||
publisher.userUnshareWebcamRequestMessage(meetingId, userId, streamId);
|
||||
//publisher.userUnshareWebcamRequestMessage(meetingId, userId, streamId);
|
||||
log.info("^^^^^^^^^^^publisher.userUnshareWebcamRequestMessage(meetingId, userId, streamId);");
|
||||
|
||||
|
||||
|
||||
IStreamListener listener = streamListeners.remove(scopeName + "-" + stream.getPublishedName());
|
||||
if (listener != null) {
|
||||
|
File diff suppressed because one or more lines are too long
@ -1,75 +0,0 @@
|
||||
format version: 5
|
||||
output mode:
|
||||
1 items
|
||||
0 -> multiple
|
||||
output directories:
|
||||
2 items
|
||||
D:\bbb\bigbluebutton-apps\src\test\resources -> D:\bbb\bigbluebutton-apps\bin
|
||||
D:\bbb\bigbluebutton-apps\src\test\scala -> D:\bbb\bigbluebutton-apps\bin
|
||||
compile options:
|
||||
8 items
|
||||
0 -> -javabootclasspath
|
||||
1 -> C:\Program Files\Java\jdk1.7.0_80\jre\lib\resources.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\rt.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\jce.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\ext\zipfs.jar
|
||||
2 -> -javaextdirs
|
||||
3 ->
|
||||
4 -> -bootclasspath
|
||||
5 -> D:\Ghazi\Softs\eclipse-scala\plugins\org.scala-lang.scala-library_2.11.7.v20150622-112736-1fbce4612c.jar
|
||||
6 -> -encoding
|
||||
7 -> UTF-8
|
||||
javac options:
|
||||
0 items
|
||||
compiler version:
|
||||
1 items
|
||||
0 -> 2.11.7
|
||||
compile order:
|
||||
1 items
|
||||
0 -> Mixed
|
||||
name hashing:
|
||||
1 items
|
||||
0 -> false
|
||||
products:
|
||||
0 items
|
||||
binary dependencies:
|
||||
0 items
|
||||
direct source dependencies:
|
||||
0 items
|
||||
direct external dependencies:
|
||||
0 items
|
||||
public inherited source dependencies:
|
||||
0 items
|
||||
public inherited external dependencies:
|
||||
0 items
|
||||
member reference internal dependencies:
|
||||
0 items
|
||||
member reference external dependencies:
|
||||
0 items
|
||||
inheritance internal dependencies:
|
||||
0 items
|
||||
inheritance external dependencies:
|
||||
0 items
|
||||
class names:
|
||||
0 items
|
||||
used names:
|
||||
0 items
|
||||
product stamps:
|
||||
0 items
|
||||
source stamps:
|
||||
1 items
|
||||
D:\bbb\bigbluebutton-apps\src\test\scala\org\bigbluebutton\core\apps\poll\PollTestHelper.scala -> hash(7d7b5b5d738db53e715d04615c5f0f6889a87ca1)
|
||||
binary stamps:
|
||||
0 items
|
||||
class names:
|
||||
0 items
|
||||
internal apis:
|
||||
1 items
|
||||
D:\bbb\bigbluebutton-apps\src\test\scala\org\bigbluebutton\core\apps\poll\PollTestHelper.scala ->
|
||||
rO0ABXNyABB4c2J0aS5hcGkuU291cmNlFlpwRASfbtoCAAZJAAdhcGlIYXNoWgAIaGFzTWFjcm9MABhfaW50ZXJuYWxPbmx5X25hbWVIYXNoZXN0ACRMeHNidGkvYXBpL19pbnRlcm5hbE9ubHlfTmFtZUhhc2hlcztMAANhcGl0ABVMeHNidGkvYXBpL1NvdXJjZUFQSTtMAAtjb21waWxhdGlvbnQAF0x4c2J0aS9hcGkvQ29tcGlsYXRpb247WwAEaGFzaHQAAltCeHAMaZ2IAHNyACJ4c2J0aS5hcGkuX2ludGVybmFsT25seV9OYW1lSGFzaGVzVNq+mfrU7EwCAAJbAA9pbXBsaWNpdE1lbWJlcnN0ACNbTHhzYnRpL2FwaS9faW50ZXJuYWxPbmx5X05hbWVIYXNoO1sADnJlZ3VsYXJNZW1iZXJzcQB+AAd4cHVyACNbTHhzYnRpLmFwaS5faW50ZXJuYWxPbmx5X05hbWVIYXNoO0lagLbdlov0AgAAeHAAAAAAdXEAfgAJAAAAAHNyABN4c2J0aS5hcGkuU291cmNlQVBJuV6n+SkjOKQCAAJbAAtkZWZpbml0aW9uc3QAF1tMeHNidGkvYXBpL0RlZmluaXRpb247WwAIcGFja2FnZXN0ABRbTHhzYnRpL2FwaS9QYWNrYWdlO3hwdXIAF1tMeHNidGkuYXBpLkRlZmluaXRpb247iMlc57TjXg4CAAB4cAAAAAB1cgAUW0x4c2J0aS5hcGkuUGFja2FnZTtbExk3cKcnoQIAAHhwAAAABXNyABF4c2J0aS5hcGkuUGFja2FnZX5Zj/auzjlYAgABTAAEbmFtZXQAEkxqYXZhL2xhbmcvU3RyaW5nO3hwdAAWb3JnLmJpZ2JsdWVidXR0b24uY29yZXNxAH4AFHQAEW9yZy5iaWdibHVlYnV0dG9uc3EAfgAUdAAbb3JnLmJpZ2JsdWVidXR0b24uY29yZS5hcHBzc3EAfgAUdAAgb3JnLmJpZ2JsdWVidXR0b24uY29yZS5hcHBzLnBvbGxzcQB+ABR0AANvcmdzcgAVeHNidGkuYXBpLkNvbXBpbGF0aW9u7frgw2rooEICAAJKAAlzdGFydFRpbWVbAAdvdXRwdXRzdAAaW0x4c2J0aS9hcGkvT3V0cHV0U2V0dGluZzt4cAAAAVLvfQ9fdXIAGltMeHNidGkuYXBpLk91dHB1dFNldHRpbmc7f2rC86eHpUICAAB4cAAAAAJzcgAXeHNidGkuYXBpLk91dHB1dFNldHRpbmd62ZpHdPsdewIAAkwAD291dHB1dERpcmVjdG9yeXEAfgAVTAAPc291cmNlRGlyZWN0b3J5cQB+ABV4cHQAHUQ6XGJiYlxiaWdibHVlYnV0dG9uLWFwcHNcYmludAAoRDpcYmJiXGJpZ2JsdWVidXR0b24tYXBwc1xzcmNcdGVzdFxzY2FsYXNxAH4AJXQAHUQ6XGJiYlxiaWdibHVlYnV0dG9uLWFwcHNcYmludAAsRDpcYmJiXGJpZ2JsdWVidXR0b24tYXBwc1xzcmNcdGVzdFxyZXNvdXJjZXN1cgACW0Ks8xf4BghU4AIAAHhwAAAAFH17W11zjbU+cV0EYVxfD2iJqHyh
|
||||
external apis:
|
||||
0 items
|
||||
source infos:
|
||||
1 items
|
||||
D:\bbb\bigbluebutton-apps\src\test\scala\org\bigbluebutton\core\apps\poll\PollTestHelper.scala ->
|
||||
AAAAAAAAAAA=
|
||||
compilations:
|
||||
1 items
|
||||
0 -> rO0ABXNyABV4c2J0aS5hcGkuQ29tcGlsYXRpb27t+uDDauigQgIAAkoACXN0YXJ0VGltZVsAB291dHB1dHN0ABpbTHhzYnRpL2FwaS9PdXRwdXRTZXR0aW5nO3hwAAABUu99D191cgAaW0x4c2J0aS5hcGkuT3V0cHV0U2V0dGluZzt/asLzp4elQgIAAHhwAAAAAnNyABd4c2J0aS5hcGkuT3V0cHV0U2V0dGluZ3rZmkd0+x17AgACTAAPb3V0cHV0RGlyZWN0b3J5dAASTGphdmEvbGFuZy9TdHJpbmc7TAAPc291cmNlRGlyZWN0b3J5cQB+AAZ4cHQAHUQ6XGJiYlxiaWdibHVlYnV0dG9uLWFwcHNcYmludAAoRDpcYmJiXGJpZ2JsdWVidXR0b24tYXBwc1xzcmNcdGVzdFxzY2FsYXNxAH4ABXQAHUQ6XGJiYlxiaWdibHVlYnV0dG9uLWFwcHNcYmludAAsRDpcYmJiXGJpZ2JsdWVidXR0b24tYXBwc1xzcmNcdGVzdFxyZXNvdXJjZXM=
|
@ -72,7 +72,7 @@ dependencies {
|
||||
compile 'com.google.code.gson:gson:2.5'
|
||||
providedCompile 'org.apache.commons:commons-lang3:3.2'
|
||||
|
||||
compile 'org.bigbluebutton:bbb-common-message:0.0.17-SNAPSHOT'
|
||||
compile 'org.bigbluebutton:bbb-common-message:0.0.18-SNAPSHOT'
|
||||
}
|
||||
|
||||
test {
|
||||
|
@ -0,0 +1,85 @@
|
||||
package org.bigbluebutton.red5.client;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.bigbluebutton.common.messages.ChatKeyUtil;
|
||||
import org.bigbluebutton.common.messages.DeskShareNotifyViewersRTMPEventMessage;
|
||||
import org.bigbluebutton.common.messages.DeskShareNotifyASingleViewerEventMessage;
|
||||
import org.bigbluebutton.red5.client.messaging.BroadcastClientMessage;
|
||||
import org.bigbluebutton.red5.client.messaging.DirectClientMessage;
|
||||
import org.bigbluebutton.red5.client.messaging.ConnectionInvokerService;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
|
||||
public class DeskShareMessageSender {
|
||||
private ConnectionInvokerService service;
|
||||
|
||||
public DeskShareMessageSender(ConnectionInvokerService service) {
|
||||
this.service = service;
|
||||
}
|
||||
|
||||
public void handleDeskShareMessage(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 DeskShareNotifyViewersRTMPEventMessage.DESK_SHARE_NOTIFY_VIEWERS_RTMP:
|
||||
DeskShareNotifyViewersRTMPEventMessage rtmp = DeskShareNotifyViewersRTMPEventMessage.fromJson(message);
|
||||
|
||||
if (rtmp != null) {
|
||||
processDeskShareNotifyViewersRTMPEventMessage(rtmp);
|
||||
}
|
||||
break;
|
||||
case DeskShareNotifyASingleViewerEventMessage.DESK_SHARE_NOTIFY_A_SINGLE_VIEWER:
|
||||
DeskShareNotifyASingleViewerEventMessage singleViewerMsg = DeskShareNotifyASingleViewerEventMessage.fromJson(message);
|
||||
if (singleViewerMsg != null) {
|
||||
processDeskShareNotifyASingleViewerEventMessage(singleViewerMsg);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void processDeskShareNotifyViewersRTMPEventMessage(DeskShareNotifyViewersRTMPEventMessage msg) {
|
||||
Map<String, Object> messageInfo = new HashMap<String, Object>();
|
||||
|
||||
// split the string streamPath if there are params in the format:
|
||||
// {channels=2,samplerate=48000,vw=1920,vh=1080,fps=5.00}rtmp://192.168.23.3/video-broadcast/.../..."
|
||||
String fullPathString = msg.streamPath;
|
||||
String delims = "[,{}]+";
|
||||
String[] arr = fullPathString.split(delims);
|
||||
String rtmpStreamPath = arr[arr.length -1];
|
||||
|
||||
messageInfo.put("rtmpUrl", rtmpStreamPath);
|
||||
messageInfo.put("broadcasting", msg.broadcasting);
|
||||
messageInfo.put("width", msg.vw);
|
||||
messageInfo.put("height", msg.vh);
|
||||
|
||||
BroadcastClientMessage m = new BroadcastClientMessage(msg.meetingId, "DeskShareRTMPBroadcastNotification", messageInfo);
|
||||
service.sendMessage(m);
|
||||
}
|
||||
|
||||
private void processDeskShareNotifyASingleViewerEventMessage(DeskShareNotifyASingleViewerEventMessage msg) {
|
||||
Map<String, Object> messageInfo = new HashMap<String, Object>();
|
||||
|
||||
messageInfo.put("rtmpUrl", msg.streamPath);
|
||||
messageInfo.put("broadcasting", msg.broadcasting);
|
||||
messageInfo.put("width", msg.vw);
|
||||
messageInfo.put("height", msg.vh);
|
||||
|
||||
String toUserId = msg.userId;
|
||||
DirectClientMessage receiver = new DirectClientMessage(msg.meetingId, toUserId,
|
||||
"DeskShareRTMPBroadcastNotification", messageInfo);
|
||||
service.sendMessage(receiver);
|
||||
}
|
||||
|
||||
}
|
@ -233,6 +233,10 @@ public class MessagePublisher {
|
||||
sender.send(MessagingConstants.TO_CHAT_CHANNEL, msg.toJson());
|
||||
}
|
||||
|
||||
public void requestDeskShareInfo(String meetingID, String requesterID, String replyTo) {
|
||||
DeskShareGetInfoRequestMessage msg = new DeskShareGetInfoRequestMessage(meetingID, requesterID, replyTo);
|
||||
sender.send(MessagingConstants.FROM_VOICE_CONF_SYSTEM_CHAN, msg.toJson());
|
||||
}
|
||||
public void sendWhiteboardAnnotation(String meetingID, String requesterID, Map<String, Object> annotation) {
|
||||
SendWhiteboardAnnotationRequestMessage msg = new SendWhiteboardAnnotationRequestMessage(meetingID, requesterID, annotation);
|
||||
sender.send(MessagingConstants.TO_WHITEBOARD_CHANNEL, msg.toJson());
|
||||
|
@ -8,17 +8,22 @@ import org.bigbluebutton.red5.client.UserClientMessageSender;
|
||||
import org.bigbluebutton.red5.client.ChatClientMessageSender;
|
||||
import org.bigbluebutton.red5.client.WhiteboardClientMessageSender;
|
||||
import org.bigbluebutton.red5.client.CaptionClientMessageSender;
|
||||
import org.bigbluebutton.red5.client.DeskShareMessageSender;
|
||||
import org.bigbluebutton.red5.client.messaging.ConnectionInvokerService;
|
||||
import org.bigbluebutton.red5.monitoring.BbbAppsIsKeepAliveHandler;
|
||||
import org.red5.logging.Red5LoggerFactory;
|
||||
import org.slf4j.Logger;
|
||||
|
||||
public class RedisPubSubMessageHandler implements MessageHandler {
|
||||
private static Logger log = Red5LoggerFactory.getLogger(RedisPubSubMessageHandler.class, "bigbluebutton");
|
||||
|
||||
private ConnectionInvokerService service;
|
||||
private UserClientMessageSender userMessageSender;
|
||||
private MeetingClientMessageSender meetingMessageSender;
|
||||
private ChatClientMessageSender chatMessageSender;
|
||||
private PresentationClientMessageSender presentationMessageSender;
|
||||
private PresentationClientMessageSender presentationMessageSender;
|
||||
private WhiteboardClientMessageSender whiteboardMessageSender;
|
||||
private DeskShareMessageSender deskShareMessageSender;
|
||||
private BbbAppsIsKeepAliveHandler bbbAppsIsKeepAliveHandler;
|
||||
private PollingClientMessageSender pollingMessageSender;
|
||||
private CaptionClientMessageSender captionMessageSender;
|
||||
@ -30,6 +35,7 @@ public class RedisPubSubMessageHandler implements MessageHandler {
|
||||
chatMessageSender = new ChatClientMessageSender(service);
|
||||
presentationMessageSender = new PresentationClientMessageSender(service);
|
||||
whiteboardMessageSender = new WhiteboardClientMessageSender(service);
|
||||
deskShareMessageSender = new DeskShareMessageSender(service);
|
||||
pollingMessageSender = new PollingClientMessageSender(service);
|
||||
captionMessageSender = new CaptionClientMessageSender(service);
|
||||
}
|
||||
@ -40,6 +46,7 @@ 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_CHAT_CHANNEL)) {
|
||||
chatMessageSender.handleChatMessage(message);
|
||||
} else if (channel.equalsIgnoreCase(MessagingConstants.FROM_PRESENTATION_CHANNEL)) {
|
||||
@ -47,16 +54,19 @@ public class RedisPubSubMessageHandler implements MessageHandler {
|
||||
} else if (channel.equalsIgnoreCase(MessagingConstants.FROM_MEETING_CHANNEL)) {
|
||||
meetingMessageSender.handleMeetingMessage(message);
|
||||
} else if (channel.equalsIgnoreCase(MessagingConstants.FROM_USERS_CHANNEL)) {
|
||||
log.info("trace 0 : " + message);
|
||||
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_DESK_SHARE_CHANNEL)) {
|
||||
deskShareMessageSender.handleDeskShareMessage(message);
|
||||
} else if (channel.equalsIgnoreCase(MessagingConstants.FROM_POLLING_CHANNEL)) {
|
||||
pollingMessageSender.handlePollMessage(message);
|
||||
} else if (channel.equalsIgnoreCase(MessagingConstants.FROM_CAPTION_CHANNEL)) {
|
||||
captionMessageSender.handleCaptionMessage(message);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,53 @@
|
||||
/**
|
||||
* 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 java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.bigbluebutton.red5.BigBlueButtonSession;
|
||||
import org.bigbluebutton.red5.Constants;
|
||||
import org.bigbluebutton.red5.pubsub.MessagePublisher;
|
||||
import org.red5.logging.Red5LoggerFactory;
|
||||
import org.red5.server.api.Red5;
|
||||
import org.slf4j.Logger;
|
||||
|
||||
public class DesktopSharingService {
|
||||
private static Logger log = Red5LoggerFactory.getLogger( DesktopSharingService.class, "bigbluebutton" );
|
||||
|
||||
private MessagePublisher red5BBBInGw;
|
||||
|
||||
private BigBlueButtonSession getBbbSession() {
|
||||
return (BigBlueButtonSession) Red5.getConnectionLocal().getAttribute(Constants.SESSION);
|
||||
}
|
||||
|
||||
public void setRed5Publisher(MessagePublisher inGW) {
|
||||
red5BBBInGw = inGW;
|
||||
}
|
||||
|
||||
public void requestDeskShareInfo() {
|
||||
String meetingID = Red5.getConnectionLocal().getScope().getName();
|
||||
String requesterID = getBbbSession().getInternalUserID();
|
||||
// Just hardcode as we don't really need it for flash client.
|
||||
String replyTo = meetingID + "/" + requesterID;
|
||||
|
||||
System.out.println("\nDESKTOP SHARING SERVICE _ on the way to bbb-core\n");
|
||||
red5BBBInGw.requestDeskShareInfo(meetingID, requesterID, replyTo);
|
||||
}
|
||||
}
|
@ -1,16 +0,0 @@
|
||||
package org.bigbluebutton.red5.service;
|
||||
|
||||
public class WhiteboardKeyUtil {
|
||||
|
||||
public static final String TEXT_TYPE = "text";
|
||||
public static final String PENCIL_TYPE = "pencil";
|
||||
public static final String RECTANGLE_TYPE = "rectangle";
|
||||
public static final String ELLIPSE_TYPE = "ellipse";
|
||||
public static final String TRIANGLE_TYPE = "triangle";
|
||||
public static final String LINE_TYPE = "line";
|
||||
|
||||
public static final String TEXT_CREATED_STATUS = "textCreated";
|
||||
public static final String DRAW_START_STATUS = "DRAW_START";
|
||||
public static final String DRAW_END_STATUS = "DRAW_END";
|
||||
|
||||
}
|
@ -56,22 +56,26 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
<property name="red5Publisher"> <ref bean="red5Publisher"/> </property>
|
||||
</bean>
|
||||
|
||||
<bean id="connInvokerService" class="org.bigbluebutton.red5.client.messaging.ConnectionInvokerService"
|
||||
<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>
|
||||
|
||||
<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="chat.service" class="org.bigbluebutton.red5.service.ChatService">
|
||||
<property name="red5Publisher"> <ref bean="red5Publisher"/></property>
|
||||
<property name="maxMessageLength" value="1024"/>
|
||||
</bean>
|
||||
|
||||
|
||||
<bean id="participants.service" class="org.bigbluebutton.red5.service.ParticipantsService">
|
||||
<property name="red5Publisher"> <ref bean="red5Publisher"/> </property>
|
||||
</bean>
|
||||
@ -129,4 +133,4 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
<import resource="bbb-redis-pool.xml"/>
|
||||
<import resource="bbb-red5-redis-pubsub.xml"/>
|
||||
</beans>
|
||||
</beans>
|
||||
|
@ -11,10 +11,10 @@
|
||||
<property name="themeFile" value="BBBDefault.css"/>
|
||||
<property name="blackTheme" value="BBBBlack.css"/>
|
||||
<property name="LOCALE" value="en_US" />
|
||||
<property name="RESOURCES_DIR" value="${BASE_DIR}/resources" />
|
||||
<property name="PROD_RESOURCES_DIR" value="${RESOURCES_DIR}/prod" />
|
||||
<property name="RESOURCES_DIR" value="${BASE_DIR}/resources" />
|
||||
<property name="PROD_RESOURCES_DIR" value="${RESOURCES_DIR}/prod" />
|
||||
<property name="SRC_DIR" value="${BASE_DIR}/src" />
|
||||
|
||||
|
||||
<property name="OUTPUT_DIR" value="${BASE_DIR}/client" />
|
||||
<taskdef resource="flexTasks.tasks" classpath="${FLEX_HOME}/ant/lib/flexTasks.jar" />
|
||||
|
||||
@ -42,29 +42,29 @@
|
||||
<property name="CAPTION" value="CaptionModule" />
|
||||
|
||||
<xmlproperty file="${SRC_DIR}/conf/locales.xml" collapseAttributes="true"/>
|
||||
|
||||
|
||||
<target name="init-ant-contrib">
|
||||
<property name="ant-contrib.jar" location="${BASE_DIR}/build/lib/ant-contrib-0.6.jar"/>
|
||||
<taskdef resource="net/sf/antcontrib/antcontrib.properties" classpath="${ant-contrib.jar}"/>
|
||||
</target>
|
||||
|
||||
|
||||
<target name="locales" depends="init-ant-contrib">
|
||||
<echo message="Checking if locale output dir exists"/>
|
||||
<available file="${OUTPUT_DIR}/locale" type="file" property="locale.dir.present"/>
|
||||
<if>
|
||||
<equals arg1="${locale.dir.present}" arg2="true"/>
|
||||
<then>
|
||||
<echo message="Locale output dir exists. Deleting contents of ${OUTPUT_DIR}/locale"/>
|
||||
<if>
|
||||
<equals arg1="${locale.dir.present}" arg2="true"/>
|
||||
<then>
|
||||
<echo message="Locale output dir exists. Deleting contents of ${OUTPUT_DIR}/locale"/>
|
||||
<delete>
|
||||
<fileset dir="${OUTPUT_DIR}/locale">
|
||||
<include name="**/*"/>
|
||||
</fileset>
|
||||
</delete>
|
||||
</then>
|
||||
<else>
|
||||
<echo message="Locale output dir does not exists. Creating ${OUTPUT_DIR}/locale"/>
|
||||
</then>
|
||||
<else>
|
||||
<echo message="Locale output dir does not exists. Creating ${OUTPUT_DIR}/locale"/>
|
||||
<mkdir dir="${OUTPUT_DIR}/locale"/>
|
||||
</else>
|
||||
</else>
|
||||
</if>
|
||||
|
||||
<echo message="Determining supported locales."/>
|
||||
@ -77,38 +77,38 @@
|
||||
</path>
|
||||
</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}"
|
||||
mxml.compatibility-version="3.0.0"
|
||||
swf-version="13"
|
||||
<mxmlc file="${BASE_DIR}/branding/default/style/css/${themeFile}"
|
||||
output="${OUTPUT_DIR}/branding/css/${themeFile}.swf"
|
||||
debug="${DEBUG}"
|
||||
mxml.compatibility-version="3.0.0"
|
||||
swf-version="13"
|
||||
optimize="true">
|
||||
</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}"
|
||||
mxml.compatibility-version="3.0.0"
|
||||
swf-version="13"
|
||||
<mxmlc file="${BASE_DIR}/branding/default/style/css/${blackTheme}"
|
||||
output="${OUTPUT_DIR}/branding/css/${blackTheme}.swf"
|
||||
debug="${DEBUG}"
|
||||
mxml.compatibility-version="3.0.0"
|
||||
swf-version="13"
|
||||
optimize="true">
|
||||
</mxmlc>
|
||||
</sequential>
|
||||
</target>
|
||||
|
||||
|
||||
<target name="build-bbb-main-test" description="Compile BigBlueButton Main Test">
|
||||
<build-main src="${SRC_DIR}" target="${BBB_MAIN_TEST}" />
|
||||
</target>
|
||||
|
||||
<target name="build-locale">
|
||||
<echo message="Locale dir is ${supportedlocale}. Extract locale name." />
|
||||
<basename property="locale.name" file="${supportedlocale}"/>
|
||||
<basename property="locale.name" file="${supportedlocale}"/>
|
||||
<echo message="Locale name is ${locale.name}"/>
|
||||
|
||||
<sequential>
|
||||
@ -118,33 +118,33 @@
|
||||
<equals arg1="${locale.name}" arg2="locale"/>
|
||||
<then>
|
||||
<echo message="Somehow, the dirset for locales is passing the parent (${locale.name}) dir."/>
|
||||
<echo message="We don't want it, so we need to skip it."/>
|
||||
<echo message="We don't want it, so we need to skip it."/>
|
||||
</then>
|
||||
<else>
|
||||
<if>
|
||||
<equals arg1="${locale.dir.present}" arg2="true"/>
|
||||
<then>
|
||||
<else>
|
||||
<if>
|
||||
<equals arg1="${locale.dir.present}" arg2="true"/>
|
||||
<then>
|
||||
<echo message="We already have a copy of the framework locale. No need to copy ${LOCALE_DIR}/${locale.name}"/>
|
||||
</then>
|
||||
<else>
|
||||
<echo message="No copy of the framework locale. Copying ${LOCALE_DIR}/${locale.name}"/>
|
||||
</then>
|
||||
<else>
|
||||
<echo message="No copy of the framework locale. Copying ${LOCALE_DIR}/${locale.name}"/>
|
||||
<exec vmlauncher="true" executable="copylocale">
|
||||
<arg value="en_US"/>
|
||||
<arg value="${locale.name}"/>
|
||||
</exec>
|
||||
</exec>
|
||||
</else>
|
||||
</if>
|
||||
</if>
|
||||
<echo message="Compiling locale ${locale.name}"/>
|
||||
<compileLocale locale="${locale.name}" />
|
||||
</else>
|
||||
</if>
|
||||
<compileLocale locale="${locale.name}" />
|
||||
</else>
|
||||
</if>
|
||||
</sequential>
|
||||
</target>
|
||||
|
||||
<target name="locale">
|
||||
<compileLocale locale="${LOCALE}" />
|
||||
<target name="localize">
|
||||
<compileLocale locale="${LOCALE}" />
|
||||
</target>
|
||||
|
||||
|
||||
<macrodef name="compileLocale" description="Compiles the Resource package for the given locale">
|
||||
<attribute name="locale" default="en_US"/>
|
||||
<sequential>
|
||||
@ -152,13 +152,13 @@
|
||||
<echo message="**********************************************"/>
|
||||
<echo message="* Did you check bundles.txt and made *"/>
|
||||
<echo message="* all resources listed here? *"/>
|
||||
<echo message="**********************************************"/>
|
||||
<echo message="**********************************************"/>
|
||||
<!-- Invoke MXMLC -->
|
||||
<mxmlc output="${OUTPUT_DIR}/locale/@{locale}_resources.swf">
|
||||
<locale>@{locale}</locale>
|
||||
<target-player>11</target-player>
|
||||
<source-path path-element="locale/{locale}"/>
|
||||
|
||||
|
||||
<!--
|
||||
Look into bundles.txt to find out what resources to include here.
|
||||
http://forums.adobe.com/thread/758619
|
||||
@ -166,47 +166,47 @@
|
||||
-->
|
||||
<include-resource-bundles>SharedResources</include-resource-bundles>
|
||||
<include-resource-bundles>bbbResources</include-resource-bundles>
|
||||
<include-resource-bundles>collections</include-resource-bundles>
|
||||
<include-resource-bundles>containers</include-resource-bundles>
|
||||
<include-resource-bundles>controls</include-resource-bundles>
|
||||
<include-resource-bundles>core</include-resource-bundles>
|
||||
<include-resource-bundles>effects</include-resource-bundles>
|
||||
<include-resource-bundles>logging</include-resource-bundles>
|
||||
<include-resource-bundles>messaging</include-resource-bundles>
|
||||
<include-resource-bundles>modules</include-resource-bundles>
|
||||
<include-resource-bundles>rpc</include-resource-bundles>
|
||||
<include-resource-bundles>skins</include-resource-bundles>
|
||||
<include-resource-bundles>collections</include-resource-bundles>
|
||||
<include-resource-bundles>containers</include-resource-bundles>
|
||||
<include-resource-bundles>controls</include-resource-bundles>
|
||||
<include-resource-bundles>core</include-resource-bundles>
|
||||
<include-resource-bundles>effects</include-resource-bundles>
|
||||
<include-resource-bundles>logging</include-resource-bundles>
|
||||
<include-resource-bundles>messaging</include-resource-bundles>
|
||||
<include-resource-bundles>modules</include-resource-bundles>
|
||||
<include-resource-bundles>rpc</include-resource-bundles>
|
||||
<include-resource-bundles>skins</include-resource-bundles>
|
||||
<include-resource-bundles>styles</include-resource-bundles>
|
||||
<source-path path-element="${FLEX_HOME}/frameworks"/>
|
||||
</mxmlc>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
|
||||
|
||||
<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>
|
||||
</copy>
|
||||
</target>
|
||||
|
||||
<target name="build-broadcast" description="Compile Broadcast Module" >
|
||||
<build-module src="${SRC_DIR}" target="${BROADCAST}" />
|
||||
</target>
|
||||
|
||||
|
||||
<target name="build-chat" description="Compile Chat Module">
|
||||
<build-module src="${SRC_DIR}" target="${CHAT}" />
|
||||
</target>
|
||||
|
||||
|
||||
<target name="build-notes" description="Compile Notes Module">
|
||||
<build-module src="${SRC_DIR}" target="${NOTES}" />
|
||||
</target>
|
||||
|
||||
|
||||
<target name="build-polling" description="Compile Polling Module">
|
||||
<build-module src="${SRC_DIR}" target="${POLLING}" />
|
||||
</target>
|
||||
|
||||
|
||||
<target name="build-present" description="Compile Present Module">
|
||||
<build-module src="${SRC_DIR}" target="${PRESENT}" />
|
||||
</target>
|
||||
@ -215,10 +215,10 @@
|
||||
<echo message="Compiling deskshare standalone without optimization." />
|
||||
<build-module-no-link src="${SRC_DIR}" target="${DESKSHARE_SA}" />
|
||||
</target>
|
||||
|
||||
|
||||
<target name="build-deskshare-no-linker" description="Compile Deskshare Module without the linker">
|
||||
<echo message="Compiling deskshare without optimization." />
|
||||
<build-module-no-link src="${SRC_DIR}" target="${DESKSHARE}" />
|
||||
<build-module-no-link src="${SRC_DIR}" target="${DESKSHARE}" />
|
||||
</target>
|
||||
|
||||
<target name="build-screenshare-standalone" depends="build-screenshare-no-linker" description="Compile Screenshare Standalone Application">
|
||||
@ -250,17 +250,17 @@
|
||||
<echo message="Compiling Camera Check Application." />
|
||||
<build-module-no-link src="${SRC_DIR}" target="${CAMERA_CHECK}" />
|
||||
</target>
|
||||
|
||||
|
||||
<target name="build-conn-check" description="Compile Connection Check Application">
|
||||
<echo message="Compiling Connection Check Application." />
|
||||
<build-module-no-link src="${SRC_DIR}" target="${CONNECTION_CHECK}" />
|
||||
</target>
|
||||
|
||||
|
||||
<target name="build-deskshare" description="Compile Deskshare Module">
|
||||
<build-module src="${SRC_DIR}" target="${DESKSHARE}" />
|
||||
<echo message="Copying deskshare applet for Deskshare Module" />
|
||||
<copy file="${PROD_RESOURCES_DIR}/bbb-deskshare-applet-unsigned-0.9.0.jar" todir="${OUTPUT_DIR}"/>
|
||||
<copy file="${PROD_RESOURCES_DIR}/bbb-deskshare-applet-0.9.0.jar" todir="${OUTPUT_DIR}"/>
|
||||
<copy file="${PROD_RESOURCES_DIR}/bbb-deskshare-applet-unsigned-0.9.0.jar" todir="${OUTPUT_DIR}"/>
|
||||
<copy file="${PROD_RESOURCES_DIR}/bbb-deskshare-applet-0.9.0.jar" todir="${OUTPUT_DIR}"/>
|
||||
</target>
|
||||
|
||||
<target name="build-screenshare" description="Compile Screenshare Module">
|
||||
@ -270,13 +270,13 @@
|
||||
|
||||
<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>
|
||||
</copy>
|
||||
</target>
|
||||
|
||||
|
||||
<target name="build-video" description="Compile Video Module">
|
||||
<build-module src="${SRC_DIR}" target="${VIDEO}" />
|
||||
</target>
|
||||
@ -284,11 +284,11 @@
|
||||
<target name="build-whiteboard" description="Compile Whiteboard Module">
|
||||
<build-module src="${SRC_DIR}" target="${WHITEBOARD}" />
|
||||
</target>
|
||||
|
||||
|
||||
<target name="build-layout" description="Compile Layout Module">
|
||||
<build-module src="${SRC_DIR}" target="${LAYOUT}" />
|
||||
</target>
|
||||
|
||||
|
||||
<target name="build-users" description="Compile Users Module">
|
||||
<build-module src="${SRC_DIR}" target="${USERS}" />
|
||||
</target>
|
||||
@ -302,13 +302,13 @@
|
||||
depends="build-bbb-main, build-chat, build-present, build-layout, build-broadcast, build-users, build-caption"
|
||||
description="Compile main, chat, present modules">
|
||||
</target>
|
||||
|
||||
|
||||
<!-- just a grouping of modules to compile -->
|
||||
<target name="build-deskshare-phone-video-whiteboard-dyn"
|
||||
depends="build-deskshare, build-screenshare, build-phone, build-video, build-whiteboard, build-notes, build-polling"
|
||||
description="Compile deskshare, phone, video, whiteboard modules">
|
||||
</target>
|
||||
|
||||
|
||||
<macrodef name="build-main">
|
||||
<attribute name="target" description="Module to compile" />
|
||||
<attribute name="flex" default="${FLEX_HOME}" description="Location of the Flex install." />
|
||||
@ -319,7 +319,7 @@
|
||||
<target-player>11</target-player>
|
||||
<load-config filename="@{flex}/frameworks/flex-config.xml" />
|
||||
<source-path path-element="@{flex}/frameworks" />
|
||||
|
||||
|
||||
<!--
|
||||
Dump out resources to find out what resources to include building the locales.
|
||||
http://forums.adobe.com/thread/758619
|
||||
@ -327,7 +327,7 @@
|
||||
-->
|
||||
<resource-bundle-list>bundles.txt</resource-bundle-list>
|
||||
<static-link-runtime-shared-libraries>${STATIC_RSL}</static-link-runtime-shared-libraries>
|
||||
|
||||
|
||||
<compiler.library-path dir="@{flex}/frameworks" append="true">
|
||||
<include name="libs" />
|
||||
<include name="../bundles/{locale}" />
|
||||
@ -347,7 +347,7 @@
|
||||
<echo message="**********************************************"/>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
|
||||
|
||||
<macrodef name="build-module-no-link">
|
||||
<attribute name="target" description="Module to compile" />
|
||||
<attribute name="flex" default="${FLEX_HOME}" description="Location of the Flex install." />
|
||||
@ -374,7 +374,7 @@
|
||||
</mxmlc>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
|
||||
|
||||
<macrodef name="build-module">
|
||||
<attribute name="target" description="Module to compile" />
|
||||
<attribute name="flex" default="${FLEX_HOME}" description="Location of the Flex install." />
|
||||
@ -403,7 +403,7 @@
|
||||
</macrodef>
|
||||
|
||||
<target name="compile-deskshare-standalone" depends="build-deskshare-standalone"
|
||||
description="Compiling standalone desktop sharing">
|
||||
description="Compiling standalone desktop sharing">
|
||||
<echo message="Deskshare standalone built without optimization." />
|
||||
</target>
|
||||
|
||||
@ -413,7 +413,7 @@
|
||||
</target>
|
||||
|
||||
<target name="compile-bbb" depends="build-main-chat-present, build-deskshare-phone-video-whiteboard-dyn, copy-resource-files"
|
||||
description="Compiling the BBB without copying config.xml">
|
||||
description="Compiling the BBB without copying config.xml">
|
||||
</target>
|
||||
|
||||
<target name="copy-config-if-needed">
|
||||
@ -423,7 +423,7 @@
|
||||
<copy file="/var/www/bigbluebutton/client/conf/config.xml" todir="${BASE_DIR}/src/conf" />
|
||||
</else>
|
||||
</if>
|
||||
</target>
|
||||
</target>
|
||||
|
||||
<target name="copy-join-mock-if-needed">
|
||||
<if>
|
||||
@ -432,23 +432,23 @@
|
||||
<copy file="${RESOURCES_DIR}/dev/join-mock.xml" todir="${BASE_DIR}/src/conf" />
|
||||
</else>
|
||||
</if>
|
||||
</target>
|
||||
</target>
|
||||
|
||||
<target name="copy-resource-files" >
|
||||
<copy todir="${OUTPUT_DIR}/swfobject/" >
|
||||
<fileset dir="${PROD_RESOURCES_DIR}/swfobject" />
|
||||
</copy>
|
||||
</copy>
|
||||
<copy todir="${OUTPUT_DIR}/lib/" >
|
||||
<fileset dir="${PROD_RESOURCES_DIR}/lib"/>
|
||||
</copy>
|
||||
</copy>
|
||||
<copy file="${PROD_RESOURCES_DIR}/BigBlueButtonTest.html" todir="${OUTPUT_DIR}" overwrite="true"/>
|
||||
<copy file="${PROD_RESOURCES_DIR}/BigBlueButton.html" todir="${OUTPUT_DIR}" overwrite="true"/>
|
||||
<copy file="${PROD_RESOURCES_DIR}/DeskshareStandalone.html" todir="${OUTPUT_DIR}" overwrite="true"/>
|
||||
<copy file="${PROD_RESOURCES_DIR}/bbb.gif" todir="${OUTPUT_DIR}" overwrite="true"/>
|
||||
<copy file="${PROD_RESOURCES_DIR}/get_flash_player.gif" todir="${OUTPUT_DIR}" overwrite="true"/>
|
||||
<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}/locales.xml" todir="${OUTPUT_DIR}/conf" overwrite="true"/>
|
||||
<copy file="${PROD_RESOURCES_DIR}/expressInstall.swf" 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"/>
|
||||
<copy file="${PROD_RESOURCES_DIR}/example-info-data.xml" todir="${OUTPUT_DIR}/conf" overwrite="true"/>
|
||||
<copy file="${PROD_RESOURCES_DIR}/layout.xml" todir="${OUTPUT_DIR}/conf" overwrite="true"/>
|
||||
<copy file="${PROD_RESOURCES_DIR}/profiles.xml" todir="${OUTPUT_DIR}/conf" overwrite="true"/>
|
||||
@ -456,17 +456,17 @@
|
||||
<equals arg1="${BUILD_ENV}" arg2="DEV"/>
|
||||
<then>
|
||||
<echo message="Copying config.xml for development environment"/>
|
||||
<copy file="${BASE_DIR}/src/conf/config.xml" todir="${OUTPUT_DIR}/conf" />
|
||||
<copy file="${BASE_DIR}/src/conf/config.xml" todir="${OUTPUT_DIR}/conf" />
|
||||
<!-- echo message="Copying layout.xml for development environment"/>
|
||||
<copy file="${BASE_DIR}/src/conf/layout.xml" todir="${OUTPUT_DIR}/conf" /-->
|
||||
<copy file="${BASE_DIR}/src/conf/layout.xml" todir="${OUTPUT_DIR}/conf" /-->
|
||||
</then>
|
||||
<else>
|
||||
<echo message="Need to copy config.xml.template for production environment"/>
|
||||
<copy file="${RESOURCES_DIR}/config.xml.template" todir="${OUTPUT_DIR}/conf" overwrite="true"/>
|
||||
<copy file="${RESOURCES_DIR}/config.xml.template" todir="${OUTPUT_DIR}/conf" overwrite="true"/>
|
||||
</else>
|
||||
</if>
|
||||
</target>
|
||||
|
||||
|
||||
|
||||
<target name="generate-html-wrapper">
|
||||
<html-wrapper
|
||||
@ -491,9 +491,9 @@
|
||||
<mkdir dir="${BASE_DIR}/asdoc" />
|
||||
<!-- asdoc task not natively supported for ant flexTasks.jar for flex3. It is supported for flex 4, so it should be enabled here
|
||||
when bbb-client is moved to Flex 4 -->
|
||||
<!--<asdoc output="${BASE_DIR}/asdoc"
|
||||
external-library-path="{BASE_DIR}/libs"
|
||||
lenient="true"
|
||||
<!--<asdoc output="${BASE_DIR}/asdoc"
|
||||
external-library-path="{BASE_DIR}/libs"
|
||||
lenient="true"
|
||||
failonerror="true"
|
||||
source-path="${SRC_DIR}"
|
||||
doc-sources="${SRC_DIR}"
|
||||
@ -545,7 +545,7 @@
|
||||
<target name="modules" depends="init-ant-contrib, generate-html-wrapper, compile-deskshare-standalone,
|
||||
compile-screenshare-standalone,
|
||||
build-webcam-preview-standalone, build-webcam-view-standalone, compile-bbb"
|
||||
description="Build BBB client without locales"/>
|
||||
description="Build BBB client without locales"/>
|
||||
<target name="cleanandmake" depends="clean-build-all" description="Build BBB client including locales"/>
|
||||
|
||||
<target name="build-poll" depends="init-ant-contrib, build-polling" description="Build only the polling module." />
|
||||
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -2,7 +2,7 @@ bbb.mainshell.locale.version = 0.9.0
|
||||
bbb.mainshell.statusProgress.connecting = Свързване със сървъра
|
||||
bbb.mainshell.statusProgress.loading = Зареждане на {0} модул/а
|
||||
bbb.mainshell.statusProgress.cannotConnectServer = Съжалявамe, не можем да се свържем със сървъра.
|
||||
# bbb.mainshell.copyrightLabel2 = (c) 2016 <a href\='event\:http\://www.bigbluebutton.org/' target\='_blank'><u>BigBlueButton Inc.</u></a> (build {0})
|
||||
bbb.mainshell.copyrightLabel2 = (c) 2016 <a href\='event\:http\://www.bigbluebutton.org/' target\='_blank'><u>BigBlueButton Inc.</u></a> (build {0})
|
||||
bbb.mainshell.logBtn.toolTip = Отвори Дневник Прозорецът
|
||||
bbb.mainshell.meetingNotFound = Сесията не бе намерена
|
||||
bbb.mainshell.invalidAuthToken = Невалиден активационен код
|
||||
@ -43,7 +43,7 @@ bbb.micSettings.cancel = Отмени
|
||||
bbb.micSettings.connectingtoecho = Свързване
|
||||
bbb.micSettings.connectingtoecho.error = Изпробването на аудиото се провали. Потърсете помощ от техник
|
||||
bbb.micSettings.cancel.toolTip = Отмени присъединяването към разговора
|
||||
bbb.micSettings.access.helpButton = За обучителни видео материали, щракнете тук. Ще бъде отворена нова страница.
|
||||
bbb.micSettings.access.helpButton = Help (open tutorial videos in new page)
|
||||
bbb.micSettings.access.title = Аудио настройки. Фокусът ще остане в този прозорец за аудио настройки, докато прозорецът се затвори.
|
||||
bbb.micSettings.webrtc.title = Поддръжка на WebRTC
|
||||
bbb.micSettings.webrtc.capableBrowser = Вашият браузър поддържа WebRTC.
|
||||
@ -52,7 +52,7 @@ bbb.micSettings.webrtc.capableBrowser.dontuseit.toolTip = Моля натисн
|
||||
bbb.micSettings.webrtc.notCapableBrowser = Вашият браузър не поддържа WebRTC. Моля използвайте Google Chrome (версия 32 или по-скорошна); или Mozilla Firefox (версия 26 или по-скорошна). Все пак ще можете да се включите в разговора чрез Adobe Flash Platform.
|
||||
bbb.micSettings.webrtc.connecting = Обаждане
|
||||
bbb.micSettings.webrtc.waitingforice = Свързване
|
||||
# bbb.micSettings.webrtc.transferring = Transferring
|
||||
bbb.micSettings.webrtc.transferring = Transferring
|
||||
bbb.micSettings.webrtc.endingecho = Свързване към аудиото
|
||||
bbb.micSettings.webrtc.endedecho = Изпробването на аудиото приключи.
|
||||
bbb.micPermissions.firefox.title = Разрешения за микрофон под Firefox
|
||||
@ -69,20 +69,20 @@ bbb.webrtcWarning.title = WebRTC Аудио проблем
|
||||
bbb.webrtcWarning.failedError.1001 = Грешка 1001\: Връзката с WebSocket е прекъсната.
|
||||
bbb.webrtcWarning.failedError.1002 = Грешка 1002\: Не може да се осъществи връзка с WebSocket.
|
||||
bbb.webrtcWarning.failedError.1003 = Грешка 1003\: Версията на браузъра не е поддържана.
|
||||
# bbb.webrtcWarning.failedError.1004 = Error 1004\: Failure on call (reason\={0})
|
||||
bbb.webrtcWarning.failedError.1004 = Error 1004\: Failure on call (reason\={0})
|
||||
bbb.webrtcWarning.failedError.1005 = Грешка 1005\: Повикването завърши неочаквано.
|
||||
# bbb.webrtcWarning.failedError.1006 = Error 1006\: Call timed out
|
||||
# bbb.webrtcWarning.failedError.1007 = Error 1007\: ICE negotiation failed
|
||||
# bbb.webrtcWarning.failedError.1008 = Error 1008\: Transfer failed
|
||||
# bbb.webrtcWarning.failedError.1009 = Error 1009\: Could not fetch STUN/TURN server information
|
||||
# bbb.webrtcWarning.failedError.1010 = Error 1010\: ICE negotiation timeout
|
||||
# bbb.webrtcWarning.failedError.1011 = Error 1011\: ICE gathering timeout
|
||||
bbb.webrtcWarning.failedError.1006 = Error 1006\: Call timed out
|
||||
bbb.webrtcWarning.failedError.1007 = Error 1007\: ICE negotiation failed
|
||||
bbb.webrtcWarning.failedError.1008 = Error 1008\: Transfer failed
|
||||
bbb.webrtcWarning.failedError.1009 = Error 1009\: Could not fetch STUN/TURN server information
|
||||
bbb.webrtcWarning.failedError.1010 = Error 1010\: ICE negotiation timeout
|
||||
bbb.webrtcWarning.failedError.1011 = Error 1011\: ICE gathering timeout
|
||||
bbb.webrtcWarning.failedError.unknown = \ Грешка {0}\: Непознат код на грешка.
|
||||
# bbb.webrtcWarning.failedError.mediamissing = Could not get your microphone for a WebRTC call
|
||||
# bbb.webrtcWarning.failedError.endedunexpectedly = The WebRTC echo test ended unexpectedly
|
||||
# bbb.webrtcWarning.connection.dropped = WebRTC connection dropped
|
||||
# bbb.webrtcWarning.connection.reconnecting = Attempting to reconnect
|
||||
# bbb.webrtcWarning.connection.reestablished = WebRTC connection re-established
|
||||
bbb.webrtcWarning.failedError.mediamissing = Could not get your microphone for a WebRTC call
|
||||
bbb.webrtcWarning.failedError.endedunexpectedly = The WebRTC echo test ended unexpectedly
|
||||
bbb.webrtcWarning.connection.dropped = WebRTC connection dropped
|
||||
bbb.webrtcWarning.connection.reconnecting = Attempting to reconnect
|
||||
bbb.webrtcWarning.connection.reestablished = WebRTC connection re-established
|
||||
bbb.mainToolbar.helpBtn = Помощ
|
||||
bbb.mainToolbar.logoutBtn = Изход
|
||||
bbb.mainToolbar.logoutBtn.toolTip = Изход
|
||||
@ -105,19 +105,19 @@ bbb.mainToolbar.recordingLabel.recording = (Записва се)
|
||||
bbb.mainToolbar.recordingLabel.notRecording = Не се записва
|
||||
bbb.clientstatus.title = Настройки на известията
|
||||
bbb.clientstatus.notification = Непрочетени известия
|
||||
# bbb.clientstatus.close = Close
|
||||
# bbb.clientstatus.tunneling.title = Firewall
|
||||
# bbb.clientstatus.tunneling.message = A firewall is preventing your client from connecting directly on port 1935 to the remote server. Recommend joining a less restrictive network for a more stable connection
|
||||
# bbb.clientstatus.browser.title = Browser Version
|
||||
# bbb.clientstatus.browser.message = Your browser ({0}) is not up-to-date. Recommend updating to the latest version.
|
||||
bbb.clientstatus.close = Close
|
||||
bbb.clientstatus.tunneling.title = Firewall
|
||||
bbb.clientstatus.tunneling.message = A firewall is preventing your client from connecting directly on port 1935 to the remote server. Recommend joining a less restrictive network for a more stable connection
|
||||
bbb.clientstatus.browser.title = Browser Version
|
||||
bbb.clientstatus.browser.message = Your browser ({0}) is not up-to-date. Recommend updating to the latest version.
|
||||
bbb.clientstatus.flash.title = Флаш плейър
|
||||
# bbb.clientstatus.flash.message = Your Flash Player plugin ({0}) is out-of-date. Recommend updating to the latest version.
|
||||
bbb.clientstatus.flash.message = Your Flash Player plugin ({0}) is out-of-date. Recommend updating to the latest version.
|
||||
bbb.clientstatus.webrtc.title = Аудио
|
||||
bbb.clientstatus.webrtc.message = За по-добър звук, моля използвайте браузър Firefox или Chrome.
|
||||
# bbb.clientstatus.java.title = Java
|
||||
# bbb.clientstatus.java.notdetected = Java version not detected.
|
||||
# bbb.clientstatus.java.notinstalled = You have no Java installed, please click <font color\='\#0a4a7a'><a href\='http\://www.java.com/download/' target\='_blank'>HERE</a></font> to install the latest Java to use the desktop sharing feature.
|
||||
# bbb.clientstatus.java.oldversion = You have an old Java installed, please click <font color\='\#0a4a7a'><a href\='http\://www.java.com/download/' target\='_blank'>HERE</a></font> to install the latest Java to use the desktop sharing feature.
|
||||
bbb.clientstatus.java.title = Java
|
||||
bbb.clientstatus.java.notdetected = Java version not detected.
|
||||
bbb.clientstatus.java.notinstalled = You have no Java installed, please click <font color\='\#0a4a7a'><a href\='http\://www.java.com/download/' target\='_blank'>HERE</a></font> to install the latest Java to use the desktop sharing feature.
|
||||
bbb.clientstatus.java.oldversion = You have an old Java installed, please click <font color\='\#0a4a7a'><a href\='http\://www.java.com/download/' target\='_blank'>HERE</a></font> to install the latest Java to use the desktop sharing feature.
|
||||
bbb.window.minimizeBtn.toolTip = Минимизирай
|
||||
bbb.window.maximizeRestoreBtn.toolTip = Увеличи
|
||||
bbb.window.closeBtn.toolTip = Затвори
|
||||
@ -135,8 +135,8 @@ bbb.users.settings.webcamSettings = Настройки на камерата
|
||||
bbb.users.settings.muteAll = Заглушете всички
|
||||
bbb.users.settings.muteAllExcept = Заглушете всички с изключение на лектора
|
||||
bbb.users.settings.unmuteAll = Позволете на всички да говорят
|
||||
# bbb.users.settings.clearAllStatus = Clear all status icons
|
||||
# bbb.users.emojiStatusBtn.toolTip = Update my status icon
|
||||
bbb.users.settings.clearAllStatus = Clear all status icons
|
||||
bbb.users.emojiStatusBtn.toolTip = Update my status icon
|
||||
bbb.users.roomMuted.text = Потребителите не могат да говорят
|
||||
bbb.users.roomLocked.text = Потребителите са заключени
|
||||
bbb.users.pushToTalk.toolTip = Щракнете, за да говорите
|
||||
@ -145,7 +145,7 @@ bbb.users.muteMeBtnTxt.talk = Позволете говор
|
||||
bbb.users.muteMeBtnTxt.mute = Заглушете
|
||||
bbb.users.muteMeBtnTxt.muted = Заглушен
|
||||
bbb.users.muteMeBtnTxt.unmuted = Позволен да говори
|
||||
# bbb.users.usersGrid.contextmenu.exportusers = Copy User Names
|
||||
bbb.users.usersGrid.contextmenu.exportusers = Copy User Names
|
||||
bbb.users.usersGrid.accessibilityName = Потребителски списък. Използвайте клавишите със стрелки, за да навигирате.
|
||||
bbb.users.usersGrid.nameItemRenderer = Име
|
||||
bbb.users.usersGrid.nameItemRenderer.youIdentifier = Вие
|
||||
@ -153,10 +153,10 @@ bbb.users.usersGrid.statusItemRenderer = Статус
|
||||
bbb.users.usersGrid.statusItemRenderer.changePresenter = Натиснете тук за да презентирате
|
||||
bbb.users.usersGrid.statusItemRenderer.presenter = Лектор
|
||||
bbb.users.usersGrid.statusItemRenderer.moderator = Модератор
|
||||
# bbb.users.usersGrid.statusItemRenderer.clearStatus = Clear status
|
||||
bbb.users.usersGrid.statusItemRenderer.clearStatus = Clear status
|
||||
bbb.users.usersGrid.statusItemRenderer.viewer = Наблюдаващ
|
||||
# bbb.users.usersGrid.statusItemRenderer.streamIcon.toolTip = Sharing webcam.
|
||||
# bbb.users.usersGrid.statusItemRenderer.presIcon.toolTip = Is Presenter.
|
||||
bbb.users.usersGrid.statusItemRenderer.streamIcon.toolTip = Sharing webcam.
|
||||
bbb.users.usersGrid.statusItemRenderer.presIcon.toolTip = Is Presenter.
|
||||
bbb.users.usersGrid.mediaItemRenderer = Медия
|
||||
bbb.users.usersGrid.mediaItemRenderer.talking = Говорене
|
||||
bbb.users.usersGrid.mediaItemRenderer.webcam = Споделена камера
|
||||
@ -170,17 +170,17 @@ bbb.users.usersGrid.mediaItemRenderer.webcam = Споделена камера
|
||||
bbb.users.usersGrid.mediaItemRenderer.micOff = Изкл. микрофон
|
||||
bbb.users.usersGrid.mediaItemRenderer.micOn = Вкл. микрофон
|
||||
bbb.users.usersGrid.mediaItemRenderer.noAudio = Не е аудио конференция
|
||||
# bbb.users.emojiStatus.clear = Clear
|
||||
# bbb.users.emojiStatus.clear.toolTip = Clear status
|
||||
# bbb.users.emojiStatus.close = Close
|
||||
# bbb.users.emojiStatus.close.toolTip = Close status popup
|
||||
# bbb.users.emojiStatus.raiseHand = Raise hand status
|
||||
# bbb.users.emojiStatus.happy = Happy status
|
||||
# bbb.users.emojiStatus.smile = Smile status
|
||||
# bbb.users.emojiStatus.sad = Sad status
|
||||
# bbb.users.emojiStatus.confused = Confused status
|
||||
# bbb.users.emojiStatus.neutral = Neutral status
|
||||
# bbb.users.emojiStatus.away = Away status
|
||||
bbb.users.emojiStatus.clear = Clear
|
||||
bbb.users.emojiStatus.clear.toolTip = Clear status
|
||||
bbb.users.emojiStatus.close = Close
|
||||
bbb.users.emojiStatus.close.toolTip = Close status popup
|
||||
bbb.users.emojiStatus.raiseHand = Raise hand status
|
||||
bbb.users.emojiStatus.happy = Happy status
|
||||
bbb.users.emojiStatus.smile = Smile status
|
||||
bbb.users.emojiStatus.sad = Sad status
|
||||
bbb.users.emojiStatus.confused = Confused status
|
||||
bbb.users.emojiStatus.neutral = Neutral status
|
||||
bbb.users.emojiStatus.away = Away status
|
||||
bbb.presentation.title = Презентация
|
||||
bbb.presentation.titleWithPres = Презентация\: {0}
|
||||
bbb.presentation.quickLink.label = Прозорец за презентацията
|
||||
@ -196,7 +196,7 @@ bbb.presentation.uploadcomplete = Качването завърши. Моля,
|
||||
bbb.presentation.uploaded = качено.
|
||||
bbb.presentation.document.supported = Каченият документ се поддържа. Започва конвертиране...
|
||||
bbb.presentation.document.converted = Успешно конвертиране на офис документа.
|
||||
# bbb.presentation.error.document.convert.failed = Error\: Unable to convert the office document.
|
||||
bbb.presentation.error.document.convert.failed = Error\: Unable to convert the office document.
|
||||
bbb.presentation.error.io = IO Грешка\: Моля, свържете се с администратор.
|
||||
bbb.presentation.error.security = Грешка в сигурността\: Моля, свържете се с администратор.
|
||||
bbb.presentation.error.convert.notsupported = Грешка\: Каченият документ не се поддържа. Моля, заредете съвместим файл.
|
||||
@ -242,9 +242,10 @@ bbb.chat.publicChatUsername = Всички
|
||||
bbb.chat.optionsTabName = Настройки
|
||||
bbb.chat.privateChatSelect = Прозорец Чат Избери лице за персонален чат
|
||||
bbb.chat.private.userLeft = Потребителят е напуснал.
|
||||
# bbb.chat.private.userJoined = The user has joined.
|
||||
# bbb.chat.usersList.toolTip = Select User To Open Private Chat
|
||||
# bbb.chat.usersList.accessibilityName = Select user to open private chat. Use the arrow keys to navigate.
|
||||
bbb.chat.private.userJoined = The user has joined.
|
||||
bbb.chat.private.closeMessage = You can close this tab by using the key combination {0}.
|
||||
bbb.chat.usersList.toolTip = Select User To Open Private Chat
|
||||
bbb.chat.usersList.accessibilityName = Select user to open private chat. Use the arrow keys to navigate.
|
||||
bbb.chat.chatOptions = Прозорец Чат Чат опции
|
||||
bbb.chat.fontSize = Прозорец Чат Големина на шрифта
|
||||
bbb.chat.cmbFontSize.toolTip = Изберете размер на шрифта на чата
|
||||
@ -253,14 +254,14 @@ bbb.chat.minimizeBtn.accessibilityName = Минимизирайте прозор
|
||||
bbb.chat.maximizeRestoreBtn.accessibilityName = Максимизирайте прозорец Чат
|
||||
bbb.chat.closeBtn.accessibilityName = Затворете прозорец Чат
|
||||
bbb.chat.chatTabs.accessibleNotice = Новите съобщения се показват тук.
|
||||
# bbb.chat.chatMessage.systemMessage = System
|
||||
# bbb.chat.chatMessage.tooLong = The message is {0} character(s) too long
|
||||
bbb.chat.chatMessage.systemMessage = System
|
||||
bbb.chat.chatMessage.tooLong = The message is {0} character(s) too long
|
||||
bbb.publishVideo.changeCameraBtn.labelText = Смяна на камерата
|
||||
bbb.publishVideo.changeCameraBtn.toolTip = Прозорец за избиране на видео камера
|
||||
bbb.publishVideo.cmbResolution.tooltip = Избери резолюция на камерата
|
||||
bbb.publishVideo.startPublishBtn.labelText = Стартиране на споделянето
|
||||
bbb.publishVideo.startPublishBtn.toolTip = Започни споделяне
|
||||
# bbb.publishVideo.startPublishBtn.errorName = Can't share webcam. Reason\: {0}
|
||||
bbb.publishVideo.startPublishBtn.errorName = Can't share webcam. Reason\: {0}
|
||||
bbb.webcamPermissions.chrome.title = Разрешения за камера под Chrome
|
||||
bbb.webcamPermissions.chrome.message1 = Натиснете за да позволите на Chrome да използва вашата камера
|
||||
bbb.videodock.title = Закачи видео
|
||||
@ -277,12 +278,12 @@ bbb.video.publish.hint.waitingApproval = Изчакване за одобрен
|
||||
bbb.video.publish.hint.videoPreview = Преглед на видео
|
||||
bbb.video.publish.hint.openingCamera = Отваряне на камера...
|
||||
bbb.video.publish.hint.cameraDenied = Няма достъп до камерата
|
||||
# bbb.video.publish.hint.cameraIsBeingUsed = Your webcam couldn't be opened - it may be under use by another application
|
||||
bbb.video.publish.hint.cameraIsBeingUsed = Your webcam couldn't be opened - it may be under use by another application
|
||||
bbb.video.publish.hint.publishing = Публикуване...
|
||||
bbb.video.publish.closeBtn.accessName = Прозорец Уебкамера Затвори прозорец
|
||||
bbb.video.publish.closeBtn.label = Отмени
|
||||
bbb.video.publish.titleBar = Прозорец Публикуване на камера
|
||||
# bbb.video.streamClose.toolTip = Close stream for\: {0}
|
||||
bbb.video.streamClose.toolTip = Close stream for\: {0}
|
||||
bbb.desktopPublish.title = Споделяне на екрана\: Представяне на Презентатора
|
||||
bbb.desktopPublish.fullscreen.tooltip = Споделете екрана си
|
||||
bbb.desktopPublish.fullscreen.label = На цял екран
|
||||
@ -292,15 +293,15 @@ bbb.desktopPublish.stop.tooltip = Затвори екрана за сподел
|
||||
bbb.desktopPublish.stop.label = Затвори
|
||||
bbb.desktopPublish.maximizeRestoreBtn.toolTip = Вие не можете да разширите този прозорец.
|
||||
bbb.desktopPublish.closeBtn.toolTip = Спиране на споделянето и затваряне
|
||||
# bbb.desktopPublish.chromeOnMacUnsupportedHint = Desktop sharing is not currently supported on Chrome running under Mac OS X. You must use a different web browser (Firefox recommended) to share your desktop.
|
||||
# bbb.desktopPublish.chrome42UnsupportedHint = Chrome no longer supports Java Applets. You must use a different web browser (Firefox recommended) to share your desktop.
|
||||
# bbb.desktopPublish.edgePluginUnsupportedHint = Edge does not support Java Applets. You must use a different web browser (Firefox recommended) to share your desktop.
|
||||
bbb.desktopPublish.chromeOnMacUnsupportedHint = Desktop sharing is not currently supported on Chrome running under Mac OS X. You must use a different web browser (Firefox recommended) to share your desktop.
|
||||
bbb.desktopPublish.chrome42UnsupportedHint = Chrome no longer supports Java Applets. You must use a different web browser (Firefox recommended) to share your desktop.
|
||||
bbb.desktopPublish.edgePluginUnsupportedHint = Edge does not support Java Applets. You must use a different web browser (Firefox recommended) to share your desktop.
|
||||
bbb.desktopPublish.minimizeBtn.toolTip = Минимизиране
|
||||
bbb.desktopPublish.minimizeBtn.accessibilityName = Минимизиране на прозореца Публикуване на споделен екран
|
||||
bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Увеличи прозорец Публикуване на споделен екран
|
||||
# bbb.desktopPublish.chromeHint.title = Chrome may need your permission.
|
||||
# bbb.desktopPublish.chromeHint.message = Select the plug-in icon (upper right-hand corner of Chrome), un-block plug-ins, and then select 'Retry'.
|
||||
# bbb.desktopPublish.chromeHint.button = Retry
|
||||
bbb.desktopPublish.chromeHint.title = Chrome may need your permission.
|
||||
bbb.desktopPublish.chromeHint.message = Select the plug-in icon (upper right-hand corner of Chrome), un-block plug-ins, and then select 'Retry'.
|
||||
bbb.desktopPublish.chromeHint.button = Retry
|
||||
bbb.desktopView.title = Споделяне на екрана
|
||||
bbb.desktopView.fitToWindow = Вмести в прозореца
|
||||
bbb.desktopView.actualSize = Покажи в реален размер
|
||||
@ -328,11 +329,11 @@ bbb.layout.combo.customName = Потребителски изглед
|
||||
bbb.layout.combo.remote = Отдалечен
|
||||
bbb.layout.save.complete = Изгледите бяха успешно съхранени
|
||||
bbb.layout.load.complete = Изгледите бяха успешно заредени
|
||||
# bbb.layout.load.failed = Unable to load the layouts
|
||||
bbb.layout.load.failed = Unable to load the layouts
|
||||
bbb.layout.name.defaultlayout = Стандартен изглед
|
||||
bbb.layout.name.videochat = Видео Чат
|
||||
# bbb.layout.name.webcamsfocus = Webcam Meeting
|
||||
# bbb.layout.name.presentfocus = Presentation Meeting
|
||||
bbb.layout.name.webcamsfocus = Webcam Meeting
|
||||
bbb.layout.name.presentfocus = Presentation Meeting
|
||||
bbb.layout.name.lectureassistant = Асистент
|
||||
bbb.layout.name.lecture = Лекция
|
||||
bbb.highlighter.toolbar.pencil = Молив
|
||||
@ -356,25 +357,25 @@ bbb.logout.button.label = ДА
|
||||
bbb.logout.appshutdown = Приложението на сървъра беше спряно
|
||||
bbb.logout.asyncerror = Възникнала е асинхронна грешка
|
||||
bbb.logout.connectionclosed = Връзката със сървъра е била затворена
|
||||
# bbb.logout.connectionfailed = The connection to the server has ended
|
||||
bbb.logout.connectionfailed = The connection to the server has ended
|
||||
bbb.logout.rejected = Връзката до сървъра беше отказана
|
||||
bbb.logout.invalidapp = Приложението red5 не съществува
|
||||
bbb.logout.unknown = Вашият клиент е загубил връзка със сървъра
|
||||
bbb.logout.usercommand = Вие сте излезли от конференцията
|
||||
# bbb.logout.ejectedFromMeeting = A moderator has kicked you out of the meeting.
|
||||
bbb.logout.ejectedFromMeeting = A moderator has kicked you out of the meeting.
|
||||
bbb.logout.refresh.message = Ако изходът от системата е неочакван, натиснете бутона по-долу, за да се свържете повторно.
|
||||
bbb.logout.refresh.label = Повторно свързване
|
||||
bbb.logout.confirm.title = Потвърдете, че искате да напуснете
|
||||
bbb.logout.confirm.message = Сигурни ли сте, че искате да напуснете?
|
||||
bbb.logout.confirm.yes = Да
|
||||
bbb.logout.confirm.no = Не
|
||||
# bbb.connection.failure=Detected Connectivity Problems
|
||||
# bbb.connection.reconnecting=Reconnecting
|
||||
# bbb.connection.reestablished=Connection reestablished
|
||||
# bbb.connection.bigbluebutton=BigBlueButton
|
||||
# bbb.connection.sip=SIP
|
||||
# bbb.connection.video=Video
|
||||
# bbb.connection.deskshare=Deskshare
|
||||
bbb.connection.failure=Detected Connectivity Problems
|
||||
bbb.connection.reconnecting=Reconnecting
|
||||
bbb.connection.reestablished=Connection reestablished
|
||||
bbb.connection.bigbluebutton=BigBlueButton
|
||||
bbb.connection.sip=SIP
|
||||
bbb.connection.video=Video
|
||||
bbb.connection.deskshare=Deskshare
|
||||
bbb.notes.title = Бележки
|
||||
bbb.notes.cmpColorPicker.toolTip = Цвят на текста
|
||||
bbb.notes.saveBtn = Съхрани
|
||||
@ -404,7 +405,7 @@ ltbcustom.bbb.highlighter.toolbar.text.accessibilityName = Превключи о
|
||||
ltbcustom.bbb.highlighter.texttoolbar.textColorPicker = Цвят на текст
|
||||
ltbcustom.bbb.highlighter.texttoolbar.textSizeMenu = Размер на шрифта
|
||||
|
||||
# bbb.accessibility.clientReady = Ready
|
||||
bbb.accessibility.clientReady = Ready
|
||||
|
||||
bbb.accessibility.chat.chatBox.reachedFirst = Достигнали сте до първото съобщение.
|
||||
bbb.accessibility.chat.chatBox.reachedLatest = Достигнали сте до последното съобщение.
|
||||
@ -412,7 +413,7 @@ bbb.accessibility.chat.chatBox.navigatedFirst = Преминали сте на
|
||||
bbb.accessibility.chat.chatBox.navigatedLatest = Преминали сте към най-последното съобщение.
|
||||
bbb.accessibility.chat.chatBox.navigatedLatestRead = Преминали сте към оследното съобщение, което сте чели.
|
||||
bbb.accessibility.chat.chatwindow.input = Въвеждане в чата
|
||||
# bbb.accessibility.chat.chatwindow.audibleChatNotification = Audible Chat Notification
|
||||
bbb.accessibility.chat.chatwindow.audibleChatNotification = Audible Chat Notification
|
||||
|
||||
bbb.accessibility.chat.initialDescription = Моля използвайте стрелките на клавиатурата за навигация в съобщенията
|
||||
|
||||
@ -504,8 +505,8 @@ bbb.shortcutkey.chat.changeColour = 67
|
||||
bbb.shortcutkey.chat.changeColour.function = Превключи към палитрата.
|
||||
bbb.shortcutkey.chat.sendMessage = 83
|
||||
bbb.shortcutkey.chat.sendMessage.function = Изпрати съобщение
|
||||
# bbb.shortcutkey.chat.closePrivate = 69
|
||||
# bbb.shortcutkey.chat.closePrivate.function = Close private chat tab
|
||||
bbb.shortcutkey.chat.closePrivate = 69
|
||||
bbb.shortcutkey.chat.closePrivate.function = Close private chat tab
|
||||
bbb.shortcutkey.chat.explanation = ----
|
||||
bbb.shortcutkey.chat.explanation.function = За навигиране на съобщения, трябва да фокусирате върху чат кутията.
|
||||
|
||||
@ -524,28 +525,28 @@ bbb.shortcutkey.chat.chatbox.goread.function = Преминете към пос
|
||||
bbb.shortcutkey.chat.chatbox.debug = 71
|
||||
bbb.shortcutkey.chat.chatbox.debug.function = Временна дебъг клавишна комбинация
|
||||
|
||||
# bbb.polling.startButton.tooltip = Start a poll
|
||||
# bbb.polling.startButton.label = Start Poll
|
||||
bbb.polling.startButton.tooltip = Start a poll
|
||||
bbb.polling.startButton.label = Start Poll
|
||||
bbb.polling.publishButton.label = Публикувай
|
||||
bbb.polling.closeButton.label = Затвори
|
||||
# bbb.polling.pollModal.title = Live Poll Results
|
||||
# bbb.polling.customChoices.title = Enter Polling Choices
|
||||
# bbb.polling.respondersLabel.novotes = Waiting for responses
|
||||
# bbb.polling.respondersLabel.text = {0} Users Responded
|
||||
# bbb.polling.respondersLabel.finished = Done
|
||||
bbb.polling.pollModal.title = Live Poll Results
|
||||
bbb.polling.customChoices.title = Enter Polling Choices
|
||||
bbb.polling.respondersLabel.novotes = Waiting for responses
|
||||
bbb.polling.respondersLabel.text = {0} Users Responded
|
||||
bbb.polling.respondersLabel.finished = Done
|
||||
bbb.polling.answer.Yes = Да
|
||||
bbb.polling.answer.No = Не
|
||||
# bbb.polling.answer.True = True
|
||||
# bbb.polling.answer.False = False
|
||||
# bbb.polling.answer.A = A
|
||||
# bbb.polling.answer.B = B
|
||||
# bbb.polling.answer.C = C
|
||||
# bbb.polling.answer.D = D
|
||||
# bbb.polling.answer.E = E
|
||||
# bbb.polling.answer.F = F
|
||||
# bbb.polling.answer.G = G
|
||||
# bbb.polling.results.accessible.header = Poll Results.
|
||||
# bbb.polling.results.accessible.answer = Answer {0} had {1} votes.
|
||||
bbb.polling.answer.True = True
|
||||
bbb.polling.answer.False = False
|
||||
bbb.polling.answer.A = A
|
||||
bbb.polling.answer.B = B
|
||||
bbb.polling.answer.C = C
|
||||
bbb.polling.answer.D = D
|
||||
bbb.polling.answer.E = E
|
||||
bbb.polling.answer.F = F
|
||||
bbb.polling.answer.G = G
|
||||
bbb.polling.results.accessible.header = Poll Results.
|
||||
bbb.polling.results.accessible.answer = Answer {0} had {1} votes.
|
||||
|
||||
bbb.publishVideo.startPublishBtn.labelText = Стартиране на споделянето
|
||||
bbb.publishVideo.changeCameraBtn.labelText = Смяна на камерата
|
||||
@ -582,5 +583,5 @@ bbb.lockSettings.microphone = Микрофон
|
||||
bbb.lockSettings.layout = Изглед
|
||||
bbb.lockSettings.title=Заключи потребителите
|
||||
bbb.lockSettings.feature=Функционалност
|
||||
# bbb.lockSettings.locked=Locked
|
||||
# bbb.lockSettings.lockOnJoin=Lock On Join
|
||||
bbb.lockSettings.locked=Locked
|
||||
bbb.lockSettings.lockOnJoin=Lock On Join
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user