From 57b7de8b36d5e1c129f57052a4f5bd96b21b566b Mon Sep 17 00:00:00 2001 From: Richard Alam <ritzalam@gmail.com> Date: Sun, 24 Aug 2014 12:12:29 -0700 Subject: [PATCH] - stop sharing from server side instead of destroing the applet from the client side --- .../resources/prod/lib/bbb_deskshare.js | 1 - .../deskshare/managers/DeskshareManager.as | 9 ++- .../deskshare/services/DeskshareService.as | 11 +++- .../deskshare/services/red5/Connection.as | 4 ++ .../session/ISessionManagerGateway.java | 2 + .../BlockStreamEventMessageHandler.java | 19 +++++-- .../sessions/SessionManagerGateway.scala | 20 ++++++- .../server/sessions/SessionManagerSVC.scala | 55 +++++++++++++------ .../server/stream/DeskshareService.scala | 5 ++ .../client/net/NetworkSocketStreamSender.java | 1 - 10 files changed, 97 insertions(+), 30 deletions(-) mode change 100755 => 100644 bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/managers/DeskshareManager.as mode change 100755 => 100644 bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/services/DeskshareService.as mode change 100755 => 100644 deskshare/app/src/main/java/org/bigbluebutton/deskshare/server/session/ISessionManagerGateway.java mode change 100755 => 100644 deskshare/app/src/main/java/org/bigbluebutton/deskshare/server/socket/BlockStreamEventMessageHandler.java mode change 100755 => 100644 deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/sessions/SessionManagerGateway.scala mode change 100755 => 100644 deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/sessions/SessionManagerSVC.scala mode change 100755 => 100644 deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/stream/DeskshareService.scala mode change 100755 => 100644 deskshare/applet/src/main/java/org/bigbluebutton/deskshare/client/net/NetworkSocketStreamSender.java diff --git a/bigbluebutton-client/resources/prod/lib/bbb_deskshare.js b/bigbluebutton-client/resources/prod/lib/bbb_deskshare.js index 113f8dc9e8..1212645c30 100644 --- a/bigbluebutton-client/resources/prod/lib/bbb_deskshare.js +++ b/bigbluebutton-client/resources/prod/lib/bbb_deskshare.js @@ -28,7 +28,6 @@ function setScreenCoordinates(x, y) { } function stopApplet(){ - document.DeskShareApplet.destroy(); removeFrame(); } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/managers/DeskshareManager.as b/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/managers/DeskshareManager.as old mode 100755 new mode 100644 index 8542036091..b2ab3755c0 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/managers/DeskshareManager.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/managers/DeskshareManager.as @@ -61,7 +61,12 @@ package org.bigbluebutton.modules.deskshare.managers viewWindowManager.stopViewing(); service.disconnect(); } - + + public function handleStreamStoppedEvent():void { + LogUtil.debug("Sending deskshare stopped command"); + service.stopSharingDesktop(module.getRoom(), module.getRoom()); + } + public function handleStreamStartedEvent(videoWidth:Number, videoHeight:Number):void { LogUtil.debug("Sending startViewing command"); service.sendStartViewingNotification(videoWidth, videoHeight); @@ -125,5 +130,7 @@ package org.bigbluebutton.modules.deskshare.managers LogUtil.debug("Received start vieweing command"); viewWindowManager.startViewing(module.getRoom(), videoWidth, videoHeight); } + + } } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/services/DeskshareService.as b/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/services/DeskshareService.as old mode 100755 new mode 100644 index cf6a3a4df3..fc0910b8d9 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/services/DeskshareService.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/services/DeskshareService.as @@ -18,8 +18,10 @@ */ package org.bigbluebutton.modules.deskshare.services { - import com.asfusion.mate.events.Dispatcher; - import flash.net.NetConnection; + import com.asfusion.mate.events.Dispatcher; + + import flash.net.NetConnection; + import org.bigbluebutton.common.LogUtil; import org.bigbluebutton.modules.deskshare.services.red5.Connection; @@ -75,5 +77,10 @@ package org.bigbluebutton.modules.deskshare.services public function sendStartedViewingNotification(stream:String):void{ conn.sendStartedViewingNotification(stream); } + + public function stopSharingDesktop(meetingId: String, stream: String):void { + conn.stopSharingDesktop(meetingId, stream); + } + } } \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/services/red5/Connection.as b/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/services/red5/Connection.as index e9f3a56bb3..d01dbe39b8 100644 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/services/red5/Connection.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/services/red5/Connection.as @@ -313,6 +313,10 @@ package org.bigbluebutton.modules.deskshare.services.red5 nc.call("deskshare.startedToViewStream", null, stream); } + public function stopSharingDesktop(meetingId: String, stream: String):void { + nc.call("deskshare.stopSharingDesktop", null, meetingId); + } + /** * Called by the server when a notification is received to start viewing the broadcast stream . * This method is called on successful execution of sendStartViewingNotification() diff --git a/deskshare/app/src/main/java/org/bigbluebutton/deskshare/server/session/ISessionManagerGateway.java b/deskshare/app/src/main/java/org/bigbluebutton/deskshare/server/session/ISessionManagerGateway.java old mode 100755 new mode 100644 index b28755b4c9..25b680a3f0 --- a/deskshare/app/src/main/java/org/bigbluebutton/deskshare/server/session/ISessionManagerGateway.java +++ b/deskshare/app/src/main/java/org/bigbluebutton/deskshare/server/session/ISessionManagerGateway.java @@ -35,4 +35,6 @@ public interface ISessionManagerGateway { public void updateBlock(String room, int position, byte[] blockData, boolean keyframe, int seqNum); public void updateMouseLocation(String room, Point loc, int seqNum); + + public boolean isSharingStopped(String meetingId); } diff --git a/deskshare/app/src/main/java/org/bigbluebutton/deskshare/server/socket/BlockStreamEventMessageHandler.java b/deskshare/app/src/main/java/org/bigbluebutton/deskshare/server/socket/BlockStreamEventMessageHandler.java old mode 100755 new mode 100644 index 71824e322b..81d084e2d2 --- a/deskshare/app/src/main/java/org/bigbluebutton/deskshare/server/socket/BlockStreamEventMessageHandler.java +++ b/deskshare/app/src/main/java/org/bigbluebutton/deskshare/server/socket/BlockStreamEventMessageHandler.java @@ -44,12 +44,12 @@ public class BlockStreamEventMessageHandler extends IoHandlerAdapter { } private void closeSession(IoSession session) { - String room = (String)session.getAttribute(ROOM, null); - if (room != null) { - log.info("Closing session [" + room + "]. "); - } else { - log.info("Cannot determine session to close."); - } + String room = (String)session.getAttribute(ROOM, null); + if (room != null) { + log.info("Closing session [" + room + "]. "); + } else { + log.info("Cannot determine session to close."); + } CloseFuture future = session.close(true); } @@ -64,6 +64,13 @@ public class BlockStreamEventMessageHandler extends IoHandlerAdapter { // System.out.println("Got CaptureUpdateBlockEvent"); CaptureUpdateBlockEvent event = (CaptureUpdateBlockEvent) message; sessionManager.updateBlock(event.getRoom(), event.getPosition(), event.getVideoData(), event.isKeyFrame(), event.getSequenceNum()); + if (sessionManager.isSharingStopped(event.getRoom())) { + // The flash client told us to stop sharing. Force stopping by closing connection from applet. + // We're changing how to tell the applet to stop sharing as AS ExternalInterface to JS to Applet calls + // generates a popup dialog that users may or may not see causing the browser to hang. (ralam aug 24, 2014) + log.info("Sharing has stopped for meeting [" + event.getRoom() + "]. Closing connection."); + session.close(true); + } } else if (message instanceof CaptureEndBlockEvent) { CaptureEndBlockEvent event = (CaptureEndBlockEvent) message; sessionManager.removeSession(event.getRoom(), event.getSequenceNum()); diff --git a/deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/sessions/SessionManagerGateway.scala b/deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/sessions/SessionManagerGateway.scala old mode 100755 new mode 100644 index 7f135603c1..92b4b06586 --- a/deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/sessions/SessionManagerGateway.scala +++ b/deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/sessions/SessionManagerGateway.scala @@ -30,7 +30,7 @@ class SessionManagerGateway(streamManager: StreamManager, keyFrameInterval: Int, streamManager.start val sessionManager: SessionManagerSVC = new SessionManagerSVC(streamManager, keyFrameInterval, interframeInterval, waitForAllBlocks) - sessionManager.start + sessionManager.start def createSession(room: String, screenDim: org.bigbluebutton.deskshare.common.Dimension, blockDim: org.bigbluebutton.deskshare.common.Dimension, seqNum: Int, useSVC2: Boolean): Unit = { log.info("SessionManagerGateway:createSession for %s", room) @@ -56,4 +56,22 @@ class SessionManagerGateway(streamManager: StreamManager, keyFrameInterval: Int, log.info("SessionManagerGateway:sendKeyFrame for %s", room) sessionManager ! new SendKeyFrame(room) } + + def stopSharingDesktop(meetingId: String, stream: String) { + sessionManager ! new StopSharingDesktop(meetingId, stream) + } + + def isSharingStopped(meetingId: String): Boolean = { + var stopped = false + sessionManager !? (3000, IsSharingStopped(meetingId)) match { + case None => stopped = true + case Some(rep) => { + val reply = rep.asInstanceOf[IsSharingStoppedReply] + stopped = reply.stopped + } + } + + stopped + } + } diff --git a/deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/sessions/SessionManagerSVC.scala b/deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/sessions/SessionManagerSVC.scala old mode 100755 new mode 100644 index 9cdedda80f..e8d3ba7d42 --- a/deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/sessions/SessionManagerSVC.scala +++ b/deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/sessions/SessionManagerSVC.scala @@ -21,7 +21,6 @@ package org.bigbluebutton.deskshare.server.sessions import scala.actors.Actor import scala.actors.Actor._ import net.lag.logging.Logger - import scala.collection.mutable.HashMap import org.bigbluebutton.deskshare.server.svc1.Dimension import org.bigbluebutton.deskshare.server.stream.StreamManager @@ -32,25 +31,45 @@ case class RemoveSession(room: String) case class SendKeyFrame(room: String) case class UpdateBlock(room: String, position: Int, blockData: Array[Byte], keyframe: Boolean, seqNum: Int) case class UpdateMouseLocation(room: String, mouseLoc:Point, seqNum: Int) +case class StopSharingDesktop(meetingId: String, stream: String) +case class IsSharingStopped(meetingId: String) +case class IsSharingStoppedReply(meetingId: String, stopped: Boolean) class SessionManagerSVC(streamManager: StreamManager, keyFrameInterval: Int, interframeInterval: Int, waitForAllBlocks: Boolean) extends Actor { private val log = Logger.get private val sessions = new HashMap[String, SessionSVC] - + private val stoppedSessions = new HashMap[String, String] + def act() = { loop { react { - case c: CreateSession => createSession(c); printMailbox("CreateSession") - case r: RemoveSession => removeSession(r.room); printMailbox("RemoveSession") - case k: SendKeyFrame => sendKeyFrame(k.room); printMailbox("SendKeyFrame") - case ub: UpdateBlock => updateBlock(ub.room, ub.position, ub.blockData, ub.keyframe, ub.seqNum) - case ml: UpdateMouseLocation => updateMouseLocation(ml.room, ml.mouseLoc, ml.seqNum) - case m: Any => log.warning("SessionManager: Unknown message " + m); printMailbox("Any") + case msg: CreateSession => createSession(msg); printMailbox("CreateSession") + case msg: RemoveSession => removeSession(msg.room); printMailbox("RemoveSession") + case msg: SendKeyFrame => sendKeyFrame(msg.room); printMailbox("SendKeyFrame") + case msg: UpdateBlock => updateBlock(msg.room, msg.position, msg.blockData, msg.keyframe, msg.seqNum) + case msg: UpdateMouseLocation => updateMouseLocation(msg.room, msg.mouseLoc, msg.seqNum) + case msg: StopSharingDesktop => handleStopSharingDesktop(msg) + case msg: IsSharingStopped => handleIsSharingStopped(msg) + + case msg: Any => log.warning("SessionManager: Unknown message " + msg); printMailbox("Any") } } } + private def handleStopSharingDesktop(msg: StopSharingDesktop) { + sessions.get(msg.meetingId) foreach { s => + stoppedSessions += msg.meetingId -> msg.stream + } + } + + private def handleIsSharingStopped(msg: IsSharingStopped) { + stoppedSessions.get(msg.meetingId) match { + case Some(s) => reply(new IsSharingStoppedReply(msg.meetingId, true)) + case None => reply(new IsSharingStoppedReply(msg.meetingId, false)) + } + } + private def printMailbox(caseMethod: String) { log.debug("SessionManager: mailbox %d message %s", mailboxSize, caseMethod) } @@ -84,16 +103,16 @@ class SessionManagerSVC(streamManager: StreamManager, keyFrameInterval: Int, int } } - private def removeSession(room: String): Unit = { - log.debug("SessionManager: Removing session " + room); - sessions.get(room) match { - case Some(s) => { - s ! StopSession; log.debug("++++ REMOVE SESSION +++%s", room); - val old:Int = sessions.size - sessions -= room; - log.debug("RemoveSession: Session length [%d,%d]", old, sessions.size) - } - case None => log.warning("SessionManager: Could not remove session %s. Does not exist.", room) + private def removeSession(meetingId: String): Unit = { + log.debug("SessionManager: Removing session " + meetingId); + sessions.get(meetingId) foreach { s => + s ! StopSession; log.debug("++++ REMOVE SESSION +++%s", meetingId); + val old:Int = sessions.size + sessions -= meetingId; + log.debug("RemoveSession: Session length [%d,%d]", old, sessions.size) + stoppedSessions.get(meetingId) foreach {ss => + stoppedSessions -= meetingId + } } } diff --git a/deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/stream/DeskshareService.scala b/deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/stream/DeskshareService.scala old mode 100755 new mode 100644 index cdb749544e..5941e86f39 --- a/deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/stream/DeskshareService.scala +++ b/deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/stream/DeskshareService.scala @@ -55,4 +55,9 @@ class DeskshareService(streamManager: StreamManager, sessionGateway: SessionMana log.debug("DeskshareService: Started viewing stream for room %s", stream) sessionGateway.sendKeyFrame(stream) } + + def stopSharingDesktop(meetingId: String) { + log.debug("DeskshareService: Stop sharing for meeting [%s]", meetingId) + sessionGateway.stopSharingDesktop(meetingId, meetingId) + } } diff --git a/deskshare/applet/src/main/java/org/bigbluebutton/deskshare/client/net/NetworkSocketStreamSender.java b/deskshare/applet/src/main/java/org/bigbluebutton/deskshare/client/net/NetworkSocketStreamSender.java old mode 100755 new mode 100644 index 59528ba0f3..5c51bb5e40 --- a/deskshare/applet/src/main/java/org/bigbluebutton/deskshare/client/net/NetworkSocketStreamSender.java +++ b/deskshare/applet/src/main/java/org/bigbluebutton/deskshare/client/net/NetworkSocketStreamSender.java @@ -25,7 +25,6 @@ import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; import java.util.Vector; - import org.bigbluebutton.deskshare.client.ExitCode; import org.bigbluebutton.deskshare.common.Dimension; -- GitLab