Author: solomax
Date: Sat Apr 15 16:49:12 2017
New Revision: 1791522

URL: http://svn.apache.org/viewvc?rev=1791522&view=rev
Log:
[OPENMEETINGS-551] screen-sharing is displayed in room

Added:
    
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ScopeApplicationAdapter.java
      - copied, changed from r1791521, 
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
Removed:
    
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/
Modified:
    openmeetings/application/trunk/LICENSE
    
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/conference/RoomManager.java
    
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MobileService.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-db/src/main/java/org/apache/openmeetings/IApplication.java
    
openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/Core.java
    
openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/IScreenShare.java
    
openmeetings/application/trunk/openmeetings-screenshare/src/main/jnlp/templates/template.jnlp
    
openmeetings/application/trunk/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java
    
openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/message/RoomMessage.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
    
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomBroadcaster.java
    
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
    
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/SwfPanel.java
    
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.java
    
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/StartSharingButton.java
    
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
    
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
    
openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/classes/applicationContext.xml

Modified: openmeetings/application/trunk/LICENSE
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/LICENSE?rev=1791522&r1=1791521&r2=1791522&view=diff
==============================================================================
--- openmeetings/application/trunk/LICENSE (original)
+++ openmeetings/application/trunk/LICENSE Sat Apr 15 16:49:12 2017
@@ -498,10 +498,10 @@ The GlassFish code released under the CD
 
 For SLF4J:
 
-lib/jcl-over-slf4j-1.7.22.jar
-lib/jul-to-slf4j-1.7.22.jar
-lib/log4j-over-slf4j-1.7.22.jar
-lib/slf4j-api-1.7.22.jar
+lib/jcl-over-slf4j-*.jar
+lib/jul-to-slf4j-*.jar
+lib/log4j-over-slf4j-*.jar
+lib/slf4j-api-*.jar
 
 Copyright (c) 2004-2008 QOS.ch
  All rights reserved.
@@ -1468,8 +1468,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBI
 
 For the components:
 
-lib/logback-classic-1.1.7.jar
-lib/logback-core-1.1.7.jar
+lib/logback-classic-*.jar
+lib/logback-core-*.jar
 plugins/ecj-4.5.1.jar
 
 Eclipse Public License - v 1.0
@@ -2114,35 +2114,6 @@ As a special exception, the copyright ho
 
 
=======================================================================================
 
-MIT X11 License
-https://raw.githubusercontent.com/Mahoney/sysout-over-slf4j/master/LICENSE.txt
-
-For lib/sysout-over-slf4j-1.0.2.jar
-
- * Copyright (c) 2009-2012 Robert Elliot
- * All rights reserved.
- * 
- * Permission is hereby granted, free  of charge, to any person obtaining
- * a  copy  of this  software  and  associated  documentation files  (the
- * "Software"), to  deal in  the Software without  restriction, including
- * without limitation  the rights to  use, copy, modify,  merge, publish,
- * distribute,  sublicense, and/or sell  copies of  the Software,  and to
- * permit persons to whom the Software  is furnished to do so, subject to
- * the following conditions:
- * 
- * The  above  copyright  notice  and  this permission  notice  shall  be
- * included in all copies or substantial portions of the Software.
- * 
- * THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
- * EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
- * MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- * OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
- 
=======================================================================================
-
  Mozilla Public License 1.1 (MPL 1.1)
  http://www.mozilla.org/MPL/MPL-1.1.html
  

Modified: 
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/conference/RoomManager.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/conference/RoomManager.java?rev=1791522&r1=1791521&r2=1791522&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/conference/RoomManager.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/conference/RoomManager.java
 Sat Apr 15 16:49:12 2017
@@ -32,7 +32,6 @@ import javax.persistence.criteria.Predic
 import javax.persistence.criteria.Root;
 
 import org.apache.openmeetings.db.dao.room.RoomDao;
-import org.apache.openmeetings.db.dao.room.SipDao;
 import org.apache.openmeetings.db.dao.server.ISessionManager;
 import org.apache.openmeetings.db.dto.basic.SearchResult;
 import org.apache.openmeetings.db.entity.room.Room;
