You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2016/04/29 11:57:50 UTC

svn commit: r1741602 - in /openmeetings/application: branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ branches/3.2.x/openmeeting...

Author: solomax
Date: Fri Apr 29 09:57:49 2016
New Revision: 1741602

URL: http://svn.apache.org/viewvc?rev=1741602&view=rev
Log:
[OPENMEETINGS-1381] sip dialog is moved to html5

Added:
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/SipDialerDialog.html
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/SipDialerDialog.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/SipDialerDialog.html
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/SipDialerDialog.java
Removed:
    openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/modules/conference/sip/
Modified:
    openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MainService.java
    openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
    openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ConfigurationDao.java
    openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java
    openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Room.java
    openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java
    openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/modules/conference/library.lzx
    openmeetings/application/branches/3.2.x/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java
    openmeetings/application/branches/3.2.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.html
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/room.css
    openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MainService.java
    openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
    openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ConfigurationDao.java
    openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java
    openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java
    openmeetings/application/trunk/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java
    openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.html
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
    openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/room.css

Modified: openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MainService.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MainService.java?rev=1741602&r1=1741601&r2=1741602&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MainService.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MainService.java Fri Apr 29 09:57:49 2016
@@ -20,6 +20,7 @@ package org.apache.openmeetings.core.rem
 
 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.Date;
 import java.util.List;
@@ -458,7 +459,7 @@ public class MainService implements IPen
 
 	public List<Configuration> getGeneralOptions(String SID) {
 		try {
-			return configurationDao.get("exclusive.audio.keycode", "red5sip.enable", CONFIG_MAX_UPLOAD_SIZE_KEY, "mute.keycode", CONFIG_REDIRECT_URL_FOR_EXTERNAL_KEY);
+			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);
 		}

Modified: openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java?rev=1741602&r1=1741601&r2=1741602&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java Fri Apr 29 09:57:49 2016
@@ -2083,35 +2083,34 @@ public class ScopeApplicationAdapter ext
 		return (c != null && c > 0) ? "(" + (c - 1) + ")" : "";
 	}
 	
