package org.limewire.ui.swing.util; import java.io.File; import javax.swing.JOptionPane; import org.limewire.core.api.download.DownloadAction; import org.limewire.core.api.download.DownloadException; import org.limewire.core.api.download.DownloadListManager; import org.limewire.core.api.magnet.MagnetLink; import org.limewire.core.api.search.SearchCategory; import org.limewire.inject.LazySingleton; import org.limewire.ui.swing.components.FocusJOptionPane; import org.limewire.ui.swing.search.DefaultSearchInfo; import org.limewire.ui.swing.search.SearchHandler; import com.google.inject.Inject; import com.google.inject.Provider; @LazySingleton class MagnetHandlerImpl implements MagnetHandler { private final DownloadListManager downloadListManager; private final SearchHandler searchHandler; private final Provider<DownloadExceptionHandler> downloadExceptionHandler; private static volatile int torrentDownloadMagnetCount = 0; private static volatile int gnutellaDownloadMagnetCount = 0; private static volatile int searchMagnetCount = 0; @Inject MagnetHandlerImpl(SearchHandler searchHandler, DownloadListManager downloadListManager, Provider<DownloadExceptionHandler> downloadExceptionHandler) { this.downloadListManager = downloadListManager; this.searchHandler = searchHandler; this.downloadExceptionHandler = downloadExceptionHandler; } /** * Handles the given magnet file by either starting a search or starting to * download the file specified in the magnet. */ public void handleMagnet(final MagnetLink magnet) { SwingUtils.invokeNowOrLater(new Runnable() { @Override public void run() { if(magnet.isGnutellaDownloadable()) { downloadMagnet(magnet); } else if(magnet.isTorrentDownloadable()) { downloadTorrent(magnet); } else if(magnet.isKeywordTopicOnly()) { searchHandler.doSearch(DefaultSearchInfo. createKeywordSearch(magnet.getQueryString(), SearchCategory.ALL)); searchMagnetCount++; } else { FocusJOptionPane.showMessageDialog(GuiUtils.getMainFrame(), I18n.tr("The magnet link is invalid."), I18n.tr("Invalid Magnet Link"), JOptionPane.INFORMATION_MESSAGE); } } }); } private void downloadTorrent(MagnetLink magnet) { try { downloadListManager.addTorrentDownload(magnet.getName(), magnet.getURN(), magnet.getTrackerUrls()); torrentDownloadMagnetCount++; } catch(DownloadException e) { downloadExceptionHandler.get().handleDownloadException( new TorrentDownloadAction(magnet), e, true); } } private void downloadMagnet(MagnetLink magnet) { try { downloadListManager.addDownload(magnet, null, false); gnutellaDownloadMagnetCount++; } catch (DownloadException e) { downloadExceptionHandler.get().handleDownloadException( new MagnetDownloadAction(magnet), e, true); } } private class TorrentDownloadAction implements DownloadAction { private final MagnetLink magnet; TorrentDownloadAction(MagnetLink magnet) { this.magnet = magnet; } @Override public void download(File saveFile, boolean overwrite) throws DownloadException { downloadListManager.addTorrentDownload(magnet.getName(), magnet.getURN(), magnet.getTrackerUrls()); torrentDownloadMagnetCount++; } @Override public void downloadCanceled(DownloadException ignored) { } } private class MagnetDownloadAction implements DownloadAction { private final MagnetLink magnet; MagnetDownloadAction(MagnetLink magnet) { this.magnet = magnet; } @Override public void download(File saveFile, boolean overwrite) throws DownloadException { downloadListManager.addDownload(magnet, saveFile, overwrite); gnutellaDownloadMagnetCount++; } @Override public void downloadCanceled(DownloadException ignored) {} } }