import net.pterodactylus.irc.event.ChannelJoined;
import net.pterodactylus.irc.event.ChannelMessageReceived;
import net.pterodactylus.irc.event.ConnectionEstablished;
+import net.pterodactylus.irc.event.DccDownloadFailed;
+import net.pterodactylus.irc.event.DccDownloadFinished;
import net.pterodactylus.irc.event.DccSendReceived;
import net.pterodactylus.irc.util.MessageCleaner;
import net.pterodactylus.irc.util.RandomNickname;
import net.pterodactylus.xdcc.core.event.BotAdded;
import net.pterodactylus.xdcc.core.event.CoreStarted;
+import net.pterodactylus.xdcc.core.event.DownloadFailed;
+import net.pterodactylus.xdcc.core.event.DownloadFinished;
+import net.pterodactylus.xdcc.core.event.DownloadStarted;
import net.pterodactylus.xdcc.data.Bot;
import net.pterodactylus.xdcc.data.Channel;
+import net.pterodactylus.xdcc.data.Download;
import net.pterodactylus.xdcc.data.Network;
import net.pterodactylus.xdcc.data.Pack;
import net.pterodactylus.xdcc.data.Server;
import com.google.common.collect.Table;
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
+import com.google.common.io.Closeables;
import com.google.common.util.concurrent.AbstractIdleService;
import com.google.inject.Inject;
/** The currently known bots. */
private final Table<Network, String, Bot> networkBots = HashBasedTable.create();
+ /** The current downloads. */
+ private final Map<String, Download> downloads = Maps.newHashMap();
+
/** The current DCC receivers. */
private final Collection<DccReceiver> dccReceivers = Sets.newHashSet();
return;
}
+ Download download = new Download(bot, pack);
+ downloads.put(pack.name(), download);
+
try {
connection.sendMessage(bot.name(), "XDCC SEND " + pack.id());
} catch (IOException ioe1) {
*/
@Subscribe
public void dccSendReceived(DccSendReceived dccSendReceived) {
+ Optional<Network> network = getNetwork(dccSendReceived.connection());
+ if (!network.isPresent()) {
+ return;
+ }
+
+ Download download = downloads.get(dccSendReceived.filename());
+ if (download == null) {
+ /* unknown download, ignore. */
+ return;
+ }
+
logger.info(String.format("Starting download of %s.", dccSendReceived.filename()));
try {
File outputFile = new File(temporaryDirectory, dccSendReceived.filename());
OutputStream fileOutputStream = new FileOutputStream(outputFile);
DccReceiver dccReceiver = new DccReceiver(eventBus, dccSendReceived.inetAddress(), dccSendReceived.port(), dccSendReceived.filename(), dccSendReceived.filesize(), fileOutputStream);
+ download.filename(outputFile.getPath()).outputStream(fileOutputStream).dccReceiver(dccReceiver);
dccReceivers.add(dccReceiver);
dccReceiver.start();
+ eventBus.post(new DownloadStarted(download));
} catch (FileNotFoundException fnfe1) {
logger.log(Level.WARNING, "Could not open file for download!", fnfe1);
}
}
+ /**
+ * Closes the output stream of the download and moves the file to the final
+ * location.
+ *
+ * @param dccDownloadFinished
+ * The DCC download finished event
+ */
+ @Subscribe
+ public void dccDownloadFinished(DccDownloadFinished dccDownloadFinished) {
+ Download download = downloads.get(dccDownloadFinished.dccReceiver().filename());
+ if (download == null) {
+ /* probably shouldn’t happen. */
+ return;
+ }
+
+ try {
+ download.outputStream().close();
+ File file = new File(download.filename());
+ file.renameTo(new File(finalDirectory, download.pack().name()));
+ eventBus.post(new DownloadFinished(download));
+ } catch (IOException ioe1) {
+ /* TODO - handle all the errors. */
+ logger.log(Level.WARNING, String.format("Could not move file %s to directory %s.", download.filename(), finalDirectory), ioe1);
+ }
+ }
+
+ /**
+ * Closes the output stream and notifies all listeners of the failure.
+ *
+ * @param dccDownloadFailed
+ * The DCC download failed event
+ */
+ @Subscribe
+ public void dccDownloadFailed(DccDownloadFailed dccDownloadFailed) {
+ Download download = downloads.get(dccDownloadFailed.dccReceiver().filename());
+ if (download == null) {
+ /* probably shouldn’t happen. */
+ return;
+ }
+
+ try {
+ Closeables.close(download.outputStream(), true);
+ eventBus.post(new DownloadFailed(download));
+ } catch (IOException ioe1) {
+ /* swallow silently. */
+ }
+ }
+
//
// PRIVATE METHODS
//