Commit 4f0936b9 authored by Dele Olajide's avatar Dele Olajide Committed by dele

Jitsi Videobridge plugin - Added Join/Leave video bridge events

Rayo Plugin - Added Join/Leave audio bridge events

git-svn-id: http://svn.igniterealtime.org/svn/repos/openfire/trunk@13878 b35dd754-fafc-0310-a699-88a17e54d16e
parent f6df842a
package com.rayo.core.verb;
import org.xmpp.packet.*;
import org.dom4j.*;
public class JoinBridgeEvent extends AbstractVerbEvent {
private String mixer;
private String nickname;
private JID participant;
public JoinBridgeEvent(String mixer, JID participant, String nickname)
{
this.mixer = mixer;
this.participant = participant;
this.nickname = nickname;
}
public String getMixer() {
return mixer;
}
public String getNickname() {
return nickname;
}
public JID getParticipant() {
return participant;
}
}
package com.rayo.core.verb;
import org.xmpp.packet.*;
import org.dom4j.*;
public class LeaveBridgeEvent extends AbstractVerbEvent {
private String mixer;
private JID participant;
private String nickname;
public LeaveBridgeEvent(String mixer, JID participant, String nickname)
{
this.mixer = mixer;
this.participant = participant;
this.nickname = nickname;
}
public String getMixer() {
return mixer;
}
public String getNickname() {
return nickname;
}
public JID getParticipant() {
return participant;
}
}
...@@ -79,6 +79,12 @@ public class ColibriProvider extends BaseProvider { ...@@ -79,6 +79,12 @@ public class ColibriProvider extends BaseProvider {
} else if (object instanceof RemoveSourceEvent) { } else if (object instanceof RemoveSourceEvent) {
createRemoveSourceEvent((RemoveSourceEvent) object, document); createRemoveSourceEvent((RemoveSourceEvent) object, document);
} else if (object instanceof JoinBridgeEvent) {
createJoinBridgeEvent((JoinBridgeEvent) object, document);
} else if (object instanceof LeaveBridgeEvent) {
createLeaveBridgeEvent((LeaveBridgeEvent) object, document);
} else if (object instanceof MutedEvent) { } else if (object instanceof MutedEvent) {
createMutedEvent((MutedEvent) object, document); createMutedEvent((MutedEvent) object, document);
...@@ -118,6 +124,22 @@ public class ColibriProvider extends BaseProvider { ...@@ -118,6 +124,22 @@ public class ColibriProvider extends BaseProvider {
root.add(event.getConference().createCopy()); root.add(event.getConference().createCopy());
} }
private void createJoinBridgeEvent(JoinBridgeEvent joined, Document document)
{
Element root = document.addElement(new QName("joined", NAMESPACE));
root.addAttribute("mixer-name", joined.getMixer());
root.addAttribute("nickname", joined.getNickname());
root.addAttribute("participant", joined.getParticipant().toString());
}
private void createLeaveBridgeEvent(LeaveBridgeEvent unjoined, Document document)
{
Element root = document.addElement(new QName("unjoined", NAMESPACE));
root.addAttribute("mixer-name", unjoined.getMixer());
root.addAttribute("nickname", unjoined.getNickname());
root.addAttribute("participant", unjoined.getParticipant().toString());
}
private void createMutedEvent(MutedEvent muted, Document document) private void createMutedEvent(MutedEvent muted, Document document)
{ {
document.addElement(new QName("onmute", NAMESPACE)); document.addElement(new QName("onmute", NAMESPACE));
...@@ -127,5 +149,4 @@ public class ColibriProvider extends BaseProvider { ...@@ -127,5 +149,4 @@ public class ColibriProvider extends BaseProvider {
{ {
document.addElement(new QName("offmute", NAMESPACE)); document.addElement(new QName("offmute", NAMESPACE));
} }
} }
...@@ -640,6 +640,7 @@ public class PluginImpl implements Plugin, PropertyEventListener ...@@ -640,6 +640,7 @@ public class PluginImpl implements Plugin, PropertyEventListener
{ {
return new IQHandlerInfo("colibri", RAYO_COLIBRI); return new IQHandlerInfo("colibri", RAYO_COLIBRI);
} }
/** /**
* *
* *
...@@ -926,7 +927,42 @@ public class PluginImpl implements Plugin, PropertyEventListener ...@@ -926,7 +927,42 @@ public class PluginImpl implements Plugin, PropertyEventListener
} }
} }
} }
bridgeJoin(true, participant);
}
/**
*
*
*/
public void bridgeJoin(boolean join, Participant participant)
{
String roomName = roomJid.getNode();
MUCRoom room = XMPPServer.getInstance().getMultiUserChatManager().getMultiUserChatService("conference").getChatRoom(roomName);
Log.info("bridgeJoin event to room occupants of " + roomName);
for ( MUCRole role : room.getOccupants())
{
String jid = role.getUserAddress().toString();
Log.info("bridgeJoin event to room occupant " + jid);
Presence presence = new Presence();
presence.setFrom(XMPPServer.getInstance().createJID(focusName, focusName));
presence.setTo(jid);
if (join)
{
JoinBridgeEvent event = new JoinBridgeEvent(roomName, participant.getUser(), participant.getNickname());
presence.getElement().add(colibriProvider.toXML(event));
} else {
LeaveBridgeEvent event = new LeaveBridgeEvent(roomName, participant.getUser(), participant.getNickname());
presence.getElement().add(colibriProvider.toXML(event));
}
router.route(presence);
}
} }
/** /**
* *
* *
...@@ -1102,6 +1138,8 @@ public class PluginImpl implements Plugin, PropertyEventListener ...@@ -1102,6 +1138,8 @@ public class PluginImpl implements Plugin, PropertyEventListener
} }
users.remove(username); users.remove(username);
ssrcs.remove(username); ssrcs.remove(username);
bridgeJoin(false, participant);
} }
Log.info("removeColibriChannel " + count); Log.info("removeColibriChannel " + count);
......
...@@ -1028,8 +1028,6 @@ public class RayoComponent extends AbstractComponent ...@@ -1028,8 +1028,6 @@ public class RayoComponent extends AbstractComponent
if (CallHandler.findCall("colibri-" + mixer) == null) // other participant than colibri if (CallHandler.findCall("colibri-" + mixer) == null) // other participant than colibri
{ {
attachVideobridge(mixer, iq.getFrom(), conferenceManager.getMediaInfo().toString());
if (conferenceManager.getMemberList().size() == 1) // handset already in call if (conferenceManager.getMemberList().size() == 1) // handset already in call
{ {
String recording = mixer + "-" + System.currentTimeMillis() + ".au"; String recording = mixer + "-" + System.currentTimeMillis() + ".au";
...@@ -1048,8 +1046,6 @@ public class RayoComponent extends AbstractComponent ...@@ -1048,8 +1046,6 @@ public class RayoComponent extends AbstractComponent
conferenceManager.recordConference(true, recording, "au"); conferenceManager.recordConference(true, recording, "au");
sendMucMessage(mixer, recording, iq.getFrom(), "started voice recording"); sendMucMessage(mixer, recording, iq.getFrom(), "started voice recording");
attachVideobridge(mixer, iq.getFrom(), "PCM/48000/2");
} catch (Exception e) { } catch (Exception e) {
reply.setError(PacketError.Condition.item_not_found); reply.setError(PacketError.Condition.item_not_found);
} }
...@@ -1088,7 +1084,6 @@ public class RayoComponent extends AbstractComponent ...@@ -1088,7 +1084,6 @@ public class RayoComponent extends AbstractComponent
{ {
conferenceManager.recordConference(false, null, null); conferenceManager.recordConference(false, null, null);
sendMucMessage(mixer, null, iq.getFrom(), "stopped voice recording"); sendMucMessage(mixer, null, iq.getFrom(), "stopped voice recording");
detachVideobridge(mixer);
} }
sendMucMessage(mixer, null, iq.getFrom(), iq.getFrom().getNode() + " left voice conversation"); sendMucMessage(mixer, null, iq.getFrom(), iq.getFrom().getNode() + " left voice conversation");
...@@ -1164,17 +1159,24 @@ public class RayoComponent extends AbstractComponent ...@@ -1164,17 +1159,24 @@ public class RayoComponent extends AbstractComponent
} }
private void sendMucMessage(String mixer, String recording, JID participant, String message) private boolean isMixerMuc(String mixer)
{ {
boolean isMuc = false;
if (XMPPServer.getInstance().getMultiUserChatManager().getMultiUserChatService("conference").hasChatRoom(mixer)) { if (XMPPServer.getInstance().getMultiUserChatManager().getMultiUserChatService("conference").hasChatRoom(mixer)) {
MUCRoom room = XMPPServer.getInstance().getMultiUserChatManager().getMultiUserChatService("conference").getChatRoom(mixer); isMuc = null != XMPPServer.getInstance().getMultiUserChatManager().getMultiUserChatService("conference").getChatRoom(mixer);
}
return isMuc;
}
if (room != null) private void sendMucMessage(String mixer, String recording, JID participant, String message)
{ {
sendMessage(new JID(mixer + "@conference." + getDomain()), participant, message, recording, "groupchat"); if (isMixerMuc(mixer)) // not working
} {
//sendMessage(new JID(mixer + "@conference." + getDomain()), participant, message, recording, "groupchat");
} }
} }
private IQ handleDialCommand(DialCommand command, IQ iq, boolean transferCall) private IQ handleDialCommand(DialCommand command, IQ iq, boolean transferCall)
...@@ -1530,7 +1532,7 @@ public class RayoComponent extends AbstractComponent ...@@ -1530,7 +1532,7 @@ public class RayoComponent extends AbstractComponent
ConferenceManager conferenceManager = ConferenceManager.findConferenceManager(conferenceId); ConferenceManager conferenceManager = ConferenceManager.findConferenceManager(conferenceId);
ArrayList memberList = conferenceManager.getMemberList(); ArrayList memberList = conferenceManager.getMemberList();
sendMucMessage(conferenceId, null, from, from.getNode() + (startSpeaking ? "started" : "stopped") + " speaking"); //sendMucMessage(conferenceId, null, from, from.getNode() + (startSpeaking ? " started" : " stopped") + " speaking");
synchronized (memberList) synchronized (memberList)
{ {
...@@ -1550,7 +1552,7 @@ public class RayoComponent extends AbstractComponent ...@@ -1550,7 +1552,7 @@ public class RayoComponent extends AbstractComponent
if (target != null && callId.equals(cp.getCallId()) == false) if (target != null && callId.equals(cp.getCallId()) == false)
{ {
Presence presence = new Presence(); Presence presence = new Presence();
presence.setFrom(callId + "@" + getDomain()); presence.setFrom(conferenceId + "@" + getDomain());
presence.setTo(target); presence.setTo(target);
if (startSpeaking) if (startSpeaking)
...@@ -1703,11 +1705,45 @@ public class RayoComponent extends AbstractComponent ...@@ -1703,11 +1705,45 @@ public class RayoComponent extends AbstractComponent
int memberCount = memberList.size(); int memberCount = memberList.size();
Log.info("RayoComponent notifyConferenceMonitors found owner " + callParticipant.getCallOwner() + " " + memberCount); /*
When mixer is an muc, assume a conference call just sent join/unjoin
When mixer is a group, assume a third party call, inform group members
*/
if (groupName == null) if (groupName == null)
{ {
routeJoinEvent(callParticipant.getCallOwner(), callParticipant, conferenceEvent, memberCount, groupName, callId, farParty, conferenceManager); if (isMixerMuc(conferenceEvent.getConferenceId()))
{
MUCRoom room = XMPPServer.getInstance().getMultiUserChatManager().getMultiUserChatService("conference").getChatRoom(conferenceEvent.getConferenceId());
Log.info("RayoComponent notifyConferenceMonitors routing to room occupants of " + conferenceEvent.getConferenceId());
for ( MUCRole role : room.getOccupants())
{
String jid = role.getUserAddress().toString();
Log.info("RayoComponent notifyConferenceMonitors routing to room occupant " + jid);
Presence presence = new Presence();
presence.setFrom(conferenceEvent.getCallId() + "@" + getDomain());
presence.setTo(jid);
if (conferenceEvent.equals(ConferenceEvent.MEMBER_LEFT))
{
UnjoinedEvent event = new UnjoinedEvent(null, conferenceEvent.getConferenceId(), JoinDestinationType.MIXER);
presence.getElement().add(rayoProvider.toXML(event));
} else {
JoinedEvent event = new JoinedEvent(null, conferenceEvent.getConferenceId(), JoinDestinationType.MIXER);
presence.getElement().add(rayoProvider.toXML(event));
}
sendPacket(presence);
}
} else {
Log.info("RayoComponent notifyConferenceMonitors routing to owner " + callParticipant.getCallOwner() + " " + memberCount);
routeJoinEvent(callParticipant.getCallOwner(), callParticipant, conferenceEvent, memberCount, groupName, callId, farParty, conferenceManager);
}
} else { } else {
...@@ -2286,4 +2322,4 @@ public class RayoComponent extends AbstractComponent ...@@ -2286,4 +2322,4 @@ public class RayoComponent extends AbstractComponent
@Override public IQ handleIQ(IQ iq) {try {return handleIQGet(iq);} catch(Exception e) { return null;}} @Override public IQ handleIQ(IQ iq) {try {return handleIQGet(iq);} catch(Exception e) { return null;}}
@Override public IQHandlerInfo getInfo() { return new IQHandlerInfo("dtmf", RAYO_CORE); } @Override public IQHandlerInfo getInfo() { return new IQHandlerInfo("dtmf", RAYO_CORE); }
} }
} }
\ No newline at end of file
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