/*
* Jicofo, the Jitsi Conference Focus.
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
package org.jitsi.jicofo;
import net.java.sip.communicator.impl.protocol.jabber.extensions.colibri.*;
import net.java.sip.communicator.impl.protocol.jabber.extensions.colibri.ColibriConferenceIQ.Recording.*;
import net.java.sip.communicator.util.Logger;
import org.jitsi.impl.protocol.xmpp.extensions.*;
import org.jitsi.protocol.xmpp.*;
import org.jitsi.util.*;
import org.jivesoftware.smack.*;
import org.jivesoftware.smack.filter.*;
import org.jivesoftware.smack.packet.*;
import org.jivesoftware.smack.provider.*;
/**
* Class handles various Jitsi Meet extensions IQs like {@link MuteIq} and
* Colibri for recording.
*
* @author Pawel Domas
*/
public class MeetExtensionsHandler
implements PacketFilter,
PacketListener
{
/**
* The logger
*/
private final static Logger logger
= Logger.getLogger(MeetExtensionsHandler.class);
/**
* Parent conference.
*/
private final JitsiMeetConference conference;
/**
* Operation set that provider XMPP connection.
*/
private OperationSetDirectSmackXmpp smackXmpp;
/**
* Creates new instance of {@link MeetExtensionsHandler}.
* @param conference parent conference for which newly created instance
* will be listening for service extensions packets.
*/
public MeetExtensionsHandler(JitsiMeetConference conference)
{
this.conference = conference;
MuteIqProvider muteIqProvider = new MuteIqProvider();
muteIqProvider.registerMuteIqProvider(
ProviderManager.getInstance());
}
/**
* Initializes this instance and bind packet listeners.
*/
public void init()
{
this.smackXmpp
= conference.getXmppProvider().getOperationSet(
OperationSetDirectSmackXmpp.class);
smackXmpp.addPacketHandler(this, this);
}
/**
* Disposes this instance and stop listening for extensions packets.
*/
public void dispose()
{
if (smackXmpp != null)
{
smackXmpp.removePacketHandler(this);
smackXmpp = null;
}
}
@Override
public boolean accept(Packet packet)
{
return acceptMuteIq(packet) || acceptColibriIQ(packet);
}
@Override
public void processPacket(Packet packet)
{
if (smackXmpp == null)
{
logger.error("Not initialized");
return;
}
if (packet instanceof ColibriConferenceIQ)
{
handleColibriIq((ColibriConferenceIQ) packet);
}
else if (packet instanceof MuteIq)
{
handleMuteIq((MuteIq) packet);
}
else
{
logger.error("Unexpected packet: " + packet.toXML());
}
}
private boolean acceptColibriIQ(Packet packet)
{
String bridgeJid = conference.getServices().getVideobridge();
return packet instanceof ColibriConferenceIQ
// We're interested in packets from outside the world and not the JVB
&& (bridgeJid == null || !bridgeJid.equals(packet.getFrom()))
// And with recording element
&& ((ColibriConferenceIQ)packet).getRecording() != null;
}
private void handleColibriIq(ColibriConferenceIQ colibriIQ)
{
ColibriConferenceIQ.Recording recording = colibriIQ.getRecording();
State recordingState =
conference.modifyRecordingState(
colibriIQ.getFrom(),
recording.getToken(),
recording.getState(),
recording.getDirectory(),
colibriIQ.getTo());
ColibriConferenceIQ response = new ColibriConferenceIQ();
response.setType(IQ.Type.RESULT);
response.setPacketID(colibriIQ.getPacketID());
response.setTo(colibriIQ.getFrom());
response.setFrom(colibriIQ.getTo());
response.setRecording(
new ColibriConferenceIQ.Recording(recordingState));
smackXmpp.getXmppConnection().sendPacket(response);
}
private boolean acceptMuteIq(Packet packet)
{
return packet instanceof MuteIq;
}
private void handleMuteIq(MuteIq muteIq)
{
Boolean doMute = muteIq.getMute();
String jid = muteIq.getJid();
if (doMute == null || StringUtils.isNullOrEmpty(jid))
return;
IQ result;
if (conference.handleMuteRequest(muteIq.getFrom(), jid, doMute))
{
result = IQ.createResultIQ(muteIq);
if (!muteIq.getFrom().equals(jid))
{
MuteIq muteStatusUpdate = new MuteIq();
muteStatusUpdate.setType(IQ.Type.SET);
muteStatusUpdate.setTo(jid);
muteStatusUpdate.setMute(doMute);
smackXmpp.getXmppConnection().sendPacket(muteStatusUpdate);
}
}
else
{
result = IQ.createErrorResponse(
muteIq,
new XMPPError(XMPPError.Condition.interna_server_error));
}
smackXmpp.getXmppConnection().sendPacket(result);
}
}