package com.limegroup.gnutella.downloader;
import java.io.File;
import java.io.Serializable;
import java.io.IOException;
import com.limegroup.gnutella.FileManager;
import com.limegroup.gnutella.SaveLocationException;
import com.limegroup.gnutella.RemoteFileDesc;
import com.limegroup.gnutella.DownloadCallback;
import com.limegroup.gnutella.DownloadManager;
import com.limegroup.gnutella.FileManager;
import com.limegroup.gnutella.RouterService;
import com.limegroup.gnutella.messages.QueryRequest;
import com.limegroup.gnutella.URN;
import com.limegroup.gnutella.version.DownloadInformation;
/**
* A downloader that works in the background, using the network to continue itself.
*/
public class InNetworkDownloader extends ManagedDownloader implements Serializable {
/** Ensures backwards compatibility of the downloads.dat file. */
static final long serialVersionUID = 5713913674943019353L;
/** The size of the completed file. */
private final long size;
/** The URN to persist throughout sessions, even if no RFDs are remembered. */
private final URN urn;
/** The TigerTree root for this download. */
private final String ttRoot;
/** The number of times we have attempted this download */
private int downloadAttempts;
/** The time we created this download */
private final long startTime;
/**
* Constructs a new downloader that's gonna work off the network.
*/
public InNetworkDownloader(IncompleteFileManager incompleteFileManager,
DownloadInformation info,
File dir,
long startTime) throws SaveLocationException {
super( new RemoteFileDesc[0], incompleteFileManager,
null, dir, info.getUpdateFileName(), true);
if(info.getSize() > Integer.MAX_VALUE)
throw new IllegalArgumentException("size too big for now.");
this.size = info.getSize();
this.urn = info.getUpdateURN();
this.ttRoot = info.getTTRoot();
this.startTime = startTime;
}
/**
* Overriden to use a different incomplete directory.
*/
protected File getIncompleteFile(IncompleteFileManager ifm, String name,
URN urn, int length) throws IOException {
return ifm.getFile(name, urn, length, new File(FileManager.PREFERENCE_SHARE, "Incomplete"));
}
/**
* Gets a new SourceRanker, using only LegacyRanker (not PingRanker).
*/
protected SourceRanker getSourceRanker(SourceRanker oldRanker) {
if(oldRanker != null)
return oldRanker;
else
return new LegacyRanker();
}
/**
* Overriden to ensure that the 'downloadSHA1' variable is set & we're listening
* for alternate locations.
*/
public void initialize(DownloadManager manager, FileManager fileManager,
DownloadCallback callback) {
super.initialize(manager, fileManager, callback);
if(downloadSHA1 == null) {
downloadSHA1 = urn;
RouterService.getAltlocManager().addListener(downloadSHA1,this);
}
}
public synchronized void startDownload() {
downloadAttempts++;
super.startDownload();
}
protected boolean shouldValidate(boolean deserialized) {
return false;
}
/**
* Ensures that the VerifyingFile knows what TTRoot we're expecting.
*/
protected void initializeVerifyingFile() throws IOException {
super.initializeVerifyingFile();
if(commonOutFile != null) {
commonOutFile.setExpectedHashTreeRoot(ttRoot);
}
}
/**
* Overrides ManagedDownloader to display a reasonable file size even
* when no locations have been found.
*/
public synchronized long getContentLength() {
return size;
}
/**
* Sends a targetted query for this.
*/
protected synchronized QueryRequest newRequery(int numRequeries)
throws CantResumeException {
QueryRequest qr = super.newRequery(numRequeries);
qr.setTTL((byte)2);
return qr;
}
/**
* @return how many times was this download attempted
*/
public synchronized int getNumAttempts() {
return downloadAttempts;
}
public long getStartTime() {
return startTime;
}
}