📄 opentorrentwindow.java
字号:
private TorrentInfo addTorrent(String sFileName,
final String sOriginatingLocation) {
TorrentInfo info = null;
TOTorrent torrent = null;
File torrentFile;
boolean bDeleteFileOnCancel = false;
// Make a copy if user wants that. We'll delete it when we cancel, if we
// actually made a copy.
try {
File fOriginal = new File(sFileName);
if (!fOriginal.isFile() || !fOriginal.exists()) {
Utils.execSWTThread(new AERunnable() {
public void runSupport() {
if (shell == null)
new MessageSlideShell(Display.getCurrent(), SWT.ICON_ERROR,
"OpenTorrentWindow.mb.openError", "", new String[] {
sOriginatingLocation,
"Not a File"
});
else
Utils.openMessageBox(shell, SWT.OK,
"OpenTorrentWindow.mb.openError", new String[] {
sOriginatingLocation,
"Not a File"
});
}
});
return null;
}
torrentFile = TorrentUtils.copyTorrentFileToSaveDir(fOriginal, true);
bDeleteFileOnCancel = !fOriginal.equals(torrentFile);
// TODO if the files are still equal, and it isn't in the save
// dir, we should copy it to a temp file in case something
// re-writes it. No need to copy a torrent coming from the
// downloader though..
} catch (IOException e1) {
// Use torrent in wherever it is and hope for the best
// XXX Should error instead?
torrentFile = new File(sFileName);
}
// Load up the torrent, see it it's real
try {
torrent = TorrentUtils.readFromFile(torrentFile, false);
} catch (final TOTorrentException e) {
Utils.execSWTThread(new AERunnable() {
public void runSupport() {
if (shell == null)
new MessageSlideShell(Display.getCurrent(), SWT.ICON_ERROR,
"OpenTorrentWindow.mb.openError", Debug.getStackTrace(e),
new String[] {
sOriginatingLocation,
e.getMessage()
});
else
Utils.openMessageBox(shell, SWT.OK,
"OpenTorrentWindow.mb.openError", new String[] {
sOriginatingLocation,
e.getMessage()
});
}
});
if (bDeleteFileOnCancel)
torrentFile.delete();
return null;
}
String sExistingName = null;
try {
HashWrapper hash = torrent.getHashWrapper();
if (hash != null) {
for (int i = 0; i < torrentList.size(); i++) {
try {
TorrentInfo existing = (TorrentInfo) torrentList.get(i);
if (existing.torrent.getHashWrapper().equals(hash)) {
//sExistingName = existing.sOriginatingLocation;
// Exit without warning when it already exists in list
if (bDeleteFileOnCancel)
torrentFile.delete();
return null;
}
} catch (Exception e) {
}
}
}
} catch (Exception e) {
}
if (sExistingName == null) {
// Check if torrent already exists in gm, and add if not
DownloadManager existingDownload = (gm == null) ? null
: gm.getDownloadManager(torrent);
if (existingDownload != null) {
sExistingName = existingDownload.getDisplayName();
}
}
if (sExistingName == null) {
info = new TorrentInfo(torrentFile.getAbsolutePath(), torrent,
bDeleteFileOnCancel);
info.sOriginatingLocation = sOriginatingLocation;
torrentList.add(info);
} else {
final String sfExistingName = sExistingName;
Utils.execSWTThread(new AERunnable() {
public void runSupport() {
if (shell == null)
new MessageSlideShell(Display.getCurrent(), SWT.ICON_ERROR,
"OpenTorrentWindow.mb.alreadyExists", null, new String[] {
sOriginatingLocation,
sfExistingName
});
else
Utils.openMessageBox(shell, SWT.OK,
"OpenTorrentWindow.mb.alreadyExists", new String[] {
sOriginatingLocation,
sfExistingName
});
}
});
if (bDeleteFileOnCancel)
torrentFile.delete();
}
return info;
}
/**
* Resize the columns of the tables to fit without horizontal scrollbar
*
* @param which bitwise field of which table to recalc
* Bit 0: torrents table
* Bit 1: Data Files Table
*/
private void resizeTables(int which) {
try {
TableColumn[] tcs;
if ((which & 1) > 0 && tableTorrents != null
&& !tableTorrents.isDisposed()) {
tcs = tableTorrents.getColumns();
int newSize = tableTorrents.getClientArea().width - 20;
int iLength = tcs.length;
if (Utils.LAST_TABLECOLUMN_EXPANDS) {
iLength--;
newSize -= ((Long) tcs[iLength].getData("Width")).intValue();
}
final int columnToExpand = 1;
for (int i = 0; i < iLength; i++)
if (i != columnToExpand)
newSize -= tcs[i].getWidth();
if (newSize > 10)
tcs[columnToExpand].setWidth(newSize);
}
// Adjust only first column
if ((which & 2) > 0 && dataFileTable != null
&& !dataFileTable.isDisposed()) {
tcs = dataFileTable.getColumns();
int newSize = dataFileTable.getClientArea().width - 20;
int iLength = tcs.length;
if (Utils.LAST_TABLECOLUMN_EXPANDS) {
iLength--;
newSize -= ((Long) tcs[iLength].getData("Width")).intValue();
}
final int columnToExpand = 0;
for (int i = 0; i < iLength; i++)
if (i != columnToExpand)
newSize -= tcs[i].getWidth();
if (newSize > 10)
tcs[columnToExpand].setWidth(newSize);
}
} catch (Exception e) {
// ignore
e.printStackTrace();
}
}
/**
* Open the torrents already added based on user choices
*
* @param sDataDir
*/
private void openTorrents() {
ArrayList addedTorrentsTop = new ArrayList();
for (int i = 0; i < torrentList.size(); i++) {
final TorrentInfo info = (TorrentInfo) torrentList.get(i);
try {
if (info.torrent == null)
continue;
int iStartMode = (info.iStartID == STARTMODE_STOPPED)
? DownloadManager.STATE_STOPPED : DownloadManager.STATE_QUEUED;
final TorrentFileInfo[] files = info.getFiles();
byte[] hash = null;
try {
hash = info.torrent.getHash();
} catch (TOTorrentException e1) {
}
DownloadManager dm = gm.addDownloadManager(info.sFileName, hash,
info.sDestDir, iStartMode, true,
info.iStartID == STARTMODE_SEEDING,
new DownloadManagerInitialisationAdapter() {
public void initialised(DownloadManager dm) {
DiskManagerFileInfo[] fileInfos = dm.getDiskManagerFileInfo();
for (int iIndex = 0; iIndex < fileInfos.length; iIndex++) {
DiskManagerFileInfo fileInfo = fileInfos[iIndex];
if (iIndex >= 0 && iIndex < files.length
&& files[iIndex].lSize == fileInfo.getLength()) {
File fDest;
if (files[iIndex].sDestFileName != null) {
fDest = new File(files[iIndex].sDestFileName);
// Can't use fileInfo.setLink(fDest) as it renames
// the existing file if there is one
dm.getDownloadState().setFileLink(
fileInfo.getFile(false), fDest);
} else {
fDest = new File(info.sDestDir,
files[iIndex].sFullFileName);
}
if (!files[iIndex].bDownload) {
fileInfo.setSkipped(true);
if (!fDest.exists()) {
fileInfo.setStorageType(DiskManagerFileInfo.ST_COMPACT);
}
}
}
}
}
});
// If dm is null, most likely there was an error printed.. let's hope
// the user was notified and skip the error quietly.
// We don't have to worry about deleting the file (info.bDelete..)
// since gm.addDown.. will handle it.
if (dm == null)
continue;
if (info.iQueueLocation == QUEUELOCATION_TOP)
addedTorrentsTop.add(dm);
if (iStartMode == STARTMODE_FORCESTARTED)
dm.setForceStart(true);
} catch (Exception e) {
if (shell == null)
new MessageSlideShell(Display.getCurrent(), SWT.ICON_ERROR,
"OpenTorrentWindow.mb.openError", Debug.getStackTrace(e),
new String[] {
info.sOriginatingLocation,
e.getMessage()
});
else
Utils.openMessageBox(shell, SWT.OK, "OpenTorrentWindow.mb.openError",
new String[] {
info.sOriginatingLocation,
e.getMessage()
});
}
}
if (addedTorrentsTop.size() > 0) {
DownloadManager[] dms = (DownloadManager[]) addedTorrentsTop.toArray(new DownloadManager[0]);
gm.moveTop(dms);
}
torrentList.clear();
}
private int getDefaultStartMode() {
if (bDefaultForSeeding)
return STARTMODE_SEEDING;
return (bOverrideStartModeToStopped || COConfigurationManager.getBooleanParameter("Default Start Torrents Stopped"))
? STARTMODE_STOPPED : STARTMODE_QUEUED;
}
// TorrentDownloaderCallBackInterface
public void TorrentDownloaderEvent(int state, final TorrentDownloader inf) {
// This method is run even if the window is closed.
if (!inf.getDeleteFileOnCancel()
&& (state == TorrentDownloader.STATE_CANCELLED
|| state == TorrentDownloader.STATE_ERROR
|| state == TorrentDownloader.STATE_DUPLICATE || state == TorrentDownloader.STATE_FINISHED)) {
if (!downloaders.contains(inf))
return;
downloaders.remove(inf);
File file = inf.getFile();
String html = null;
if (file.exists()) {
try {
html = FileUtil.readFileAsString(file, 16384);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
file.delete();
}
MessageBoxShell boxShell = new MessageBoxShell(shellForChildren,
MessageText.getString("OpenTorrentWindow.mb.notTorrent.title"),
MessageText.getString("OpenTorrentWindow.mb.notTorrent.text",
new String[] {
inf.getURL(),
""
}), new String[] { MessageText.getString("Button.ok")
}, 0);
boxShell.setHtml(html);
boxShell.open();
return;
}
if (state == TorrentDownloader.STATE_INIT) {
downloaders.add(inf);
} else if (state == TorrentDownloader.STATE_FINISHED) {
// This can be called more than once for each inf..
if (!downloaders.contains(inf))
return;
downloaders.remove(inf);
File file = inf.getFile();
if (addTorrent(file.getAbsolutePath(), inf.getURL()) == null) {
// addTorrent may not delete it on error if the downloader saved it
// to the place where user wants to store torrents (which is most
// likely)
if (file.exists())
file.delete();
} else {
if (shell != null && !shell.isDisposed()) {
Utils.execSWTThread(new AERunnable() {
public void runSupport() {
tableTorrents.setItemCount(torrentList.size());
tableTorrents.clearAll();
// select the one we just added
tableTorrents.select(torrentList.size() - 1);
// select doesn't notify listeners? Do it manually.
tableTorrents.notifyListeners(SWT.Selection, new Event());
resizeTables(1);
}
});
} else {
String saveSilentlyDir = getSaveSilentlyDir();
if (saveSilentlyDir != null) {
sDestDir = saveSilentlyDir;
for (int i = 0; i < torrentList.size(); i++) {
final TorrentInfo info = (TorrentInfo) torrentList.get(i);
info.renameDuplicates();
}
openTorrents();
}
}
}
} else if (state == TorrentDownloader.STATE_CANCELLED
|| state == TorrentDownloader.STATE_ERROR
|| state == TorrentDownloader.STATE_DUPLICATE) {
downloaders.remove(inf);
} else if (state == TorrentDownloader.STATE_DOWNLOADING) {
int count = inf.getLastReadCount();
int numRead = inf.getTotalRead();
if (!inf.getDeleteFileOnCancel() && numRead >= 16384) {
inf.cancel();
} else if (numRead == count && count > 0) {
final byte[] bytes = inf.getLastReadBytes();
if (bytes[0] != 'd') {
inf.setDeleteFileOnCancel(false);
}
}
} else {
return;
}
checkSeedingMode();
}
/**
* Class to store one Torrent file's info. Used to populate table and store
* user's choices.
*/
private class TorrentInfo
{
/** Where the torrent came from. Could be a file, URL, or some other text */
String sOriginatingLocation;
/** Filename the .torrent is saved to */
String sFileName;
String sDestDir;
TOTorrent torrent;
int iStartID;
int iQueueLocation;
boolean isValid;
boolean bDeleteFileOnCancel;
private TorrentFileInfo[] files = null;
/**
* Init
*
* @param sFileName
* @param torrent
* @param bDeleteFileOnCancel
*/
public TorrentInfo(String sFileName, TOTorrent torrent,
boolean bDeleteFileO
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -