+ eventBus.post(new GenericError(String.format("Could not start download of %s from %s (%s).", dccSendReceived.filename(), dccSendReceived.source().nick().get(), fnfe1.getMessage())));
+ }
+ }
+
+ @Subscribe
+ public void dccAcceptReceived(DccAcceptReceived dccAcceptReceived) {
+ Optional<Network> network = getNetwork(dccAcceptReceived.connection());
+ if (!network.isPresent()) {
+ return;
+ }
+
+ Download download = downloads.get(dccAcceptReceived.filename());
+ if (download == null) {
+ /* unknown download, ignore. */
+ return;
+ }
+
+ try {
+ File outputFile = new File(temporaryDirectory, dccAcceptReceived.filename());
+ if (outputFile.length() != dccAcceptReceived.position()) {
+ eventBus.post(new GenericError(String.format("Download %s from %s does not start at the right position!")));
+ logger.log(Level.WARNING, String.format("Download %s from %s: have %d bytes but wants to resume from %d!", dccAcceptReceived.filename(), dccAcceptReceived.source(), outputFile.length(), dccAcceptReceived.position()));
+
+ downloads.remove(download);
+ return;
+ }
+ OutputStream outputStream = new FileOutputStream(outputFile, true);
+ DccReceiver dccReceiver = new DccReceiver(eventBus, download.remoteAddress(), dccAcceptReceived.port(), dccAcceptReceived.filename(), dccAcceptReceived.position(), download.filesize(), outputStream);
+ download.filename(outputFile.getPath()).outputStream(outputStream).dccReceiver(dccReceiver);
+ dccReceivers.add(dccReceiver);
+ dccReceiver.start();
+ eventBus.post(new DownloadStarted(download));
+ } catch (FileNotFoundException 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));
+ dccReceivers.remove(dccDownloadFinished.dccReceiver());
+ downloads.remove(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));
+ dccReceivers.remove(dccDownloadFailed.dccReceiver());
+ downloads.remove(download);
+ } catch (IOException ioe1) {
+ /* swallow silently. */