/* * Jicofo, the Jitsi Conference Focus. * * Distributable under LGPL license. * See terms of license at gnu.org. */ package org.jitsi.impl.protocol.xmpp; import net.java.sip.communicator.impl.protocol.jabber.extensions.jingle.*; import net.java.sip.communicator.util.*; import org.jitsi.protocol.xmpp.*; import org.jivesoftware.smack.*; import org.jivesoftware.smack.filter.*; import org.jivesoftware.smack.packet.*; /** * Implementation of {@link OperationSetJingleImpl} for * {@link XmppProtocolProvider}. * * @author Pawel Domas */ class OperationSetJingleImpl extends AbstractOperationSetJingle implements PacketFilter, PacketListener { /** * The logger used by this class. */ private final static Logger logger = Logger.getLogger(OperationSetJingleImpl.class); /** * Parent {@link XmppProtocolProvider}. */ private final XmppProtocolProvider xmppProvider; /** * Creates new instance of <tt>OperationSetJingleImpl</tt>. * * @param xmppProvider parent XMPP protocol provider */ OperationSetJingleImpl(XmppProtocolProvider xmppProvider) { this.xmppProvider = xmppProvider; } /** * Initializes this instance and binds packets processor. */ public void initialize() { xmppProvider.getConnection().addPacketListener(this, this); } /** * Returns our XMPP address that will be used as 'from' attribute * in Jingle QIs. */ protected String getOurJID() { return xmppProvider.getOurJid(); } /** * {@inheritDoc} */ protected XmppConnection getConnection() { return xmppProvider.getConnectionAdapter(); } /** * Packets filter implementation. * * {@inheritDoc} */ public boolean accept(Packet packet) { try { // We handle JingleIQ and SessionIQ. if (!(packet instanceof JingleIQ)) { // FIXME: find session for packet ID to make sure // that the error belongs to this class String packetID = packet.getPacketID(); XMPPError error = packet.getError(); if (error != null) { String errorMessage = error.getMessage(); logger.error( "Received an error: code=" + error.getCode() + " message=" + errorMessage); } } return packet instanceof JingleIQ && getSession(((JingleIQ) packet).getSID()) != null; } catch(Throwable t) { logger.error(t, t); return false; } } /** * FIXME: this method can go to abstract class. * * {@inheritDoc} */ public void processPacket(Packet packet) { IQ iq = (IQ) packet; //first ack all "set" requests. if(iq.getType() == IQ.Type.SET) { IQ ack = IQ.createResultIQ(iq); getConnection().sendPacket(ack); } try { if (iq instanceof JingleIQ) processJingleIQ((JingleIQ) iq); } catch(Throwable t) { if (logger.isInfoEnabled()) { String packetClass; if (iq instanceof JingleIQ) packetClass = "Jingle"; else packetClass = packet.getClass().getSimpleName(); logger.info( "Error while handling incoming " + packetClass + " packet: ", t); } /* * The Javadoc on ThreadDeath says: If ThreadDeath is caught by * a method, it is important that it be rethrown so that the * thread actually dies. */ if (t instanceof ThreadDeath) throw (ThreadDeath) t; } } }