/*
* Jicofo, the Jitsi Conference Focus.
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
package org.jitsi.jicofo.recording;
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.*;
import org.jitsi.protocol.xmpp.*;
import org.jivesoftware.smack.packet.*;
/**
* Implements {@link Recorder} using direct Colibri queries sent to
* the videobridge.
*
* @author Pawel Domas
*/
public class JvbRecorder
extends Recorder
{
/**
* The logger instance used by this class.
*/
private final static Logger logger = Logger.getLogger(JvbRecorder.class);
/**
* Colibri conference identifier
*/
private final String conferenceId;
/**
* Recording status.
*/
boolean isRecording;
/**
* Creates new instance of <tt>JvbRecorder</tt>.
* @param conferenceId colibri conference ID obtained when allocated
* on the bridge
* @param videoBridgeComponentJid videobridge component address.
* @param xmpp {@link OperationSetDirectSmackXmpp}
* for current XMPP connection.
*/
public JvbRecorder(String conferenceId,
String videoBridgeComponentJid,
OperationSetDirectSmackXmpp xmpp)
{
super(videoBridgeComponentJid, xmpp);
this.conferenceId = conferenceId;
}
/**
* {@inheritDoc}
*/
@Override
public boolean isRecording()
{
return isRecording;
}
/**
* {@inheritDoc}
*/
@Override
public boolean setRecording(String from, String token,
boolean doRecord, String path)
{
ColibriConferenceIQ toggleRecordingIq = new ColibriConferenceIQ();
toggleRecordingIq.setID(conferenceId);
toggleRecordingIq.setTo(recorderComponentJid);
toggleRecordingIq.setType(IQ.Type.SET);
toggleRecordingIq.setRecording(
new ColibriConferenceIQ.Recording(
!isRecording ? State.ON : State.OFF, token));
Packet reply
= xmpp.getXmppConnection()
.sendPacketAndGetReply(toggleRecordingIq);
logger.info("REC reply received: " + reply.toXML());
if (reply instanceof ColibriConferenceIQ)
{
ColibriConferenceIQ colibriReply = (ColibriConferenceIQ) reply;
ColibriConferenceIQ.Recording recording
= colibriReply.getRecording();
if (recording != null)
{
isRecording = recording.getState().equals(State.ON)
|| recording.getState().equals(State.PENDING);
logger.info("REC status: " + conferenceId + ": " + isRecording);
}
else
{
// Recording token is invalid
return false;
}
}
else
{
logger.error(
conferenceId
+ " unexpected response received: " + reply.toXML());
}
return true;
}
@Override
public boolean accept(Packet packet)
{
return false;
/*if (!(packet instanceof ColibriConferenceIQ))
return false;
ColibriConferenceIQ colibriIQ = (ColibriConferenceIQ) packet;
// Packets must be with <recording/> and from the bridge
if (colibriIQ.getRecording() == null
|| !recorderComponentJid.equals(packet.getFrom()))
{
return false;
}
if (!conferenceId.equals(colibriIQ.getID()))
{
logger.warn(
"Received colibri IQ from different conference: "
+ colibriIQ.getID() + ", expected: " + conferenceId);
return false;
}
return true;*/
}
@Override
public void processPacket(Packet packet)
{
//FIXME: should notify the conference about status change,
// but currently all processing is done on the fly using
// XmppConnection.sendPacketAndGetReply
/*ColibriConferenceIQ colibriIq = (ColibriConferenceIQ) packet;
ColibriConferenceIQ.Recording recordingElem
= colibriIq.getRecording();
logger.info(
conferenceId
+ " recording status from the bridge received: "
+ isRecording);
isRecording = recordingElem.getState();*/
}
}