Commit cf9521e3 authored by daryl herzmann's avatar daryl herzmann

Merge pull request #165 from deleolajide/ofmeet-version-0.0.9

ofmeet plugin version 0.0.9
parents 66d1f903 d538d1e8
......@@ -49,6 +49,13 @@
Openfire Meetings Plugin Changelog
</h1>
<p><b>0.0.9</b> -- Jan 26th, 2015</p>
<ul>
<li>Fixed error when webcam is not available</li>
<li>Jitsi Videobridge server code refresh</li>
</ul>
<p><b>0.0.8</b> -- Jan 16th, 2015</p>
<ul>
......
......@@ -5,8 +5,8 @@
<name>Openfire Meetings</name>
<description>Provides high quality, scalable video conferences using Jitsi Meet and Jitsi Videobridge</description>
<author>Ignite Realtime</author>
<version>0.0.8</version>
<date>01/16/2015</date>
<version>0.0.9</version>
<date>01/26/2015</date>
<minServerVersion>3.9.9</minServerVersion>
<adminconsole>
......
......@@ -9,9 +9,12 @@ package org.jitsi.impl.protocol.xmpp;
import net.java.sip.communicator.impl.protocol.jabber.*;
import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.service.protocol.globalstatus.*;
import org.jitsi.protocol.xmpp.*;
import org.jitsi.util.*;
import org.jivesoftware.smack.packet.*;
import org.jivesoftware.smackx.muc.*;
import org.jivesoftware.smackx.packet.*;
/**
* Stripped Smack implementation of {@link ChatRoomMember}.
......@@ -21,6 +24,11 @@ import org.jivesoftware.smackx.muc.*;
public class ChatMemberImpl
implements XmppChatMember
{
/**
* The logger.
*/
private final static Logger logger = Logger.getLogger(ChatMemberImpl.class);
/**
* The MUC nickname used by this member.
*/
......@@ -112,6 +120,37 @@ public class ChatMemberImpl
return this.role;
}
/**
* Reset cached user role so that it will be refreshed when {@link
* #getRole()} is called.
*/
void resetCachedRole()
{
this.role = null;
}
void processPresence(Presence presence)
{
MUCUser mucUser
= (MUCUser) presence.getExtension(
"x", "http://jabber.org/protocol/muc#user");
String jid = mucUser.getItem().getJid();
if (StringUtils.isNullOrEmpty(jabberId))
{
logger.info(Thread.currentThread()+
"JID: " + jid + " received for: " + getContactAddress());
jabberId = mucUser.getItem().getJid();
}
else if(!jid.equals(jabberId))
{
logger.warn(
"Different jid received in presence: " + presence.toXML());
}
}
@Override
public void setRole(ChatRoomMemberRole role)
{
......@@ -119,13 +158,14 @@ public class ChatMemberImpl
}
@Override
public String getJabberID()
public PresenceStatus getPresenceStatus()
{
return jabberId;
return GlobalStatusEnum.ONLINE;
}
void setJabberID(String jabberId)
@Override
public String getJabberID()
{
this.jabberId = jabberId;
return jabberId;
}
}
......@@ -13,7 +13,6 @@ import net.java.sip.communicator.service.protocol.event.*;
import net.java.sip.communicator.util.Logger;
import org.jitsi.protocol.xmpp.*;
import org.jitsi.util.*;
import org.jivesoftware.smack.*;
import org.jivesoftware.smack.packet.*;
......@@ -70,6 +69,25 @@ public class ChatRoomImpl
localUserRoleListeners
= new CopyOnWriteArrayList<ChatRoomLocalUserRoleListener>();
/**
* HACK:
* We need to have participant presence received, before firing
* participant "joined" event to know MUC participant real JID from the
* start. However Smack seems to be unpredictable(or XMPP server - not
* sure) on the order of "member joined" and "presence packet" events.
* So if "member joined" is fired before presence then we cache
* participant in {@link #earlyParticipant}. If opposite order takes
* place that is presence is received before "member joined" event
* we cache Presence in <tt>onJoinPresence</tt>. {@link
* ChatRoomMemberPresenceChangeEvent#MEMBER_JOINED} is fired when we have
* first Presence packet and Smack "member joined" event has been fired.
*/
private final Map<String, Presence> onJoinPresence
= new HashMap<String,Presence>();
private final List<String> earlyParticipant
= new ArrayList<String>();
/**
* Nickname to member impl class map.
*/
......@@ -171,9 +189,35 @@ public class ChatRoomImpl
logger.info("FORM: " + field.toXML());
}*/
Form answer = config.createAnswerForm();
// Room non-anonymous
FormField whois = new FormField("muc#roomconfig_whois");
whois.addValue("anyone");
answer.addField(whois);
// Room moderated
//FormField roomModerated
// = new FormField("muc#roomconfig_moderatedroom");
//roomModerated.addValue("true");
//answer.addField(roomModerated);
// Only participants can send private messages
//FormField onlyParticipantsPm
// = new FormField("muc#roomconfig_allowpm");
//onlyParticipantsPm.addValue("participants");
//answer.addField(onlyParticipantsPm);
// Presence broadcast
//FormField presenceBroadcast
// = new FormField("muc#roomconfig_presencebroadcast");
//presenceBroadcast.addValue("participant");
//answer.addField(presenceBroadcast);
// Get member list
//FormField getMemberList
// = new FormField("muc#roomconfig_getmemberlist");
//getMemberList.addValue("participant");
//answer.addField(getMemberList);
// Public logging
//FormField publicLogging
// = new FormField("muc#roomconfig_enablelogging");
//publicLogging.addValue("false");
//answer.addField(publicLogging);
muc.sendConfigurationForm(answer);
}
......@@ -241,11 +285,47 @@ public class ChatRoomImpl
return this.role;
}
/**
* Resets cached role instance so that it will be refreshed when {@link
* #getUserRole()} is called.
*/
private void resetCachedUserRole()
{
role = null;
}
/**
* Resets cached role instance for given participant.
* @param participant full mucJID of the participant for whom we want to
* reset cached role instance.
*/
private void resetRoleForParticipant(String participant)
{
if (participant.endsWith("/" + myNickName))
{
resetCachedUserRole();
}
else
{
ChatMemberImpl member = members.get(participant);
if (member != null)
{
member.resetCachedRole();
}
else
{
logger.error(
"Role reset for: " + participant + " who does not exist");
}
}
}
@Override
public void setLocalUserRole(ChatRoomMemberRole role)
throws OperationFailedException
{
// Method not used but log error just in case to spare debugging
logger.error("setLocalUserRole not implemented");
}
/**
......@@ -273,7 +353,7 @@ public class ChatRoomImpl
}
/**
* Sets the new rolefor the local user in the context of this chatroom.
* Sets the new role for the local user in the context of this chat room.
*
* @param role the new role to be set for the local user
* @param isInitial if <tt>true</tt> this is initial role set.
......@@ -502,13 +582,32 @@ public class ChatRoomImpl
@Override
public void grantOwnership(String address)
{
try
{
muc.grantOwnership(address);
}
catch (XMPPException e)
logger.info("Grant owner to " + address);
// Have to construct the IQ manually as Smack version used here seems
// to be using wrong namespace(muc#owner instead of muc#admin)
// which does not work with the Prosody.
MUCAdmin admin = new MUCAdmin();
admin.setType(IQ.Type.SET);
admin.setTo(roomName);
MUCAdmin.Item item = new MUCAdmin.Item("owner", null);
item.setJid(address);
admin.addItem(item);
XmppProtocolProvider provider
= (XmppProtocolProvider) getParentProvider();
XmppConnection connection
= provider.getConnectionAdapter();
IQ reply = (IQ) connection.sendPacketAndGetReply(admin);
if (reply.getType() != IQ.Type.RESULT)
{
throw new RuntimeException(e);
// FIXME: we should have checked exceptions for all operations in
// ChatRoom interface which are expected to fail.
// OperationFailedException maybe ?
throw new RuntimeException(
"Failed to grant owner: " + reply.getError());
}
}
......@@ -691,24 +790,11 @@ public class ChatRoomImpl
connection.sendPacket(lastPresenceSent);
}
class MemberListener
implements ParticipantStatusListener
{
@Override
public void joined(String participant)
private ChatMemberImpl addMember(String participant)
{
ChatMemberImpl member;
ChatMemberImpl newMember;
synchronized (members)
{
member = addMember(participant);
}
if (member != null)
notifyParticipantJoined(member);
}
private ChatMemberImpl addMember(String participant)
{
if (members.containsKey(participant))
{
......@@ -716,14 +802,39 @@ public class ChatRoomImpl
return null;
}
ChatMemberImpl newMember
= new ChatMemberImpl(participant, ChatRoomImpl.this);
newMember = new ChatMemberImpl(participant, ChatRoomImpl.this);
members.put(participant, newMember);
}
return newMember;
}
class MemberListener
implements ParticipantStatusListener
{
@Override
public void joined(String participant)
{
//logger.info(Thread.currentThread()+"JOINED ROOM: "+participant);
Presence peerPresence = onJoinPresence.get(participant);
if (peerPresence == null)
{
earlyParticipant.add(participant);
return;
}
onJoinPresence.remove(participant);
ChatMemberImpl member = addMember(participant);
if (member != null)
{
member.processPresence(peerPresence);
notifyParticipantJoined(member);
}
}
private ChatMemberImpl removeMember(String participant)
{
ChatMemberImpl removed = members.remove(participant);
......@@ -756,7 +867,13 @@ public class ChatRoomImpl
if (logger.isTraceEnabled())
logger.trace("Kicked: " + participant + ", " + s2 +", " + s3);
ChatMemberImpl member = members.get(participant);
ChatMemberImpl member;
synchronized (members)
{
member = removeMember(participant);
}
if (member == null)
{
logger.error(
......@@ -772,6 +889,9 @@ public class ChatRoomImpl
{
if (logger.isTraceEnabled())
logger.trace("Voice granted: " + s);
// We do not fire events - not required for now
resetRoleForParticipant(s);
}
@Override
......@@ -779,6 +899,9 @@ public class ChatRoomImpl
{
if (logger.isTraceEnabled())
logger.trace("Voice revoked: " + s);
// We do not fire events - not required for now
resetRoleForParticipant(s);
}
@Override
......@@ -786,6 +909,9 @@ public class ChatRoomImpl
{
if (logger.isTraceEnabled())
logger.trace("Banned: " + s + ", " + s2 + ", " + s3);
// We do not fire events - not required for now
resetRoleForParticipant(s);
}
@Override
......@@ -793,6 +919,9 @@ public class ChatRoomImpl
{
if (logger.isTraceEnabled())
logger.trace("Membership granted: " + s);
// We do not fire events - not required for now
resetRoleForParticipant(s);
}
@Override
......@@ -800,6 +929,9 @@ public class ChatRoomImpl
{
if (logger.isTraceEnabled())
logger.trace("Membership revoked: " + s);
// We do not fire events - not required for now
resetRoleForParticipant(s);
}
@Override
......@@ -807,6 +939,9 @@ public class ChatRoomImpl
{
if (logger.isTraceEnabled())
logger.trace("Moderator granted: " + s);
// We do not fire events - not required for now
resetRoleForParticipant(s);
}
@Override
......@@ -814,6 +949,9 @@ public class ChatRoomImpl
{
if (logger.isTraceEnabled())
logger.trace("Moderator revoked: " + s);
// We do not fire events - not required for now
resetRoleForParticipant(s);
}
@Override
......@@ -821,6 +959,9 @@ public class ChatRoomImpl
{
if (logger.isTraceEnabled())
logger.trace("Ownership granted: " + s);
// We do not fire events - not required for now
resetRoleForParticipant(s);
}
@Override
......@@ -828,6 +969,9 @@ public class ChatRoomImpl
{
if (logger.isTraceEnabled())
logger.trace("Ownership revoked: " + s);
// We do not fire events - not required for now
resetRoleForParticipant(s);
}
@Override
......@@ -835,6 +979,9 @@ public class ChatRoomImpl
{
if (logger.isTraceEnabled())
logger.trace("Admin granted: " + s);
// We do not fire events - not required for now
resetRoleForParticipant(s);
}
@Override
......@@ -842,6 +989,9 @@ public class ChatRoomImpl
{
if (logger.isTraceEnabled())
logger.trace("Admin revoked: " + s);
// We do not fire events - not required for now
resetRoleForParticipant(s);
}
@Override
......@@ -942,9 +1092,7 @@ public class ChatRoomImpl
*/
private void processOtherPresence(Presence presence)
{
MUCUser mucUser
= (MUCUser) presence.getExtension(
"x", "http://jabber.org/protocol/muc#user");
String participant = presence.getFrom();
ChatMemberImpl member = members.get(presence.getFrom());
if (member == null)
......@@ -952,24 +1100,25 @@ public class ChatRoomImpl
logger.warn(
"Received presence for non-existing member: "
+ presence.toXML());
return;
}
String jid = mucUser.getItem().getJid();
if (StringUtils.isNullOrEmpty(member.getJabberID()))
if (earlyParticipant.contains(participant))
{
logger.info(
"JID: " + jid + " received for: "
+ member.getContactAddress());
earlyParticipant.remove(participant);
member.setJabberID(mucUser.getItem().getJid());
member = addMember(participant);
if (member != null)
{
member.processPresence(presence);
notifyParticipantJoined(member);
}
else if(!jid.equals(member.getJabberID()))
}
else
{
logger.warn(
"New jid received in presence: " + presence.toXML());
onJoinPresence.put(presence.getFrom(), presence);
}
return;
}
member.processPresence(presence);
}
}
}
......@@ -23,6 +23,12 @@ public class OperationSetMeetToolsImpl
}
@Override
public void removeSupportedFeature(String s)
{
}
@Override
public void sendPresenceExtension(ChatRoom chatRoom,
PacketExtension extension)
......
......@@ -109,7 +109,7 @@ public class Config extends HttpServlet
String resolution = JiveGlobals.getProperty("org.jitsi.videobridge.ofmeet.resolution", "360");
String audioMixer = JiveGlobals.getProperty("org.jitsi.videobridge.ofmeet.audio.mixer", "false");
String audioBandwidth = JiveGlobals.getProperty("org.jitsi.videobridge.ofmeet.audio.bandwidth", "128");
String videoBandwidth = JiveGlobals.getProperty("org.jitsi.videobridge.ofmeet.video.bandwidth", "2048");
String videoBandwidth = JiveGlobals.getProperty("org.jitsi.videobridge.ofmeet.video.bandwidth", "4096");
String useNicks = JiveGlobals.getProperty("org.jitsi.videobridge.ofmeet.usenicks", "false");
String useIPv6 = JiveGlobals.getProperty("org.jitsi.videobridge.ofmeet.useipv6", "false");
String useStunTurn = JiveGlobals.getProperty("org.jitsi.videobridge.ofmeet.use.stunturn", "false");
......
......@@ -726,10 +726,13 @@ function getUserMediaWithConstraints(um, success_callback, failure_callback, res
}
break;
}
if (constraints.video)
{
if (constraints.video.mandatory.minWidth)
constraints.video.mandatory.maxWidth = constraints.video.mandatory.minWidth;
if (constraints.video.mandatory.minHeight)
constraints.video.mandatory.maxHeight = constraints.video.mandatory.minHeight;
}
if (bandwidth) { // doesn't work currently, see webrtc issue 1846
if (!constraints.video) constraints.video = {mandatory: {}, optional: []};//same behaviour as true
......
......@@ -569,10 +569,13 @@ NativeSimulcastSender.prototype._appendSimulcastGroup = function (lines) {
simSSRC = this._generateRandomSSRC();
ssrcGroup.push(simSSRC);
if (videoSources.base)
{
sb.splice.apply(sb, [sb.length, 0].concat(
[["a=ssrc:", simSSRC, " cname:", videoSources.base.cname].join(''),
["a=ssrc:", simSSRC, " msid:", videoSources.base.msid].join('')]
));
}
this.logger.info(['Generated substream ', i, ' with SSRC ', simSSRC, '.'].join(''));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment