package com.limegroup.gnutella.downloader; import java.io.File; import java.io.IOException; import java.net.URI; import java.util.Arrays; import org.limewire.bittorrent.TorrentParams; import org.limewire.core.api.download.DownloadException; import org.limewire.io.GUID; import org.limewire.io.InvalidDataException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; import com.limegroup.bittorrent.BTDownloader; import com.limegroup.bittorrent.BTTorrentFileDownloader; import com.limegroup.gnutella.RemoteFileDesc; import com.limegroup.gnutella.browser.MagnetOptions; import com.limegroup.gnutella.downloader.serial.DownloadMemento; @Singleton public class CoreDownloaderFactoryImpl implements CoreDownloaderFactory { private final Provider<ManagedDownloader> managedDownloaderFactory; private final Provider<MagnetDownloader> magnetDownloaderFactory; private final Provider<ResumeDownloader> resumeDownloaderFactory; private final Provider<BTDownloader> btDownloaderFactory; private final Provider<BTTorrentFileDownloader> torrentFileDownloaderFactory; @Inject public CoreDownloaderFactoryImpl( Provider<ManagedDownloader> managedDownloaderFactory, Provider<MagnetDownloader> magnetDownloaderFactory, Provider<ResumeDownloader> resumeDownloaderFactory, Provider<BTDownloader> btDownloaderFactory, Provider<BTTorrentFileDownloader> torrentFileDownloaderFactory) { this.managedDownloaderFactory = managedDownloaderFactory; this.magnetDownloaderFactory = magnetDownloaderFactory; this.resumeDownloaderFactory = resumeDownloaderFactory; this.btDownloaderFactory = btDownloaderFactory; this.torrentFileDownloaderFactory = torrentFileDownloaderFactory; } @Override public ManagedDownloader createManagedDownloader(RemoteFileDesc[] files, GUID originalQueryGUID, File saveDirectory, String fileName, boolean overwrite) throws DownloadException { ManagedDownloader md = managedDownloaderFactory.get(); md.addInitialSources(Arrays.asList(files), fileName); md.setQueryGuid(originalQueryGUID); md.setSaveFile(saveDirectory, fileName, overwrite); return md; } @Override public MagnetDownloader createMagnetDownloader(MagnetOptions magnet, boolean overwrite, File saveDirectory, String fileName) throws DownloadException { if (!magnet.isGnutellaDownloadable()) throw new IllegalArgumentException("magnet not downloadable"); if (fileName == null) fileName = magnet.getFileNameForSaving(); MagnetDownloader md = magnetDownloaderFactory.get(); md.addInitialSources(null, fileName); md.setSaveFile(saveDirectory, fileName, overwrite); md.setMagnet(magnet); return md; } @Override public ResumeDownloader createResumeDownloader(File incompleteFile, String name, long size) throws DownloadException { ResumeDownloader rd = resumeDownloaderFactory.get(); rd.addInitialSources(null, name); rd.setSaveFile(null, name, false); rd.initIncompleteFile(incompleteFile, size); return rd; } @Override public BTDownloader createBTDownloader(TorrentParams params) throws IOException { BTDownloader bd = btDownloaderFactory.get(); bd.init(params); return bd; } @Override public BTTorrentFileDownloader createTorrentFileDownloader(URI torrentURI, boolean overwrite) { BTTorrentFileDownloader torrentFileDownloader = torrentFileDownloaderFactory.get(); torrentFileDownloader.initDownloadInformation(torrentURI, overwrite); return torrentFileDownloader; } @Override public CoreDownloader createFromMemento(DownloadMemento memento) throws InvalidDataException { try { Provider<? extends CoreDownloader> coreFactory = providerForMemento(memento); CoreDownloader downloader = coreFactory.get(); downloader.initFromMemento(memento); return downloader; } catch (Throwable t) { throw new InvalidDataException("invalid memento!", t); } } private Provider<? extends CoreDownloader> providerForMemento(DownloadMemento memento) throws InvalidDataException { switch (memento.getDownloadType()) { case BTDOWNLOADER: return btDownloaderFactory; case MAGNET: return magnetDownloaderFactory; case MANAGED: return managedDownloaderFactory; case INNETWORK: case STORE: case TORRENTFETCHER: case MOZILLA: default: throw new InvalidDataException("invalid memento type: " + memento.getDownloadType()); } } }