/*
* File : DownloadManager.java
* Created : 19-Oct-2003
* By : parg
*
* Azureus - a Java Bittorrent client
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details ( see the LICENSE file ).
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.gudy.azureus2.core3.download;
import java.io.File;
//import org.gudy.azureus2.core3.disk.DiskManager;
//import org.gudy.azureus2.core3.disk.DiskManagerFileInfo;
//import org.gudy.azureus2.core3.disk.DiskManagerFileInfoSet;
import org.gudy.azureus2.core3.global.GlobalManager;
//import org.gudy.azureus2.core3.peer.PEPeer;
//import org.gudy.azureus2.core3.peer.PEPeerManager;
//import org.gudy.azureus2.core3.peer.PEPiece;
import org.gudy.azureus2.core3.torrent.TOTorrent;
//import org.gudy.azureus2.core3.tracker.client.TRTrackerAnnouncer;
//import org.gudy.azureus2.core3.tracker.client.TRTrackerScraperResponse;
import org.gudy.azureus2.core3.util.IndentWriter;
import org.gudy.azureus2.plugins.download.DownloadAnnounceResult;
import org.gudy.azureus2.plugins.download.DownloadScrapeResult;
//import com.aelitis.azureus.core.networkmanager.LimitedRateGroup;
public interface
DownloadManager
{
public static final int STATE_START_OF_DAY = -1; // should never actually see this one
public static final int STATE_WAITING = 0;
public static final int STATE_INITIALIZING = 5;
public static final int STATE_INITIALIZED = 10;
public static final int STATE_ALLOCATING = 20;
public static final int STATE_CHECKING = 30;
// Ready: Resources allocated
public static final int STATE_READY = 40;
public static final int STATE_DOWNLOADING = 50;
public static final int STATE_FINISHING = 55;
public static final int STATE_SEEDING = 60;
public static final int STATE_STOPPING = 65;
// Stopped: can't be automatically started
public static final int STATE_STOPPED = 70;
public static final int STATE_CLOSED = 71; // download never *has* this state, just used to inform
// when stopping for az closedown
// Queued: Same as stopped, except can be automatically started
public static final int STATE_QUEUED = 75;
public static final int STATE_ERROR = 100;
public static final int WEALTH_STOPPED = 1;
public static final int WEALTH_NO_TRACKER = 2;
public static final int WEALTH_NO_REMOTE = 3;
public static final int WEALTH_OK = 4;
public static final int WEALTH_KO = 5;
public static final int WEALTH_ERROR = 6;
public void
initialize();
public int
getState();
/**
* For stopping this returns the target state after stopping (stopped/queued)
* @return
*/
public int
getSubState();
public void
setStateWaiting();
public void
setStateQueued();
public void
startDownload();
public boolean canForceRecheck();
public void forceRecheck();
// /**
// * @param l
// *
// * @since 3.0.0.7
// */
// void forceRecheck(ForceRecheckListener l);
//
// /**
// * Reset the file download state to totally undownloaded. Download must be stopped
// * @param file
// */
//
// public void
// resetFile(
// DiskManagerFileInfo file );
//
// /**
// * Recheck a particular file. Download must be stopped
// * @param file
// */
//
// public void
// recheckFile(
// DiskManagerFileInfo file );
/**
* Use with care - introduced to support speed tests whereby we want to avoid checking the
* virtual torrent used for the test
* @param enabled
*/
public void
setPieceCheckingEnabled(
boolean enabled );
/**
* Stop the download manager, and do any file/torrent removals.
* @param _stateAfterStopping
* @param remove_torrent remove the .torrent file after stopping
* @param remove_data remove the data file after stopping
*/
public void
stopIt(
int stateAfterStopping,
boolean remove_torrent,
boolean remove_data );
public boolean
pause();
public boolean
isPaused();
public void
resume();
public GlobalManager
getGlobalManager();
// public DiskManager
// getDiskManager();
//
// public DiskManagerFileInfo[]
// getDiskManagerFileInfo();
//
// public DiskManagerFileInfoSet getDiskManagerFileInfoSet();
//
// public PEPeerManager
// getPeerManager();
//
// public DownloadManagerState
// getDownloadState();
public TOTorrent
getTorrent();
// public TRTrackerAnnouncer
// getTrackerClient();
public void
requestTrackerAnnounce(
boolean immediate );
public void
requestTrackerScrape(
boolean immediate );
// public TRTrackerScraperResponse
// getTrackerScrapeResponse();
//
// public void
// setTrackerScrapeResponse(
// TRTrackerScraperResponse response );
public String
getDisplayName();
/**
* returns a name based on the torrent hash or an empty string if torrent invalid
* @return
*/
public String
getInternalName();
public long
getSize();
/**
* This includes the full path to the torrent file.
* @return
*/
public String
getTorrentFileName();
public void
setTorrentFileName(String string);
/**
* Returns the file location where we save the torrent, this includes the parent
* directory and the actual file name.
*/
public File
getAbsoluteSaveLocation();
public File
getSaveLocation();
/**
* changes the save directory. Only call this if you know what you are doing!!!!
* @param sPath
*/
public void
setTorrentSaveDir(
String sPath );
/**
* changes the save directory. Only call this if you know what you are doing!!!!
* @param sPath
*/
public void setTorrentSaveDir(String parent_dir, String dl_name);
public boolean isForceStart();
public void setForceStart(boolean forceStart);
public boolean
isPersistent();
/**
* Retrieves whether the download is complete
*
* @param bIncludingDND true- include files marked as Do Not Download.<BR>
* false- don't include files marked DND.<p>
* If there are DND files and you choose to include
* DND in the calculation, false will always be
* returned.
* @return whether download is complete
*/
public boolean
isDownloadComplete(boolean bIncludingDND);
public String
getTrackerStatus();
public int
getTrackerTime();
public String
getTorrentComment();
public String
getTorrentCreatedBy();
public long
getTorrentCreationDate();
public int
getNbPieces();
public String
getPieceLength();
public int
getNbSeeds();
public int
getNbPeers();
/**
* Same as filesExist( true );
* @deprecated Use {@link #filesExist(boolean)} - to be removed when EMP dependency removed
* @return
*/
public boolean
filesExist();
/**
* Checks if all the files the user wants to download from this torrent
* actually exist on their filesystem.
* <p>
* If a file does not exist, the download will be set to error state.
* @param expected_to_be_allocated if this is false and allocation <b>hasn't<b> been attempted then the method will return with false without marking the download as in an error state
* @return Whether all the non-skipped (non-DND) files exist
*/
public boolean
filesExist(
boolean expected_to_be_allocated );
public String
getErrorDetails();
// public DownloadManagerStats
// getStats();
public int
getPosition();
public void
setPosition(
int newPosition );
/**
* Retrieve whether this download is assumed complete.
* <p>
* Assumed complete status is kept while the torrent is in a non-running
* state, even if it has no data.
* <p>
* When the torrent starts up, the real complete
* level will be checked, and if the torrent
* actually does have missing data, the download will be thrown
* into error state.
* <p>
* Only a forced-recheck should clear this flag.
*
* @see {@link #requestAssumedCompleteMode()}
*/
public boolean
getAssumedComplete();
/**
* Will set this download to be "assumed complete" for if the download
* is already complete (excluding DND)
*
* @return true- success; false- failure, download not complete
*/
public boolean
requestAssumedCompleteMode();
/**
* @return the wealthy status of this download
*/
public int getHealthStatus();
/**
* See plugin ConnectionManager.NAT_ constants for return values
* @return
*/
public int
getNATStatus();
/**
* persist resume data
*
*/
public void
saveResumeData();
/**
* persist any general download related information, excluding resume data which is
* managed separately by saveResumeData
*/
public void
saveDownload();
/**
* To retreive arbitrary objects against this object.
* @deprecated Use getUserData */
public Object getData (String key);
/** To store arbitrary objects against this object.
* @deprecated @deprecated Use setUserData
* */
public void setData (String key, Object value);
public Object getUserData (Object key);
/** To store arbitrary objects against this object. */
public void setUserData (Object key, Object value);
/**
* Determine whether disk allocation has already been done.
* Used for checking if data is missing on a previously-loaded torrent.
* @return true if data files have already been allocated
*/
public boolean isDataAlreadyAllocated();
/**
* Set whether data allocation has already been done, so we know
* when to allocate and when to throw a missing-data error message.
* @param already_allocated
*/
public void setDataAlreadyAllocated( boolean already_allocated );
public void setSeedingRank(int rank);
public int getSeedingRank();
public void setMaxUploads( int max_slots );
public int getMaxUploads();
/**
* Returns the max uploads depending on whether the download is seeding and it has a separate
* rate for this
* @return
*/
public int
getEffectiveMaxUploads();
/**
* returns the currently in force upload speed limit which may vary from the stats. value
* as this gives the fixed per-torrent limit
* @return
*/
public int
getEffectiveUploadRateLimitBytesPerSecond();
public void
setCryptoLevel(
int level );
public int
getCryptoLevel();
/**
* Move data files to new location. Torrent must be in stopped/error state
* @param new_parent_dir
* @return
*/
public void
moveDataFiles(
File new_parent_dir )
throws DownloadManagerException;
/**
* Rename the download - this means the name of the file being downloaded (for single
* file torrents), or the name of the directory holding the files (in a multi-file torrent).
*
* This does not alter the displayed name of the download.
*
* @param new_name
* @throws DownloadManagerException
*/
public void renameDownload(String new_name) throws DownloadManagerException;
/**
* Move the files and rename a download in one go.
*
* For convenience - either argument can be null, but not both.
*
* @see #moveDataFiles(File)
* @see #renameDownload(String)
*/
public void moveDataFiles(File new_parent_dir, String new_name) throws DownloadManagerException;
/**
* Move torrent file to new location. Download must be stopped/error
* @param new_parent_dir
* @return
*/
public void
moveTorrentFile(
File new_parent_dir )
throws DownloadManagerException;
/**
* Returns <tt>true</tt> if the download is being saved to one of the default
* save directories.
*
* @since 2.5.0.2
*/
public boolean isInDefaultSaveDir();
/**
* gives the time this download was created (not the torrent but the download itself)
* @return
*/
public long
getCreationTime();
public void
setCreationTime(
long t );
public void
setAnnounceResult(
DownloadAnnounceResult result );
public void
setScrapeResult(
DownloadScrapeResult result );
public boolean
isUnauthorisedOnTracker();
public boolean
isTrackerError();
/**
* Is extended messaging enabled for this download (meaning AzMP and LTEP support).
* @return true if enabled, false if disabled
*/
public boolean isExtendedMessagingEnabled();
/**
* Enable or disable extended messaging messaging for this download.
* @param enable true to enabled, false to disabled
*
* @deprecated Want to get rid of this if possible.
*/
public void setAZMessagingEnabled( boolean enable );
/**
* Indicates that the download manager is no longer needed
* @param is_duplicate indicates whether this dm is being destroyed because it is a duplicate
*/
public void
destroy(
boolean is_duplicate );
public boolean
isDestroyed();
// public PEPiece[]
// getCurrentPieces();
//
// public PEPeer[]
// getCurrentPeers();
/**
* Gives the download an opportunity to schedule seeding mode piece rechecks if desired
* @return true if a piece has been rechecked
*/
public boolean
seedPieceRecheck();
// public void
// addRateLimiter(
// LimitedRateGroup group,
// boolean upload );
//
// public void
// removeRateLimiter(
// LimitedRateGroup group,
// boolean upload );
//
/**
* @param listener
* @param triggerStateChange
*
* @since 3.1.1.1
*/
public void
addListener(
DownloadManagerListener listener,
boolean triggerStateChange );
public void
addListener(
DownloadManagerListener listener );
public void
removeListener(
DownloadManagerListener listener );
// tracker listeners
// public void
// addTrackerListener(
// DownloadManagerTrackerListener listener );
//
// public void
// removeTrackerListener(
// DownloadManagerTrackerListener listener );
//
// // peer listeners
//
// public void
// addPeerListener(
// DownloadManagerPeerListener listener );
// public void
// addPeerListener(
// DownloadManagerPeerListener listener,
// boolean bDispatchForExisting );
//
// public void
// removePeerListener(
// DownloadManagerPeerListener listener );
//
// // piece listeners
//
// public void
// addPieceListener(
// DownloadManagerPieceListener listener );
//
// public void
// addPieceListener(
// DownloadManagerPieceListener listener,
// boolean bDispatchForExisting );
//
// public void
// removePieceListener(
// DownloadManagerPieceListener listener );
// disk listeners
// public void
// addDiskListener(
// DownloadManagerDiskListener listener );
//
// public void
// removeDiskListener(
// DownloadManagerDiskListener listener );
//
public int
getActivationCount();
//
// public void
// addActivationListener(
// DownloadManagerActivationListener listener );
//
// public void
// removeActivationListener(
// DownloadManagerActivationListener listener );
public void
generateEvidence(
IndentWriter writer );
// public int[] getStorageType(DiskManagerFileInfo[] infos);
/**
* @since 3.0.5.1
*/
public boolean canMoveDataFiles();
/**
* Renames the save file, torrent file and the displayed name.
*/
public void rename(String new_name) throws DownloadManagerException;
/**
* @since 3.0.5.1
*/
public void renameTorrent(String new_name) throws DownloadManagerException;
/**
* Same as renameTorrent, but appends numbers if torrent already exists
* @since 4.2.0.9
*/
public void renameTorrentSafe(String name) throws DownloadManagerException;
/**
* @since 3.0.5.1
*/
public void moveTorrentFile(File parent_dir, String new_name) throws DownloadManagerException;
/**
* Sets the torrent file name (will perform a move of the torrent file) -
* this shouldn't be used unless you know what you are doing (it requires
* the download to be stopped!) - it is safer to use moveTorrentFile instead.
*
* @since 3.0.5.3
*/
public void setTorrentFile(File new_parent_dir, String new_name) throws DownloadManagerException;
}