@@ -58,8 +57,6 @@ public class RoomManager {
        private ISessionManager sessionManager;
        @Autowired
        private RoomDao roomDao;
-       @Autowired
-       private SipDao sipDao;
 
        public SearchResult<Room> getRooms(int start, int max, String orderby, 
boolean asc, String search) {
                try {
@@ -294,16 +291,6 @@ public class RoomManager {
        // 
---------------------------------------------------------------------------------------------
 
        /**
-        * Returns number of SIP conference participants
-        * @param roomId id of room
-        * @return number of participants
-        */
-       public Integer getSipConferenceMembersNumber(Long roomId) {
-               Room r = roomDao.get(roomId);
-               return r == null || r.getConfno() == null ? null : 
sipDao.countUsers(r.getConfno());
-       }
-
-       /**
         * get List of RoomGroup by group and roomtype
         *
         * @param groupId

Modified: 
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MobileService.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MobileService.java?rev=1791522&r1=1791521&r2=1791522&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MobileService.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MobileService.java
 Sat Apr 15 16:49:12 2017
@@ -18,7 +18,7 @@
  */
 package org.apache.openmeetings.core.remote;
 
-import static 
org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter.nextBroadCastId;
+import static 
org.apache.openmeetings.core.remote.ScopeApplicationAdapter.nextBroadCastId;
 import static org.apache.openmeetings.db.util.LocaleHelper.getCountryName;
 import static 
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DEFAULT_GROUP_ID;
 import static 
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_FRONTEND_REGISTER_KEY;
@@ -39,8 +39,7 @@ import java.util.TimeZone;
 import java.util.UUID;
 
 import org.apache.commons.lang3.time.FastDateFormat;
-import org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter;
-import 
org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter.MessageSender;
+import 
org.apache.openmeetings.core.remote.ScopeApplicationAdapter.MessageSender;
 import org.apache.openmeetings.core.remote.util.SessionVariablesUtil;
 import org.apache.openmeetings.core.util.WebSocketHelper;
 import org.apache.openmeetings.db.dao.basic.ChatDao;

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=1791522&r1=1791521&r2=1791522&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
 Sat Apr 15 16:49:12 2017
@@ -29,7 +29,6 @@ import org.apache.openmeetings.core.conv
 import 
org.apache.openmeetings.core.data.record.converter.InterviewConverterTask;
 import 
org.apache.openmeetings.core.data.record.converter.RecordingConverterTask;
 import org.apache.openmeetings.core.data.record.listener.StreamListener;
-import org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter;
 import org.apache.openmeetings.core.util.WebSocketHelper;
 import org.apache.openmeetings.db.dao.record.RecordingDao;
 import org.apache.openmeetings.db.dao.record.RecordingMetaDataDao;

Copied: 
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ScopeApplicationAdapter.java
 (from r1791521, 
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/ScopeApplicationAdapter.java?p2=openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ScopeApplicationAdapter.java&p1=openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java&r1=1791521&r2=1791522&rev=1791522&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/ScopeApplicationAdapter.java
 Sat Apr 15 16:49:12 2017
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.core.remote.red5;
+package org.apache.openmeetings.core.remote;
 
 import static 
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_FLASH_SECURE;
 import static 
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_FLASH_SECURE_PROXY;
@@ -29,41 +29,32 @@ import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Iterator;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
-import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.openmeetings.IApplication;
-import org.apache.openmeetings.core.data.conference.RoomManager;
-import org.apache.openmeetings.core.remote.RecordingService;
 import org.apache.openmeetings.core.remote.util.SessionVariablesUtil;
 import org.apache.openmeetings.core.util.WebSocketHelper;
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
-import org.apache.openmeetings.db.dao.calendar.AppointmentDao;
 import org.apache.openmeetings.db.dao.label.LabelDao;
 import org.apache.openmeetings.db.dao.log.ConferenceLogDao;
 import org.apache.openmeetings.db.dao.record.RecordingDao;
 import org.apache.openmeetings.db.dao.room.RoomDao;
+import org.apache.openmeetings.db.dao.room.SipDao;
 import org.apache.openmeetings.db.dao.server.ISessionManager;
 import org.apache.openmeetings.db.dao.server.ServerDao;
 import org.apache.openmeetings.db.dao.server.SessiondataDao;
 import org.apache.openmeetings.db.dao.user.UserDao;
-import org.apache.openmeetings.db.dto.room.BrowserStatus;
-import org.apache.openmeetings.db.dto.room.RoomStatus;
 import org.apache.openmeetings.db.entity.log.ConferenceLog;
 import org.apache.openmeetings.db.entity.room.Client;
 import org.apache.openmeetings.db.entity.room.Room;
-import org.apache.openmeetings.db.entity.room.Room.RoomElement;
 import org.apache.openmeetings.db.entity.server.Server;
 import org.apache.openmeetings.db.entity.server.Sessiondata;
 import org.apache.openmeetings.db.entity.user.User;
-import org.apache.openmeetings.db.util.AuthLevelUtil;
 import org.apache.openmeetings.util.CalendarPatterns;
 import org.apache.openmeetings.util.InitializationContainer;
 import org.apache.openmeetings.util.OmFileHelper;
@@ -79,10 +70,7 @@ import org.red5.server.adapter.MultiThre
 import org.red5.server.api.IClient;
 import org.red5.server.api.IConnection;
 import org.red5.server.api.Red5;
-import org.red5.server.api.scope.IBasicScope;
-import org.red5.server.api.scope.IBroadcastScope;
 import org.red5.server.api.scope.IScope;
-import org.red5.server.api.scope.ScopeType;
 import org.red5.server.api.service.IPendingServiceCall;
 import org.red5.server.api.service.IPendingServiceCallback;
 import org.red5.server.api.service.IServiceCapableConnection;
@@ -103,6 +91,8 @@ public class ScopeApplicationAdapter ext
        public static final String FLASH_SSL_PORT = "rtmpsPort";
        public static final String FLASH_VIDEO_CODEC = "videoCodec";
        public static final String FLASH_FPS = "fps";
+       private static AtomicLong broadCastCounter = new AtomicLong(0);
+       private JSONObject flashSettings;
 
        @Autowired
        private ISessionManager sessionManager;
@@ -111,24 +101,19 @@ public class ScopeApplicationAdapter ext
        @Autowired
        private ConfigurationDao cfgDao;
        @Autowired
-       private AppointmentDao appointmentDao;
-       @Autowired
        private SessiondataDao sessiondataDao;
        @Autowired
-       private RoomManager roomManager;
-       @Autowired
        private ConferenceLogDao conferenceLogDao;
        @Autowired
        private UserDao userDao;
        @Autowired
        private RoomDao roomDao;
        @Autowired
+       private SipDao sipDao;
+       @Autowired
        private RecordingDao recordingDao;
        @Autowired
        private ServerDao serverDao;
-       private JSONObject flashSettings;
-
-       private static AtomicLong broadCastCounter = new AtomicLong(0);
 
        @Override
        public void resultReceived(IPendingServiceCall arg0) {
@@ -146,7 +131,7 @@ public class ScopeApplicationAdapter ext
                        log.debug("webAppPath : " + OmFileHelper.getOmHome());
 
                        // Only load this Class one time Initially this value 
might by empty, because the DB is empty yet
-                       getCryptKey();
+                       cfgDao.getCryptKey();
 
                        // init your handler here
                        Properties props = new Properties();
@@ -254,7 +239,7 @@ public class ScopeApplicationAdapter ext
                }
 
                if (map.containsKey("screenClient")) {
-                       Client parent = 
sessionManager.getClientByPublicSID(parentSid, null);
+                       org.apache.openmeetings.db.entity.basic.Client parent = 
iapp.getOmClient(uid);
                        if (parent == null) {
                                log.warn("Bad parent for screen-sharing client, 
client is rejected");
                                return rejectClient();
@@ -263,7 +248,7 @@ public class ScopeApplicationAdapter ext
                        rcm.setUserId(parent.getUserId());
                        rcm.setScreenClient(true);
                        rcm.setPublicSID(UUID.randomUUID().toString());
-                       rcm.setStreamPublishName(parentSid);
+                       rcm.setStreamPublishName(uid);
                }
                rcm.setStreamid(conn.getClient().getId());
                rcm.setScope(scn.toString());
@@ -388,31 +373,6 @@ public class ScopeApplicationAdapter ext
                return returnMap;
        }
 
-       public List<Client> checkScreenSharing() {
-               try {
-                       IConnection current = Red5.getConnectionLocal();
-                       String streamid = current.getClient().getId();
-
-                       log.debug("checkScreenSharing -2- " + streamid);
-
-                       List<Client> screenSharerList = new LinkedList<>();
-
-                       Client currentClient = 
sessionManager.getClientByStreamId(streamid, null);
-
-                       for (Client rcl : 
sessionManager.getClientListByRoomAll(currentClient.getRoomId())) {
-                               if (rcl.isStartStreaming()) {
-                                       screenSharerList.add(rcl);
-                               }
-                       }
-
-                       return screenSharerList;
-
-               } catch (Exception err) {
-                       log.error("[checkScreenSharing]", err);
-               }
-               return null;
-       }
-
        /**
         *
         * @param map
@@ -453,8 +413,7 @@ public class ScopeApplicationAdapter ext
                                Map<String, Object> returnMap = new HashMap<>();
                                returnMap.put("alreadyPublished", false);
 
-                               // if is already started screen sharing, then 
there is no need
-                               // to start it again
+                               // if is already started screen sharing, then 
there is no need to start it again
                                if (client.isScreenPublishStarted()) {
                                        returnMap.put("alreadyPublished", true);
                                }
@@ -500,73 +459,6 @@ public class ScopeApplicationAdapter ext
                return null;
        }
 
-       public List<Long> listRoomBroadcast() {
-               Set<Long> broadcastList = new HashSet<>();
-               IConnection current = Red5.getConnectionLocal();
-               String streamid = current.getClient().getId();
-               for (IConnection conn : 
current.getScope().getClientConnections()) {
-                       if (conn != null) {
-                               Client rcl = 
sessionManager.getClientByStreamId(conn.getClient().getId(), null);
-                               if (rcl == null) {
-                                       // continue;
-                               } else if (rcl.isScreenClient()) {
-                                       // continue;
-                               } else {
-                                       if 
(!streamid.equals(rcl.getStreamid())) {
-                                               // It is not needed to send back
-                                               // that event to the actuall
-                                               // Moderator
-                                               // as it will be already 
triggered
-                                               // in the result of this 
Function
-                                               // in the Client
-                                               Long id = 
Long.valueOf(rcl.getBroadCastID());
-                                               if 
(!broadcastList.contains(id)) {
-                                                       broadcastList.add(id);
-                                               }
-                                       }
-                               }
-                       }
-               }
-               return new ArrayList<>(broadcastList);
-       }
-
-       /**
-        * this function is invoked directly after initial connecting
-        *
-        * @return publicSID of current client
-        */
-       public String getPublicSID() {
-               log.debug("-----------  getPublicSID");
-               IConnection current = Red5.getConnectionLocal();
-               Client currentClient = 
sessionManager.getClientByStreamId(current.getClient().getId(), null);
-               
sessionManager.updateClientByStreamId(current.getClient().getId(), 
currentClient, false, null);
-               return currentClient.getPublicSID();
-       }
-
-       /**
-        * this function is invoked after a reconnect
-        *
-        * @param newPublicSID
-        */
-       public boolean overwritePublicSID(String newPublicSID) {
-               try {
-                       log.debug("-----------  overwritePublicSID");
-                       IConnection current = Red5.getConnectionLocal();
-                       IClient c = current.getClient();
-                       Client currentClient = 
sessionManager.getClientByStreamId(c.getId(), null);
-                       if (currentClient == null) {
-                               return false;
-                       }
-                       SessionVariablesUtil.initClient(c, newPublicSID);
-                       currentClient.setPublicSID(newPublicSID);
-                       sessionManager.updateClientByStreamId(c.getId(), 
currentClient, false, null);
-                       return true;
-               } catch (Exception err) {
-                       log.error("[overwritePublicSID]", err);
-               }
-               return false;
-       }
-
        /**
         * Logic must be before roomDisconnect cause otherwise you cannot throw 
a
         * message to each one
@@ -743,20 +635,21 @@ public class ScopeApplicationAdapter ext
                                        return false;
                                }
                        }.start();
+                       JSONObject obj = new JSONObject().put("uid", 
c.getPublicSID());
+                       if (c.isScreenClient()) {
+                               obj.put("screenShare", true)
+                                               .put("uid", 
c.getStreamPublishName())
+                                               .put("broadcastId", 
stream.getPublishedName())
+                                               .put("suid", c.getPublicSID())
+                                               .put("width", c.getVWidth())
+                                               .put("height", c.getVHeight());
+                       }
+                       WebSocketHelper.sendRoom(new 
TextRoomMessage(c.getRoomId(), c.getUserId(), RoomMessage.Type.newStream, 
obj.toString()));
                } catch (Exception err) {
                        log.error("[streamPublishStart]", err);
                }
        }
 
-       public IBroadcastScope getBroadcastScope(IScope scope, String name) {
-               IBasicScope basicScope = 
scope.getBasicScope(ScopeType.BROADCAST, name);
-               if (!(basicScope instanceof IBroadcastScope)) {
-                       return null;
-               } else {
-                       return (IBroadcastScope) basicScope;
-               }
-       }
-
        /**
         * This method handles the Event after a stream has been removed all
         * connected Clients in the same room will get a notification
@@ -800,6 +693,9 @@ public class ScopeApplicationAdapter ext
                        sessionManager.updateClientByStreamId(streamId, rcl, 
false, null);
                        // Notify all clients of the same scope (room)
                        sendMessageToCurrentScope("closeStream", rcl, 
rcl.isMobile());
+                       if (rcl.isScreenClient()) {
+                               WebSocketHelper.sendRoom(new 
TextRoomMessage(rcl.getRoomId(), rcl.getUserId(), RoomMessage.Type.closeStream, 
rcl.getPublicSID()));
+                       }
                } catch (Exception e) {
                        log.error("[streamBroadcastClose]", e);
                }
@@ -821,30 +717,6 @@ public class ScopeApplicationAdapter ext
                }
        }
 
-       public long removeModerator(String publicSID) {
-               try {
-                       log.debug("-----------  removeModerator: " + publicSID);
-
-                       Client currentClient = 
sessionManager.getClientByPublicSID(publicSID, null);
-
-                       if (currentClient == null) {
-                               return -1L;
-                       }
-                       Long roomId = currentClient.getRoomId();
-
-                       currentClient.setIsMod(false);
-                       // Put the mod-flag to true for this client
-                       
sessionManager.updateClientByStreamId(currentClient.getStreamid(), 
currentClient, false, null);
-
-                       List<Client> currentMods = 
sessionManager.getCurrentModeratorByRoom(roomId);
-
-                       sendMessageToCurrentScope("setNewModeratorByList", 
currentMods, true);
-               } catch (Exception err) {
-                       log.error("[removeModerator]", err);
-               }
-               return -1L;
-       }
-
        public long switchMicMuted(String publicSID, boolean mute) {
                try {
                        log.debug("-----------  switchMicMuted: " + publicSID);
@@ -867,282 +739,10 @@ public class ScopeApplicationAdapter ext
                return 0L;
        }
 
-       public boolean getMicMutedByPublicSID(String publicSID) {
-               try {
-                       Client currentClient = 
sessionManager.getClientByPublicSID(publicSID, null);
-                       if (currentClient == null) {
-                               return true;
-                       }
-
-                       //Put the mod-flag to true for this client
-                       return currentClient.getMicMuted();
-               } catch (Exception err) {
-                       log.error("[getMicMutedByPublicSID]",err);
-               }
-               return true;
-       }
-
        public static long nextBroadCastId() {
                return broadCastCounter.getAndIncrement();
        }
 
-       /**
-        * This method is used to set/update broadCastID of current client
-        *
-        * @param updateBroadcastId boolean flag
-        *
-        * @return BroadcastId in case of no errors, -1 otherwise
-        */
-       public long setUserAVSettings(boolean updateBroadcastId) {
-               try {
-                       String streamid = 
Red5.getConnectionLocal().getClient().getId();
-                       log.debug("-----------  setUserAVSettings {}", 
streamid);
-                       Client rcl = 
sessionManager.getClientByStreamId(streamid, null);
-                       if (rcl == null) {
-                               log.warn("Failed to find appropriate clients");
-                               return -1;
-                       }
-                       if (updateBroadcastId) {
-                               rcl.setBroadCastID(nextBroadCastId());
-                               
sessionManager.updateAVClientByStreamId(streamid, rcl, null);
-                       }
-                       return rcl.getBroadCastID();
-               } catch (Exception err) {
-                       log.error("[setUserAVSettings]", err);
-               }
-               return -1;
-       }
-
-       /*
-        * checks if the user is allowed to apply for Moderation
-        */
-       public boolean checkRoomValues(Long roomId) {
-               try {
-
-                       // appointed meeting or moderated Room?
-                       Room room = roomDao.get(roomId);
-
-                       // not really - default logic
-                       if (!room.isAppointment() && room.isModerated()) {
-                               // if this is a Moderated Room then the Room 
can be only
-                               // locked off by the Moderator Bit
-                               List<Client> clientModeratorListRoom = 
sessionManager.getCurrentModeratorByRoom(roomId);
-
-                               // If there is no Moderator yet and we are 
asking for it
-                               // then deny it
-                               // cause at this moment, the user should wait 
untill a
-                               // Moderator enters the Room
-                               return clientModeratorListRoom.size() != 0;
-                       } else {
-                               // FIXME: TODO: For Rooms that are created as 
Appointment we
-                               // have to check that too
-                               // but I don't know yet the Logic behind it - 
swagner 19.06.2009
-                               return true;
-
-                       }
-               } catch (Exception err) {
-                       log.error("[checkRoomValues]", err);
-               }
-               return false;
-       }
-
-       /**
-        * This function is called once a User enters a Room
-        *
-        * It contains several different mechanism depending on what roomtype 
and
-        * what options are available for the room to find out if the current 
user
-        * will be a moderator of that room or not<br/>
-        * <br/>
-        * Some rules:<br/>
-        * <ul>
-        * <li>If it is a room that was created through the calendar, the user 
that
-        * organized the room will be moderator, the param Boolean 
becomeModerator
-        * will be ignored then</li>
-        * <li>In regular rooms you can use the param Boolean becomeModerator 
to set
-        * any user to become a moderator of the room</li>
-        * </ul>
-        * <br/>
-        * If a new moderator is detected a Push Call to all current users of 
the
-        * room is invoked "setNewModeratorByList" to notify them of the new
-        * moderator<br/>
-        * <br/>
-        * At the end of the mechanism a push call with the new client-object
-        * and all the informations about the new user is send to every user of 
the
-        * current conference room<br/>
-        * <br/>
-        *
-        * @param roomId - id of the room
-        * @param becomeModerator - is user will become moderator
-        * @param isSuperModerator - is user super moderator
-        * @param groupId - group id of the user
-        * @param colorObj - some color
-        * @return RoomStatus object
-        */
-       public RoomStatus setRoomValues(Long roomId, boolean becomeModerator, 
boolean isSuperModerator, String colorObj) {
-               try {
-                       log.debug("-----------  setRoomValues");
-                       IConnection current = Red5.getConnectionLocal();
-                       String streamid = current.getClient().getId();
-                       Client client = 
sessionManager.getClientByStreamId(streamid, null);
-                       client.setRoomId(roomId);
-                       client.setRoomEnter(new Date());
-
-                       client.setUsercolor(colorObj);
-
-                       Long userId = client.getUserId();
-                       User u = userId == null ? null : userDao.get(userId > 0 
? userId : -userId);
-                       // Inject externalUserId if nothing is set yet
-                       if (client.getExternalUserId() == null && u != null) {
-                               client.setExternalUserId(u.getExternalId());
-                               client.setExternalUserType(u.getExternalType());
-                       }
-
-                       Room r = roomDao.get(roomId);
-                       if (!r.isHidden(RoomElement.MicrophoneStatus)) {
-                               client.setCanGiveAudio(true);
-                       }
-                       sessionManager.updateClientByStreamId(streamid, client, 
true, null); // first save to get valid room count
-
-                       // Check for Moderation LogicalRoom ENTER
-                       List<Client> roomClients = 
sessionManager.getClientListByRoom(roomId);
-
-                       // Return Object
-                       RoomStatus roomStatus = new RoomStatus();
-                       // appointed meeting or moderated Room? => Check Max 
Users first
-                       if (isSuperModerator) {
-                               // This can be set without checking for 
Moderation Flag
-                               client.setIsSuperModerator(isSuperModerator);
-                               client.setIsMod(isSuperModerator);
-                       } else {
-                               Set<Room.Right> rr = 
AuthLevelUtil.getRoomRight(u, r, r.isAppointment() ? 
appointmentDao.getByRoom(r.getId()) : null, roomClients.size());
-                               
client.setIsSuperModerator(rr.contains(Room.Right.superModerator));
-                               client.setIsMod(becomeModerator || 
rr.contains(Room.Right.moderator));
-                       }
-                       if (client.getIsMod()) {
-                               // Update the Client List
-                               sessionManager.updateClientByStreamId(streamid, 
client, false, null);
-
-                               List<Client> modRoomList = 
sessionManager.getCurrentModeratorByRoom(client.getRoomId());
-
-                               //Sync message to everybody
-                               
sendMessageToCurrentScope("setNewModeratorByList", modRoomList, false);
-                       }
-
-                       //Sync message to everybody
-                       sendMessageToCurrentScope("addNewUser", client, false);
-
-                       //Status object for Shared Browsing
-                       BrowserStatus browserStatus = 
(BrowserStatus)current.getScope().getAttribute("browserStatus");
-
-                       if (browserStatus == null) {
-                               browserStatus = new BrowserStatus();
-                       }
-
-                       // RoomStatus roomStatus = new RoomStatus();
-
-                       // FIXME: Rework Client Object to DTOs
-                       roomStatus.setClientList(roomClients);
-                       roomStatus.setBrowserStatus(browserStatus);
-
-                       return roomStatus;
-               } catch (Exception err) {
-                       log.error("[setRoomValues]", err);
-               }
-               return null;
-       }
-
-       /**
-        * this is set initial directly after login/loading language
-        *
-        * @param SID - id of the session
-        * @param userId - id of the user being set
-        * @param username - username of the user
-        * @param firstname - firstname of the user
-        * @param lastname - lastname of the user
-        * @return RoomClient in case of everything is OK, null otherwise
-        */
-       public Client setUsernameAndSession(String SID, Long userId, String 
username, String firstname, String lastname) {
-               try {
-                       log.debug("-----------  setUsernameAndSession");
-                       IConnection current = Red5.getConnectionLocal();
-                       String streamid = current.getClient().getId();
-                       Client currentClient = 
sessionManager.getClientByStreamId(streamid, null);
-
-                       currentClient.setUsername(username);
-                       currentClient.setUserId(userId);
-                       SessionVariablesUtil.setUserId(current.getClient(), 
userId);
-                       currentClient.setUserObject(userId, username, 
firstname, lastname);
-
-                       // Update Session Data
-                       log.debug("UDPATE SESSION " + SID + ", " + userId);
-                       sessiondataDao.updateUserWithoutSession(SID, userId);
-
-                       User user = userDao.get(userId);
-
-                       if (user != null) {
-                               
currentClient.setExternalUserId(user.getExternalId());
-                               
currentClient.setExternalUserType(user.getExternalType());
-                       }
-
-                       // only fill this value from User-Record
-                       // cause invited users have non
-                       // you cannot set the firstname,lastname from the 
UserRecord
-                       User us = userDao.get(userId);
-                       if (us != null && us.getPictureuri() != null) {
-                               // set Picture-URI
-                               
currentClient.setPicture_uri(us.getPictureuri());
-                       }
-                       sessionManager.updateClientByStreamId(streamid, 
currentClient, false, null);
-                       return currentClient;
-               } catch (Exception err) {
-                       log.error("[setUsername]", err);
-               }
-               return null;
-       }
-
-       /**
-        * used by the Screen-Sharing Servlet to trigger events
-        *
-        * @param roomId
-        * @param message
-        * @return the list of room clients
-        */
-       public Map<String, Client> sendMessageByRoomAndDomain(Long roomId, 
Object message) {
-               Map<String, Client> roomClientList = new HashMap<>();
-               try {
-
-                       log.debug("sendMessageByRoomAndDomain " + roomId);
-
-                       IScope scope = getRoomScope(roomId.toString());
-
-                       new MessageSender(scope, "newMessageByRoomAndDomain", 
message, this) {
-                               @Override
-                               public boolean filter(IConnection conn) {
-                                       IClient client = conn.getClient();
-                                       return 
SessionVariablesUtil.isScreenClient(client);
-                               }
-                       }.start();
-               } catch (Exception err) {
-                       log.error("[getClientListBYRoomAndDomain]", err);
-               }
-               return roomClientList;
-       }
-
-       public List<Client> getCurrentModeratorList() {
-               try {
-                       IConnection current = Red5.getConnectionLocal();
-                       Client client = 
sessionManager.getClientByStreamId(current.getClient().getId(), null);
-                       Long roomId = client.getRoomId();
-                       Room r = roomDao.get(roomId);
-                       if (r != null) {
-                               return 
sessionManager.getCurrentModeratorByRoom(roomId);
-                       }
-               } catch (Exception err) {
-                       log.error("[getCurrentModerator]", err);
-               }
-               return null;
-       }
-
        public int sendMessage(Object newMessage) {
                sendMessageToCurrentScope("sendVarsToMessage", newMessage, 
false);
                return 1;
@@ -1154,43 +754,6 @@ public class ScopeApplicationAdapter ext
        }
 
        /**
-        * send status for shared browsing to all members except self
-        * @param newMessage
-        * @return 1
-        */
-       @SuppressWarnings({ "rawtypes" })
-       public int sendBrowserMessageToMembers(Object newMessage) {
-               try {
-                       IConnection current = Red5.getConnectionLocal();
-
-                       List newMessageList = (List) newMessage;
-
-                       String action = newMessageList.get(0).toString();
-
-                       BrowserStatus browserStatus = (BrowserStatus) 
current.getScope().getAttribute("browserStatus");
-
-                       if (browserStatus == null) {
-                               browserStatus = new BrowserStatus();
-                       }
-
-                       if (action.equals("initBrowser") || 
action.equals("newBrowserURL")) {
-                               browserStatus.setBrowserInited(true);
-                               
browserStatus.setCurrentURL(newMessageList.get(1).toString());
-                       } else if (action.equals("closeBrowserURL")) {
-                               browserStatus.setBrowserInited(false);
-                       }
-
-                       current.getScope().setAttribute("browserStatus", 
browserStatus);
-
-                       sendMessageToCurrentScope("sendVarsToMessage", 
newMessage, false);
-
-               } catch (Exception err) {
-                       log.error("[sendMessage]", err);
-               }
-               return 1;
-       }
-
-       /**
         * wrapper method
         * @param newMessage
         */
@@ -1442,45 +1005,6 @@ public class ScopeApplicationAdapter ext
                return 1;
        }
 
-       public void sendMessageWithClientByPublicSID(Object message, String 
publicSID) {
-               try {
-                       if (publicSID == null) {
-                               log.warn("'null' publicSID was passed to 
sendMessageWithClientByPublicSID");
-                               return;
-                       }
-
-                       // Get Room Id to send it to the correct Scope
-                       Client currentClient = 
sessionManager.getClientByPublicSID(publicSID, null);
-
-                       if (currentClient == null) {
-                               throw new Exception("Could not Find RoomClient 
on List publicSID: " + publicSID);
-                       }
-                       IScope scope = getRoomScope("" + 
currentClient.getRoomId());
-
-                       // log.debug("scopeHibernate "+scopeHibernate);
-
-                       if (scope != null) {
-                               // Notify the clients of the same scope (room) 
with userId
-
-                               for (IConnection conn : 
scope.getClientConnections()) {
-                                       IClient client = conn.getClient();
-                                       if 
(SessionVariablesUtil.isScreenClient(client)) {
-                                               // screen sharing clients do 
not receive events
-                                               continue;
-                                       }
-
-                                       if 
(publicSID.equals(SessionVariablesUtil.getPublicSID(client))) {
-                                               ((IServiceCapableConnection) 
conn).invoke("newMessageByRoomAndDomain", new Object[] { message }, this);
-                                       }
-                               }
-                       } else {
-                               // Scope not yet started
-                       }
-               } catch (Exception err) {
-                       log.error("[sendMessageWithClientByPublicSID] ", err);
-               }
-       }
-
        /**
         * @deprecated this method should be reworked to use a single SQL query 
in
         *             the cache to get any client in the current room that is
@@ -1635,28 +1159,6 @@ public class ScopeApplicationAdapter ext
                return false;
        }
 
-       /**
-        * Get all ClientList Objects of that room and domain Used in
-        * lz.applyForModeration.lzx
-        *
-        * @return all ClientList Objects of that room
-        */
-       public List<Client> getClientListScope() {
-               try {
-                       IConnection current = Red5.getConnectionLocal();
-                       Client currentClient = 
sessionManager.getClientByStreamId(current.getClient().getId(), null);
-
-                       return 
sessionManager.getClientListByRoom(currentClient.getRoomId());
-               } catch (Exception err) {
-                       log.debug("[getClientListScope]", err);
-               }
-               return new ArrayList<>();
-       }
-
-       public String getCryptKey() {
-               return cfgDao.getCryptKey();
-       }
-
        public IScope getRoomScope(String room) {
                if (Strings.isEmpty(room)) {
                        return null;
@@ -1693,8 +1195,18 @@ public class ScopeApplicationAdapter ext
                return result.isEmpty() ? result : roomDao.getSipRooms(result);
        }
 
+       /**
+        * Returns number of SIP conference participants
+        * @param roomId id of room
+        * @return number of participants
+        */
+       public Integer getSipConferenceMembersNumber(Long roomId) {
+               Room r = roomDao.get(roomId);
+               return r == null || r.getConfno() == null ? null : 
sipDao.countUsers(r.getConfno());
+       }
+
        private String getSipTransportLastname(Long roomId) {
-               return 
getSipTransportLastname(roomManager.getSipConferenceMembersNumber(roomId));
+               return 
getSipTransportLastname(getSipConferenceMembersNumber(roomId));
        }
 
        private static String getSipTransportLastname(Integer c) {
@@ -1707,7 +1219,7 @@ public class ScopeApplicationAdapter ext
                String streamid = current.getClient().getId();
                Client client = sessionManager.getClientByStreamId(streamid, 
null);
                Long roomId = client.getRoomId();
-               Integer count = 
roomManager.getSipConferenceMembersNumber(roomId);
+               Integer count = getSipConferenceMembersNumber(roomId);
                String newNumber = getSipTransportLastname(count);
                log.debug("getSipConferenceMembersNumber: " + newNumber);
                if (!newNumber.equals(client.getLastname())) {

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=1791522&r1=1791521&r2=1791522&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
 Sat Apr 15 16:49:12 2017
@@ -26,7 +26,6 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.openmeetings.IApplication;
-import org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter;
 import org.apache.openmeetings.db.dao.server.ISessionManager;
 import org.apache.openmeetings.db.dao.server.ServerDao;
 import org.apache.openmeetings.db.dao.server.SessiondataDao;

Modified: 
openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java?rev=1791522&r1=1791521&r2=1791522&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java
 Sat Apr 15 16:49:12 2017
@@ -39,6 +39,7 @@ public interface IApplication {
        String getOmString(long id, long languageId);
        String getOmString(String key, long languageId);
        String getOmString(String key, final Locale loc, String... params);
+       org.apache.openmeetings.db.entity.basic.Client getOmClient(String uid);
        Client updateClient(Client rcl, boolean forceSize);
        List<org.apache.openmeetings.db.entity.basic.Client> 
getOmRoomClients(Long roomId);
        List<org.apache.openmeetings.db.entity.basic.Client> getOmClients(Long 
userId);

Modified: 
openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/Core.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/Core.java?rev=1791522&r1=1791521&r2=1791522&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/Core.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/Core.java
 Sat Apr 15 16:49:12 2017
@@ -67,12 +67,16 @@ public class Core implements IPendingSer
        final static String QUARTZ_GROUP_NAME = "ScreenShare";
        final static String QUARTZ_REMOTE_JOB_NAME = "RemoteJob";
        final static String QUARTZ_REMOTE_TRIGGER_NAME = "RemoteTrigger";
+       private static final String CONNECT_REJECTED = 
"NetConnection.Connect.Rejected";
+       private static final String CONNECT_FAILED = 
"NetConnection.Connect.Failed";
 
        enum Protocol {
                rtmp, rtmpt, rtmpe, rtmps
        }
        private IScreenShare instance = null;
-       private Protocol protocol;
+       private URI url;
+       private URI fallback;
+       private boolean fallbackUsed = false;
        private String host;
        private String app;
        private int port;
@@ -97,6 +101,7 @@ public class Core implements IPendingSer
        private boolean readyToRecord = false;
        private boolean audioNotify = false;
        private boolean remoteEnabled = true;
+       private boolean nativeSsl = false;
        private SchedulerFactory schdlrFactory;
        private Scheduler schdlr;
        private LinkedBlockingQueue<Map<String, Object>> remoteEvents = new 
LinkedBlockingQueue<>();
@@ -121,20 +126,17 @@ public class Core implements IPendingSer
                        }
                        String[] textArray = null;
                        if (args.length > 8) {
-                               String _url = args[0];
-                               URI url = new URI(_url);
-                               protocol = Protocol.valueOf(url.getScheme());
-                               host = url.getHost();
-                               port = url.getPort();
-                               app = url.getPath().substring(1);
-                               publishName = args[1];
-                               String labelTexts = args[2];
-                               defaultQuality = Integer.parseInt(args[3]);
-                               defaultFPS = Integer.parseInt(args[4]);
-                               showFPS = bool(args[5]);
-                               remoteEnabled = bool(args[6]);
-                               allowRecording = bool(args[7]);
-                               allowPublishing = bool(args[8]);
+                               url = new URI(args[0]);
+                               fallback = new URI(args[1]);
+                               publishName = args[2];
+                               String labelTexts = args[3];
+                               defaultQuality = Integer.parseInt(args[4]);
+                               defaultFPS = Integer.parseInt(args[5]);
+                               showFPS = bool(args[6]);
+                               remoteEnabled = bool(args[7]);
+                               allowRecording = bool(args[8]);
+                               allowPublishing = bool(args[9]);
+                               nativeSsl = bool(args[10]);
 
                                if (labelTexts.length() > 0) {
                                        textArray = labelTexts.split(";");
@@ -145,30 +147,6 @@ public class Core implements IPendingSer
                                                log.debug(i + " :: " + 
textArray[i]);
                                        }
                                }
-                               switch (protocol) {
-                                       case rtmp:
-                                               instance = new 
RTMPScreenShare(this);
-                                               break;
-                                       case rtmpt:
-                                               instance = new 
RTMPTScreenShare(this);
-                                               break;
-                                       case rtmps:
-                                               boolean nativeSsl = 
bool(args[9]);
-                                               if (nativeSsl) {
-                                                       RTMPSScreenShare client 
= new RTMPSScreenShare(this);
-                                                       //NOT in use since 
1.0.8-M3 client.setKeystoreBytes(Hex.decodeHex(args[10].toCharArray()));
-                                                       
client.setKeyStorePassword(args[11]);
-                                                       instance = client;
-                                               } else {
-                                                       instance = new 
RTMPTSScreenShare(this);
-                                               }
-                                               break;
-                                       case rtmpe:
-                                       default:
-                                               throw new 
Exception("Unsupported protocol");
-                               }
-                               instance.setServiceProvider(this);
-                               log.debug(String.format("host: %s, port: %s, 
app: %s, publish: %s", host, port, app, publishName));
                        } else {
                                System.exit(0);
                        }
@@ -188,6 +166,35 @@ public class Core implements IPendingSer
                }
        }
 
+       private void setInstance(URI uri) {
+               Protocol protocol = Protocol.valueOf(uri.getScheme());
+               host = uri.getHost();
+               port = uri.getPort();
+               app = uri.getPath().substring(1);
+
+               switch (protocol) {
+                       case rtmp:
+                               instance = new RTMPScreenShare(this);
+                               break;
+                       case rtmpt:
+                               instance = new RTMPTScreenShare(this);
+                               break;
+                       case rtmps:
+                               if (nativeSsl) {
+                                       RTMPSScreenShare client = new 
RTMPSScreenShare(this);
+                                       instance = client;
+                               } else {
+                                       instance = new RTMPTSScreenShare(this);
+                               }
+                               break;
+                       case rtmpe:
+                       default:
+                               throw new RuntimeException("Unsupported 
protocol");
+               }
+               instance.setServiceProvider(this);
+               log.debug(String.format("host: %s, port: %s, app: %s, publish: 
%s", host, port, app, publishName));
+       }
+
        @SuppressWarnings("unused")
        public static void main(String[] args) {
                new Core(args);
@@ -298,10 +305,12 @@ public class Core implements IPendingSer
        }
 
        private void connect(String parentSid) {
+               setInstance(fallbackUsed ? fallback : url);
                Map<String, Object> map = 
instance.makeDefaultConnectionParams(host, port, app);
                map.put("screenClient", true);
-               map.put("parentSid", parentSid);
-               instance.connect(host, port, map, this);
+               Map<String, Object> params = new HashMap<>();
+               params.put("uid", parentSid);
+               instance.connect(host, port, map, this, new Object[]{params});
        }
 
        private void captureScreenStart() {
@@ -491,7 +500,13 @@ public class Core implements IPendingSer
                        log.trace("call ### get Method Name " + method);
                        if ("connect".equals(method)) {
                                Object code = returnMap.get("code");
-                               if 
("NetConnection.Connect.Rejected".equals(code) || 
"NetConnection.Connect.Failed".equals(code)) {
+                               if (CONNECT_FAILED.equals(code) && 
!fallbackUsed) {
+                                       fallbackUsed = true;
+                                       connect(publishName);
+                                       frame.setStatus("Re-connecting using 
fallback");
+                                       return;
+                               }
+                               if (CONNECT_FAILED.equals(code) || 
CONNECT_REJECTED.equals(code)) {
                                        frame.setStatus(String.format("Error: 
%s %s", code, returnMap.get("description")));
                                        return;
                                }

Modified: 
openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/IScreenShare.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/IScreenShare.java?rev=1791522&r1=1791521&r2=1791522&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/IScreenShare.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/IScreenShare.java
 Sat Apr 15 16:49:12 2017
@@ -30,7 +30,7 @@ public interface IScreenShare extends Cl
        RTMPConnection getConnection();
        void invoke(String method, Object[] params, IPendingServiceCallback 
callback);
        Map<String, Object> makeDefaultConnectionParams(String server, int 
port, String application);
-       void connect(String server, int port, Map<String, Object> 
connectionParams, IPendingServiceCallback connectCallback);
+       void connect(String server, int port, Map<String, Object> 
connectionParams, IPendingServiceCallback connectCallback, Object[] 
connectCallArguments);
        void setServiceProvider(Object serviceProvider);
        void disconnect();
        void createStream(IPendingServiceCallback callback);

Modified: 
openmeetings/application/trunk/openmeetings-screenshare/src/main/jnlp/templates/template.jnlp
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-screenshare/src/main/jnlp/templates/template.jnlp?rev=1791522&r1=1791521&r2=1791522&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-screenshare/src/main/jnlp/templates/template.jnlp
 (original)
+++ 
openmeetings/application/trunk/openmeetings-screenshare/src/main/jnlp/templates/template.jnlp
 Sat Apr 15 16:49:12 2017
@@ -38,6 +38,7 @@
        </resources>
        <application-desc main-class='org.apache.openmeetings.screenshare.Core'>
                <argument>$url</argument>
+               <argument>$fallback</argument>
                <argument>$publicSid</argument>
                <argument>$labels</argument>
                <argument>$defaultQuality</argument>
@@ -47,7 +48,5 @@
                <argument>$allowRecording</argument>
                <argument>$allowPublishing</argument>
                <argument>$native</argument>
-               <argument>$keystore</argument>
-               <argument>$password</argument>
        </application-desc>
 </jnlp>

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=1791522&r1=1791521&r2=1791522&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
 Sat Apr 15 16:49:12 2017
@@ -43,7 +43,7 @@ import javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
 import javax.persistence.TypedQuery;
 
-import org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter;
+import org.apache.openmeetings.core.remote.ScopeApplicationAdapter;
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
 import org.apache.openmeetings.db.dao.label.LabelDao;
 import org.apache.openmeetings.db.dao.server.ISessionManager;

Modified: 
openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/message/RoomMessage.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/message/RoomMessage.java?rev=1791522&r1=1791521&r2=1791522&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/message/RoomMessage.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/message/RoomMessage.java
 Sat Apr 15 16:49:12 2017
@@ -47,6 +47,8 @@ public class RoomMessage implements IWeb
                , requestRightExclusive
                , haveQuestion
                , kick
+               , newStream
+               , closeStream
        }
        private final Date timestamp;
        private final String uid;

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=1791522&r1=1791521&r2=1791522&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
 Sat Apr 15 16:49:12 2017
@@ -42,7 +42,7 @@ import java.util.function.Predicate;
 import org.apache.directory.api.util.Strings;
 import org.apache.openmeetings.IApplication;
 import org.apache.openmeetings.core.remote.MainService;
-import org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter;
+import org.apache.openmeetings.core.remote.ScopeApplicationAdapter;
 import org.apache.openmeetings.core.util.WebSocketHelper;
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
 import org.apache.openmeetings.db.dao.label.LabelDao;
@@ -632,4 +632,9 @@ public class Application extends Authent
        public String getOmString(String key, final Locale loc, String... 
params) {
                return getString(key, loc, params);
        }
+
+       @Override
+       public Client getOmClient(String uid) {
+               return getOnlineClient(uid);
+       }
 }

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=1791522&r1=1791521&r2=1791522&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
 Sat Apr 15 16:49:12 2017
@@ -116,7 +116,7 @@ public class MainPanel extends Panel {
                @Override
                protected void onTimer(AjaxRequestTarget target) {
                        log.debug("Sending WebSocket PING");
-                       WebSocketHelper.sendClient(client, new byte[1]);
+                       WebSocketHelper.sendClient(client, new 
byte[]{getUserId().byteValue()});
                }
        };
 

Modified: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomBroadcaster.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomBroadcaster.java?rev=1791522&r1=1791521&r2=1791522&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomBroadcaster.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomBroadcaster.java
 Sat Apr 15 16:49:12 2017
@@ -21,7 +21,7 @@ package org.apache.openmeetings.web.room
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 import static org.apache.openmeetings.web.app.Application.getBean;
 
-import org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter;
+import org.apache.openmeetings.core.remote.ScopeApplicationAdapter;
 import org.apache.openmeetings.core.session.SessionManager;
 import org.apache.openmeetings.db.dto.server.ClientSessionInfo;
 import org.apache.openmeetings.db.entity.room.Client;

Modified: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java?rev=1791522&r1=1791521&r2=1791522&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
 Sat Apr 15 16:49:12 2017
@@ -368,6 +368,27 @@ public class RoomPanel extends BasePanel
                                                        wb.update(handler);
                                                }
                                                break;
+                                       case newStream:
+                                       {
+                                               JSONObject obj = new 
JSONObject(((TextRoomMessage)m).getText());
+                                               Client c = 
getOnlineClient(obj.getString("uid"));
+                                               boolean self = 
getClient().getUid().equals(c.getUid());
+                                               if (!self) {
+                                                       JSONObject json = 
c.toJson().put("sid", getSid()).put("self", self);
+                                                       if 
(obj.optBoolean("screenShare", false)) {
+                                                               
json.put("screenShare", true)
+                                                                       
.put("uid", obj.getString("suid")) // unique screen-sharing ID
+                                                                       
.put("broadcastId", obj.getString("broadcastId"))
+                                                                       
.put("width", obj.getInt("width"))
+                                                                       
.put("height", obj.getInt("height"));
+                                                       }
+                                                       
handler.appendJavaScript(String.format("VideoManager.play(%s);", json));
+                                               }
+                                       }
+                                               break;
+                                       case closeStream:
+                                               
handler.appendJavaScript(String.format("VideoManager.close('%s');", 
((TextRoomMessage)m).getText()));
+                                               break;
                                        case roomEnter:
                                                sidebar.update(handler);
                                                menu.update(handler);

Modified: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/SwfPanel.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/SwfPanel.java?rev=1791522&r1=1791521&r2=1791522&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/SwfPanel.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/SwfPanel.java
 Sat Apr 15 16:49:12 2017
@@ -18,17 +18,17 @@
  */
 package org.apache.openmeetings.web.room;
 
-import static 
org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter.FLASH_NATIVE_SSL;
-import static 
org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter.FLASH_PORT;
-import static 
org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter.FLASH_SECURE;
-import static 
org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter.FLASH_SSL_PORT;
+import static 
org.apache.openmeetings.core.remote.ScopeApplicationAdapter.FLASH_NATIVE_SSL;
+import static 
org.apache.openmeetings.core.remote.ScopeApplicationAdapter.FLASH_PORT;
+import static 
org.apache.openmeetings.core.remote.ScopeApplicationAdapter.FLASH_SECURE;
+import static 
org.apache.openmeetings.core.remote.ScopeApplicationAdapter.FLASH_SSL_PORT;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 import static org.apache.openmeetings.web.app.Application.getBean;
 import static org.apache.wicket.RuntimeConfigurationType.DEVELOPMENT;
 
 import java.net.URL;
 
-import org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter;
+import org.apache.openmeetings.core.remote.ScopeApplicationAdapter;
 import org.apache.openmeetings.web.app.Application;
 import org.apache.openmeetings.web.common.BasePanel;
 import org.apache.openmeetings.web.common.OmAjaxClientInfoBehavior;

Modified: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.java?rev=1791522&r1=1791521&r2=1791522&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.java
 Sat Apr 15 16:49:12 2017
@@ -18,19 +18,19 @@
  */
 package org.apache.openmeetings.web.room;
 
-import static 
org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter.FLASH_FPS;
-import static 
org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter.FLASH_NATIVE_SSL;
-import static 
org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter.FLASH_PORT;
-import static 
org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter.FLASH_SECURE;
-import static 
org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter.FLASH_SSL_PORT;
-import static 
org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter.FLASH_VIDEO_CODEC;
+import static 
org.apache.openmeetings.core.remote.ScopeApplicationAdapter.FLASH_FPS;
+import static 
org.apache.openmeetings.core.remote.ScopeApplicationAdapter.FLASH_NATIVE_SSL;
+import static 
org.apache.openmeetings.core.remote.ScopeApplicationAdapter.FLASH_PORT;
+import static 
org.apache.openmeetings.core.remote.ScopeApplicationAdapter.FLASH_SECURE;
+import static 
org.apache.openmeetings.core.remote.ScopeApplicationAdapter.FLASH_SSL_PORT;
+import static 
org.apache.openmeetings.core.remote.ScopeApplicationAdapter.FLASH_VIDEO_CODEC;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 import static org.apache.openmeetings.web.app.Application.getBean;
 
 import java.net.URL;
 
 import org.apache.directory.api.util.Strings;
-import org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter;
+import org.apache.openmeetings.core.remote.ScopeApplicationAdapter;
 import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.util.ExtendedClientProperties;
 import org.apache.wicket.markup.head.IHeaderResponse;
@@ -48,8 +48,8 @@ public class VideoSettings extends Panel
        private final static long serialVersionUID = 1L;
        private final static Logger log = 
Red5LoggerFactory.getLogger(VideoSettings.class, webAppRootKey);
        private final static ResourceReference SETTINGS_JS_REFERENCE = new 
JavaScriptResourceReference(VideoSettings.class, "settings.js");
-       private final static String URL = "url";
-       private final static String FALLBACK = "fallback";
+       public final static String URL = "url";
+       public final static String FALLBACK = "fallback";
 
        public VideoSettings(String id) {
                super(id);
@@ -79,8 +79,8 @@ public class VideoSettings extends Panel
                        URL url = new URL(cp.getCodebase());
                        String path = url.getPath();
                        path = path.substring(1, path.indexOf('/', 2) + 1) + 
scope;
+                       s.put(FLASH_NATIVE_SSL, 
gs.getBoolean(FLASH_NATIVE_SSL));
                        if (gs.getBoolean(FLASH_SECURE)) {
-                               s.put(FLASH_NATIVE_SSL, 
gs.getBoolean(FLASH_NATIVE_SSL));
                                s.put(URL, getUri("rtmps", url.getHost(), 
gs.getString(FLASH_SSL_PORT), path));
                                s.put(FALLBACK, getUri("rtmps", url.getHost(), 
url.getPort(), path));
                        } else {

Modified: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/StartSharingButton.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/StartSharingButton.java?rev=1791522&r1=1791521&r2=1791522&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/StartSharingButton.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/StartSharingButton.java
 Sat Apr 15 16:49:12 2017
@@ -19,6 +19,7 @@
 package org.apache.openmeetings.web.room.menu;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
+import static 
org.apache.openmeetings.core.remote.ScopeApplicationAdapter.FLASH_NATIVE_SSL;
 import static 
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SCREENSHARING_ALLOW_REMOTE;
 import static 
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SCREENSHARING_FPS;
 import static 
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SCREENSHARING_FPS_SHOW;
@@ -26,49 +27,38 @@ import static org.apache.openmeetings.ut
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 import static org.apache.openmeetings.web.app.Application.getBean;
 import static org.apache.openmeetings.web.app.WebSession.getLanguage;
-import static org.apache.openmeetings.web.room.RoomBroadcaster.getClient;
 
-import java.io.File;
-import java.io.FileInputStream;
 import java.io.InputStream;
-import java.net.URI;
-import java.util.Properties;
 
-import org.apache.commons.codec.binary.Hex;
 import org.apache.commons.io.IOUtils;
 import org.apache.openmeetings.core.session.SessionManager;
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
 import org.apache.openmeetings.db.dao.label.LabelDao;
 import org.apache.openmeetings.db.dao.room.RoomDao;
-import org.apache.openmeetings.db.entity.room.Client;
+import org.apache.openmeetings.db.entity.basic.Client;
 import org.apache.openmeetings.db.entity.room.Room;
-import org.apache.openmeetings.util.OmFileHelper;
 import org.apache.openmeetings.web.app.Application;
 import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.common.OmButton;
+import org.apache.openmeetings.web.room.VideoSettings;
 import org.apache.openmeetings.web.util.AjaxDownload;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.behavior.AttributeAppender;
 import org.apache.wicket.util.resource.StringResourceStream;
-import org.apache.wicket.util.string.Strings;
 import org.red5.logging.Red5LoggerFactory;
 import org.slf4j.Logger;
 
+import com.github.openjson.JSONObject;
+
 public class StartSharingButton extends OmButton {
        private static final long serialVersionUID = 1L;
        private static final Logger log = 
Red5LoggerFactory.getLogger(StartSharingButton.class, webAppRootKey);
        private static final String CDATA_BEGIN = "<![CDATA[";
        private static final String CDATA_END = "]]>";
        private final AjaxDownload download;
-       private final org.apache.openmeetings.db.entity.basic.Client c;
-       private enum Protocol {
-               rtmp
-               , rtmpe
-               , rtmps
-               , rtmpt
-       }
+       private final Client c;
 
-       public StartSharingButton(String id, 
org.apache.openmeetings.db.entity.basic.Client c) {
+       public StartSharingButton(String id, Client c) {
                super(id);
                this.c = c;
                setOutputMarkupPlaceholderTag(true);
@@ -92,25 +82,16 @@ public class StartSharingButton extends
                        ConfigurationDao cfgDao = 
getBean(ConfigurationDao.class);
                        app = IOUtils.toString(jnlp, UTF_8);
                        String publicSid = c.getUid();
-                       Client rc = getClient(publicSid);
-                       if (rc == null || rc.getUserId() == null) {
-                               throw new 
RuntimeException(String.format("Unable to find client by publicSID '%s'", 
publicSid));
-                       }
-                       String _url = rc.getTcUrl();
-                       URI url = new URI(_url);
+                       JSONObject s = 
VideoSettings.getInitJson(WebSession.get().getExtendedProperties(), "" + 
c.getRoomId(), publicSid);
+                       String _url = s.getString(VideoSettings.URL);
                        long roomId = c.getRoomId();
                        Room room = getBean(RoomDao.class).get(roomId);
                        SessionManager sessionManager = 
getBean(SessionManager.class);
-                       String path = url.getPath();
-                       path = path.substring(path.lastIndexOf('/') + 1);
-                       if (Strings.isEmpty(path) || rc.getRoomId() == null || 
!path.equals(rc.getRoomId().toString()) || !rc.getRoomId().equals(roomId)) {
-                               throw new 
RuntimeException(String.format("Invalid room id passed %s, expected, %s", path, 
roomId));
-                       }
-                       Protocol protocol = Protocol.valueOf(url.getScheme());
-                       app = addKeystore(rc, app, protocol)
+                       app = app.replace("$native", "" + 
s.getBoolean(FLASH_NATIVE_SSL))
                                        .replace("$codebase", 
WebSession.get().getExtendedProperties().getCodebase())
                                        .replace("$applicationName", 
cfgDao.getAppName())
                                        .replace("$url", _url)
+                                       .replace("$fallback", 
s.getString(VideoSettings.FALLBACK))
                                        .replace("$publicSid", publicSid)
                                        .replace("$labels", getLabels(730,  
731,  732,  733,  734
                                                        ,  735,  737,  738,  
739,  740
@@ -124,7 +105,7 @@ public class StartSharingButton extends
                                        .replace("$defaultFps", 
cfgDao.getConfValue(CONFIG_SCREENSHARING_FPS, String.class, ""))
                                        .replace("$showFps", 
cfgDao.getConfValue(CONFIG_SCREENSHARING_FPS_SHOW, String.class, "true"))
                                        .replace("$allowRemote", 
cfgDao.getConfValue(CONFIG_SCREENSHARING_ALLOW_REMOTE, String.class, "true"))
-                                       .replace("$allowRecording", "" + 
(rc.getUserId() > 0 && room.isAllowRecording() && rc.isAllowRecording() && (0 
== sessionManager.getRecordingCount(roomId))))
+                                       .replace("$allowRecording", "" + 
(room.isAllowRecording() && (0 == sessionManager.getRecordingCount(roomId))))
                                        .replace("$allowPublishing", "" + (0 == 
sessionManager.getPublishingCount(roomId)))
                                        ;
 
@@ -151,47 +132,4 @@ public class StartSharingButton extends
                result.append(CDATA_END);
                return result.toString();
        }
-
-       private static String addKeystore(Client rc, String app, Protocol 
protocol) {
-               log.debug("RTMP Sharer Keystore :: start");
-               String keystore = "--dummy--", password = "--dummy--";
-               if (Protocol.rtmps == protocol) {
-                       File conf = new File(OmFileHelper.getRootDir(), "conf");
-                       File keyStore = new File(conf, "keystore.screen");
-                       if (keyStore.exists()) {
-                               try (FileInputStream fis = new 
FileInputStream(keyStore); FileInputStream ris = new FileInputStream(new 
File(conf, "red5.properties"))) {
-                                       Properties red5Props = new Properties();
-                                       red5Props.load(ris);
-
-                                       byte keyBytes[] = new 
byte[(int)keyStore.length()];
-                                       fis.read(keyBytes);
-
-                                       keystore = 
Hex.encodeHexString(keyBytes);
-                                       password = 
red5Props.getProperty("rtmps.screen.keystorepass");
-
-                                       /*
-                                       KeyStore ksIn = 
KeyStore.getInstance(KeyStore.getDefaultType());
-                                       ksIn.load(new 
FileInputStream(keyStore), 
red5Props.getProperty("rtmps.keystorepass").toCharArray());
-                                       ByteArrayInputStream bin = new 
ByteArrayInputStream()
-
-                                       byte fileContent[] = new 
byte[(int)file.length()];
-                                       sb = addArgument(sb, Object arg)
-                                       ctx.put("$KEYSTORE", users_id);
-                                       /*
-                                       KeyStore ksOut = 
KeyStore.getInstance(KeyStore.getDefaultType());
-                                       for (Certificate cert : 
ksIn.getCertificateChain("red5")) {
-                                               PublicKey pub = 
cert.getPublicKey();
-                                               TrustedCertificateEntry tce = 
new TrustedCertificateEntry(cert);
-                                               tce.
-                                       }
-                                       */
-                               } catch (Exception e) {
-                                       //no op
-                               }
-                       }
-               }
-               return app.replace("$native", "" + rc.isNativeSsl())
-                               .replace("$keystore", CDATA_BEGIN + keystore + 
CDATA_END)
-                               .replace("$password", CDATA_BEGIN + password + 
CDATA_END);
-       }
 }

Modified: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js?rev=1791522&r1=1791521&r2=1791522&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
 (original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
 Sat Apr 15 16:49:12 2017
@@ -88,24 +88,36 @@ var VideoManager = (function() {
        function _getVid(uid) {
                return "video" + uid;
        }
-       function _update(o) {
-               var _id = _getVid(o.uid)
-                       , video = o.activities.indexOf('broadcastV') > -1
-                       , audio = o.activities.indexOf('broadcastA') > -1
+       function _update(c) {
+               var _id = _getVid(c.uid)
+                       , video = c.activities.indexOf('broadcastV') > -1
+                       , audio = c.activities.indexOf('broadcastA') > -1
                        , av = audio || video
                        , v = $('#' + _id);
-               if (av && v.length != 1) {
-                       Video().init(box, o);
+               if (av && v.length != 1 && !!c.self) {
+                       Video().init(box, c);
                } else if (av && v.length == 1) {
-                       v.data().update(o);
+                       v.data().update(c);
                } else if (!av && v.length == 1) {
                        v.remove();
                }
        }
+       function _play(c) {
+               Video().init(box, c);
+       }
+       function _close(uid) {
+               var _id = _getVid(uid)
+                       , v = $('#' + _id);
+               if (v.length == 1) {
+                       v.remove();
+               }
+       }
 
        self.getOptions = function() { return 
JSON.parse(JSON.stringify(options)); };
        self.init = _init;
        self.update = _update;
+       self.play = _play;
+       self.close = _close;
        self.resetSize = function(uid) { $('#' + 
_getVid(uid)).data().resetSize(); };
        return self;
 })();

Modified: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java?rev=1791522&r1=1791521&r2=1791522&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
 Sat Apr 15 16:49:12 2017
@@ -27,7 +27,7 @@ import static org.apache.wicket.ajax.att
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter;
+import org.apache.openmeetings.core.remote.ScopeApplicationAdapter;
 import org.apache.openmeetings.db.entity.basic.Client;
 import org.apache.openmeetings.db.entity.basic.Client.Activity;
 import org.apache.openmeetings.db.entity.basic.Client.Pod;

Modified: 
openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/classes/applicationContext.xml
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/classes/applicationContext.xml?rev=1791522&r1=1791521&r2=1791522&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/classes/applicationContext.xml
 (original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/classes/applicationContext.xml
 Sat Apr 15 16:49:12 2017
@@ -45,7 +45,7 @@
        <context:component-scan base-package="org.apache.openmeetings" />
 
        <!-- New Class for the Streaming Handlers -->
-       <bean id="web.handler" 
class="org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter" />
+       <bean id="web.handler" 
class="org.apache.openmeetings.core.remote.ScopeApplicationAdapter" />
 
        <!-- Session configuration start -->
 


Reply via email to