Author: solomax
Date: Fri Mar 10 10:19:06 2017
New Revision: 1786321

URL: http://svn.apache.org/viewvc?rev=1786321&view=rev
Log:
[OPENMEETINGS-1598] disabled for AV devices seems to work

Modified:
    
openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MainService.java
    
openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java
    
openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/UserService.java
    
openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
    
openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/video/editRecordStreamSWF10.lzx
    
openmeetings/application/branches/3.2.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java
    
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
    
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java
    
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MainService.java
    
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java
    
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/UserService.java
    
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
    
openmeetings/application/trunk/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java
    
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
    
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MainService.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MainService.java?rev=1786321&r1=1786320&r2=1786321&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MainService.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MainService.java
 Fri Mar 10 10:19:06 2017
@@ -242,29 +242,6 @@ public class MainService implements IPen
                return new Long(-1);
        }
 
-       /**
-        * clear this session id
-        *
-        * @param sid
-        * @return string value if completed
-        */
-       public Long logoutUser(String sid) {
-               try {
-                       Sessiondata sd = sessionDao.check(sid);
-                       IConnection current = Red5.getConnectionLocal();
-                       Client currentClient = 
sessionManager.getClientByStreamId(current.getClient().getId(), null);
-
-                       
scopeApplicationAdapter.roomLeaveByScope(currentClient,current.getScope(), 
false);
-
-                       currentClient.setUserObject(null, null, null, null);
-
-                       return userManager.logout(sid, sd.getUserId());
-               } catch (Exception err) {
-                       log.error("[logoutUser]",err);
-               }
-               return -1L;
-       }
-
        public List<Configuration> getGeneralOptions() {
                try {
                        return configurationDao.get("exclusive.audio.keycode", 
CONFIG_SIP_ENABLED, CONFIG_MAX_UPLOAD_SIZE_KEY, "mute.keycode", 
CONFIG_REDIRECT_URL_FOR_EXTERNAL_KEY);

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java?rev=1786321&r1=1786320&r2=1786321&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java
 Fri Mar 10 10:19:06 2017
@@ -248,7 +248,7 @@ public class RecordingService implements
         *
         * @param conn
         */
-       public void stopRecordingShow(IConnection conn, String broadcastId, 
Long metaId) {
+       public void stopRecordingShow(IScope scope, String broadcastId, Long 
metaId) {
                try {
                        if (metaId == null) {
                                // this should be fixed, can be useful for 
debugging, after all this is an error
@@ -256,10 +256,10 @@ public class RecordingService implements
                                log.error("recordingMetaDataId is null");
                        }
 
-                       log.debug("** stopRecordingShow: " + conn);
-                       log.debug("### Stop recording show for broadcastId: " + 
broadcastId + " || " + conn.getScope().getContextPath());
+                       log.debug("** stopRecordingShow: " + scope);
+                       log.debug("### Stop recording show for broadcastId: " + 
broadcastId + " || " + scope.getContextPath());
 
-                       Object streamToClose = 
scopeApplicationAdapter.getBroadcastStream(conn.getScope(), broadcastId);
+                       Object streamToClose = 
scopeApplicationAdapter.getBroadcastStream(scope, broadcastId);
 
                        StreamListener listenerAdapter = 
streamListeners.get(metaId);
 
@@ -327,14 +327,14 @@ public class RecordingService implements
                                                if (rcl.isScreenClient()) {
                                                        if 
(rcl.getRecordingId() != null && rcl.isScreenPublishStarted()) {
                                                                // Stop FLV 
Recording
-                                                               
stopRecordingShow(conn, rcl.getStreamPublishName(), 
rcl.getRecordingMetaDataId());
+                                                               
stopRecordingShow(scope, rcl.getStreamPublishName(), 
rcl.getRecordingMetaDataId());
 
                                                                // Update Meta 
Data
                                                                
metaDataDao.updateEndDate(rcl.getRecordingMetaDataId(), new Date());
                                                        }
                                                } else if 
(rcl.getAvsettings().equals("av") || rcl.getAvsettings().equals("a") || 
rcl.getAvsettings().equals("v")) {
 
-                                                       stopRecordingShow(conn, 
String.valueOf(rcl.getBroadCastID()).toString(), rcl.getRecordingMetaDataId());
+                                                       
stopRecordingShow(scope, String.valueOf(rcl.getBroadCastID()).toString(), 
rcl.getRecordingMetaDataId());
 
                                                        // Update Meta Data
                                                        
metaDataDao.updateEndDate(rcl.getRecordingMetaDataId(), new Date());
@@ -397,7 +397,7 @@ public class RecordingService implements
                return null;
        }
 
-       public void stopRecordingShowForClient(IConnection conn, Client rcl) {
+       public void stopRecordingShowForClient(IScope scope, Client rcl) {
                try {
                        // this cannot be handled here, as to stop a stream and 
to leave a
                        // room is not
@@ -414,7 +414,7 @@ public class RecordingService implements
                                        // FIXME: Is there really a need to 
stop it manually if the
                                        // user just
                                        // stops the stream?
-                                       stopRecordingShow(conn, 
rcl.getStreamPublishName(), rcl.getRecordingMetaDataId());
+                                       stopRecordingShow(scope, 
rcl.getStreamPublishName(), rcl.getRecordingMetaDataId());
 
                                        // Update Meta Data
                                        
metaDataDao.updateEndDate(rcl.getRecordingMetaDataId(), new Date());
@@ -424,7 +424,7 @@ public class RecordingService implements
 
                                // FIXME: Is there really a need to stop it 
manually if the user
                                // just stops the stream?
-                               stopRecordingShow(conn, 
String.valueOf(rcl.getBroadCastID()), rcl.getRecordingMetaDataId());
+                               stopRecordingShow(scope, 
String.valueOf(rcl.getBroadCastID()), rcl.getRecordingMetaDataId());
 
                                // Update Meta Data
                                
metaDataDao.updateEndDate(rcl.getRecordingMetaDataId(), new Date());

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/UserService.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/UserService.java?rev=1786321&r1=1786320&r2=1786321&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/UserService.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/UserService.java
 Fri Mar 10 10:19:06 2017
@@ -146,7 +146,7 @@ public class UserService implements IUse
                                        messageObj.put(0, "kick");
                                        
scopeApplicationAdapter.sendMessageById(messageObj, streamid, currentScope);
 
-                                       
scopeApplicationAdapter.roomLeaveByScope(rcl, currentScope, true);
+                                       
scopeApplicationAdapter.roomLeaveByScope(rcl, currentScope);
 
                                        return true;
                                } else {
@@ -199,7 +199,7 @@ public class UserService implements IUse
                                messageObj.put(0, "kick");
 
                                
scopeApplicationAdapter.sendMessageById(messageObj, rcl.getStreamid(), 
currentScope);
-                               scopeApplicationAdapter.roomLeaveByScope(rcl, 
currentScope, true);
+                               scopeApplicationAdapter.roomLeaveByScope(rcl, 
currentScope);
 
                                return true;
                        }

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java?rev=1786321&r1=1786320&r2=1786321&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
 Fri Mar 10 10:19:06 2017
@@ -443,7 +443,7 @@ public class ScopeApplicationAdapter ext
                                        returnMap.put("alreadyPublished", true);
                                }
 
-                               log.debug(String.format("screen 
x,y,width,height %s,%s,%s,%s", client.getVX(), client.getVY(), 
client.getVWidth(), client.getVHeight()));
+                               log.debug("screen x,y,width,height 
{},{},{},{}", client.getVX(), client.getVY(), client.getVWidth(), 
client.getVHeight());
 
                                if (startStreaming) {
                                        if (!alreadyStreaming) {
@@ -559,43 +559,27 @@ public class ScopeApplicationAdapter ext
        @Override
        public void roomLeave(IClient client, IScope room) {
                try {
-                       log.debug(String.format("roomLeave %s %s %s %s", 
client.getId(), room.getClients().size(), room.getContextPath(), 
room.getName()));
+                       log.debug("[roomLeave] {} {} {} {}", client.getId(), 
room.getClients().size(), room.getContextPath(), room.getName());
 
-                       Client currentClient = 
sessionManager.getClientByStreamId(client.getId(), null);
+                       Client rcl = 
sessionManager.getClientByStreamId(client.getId(), null);
 
                        // The Room Client can be null if the Client left the 
room by using
                        // logicalRoomLeave
-                       if (currentClient != null) {
+                       if (rcl != null) {
                                log.debug("currentClient IS NOT NULL");
-                               roomLeaveByScope(currentClient, room, true);
+                               roomLeaveByScope(rcl, room);
                        }
                } catch (Exception err) {
                        log.error("[roomLeave]", err);
                }
        }
 
-       /**
-        * this means a user has left a room but only logically, he didn't 
leave the
-        * app he just left the room
-        *
-        * FIXME: Is this really needed anymore if you re-connect to another 
scope?
-        *
-        * Exit Room by Application
-        *
-        */
-       public void logicalRoomLeave() {
-               log.debug("logicalRoomLeave ");
-               try {
-                       IConnection current = Red5.getConnectionLocal();
-                       String streamid = current.getClient().getId();
-
-                       log.debug(streamid + " is leaving");
-
-                       Client currentClient = 
sessionManager.getClientByStreamId(streamid, null);
-
-                       roomLeaveByScope(currentClient, current.getScope(), 
true);
-               } catch (Exception err) {
-                       log.error("[logicalRoomLeave]", err);
+       public void roomLeaveByScope(String uid, Long roomId) {
+               Client rcl = sessionManager.getClientByPublicSID(uid, null);
+               IScope scope = getRoomScope("" + roomId);
+               log.debug("[roomLeaveByScope] {} {} {} {}", uid, roomId, rcl, 
scope);
+               if (rcl != null && scope != null) {
+                       roomLeaveByScope(rcl, scope);
                }
        }
 
@@ -609,9 +593,9 @@ public class ScopeApplicationAdapter ext
         * @param client
         * @param scope
         */
-       public void roomLeaveByScope(Client client, IScope scope, boolean 
removeUserFromSessionList) {
+       public void roomLeaveByScope(Client client, IScope scope) {
                try {
-                       log.debug("currentClient " + client);
+                       log.debug("[roomLeaveByScope] currentClient " + client);
                        Long roomId = client.getRoomId();
 
                        if (client.isScreenClient() && 
client.isStartStreaming()) {
@@ -642,59 +626,30 @@ public class ScopeApplicationAdapter ext
                                        client.setIsRecording(true);
                                }
                        }
+                       recordingService.stopRecordingShowForClient(scope, 
client);
 
                        // Notify all clients of the same currentScope (room) 
with domain
                        // and room except the current disconnected cause it 
could throw an exception
                        log.debug("currentScope " + scope);
 
-                       if (scope != null && scope.getClientConnections() != 
null) {
-                               // Notify Users of the current Scope
-                               for (IConnection cons : 
scope.getClientConnections()) {
-                                       if (cons != null && cons instanceof 
IServiceCapableConnection) {
-                                               log.debug("sending 
roomDisconnect to {}  client id {}", cons, cons.getClient().getId());
-
-                                               Client rcl = 
sessionManager.getClientByStreamId(cons.getClient().getId(), null);
-
-                                               // Check if the Client does 
still exist on the list
-                                               if (rcl == null) {
-                                                       log.debug("For this 
StreamId: " + cons.getClient().getId() + " There is no Client in the List 
anymore");
-                                                       continue;
-                                               }
-
-                                               //Do not send back to sender, 
but actually all other clients should receive this message swagner 01.10.2009
-                                               if 
(!client.getStreamid().equals(rcl.getStreamid())) {
-                                                       // add Notification if 
another user isrecording
-                                                       
log.debug("###########[roomLeaveByScope]");
-                                                       if 
(rcl.getIsRecording()) {
-                                                               log.debug("*** 
roomLeave Any Client is Recording - stop that");
-                                                               
recordingService.stopRecordingShowForClient(cons, client);
-                                                       }
-
-                                                       boolean isScreen = 
rcl.isScreenClient();
-                                                       if (isScreen && 
client.getPublicSID().equals(rcl.getStreamPublishName())) {
-                                                               //going to 
terminate screen sharing started by this client
-                                                               
((IServiceCapableConnection) cons).invoke("stopStream", new Object[] { },this);
-                                                               continue;
-                                                       } else if (isScreen) {
-                                                               // screen 
sharing clients do not receive events
-                                                               continue;
-                                                       }
-
-                                                       // Send to all 
connected users
-                                                       
((IServiceCapableConnection) cons).invoke("roomDisconnect", new Object[] { 
client },this);
-                                                       log.debug("sending 
roomDisconnect to " + cons);
-                                               }
-                                       }
+                       new MessageSender(scope, "roomDisconnect", client, 
this) {
+                               @Override
+                               public boolean filter(IConnection conn) {
+                                       Client rcl = 
sessionManager.getClientByStreamId(conn.getClient().getId(), null);
+                                       boolean isScreen = rcl.isScreenClient();
+                                       if (isScreen && 
client.getPublicSID().equals(rcl.getStreamPublishName())) {
+                                               //going to terminate screen 
sharing started by this client
+                                               ((IServiceCapableConnection) 
conn).invoke("stopStream", new Object[] { }, callback);
+                                       }                                       
// TODO Auto-generated method stub
+                                       return rcl == null || isScreen;
                                }
-                       }
+                       }.start();
 
                        if (client.isMobile()) {
                                IApplication app = 
(IApplication)Application.get(OpenmeetingsVariables.wicketApplicationName);
                                app.exit(client.getPublicSID());
                        }
-                       if (removeUserFromSessionList) {
-                               
sessionManager.removeClient(client.getStreamid(), null);
-                       }
+                       sessionManager.removeClient(client.getStreamid(), null);
                } catch (Exception err) {
                        log.error("[roomLeaveByScope]", err);
                }
@@ -800,32 +755,14 @@ public class ScopeApplicationAdapter ext
         */
        @Override
        public void streamBroadcastClose(IBroadcastStream stream) {
-
                // Notify all the clients that the stream had been closed
                log.debug("start streamBroadcastClose broadcast close: " + 
stream.getPublishedName());
                try {
                        IConnection current = Red5.getConnectionLocal();
-                       Client rcl = 
sessionManager.getClientByStreamId(current.getClient().getId(), null);
-                       sendClientBroadcastNotifications(stream, "closeStream", 
rcl);
-               } catch (Exception e) {
-                       log.error("[streamBroadcastClose]", e);
-               }
-       }
-
-       /**
-        * This method handles the notification room-based
-        *
-        * @return void
-        *
-        */
-       private void sendClientBroadcastNotifications(IBroadcastStream stream, 
String clientFunction, Client rc) {
-               try {
-                       // Store the local so that we do not send notification 
to ourself back
-                       IConnection current = Red5.getConnectionLocal();
-                       String streamid = current.getClient().getId();
-                       Client currentClient = 
sessionManager.getClientByStreamId(streamid, null);
+                       String streamId = current.getClient().getId();
+                       Client rcl = 
sessionManager.getClientByStreamId(streamId, null);
 
-                       if (currentClient == null) {
+                       if (rcl == null) {
 
                                // In case the client has already left(kicked) 
this message
                                // might be thrown later then the RoomLeave
@@ -837,55 +774,20 @@ public class ScopeApplicationAdapter ext
 
                        }
                        // Notify all the clients that the stream had been 
started
-                       log.debug("sendClientBroadcastNotifications: " + 
stream.getPublishedName());
-                       log.debug("sendClientBroadcastNotifications : " + 
currentClient + " " + currentClient.getStreamid());
-
+                       log.debug("streamBroadcastClose : " + rcl + " " + 
rcl.getStreamid());
+                       // this close stream event, stop the recording of this 
stream
+                       if (rcl.getIsRecording()) {
+                               log.debug("***  +++++++ ######## 
sendClientBroadcastNotifications Any Client is Recording - stop that");
+                               
recordingService.stopRecordingShowForClient(current.getScope(), rcl);
+                       }
+                       rcl.setBroadCastID(-1);
+                       rcl.setIsBroadcasting(false);
+                       rcl.setAvsettings("n");
+                       sessionManager.updateClientByStreamId(streamId, rcl, 
false, null);
                        // Notify all clients of the same scope (room)
-                       for (IConnection conn : 
current.getScope().getClientConnections()) {
-                               if (conn != null) {
-                                       if (conn instanceof 
IServiceCapableConnection) {
-                                               if (conn.equals(current)) {
-                                                       // there is a Bug in 
the current implementation
-                                                       // of the appDisconnect
-                                                       if 
(clientFunction.equals("closeStream")) {
-                                                               Client rcl = 
sessionManager.getClientByStreamId(conn.getClient().getId(), null);
-                                                               if 
(clientFunction.equals("closeStream") && rcl.getIsRecording()) {
-                                                                       
log.debug("*** stopRecordingShowForClient Any Client is Recording - stop that");
-                                                                       // 
StreamService.stopRecordingShowForClient(conn,
-                                                                       // 
currentClient,
-                                                                       // 
rcl.getRoomRecordingName(), false);
-                                                                       
recordingService.stopRecordingShowForClient(conn, currentClient);
-                                                               }
-                                                               // Don't notify 
current client
-                                                               current.ping();
-                                                       }
-                                                       continue;
-                                               } else {
-                                                       Client rcl = 
sessionManager.getClientByStreamId(conn.getClient().getId(), null);
-                                                       if (rcl != null) {
-                                                               if 
(rcl.isScreenClient()) {
-                                                                       // 
continue;
-                                                               } else {
-                                                                       
log.debug("is this users still alive? :" + rcl);
-                                                                       
IServiceCapableConnection iStream = (IServiceCapableConnection) conn;
-                                                                       
iStream.invoke(clientFunction, new Object[] { rc }, this);
-                                                               }
-
-                                                               
log.debug("sending notification to " + conn + " ID: ");
-
-                                                               // if this 
close stream event then stop the
-                                                               // recording of 
this stream
-                                                               if 
(clientFunction.equals("closeStream") && rcl.getIsRecording()) {
-                                                                       
log.debug("***  +++++++ ######## sendClientBroadcastNotifications Any Client is 
Recording - stop that");
-                                                                       
recordingService.stopRecordingShowForClient(conn, currentClient);
-                                                               }
-                                                       }
-                                               }
-                                       }
-                               }
-                       }
-               } catch (Exception err) {
-                       log.error("[sendClientBroadcastNotifications]", err);
+                       sendMessageToCurrentScope("closeStream", rcl, false);
+               } catch (Exception e) {
+                       log.error("[streamBroadcastClose]", e);
                }
        }
 
@@ -1528,18 +1430,18 @@ public class ScopeApplicationAdapter ext
         * <li>do not send to connections where no RoomClient is registered</li>
         * </ul>
         *
-        * @param remoteMethodName The method to be called
-        * @param newMessage parameters
+        * @param method The method to be called
+        * @param msg parameters
         * @param sendSelf send to the current client as well
         * @param sendScreen send to the current client as well
         */
-       public void sendMessageToCurrentScope(final String remoteMethodName, 
final Object newMessage, final boolean sendSelf, final boolean sendScreen) {
+       public void sendMessageToCurrentScope(final String method, final Object 
msg, final boolean sendSelf, final boolean sendScreen) {
                IConnection conn = Red5.getConnectionLocal();
                if (conn == null) {
-                       log.warn(String.format("[sendMessageToCurrentScope] -> 
'Unable to send message using NULL connection' %s, %s", remoteMethodName, 
newMessage));
+                       log.warn("[sendMessageToCurrentScope] -> 'Unable to 
send message using NULL connection' {}, {}", method, msg);
                        return;
                }
-               sendMessageToCurrentScope(conn.getScope().getName(), 
remoteMethodName, newMessage, sendSelf, sendScreen);
+               sendMessageToCurrentScope(conn.getScope().getName(), method, 
msg, sendSelf, sendScreen);
        }
 
        public void sendMessageToCurrentScope(final String scopeName, final 
String remoteMethodName, final Object newMessage, final boolean sendSelf, final 
boolean sendScreen) {
@@ -1548,7 +1450,7 @@ public class ScopeApplicationAdapter ext
                        public boolean filter(IConnection conn) {
                                IClient client = conn.getClient();
                                return (!sendScreen && 
SessionVariablesUtil.isScreenClient(client))
-                                               || (!sendSelf && 
client.getId().equals(current.getClient().getId()));
+                                               || (!sendSelf && current != 
null && client.getId().equals(current.getClient().getId()));
                        }
                }.start();
        }
@@ -1556,27 +1458,27 @@ public class ScopeApplicationAdapter ext
        public static abstract class MessageSender extends Thread {
                final IScope scope;
                final IConnection current;
-               final String remoteMethodName;
-               final Object newMessage;
+               final String method;
+               final Object msg;
                final IPendingServiceCallback callback;
 
                public MessageSender(final String remoteMethodName, final 
Object newMessage, IPendingServiceCallback callback) {
                        this((IScope)null, remoteMethodName, newMessage, 
callback);
                }
 
-               public MessageSender(IScope _scope, String remoteMethodName, 
Object newMessage, IPendingServiceCallback callback) {
-                       this(Red5.getConnectionLocal(), _scope, 
remoteMethodName, newMessage, callback);
+               public MessageSender(IScope _scope, String method, Object msg, 
IPendingServiceCallback callback) {
+                       this(Red5.getConnectionLocal(), _scope, method, msg, 
callback);
                }
 
-               public MessageSender(IConnection current, String 
remoteMethodName, Object newMessage, IPendingServiceCallback callback) {
-                       this(current, null, remoteMethodName, newMessage, 
callback);
+               public MessageSender(IConnection current, String method, Object 
msg, IPendingServiceCallback callback) {
+                       this(current, null, method, msg, callback);
                }
 
-               public MessageSender(IConnection current, IScope _scope, String 
remoteMethodName, Object newMessage, IPendingServiceCallback callback) {
+               public MessageSender(IConnection current, IScope _scope, String 
method, Object msg, IPendingServiceCallback callback) {
                        this.current = current;
-                       scope = _scope == null ? current.getScope() : _scope;
-                       this.remoteMethodName = remoteMethodName;
-                       this.newMessage = newMessage;
+                       scope = _scope == null && current != null ? 
current.getScope() : _scope;
+                       this.method = method;
+                       this.msg = msg;
                        this.callback = callback;
                }
 
@@ -1586,10 +1488,10 @@ public class ScopeApplicationAdapter ext
                public void run() {
                        try {
                                if (scope == null) {
-                                       
log.debug(String.format("[MessageSender] -> 'Unable to send message to NULL 
scope' %s, %s", remoteMethodName, newMessage));
+                                       log.debug("[MessageSender] -> 'Unable 
to send message to NULL scope' {}, {}", method, msg);
                                } else {
                                        if (log.isTraceEnabled()) {
-                                               
log.trace(String.format("[MessageSender] -> 'sending message' %s, %s", 
remoteMethodName, newMessage));
+                                               log.trace("[MessageSender] -> 
'sending message' {}, {}", method, msg);
                                        }
                                        // Send to all Clients of that 
Scope(Room)
                                        int count = 0;
@@ -1598,16 +1500,16 @@ public class ScopeApplicationAdapter ext
                                                        if (filter(conn)) {
                                                                continue;
                                                        }
-                                                       
((IServiceCapableConnection) conn).invoke(remoteMethodName, new Object[] { 
newMessage }, callback);
+                                                       
((IServiceCapableConnection) conn).invoke(method, new Object[] { msg }, 
callback);
                                                        count++;
                                                }
                                        }
                                        if (log.isTraceEnabled()) {
-                                               
log.trace(String.format("[MessageSender] -> 'sending message to %s clients, 
DONE' %s", count, remoteMethodName));
+                                               log.trace("[MessageSender] -> 
'sending message to {} clients, DONE' {}", count, method);
                                        }
                                }
                        } catch (Exception err) {
-                               log.error(String.format("[MessageSender -> %s, 
%s]", remoteMethodName, newMessage), err);
+                               log.error(String.format("[MessageSender -> %s, 
%s]", method, msg), err);
                        }
                }
        }

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/video/editRecordStreamSWF10.lzx
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/video/editRecordStreamSWF10.lzx?rev=1786321&r1=1786320&r2=1786321&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/video/editRecordStreamSWF10.lzx
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/video/editRecordStreamSWF10.lzx
 Fri Mar 10 10:19:06 2017
@@ -189,10 +189,14 @@
        <![CDATA[
                //Initialize and get eventually stored property
                var dev = canvas.commonVideoViewContent.getAvSetting(prop);
+               if ($debug) Debug.write("fillDeviceList:: ", prop, dev);
 
                //Get all availible devices
                var foundStoredDev = null;
                combo.addItem(canvas.getLabelName(159), -1);
+               if ("-1" == dev) {
+                       foundStoredDev = "-1";
+               }
                for (var eg = 0; eg < list.length; ++eg) {
                        combo.addItem(list[eg], eg);
                        var r = "" + eg;

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java?rev=1786321&r1=1786320&r2=1786321&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java
 Fri Mar 10 10:19:06 2017
@@ -429,7 +429,7 @@ public class UserManager implements IUse
                                                scopeName = 
rcl.getRoomId().toString();
                                        }
                                        IScope currentScope = 
scopeApplicationAdapter.getRoomScope(scopeName);
-                                       
scopeApplicationAdapter.roomLeaveByScope(rcl, currentScope, true);
+                                       
scopeApplicationAdapter.roomLeaveByScope(rcl, currentScope);
 
                                        Map<Integer, String> messageObj = new 
HashMap<>();
                                        messageObj.put(0, "kick");
@@ -465,7 +465,7 @@ public class UserManager implements IUse
                                messageObj.put(0, "kick");
                                
scopeApplicationAdapter.sendMessageById(messageObj, rcl.getStreamid(), 
currentScope);
 
-                               scopeApplicationAdapter.roomLeaveByScope(rcl, 
currentScope, true);
+                               scopeApplicationAdapter.roomLeaveByScope(rcl, 
currentScope);
 
                                return true;
                        }

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java?rev=1786321&r1=1786320&r2=1786321&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
 Fri Mar 10 10:19:06 2017
@@ -283,6 +283,8 @@ public class Application extends Authent
                                        client = new Client(rcl, 
getBean(UserDao.class));
                                        addOnlineUser(client);
                                        if (rcl.getRoomId() != null) {
+                                               client.setCam(0);
+                                               client.setMic(0);
                                                addUserToRoom(client);
                                                //FIXME TODO unify this
                                                WebSocketHelper.sendRoom(new 
RoomMessage(client.getRoomId(), client.getUserId(), 
RoomMessage.Type.roomEnter));
@@ -299,6 +301,12 @@ public class Application extends Authent
                        rcl.setIsMod(client.hasRight(Right.moderator));
                        rcl.setCanVideo(client.hasRight(Right.video) && 
client.isCamEnabled() && client.hasActivity(Activity.broadcastV));
                        rcl.setCanDraw(client.hasRight(Right.whiteBoard));
+                       if (client.hasActivity(Activity.broadcastA) && 
client.getMic() < 0) {
+                               client.remove(Activity.broadcastA);
+                       }
+                       if (client.hasActivity(Activity.broadcastV) && 
client.getCam() < 0) {
+                               client.remove(Activity.broadcastV);
+                       }
                        if (client.hasActivity(Activity.broadcastA) || 
client.hasActivity(Activity.broadcastV)) {
                                if (forceSize || rcl.getVWidth() == 0 || 
rcl.getVHeight() == 0) {
                                        rcl.setVWidth(client.getWidth());
@@ -403,13 +411,15 @@ public class Application extends Authent
        }
 
        public static Client removeUserFromRoom(Client c) {
-               log.debug("Removing online room client: {}, room: {}", 
c.getUid(), c.getRoomId());
-               if (c.getRoomId() != null) {
-                       Set<String> clients = ROOMS.get(c.getRoomId());
+               Long roomId = c.getRoomId();
+               log.debug("Removing online room client: {}, room: {}", 
c.getUid(), roomId);
+               if (roomId != null) {
+                       Set<String> clients = ROOMS.get(roomId);
                        if (clients != null) {
                                clients.remove(c.getUid());
                                c.setRoomId(null);
                        }
+                       
getBean(ScopeApplicationAdapter.class).roomLeaveByScope(c.getUid(), roomId);
                        c.getActivities().clear();
                        c.clearRights();
                }

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java?rev=1786321&r1=1786320&r2=1786321&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java
 Fri Mar 10 10:19:06 2017
@@ -84,6 +84,7 @@ import org.apache.wicket.protocol.ws.api
 import org.apache.wicket.protocol.ws.api.message.AbstractClientMessage;
 import org.apache.wicket.protocol.ws.api.message.ClosedMessage;
 import org.apache.wicket.protocol.ws.api.message.ConnectedMessage;
+import org.apache.wicket.protocol.ws.api.message.ErrorMessage;
 import org.apache.wicket.protocol.ws.api.message.TextMessage;
 import org.apache.wicket.util.time.Duration;
 import org.red5.logging.Red5LoggerFactory;
@@ -251,6 +252,12 @@ public class MainPanel extends Panel {
                                closeHandler(msg);
                        }
 
+                       @Override
+                       protected void onError(WebSocketRequestHandler handler, 
ErrorMessage msg) {
+                               super.onError(handler, msg);
+                               closeHandler(msg);
+                       }
+
                        private void closeHandler(AbstractClientMessage msg) {
                                //no chance to stop pingTimer here :(
                                log.debug("WebSocketBehavior::closeHandler 
[uid: {}, session: {}, key: {}]", client.getUid(), msg.getSessionId(), 
msg.getKey());

Modified: 
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MainService.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MainService.java?rev=1786321&r1=1786320&r2=1786321&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MainService.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MainService.java
 Fri Mar 10 10:19:06 2017
@@ -242,29 +242,6 @@ public class MainService implements IPen
                return new Long(-1);
        }
 
-       /**
-        * clear this session id
-        *
-        * @param sid
-        * @return string value if completed
-        */
-       public Long logoutUser(String sid) {
-               try {
-                       Sessiondata sd = sessionDao.check(sid);
-                       IConnection current = Red5.getConnectionLocal();
-                       Client currentClient = 
sessionManager.getClientByStreamId(current.getClient().getId(), null);
-
-                       
scopeApplicationAdapter.roomLeaveByScope(currentClient,current.getScope(), 
false);
-
-                       currentClient.setUserObject(null, null, null, null);
-
-                       return userManager.logout(sid, sd.getUserId());
-               } catch (Exception err) {
-                       log.error("[logoutUser]",err);
-               }
-               return -1L;
-       }
-
        public List<Configuration> getGeneralOptions() {
                try {
                        return configurationDao.get("exclusive.audio.keycode", 
CONFIG_SIP_ENABLED, CONFIG_MAX_UPLOAD_SIZE_KEY, "mute.keycode", 
CONFIG_REDIRECT_URL_FOR_EXTERNAL_KEY);

Modified: 
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java?rev=1786321&r1=1786320&r2=1786321&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java
 Fri Mar 10 10:19:06 2017
@@ -248,7 +248,7 @@ public class RecordingService implements
         *
         * @param conn
         */
-       public void stopRecordingShow(IConnection conn, String broadcastId, 
Long metaId) {
+       public void stopRecordingShow(IScope scope, String broadcastId, Long 
metaId) {
                try {
                        if (metaId == null) {
                                // this should be fixed, can be useful for 
debugging, after all this is an error
@@ -256,10 +256,10 @@ public class RecordingService implements
                                log.error("recordingMetaDataId is null");
                        }
 
-                       log.debug("** stopRecordingShow: " + conn);
-                       log.debug("### Stop recording show for broadcastId: " + 
broadcastId + " || " + conn.getScope().getContextPath());
+                       log.debug("** stopRecordingShow: " + scope);
+                       log.debug("### Stop recording show for broadcastId: " + 
broadcastId + " || " + scope.getContextPath());
 
-                       Object streamToClose = 
scopeApplicationAdapter.getBroadcastStream(conn.getScope(), broadcastId);
+                       Object streamToClose = 
scopeApplicationAdapter.getBroadcastStream(scope, broadcastId);
 
                        StreamListener listenerAdapter = 
streamListeners.get(metaId);
 
@@ -327,14 +327,14 @@ public class RecordingService implements
                                                if (rcl.isScreenClient()) {
                                                        if 
(rcl.getRecordingId() != null && rcl.isScreenPublishStarted()) {
                                                                // Stop FLV 
Recording
-                                                               
stopRecordingShow(conn, rcl.getStreamPublishName(), 
rcl.getRecordingMetaDataId());
+                                                               
stopRecordingShow(scope, rcl.getStreamPublishName(), 
rcl.getRecordingMetaDataId());
 
                                                                // Update Meta 
Data
                                                                
metaDataDao.updateEndDate(rcl.getRecordingMetaDataId(), new Date());
                                                        }
                                                } else if 
(rcl.getAvsettings().equals("av") || rcl.getAvsettings().equals("a") || 
rcl.getAvsettings().equals("v")) {
 
-                                                       stopRecordingShow(conn, 
String.valueOf(rcl.getBroadCastID()).toString(), rcl.getRecordingMetaDataId());
+                                                       
stopRecordingShow(scope, String.valueOf(rcl.getBroadCastID()).toString(), 
rcl.getRecordingMetaDataId());
 
                                                        // Update Meta Data
                                                        
metaDataDao.updateEndDate(rcl.getRecordingMetaDataId(), new Date());
@@ -397,7 +397,7 @@ public class RecordingService implements
                return null;
        }
 
-       public void stopRecordingShowForClient(IConnection conn, Client rcl) {
+       public void stopRecordingShowForClient(IScope scope, Client rcl) {
                try {
                        // this cannot be handled here, as to stop a stream and 
to leave a
                        // room is not
@@ -414,7 +414,7 @@ public class RecordingService implements
                                        // FIXME: Is there really a need to 
stop it manually if the
                                        // user just
                                        // stops the stream?
-                                       stopRecordingShow(conn, 
rcl.getStreamPublishName(), rcl.getRecordingMetaDataId());
+                                       stopRecordingShow(scope, 
rcl.getStreamPublishName(), rcl.getRecordingMetaDataId());
 
                                        // Update Meta Data
                                        
metaDataDao.updateEndDate(rcl.getRecordingMetaDataId(), new Date());
@@ -424,7 +424,7 @@ public class RecordingService implements
 
                                // FIXME: Is there really a need to stop it 
manually if the user
                                // just stops the stream?
-                               stopRecordingShow(conn, 
String.valueOf(rcl.getBroadCastID()), rcl.getRecordingMetaDataId());
+                               stopRecordingShow(scope, 
String.valueOf(rcl.getBroadCastID()), rcl.getRecordingMetaDataId());
 
                                // Update Meta Data
                                
metaDataDao.updateEndDate(rcl.getRecordingMetaDataId(), new Date());

Modified: 
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/UserService.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/UserService.java?rev=1786321&r1=1786320&r2=1786321&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/UserService.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/UserService.java
 Fri Mar 10 10:19:06 2017
@@ -146,7 +146,7 @@ public class UserService implements IUse
                                        messageObj.put(0, "kick");
                                        
scopeApplicationAdapter.sendMessageById(messageObj, streamid, currentScope);
 
-                                       
scopeApplicationAdapter.roomLeaveByScope(rcl, currentScope, true);
+                                       
scopeApplicationAdapter.roomLeaveByScope(rcl, currentScope);
 
                                        return true;
                                } else {
@@ -199,7 +199,7 @@ public class UserService implements IUse
                                messageObj.put(0, "kick");
 
                                
scopeApplicationAdapter.sendMessageById(messageObj, rcl.getStreamid(), 
currentScope);
-                               scopeApplicationAdapter.roomLeaveByScope(rcl, 
currentScope, true);
+                               scopeApplicationAdapter.roomLeaveByScope(rcl, 
currentScope);
 
                                return true;
                        }

Modified: 
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java?rev=1786321&r1=1786320&r2=1786321&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
 Fri Mar 10 10:19:06 2017
@@ -443,7 +443,7 @@ public class ScopeApplicationAdapter ext
                                        returnMap.put("alreadyPublished", true);
                                }
 
-                               log.debug(String.format("screen 
x,y,width,height %s,%s,%s,%s", client.getVX(), client.getVY(), 
client.getVWidth(), client.getVHeight()));
+                               log.debug("screen x,y,width,height 
{},{},{},{}", client.getVX(), client.getVY(), client.getVWidth(), 
client.getVHeight());
 
                                if (startStreaming) {
                                        if (!alreadyStreaming) {
@@ -559,43 +559,27 @@ public class ScopeApplicationAdapter ext
        @Override
        public void roomLeave(IClient client, IScope room) {
                try {
-                       log.debug(String.format("roomLeave %s %s %s %s", 
client.getId(), room.getClients().size(), room.getContextPath(), 
room.getName()));
+                       log.debug("[roomLeave] {} {} {} {}", client.getId(), 
room.getClients().size(), room.getContextPath(), room.getName());
 
-                       Client currentClient = 
sessionManager.getClientByStreamId(client.getId(), null);
+                       Client rcl = 
sessionManager.getClientByStreamId(client.getId(), null);
 
                        // The Room Client can be null if the Client left the 
room by using
                        // logicalRoomLeave
-                       if (currentClient != null) {
+                       if (rcl != null) {
                                log.debug("currentClient IS NOT NULL");
-                               roomLeaveByScope(currentClient, room, true);
+                               roomLeaveByScope(rcl, room);
                        }
                } catch (Exception err) {
                        log.error("[roomLeave]", err);
                }
        }
 
-       /**
-        * this means a user has left a room but only logically, he didn't 
leave the
-        * app he just left the room
-        *
-        * FIXME: Is this really needed anymore if you re-connect to another 
scope?
-        *
-        * Exit Room by Application
-        *
-        */
-       public void logicalRoomLeave() {
-               log.debug("logicalRoomLeave ");
-               try {
-                       IConnection current = Red5.getConnectionLocal();
-                       String streamid = current.getClient().getId();
-
-                       log.debug(streamid + " is leaving");
-
-                       Client currentClient = 
sessionManager.getClientByStreamId(streamid, null);
-
-                       roomLeaveByScope(currentClient, current.getScope(), 
true);
-               } catch (Exception err) {
-                       log.error("[logicalRoomLeave]", err);
+       public void roomLeaveByScope(String uid, Long roomId) {
+               Client rcl = sessionManager.getClientByPublicSID(uid, null);
+               IScope scope = getRoomScope("" + roomId);
+               log.debug("[roomLeaveByScope] {} {} {} {}", uid, roomId, rcl, 
scope);
+               if (rcl != null && scope != null) {
+                       roomLeaveByScope(rcl, scope);
                }
        }
 
@@ -609,9 +593,9 @@ public class ScopeApplicationAdapter ext
         * @param client
         * @param scope
         */
-       public void roomLeaveByScope(Client client, IScope scope, boolean 
removeUserFromSessionList) {
+       public void roomLeaveByScope(Client client, IScope scope) {
                try {
-                       log.debug("currentClient " + client);
+                       log.debug("[roomLeaveByScope] currentClient " + client);
                        Long roomId = client.getRoomId();
 
                        if (client.isScreenClient() && 
client.isStartStreaming()) {
@@ -642,59 +626,30 @@ public class ScopeApplicationAdapter ext
                                        client.setIsRecording(true);
                                }
                        }
+                       recordingService.stopRecordingShowForClient(scope, 
client);
 
                        // Notify all clients of the same currentScope (room) 
with domain
                        // and room except the current disconnected cause it 
could throw an exception
                        log.debug("currentScope " + scope);
 
-                       if (scope != null && scope.getClientConnections() != 
null) {
-                               // Notify Users of the current Scope
-                               for (IConnection cons : 
scope.getClientConnections()) {
-                                       if (cons != null && cons instanceof 
IServiceCapableConnection) {
-                                               log.debug("sending 
roomDisconnect to {}  client id {}", cons, cons.getClient().getId());
-
-                                               Client rcl = 
sessionManager.getClientByStreamId(cons.getClient().getId(), null);
-
-                                               // Check if the Client does 
still exist on the list
-                                               if (rcl == null) {
-                                                       log.debug("For this 
StreamId: " + cons.getClient().getId() + " There is no Client in the List 
anymore");
-                                                       continue;
-                                               }
-
-                                               //Do not send back to sender, 
but actually all other clients should receive this message swagner 01.10.2009
-                                               if 
(!client.getStreamid().equals(rcl.getStreamid())) {
-                                                       // add Notification if 
another user isrecording
-                                                       
log.debug("###########[roomLeaveByScope]");
-                                                       if 
(rcl.getIsRecording()) {
-                                                               log.debug("*** 
roomLeave Any Client is Recording - stop that");
-                                                               
recordingService.stopRecordingShowForClient(cons, client);
-                                                       }
-
-                                                       boolean isScreen = 
rcl.isScreenClient();
-                                                       if (isScreen && 
client.getPublicSID().equals(rcl.getStreamPublishName())) {
-                                                               //going to 
terminate screen sharing started by this client
-                                                               
((IServiceCapableConnection) cons).invoke("stopStream", new Object[] { },this);
-                                                               continue;
-                                                       } else if (isScreen) {
-                                                               // screen 
sharing clients do not receive events
-                                                               continue;
-                                                       }
-
-                                                       // Send to all 
connected users
-                                                       
((IServiceCapableConnection) cons).invoke("roomDisconnect", new Object[] { 
client },this);
-                                                       log.debug("sending 
roomDisconnect to " + cons);
-                                               }
-                                       }
+                       new MessageSender(scope, "roomDisconnect", client, 
this) {
+                               @Override
+                               public boolean filter(IConnection conn) {
+                                       Client rcl = 
sessionManager.getClientByStreamId(conn.getClient().getId(), null);
+                                       boolean isScreen = rcl.isScreenClient();
+                                       if (isScreen && 
client.getPublicSID().equals(rcl.getStreamPublishName())) {
+                                               //going to terminate screen 
sharing started by this client
+                                               ((IServiceCapableConnection) 
conn).invoke("stopStream", new Object[] { }, callback);
+                                       }                                       
// TODO Auto-generated method stub
+                                       return rcl == null || isScreen;
                                }
-                       }
+                       }.start();
 
                        if (client.isMobile()) {
                                IApplication app = 
(IApplication)Application.get(OpenmeetingsVariables.wicketApplicationName);
                                app.exit(client.getPublicSID());
                        }
-                       if (removeUserFromSessionList) {
-                               
sessionManager.removeClient(client.getStreamid(), null);
-                       }
+                       sessionManager.removeClient(client.getStreamid(), null);
                } catch (Exception err) {
                        log.error("[roomLeaveByScope]", err);
                }
@@ -800,32 +755,14 @@ public class ScopeApplicationAdapter ext
         */
        @Override
        public void streamBroadcastClose(IBroadcastStream stream) {
-
                // Notify all the clients that the stream had been closed
                log.debug("start streamBroadcastClose broadcast close: " + 
stream.getPublishedName());
                try {
                        IConnection current = Red5.getConnectionLocal();
-                       Client rcl = 
sessionManager.getClientByStreamId(current.getClient().getId(), null);
-                       sendClientBroadcastNotifications(stream, "closeStream", 
rcl);
-               } catch (Exception e) {
-                       log.error("[streamBroadcastClose]", e);
-               }
-       }
-
-       /**
-        * This method handles the notification room-based
-        *
-        * @return void
-        *
-        */
-       private void sendClientBroadcastNotifications(IBroadcastStream stream, 
String clientFunction, Client rc) {
-               try {
-                       // Store the local so that we do not send notification 
to ourself back
-                       IConnection current = Red5.getConnectionLocal();
-                       String streamid = current.getClient().getId();
-                       Client currentClient = 
sessionManager.getClientByStreamId(streamid, null);
+                       String streamId = current.getClient().getId();
+                       Client rcl = 
sessionManager.getClientByStreamId(streamId, null);
 
-                       if (currentClient == null) {
+                       if (rcl == null) {
 
                                // In case the client has already left(kicked) 
this message
                                // might be thrown later then the RoomLeave
@@ -837,55 +774,20 @@ public class ScopeApplicationAdapter ext
 
                        }
                        // Notify all the clients that the stream had been 
started
-                       log.debug("sendClientBroadcastNotifications: " + 
stream.getPublishedName());
-                       log.debug("sendClientBroadcastNotifications : " + 
currentClient + " " + currentClient.getStreamid());
-
+                       log.debug("streamBroadcastClose : " + rcl + " " + 
rcl.getStreamid());
+                       // this close stream event, stop the recording of this 
stream
+                       if (rcl.getIsRecording()) {
+                               log.debug("***  +++++++ ######## 
sendClientBroadcastNotifications Any Client is Recording - stop that");
+                               
recordingService.stopRecordingShowForClient(current.getScope(), rcl);
+                       }
+                       rcl.setBroadCastID(-1);
+                       rcl.setIsBroadcasting(false);
+                       rcl.setAvsettings("n");
+                       sessionManager.updateClientByStreamId(streamId, rcl, 
false, null);
                        // Notify all clients of the same scope (room)
-                       for (IConnection conn : 
current.getScope().getClientConnections()) {
-                               if (conn != null) {
-                                       if (conn instanceof 
IServiceCapableConnection) {
-                                               if (conn.equals(current)) {
-                                                       // there is a Bug in 
the current implementation
-                                                       // of the appDisconnect
-                                                       if 
(clientFunction.equals("closeStream")) {
-                                                               Client rcl = 
sessionManager.getClientByStreamId(conn.getClient().getId(), null);
-                                                               if 
(clientFunction.equals("closeStream") && rcl.getIsRecording()) {
-                                                                       
log.debug("*** stopRecordingShowForClient Any Client is Recording - stop that");
-                                                                       // 
StreamService.stopRecordingShowForClient(conn,
-                                                                       // 
currentClient,
-                                                                       // 
rcl.getRoomRecordingName(), false);
-                                                                       
recordingService.stopRecordingShowForClient(conn, currentClient);
-                                                               }
-                                                               // Don't notify 
current client
-                                                               current.ping();
-                                                       }
-                                                       continue;
-                                               } else {
-                                                       Client rcl = 
sessionManager.getClientByStreamId(conn.getClient().getId(), null);
-                                                       if (rcl != null) {
-                                                               if 
(rcl.isScreenClient()) {
-                                                                       // 
continue;
-                                                               } else {
-                                                                       
log.debug("is this users still alive? :" + rcl);
-                                                                       
IServiceCapableConnection iStream = (IServiceCapableConnection) conn;
-                                                                       
iStream.invoke(clientFunction, new Object[] { rc }, this);
-                                                               }
-
-                                                               
log.debug("sending notification to " + conn + " ID: ");
-
-                                                               // if this 
close stream event then stop the
-                                                               // recording of 
this stream
-                                                               if 
(clientFunction.equals("closeStream") && rcl.getIsRecording()) {
-                                                                       
log.debug("***  +++++++ ######## sendClientBroadcastNotifications Any Client is 
Recording - stop that");
-                                                                       
recordingService.stopRecordingShowForClient(conn, currentClient);
-                                                               }
-                                                       }
-                                               }
-                                       }
-                               }
-                       }
-               } catch (Exception err) {
-                       log.error("[sendClientBroadcastNotifications]", err);
+                       sendMessageToCurrentScope("closeStream", rcl, false);
+               } catch (Exception e) {
+                       log.error("[streamBroadcastClose]", e);
                }
        }
 
@@ -1528,18 +1430,18 @@ public class ScopeApplicationAdapter ext
         * <li>do not send to connections where no RoomClient is registered</li>
         * </ul>
         *
-        * @param remoteMethodName The method to be called
-        * @param newMessage parameters
+        * @param method The method to be called
+        * @param msg parameters
         * @param sendSelf send to the current client as well
         * @param sendScreen send to the current client as well
         */
-       public void sendMessageToCurrentScope(final String remoteMethodName, 
final Object newMessage, final boolean sendSelf, final boolean sendScreen) {
+       public void sendMessageToCurrentScope(final String method, final Object 
msg, final boolean sendSelf, final boolean sendScreen) {
                IConnection conn = Red5.getConnectionLocal();
                if (conn == null) {
-                       log.warn(String.format("[sendMessageToCurrentScope] -> 
'Unable to send message using NULL connection' %s, %s", remoteMethodName, 
newMessage));
+                       log.warn("[sendMessageToCurrentScope] -> 'Unable to 
send message using NULL connection' {}, {}", method, msg);
                        return;
                }
-               sendMessageToCurrentScope(conn.getScope().getName(), 
remoteMethodName, newMessage, sendSelf, sendScreen);
+               sendMessageToCurrentScope(conn.getScope().getName(), method, 
msg, sendSelf, sendScreen);
        }
 
        public void sendMessageToCurrentScope(final String scopeName, final 
String remoteMethodName, final Object newMessage, final boolean sendSelf, final 
boolean sendScreen) {
@@ -1548,7 +1450,7 @@ public class ScopeApplicationAdapter ext
                        public boolean filter(IConnection conn) {
                                IClient client = conn.getClient();
                                return (!sendScreen && 
SessionVariablesUtil.isScreenClient(client))
-                                               || (!sendSelf && 
client.getId().equals(current.getClient().getId()));
+                                               || (!sendSelf && current != 
null && client.getId().equals(current.getClient().getId()));
                        }
                }.start();
        }
@@ -1556,27 +1458,27 @@ public class ScopeApplicationAdapter ext
        public static abstract class MessageSender extends Thread {
                final IScope scope;
                final IConnection current;
-               final String remoteMethodName;
-               final Object newMessage;
+               final String method;
+               final Object msg;
                final IPendingServiceCallback callback;
 
                public MessageSender(final String remoteMethodName, final 
Object newMessage, IPendingServiceCallback callback) {
                        this((IScope)null, remoteMethodName, newMessage, 
callback);
                }
 
-               public MessageSender(IScope _scope, String remoteMethodName, 
Object newMessage, IPendingServiceCallback callback) {
-                       this(Red5.getConnectionLocal(), _scope, 
remoteMethodName, newMessage, callback);
+               public MessageSender(IScope _scope, String method, Object msg, 
IPendingServiceCallback callback) {
+                       this(Red5.getConnectionLocal(), _scope, method, msg, 
callback);
                }
 
-               public MessageSender(IConnection current, String 
remoteMethodName, Object newMessage, IPendingServiceCallback callback) {
-                       this(current, null, remoteMethodName, newMessage, 
callback);
+               public MessageSender(IConnection current, String method, Object 
msg, IPendingServiceCallback callback) {
+                       this(current, null, method, msg, callback);
                }
 
-               public MessageSender(IConnection current, IScope _scope, String 
remoteMethodName, Object newMessage, IPendingServiceCallback callback) {
+               public MessageSender(IConnection current, IScope _scope, String 
method, Object msg, IPendingServiceCallback callback) {
                        this.current = current;
-                       scope = _scope == null ? current.getScope() : _scope;
-                       this.remoteMethodName = remoteMethodName;
-                       this.newMessage = newMessage;
+                       scope = _scope == null && current != null ? 
current.getScope() : _scope;
+                       this.method = method;
+                       this.msg = msg;
                        this.callback = callback;
                }
 
@@ -1586,10 +1488,10 @@ public class ScopeApplicationAdapter ext
                public void run() {
                        try {
                                if (scope == null) {
-                                       
log.debug(String.format("[MessageSender] -> 'Unable to send message to NULL 
scope' %s, %s", remoteMethodName, newMessage));
+                                       log.debug("[MessageSender] -> 'Unable 
to send message to NULL scope' {}, {}", method, msg);
                                } else {
                                        if (log.isTraceEnabled()) {
-                                               
log.trace(String.format("[MessageSender] -> 'sending message' %s, %s", 
remoteMethodName, newMessage));
+                                               log.trace("[MessageSender] -> 
'sending message' {}, {}", method, msg);
                                        }
                                        // Send to all Clients of that 
Scope(Room)
                                        int count = 0;
@@ -1598,16 +1500,16 @@ public class ScopeApplicationAdapter ext
                                                        if (filter(conn)) {
                                                                continue;
                                                        }
-                                                       
((IServiceCapableConnection) conn).invoke(remoteMethodName, new Object[] { 
newMessage }, callback);
+                                                       
((IServiceCapableConnection) conn).invoke(method, new Object[] { msg }, 
callback);
                                                        count++;
                                                }
                                        }
                                        if (log.isTraceEnabled()) {
-                                               
log.trace(String.format("[MessageSender] -> 'sending message to %s clients, 
DONE' %s", count, remoteMethodName));
+                                               log.trace("[MessageSender] -> 
'sending message to {} clients, DONE' {}", count, method);
                                        }
                                }
                        } catch (Exception err) {
-                               log.error(String.format("[MessageSender -> %s, 
%s]", remoteMethodName, newMessage), err);
+                               log.error(String.format("[MessageSender -> %s, 
%s]", method, msg), err);
                        }
                }
        }

Modified: 
openmeetings/application/trunk/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java?rev=1786321&r1=1786320&r2=1786321&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java
 Fri Mar 10 10:19:06 2017
@@ -429,7 +429,7 @@ public class UserManager implements IUse
                                                scopeName = 
rcl.getRoomId().toString();
                                        }
                                        IScope currentScope = 
scopeApplicationAdapter.getRoomScope(scopeName);
-                                       
scopeApplicationAdapter.roomLeaveByScope(rcl, currentScope, true);
+                                       
scopeApplicationAdapter.roomLeaveByScope(rcl, currentScope);
 
                                        Map<Integer, String> messageObj = new 
HashMap<>();
                                        messageObj.put(0, "kick");
@@ -465,7 +465,7 @@ public class UserManager implements IUse
                                messageObj.put(0, "kick");
                                
scopeApplicationAdapter.sendMessageById(messageObj, rcl.getStreamid(), 
currentScope);
 
-                               scopeApplicationAdapter.roomLeaveByScope(rcl, 
currentScope, true);
+                               scopeApplicationAdapter.roomLeaveByScope(rcl, 
currentScope);
 
                                return true;
                        }

Modified: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java?rev=1786321&r1=1786320&r2=1786321&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
 Fri Mar 10 10:19:06 2017
@@ -283,6 +283,8 @@ public class Application extends Authent
                                        client = new Client(rcl, 
getBean(UserDao.class));
                                        addOnlineUser(client);
                                        if (rcl.getRoomId() != null) {
+                                               client.setCam(0);
+                                               client.setMic(0);
                                                addUserToRoom(client);
                                                //FIXME TODO unify this
                                                WebSocketHelper.sendRoom(new 
RoomMessage(client.getRoomId(), client.getUserId(), 
RoomMessage.Type.roomEnter));
@@ -299,6 +301,12 @@ public class Application extends Authent
                        rcl.setIsMod(client.hasRight(Right.moderator));
                        rcl.setCanVideo(client.hasRight(Right.video) && 
client.isCamEnabled() && client.hasActivity(Activity.broadcastV));
                        rcl.setCanDraw(client.hasRight(Right.whiteBoard));
+                       if (client.hasActivity(Activity.broadcastA) && 
client.getMic() < 0) {
+                               client.remove(Activity.broadcastA);
+                       }
+                       if (client.hasActivity(Activity.broadcastV) && 
client.getCam() < 0) {
+                               client.remove(Activity.broadcastV);
+                       }
                        if (client.hasActivity(Activity.broadcastA) || 
client.hasActivity(Activity.broadcastV)) {
                                if (forceSize || rcl.getVWidth() == 0 || 
rcl.getVHeight() == 0) {
                                        rcl.setVWidth(client.getWidth());
@@ -403,13 +411,15 @@ public class Application extends Authent
        }
 
        public static Client removeUserFromRoom(Client c) {
-               log.debug("Removing online room client: {}, room: {}", 
c.getUid(), c.getRoomId());
-               if (c.getRoomId() != null) {
-                       Set<String> clients = ROOMS.get(c.getRoomId());
+               Long roomId = c.getRoomId();
+               log.debug("Removing online room client: {}, room: {}", 
c.getUid(), roomId);
+               if (roomId != null) {
+                       Set<String> clients = ROOMS.get(roomId);
                        if (clients != null) {
                                clients.remove(c.getUid());
                                c.setRoomId(null);
                        }
+                       
getBean(ScopeApplicationAdapter.class).roomLeaveByScope(c.getUid(), roomId);
                        c.getActivities().clear();
                        c.clearRights();
                }

Modified: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java?rev=1786321&r1=1786320&r2=1786321&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java
 Fri Mar 10 10:19:06 2017
@@ -84,6 +84,7 @@ import org.apache.wicket.protocol.ws.api
 import org.apache.wicket.protocol.ws.api.message.AbstractClientMessage;
 import org.apache.wicket.protocol.ws.api.message.ClosedMessage;
 import org.apache.wicket.protocol.ws.api.message.ConnectedMessage;
+import org.apache.wicket.protocol.ws.api.message.ErrorMessage;
 import org.apache.wicket.protocol.ws.api.message.TextMessage;
 import org.apache.wicket.util.time.Duration;
 import org.red5.logging.Red5LoggerFactory;
@@ -251,6 +252,12 @@ public class MainPanel extends Panel {
                                closeHandler(msg);
                        }
 
+                       @Override
+                       protected void onError(WebSocketRequestHandler handler, 
ErrorMessage msg) {
+                               super.onError(handler, msg);
+                               closeHandler(msg);
+                       }
+
                        private void closeHandler(AbstractClientMessage msg) {
                                //no chance to stop pingTimer here :(
                                log.debug("WebSocketBehavior::closeHandler 
[uid: {}, session: {}, key: {}]", client.getUid(), msg.getSessionId(), 
msg.getKey());


Reply via email to