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 {
} else if (object instanceof RemoveSourceEvent) {
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) {
createMutedEvent((MutedEvent) object, document);
......@@ -118,6 +124,22 @@ public class ColibriProvider extends BaseProvider {
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)
{
document.addElement(new QName("onmute", NAMESPACE));
......@@ -127,5 +149,4 @@ public class ColibriProvider extends BaseProvider {
{
document.addElement(new QName("offmute", NAMESPACE));
}
}
......@@ -640,6 +640,7 @@ public class PluginImpl implements Plugin, PropertyEventListener
{
return new IQHandlerInfo("colibri", RAYO_COLIBRI);
}
/**
*
*
......@@ -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
}
users.remove(username);
ssrcs.remove(username);
bridgeJoin(false, participant);
}
Log.info("removeColibriChannel " + count);
......
......@@ -1028,8 +1028,6 @@ public class RayoComponent extends AbstractComponent
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
{
String recording = mixer + "-" + System.currentTimeMillis() + ".au";
......@@ -1048,8 +1046,6 @@ public class RayoComponent extends AbstractComponent
conferenceManager.recordConference(true, recording, "au");
sendMucMessage(mixer, recording, iq.getFrom(), "started voice recording");
attachVideobridge(mixer, iq.getFrom(), "PCM/48000/2");
} catch (Exception e) {
reply.setError(PacketError.Condition.item_not_found);
}
......@@ -1088,7 +1084,6 @@ public class RayoComponent extends AbstractComponent
{
conferenceManager.recordConference(false, null, null);
sendMucMessage(mixer, null, iq.getFrom(), "stopped voice recording");
detachVideobridge(mixer);
}
sendMucMessage(mixer, null, iq.getFrom(), iq.getFrom().getNode() + " left voice conversation");
......@@ -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)) {
MUCRoom room = XMPPServer.getInstance().getMultiUserChatManager().getMultiUserChatService("conference").getChatRoom(mixer);
isMuc = null != XMPPServer.getInstance().getMultiUserChatManager().getMultiUserChatService("conference").getChatRoom(mixer);
}
return isMuc;
}
if (room != null)
{
sendMessage(new JID(mixer + "@conference." + getDomain()), participant, message, recording, "groupchat");
}
private void sendMucMessage(String mixer, String recording, JID participant, String message)
{
if (isMixerMuc(mixer)) // not working
{
//sendMessage(new JID(mixer + "@conference." + getDomain()), participant, message, recording, "groupchat");
}
}
private IQ handleDialCommand(DialCommand command, IQ iq, boolean transferCall)
......@@ -1530,7 +1532,7 @@ public class RayoComponent extends AbstractComponent
ConferenceManager conferenceManager = ConferenceManager.findConferenceManager(conferenceId);
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)
{
......@@ -1550,7 +1552,7 @@ public class RayoComponent extends AbstractComponent
if (target != null && callId.equals(cp.getCallId()) == false)
{
Presence presence = new Presence();
presence.setFrom(callId + "@" + getDomain());
presence.setFrom(conferenceId + "@" + getDomain());
presence.setTo(target);
if (startSpeaking)
......@@ -1703,11 +1705,45 @@ public class RayoComponent extends AbstractComponent
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)
{
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 {
......@@ -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 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