package org.limewire.xmpp.client.impl.messages.filetransfer; import java.io.IOException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jivesoftware.smack.PacketListener; import org.jivesoftware.smack.filter.PacketFilter; import org.jivesoftware.smack.packet.IQ; import org.jivesoftware.smack.packet.Packet; import org.limewire.friend.api.FileMetaData; import org.limewire.friend.api.FriendException; import org.limewire.friend.api.FriendPresence; import org.limewire.friend.api.feature.FeatureTransport; import org.limewire.xmpp.client.impl.XMPPFriendConnectionImpl; import org.xmlpull.v1.XmlPullParserException; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; public class FileTransferIQListener implements PacketListener, FeatureTransport<FileMetaData> { private static final Log LOG = LogFactory.getLog(FileTransferIQListener.class); private final XMPPFriendConnectionImpl connection; private final Handler<FileMetaData> fileMetaDataHandler; @Inject public FileTransferIQListener(@Assisted XMPPFriendConnectionImpl connection, FeatureTransport.Handler<FileMetaData> fileMetaDataHandler) { this.connection = connection; this.fileMetaDataHandler = fileMetaDataHandler; } public void processPacket(Packet packet) { FileTransferIQ iq = (FileTransferIQ)packet; try { if(iq.getType().equals(IQ.Type.GET)) { handleGet(iq); } } catch (IOException e) { LOG.error(e.getMessage(), e); //sendError(packet); } catch (XmlPullParserException e) { LOG.error(e.getMessage(), e); //sendError(packet); } } private void handleGet(FileTransferIQ packet) throws IOException, XmlPullParserException { if(LOG.isDebugEnabled()) { LOG.debug("handling file transfer get " + packet.getPacketID()); } fileMetaDataHandler.featureReceived(packet.getFrom(), packet.getFileMetaData()); } @Override public void sendFeature(FriendPresence presence, FileMetaData localFeature) throws FriendException { if(LOG.isInfoEnabled()) { LOG.info("offering file " + localFeature.toString() + " to " + presence.getPresenceId()); } final FileTransferIQ transferIQ = new FileTransferIQ(localFeature, FileTransferIQ.TransferType.OFFER); transferIQ.setType(IQ.Type.GET); transferIQ.setTo(presence.getPresenceId()); transferIQ.setPacketID(IQ.nextID()); connection.sendPacket(transferIQ); } public PacketFilter getPacketFilter() { return new PacketFilter(){ public boolean accept(Packet packet) { return packet instanceof FileTransferIQ; } }; } }