-    public synchronized int updateSipTransport() {
+	public synchronized int updateSipTransport() {
 		log.debug("-----------  updateSipTransport");
-        IConnection current = Red5.getConnectionLocal();
-        String streamid = current.getClient().getId();
-        Client client = sessionManager.getClientByStreamId(streamid, null);
-        Long roomId = client.getRoomId();
-        Integer count = roomManager.getSipConferenceMembersNumber(roomId); 
-        String newNumber = getSipTransportLastname(count);
-        log.debug("getSipConferenceMembersNumber: " + newNumber);
-        if (!newNumber.equals(client.getLastname())) {
-            client.setLastname(newNumber);
-            sessionManager.updateClientByStreamId(streamid, client, false, null);
-            log.debug("updateSipTransport: {}, {}, {}, {}, {}", new Object[]{client.getPublicSID(),
-                    client.getRoomId(), client.getFirstname(), client.getLastname(), client.getAvsettings()});
-            sendMessageWithClient(new String[]{"personal",client.getFirstname(),client.getLastname()});
-        }
-        return count != null && count > 0 ? count - 1 : 0; 
-    }
-
-    /**
-     * Perform call to specified phone number and join to conference
-     * @param number to call
-     */
-	public synchronized void joinToConfCall(String number) {
 		IConnection current = Red5.getConnectionLocal();
 		String streamid = current.getClient().getId();
-		Client currentClient = sessionManager.getClientByStreamId(streamid, null);
+		Client client = sessionManager.getClientByStreamId(streamid, null);
+		Long roomId = client.getRoomId();
+		Integer count = roomManager.getSipConferenceMembersNumber(roomId);
+		String newNumber = getSipTransportLastname(count);
+		log.debug("getSipConferenceMembersNumber: " + newNumber);
+		if (!newNumber.equals(client.getLastname())) {
+			client.setLastname(newNumber);
+			sessionManager.updateClientByStreamId(streamid, client, false, null);
+			log.debug("updateSipTransport: {}, {}, {}, {}, {}", new Object[] { client.getPublicSID(), client.getRoomId(),
+					client.getFirstname(), client.getLastname(), client.getAvsettings() });
+			sendMessageWithClient(new String[] { "personal", client.getFirstname(), client.getLastname() });
+		}
+		return count != null && count > 0 ? count - 1 : 0;
+	}
+
+	/**
+	 * Perform call to specified phone number and join to conference
+	 * 
+	 * @param number
+	 *            to call
+	 */
+	public void joinToConfCall(String number, Room r) {
 		try {
-			String sipNumber = getSipNumber(currentClient.getRoomId());
+			String sipNumber = (r != null && r.getConfno() != null) ? r.getConfno() : null;
 			log.debug("asterisk -rx \"originate Local/" + number + "@rooms-out extension " + sipNumber + "@rooms-originate\"");
 			Runtime.getRuntime().exec(new String[] { "asterisk", "-rx", "originate Local/" + number + "@rooms-out extension " + sipNumber + "@rooms-originate" });
 		} catch (IOException e) {
@@ -2119,15 +2118,6 @@ public class ScopeApplicationAdapter ext
 		}
 	}
 
-    public synchronized String getSipNumber(Long roomId) {
-        Room r = roomDao.get(roomId);
-        if(r != null && r.getConfno() != null) {
-            log.debug("getSipNumber: roomId: {}, sipNumber: {}", new Object[]{roomId, r.getConfno()});
-            return r.getConfno();
-        }
-        return null;
-    }
-
 	public void setSipTransport(Long roomId, String publicSID, String broadCastId) {
 		log.debug("-----------  setSipTransport");
 		IConnection current = Red5.getConnectionLocal();

Modified: openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ConfigurationDao.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ConfigurationDao.java?rev=1741602&r1=1741601&r2=1741602&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ConfigurationDao.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ConfigurationDao.java Fri Apr 29 09:57:49 2016
@@ -22,6 +22,7 @@ import static org.apache.openmeetings.ut
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_APPLICATION_NAME;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_CRYPT_KEY;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MAX_UPLOAD_SIZE_KEY;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SIP_ENABLED;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.DEFAULT_BASE_URL;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.configKeyCryptClassName;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
@@ -187,6 +188,10 @@ public class ConfigurationDao implements
 		return val;
 	}
 
+	public boolean isSipEnabled() {
+		return "yes".equals(getConfValue(CONFIG_SIP_ENABLED, String.class, "no"));
+	}
+
 	@Override
 	public Configuration get(long id) {
 		return get(Long.valueOf(id));

Modified: openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java?rev=1741602&r1=1741601&r2=1741602&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java Fri Apr 29 09:57:49 2016
@@ -184,12 +184,8 @@ public class RoomDao implements IDataPro
 			: em.createNamedQuery("getRoomsCapacityByIds", Long.class).setParameter("ids", ids).getSingleResult();
 	}
 	
-	private boolean isSipEnabled() {
-		return "yes".equals(cfgDao.getConfValue("red5sip.enable", String.class, "no"));
-	}
-	
 	private String getSipNumber(long roomId) {
-		if (isSipEnabled()) {
+		if (cfgDao.isSipEnabled()) {
 			return cfgDao.getConfValue("red5sip.room_prefix", String.class, "400") + roomId;
 		}
 		return null;
@@ -203,7 +199,7 @@ public class RoomDao implements IDataPro
 		} else {
 			entity.setUpdated(new Date());
 		}
-		if (entity.isSipEnabled() && isSipEnabled()) {
+		if (entity.isSipEnabled() && cfgDao.isSipEnabled()) {
 			String sipNumber = getSipNumber(entity.getId());
 			if (sipNumber != null && !sipNumber.equals(entity.getConfno())) {
 				entity.setConfno(sipNumber);

Modified: openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Room.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Room.java?rev=1741602&r1=1741601&r2=1741602&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Room.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Room.java Fri Apr 29 09:57:49 2016
@@ -515,7 +515,7 @@ public class Room implements IDataProvid
 		}
 		return hiddenElements.add(e);
 	}
-	
+
 	public List<RoomGroup> getRoomGroups() {
 		return roomGroups;
 	}

Modified: openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java?rev=1741602&r1=1741601&r2=1741602&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java Fri Apr 29 09:57:49 2016
@@ -397,8 +397,7 @@ public class User implements IDataProvid
 				throw new RuntimeException("Password of invalid length is provided");
 			}
 		}
-		String sipEnabled = configDao.getConfValue("red5sip.enable", String.class, "no");
-		if("yes".equals(sipEnabled)) {
+		if (configDao.isSipEnabled()) {
 			AsteriskSipUser u = getSipUser();
 			if (u == null) {
 				setSipUser(u = new AsteriskSipUser());

Modified: openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/modules/conference/library.lzx
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/modules/conference/library.lzx?rev=1741602&r1=1741601&r2=1741602&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/modules/conference/library.lzx (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/modules/conference/library.lzx Fri Apr 29 09:57:49 2016
@@ -44,8 +44,6 @@
    	<include href="popups/" />
    	<include href="moderation/" />
    	
-    <include href="sip/" />
-    
     <include href="flexibleConferenceRoom/" />
     
 </library>

Modified: openmeetings/application/branches/3.2.x/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java?rev=1741602&r1=1741601&r2=1741602&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java Fri Apr 29 09:57:49 2016
@@ -45,6 +45,7 @@ import static org.apache.openmeetings.ut
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SCREENSHARING_FPS;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SCREENSHARING_FPS_SHOW;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SCREENSHARING_QUALITY;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SIP_ENABLED;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SOAP_REGISTER_KEY;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.USER_LOGIN_MINIMUM_LENGTH;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.USER_PASSWORD_MINIMUM_LENGTH;
@@ -266,7 +267,7 @@ public class ImportInitvalues {
 		// red5SIP Integration Coniguration Values
 		// ***************************************
 
-		cfgDao.add("red5sip.enable", cfg.red5SipEnable, null, "Enable to enable the red5SIP integration ");
+		cfgDao.add(CONFIG_SIP_ENABLED, cfg.red5SipEnable, null, "Enable to enable the red5SIP integration ");
 		cfgDao.add("red5sip.room_prefix", cfg.red5SipRoomPrefix, null,
 				"Numerical prefix for OM rooms created inside the SIP");
 		cfgDao.add("red5sip.exten_context", cfg.red5SipExtenContext, null,

Modified: openmeetings/application/branches/3.2.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java?rev=1741602&r1=1741601&r2=1741602&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java Fri Apr 29 09:57:49 2016
@@ -28,6 +28,7 @@ public class OpenmeetingsVariables {
 	public static final String CONFIG_OAUTH_REGISTER_KEY = "allow.oauth.register";
 	public static final String CONFIG_LOGIN_MIN_LENGTH_KEY = "user.login.minimum.length";
 	public static final String CONFIG_MAX_UPLOAD_SIZE_KEY = "max_upload_size";
+	public static final String CONFIG_SIP_ENABLED = "red5sip.enable";
 	public static final String CONFIG_PASS_MIN_LENGTH_KEY = "user.pass.minimum.length";
 	public static final String CONFIG_RSS_FEED1_KEY = "rss_feed1";
 	public static final String CONFIG_RSS_FEED2_KEY = "rss_feed2";

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.html
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.html?rev=1741602&r1=1741601&r2=1741602&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.html (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.html Fri Apr 29 09:57:49 2016
@@ -31,5 +31,6 @@
 	<div wicket:id="createPoll"></div>
 	<div wicket:id="vote"></div>
 	<div wicket:id="pollResults"></div>
+	<div wicket:id="sipDialer"></div>
 </wicket:panel>
 </html>

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java?rev=1741602&r1=1741601&r2=1741602&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java Fri Apr 29 09:57:49 2016
@@ -69,6 +69,7 @@ public class RoomMenuPanel extends Panel
 	private final CreatePollDialog createPoll;
 	private final VoteDialog vote;
 	private final PollResultsDialog pollResults;
+	private final SipDialerDialog sipDialer;
 	private final MenuPanel menuPanel;
 	private final StartSharingButton shareBtn;
 	private final Label roomName;
@@ -171,7 +172,14 @@ public class RoomMenuPanel extends Panel
 			pollResults.open(target);
 		}
 	};
-	private final RoomMenuItem sipDialerMenuItem = new RoomMenuItem(Application.getString(1447), Application.getString(1488), false);
+	private final RoomMenuItem sipDialerMenuItem = new RoomMenuItem(Application.getString(1447), Application.getString(1488), false) {
+		private static final long serialVersionUID = 1L;
+
+		@Override
+		public void onClick(AjaxRequestTarget target) {
+			sipDialer.open(target);
+		}
+	};
 
 	public RoomMenuPanel(String id, final RoomPanel room) {
 		super(id);
@@ -187,9 +195,9 @@ public class RoomMenuPanel extends Panel
 		add(createPoll = new CreatePollDialog("createPoll", room.getRoom().getId()));
 		add(vote = new VoteDialog("vote"));
 		add(pollResults = new PollResultsDialog("pollResults", room.getRoom().getId()));
+		add(sipDialer = new SipDialerDialog("sipDialer", room));
 	}
 	
-	
 	@Override
 	protected void onInitialize() {
 		super.onInitialize();
@@ -251,7 +259,8 @@ public class RoomMenuPanel extends Panel
 			return;
 		}
 		Room r = room.getRoom();
-		boolean pollExists = getBean(PollDao.class).hasPoll(r.getId());
+		PollDao pollDao = getBean(PollDao.class);
+		boolean pollExists = pollDao.hasPoll(r.getId());
 		User u = getBean(UserDao.class).get(getUserId());
 		boolean notExternalUser = u.getType() != User.Type.external && u.getType() != User.Type.contact;
 		exitMenuItem.setEnabled(notExternalUser);//TODO check this
@@ -267,21 +276,23 @@ public class RoomMenuPanel extends Panel
 		applyWbMenuItem.setEnabled(!room.getClient().hasRight(Client.Right.whiteBoard));
 		applyAvMenuItem.setEnabled(!room.getClient().hasRight(Client.Right.audio) || !room.getClient().hasRight(Client.Right.video));
 		pollCreateMenuItem.setEnabled(moder);
-		pollVoteMenuItem.setEnabled(pollExists && notExternalUser && !getBean(PollDao.class).hasVoted(r.getId(), getUserId()));
-		pollResultMenuItem.setEnabled(pollExists || getBean(PollDao.class).getArchived(r.getId()).size() > 0);
+		pollVoteMenuItem.setEnabled(pollExists && notExternalUser && !pollDao.hasVoted(r.getId(), getUserId()));
+		pollResultMenuItem.setEnabled(pollExists || pollDao.getArchived(r.getId()).size() > 0);
+		sipDialerMenuItem.setEnabled(r.isSipEnabled() && getBean(ConfigurationDao.class).isSipEnabled());
 		//TODO sip menus
 		menuPanel.update(handler);
 		//FIXME TODO askBtn should be visible if moder is in room
 		StringBuilder roomClass = new StringBuilder("room name");
 		StringBuilder roomTitle = new StringBuilder();
 		if (room.getRecordingUser() != null) {
-			org.apache.openmeetings.db.entity.room.Client recUser = getBean(ISessionManager.class).getClientByPublicSID(room.getRecordingUser(), null); //TODO check server
+			ISessionManager sessMngr = getBean(ISessionManager.class);
+			org.apache.openmeetings.db.entity.room.Client recUser = sessMngr.getClientByPublicSID(room.getRecordingUser(), null); //TODO check server
 			if (recUser != null) {
 				roomTitle.append(String.format("%s %s %s %s %s", getString("419")
 						, recUser.getUsername(), recUser.getFirstname(), recUser.getLastname(), df.get().format(recUser.getConnectedSince())));
 				roomClass.append(" screen");
 			}
-			org.apache.openmeetings.db.entity.room.Client pubUser = getBean(ISessionManager.class).getClientByPublicSID(room.getPublishingUser(), null); //TODO check server
+			org.apache.openmeetings.db.entity.room.Client pubUser = sessMngr.getClientByPublicSID(room.getPublishingUser(), null); //TODO check server
 			if (pubUser != null) {
 				if (recUser != null) {
 					roomTitle.append('\n');

Added: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/SipDialerDialog.html
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/SipDialerDialog.html?rev=1741602&view=auto
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/SipDialerDialog.html (added)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/SipDialerDialog.html Fri Apr 29 09:57:49 2016
@@ -0,0 +1,57 @@
+<?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 class="sip">
+		<div class="button-row">
+			<form wicket:id="form">
+				<input wicket:id="number" class="sip-number" type="text"/>
+				<span id="sip-dialer-btn-erase">&#8592;</span>
+				<input type="submit" wicket:id="submit" class="invisible-form-component"/>
+			</form>
+		</div>
+		<div class="button-row">
+			<button id="sip-dialer-btn-7" data-value="7">7</button>
+			<button id="sip-dialer-btn-8" data-value="8">8</button>
+			<button id="sip-dialer-btn-9" data-value="9">9</button>
+		</div>
+		<div class="button-row">
+			<button id="sip-dialer-btn-4" data-value="4">4</button>
+			<button id="sip-dialer-btn-5" data-value="5">5</button>
+			<button id="sip-dialer-btn-6" data-value="6">6</button>
+		</div>
+		<div class="button-row">
+			<button id="sip-dialer-btn-1" data-value="1">1</button>
+			<button id="sip-dialer-btn-2" data-value="2">2</button>
+			<button id="sip-dialer-btn-3" data-value="3">3</button>
+		</div>
+		<div class="button-row">
+			<button id="sip-dialer-btn-0" data-value="0">0</button>
+		</div>
+	</div>
+	<div wicket:id="feedback"></div>
+	<script type="text/javascript">
+		$('.sip').on('keydown', sipKeyDown).on('keyup', sipKeyUp);
+		$('.sip .button-row button').button().on('click', sipBtnClick);
+		$('#sip-dialer-btn-erase').button().on('click', sipBtnEraseClick);
+	</script>
+</wicket:panel>
+</html>

Added: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/SipDialerDialog.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/SipDialerDialog.java?rev=1741602&view=auto
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/SipDialerDialog.java (added)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/SipDialerDialog.java Fri Apr 29 09:57:49 2016
@@ -0,0 +1,104 @@
+/*
+ * 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.menu;
+
+import static org.apache.openmeetings.web.app.Application.getBean;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter;
+import org.apache.openmeetings.web.app.Application;
+import org.apache.openmeetings.web.room.RoomPanel;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.form.AjaxButton;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.TextField;
+import org.apache.wicket.model.Model;
+
+import com.googlecode.wicket.jquery.core.Options;
+import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog;
+import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
+import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel;
+
+public class SipDialerDialog extends AbstractFormDialog<String> {
+	private static final long serialVersionUID = 1L;
+	private final KendoFeedbackPanel feedback = new KendoFeedbackPanel("feedback", new Options("button", true));
+	private final DialogButton call = new DialogButton("call", Application.getString(1448));
+	private final DialogButton close = new DialogButton("close", Application.getString(85));
+	private final Form<String> form = new Form<>("form", Model.of(""));
+	private final TextField<String> number = new TextField<>("number", Model.of(""));
+	private final RoomPanel room;
+
+	public SipDialerDialog(String id, RoomPanel room) {
+		super(id, "");
+		this.room = room;
+		AjaxButton ab = new AjaxButton("submit") { //FAKE button so "submit-on-enter" works as expected
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
+				SipDialerDialog.this.onSubmit(target);
+			}
+			
+			@Override
+			protected void onError(AjaxRequestTarget target, Form<?> form) {
+				SipDialerDialog.this.onError(target);
+			}
+		};
+		form.setDefaultButton(ab);
+		add(feedback.setOutputMarkupId(true), form.add(number, ab));
+	}
+	
+	@Override
+	protected void onInitialize() {
+		super.onInitialize();
+		setTitle(Model.of(getString("1003")));
+	}
+
+	@Override
+	public int getWidth() {
+		return 300;
+	}
+	
+	@Override
+	protected List<DialogButton> getButtons() {
+		return Arrays.asList(call, close);
+	}
+	
+	@Override
+	public DialogButton getSubmitButton() {
+		return call;
+	}
+
+	@Override
+	public Form<?> getForm() {
+		return form;
+	}
+
+	@Override
+	protected void onError(AjaxRequestTarget target) {
+		target.add(feedback);
+	}
+
+	@Override
+	protected void onSubmit(AjaxRequestTarget target) {
+		getBean(ScopeApplicationAdapter.class).joinToConfCall(number.getModelObject(), room.getRoom());
+	}
+}

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js?rev=1741602&r1=1741601&r2=1741602&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js Fri Apr 29 09:57:49 2016
@@ -51,6 +51,40 @@ function startPrivateChat(el) {
 	openChat();
 	$('#chatMessage .wysiwyg-editor').click();
 }
+/***** functions required by SIP   ******/
+function sipBtnClick() {
+	var txt = $('.sip-number');
+	txt.val(txt.val() + $(this).data('value'));
+}
+function sipBtnEraseClick() {
+	var txt = $('.sip-number');
+	var t = txt.val();
+	if (!!t) {
+		txt.val(t.substring(0, t.length -1));
+	}
+}
+function sipGetKey(evt) {
+	var k = -1;
+	if (evt.keyCode > 47 && evt.keyCode < 58) {
+		k = evt.keyCode - 48;
+	}
+	if (evt.keyCode > 95 && evt.keyCode < 106) {
+		k = evt.keyCode - 96;
+	}
+	return k;
+}
+function sipKeyDown(evt) {
+	var k = sipGetKey(evt);
+	if (k > 0) {
+		$('#sip-dialer-btn-' + k).addClass('ui-state-active');
+	}
+}
+function sipKeyUp(evt) {
+	var k = sipGetKey(evt);
+	if (k > 0) {
+		$('#sip-dialer-btn-' + k).removeClass('ui-state-active');
+	}
+}
 
 /***** functions required by SWF   ******/
 function audioActivity(uid, active) {

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/room.css
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/room.css?rev=1741602&r1=1741601&r2=1741602&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/room.css (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/room.css Fri Apr 29 09:57:49 2016
@@ -206,3 +206,17 @@
 	max-height: 100px;
 	overflow-y: auto;
 }
+.sip .button-row {
+	text-align: center;
+	margin: 5px;
+}
+.sip .button-row input.sip-number {
+	width: 130px;
+}
+.sip .button-row #sip-dialer-btn-erase {
+	margin-left: 5px;
+}
+.sip .button-row #sip-dialer-btn-erase .ui-button-text {
+	padding: .1em .7em;
+	font-weight: bolder;
+}

Modified: openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MainService.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MainService.java?rev=1741602&r1=1741601&r2=1741602&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MainService.java (original)
+++ openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MainService.java Fri Apr 29 09:57:49 2016
@@ -20,6 +20,7 @@ package org.apache.openmeetings.core.rem
 
 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.Date;
 import java.util.List;
@@ -458,7 +459,7 @@ public class MainService implements IPen
 
 	public List<Configuration> getGeneralOptions(String SID) {
 		try {
-			return configurationDao.get("exclusive.audio.keycode", "red5sip.enable", CONFIG_MAX_UPLOAD_SIZE_KEY, "mute.keycode", CONFIG_REDIRECT_URL_FOR_EXTERNAL_KEY);
+			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);
 		}

Modified: openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java?rev=1741602&r1=1741601&r2=1741602&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java (original)
+++ openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java Fri Apr 29 09:57:49 2016
@@ -2083,35 +2083,34 @@ public class ScopeApplicationAdapter ext
 		return (c != null && c > 0) ? "(" + (c - 1) + ")" : "";
 	}
 	
-    public synchronized int updateSipTransport() {
+	public synchronized int updateSipTransport() {
 		log.debug("-----------  updateSipTransport");
-        IConnection current = Red5.getConnectionLocal();
-        String streamid = current.getClient().getId();
-        Client client = sessionManager.getClientByStreamId(streamid, null);
-        Long roomId = client.getRoomId();
-        Integer count = roomManager.getSipConferenceMembersNumber(roomId); 
-        String newNumber = getSipTransportLastname(count);
-        log.debug("getSipConferenceMembersNumber: " + newNumber);
-        if (!newNumber.equals(client.getLastname())) {
-            client.setLastname(newNumber);
-            sessionManager.updateClientByStreamId(streamid, client, false, null);
-            log.debug("updateSipTransport: {}, {}, {}, {}, {}", new Object[]{client.getPublicSID(),
-                    client.getRoomId(), client.getFirstname(), client.getLastname(), client.getAvsettings()});
-            sendMessageWithClient(new String[]{"personal",client.getFirstname(),client.getLastname()});
-        }
-        return count != null && count > 0 ? count - 1 : 0; 
-    }
-
-    /**
-     * Perform call to specified phone number and join to conference
-     * @param number to call
-     */
-	public synchronized void joinToConfCall(String number) {
 		IConnection current = Red5.getConnectionLocal();
 		String streamid = current.getClient().getId();
-		Client currentClient = sessionManager.getClientByStreamId(streamid, null);
+		Client client = sessionManager.getClientByStreamId(streamid, null);
+		Long roomId = client.getRoomId();
+		Integer count = roomManager.getSipConferenceMembersNumber(roomId);
+		String newNumber = getSipTransportLastname(count);
+		log.debug("getSipConferenceMembersNumber: " + newNumber);
+		if (!newNumber.equals(client.getLastname())) {
+			client.setLastname(newNumber);
+			sessionManager.updateClientByStreamId(streamid, client, false, null);
+			log.debug("updateSipTransport: {}, {}, {}, {}, {}", new Object[] { client.getPublicSID(), client.getRoomId(),
+					client.getFirstname(), client.getLastname(), client.getAvsettings() });
+			sendMessageWithClient(new String[] { "personal", client.getFirstname(), client.getLastname() });
+		}
+		return count != null && count > 0 ? count - 1 : 0;
+	}
+
+	/**
+	 * Perform call to specified phone number and join to conference
+	 * 
+	 * @param number
+	 *            to call
+	 */
+	public void joinToConfCall(String number, Room r) {
 		try {
-			String sipNumber = getSipNumber(currentClient.getRoomId());
+			String sipNumber = (r != null && r.getConfno() != null) ? r.getConfno() : null;
 			log.debug("asterisk -rx \"originate Local/" + number + "@rooms-out extension " + sipNumber + "@rooms-originate\"");
 			Runtime.getRuntime().exec(new String[] { "asterisk", "-rx", "originate Local/" + number + "@rooms-out extension " + sipNumber + "@rooms-originate" });
 		} catch (IOException e) {
@@ -2119,15 +2118,6 @@ public class ScopeApplicationAdapter ext
 		}
 	}
 
-    public synchronized String getSipNumber(Long roomId) {
-        Room r = roomDao.get(roomId);
-        if(r != null && r.getConfno() != null) {
-            log.debug("getSipNumber: roomId: {}, sipNumber: {}", new Object[]{roomId, r.getConfno()});
-            return r.getConfno();
-        }
-        return null;
-    }
-
 	public void setSipTransport(Long roomId, String publicSID, String broadCastId) {
 		log.debug("-----------  setSipTransport");
 		IConnection current = Red5.getConnectionLocal();

Modified: openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ConfigurationDao.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ConfigurationDao.java?rev=1741602&r1=1741601&r2=1741602&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ConfigurationDao.java (original)
+++ openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ConfigurationDao.java Fri Apr 29 09:57:49 2016
@@ -22,6 +22,7 @@ import static org.apache.openmeetings.ut
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_APPLICATION_NAME;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_CRYPT_KEY;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MAX_UPLOAD_SIZE_KEY;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SIP_ENABLED;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.DEFAULT_BASE_URL;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.configKeyCryptClassName;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
@@ -187,6 +188,10 @@ public class ConfigurationDao implements
 		return val;
 	}
 
+	public boolean isSipEnabled() {
+		return "yes".equals(getConfValue(CONFIG_SIP_ENABLED, String.class, "no"));
+	}
+
 	@Override
 	public Configuration get(long id) {
 		return get(Long.valueOf(id));

Modified: openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java?rev=1741602&r1=1741601&r2=1741602&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java (original)
+++ openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java Fri Apr 29 09:57:49 2016
@@ -184,12 +184,8 @@ public class RoomDao implements IDataPro
 			: em.createNamedQuery("getRoomsCapacityByIds", Long.class).setParameter("ids", ids).getSingleResult();
 	}
 	
-	private boolean isSipEnabled() {
-		return "yes".equals(cfgDao.getConfValue("red5sip.enable", String.class, "no"));
-	}
-	
 	private String getSipNumber(long roomId) {
-		if (isSipEnabled()) {
+		if (cfgDao.isSipEnabled()) {
 			return cfgDao.getConfValue("red5sip.room_prefix", String.class, "400") + roomId;
 		}
 		return null;
@@ -203,7 +199,7 @@ public class RoomDao implements IDataPro
 		} else {
 			entity.setUpdated(new Date());
 		}
-		if (entity.isSipEnabled() && isSipEnabled()) {
+		if (entity.isSipEnabled() && cfgDao.isSipEnabled()) {
 			String sipNumber = getSipNumber(entity.getId());
 			if (sipNumber != null && !sipNumber.equals(entity.getConfno())) {
 				entity.setConfno(sipNumber);

Modified: openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java?rev=1741602&r1=1741601&r2=1741602&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java (original)
+++ openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java Fri Apr 29 09:57:49 2016
@@ -397,8 +397,7 @@ public class User implements IDataProvid
 				throw new RuntimeException("Password of invalid length is provided");
 			}
 		}
-		String sipEnabled = configDao.getConfValue("red5sip.enable", String.class, "no");
-		if("yes".equals(sipEnabled)) {
+		if (configDao.isSipEnabled()) {
 			AsteriskSipUser u = getSipUser();
 			if (u == null) {
 				setSipUser(u = new AsteriskSipUser());

Modified: openmeetings/application/trunk/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java?rev=1741602&r1=1741601&r2=1741602&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java (original)
+++ openmeetings/application/trunk/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java Fri Apr 29 09:57:49 2016
@@ -45,6 +45,7 @@ import static org.apache.openmeetings.ut
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SCREENSHARING_FPS;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SCREENSHARING_FPS_SHOW;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SCREENSHARING_QUALITY;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SIP_ENABLED;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SOAP_REGISTER_KEY;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.USER_LOGIN_MINIMUM_LENGTH;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.USER_PASSWORD_MINIMUM_LENGTH;
@@ -266,7 +267,7 @@ public class ImportInitvalues {
 		// red5SIP Integration Coniguration Values
 		// ***************************************
 
-		cfgDao.add("red5sip.enable", cfg.red5SipEnable, null, "Enable to enable the red5SIP integration ");
+		cfgDao.add(CONFIG_SIP_ENABLED, cfg.red5SipEnable, null, "Enable to enable the red5SIP integration ");
 		cfgDao.add("red5sip.room_prefix", cfg.red5SipRoomPrefix, null,
 				"Numerical prefix for OM rooms created inside the SIP");
 		cfgDao.add("red5sip.exten_context", cfg.red5SipExtenContext, null,

Modified: openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java?rev=1741602&r1=1741601&r2=1741602&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java (original)
+++ openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java Fri Apr 29 09:57:49 2016
@@ -28,6 +28,7 @@ public class OpenmeetingsVariables {
 	public static final String CONFIG_OAUTH_REGISTER_KEY = "allow.oauth.register";
 	public static final String CONFIG_LOGIN_MIN_LENGTH_KEY = "user.login.minimum.length";
 	public static final String CONFIG_MAX_UPLOAD_SIZE_KEY = "max_upload_size";
+	public static final String CONFIG_SIP_ENABLED = "red5sip.enable";
 	public static final String CONFIG_PASS_MIN_LENGTH_KEY = "user.pass.minimum.length";
 	public static final String CONFIG_RSS_FEED1_KEY = "rss_feed1";
 	public static final String CONFIG_RSS_FEED2_KEY = "rss_feed2";

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.html
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.html?rev=1741602&r1=1741601&r2=1741602&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.html (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.html Fri Apr 29 09:57:49 2016
@@ -31,5 +31,6 @@
 	<div wicket:id="createPoll"></div>
 	<div wicket:id="vote"></div>
 	<div wicket:id="pollResults"></div>
+	<div wicket:id="sipDialer"></div>
 </wicket:panel>
 </html>

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java?rev=1741602&r1=1741601&r2=1741602&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java Fri Apr 29 09:57:49 2016
@@ -69,6 +69,7 @@ public class RoomMenuPanel extends Panel
 	private final CreatePollDialog createPoll;
 	private final VoteDialog vote;
 	private final PollResultsDialog pollResults;
+	private final SipDialerDialog sipDialer;
 	private final MenuPanel menuPanel;
 	private final StartSharingButton shareBtn;
 	private final Label roomName;
@@ -171,7 +172,14 @@ public class RoomMenuPanel extends Panel
 			pollResults.open(target);
 		}
 	};
-	private final RoomMenuItem sipDialerMenuItem = new RoomMenuItem(Application.getString(1447), Application.getString(1488), false);
+	private final RoomMenuItem sipDialerMenuItem = new RoomMenuItem(Application.getString(1447), Application.getString(1488), false) {
+		private static final long serialVersionUID = 1L;
+
+		@Override
+		public void onClick(AjaxRequestTarget target) {
+			sipDialer.open(target);
+		}
+	};
 
 	public RoomMenuPanel(String id, final RoomPanel room) {
 		super(id);
@@ -187,9 +195,9 @@ public class RoomMenuPanel extends Panel
 		add(createPoll = new CreatePollDialog("createPoll", room.getRoom().getId()));
 		add(vote = new VoteDialog("vote"));
 		add(pollResults = new PollResultsDialog("pollResults", room.getRoom().getId()));
+		add(sipDialer = new SipDialerDialog("sipDialer", room));
 	}
 	
-	
 	@Override
 	protected void onInitialize() {
 		super.onInitialize();
@@ -251,7 +259,8 @@ public class RoomMenuPanel extends Panel
 			return;
 		}
 		Room r = room.getRoom();
-		boolean pollExists = getBean(PollDao.class).hasPoll(r.getId());
+		PollDao pollDao = getBean(PollDao.class);
+		boolean pollExists = pollDao.hasPoll(r.getId());
 		User u = getBean(UserDao.class).get(getUserId());
 		boolean notExternalUser = u.getType() != User.Type.external && u.getType() != User.Type.contact;
 		exitMenuItem.setEnabled(notExternalUser);//TODO check this
@@ -267,21 +276,23 @@ public class RoomMenuPanel extends Panel
 		applyWbMenuItem.setEnabled(!room.getClient().hasRight(Client.Right.whiteBoard));
 		applyAvMenuItem.setEnabled(!room.getClient().hasRight(Client.Right.audio) || !room.getClient().hasRight(Client.Right.video));
 		pollCreateMenuItem.setEnabled(moder);
-		pollVoteMenuItem.setEnabled(pollExists && notExternalUser && !getBean(PollDao.class).hasVoted(r.getId(), getUserId()));
-		pollResultMenuItem.setEnabled(pollExists || getBean(PollDao.class).getArchived(r.getId()).size() > 0);
+		pollVoteMenuItem.setEnabled(pollExists && notExternalUser && !pollDao.hasVoted(r.getId(), getUserId()));
+		pollResultMenuItem.setEnabled(pollExists || pollDao.getArchived(r.getId()).size() > 0);
+		sipDialerMenuItem.setEnabled(r.isSipEnabled() && getBean(ConfigurationDao.class).isSipEnabled());
 		//TODO sip menus
 		menuPanel.update(handler);
 		//FIXME TODO askBtn should be visible if moder is in room
 		StringBuilder roomClass = new StringBuilder("room name");
 		StringBuilder roomTitle = new StringBuilder();
 		if (room.getRecordingUser() != null) {
-			org.apache.openmeetings.db.entity.room.Client recUser = getBean(ISessionManager.class).getClientByPublicSID(room.getRecordingUser(), null); //TODO check server
+			ISessionManager sessMngr = getBean(ISessionManager.class);
+			org.apache.openmeetings.db.entity.room.Client recUser = sessMngr.getClientByPublicSID(room.getRecordingUser(), null); //TODO check server
 			if (recUser != null) {
 				roomTitle.append(String.format("%s %s %s %s %s", getString("419")
 						, recUser.getUsername(), recUser.getFirstname(), recUser.getLastname(), df.get().format(recUser.getConnectedSince())));
 				roomClass.append(" screen");
 			}
-			org.apache.openmeetings.db.entity.room.Client pubUser = getBean(ISessionManager.class).getClientByPublicSID(room.getPublishingUser(), null); //TODO check server
+			org.apache.openmeetings.db.entity.room.Client pubUser = sessMngr.getClientByPublicSID(room.getPublishingUser(), null); //TODO check server
 			if (pubUser != null) {
 				if (recUser != null) {
 					roomTitle.append('\n');

Added: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/SipDialerDialog.html
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/SipDialerDialog.html?rev=1741602&view=auto
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/SipDialerDialog.html (added)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/SipDialerDialog.html Fri Apr 29 09:57:49 2016
@@ -0,0 +1,57 @@
+<?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 class="sip">
+		<div class="button-row">
+			<form wicket:id="form">
+				<input wicket:id="number" class="sip-number" type="text"/>
+				<span id="sip-dialer-btn-erase">&#8592;</span>
+				<input type="submit" wicket:id="submit" class="invisible-form-component"/>
+			</form>
+		</div>
+		<div class="button-row">
+			<button id="sip-dialer-btn-7" data-value="7">7</button>
+			<button id="sip-dialer-btn-8" data-value="8">8</button>
+			<button id="sip-dialer-btn-9" data-value="9">9</button>
+		</div>
+		<div class="button-row">
+			<button id="sip-dialer-btn-4" data-value="4">4</button>
+			<button id="sip-dialer-btn-5" data-value="5">5</button>
+			<button id="sip-dialer-btn-6" data-value="6">6</button>
+		</div>
+		<div class="button-row">
+			<button id="sip-dialer-btn-1" data-value="1">1</button>
+			<button id="sip-dialer-btn-2" data-value="2">2</button>
+			<button id="sip-dialer-btn-3" data-value="3">3</button>
+		</div>
+		<div class="button-row">
+			<button id="sip-dialer-btn-0" data-value="0">0</button>
+		</div>
+	</div>
+	<div wicket:id="feedback"></div>
+	<script type="text/javascript">
+		$('.sip').on('keydown', sipKeyDown).on('keyup', sipKeyUp);
+		$('.sip .button-row button').button().on('click', sipBtnClick);
+		$('#sip-dialer-btn-erase').button().on('click', sipBtnEraseClick);
+	</script>
+</wicket:panel>
+</html>

Added: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/SipDialerDialog.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/SipDialerDialog.java?rev=1741602&view=auto
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/SipDialerDialog.java (added)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/SipDialerDialog.java Fri Apr 29 09:57:49 2016
@@ -0,0 +1,104 @@
+/*
+ * 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.menu;
+
+import static org.apache.openmeetings.web.app.Application.getBean;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter;
+import org.apache.openmeetings.web.app.Application;
+import org.apache.openmeetings.web.room.RoomPanel;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.form.AjaxButton;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.TextField;
+import org.apache.wicket.model.Model;
+
+import com.googlecode.wicket.jquery.core.Options;
+import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog;
+import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
+import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel;
+
+public class SipDialerDialog extends AbstractFormDialog<String> {
+	private static final long serialVersionUID = 1L;
+	private final KendoFeedbackPanel feedback = new KendoFeedbackPanel("feedback", new Options("button", true));
+	private final DialogButton call = new DialogButton("call", Application.getString(1448));
+	private final DialogButton close = new DialogButton("close", Application.getString(85));
+	private final Form<String> form = new Form<>("form", Model.of(""));
+	private final TextField<String> number = new TextField<>("number", Model.of(""));
+	private final RoomPanel room;
+
+	public SipDialerDialog(String id, RoomPanel room) {
+		super(id, "");
+		this.room = room;
+		AjaxButton ab = new AjaxButton("submit") { //FAKE button so "submit-on-enter" works as expected
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
+				SipDialerDialog.this.onSubmit(target);
+			}
+			
+			@Override
+			protected void onError(AjaxRequestTarget target, Form<?> form) {
+				SipDialerDialog.this.onError(target);
+			}
+		};
+		form.setDefaultButton(ab);
+		add(feedback.setOutputMarkupId(true), form.add(number, ab));
+	}
+	
+	@Override
+	protected void onInitialize() {
+		super.onInitialize();
+		setTitle(Model.of(getString("1003")));
+	}
+
+	@Override
+	public int getWidth() {
+		return 300;
+	}
+	
+	@Override
+	protected List<DialogButton> getButtons() {
+		return Arrays.asList(call, close);
+	}
+	
+	@Override
+	public DialogButton getSubmitButton() {
+		return call;
+	}
+
+	@Override
+	public Form<?> getForm() {
+		return form;
+	}
+
+	@Override
+	protected void onError(AjaxRequestTarget target) {
+		target.add(feedback);
+	}
+
+	@Override
+	protected void onSubmit(AjaxRequestTarget target) {
+		getBean(ScopeApplicationAdapter.class).joinToConfCall(number.getModelObject(), room.getRoom());
+	}
+}

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=1741602&r1=1741601&r2=1741602&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 Fri Apr 29 09:57:49 2016
@@ -91,6 +91,40 @@ function startPrivateChat(el) {
 	openChat();
 	$('#chatMessage .wysiwyg-editor').click();
 }
+/***** functions required by SIP   ******/
+function sipBtnClick() {
+	var txt = $('.sip-number');
+	txt.val(txt.val() + $(this).data('value'));
+}
+function sipBtnEraseClick() {
+	var txt = $('.sip-number');
+	var t = txt.val();
+	if (!!t) {
+		txt.val(t.substring(0, t.length -1));
+	}
+}
+function sipGetKey(evt) {
+	var k = -1;
+	if (evt.keyCode > 47 && evt.keyCode < 58) {
+		k = evt.keyCode - 48;
+	}
+	if (evt.keyCode > 95 && evt.keyCode < 106) {
+		k = evt.keyCode - 96;
+	}
+	return k;
+}
+function sipKeyDown(evt) {
+	var k = sipGetKey(evt);
+	if (k > 0) {
+		$('#sip-dialer-btn-' + k).addClass('ui-state-active');
+	}
+}
+function sipKeyUp(evt) {
+	var k = sipGetKey(evt);
+	if (k > 0) {
+		$('#sip-dialer-btn-' + k).removeClass('ui-state-active');
+	}
+}
 
 /***** functions required by SWF   ******/
 function audioActivity(uid, active) {

Modified: openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/room.css
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/room.css?rev=1741602&r1=1741601&r2=1741602&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/room.css (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/room.css Fri Apr 29 09:57:49 2016
@@ -206,3 +206,17 @@
 	max-height: 100px;
 	overflow-y: auto;
 }
+.sip .button-row {
+	text-align: center;
+	margin: 5px;
+}
+.sip .button-row input.sip-number {
+	width: 130px;
+}
+.sip .button-row #sip-dialer-btn-erase {
+	margin-left: 5px;
+}
+.sip .button-row #sip-dialer-btn-erase .ui-button-text {
+	padding: .1em .7em;
+	font-weight: bolder;
+}