[OPENMEETINGS-551] hash?swf=settings is fixed, code clean-up
Project: http://git-wip-us.apache.org/repos/asf/openmeetings/repo Commit: http://git-wip-us.apache.org/repos/asf/openmeetings/commit/b1c60093 Tree: http://git-wip-us.apache.org/repos/asf/openmeetings/tree/b1c60093 Diff: http://git-wip-us.apache.org/repos/asf/openmeetings/diff/b1c60093 Branch: refs/heads/master Commit: b1c600933eeb725440d5e30f73afb5f7bd5aa14d Parents: b27ea43 Author: Maxim Solodovnik <[email protected]> Authored: Wed Apr 12 17:17:42 2017 +0000 Committer: Maxim Solodovnik <[email protected]> Committed: Wed Apr 12 17:17:42 2017 +0000 ---------------------------------------------------------------------- .../core/data/whiteboard/WhiteboardManager.java | 135 ---------- .../core/remote/ConferenceLibrary.java | 63 ----- .../openmeetings/core/remote/MainService.java | 165 ------------ .../remote/red5/ScopeApplicationAdapter.java | 242 +---------------- .../openmeetings/db/util/ApplicationHelper.java | 2 +- .../flex/org/apache/openmeetings/OmVideo.as | 11 +- .../src/site/xdoc/Clustering.xml | 2 +- .../src/site/xdoc/voip-sip-integration.xml | 5 +- .../openmeetings/web/app/Application.java | 6 +- .../apache/openmeetings/web/pages/HashPage.java | 26 +- .../apache/openmeetings/web/room/RoomPanel.java | 32 +-- .../openmeetings/web/room/VideoSettings.html | 90 +++++++ .../openmeetings/web/room/VideoSettings.java | 95 +++++++ .../org/apache/openmeetings/web/room/room.js | 163 ------------ .../apache/openmeetings/web/room/settings.js | 179 +++++++++++++ .../web/room/sidebar/RoomSidebar.html | 67 +---- .../web/room/sidebar/RoomSidebar.java | 6 +- .../WEB-INF/classes/applicationContext.xml | 260 ++++++++++++++++++ .../classes/openmeetings-applicationContext.xml | 261 ------------------- .../src/main/webapp/WEB-INF/red5-web.xml | 2 +- .../src/main/webapp/WEB-INF/web.xml | 2 +- .../openmeetings/test/AbstractSpringTest.java | 2 +- pom.xml | 2 +- 23 files changed, 682 insertions(+), 1136 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/openmeetings/blob/b1c60093/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardManager.java ---------------------------------------------------------------------- diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardManager.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardManager.java deleted file mode 100644 index 2154b96..0000000 --- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardManager.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License") + you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.openmeetings.core.data.whiteboard; - -import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey; - -import java.util.Map; - -import org.red5.logging.Red5LoggerFactory; -import org.slf4j.Logger; -import org.springframework.beans.factory.annotation.Autowired; - -public class WhiteboardManager { - private static final Logger log = Red5LoggerFactory.getLogger(WhiteboardManager.class, webAppRootKey); - - @Autowired - private WhiteboardCache whitebardCache; - - @SuppressWarnings("unchecked") - public void add(Long roomId, Map<Integer, Object> whiteboardObj, Long whiteBoardId) { - /* FIXME TODO check this - try { - log.debug("add: ", whiteboardObj); - - String action = whiteboardObj.get(2).toString(); - - log.debug("action: " + action); - log.debug("actionObject: " + whiteboardObj.get(3)); - - List<Object> actionObject = (List<Object>) whiteboardObj.get(3); - - Whiteboard wb = whitebardCache.get(roomId, whiteBoardId); - if (action.equals("moveMap")) { - wb.setX(Integer.valueOf(actionObject.get(1).toString())); - wb.setY(Integer.valueOf(actionObject.get(2).toString())); - } else if (action.equals("draw") || action.equals("redo")) { - // log.debug(actionObject); - // log.debug(actionObject.size()-1); - // log.debug(actionObject.get(actionObject.size()-1)); - if (actionObject != null && !actionObject.isEmpty()) { - String objectType = actionObject.get(0).toString(); - if (!objectType.equals("pointerWhiteBoard")) { - String objectOID = actionObject.get(actionObject.size() - 1).toString(); - log.debug("objectOID: " + objectOID); - wb.add(objectOID, actionObject); - } - } - } else if (action.equals("clear")) { - wb.clear(); - } else if (action.equals("delete") || action.equals("undo")) { - wb.remove(actionObject); - } else if (action.equals("size") || action.equals("editProp") - || action.equals("editTextMindMapNode") - || action.equals("editText") || action.equals("swf") - || action.equals("flv") - || action.equals("editTextMindMapColor") - || action.equals("editTextMindMapFontColor")) { - String objectOID = actionObject.get(actionObject.size() - 1).toString(); - // List roomItem = roomList.get(objectOID); - List<Object> currentObject = wb.get(objectOID); - if ("paint".equals(actionObject.get(0))) { - actionObject.set(1, currentObject.get(1)); - } - wb.add(objectOID, actionObject); - - if (action.equals("swf")) { - log.debug("actionObject " + actionObject); - if (actionObject.get(0).equals("swf")) { - if (actionObject.get(8) != currentObject.get(8)) { - String baseObjectName = actionObject.get(actionObject.size() - 1).toString(); - Integer slidesNumber = Integer.valueOf(actionObject.get(8).toString()); - - log.debug("updateObjectsToSlideNumber :: " + baseObjectName + "," + slidesNumber); - - for (Entry<String, List<Object>> me : wb.entrySet()) { - List<Object> actionObjectStored = me.getValue(); - - if (actionObjectStored.get(0).equals("ellipse") - || actionObjectStored.get(0).equals("drawarrow") - || actionObjectStored.get(0).equals("line") - || actionObjectStored.get(0).equals("clipart") - || actionObjectStored.get(0).equals("paint") - || actionObjectStored.get(0).equals("rectangle") - || actionObjectStored.get(0).equals("uline") - || actionObjectStored.get(0).equals("image") - || actionObjectStored.get(0).equals("letter")) { - - Map<String, Object> swfObj = (Map<String, Object>) actionObjectStored.get(actionObjectStored.size() - 7); - log.debug("swfObj :1: " + swfObj); - - if (swfObj != null) { - if (swfObj.get("name").equals(baseObjectName)) { - swfObj.put("isVisible", Integer.parseInt(swfObj.get("slide").toString()) == slidesNumber); - actionObjectStored.set(actionObjectStored.size() - 7, swfObj); - } - } - - log.debug("swfObj :1: " + swfObj); - } - } - } - } - } - } else if (action.equals("clearSlide")) { - for (Object objectName : actionObject) { - wb.remove(objectName); - } - } else if (action.equals("whiteboardObj")) { - wb.setFullFit((Boolean) actionObject.get(1)); - wb.setZoom((Integer) actionObject.get(2)); - } else { - log.warn("Unkown Type: " + action + " actionObject: " + actionObject); - } - } catch (Exception err) { - log.error("[add]", err); - } - */ - } -} http://git-wip-us.apache.org/repos/asf/openmeetings/blob/b1c60093/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ConferenceLibrary.java ---------------------------------------------------------------------- diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ConferenceLibrary.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ConferenceLibrary.java index 58c6350..230cc89 100644 --- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ConferenceLibrary.java +++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ConferenceLibrary.java @@ -21,24 +21,14 @@ package org.apache.openmeetings.core.remote; import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey; import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import org.apache.openmeetings.core.data.whiteboard.WhiteboardManager; import org.apache.openmeetings.core.documents.LibraryChartLoader; import org.apache.openmeetings.core.documents.LibraryDocumentConverter; -import org.apache.openmeetings.core.documents.LibraryWmlLoader; -import org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter; import org.apache.openmeetings.db.dao.file.FileExplorerItemDao; -import org.apache.openmeetings.db.dao.server.ISessionManager; import org.apache.openmeetings.db.dao.server.SessiondataDao; import org.apache.openmeetings.db.dao.user.UserDao; -import org.apache.openmeetings.db.dto.server.ClientSessionInfo; import org.apache.openmeetings.db.entity.file.FileExplorerItem; -import org.apache.openmeetings.db.entity.file.FileItem; import org.apache.openmeetings.db.entity.file.FileItem.Type; -import org.apache.openmeetings.db.entity.room.Client; import org.apache.openmeetings.db.entity.server.Sessiondata; import org.apache.openmeetings.db.util.AuthLevelUtil; import org.apache.openmeetings.util.OmFileHelper; @@ -57,17 +47,11 @@ public class ConferenceLibrary implements IPendingServiceCallback { private static final Logger log = Red5LoggerFactory.getLogger(ConferenceLibrary.class, webAppRootKey); @Autowired - private ISessionManager sessionManager; - @Autowired private SessiondataDao sessionDao; @Autowired private UserDao userDao; @Autowired private FileExplorerItemDao fileDao; - @Autowired - private WhiteboardManager whiteboardManager; - @Autowired - private ScopeApplicationAdapter scopeAdapter; /** * @@ -106,53 +90,6 @@ public class ConferenceLibrary implements IPendingServiceCallback { } /** - * Loads a Object from the library into the whiteboard of all participant of - * the current room - * - * @param uid - uid of the client performing operation - * @param wbId - id of whiteboard - * @param fi - FileItem of the Wml being loaded - */ - public void sendToWhiteboard(String uid, Long wbId, FileItem fi) { - ClientSessionInfo csi = sessionManager.getClientByPublicSIDAnyServer(uid); - if (csi == null) { - log.warn("No client was found to send Wml:: {}", uid); - return; - } - Client client = csi.getRcl(); - - if (client == null) { - log.warn("No client was found to send Wml:: {}", uid); - return; - } - - List<?> roomItems = LibraryWmlLoader.loadWmlFile(fi.getHash()); - - Map<Integer, Object> wbClear = new HashMap<>(); - wbClear.put(2, "clear"); - wbClear.put(3, null); - - Long roomId = client.getRoomId(); - whiteboardManager.add(roomId, wbClear, wbId); - - for (int k = 0; k < roomItems.size(); k++) { - List<?> actionObject = (List<?>)roomItems.get(k); - - Map<Integer, Object> whiteboardObj = new HashMap<>(); - whiteboardObj.put(2, "draw"); - whiteboardObj.put(3, actionObject); - - whiteboardManager.add(roomId, whiteboardObj, wbId); - } - - Map<String, Object> sendObject = new HashMap<>(); - sendObject.put("id", wbId); - sendObject.put("roomitems", roomItems); - - scopeAdapter.sendToScope(roomId, "loadWmlToWhiteboardById", sendObject); - } - - /** * * Loads a chart object * http://git-wip-us.apache.org/repos/asf/openmeetings/blob/b1c60093/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MainService.java ---------------------------------------------------------------------- diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MainService.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MainService.java index b16733d..74db960 100644 --- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MainService.java +++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MainService.java @@ -18,41 +18,15 @@ */ package org.apache.openmeetings.core.remote; -import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MAX_UPLOAD_SIZE_KEY; -import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_REDIRECT_URL_FOR_EXTERNAL_KEY; -import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SIP_ENABLED; - -import java.util.Arrays; -import java.util.List; -import java.util.Set; - -import org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter; -import org.apache.openmeetings.core.remote.util.SessionVariablesUtil; -import org.apache.openmeetings.db.dao.basic.ConfigurationDao; import org.apache.openmeetings.db.dao.calendar.AppointmentDao; -import org.apache.openmeetings.db.dao.log.ConferenceLogDao; -import org.apache.openmeetings.db.dao.room.RoomDao; -import org.apache.openmeetings.db.dao.server.ISessionManager; -import org.apache.openmeetings.db.dao.server.SessiondataDao; -import org.apache.openmeetings.db.dao.user.IUserManager; -import org.apache.openmeetings.db.dao.user.UserDao; -import org.apache.openmeetings.db.entity.basic.Configuration; import org.apache.openmeetings.db.entity.calendar.Appointment; import org.apache.openmeetings.db.entity.calendar.MeetingMember; -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.RoomGroup; -import org.apache.openmeetings.db.entity.server.Sessiondata; import org.apache.openmeetings.db.entity.user.GroupUser; import org.apache.openmeetings.db.entity.user.User; -import org.apache.openmeetings.db.entity.user.User.Right; -import org.apache.openmeetings.db.entity.user.Userdata; -import org.apache.openmeetings.db.util.AuthLevelUtil; import org.apache.openmeetings.util.OpenmeetingsVariables; import org.red5.logging.Red5LoggerFactory; -import org.red5.server.api.IConnection; -import org.red5.server.api.Red5; import org.red5.server.api.service.IPendingServiceCall; import org.red5.server.api.service.IPendingServiceCallback; import org.slf4j.Logger; @@ -67,63 +41,11 @@ public class MainService implements IPendingServiceCallback { private static final Logger log = Red5LoggerFactory.getLogger(MainService.class, OpenmeetingsVariables.webAppRootKey); @Autowired - private ISessionManager sessionManager; - @Autowired - private ScopeApplicationAdapter scopeApplicationAdapter; - @Autowired - private SessiondataDao sessionDao; - @Autowired - private ConfigurationDao configurationDao; - @Autowired - private IUserManager userManager; - @Autowired - private ConferenceLogDao conferenceLogDao; - @Autowired - private UserDao userDao; - @Autowired - private RoomDao roomDao; - @Autowired private AppointmentDao appointmentDao; // External User Types public static final String EXTERNAL_USER_TYPE_LDAP = "LDAP"; - - /** - * gets a user by its SID - * - * @param sid - * @param userId - * @return - user with SID given - */ - public User getUser(String sid, long userId) { - User users = new User(); - Sessiondata sd = sessionDao.check(sid); - Set<Right> rights = userDao.getRights(sd.getUserId()); - if (AuthLevelUtil.hasAdminLevel(rights) || AuthLevelUtil.hasWebServiceLevel(rights)) { - users = userDao.get(userId); - } else { - users.setFirstname("No rights to do this"); - } - return users; - } - - public Client getCurrentRoomClient(String SID) { - try { - IConnection current = Red5.getConnectionLocal(); - String streamid = current.getClient().getId(); - - log.debug("getCurrentRoomClient -1- " + SID); - log.debug("getCurrentRoomClient -2- " + streamid); - - Client currentClient = sessionManager.getClientByStreamId(streamid, null); - return currentClient; - } catch (Exception err) { - log.error("[getCurrentRoomClient]", err); - } - return null; - } - public boolean isRoomAllowedToUser(Room r, User u) { boolean allowed = false; if (r != null) { @@ -172,93 +94,6 @@ public class MainService implements IPendingServiceCallback { return allowed; } - public List<Object> loginWicket(String wicketSID, Long wicketroomid) { - log.debug("[loginWicket] wicketSID: '{}'; wicketroomid: '{}'", wicketSID, wicketroomid); - Sessiondata sd = sessionDao.check(wicketSID); - Long userId = sd.getUserId(); - User u = userId == null ? null : userDao.get(userId); - Room r = roomDao.get(wicketroomid); - if (u != null && r != null) { - log.debug("[loginWicket] user and roomid are not empty: " + userId + ", " + wicketroomid); - if (wicketroomid.equals(sd.getRoomId()) || isRoomAllowedToUser(r, u)) { - IConnection current = Red5.getConnectionLocal(); - String streamId = current.getClient().getId(); - Client currentClient = sessionManager.getClientByStreamId(streamId, null); - - if (User.Type.user != u.getType() || (User.Type.user == u.getType() && !u.getGroupUsers().isEmpty())) { - u.setSessionData(sd); - currentClient.setUserId(u.getId()); - currentClient.setRoomId(wicketroomid); - SessionVariablesUtil.setUserId(current.getClient(), u.getId()); - - currentClient.setUsername(u.getLogin()); - currentClient.setFirstname(u.getFirstname()); - currentClient.setLastname(u.getLastname()); - currentClient.setPicture_uri(u.getPictureuri()); - currentClient.setEmail(u.getAddress() == null ? null : u.getAddress().getEmail()); - sessionManager.updateClientByStreamId(streamId, currentClient, false, null); - - scopeApplicationAdapter.sendMessageToCurrentScope("roomConnect", currentClient, false); - - return Arrays.<Object>asList(u, r); - } - } - } - return null; - } - - /** - * Function is called if the user loggs in via a secureHash and sets the - * param showNickNameDialog in the Object SOAPLogin to true the user gets - * displayed an additional dialog to enter his nickname - * - * @param firstname - * @param lastname - * @param email - * @return - 1 in case of success, -1 otherwise - */ - public Long setUserNickName(String firstname, String lastname, String email) { - try { - IConnection current = Red5.getConnectionLocal(); - String streamId = current.getClient().getId(); - Client currentClient = sessionManager.getClientByStreamId(streamId, null); - - currentClient.setFirstname(firstname); - currentClient.setLastname(lastname); - currentClient.setEmail(email); - - // Log the User - conferenceLogDao.add( - ConferenceLog.Type.nicknameEnter, currentClient.getUserId(), streamId, - null, currentClient.getUserip(), currentClient.getScope()); - - sessionManager.updateClientByStreamId(streamId, currentClient, false, null); - scopeApplicationAdapter.sendMessageToCurrentScope("nickNameSet", currentClient, true); - - return 1L; - } catch (Exception err) { - log.error("[setUserNickName] ", err); - } - return new Long(-1); - } - - 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); - } catch (Exception err) { - log.error("[getGeneralOptions]",err); - } - return null; - } - - public List<Userdata> getUserdata(String sid) { - Sessiondata sd = sessionDao.check(sid); - if (AuthLevelUtil.hasUserLevel(userDao.getRights(sd.getUserId()))) { - return userManager.getUserdataDashBoard(sd.getUserId()); - } - return null; - } - @Override public void resultReceived(IPendingServiceCall arg0) { log.debug("[resultReceived]" + arg0); http://git-wip-us.apache.org/repos/asf/openmeetings/blob/b1c60093/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java ---------------------------------------------------------------------- diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java index 6a44556..ab9d5ab 100644 --- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java +++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java @@ -18,18 +18,15 @@ */ package org.apache.openmeetings.core.remote.red5; -import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_MP4; import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_FLASH_SECURE; import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_FLASH_SECURE_PROXY; import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_FLASH_VIDEO_CODEC; import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey; -import java.awt.Point; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.util.ArrayList; -import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.HashSet; @@ -42,11 +39,8 @@ import java.util.Set; import java.util.UUID; import java.util.concurrent.atomic.AtomicLong; -import org.apache.commons.io.FileUtils; import org.apache.openmeetings.IApplication; import org.apache.openmeetings.core.data.conference.RoomManager; -import org.apache.openmeetings.core.data.whiteboard.WhiteboardCache; -import org.apache.openmeetings.core.data.whiteboard.WhiteboardManager; import org.apache.openmeetings.core.remote.RecordingService; import org.apache.openmeetings.core.remote.util.SessionVariablesUtil; import org.apache.openmeetings.core.util.WebSocketHelper; @@ -62,8 +56,6 @@ 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.dto.server.ClientSessionInfo; -import org.apache.openmeetings.db.entity.file.FileItem; import org.apache.openmeetings.db.entity.log.ConferenceLog; import org.apache.openmeetings.db.entity.room.Client; import org.apache.openmeetings.db.entity.room.Room; @@ -105,15 +97,16 @@ public class ScopeApplicationAdapter extends MultiThreadedApplicationAdapter imp private static final String SECURITY_CODE_PARAM = "securityCode"; private static final String WIDTH_PARAM = "width"; private static final String HEIGHT_PARAM = "height"; - private static final String NATIVE_SSL_PARAM = "nativeSsl"; + public static final String FLASH_SECURE = "secure"; + public static final String FLASH_NATIVE_SSL = "native"; + public static final String FLASH_PORT = "rtmpPort"; + public static final String FLASH_SSL_PORT = "rtmpsPort"; + public static final String FLASH_VIDEO_CODEC = "videoCodec"; + public static final String FLASH_FPS = "fps"; @Autowired private ISessionManager sessionManager; @Autowired - private WhiteboardManager whiteboardManager; - @Autowired - private WhiteboardCache whiteboardCache; - @Autowired private RecordingService recordingService; @Autowired private ConfigurationDao cfgDao; @@ -161,12 +154,12 @@ public class ScopeApplicationAdapter extends MultiThreadedApplicationAdapter imp props.load(is); } flashSettings = new JSONObject() - .put("secure", "yes".equals(cfgDao.getConfValue(CONFIG_FLASH_SECURE, String.class, "no"))) - .put("proxyType", cfgDao.getConfValue(CONFIG_FLASH_SECURE_PROXY, String.class, "none")) - .put("rtmpPort", props.getProperty("rtmp.port")) - .put("rtmpsPort", props.getProperty("rtmps.port")) - .put("videoCodec", cfgDao.getConfValue(CONFIG_FLASH_VIDEO_CODEC, String.class, "h263")) - .put("fps", cfgDao.getConfValue(OpenmeetingsVariables.CONFIG_FLASH_VIDEO_FPS, Integer.class, "30")) + .put(FLASH_SECURE, "yes".equals(cfgDao.getConfValue(CONFIG_FLASH_SECURE, String.class, "no"))) + .put(FLASH_NATIVE_SSL, "best".equals(cfgDao.getConfValue(CONFIG_FLASH_SECURE_PROXY, String.class, "none"))) + .put(FLASH_PORT, props.getProperty("rtmp.port")) + .put(FLASH_SSL_PORT, props.getProperty("rtmps.port")) + .put(FLASH_VIDEO_CODEC, cfgDao.getConfValue(CONFIG_FLASH_VIDEO_CODEC, String.class, "h263")) + .put(FLASH_FPS, cfgDao.getConfValue(OpenmeetingsVariables.CONFIG_FLASH_VIDEO_FPS, Integer.class, "30")) ; for (String scopeName : scope.getScopeNames()) { @@ -307,7 +300,6 @@ public class ScopeApplicationAdapter extends MultiThreadedApplicationAdapter imp rcm.setUserip(conn.getRemoteAddress()); rcm.setSwfurl(swfURL); rcm.setTcUrl(tcUrl); - rcm.setNativeSsl(Boolean.TRUE.equals(connParams.get(NATIVE_SSL_PARAM))); if (!Strings.isEmpty(uid)) { rcm.setPublicSID(uid); } @@ -1151,212 +1143,6 @@ public class ScopeApplicationAdapter extends MultiThreadedApplicationAdapter imp return null; } - /** - * This Function is triggered from the Whiteboard - * - * @param whiteboardObjParam - array of parameters being sended to whiteboard - * @param whiteboardId - id of whiteboard parameters will be send to - * @return 1 in case of no errors, -1 otherwise - */ - public int sendVarsByWhiteboardId(List<?> whiteboardObjParam, Long whiteboardId) { - try { - IConnection current = Red5.getConnectionLocal(); - Client client = sessionManager.getClientByStreamId(current.getClient().getId(), null); - return sendToWhiteboard(client, whiteboardObjParam, whiteboardId); - } catch (Exception err) { - log.error("[sendVarsByWhiteboardId]", err); - return -1; - } - } - - private static Point getSize(FileItem fi) { - Point result = new Point(0, 0); - if (fi.getWidth() != null && fi.getHeight() != null) { - result.x = fi.getWidth(); - result.y = fi.getHeight(); - } - return result; - } - - private static List<?> getWbObject(FileItem fi, String url) { - Point size = getSize(fi); - String type = "n/a"; - switch (fi.getType()) { - case Image: - type = "image"; - break; - case Presentation: - type = "swf"; - break; - default: - } - return Arrays.asList( - type // 0 - , url // urlname - , "--dummy--" // baseurl - , fi.getName() // fileName //3 - , "--dummy--" // moduleName //4 - , "--dummy--" // parentPath //5 - , "--dummy--" // room //6 - , "--dummy--" // domain //7 - , 1 // slideNumber //8 - , 0 // innerx //9 - , 0 // innery //10 - , size.x // innerwidth //11 - , size.y // innerheight //12 - , 20 // zoomlevel //13 - , size.x // initwidth //14 - , size.y // initheight //15 - , 100 // currentzoom //16 FIXME TODO - , fi.getHash() // uniquObjectSyncName //17 - , fi.getName() // standardFileName //18 - , true // fullFit //19 FIXME TODO - , 0 // zIndex //-8 - , null //-7 - , 0 // this.counter //-6 FIXME TODO - , 0 // posx //-5 - , 0 // posy //-4 - , size.x // width //-3 - , size.y // height //-2 - , fi.getHash() // this.currentlayer.name //-1 - ); - } - - private static List<?> getMp4WbObject(FileItem fi, String url) { - Point size = getSize(fi); - return Arrays.asList( - "flv" // 0: 'flv' - , fi.getId() // 1: 7 - , fi.getName() // 2: 'BigBuckBunny_512kb.mp4' - , url // 3: posterUrl - , size.x // 4: 416 - , size.y // 5: 240 - , 0 // 6: 1 // z-index - , fi.getHash() // 7: null //TODO - , 0 // 8: 0 //TODO // counter - , 0 // 9: 0 //TODO // x - , 0 // 10: 0 //TODO // y - , size.x // 11: 749 // width - , size.y // 12: 739 // height - , fi.getHash() // 13: 'flv_1469602000351' - ); - } - - private static void copyFileToRoom(Long roomId, FileItem f) { - try { - if (roomId != null && f != null) { - File mp4 = f.getFile(EXTENSION_MP4); - - File targetFolder = OmFileHelper.getStreamsSubDir(roomId); - - File target = new File(targetFolder, mp4.getName()); - if (mp4.exists() && !target.exists()) { - FileUtils.copyFile(mp4, target, false); - } - } - } catch (Exception err) { - log.error("[copyFileToCurrentRoom] ", err); - } - } - - public void sendToWhiteboard(String uid, Long wbId, FileItem fi, String url, boolean clean) { - ClientSessionInfo csi = sessionManager.getClientByPublicSIDAnyServer(uid); - if (csi == null) { - log.warn("No client was found to send Wml:: {}", uid); - return; - } - Client client = csi.getRcl(); - - List<?> wbObject = new ArrayList<>(); - switch (fi.getType()) { - case Image: - wbObject = getWbObject(fi, url); - break; - case Presentation: - wbObject = getWbObject(fi, url); - break; - case Video: - case Recording: - wbObject = getMp4WbObject(fi, url); - copyFileToRoom(client.getRoomId(), fi); - break; - default: - } - if (clean) { - Map<String, Object> wbClear = new HashMap<>(); - wbClear.put("id", wbId); - wbClear.put("param", Arrays.asList("whiteboard", new Date(), "clear", null)); - - whiteboardCache.clear(client.getRoomId(), wbId); - sendToScope(client.getRoomId(), "sendVarsToWhiteboardById", Arrays.asList(null, wbClear)); - } - sendToWhiteboard(client, Arrays.asList("whiteboard", new Date(), "draw", wbObject), wbId); - } - - private int sendToWhiteboard(Client client, List<?> wbObj, Long wbId) { - try { - // Check if this User is the Mod: - if (client == null) { - return -1; - } - - Map<Integer, Object> whiteboardObj = new HashMap<>(); - int i = 0; - for (Object obj : wbObj) { - whiteboardObj.put(i++, obj); - } - - Long roomId = client.getRoomId(); - - // log.debug("***** sendVars: " + whiteboardObj); - - // Store event in list - String action = whiteboardObj.get(2).toString(); - - if (action.equals("deleteMindMapNodes")) { - // Simulate Single Delete Events for z-Index - List<?> actionObject = (List<?>) whiteboardObj.get(3); - - @SuppressWarnings("unchecked") - List<List<?>> itemObjects = (List<List<?>>) actionObject.get(3); - - Map<Integer, Object> whiteboardTempObj = new HashMap<>(); - whiteboardTempObj.put(2, "delete"); - - for (List<?> itemObject : itemObjects) { - List<Object> tempActionObject = new ArrayList<>(); - tempActionObject.add("mindmapnode"); - tempActionObject.add(itemObject.get(0)); // z-Index -8 - tempActionObject.add(null); // simulate -7 - tempActionObject.add(null); // simulate -6 - tempActionObject.add(null); // simulate -5 - tempActionObject.add(null); // simulate -4 - tempActionObject.add(null); // simulate -3 - tempActionObject.add(null); // simulate -2 - tempActionObject.add(itemObject.get(1)); // Object-Name -1 - - whiteboardTempObj.put(3, tempActionObject); - - whiteboardManager.add(roomId, whiteboardTempObj, wbId); - } - } else { - whiteboardManager.add(roomId, whiteboardObj, wbId); - } - - Map<String, Object> sendObject = new HashMap<>(); - sendObject.put("id", wbId); - sendObject.put("param", wbObj); - - boolean showDrawStatus = getWhiteboardDrawStatus(); - - sendToScope(roomId, "sendVarsToWhiteboardById", new Object[] { showDrawStatus ? client : null, sendObject }); - } catch (Exception err) { - log.error("[sendToWhiteboard]", err); - return -1; - } - return 1; - } - public int sendMessage(Object newMessage) { sendMessageToCurrentScope("sendVarsToMessage", newMessage, false); return 1; @@ -1867,10 +1653,6 @@ public class ScopeApplicationAdapter extends MultiThreadedApplicationAdapter imp return new ArrayList<>(); } - private boolean getWhiteboardDrawStatus() { - return cfgDao.getWhiteboardDrawStatus(); - } - public String getCryptKey() { return cfgDao.getCryptKey(); } http://git-wip-us.apache.org/repos/asf/openmeetings/blob/b1c60093/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/ApplicationHelper.java ---------------------------------------------------------------------- diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/ApplicationHelper.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/ApplicationHelper.java index 5079c61..c509be4 100644 --- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/ApplicationHelper.java +++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/ApplicationHelper.java @@ -100,7 +100,7 @@ public class ApplicationHelper { OMContextListener omcl = new OMContextListener(); omcl.contextInitialized(new ServletContextEvent(sc)); XmlWebApplicationContext xmlContext = new XmlWebApplicationContext(); - xmlContext.setConfigLocation("classpath:openmeetings-applicationContext.xml"); + xmlContext.setConfigLocation("classpath:applicationContext.xml"); xmlContext.setServletContext(sc); xmlContext.refresh(); sc.setAttribute(ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, xmlContext); http://git-wip-us.apache.org/repos/asf/openmeetings/blob/b1c60093/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as ---------------------------------------------------------------------- diff --git a/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as b/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as index 23eabbe..cbc0ffe 100644 --- a/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as +++ b/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as @@ -160,18 +160,9 @@ public class OmVideo { } } - private function getUrl():String { - var secure:Boolean = ('true' === params.secure); - var url:String = (secure ? "rtmps" : "rtmp") + "://" - + params.host + ":" + (secure ? params.rtmpsPort : params.rtmpPort) - + "/" + params.app; - //TODO fallback - return url; - } - private function publish(mode:String, name:String, cam:Camera, mic:Microphone, f:Function):void { if (nc == null || !nc.connected) { - var url:String = getUrl(); + var url:String = params.url; //TODO fallback debug("NetConnection is not connected", url); nc = new NetConnection(); nc.addEventListener(NetStatusEvent.NET_STATUS, function onConnectionStatus(e:NetStatusEvent):void { http://git-wip-us.apache.org/repos/asf/openmeetings/blob/b1c60093/openmeetings-server/src/site/xdoc/Clustering.xml ---------------------------------------------------------------------- diff --git a/openmeetings-server/src/site/xdoc/Clustering.xml b/openmeetings-server/src/site/xdoc/Clustering.xml index a1ccc27..9d073d1 100644 --- a/openmeetings-server/src/site/xdoc/Clustering.xml +++ b/openmeetings-server/src/site/xdoc/Clustering.xml @@ -80,7 +80,7 @@ </ul> </section> <section name="OM nodes configuration"> - <p>In the file <tt>/opt/red5/webapps/openmeetings/WEB-INF/classes/openmeetings-applicationContext.xml</tt>:</p> + <p>In the file <tt>/opt/red5/webapps/openmeetings/WEB-INF/classes/applicationContext.xml</tt>:</p> <ul> <li> For each node uncomment line: http://git-wip-us.apache.org/repos/asf/openmeetings/blob/b1c60093/openmeetings-server/src/site/xdoc/voip-sip-integration.xml ---------------------------------------------------------------------- diff --git a/openmeetings-server/src/site/xdoc/voip-sip-integration.xml b/openmeetings-server/src/site/xdoc/voip-sip-integration.xml index 9369ee7..72cf707 100644 --- a/openmeetings-server/src/site/xdoc/voip-sip-integration.xml +++ b/openmeetings-server/src/site/xdoc/voip-sip-integration.xml @@ -61,9 +61,12 @@ <a href="red5sip-integration_3.1.html"> Instruction how-to set up OpenMeetings SIP-Transport integration for Openmeetings 3.1+ </a>.<br/> + <a href="red5sip-integration_4.0.html"> + Instruction how-to set up OpenMeetings SIP-Transport integration for Openmeetings 4.0+ + </a>.<br/> </p> </section> </body> -</document> \ No newline at end of file +</document> http://git-wip-us.apache.org/repos/asf/openmeetings/blob/b1c60093/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java index b40c9e2..0f361dd 100644 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java @@ -99,8 +99,7 @@ import org.apache.wicket.request.cycle.RequestCycle; import org.apache.wicket.request.mapper.info.PageComponentInfo; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.request.mapper.parameter.PageParametersEncoder; -import org.apache.wicket.request.resource.JavaScriptResourceReference; -import org.apache.wicket.resource.DynamicJQueryResourceReference; +import org.apache.wicket.resource.JQueryResourceReference; import org.apache.wicket.util.collections.ConcurrentHashSet; import org.apache.wicket.validation.validator.UrlValidator; import org.slf4j.Logger; @@ -138,8 +137,7 @@ public class Application extends AuthenticatedWebApplication implements IApplica //chain of Resource Loaders, if not found it will search in Wicket's internal //Resource Loader for a the property key getResourceSettings().getStringResourceLoaders().add(0, new LabelResourceLoader()); - //FIXME TODO v3 on the way - getJavaScriptLibrarySettings().setJQueryReference(new JavaScriptResourceReference(DynamicJQueryResourceReference.class, DynamicJQueryResourceReference.VERSION_2)); + getJavaScriptLibrarySettings().setJQueryReference(JQueryResourceReference.getV3()); super.init(); http://git-wip-us.apache.org/repos/asf/openmeetings/blob/b1c60093/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.java ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.java index 8fa58ff..9ec4dea 100644 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.java +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.java @@ -34,16 +34,20 @@ import org.apache.openmeetings.db.entity.room.Room; import org.apache.openmeetings.web.app.WebSession; import org.apache.openmeetings.web.common.IUpdatable; import org.apache.openmeetings.web.common.MainPanel; +import org.apache.openmeetings.web.common.OmAjaxClientInfoBehavior; import org.apache.openmeetings.web.room.RoomPanel; import org.apache.openmeetings.web.room.SwfPanel; +import org.apache.openmeetings.web.room.VideoSettings; import org.apache.openmeetings.web.user.record.VideoInfo; import org.apache.openmeetings.web.user.record.VideoPlayer; +import org.apache.openmeetings.web.util.ExtendedClientProperties; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.core.request.handler.IPartialPageRequestHandler; import org.apache.wicket.markup.head.CssHeaderItem; import org.apache.wicket.markup.head.IHeaderResponse; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.panel.EmptyPanel; +import org.apache.wicket.protocol.http.request.WebClientInfo; import org.apache.wicket.request.IRequestParameters; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.util.string.StringValue; @@ -137,9 +141,25 @@ public class HashPage extends BaseInitedPage implements IUpdatable { } } StringValue swf = p.get(SWF); - if (!swf.isEmpty() && (SWF_TYPE_NETWORK.equals(swf.toString()) || SWF_TYPE_SETTINGS.equals(swf.toString()))) { - replace(new SwfPanel(PANEL_MAIN, p)); - error = false; + if (!swf.isEmpty()) { + if (SWF_TYPE_NETWORK.equals(swf.toString())) { + replace(new SwfPanel(PANEL_MAIN, p)); + error = false; + } + if (SWF_TYPE_SETTINGS.equals(swf.toString())) { + replace(new VideoSettings(PANEL_MAIN).add(new OmAjaxClientInfoBehavior() { + private static final long serialVersionUID = 1L; + + @Override + protected void onClientInfo(AjaxRequestTarget target, WebClientInfo info) { + super.onClientInfo(target, info); + target.appendJavaScript( + VideoSettings.getInitScript((ExtendedClientProperties)info.getProperties(), "hibernate", "networktest") + .append("VideoSettings.open();")); + } + })); + error = false; + } } add(recContainer.add(vi.setShowShare(false).setOutputMarkupPlaceholderTag(true), vp.setOutputMarkupPlaceholderTag(true)), new InvitationPasswordDialog("i-pass", this)); http://git-wip-us.apache.org/repos/asf/openmeetings/blob/b1c60093/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java index b05150f..c4d9728 100644 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java @@ -27,8 +27,6 @@ import static org.apache.openmeetings.web.app.Application.getRoomClients; import static org.apache.openmeetings.web.app.WebSession.getDateFormat; import static org.apache.openmeetings.web.app.WebSession.getUserId; -import java.net.MalformedURLException; -import java.net.URL; import java.util.Calendar; import java.util.List; import java.util.Map.Entry; @@ -36,7 +34,6 @@ import java.util.Set; import java.util.UUID; import org.apache.directory.api.util.Strings; -import org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter; import org.apache.openmeetings.core.util.WebSocketHelper; import org.apache.openmeetings.db.dao.calendar.AppointmentDao; import org.apache.openmeetings.db.dao.log.ConferenceLogDao; @@ -65,6 +62,7 @@ import org.apache.openmeetings.web.room.activities.Activity; import org.apache.openmeetings.web.room.menu.RoomMenuPanel; import org.apache.openmeetings.web.room.sidebar.RoomSidebar; import org.apache.openmeetings.web.room.wb.WbPanel; +import org.apache.openmeetings.web.util.ExtendedClientProperties; import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior; @@ -77,14 +75,12 @@ import org.apache.wicket.markup.head.JavaScriptHeaderItem; import org.apache.wicket.markup.head.OnDomReadyHeaderItem; import org.apache.wicket.markup.head.PriorityHeaderItem; import org.apache.wicket.markup.html.WebMarkupContainer; -import org.apache.wicket.protocol.http.ClientProperties; import org.apache.wicket.protocol.ws.api.event.WebSocketPushPayload; import org.apache.wicket.request.resource.JavaScriptResourceReference; import org.apache.wicket.request.resource.ResourceReference; import org.red5.logging.Red5LoggerFactory; import org.slf4j.Logger; -import com.github.openjson.JSONObject; import com.googlecode.wicket.jquery.core.JQueryBehavior; import com.googlecode.wicket.jquery.core.Options; import com.googlecode.wicket.jquery.ui.interaction.droppable.Droppable; @@ -113,30 +109,13 @@ public class RoomPanel extends BasePanel { @Override protected void respond(AjaxRequestTarget target) { target.appendJavaScript("setRoomSizes();"); + ExtendedClientProperties cp = WebSession.get().getExtendedProperties(); getBean(ConferenceLogDao.class).add( ConferenceLog.Type.roomEnter , getUserId(), "0", r.getId() - , WebSession.get().getClientInfo().getProperties().getRemoteAddress() + , cp.getRemoteAddress() , "" + r.getId()); - //TODO SID etc - try { - URL url = new URL(WebSession.get().getExtendedProperties().getCodebase()); - String path = url.getPath(); - path = path.substring(1, path.indexOf('/', 2) + 1); - ClientProperties cp = WebSession.get().getClientInfo().getProperties(); - target.appendJavaScript(String.format("VideoSettings.init(%s);", new JSONObject(getBean(ScopeApplicationAdapter.class).getFlashSettings().toString()) - .put("uid", getClient().getUid()) - .put("audioOnly", r.isAudioOnly()) - .put("SID", WebSession.getSid()) - .put("interview", Room.Type.interview == r.getType()) - .put("host", url.getHost()) - .put("app", path + r.getId()) - .put("wmode", cp.isBrowserInternetExplorer() && cp.getBrowserVersionMajor() == 11 ? "opaque" : "direct") - .toString() - )); - } catch (NullPointerException|MalformedURLException e) { - log.error("Error while constructing room parameters", e); - } + target.appendJavaScript(VideoSettings.getInitScript(cp, "" + r.getId(), getClient().getUid())); WebSocketHelper.sendRoom(new RoomMessage(r.getId(), getUserId(), RoomMessage.Type.roomEnter)); getMainPanel().getChat().roomEnter(r, target); if (r.isFilesOpened()) { @@ -616,10 +595,9 @@ public class RoomPanel extends BasePanel { public boolean screenShareAllowed() { Room r = getRoom(); - org.apache.openmeetings.db.entity.room.Client rcl = RoomBroadcaster.getClient(getMainPanel().getClient().getUid()); return Room.Type.interview != r.getType() && !r.isHidden(RoomElement.ScreenSharing) && r.isAllowRecording() && getClient().hasRight(Right.share) - && getSharingUser() == null && rcl != null && rcl.getUserId() != null; + && getSharingUser() == null; } public RoomSidebar getSidebar() { http://git-wip-us.apache.org/repos/asf/openmeetings/blob/b1c60093/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.html ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.html new file mode 100644 index 0000000..bd931f7 --- /dev/null +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.html @@ -0,0 +1,90 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + +--> +<html xmlns:wicket="http://wicket.apache.org"> +<wicket:panel> + <div id="video-settings" wicket:message="title:51, data-btn-save:144, data-btn-cancel:25" style="display:none;"> + <div class="title"><wicket:message key="758"/></div> + <div class="sett-container"> + <div class="opt-block"> + <div class="sett-row"> + <div><wicket:message key="52"/></div> + <div> + <select class="cam"> + <option value="-1"><wicket:message key="159"/></option> + </select> + </div> + </div> + <div class="sett-row"> + <div><wicket:message key="53"/></div> + <div> + <select class="mic"> + <option value="-1"><wicket:message key="159"/></option> + </select> + </div> + </div> + <div class="sett-row"> + <div class="clear"> + <wicket:message key="1429"/> + <span class="warn ui-state-highlight" wicket:message="title:1430"> + <span class="ui-icon ui-icon-alert"></span> + </span> + </div> + <div> + <select class="cam-resolution"> + <option value="1" data-width="40" data-height="30">40x30 [4:3 (~6 KByte/sec)]</option> + <option value="2" data-width="80" data-height="60">80x60 [4:3 (~12 KByte/sec)]</option> + <option value="3" data-width="120" data-height="90" selected="selected">120x90 [4:3 (~20 KByte/sec)]</option> + <option value="4" data-width="160" data-height="120">160x120 [QQVGA 4:3 (~36 KByte/sec)]</option> + <option value="5" data-width="240" data-height="180">240x180 [4:3 (~40 KByte/sec)]</option> + <option value="6" data-width="320" data-height="240">320x240 [HVGA 4:3 (~56 KByte/sec)]</option> + <option value="7" data-width="480" data-height="360">480x360 [4:3 (~60 KByte/sec)]</option> + <option value="8" data-width="640" data-height="480">640x480 [4:3 (~68 KByte/sec)]</option> + <option value="9" data-width="1024" data-height="768">1024x768 [XGA 4:3]</option> + <option value="10" data-width="256" data-height="150">256x150 [16:9]</option> + <option value="11" data-width="432" data-height="240">432x240 [WQVGA 9:5]</option> + <option value="12" data-width="480" data-height="234">480x234 [pseudo 16:9]</option> + <option value="13" data-width="512" data-height="300">512x300 [16:9]</option> + <option value="14" data-width="640" data-height="360">640x360 [nHD 16:9]</option> + <option value="15" data-width="1024" data-height="600">1024x600 [16:9]</option> + </select> + </div> + </div> + <div class="sett-row right"> + <div><button class="rec-start"><wicket:message key="775"/></button></div> + </div> + </div> + <div class="vid-block"> + <div class="video-conainer"></div> + <div class="level-meter"></div> + <div class="sett-row right"> + <div><button class="play"><wicket:message key="764"/></button></div> + </div> + </div> + </div> + <div> + <span style="padding: 5px;"> + <span class="ui-icon ui-icon-info"></span> + </span> + <wicket:message key="765"/> + </div> + </div> +</wicket:panel> +</html> http://git-wip-us.apache.org/repos/asf/openmeetings/blob/b1c60093/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.java ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.java new file mode 100644 index 0000000..98319fc --- /dev/null +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.java @@ -0,0 +1,95 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License") + you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.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.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.web.app.WebSession; +import org.apache.openmeetings.web.util.ExtendedClientProperties; +import org.apache.wicket.markup.head.IHeaderResponse; +import org.apache.wicket.markup.head.JavaScriptHeaderItem; +import org.apache.wicket.markup.head.PriorityHeaderItem; +import org.apache.wicket.markup.html.panel.Panel; +import org.apache.wicket.request.resource.JavaScriptResourceReference; +import org.apache.wicket.request.resource.ResourceReference; +import org.red5.logging.Red5LoggerFactory; +import org.slf4j.Logger; + +import com.github.openjson.JSONObject; + +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 VideoSettings(String id) { + super(id); + } + + @Override + public void renderHead(IHeaderResponse response) { + super.renderHead(response); + response.render(new PriorityHeaderItem(JavaScriptHeaderItem.forReference(SETTINGS_JS_REFERENCE))); + } + + private static String getUri(String protocol, String host, Object port, String app) { + return String.format("%s://%s:%s/%s", protocol, host, port, app); + } + + public static StringBuilder getInitScript(ExtendedClientProperties cp, String scope, String uid) { + JSONObject gs = getBean(ScopeApplicationAdapter.class).getFlashSettings(); + JSONObject s = new JSONObject() + .put(FLASH_VIDEO_CODEC, gs.get(FLASH_VIDEO_CODEC)) + .put(FLASH_FPS, gs.get(FLASH_FPS)) + .put("SID", WebSession.getSid()) + .put("wmode", cp.isBrowserInternetExplorer() && cp.getBrowserVersionMajor() == 11 ? "opaque" : "direct"); + if (!Strings.isEmpty(uid)) { + s.put("uid", uid); + } + try { + URL url = new URL(cp.getCodebase()); + String path = url.getPath(); + path = path.substring(1, path.indexOf('/', 2) + 1) + scope; + if (gs.getBoolean(FLASH_SECURE)) { + s.put(FLASH_NATIVE_SSL, gs.get(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 { + s.put(URL, getUri("rtmp", url.getHost(), gs.getString(FLASH_PORT), path)); + s.put(FALLBACK, getUri("rtmpt", url.getHost(), url.getPort(), path)); + } + } catch (Exception e) { + log.error("Error while constructing video settings parameters", e); + } + return new StringBuilder("VideoSettings.init(").append(s.toString()).append(");"); + } +} http://git-wip-us.apache.org/repos/asf/openmeetings/blob/b1c60093/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js index 1e2c563..989aa20 100644 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js @@ -16,19 +16,6 @@ * specific language governing permissions and limitations * under the License. */ -function initVideo(el, id, options) { - var type = 'application/x-shockwave-flash'; - var src = 'public/main.swf?cache' + new Date().getTime(); - var o = $('<object>').attr('id', id).attr('type', type).attr('data', src).attr('width', options.width).attr('height', options.height); - o.append($('<param>').attr('name', 'quality').attr('value', 'best')) - .append($('<param>').attr('name', 'wmode').attr('value', options.wmode)) - .append($('<param>').attr('name', 'allowscriptaccess').attr('value', 'sameDomain')) - .append($('<param>').attr('name', 'allowfullscreen').attr('value', 'false')) - .append($('<param>').attr('name', 'flashvars').attr('value', $.param(options))); - el.append(o); - return o; -} - function setRoomSizes() { var sb = $(".room.sidebar.left") , w = $(window).width() - sb.width() - 5 @@ -92,156 +79,6 @@ function startPrivateChat(el) { Chat.open(); $('#chatMessage .wysiwyg-editor').click(); } -var VideoSettings = (function() { - var self = {}, vs, lm, swf, s, cam, mic, res, - vidScroll, recBtn, playBtn, inited = false, recAllowed = false; - function _load() { - s = {}; - try { - s = JSON.parse(localStorage.getItem('openmeetings')) || s; - } catch (e) {} - if (!s.video) { - s.video = {}; - } - } - function _save() { - localStorage.setItem('openmeetings', JSON.stringify(s)); - } - function _init(options) { - vs = $('#video-settings'); - lm = vs.find('.level-meter'); - cam = vs.find('select.cam'); - mic = vs.find('select.mic'); - res = vs.find('select.cam-resolution'); - vidScroll = vs.find('.vid-block .video-conainer'); - recBtn = vs.find('.rec-start').click(function() { - recBtn.prop('disabled', true).button('refresh'); //TODO disable drop-downs - swf.startRec(); - }); - playBtn = vs.find('.play').click(function() { - swf.play(); - }); - vs.dialog({ - classes: { - 'ui-dialog': 'ui-corner-all video' - } - , width: 640 - , autoOpen: false - , buttons: [ - { - text: vs.data('btn-save') - , icons: { - primary: "ui-icon-disk" - } - , click: function() { - _save(); - vs.dialog("close"); - } - } - , { - text: vs.data('btn-cancel') - , click: function() { - vs.dialog("close"); - } - } - ] - }); - lm.progressbar({ value: 0 }); - options.width = 300; - options.height = 200; - swf = initVideo(vidScroll, 'video-settings-swf', options)[0]; - vs.find('input, button').prop('disabled', true); - vs.find('button').button(); - var rr = vs.find('.cam-resolution').parent('.sett-row'); - if (!!options.interview) { - rr.show(); - } else { - rr.hide(); - } - _load(); - } - function _updateRec() { - recBtn.prop('disabled', !recAllowed && (s.video.cam > -1 || s.video.mic > -1)).button('refresh'); - } - function _readValues() { - s.video.cam = 1 * cam.val(); - s.video.mic = 1 * mic.val(); - var o = res.find('option:selected').data(); - s.video.width = o.width; - s.video.height = o.height; - $(swf).attr('width', Math.max(300, s.video.width)).attr('height', Math.max(200, s.video.height)); - vidScroll.scrollLeft(Math.max(0, s.video.width / 2 - 150)) - .scrollTop(Math.max(0, s.video.height / 2 - 110)); - _updateRec(); - } - - function _allowRec(allow) { - recAllowed = allow; - _updateRec(); - } - function _allowPlay() { - _updateRec(); - playBtn.prop('disabled', false).button('refresh'); - } - function _micActivity(level) { - console.log("activity: ", level) - lm.progressbar("value", Math.max(0, level)); - } - function _initSwf() { - if (!inited) { - var obj = swf.getDevices(); - for (var i = 0; i < obj.cams.length; ++i) { - var o = $('<option></option>').attr('value', i).text(obj.cams[i]); - if (i == s.video.cam) { - o.prop('selected', true); - } - cam.append(o); - } - cam.prop('disabled', false).change(function() { - _readValues(); - swf.camChanged(s.video.cam); - }); - for (var i = 0; i < obj.mics.length; ++i) { - var o = $('<option></option>').attr('value', i).text(obj.mics[i]); - if (i == s.video.mic) { - o.prop('selected', true); - } - mic.append(o); - } - mic.prop('disabled', false).change(function() { - _readValues(); - swf.micChanged(s.video.mic); - }); - res.change(function() { - _readValues(); - swf.resChanged(s.video.width, s.video.height); - }); - res.find('option').each(function(idx) { - var o = $(this).data(); - if (o.width == s.video.width && o.height == s.video.height) { - $(this).prop('selected', true); - return false; - } - }); - } - _readValues(); - swf.init(s.video.cam, s.video.mic, s.video.width, s.video.height); - } - function _open() { - recAllowed = false; - vs.dialog('open'); - } - return { - init: _init - , initSwf: _initSwf - , open: _open - , allowRec: _allowRec - , allowPlay: _allowPlay - , micActivity: _micActivity - , close: function() { vs.dialog('close'); } - }; -})(); - /***** functions required by SIP ******/ function sipBtnClick() { var txt = $('.sip-number'); http://git-wip-us.apache.org/repos/asf/openmeetings/blob/b1c60093/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/settings.js ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/settings.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/settings.js new file mode 100644 index 0000000..9c96224 --- /dev/null +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/settings.js @@ -0,0 +1,179 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License") + you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +function initVideo(el, id, options) { + var type = 'application/x-shockwave-flash'; + var src = 'public/main.swf?cache' + new Date().getTime(); + var o = $('<object>').attr('id', id).attr('type', type).attr('data', src).attr('width', options.width).attr('height', options.height); + o.append($('<param>').attr('name', 'quality').attr('value', 'best')) + .append($('<param>').attr('name', 'wmode').attr('value', options.wmode)) + .append($('<param>').attr('name', 'allowscriptaccess').attr('value', 'sameDomain')) + .append($('<param>').attr('name', 'allowfullscreen').attr('value', 'false')) + .append($('<param>').attr('name', 'flashvars').attr('value', $.param(options))); + el.append(o); + return o; +} +var VideoSettings = (function() { + var self = {}, vs, lm, swf, s, cam, mic, res, + vidScroll, recBtn, playBtn, inited = false, recAllowed = false; + function _load() { + s = {}; + try { + s = JSON.parse(localStorage.getItem('openmeetings')) || s; + } catch (e) {} + if (!s.video) { + s.video = {}; + } + } + function _save() { + localStorage.setItem('openmeetings', JSON.stringify(s)); + } + function _init(options) { + vs = $('#video-settings'); + lm = vs.find('.level-meter'); + cam = vs.find('select.cam'); + mic = vs.find('select.mic'); + res = vs.find('select.cam-resolution'); + vidScroll = vs.find('.vid-block .video-conainer'); + recBtn = vs.find('.rec-start').click(function() { + recBtn.prop('disabled', true).button('refresh'); //TODO disable drop-downs + swf.startRec(); + }); + playBtn = vs.find('.play').click(function() { + swf.play(); + }); + vs.dialog({ + classes: { + 'ui-dialog': 'ui-corner-all video' + } + , width: 640 + , autoOpen: false + , buttons: [ + { + text: vs.data('btn-save') + , icons: { + primary: "ui-icon-disk" + } + , click: function() { + _save(); + vs.dialog("close"); + } + } + , { + text: vs.data('btn-cancel') + , click: function() { + vs.dialog("close"); + } + } + ] + }); + lm.progressbar({ value: 0 }); + options.width = 300; + options.height = 200; + swf = initVideo(vidScroll, 'video-settings-swf', options)[0]; + vs.find('input, button').prop('disabled', true); + vs.find('button').button(); + var rr = vs.find('.cam-resolution').parent('.sett-row'); + if (!!options.interview) { + rr.show(); + } else { + rr.hide(); + } + _load(); + } + function _updateRec() { + recBtn.prop('disabled', !recAllowed && (s.video.cam > -1 || s.video.mic > -1)).button('refresh'); + } + function _readValues() { + s.video.cam = 1 * cam.val(); + s.video.mic = 1 * mic.val(); + var o = res.find('option:selected').data(); + s.video.width = o.width; + s.video.height = o.height; + $(swf).attr('width', Math.max(300, s.video.width)).attr('height', Math.max(200, s.video.height)); + vidScroll.scrollLeft(Math.max(0, s.video.width / 2 - 150)) + .scrollTop(Math.max(0, s.video.height / 2 - 110)); + _updateRec(); + } + + function _allowRec(allow) { + recAllowed = allow; + _updateRec(); + } + function _allowPlay() { + _updateRec(); + playBtn.prop('disabled', false).button('refresh'); + } + function _micActivity(level) { + console.log("activity: ", level) + lm.progressbar("value", Math.max(0, level)); + } + function _initSwf() { + if (!inited) { + var obj = swf.getDevices(); + for (var i = 0; i < obj.cams.length; ++i) { + var o = $('<option></option>').attr('value', i).text(obj.cams[i]); + if (i == s.video.cam) { + o.prop('selected', true); + } + cam.append(o); + } + cam.prop('disabled', false).change(function() { + _readValues(); + swf.camChanged(s.video.cam); + }); + for (var i = 0; i < obj.mics.length; ++i) { + var o = $('<option></option>').attr('value', i).text(obj.mics[i]); + if (i == s.video.mic) { + o.prop('selected', true); + } + mic.append(o); + } + mic.prop('disabled', false).change(function() { + _readValues(); + swf.micChanged(s.video.mic); + }); + res.change(function() { + _readValues(); + swf.resChanged(s.video.width, s.video.height); + }); + res.find('option').each(function(idx) { + var o = $(this).data(); + if (o.width == s.video.width && o.height == s.video.height) { + $(this).prop('selected', true); + return false; + } + }); + } + _readValues(); + swf.init(s.video.cam, s.video.mic, s.video.width, s.video.height); + } + function _open() { + recAllowed = false; + vs.dialog('open'); + } + return { + init: _init + , initSwf: _initSwf + , open: _open + , allowRec: _allowRec + , allowPlay: _allowPlay + , micActivity: _micActivity + , close: function() { vs.dialog('close'); } + }; +})(); http://git-wip-us.apache.org/repos/asf/openmeetings/blob/b1c60093/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html index 5809dcd..e92ae35 100644 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html @@ -40,71 +40,6 @@ <form wicket:id="form"><div wicket:id="confirm-trash"></div></form> <div wicket:id="upload"></div> <div wicket:id="confirm-kick" /> - <div id="video-settings" wicket:message="title:51, data-btn-save:144, data-btn-cancel:25" style="display:none;"> - <div class="title"><wicket:message key="758"/></div> - <div class="sett-container"> - <div class="opt-block"> - <div class="sett-row"> - <div><wicket:message key="52"/></div> - <div> - <select class="cam"> - <option value="-1"><wicket:message key="159"/></option> - </select> - </div> - </div> - <div class="sett-row"> - <div><wicket:message key="53"/></div> - <div> - <select class="mic"> - <option value="-1"><wicket:message key="159"/></option> - </select> - </div> - </div> - <div class="sett-row"> - <div class="clear"> - <wicket:message key="1429"/> - <span class="warn ui-state-highlight" wicket:message="title:1430"> - <span class="ui-icon ui-icon-alert"></span> - </span> - </div> - <div> - <select class="cam-resolution"> - <option value="1" data-width="40" data-height="30">40x30 [4:3 (~6 KByte/sec)]</option> - <option value="2" data-width="80" data-height="60">80x60 [4:3 (~12 KByte/sec)]</option> - <option value="3" data-width="120" data-height="90" selected="selected">120x90 [4:3 (~20 KByte/sec)]</option> - <option value="4" data-width="160" data-height="120">160x120 [QQVGA 4:3 (~36 KByte/sec)]</option> - <option value="5" data-width="240" data-height="180">240x180 [4:3 (~40 KByte/sec)]</option> - <option value="6" data-width="320" data-height="240">320x240 [HVGA 4:3 (~56 KByte/sec)]</option> - <option value="7" data-width="480" data-height="360">480x360 [4:3 (~60 KByte/sec)]</option> - <option value="8" data-width="640" data-height="480">640x480 [4:3 (~68 KByte/sec)]</option> - <option value="9" data-width="1024" data-height="768">1024x768 [XGA 4:3]</option> - <option value="10" data-width="256" data-height="150">256x150 [16:9]</option> - <option value="11" data-width="432" data-height="240">432x240 [WQVGA 9:5]</option> - <option value="12" data-width="480" data-height="234">480x234 [pseudo 16:9]</option> - <option value="13" data-width="512" data-height="300">512x300 [16:9]</option> - <option value="14" data-width="640" data-height="360">640x360 [nHD 16:9]</option> - <option value="15" data-width="1024" data-height="600">1024x600 [16:9]</option> - </select> - </div> - </div> - <div class="sett-row right"> - <div><button class="rec-start"><wicket:message key="775"/></button></div> - </div> - </div> - <div class="vid-block"> - <div class="video-conainer"></div> - <div class="level-meter"></div> - <div class="sett-row right"> - <div><button class="play"><wicket:message key="764"/></button></div> - </div> - </div> - </div> - <div> - <span style="padding: 5px;"> - <span class="ui-icon ui-icon-info"></span> - </span> - <wicket:message key="765"/> - </div> - </div> + <div wicket:id="settings" /> </wicket:panel> </html> http://git-wip-us.apache.org/repos/asf/openmeetings/blob/b1c60093/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java index b09e688..ffa6ba1 100644 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java @@ -34,12 +34,13 @@ import org.apache.openmeetings.db.entity.room.Room; import org.apache.openmeetings.db.entity.room.Room.Right; import org.apache.openmeetings.db.entity.room.Room.RoomElement; import org.apache.openmeetings.web.app.Application; -import org.apache.openmeetings.web.common.NameDialog; import org.apache.openmeetings.web.common.ConfirmableAjaxBorder; import org.apache.openmeetings.web.common.ConfirmableAjaxBorder.ConfirmableBorderDialog; +import org.apache.openmeetings.web.common.NameDialog; import org.apache.openmeetings.web.room.RoomBroadcaster; import org.apache.openmeetings.web.room.RoomPanel; import org.apache.openmeetings.web.room.RoomPanel.Action; +import org.apache.openmeetings.web.room.VideoSettings; import org.apache.wicket.AttributeModifier; import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior; import org.apache.wicket.ajax.AjaxRequestTarget; @@ -89,6 +90,7 @@ public class RoomSidebar extends Panel { private boolean avInited = false; private int selectedIdx = 0; private Client kickedClient; + private VideoSettings settings = new VideoSettings("settings"); private final ListView<Client> users = new ListView<Client>("user", new ArrayList<Client>()) { private static final long serialVersionUID = 1L; @@ -314,7 +316,7 @@ public class RoomSidebar extends Panel { @Override protected void onInitialize() { super.onInitialize(); - add(addFolder); + add(addFolder, settings); add(toggleRight, toggleActivity, roomAction, avSettings); add(confirmKick = new ConfirmableAjaxBorder("confirm-kick", getString("603"), getString("605")) { private static final long serialVersionUID = 1L;
