/*
* Created on 9 Jul 2007
* Created by Allan Crooks
* Copyright (C) 2007 Aelitis, All Rights Reserved.
*
* 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, or (at your option) any later version.
* 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.
* 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.
*
* AELITIS, SAS au capital de 46,603.30 euros
* 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France.
*/
package org.gudy.azureus2.ui.swt;
import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
import java.net.URLEncoder;
import java.util.Arrays;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.*;
import org.gudy.azureus2.core3.category.Category;
import org.gudy.azureus2.core3.category.CategoryManager;
import org.gudy.azureus2.core3.config.COConfigurationManager;
import org.gudy.azureus2.core3.download.DownloadManager;
import org.gudy.azureus2.core3.download.DownloadManagerState;
import org.gudy.azureus2.core3.internat.MessageText;
import org.gudy.azureus2.core3.logging.LogAlert;
import org.gudy.azureus2.core3.logging.Logger;
import org.gudy.azureus2.core3.peer.PEPeerManager;
import org.gudy.azureus2.core3.peer.PEPeerSource;
import org.gudy.azureus2.core3.torrent.TOTorrent;
import org.gudy.azureus2.core3.torrent.TOTorrentFactory;
import org.gudy.azureus2.core3.tracker.client.TRTrackerAnnouncer;
import org.gudy.azureus2.core3.tracker.util.TRTrackerUtils;
import org.gudy.azureus2.core3.util.*;
import org.gudy.azureus2.ui.swt.exporttorrent.wizard.ExportTorrentWizard;
import org.gudy.azureus2.ui.swt.mainwindow.ClipboardCopy;
import org.gudy.azureus2.ui.swt.mainwindow.TorrentOpener;
import org.gudy.azureus2.ui.swt.maketorrent.MultiTrackerEditor;
import org.gudy.azureus2.ui.swt.maketorrent.TrackerEditorListener;
import org.gudy.azureus2.ui.swt.minibar.DownloadBar;
import org.gudy.azureus2.ui.swt.shells.InputShell;
import org.gudy.azureus2.ui.swt.shells.MessageBoxShell;
import org.gudy.azureus2.ui.swt.views.ViewUtils;
import org.gudy.azureus2.ui.swt.views.table.TableViewSWT;
import org.gudy.azureus2.ui.swt.views.utils.ManagerUtils;
import com.aelitis.azureus.core.AzureusCore;
import com.aelitis.azureus.core.AzureusCoreFactory;
import com.aelitis.azureus.ui.UIFunctions;
import com.aelitis.azureus.ui.UIFunctionsManager;
import com.aelitis.azureus.ui.common.table.TableColumnCore;
import com.aelitis.azureus.ui.common.table.TableView;
/**
* @author Allan Crooks
*
*/
public class TorrentUtil {
// selected_dl_types -> 0 (determine that automatically), +1 (downloading), +2 (seeding), +3 (mixed - not used by anything yet)
public static void fillTorrentMenu(final Menu menu,
final DownloadManager[] dms, final AzureusCore azureus_core,
final Composite composite, boolean include_show_details,
int selected_dl_types, final TableView tv) {
final boolean isSeedingView;
switch (selected_dl_types) {
case 1:
isSeedingView = false;
break;
case 2:
isSeedingView = true;
break;
case 0: {
if (dms.length == 1) {
isSeedingView = dms[0].isDownloadComplete(false);
break;
}
}
default:
// I was going to raise an error, but let's not be too hasty. :)
isSeedingView = false;
}
boolean hasSelection = (dms.length > 0);
boolean isTrackerOn = TRTrackerUtils.isTrackerEnabled();
int userMode = COConfigurationManager.getIntParameter("User Mode");
// Enable/Disable Logic
boolean bChangeDir = hasSelection;
boolean start, stop, changeUrl, barsOpened, forceStart;
boolean forceStartEnabled, recheck, manualUpdate, fileMove, fileRescan;
changeUrl = barsOpened = manualUpdate = fileMove = fileRescan = true;
forceStart = forceStartEnabled = recheck = start = stop = false;
boolean canSetSuperSeed = false;
boolean superSeedAllYes = true;
boolean superSeedAllNo = true;
boolean upSpeedDisabled = false;
long totalUpSpeed = 0;
boolean upSpeedUnlimited = false;
long upSpeedSetMax = 0;
boolean downSpeedDisabled = false;
long totalDownSpeed = 0;
boolean downSpeedUnlimited = false;
long downSpeedSetMax = 0;
boolean allScanSelected = true;
boolean allScanNotSelected = true;
boolean allStopped = true;
if (hasSelection) {
for (int i = 0; i < dms.length; i++) {
DownloadManager dm = (DownloadManager) dms[i];
try {
int maxul = dm.getStats().getUploadRateLimitBytesPerSecond();
if (maxul == 0) {
upSpeedUnlimited = true;
}
else {
if (maxul > upSpeedSetMax) {
upSpeedSetMax = maxul;
}
}
if (maxul == -1) {
maxul = 0;
upSpeedDisabled = true;
}
totalUpSpeed += maxul;
int maxdl = dm.getStats().getDownloadRateLimitBytesPerSecond();
if (maxdl == 0) {
downSpeedUnlimited = true;
}
else {
if (maxdl > downSpeedSetMax) {
downSpeedSetMax = maxdl;
}
}
if (maxdl == -1) {
maxdl = 0;
downSpeedDisabled = true;
}
totalDownSpeed += maxdl;
}
catch (Exception ex) {
Debug.printStackTrace(ex);
}
if (dm.getTrackerClient() == null) {
changeUrl = false;
}
if (barsOpened && !DownloadBar.getManager().isOpen(dm)) {
barsOpened = false;
}
stop = stop || ManagerUtils.isStopable(dm);
start = start || ManagerUtils.isStartable(dm);
recheck = recheck || dm.canForceRecheck();
forceStartEnabled = forceStartEnabled || ManagerUtils.isForceStartable(dm);
forceStart = forceStart || dm.isForceStart();
boolean stopped = ManagerUtils.isStopped(dm);
allStopped &= stopped;
fileMove = fileMove && stopped && dm.isPersistent();
if (userMode > 1) {
TRTrackerAnnouncer trackerClient = dm.getTrackerClient();
if (trackerClient != null) {
boolean update_state = ((SystemTime.getCurrentTime() / 1000 - trackerClient.getLastUpdateTime() >= TRTrackerAnnouncer.REFRESH_MINIMUM_SECS));
manualUpdate = manualUpdate & update_state;
}
}
int state = dm.getState();
bChangeDir &= (state == DownloadManager.STATE_ERROR || state == DownloadManager.STATE_STOPPED || state == DownloadManager.STATE_QUEUED)
&& dm.isDownloadComplete(false);
/**
* Only perform a test on disk if:
* 1) We are currently set to allow the "Change Data Directory" option, and
* 2) We've only got one item selected - otherwise, we may potentially end up checking massive
* amounts of files across multiple torrents before we generate a menu.
*/
if (bChangeDir && dms.length == 1) {
bChangeDir = !dm.filesExist();
}
boolean scan = dm.getDownloadState().getFlag(DownloadManagerState.FLAG_SCAN_INCOMPLETE_PIECES);
// include DND files in incomplete stat, since a recheck may
// find those files have been completed
boolean incomplete = !dm.isDownloadComplete(true);
allScanSelected = incomplete && allScanSelected && scan;
allScanNotSelected = incomplete && allScanNotSelected && !scan;
PEPeerManager pm = dm.getPeerManager();
if (pm != null) {
if (pm.canToggleSuperSeedMode()) {
canSetSuperSeed = true;
}
if (pm.isSuperSeedMode()) {
superSeedAllYes = false;
}
else {
superSeedAllNo = false;
}
}
else {
superSeedAllYes = false;
superSeedAllNo = false;
}
}
fileRescan = allScanSelected || allScanNotSelected;
}
else { // empty right-click
barsOpened = false;
forceStart = false;
forceStartEnabled = false;
start = false;
stop = false;
fileMove = false;
fileRescan = false;
upSpeedDisabled = true;
downSpeedDisabled = true;
changeUrl = false;
recheck = false;
manualUpdate = false;
}
// === Root Menu ===
if (bChangeDir) {
MenuItem menuItemChangeDir = new MenuItem(menu, SWT.PUSH);
Messages.setLanguageText(menuItemChangeDir, "MyTorrentsView.menu.changeDirectory");
menuItemChangeDir.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
changeDirSelectedTorrents(dms, composite.getShell());
}
});
}
// Open Details
if (include_show_details) {
final MenuItem itemDetails = new MenuItem(menu, SWT.PUSH);
Messages.setLanguageText(itemDetails, "MyTorrentsView.menu.showdetails");
menu.setDefaultItem(itemDetails);
Utils.setMenuItemImage(itemDetails, "details");
itemDetails.addListener(SWT.Selection, new DMTask(dms) {
public void run(DownloadManager dm) {
UIFunctions uiFunctions = UIFunctionsManager.getUIFunctions();
if (uiFunctions != null) {
uiFunctions.openManagerView(dm);
}
}
});
itemDetails.setEnabled(hasSelection);
}
// Open Bar
final MenuItem itemBar = new MenuItem(menu, SWT.CHECK);
Messages.setLanguageText(itemBar, "MyTorrentsView.menu.showdownloadbar");
Utils.setMenuItemImage(itemBar, "downloadBar");
itemBar.addListener(SWT.Selection, new DMTask(dms) {
public void run(DownloadManager dm) {
if (DownloadBar.getManager().isOpen(dm)) {
DownloadBar.close(dm);
}
else {
DownloadBar.open(dm, menu.getShell());
}
} // run
});
itemBar.setEnabled(hasSelection);
itemBar.setSelection(barsOpened);
// ---
new MenuItem(menu, SWT.SEPARATOR);
// Run Data File
final MenuItem itemOpen = new MenuItem(menu, SWT.PUSH);
Messages.setLanguageText(itemOpen, "MyTorrentsView.menu.open");
Utils.setMenuItemImage(itemOpen, "run");
itemOpen.addListener(SWT.Selection, new DMTask(dms) {
public void run(DownloadManager[] dms) {
runTorrents(dms);
}
});
itemOpen.setEnabled(hasSelection);
// Explore (or open containing folder)
final boolean use_open_containing_folder = COConfigurationManager.getBooleanParameter("MyTorrentsView.menu.show_parent_folder_enabled");
final MenuItem itemExplore = new MenuItem(menu, SWT.PUSH);
Messages.setLanguageText(itemExplore, "MyTorrentsView.menu." + (use_open_containing_folder ? "open_parent_folder" : "explore"));
itemExplore.addListener(SWT.Selection, new DMTask(dms, false) {
public void run(DownloadManager dm) {
ManagerUtils.open(dm, use_open_containing_folder);
}
});
itemExplore.setEnabled(hasSelection);
// === advanced menu ===
final MenuItem itemAdvanced = new MenuItem(menu, SWT.CASCADE);
Messages.setLanguageText(itemAdvanced, "MyTorrentsView.menu.advancedmenu"); //$NON-NLS-1$
itemAdvanced.setEnabled(hasSelection);
final Menu menuAdvanced = new Menu(menu.getShell(), SWT.DROP_DOWN);
itemAdvanced.setMenu(menuAdvanced);
// advanced > Download Speed Menu //
long maxDownload = COConfigurationManager.getIntParameter("Max Download Speed KBs", 0) * 1024;
long maxUpload = COConfigurationManager.getIntParameter("Max Upload Speed KBs", 0) * 1024;
ViewUtils.addSpeedMenu(menu.getShell(), menuAdvanced, true, hasSelection, downSpeedDisabled, downSpeedUnlimited,
totalDownSpeed, downSpeedSetMax, maxDownload, upSpeedDisabled, upSpeedUnlimited, totalUpSpeed,
upSpeedSetMax, maxUpload, dms.length, new ViewUtils.SpeedAdapter() {
public void setDownSpeed(final int speed) {
DMTask task = new DMTask(dms) {
public void run(DownloadManager dm) {
dm.getStats().setDownloadRateLimitBytesPerSecond(speed);
}
};
task.go();
}
public void setUpSpeed(final int speed) {
DMTask task = new DMTask(dms) {
public void run(DownloadManager dm) {
dm.getStats().setUploadRateLimitBytesPerSecond(speed);
}
};
task.go();
}
});
// advanced > Tracker Menu //
final Menu menuTracker = new Menu(menu.getShell(), SWT.DROP_DOWN);
final MenuItem itemTracker = new MenuItem(menuAdvanced, SWT.CASCADE);
Messages.setLanguageText(itemTracker, "MyTorrentsView.menu.tracker");
itemTracker.setMenu(menuTracker);
final MenuItem itemChangeTracker = new MenuItem(menuTracker, SWT.PUSH);
Messages.setLanguageText(itemChangeTracker, "MyTorrentsView.menu.changeTracker"); //$NON-NLS-1$
Utils.setMenuItemImage(itemChangeTracker, "add_tracker");
itemChangeTracker.addListener(SWT.Selection, new DMTask(dms) {
public void run(DownloadManager dm) {
TRTrackerAnnouncer tc = dm.getTrackerClient();
if (tc != null) new TrackerChangerWindow(composite.getDisplay(), tc);
}
});
itemChangeTracker.setEnabled(changeUrl);
final MenuItem itemEditTracker = new MenuItem(menuTracker, SWT.PUSH);
Messages.setLanguageText(itemEditTracker, "MyTorrentsView.menu.editTracker");
Utils.setMenuItemImage(itemEditTracker, "edit_trackers");
itemEditTracker.addListener(SWT.Selection, new DMTask(dms) {
public void run(final DownloadManager dm) {
if (dm.getTorrent() != null) {
final TOTorrent torrent = dm.getTorrent();
java.util.List group = TorrentUtils.announceGroupsToList(torrent);
new MultiTrackerEditor(null, group, new TrackerEditorListener() {
public void trackersChanged(String str, String str2, java.util.List group) {
TorrentUtils.listToAnnounceGroups(group, torrent);
try {
TorrentUtils.writeToFile(torrent);
}
catch (Throwable e) {
Debug.printStackTrace(e);
}
if (dm.getTrackerClient() != null) dm.getTrackerClient().resetTrackerUrl(true);
}
}, true);
}
} // run
});
itemEditTracker.setEnabled(hasSelection);
final MenuItem itemManualUpdate = new MenuItem(menuTracker, SWT.PUSH);
Messages.setLanguageText(itemManualUpdate, "GeneralView.label.trackerurlupdate"); //$NON-NLS-1$
//itemManualUpdate.setImage(ImageRepository.getImage("edit_trackers"));
itemManualUpdate.addListener(SWT.Selection, new DMTask(dms) {
public void run(DownloadManager dm) {
dm.requestTrackerAnnounce(false);
}
});
itemManualUpdate.setEnabled(manualUpdate);
boolean scrape_enabled = COConfigurationManager.getBooleanParameter("Tracker Client Scrape Enable");
boolean scrape_stopped = COConfigurationManager.getBooleanParameter("Tracker Client Scrape Stopped Enable");
boolean manualScrape = (!scrape_enabled) || ((!scrape_stopped) && allStopped);
final MenuItem itemManualScrape = new MenuItem(menuTracker, SWT.PUSH);
Messages.setLanguageText(itemManualScrape, "GeneralView.label.trackerscrapeupdate");
//itemManualUpdate.setImage(ImageRepository.getImage("edit_trackers"));
itemManualScrape.addListener(SWT.Selection, new DMTask(dms) {
public void run(DownloadManager dm) {
dm.requestTrackerScrape(true);
}
});
itemManualScrape.setEnabled(manualScrape);
// advanced > files
final MenuItem itemFiles = new MenuItem(menuAdvanced, SWT.CASCADE);
Messages.setLanguageText(itemFiles, "ConfigView.section.files");
final Menu menuFiles = new Menu(composite.getShell(), SWT.DROP_DOWN);
itemFiles.setMenu(menuFiles);
final MenuItem itemFileMoveData = new MenuItem(menuFiles, SWT.PUSH);
Messages.setLanguageText(itemFileMoveData, "MyTorrentsView.menu.movedata");
itemFileMoveData.addListener(SWT.Selection, new DMTask(dms) {
public void run(DownloadManager[] dms) {
if (dms != null && dms.length > 0) {
DirectoryDialog dd = new DirectoryDialog(composite.getShell());
dd.setFilterPath(TorrentOpener.getFilterPathData());
dd.setText(MessageText.getString("MyTorrentsView.menu.movedata.dialog"));
String path = dd.open();
if (path != null) {
TorrentOpener.setFilterPathData(path);
File target = new File(path);
for (int i = 0; i < dms.length; i++) {
try {
dms[i].moveDataFiles(target);
}
catch (Throwable e) {
Logger.log(new LogAlert(dms[i], LogAlert.REPEATABLE,
"Download data move operation failed", e));
}
}
}
}
}
});
itemFileMoveData.setEnabled(fileMove);
final MenuItem itemFileMoveTorrent = new MenuItem(menuFiles, SWT.PUSH);
Messages.setLanguageText(itemFileMoveTorrent, "MyTorrentsView.menu.movetorrent");
itemFileMoveTorrent.addListener(SWT.Selection, new DMTask(dms) {
public void run(DownloadManager[] dms) {
if (dms != null && dms.length > 0) {
DirectoryDialog dd = new DirectoryDialog(composite.getShell());
dd.setFilterPath(TorrentOpener.getFilterPathTorrent());
dd.setText(MessageText.getString("MyTorrentsView.menu.movedata.dialog"));
String path = dd.open();
if (path != null) {
File target = new File(path);
TorrentOpener.setFilterPathTorrent(target.toString());
for (int i = 0; i < dms.length; i++) {
try {
dms[i].moveTorrentFile(target);
}
catch (Throwable e) {
Logger.log(new LogAlert(dms[i], LogAlert.REPEATABLE,
"Download torrent move operation failed", e));
}
}
}
}
}
});
itemFileMoveTorrent.setEnabled(fileMove);
final MenuItem itemCheckFilesExist = new MenuItem(menuFiles, SWT.PUSH);
Messages.setLanguageText(itemCheckFilesExist, "MyTorrentsView.menu.checkfilesexist");
itemCheckFilesExist.addListener(SWT.Selection, new DMTask(dms) {
public void run(DownloadManager dm) {
dm.filesExist();
}
});
final MenuItem itemFileRescan = new MenuItem(menuFiles, SWT.CHECK);
Messages.setLanguageText(itemFileRescan, "MyTorrentsView.menu.rescanfile");
itemFileRescan.addListener(SWT.Selection, new DMTask(dms) {
public void run(DownloadManager dm) {
dm.getDownloadState().setFlag(DownloadManagerState.FLAG_SCAN_INCOMPLETE_PIECES,
itemFileRescan.getSelection());
}
});
itemFileRescan.setSelection(allScanSelected);
itemFileRescan.setEnabled(fileRescan);
MenuItem itemFileClearResume = new MenuItem(menuFiles, SWT.PUSH);
Messages.setLanguageText(itemFileClearResume, "MyTorrentsView.menu.clear_resume_data");
itemFileClearResume.addListener(SWT.Selection, new DMTask(dms) {
public void run(DownloadManager dm) {
dm.getDownloadState().clearResumeData();
}
});
itemFileClearResume.setEnabled(allStopped);
// === advanced > export ===
// =========================
if (userMode > 0) {
final MenuItem itemExport = new MenuItem(menuAdvanced, SWT.CASCADE);
Messages.setLanguageText(itemExport, "MyTorrentsView.menu.exportmenu"); //$NON-NLS-1$
Utils.setMenuItemImage(itemExport, "export");
itemExport.setEnabled(hasSelection);
final Menu menuExport = new Menu(composite.getShell(), SWT.DROP_DOWN);
itemExport.setMenu(menuExport);
// Advanced > Export > Export XML
final MenuItem itemExportXML = new MenuItem(menuExport, SWT.PUSH);
Messages.setLanguageText(itemExportXML, "MyTorrentsView.menu.export");
itemExportXML.addListener(SWT.Selection, new DMTask(dms) {
public void run(DownloadManager[] dms) {
DownloadManager dm = dms[0]; // First only.
if (dm != null) new ExportTorrentWizard(azureus_core, itemExportXML.getDisplay(), dm);
}
});
// Advanced > Export > Export Torrent
final MenuItem itemExportTorrent = new MenuItem(menuExport, SWT.PUSH);
Messages.setLanguageText(itemExportTorrent, "MyTorrentsView.menu.exporttorrent");
itemExportTorrent.addListener(SWT.Selection, new DMTask(dms) {
public void run(DownloadManager[] dms) {
// FileDialog for single download
// DirectoryDialog for multiple.
File[] destinations = new File[dms.length];
if (dms.length == 1) {
FileDialog fd = new FileDialog(composite.getShell(), SWT.SAVE);
fd.setFileName(dms[0].getTorrentFileName());
String path = fd.open();
if (path == null) {return;}
destinations[0] = new File(path);
}
else {
DirectoryDialog dd = new DirectoryDialog(composite.getShell(), SWT.SAVE);
String path = dd.open();
if (path == null) {return;}
for (int i=0; i<dms.length; i++) {
destinations[i] = new File(path, new File(dms[i].getTorrentFileName()).getName());
}
}
int i=0;
try {
for (; i<dms.length; i++) {
File target = destinations[i];
if (target.exists()) {
MessageBox mb = new MessageBox(composite.getShell(), SWT.ICON_QUESTION | SWT.YES | SWT.NO);
mb.setText(MessageText.getString("exportTorrentWizard.process.outputfileexists.title"));
mb.setMessage(MessageText.getString("exportTorrentWizard.process.outputfileexists.message") + "\n" + destinations[i].getName());
int result = mb.open();
if (result == SWT.NO) {return;}
if (!target.delete()) {
throw (new Exception("Failed to delete file"));
}
} // end deal with clashing torrent
// first copy the torrent - DON'T use "writeTorrent" as this amends the
// "filename" field in the torrent
TorrentUtils.copyToFile(dms[i].getDownloadState().getTorrent(), target);
// now remove the non-standard entries
TOTorrent dest = TOTorrentFactory.deserialiseFromBEncodedFile(target);
dest.removeAdditionalProperties();
dest.serialiseToBEncodedFile(target);
} // end for
} // end try
catch (Throwable e) {
Logger.log(new LogAlert(dms[i], LogAlert.UNREPEATABLE, "Torrent export failed", e));
}
} // end run()
}); // end DMTask
// Advanced > Export > WebSeed URL
final MenuItem itemWebSeed = new MenuItem(menuExport, SWT.PUSH);
Messages.setLanguageText(itemWebSeed, "MyTorrentsView.menu.exporthttpseeds");
itemWebSeed.addListener(SWT.Selection, new DMTask(dms) {
public void run(DownloadManager[] dms) {
final String NL = "\r\n";
String data = "";
boolean http_enable = COConfigurationManager.getBooleanParameter( "HTTP.Data.Listen.Port.Enable" );
String port;
if ( http_enable ){
int p = COConfigurationManager.getIntParameter( "HTTP.Data.Listen.Port" );
int o = COConfigurationManager.getIntParameter( "HTTP.Data.Listen.Port.Override" );
if ( o == 0 ){
port = String.valueOf( p );
}else{
port = String.valueOf( o );
}
}else{
data = "You need to enable the HTTP port or modify the URL(s) appropriately" + NL + NL;
port = "<port>";
}
String ip = COConfigurationManager.getStringParameter( "Tracker IP", "" );
if ( ip.length() == 0 ){
data += "You might need to modify the host address in the URL(s)" + NL + NL;
try{
InetAddress ia = AzureusCoreFactory.getSingleton().getInstanceManager().getMyInstance().getExternalAddress();
if ( ia != null ){
ip = IPToHostNameResolver.syncResolve( ia.getHostAddress(), 10000 );
}
}catch( Throwable e ){
}
if ( ip.length() == 0 ){
ip = "<host>";
}
}
String base = "http://" + UrlUtils.convertIPV6Host(ip) + ":" + port + "/";
for (int i=0;i<dms.length;i++){
DownloadManager dm = dms[i];
if ( dm == null ){
continue;
}
TOTorrent torrent = dm.getTorrent();
if ( torrent == null ){
continue;
}
data += base + "webseed" + NL;
try{
data += base + "files/" + URLEncoder.encode( new String( torrent.getHash(), "ISO-8859-1"), "ISO-8859-1" ) + "/" + NL + NL;
}catch( Throwable e ){
}
}
if ( data.length() > 0){
ClipboardCopy.copyToClipBoard( data );
}
}
});
} // export menu
// === advanced > options ===
// ===========================
if (userMode > 0) {
final MenuItem itemExportXML = new MenuItem(menuAdvanced, SWT.PUSH);
Messages.setLanguageText(itemExportXML, "MainWindow.menu.view.configuration");
itemExportXML.addListener(SWT.Selection, new DMTask(dms) {
public void run(DownloadManager[] dms) {
UIFunctions uiFunctions = UIFunctionsManager.getUIFunctions();
uiFunctions.showMultiOptionsView( dms );
}
});
}
// === advanced > peer sources ===
// ===============================
if (userMode > 0) {
final MenuItem itemPeerSource = new MenuItem(menuAdvanced, SWT.CASCADE);
Messages.setLanguageText(itemPeerSource, "MyTorrentsView.menu.peersource"); //$NON-NLS-1$
final Menu menuPeerSource = new Menu(composite.getShell(), SWT.DROP_DOWN);
itemPeerSource.setMenu(menuPeerSource);
for (int i = 0; i < PEPeerSource.PS_SOURCES.length; i++) {
final String p = PEPeerSource.PS_SOURCES[i];
String msg_text = "ConfigView.section.connection.peersource." + p;
final MenuItem itemPS = new MenuItem(menuPeerSource, SWT.CHECK);
itemPS.setData("peerSource", p);
Messages.setLanguageText(itemPS, msg_text); //$NON-NLS-1$
itemPS.addListener(SWT.Selection, new DMTask(dms) {
public void run(DownloadManager dm) {
dm.getDownloadState().setPeerSourceEnabled(p, itemPS.getSelection());
}
});
itemPS.setSelection(true);
boolean bChecked = hasSelection;
boolean bEnabled = !hasSelection;
if (bChecked) {
bEnabled = true;
// turn on check if just one dm is not enabled
for (int j = 0; j < dms.length; j++) {
DownloadManager dm = (DownloadManager) dms[j];
if (!dm.getDownloadState().isPeerSourceEnabled(p)) {
bChecked = false;
}
if (!dm.getDownloadState().isPeerSourcePermitted(p)) {
bEnabled = false;
}
}
}
itemPS.setSelection(bChecked);
itemPS.setEnabled(bEnabled);
}
}
// === advanced > networks ===
// ===========================
if (userMode > 1) {
final MenuItem itemNetworks = new MenuItem(menuAdvanced, SWT.CASCADE);
Messages.setLanguageText(itemNetworks, "MyTorrentsView.menu.networks"); //$NON-NLS-1$
final Menu menuNetworks = new Menu(composite.getShell(), SWT.DROP_DOWN);
itemNetworks.setMenu(menuNetworks);
for (int i = 0; i < AENetworkClassifier.AT_NETWORKS.length; i++) {
final String nn = AENetworkClassifier.AT_NETWORKS[i];
String msg_text = "ConfigView.section.connection.networks." + nn;
final MenuItem itemNetwork = new MenuItem(menuNetworks, SWT.CHECK);
itemNetwork.setData("network", nn);
Messages.setLanguageText(itemNetwork, msg_text); //$NON-NLS-1$
itemNetwork.addListener(SWT.Selection, new DMTask(dms) {
public void run(DownloadManager dm) {
dm.getDownloadState().setNetworkEnabled(nn, itemNetwork.getSelection());
}
});
boolean bChecked = hasSelection;
if (bChecked) {
// turn on check if just one dm is not enabled
for (int j = 0; j < dms.length; j++) {
DownloadManager dm = (DownloadManager) dms[j];
if (!dm.getDownloadState().isNetworkEnabled(nn)) {
bChecked = false;
break;
}
}
}
itemNetwork.setSelection(bChecked);
}
}
// superseed
if (userMode > 1 && isSeedingView) {
final MenuItem itemSuperSeed = new MenuItem(menuAdvanced, SWT.CHECK);
Messages.setLanguageText(itemSuperSeed, "ManagerItem.superseeding");
boolean enabled = canSetSuperSeed && (superSeedAllNo || superSeedAllYes);
itemSuperSeed.setEnabled(enabled);
final boolean selected = superSeedAllNo;
if (enabled) {
itemSuperSeed.setSelection(selected);
itemSuperSeed.addListener(SWT.Selection, new DMTask(dms) {
public void run(DownloadManager dm) {
PEPeerManager pm = dm.getPeerManager();
if (pm != null) {
if (pm.isSuperSeedMode() == selected && pm.canToggleSuperSeedMode()) {
pm.setSuperSeedMode(!selected);
}
}
}
});
}
}
final MenuItem itemPositionManual = new MenuItem(menuAdvanced, SWT.PUSH);
Messages.setLanguageText(itemPositionManual,
"MyTorrentsView.menu.reposition.manual");
itemPositionManual.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
InputShell is = new InputShell(
"MyTorrentsView.dialog.setPosition.title",
"MyTorrentsView.dialog.setPosition.text");
String sReturn = is.open();
if (sReturn == null)
return;
int newPosition = -1;
try {
newPosition = Integer.valueOf(sReturn).intValue();
} catch (NumberFormatException er) {
// Ignore
}
int size = azureus_core.getGlobalManager().downloadManagerCount(
isSeedingView);
if (newPosition > size)
newPosition = size;
if (newPosition <= 0) {
MessageBox mb = new MessageBox(composite.getShell(), SWT.ICON_ERROR
| SWT.OK);
mb.setText(MessageText.getString("MyTorrentsView.dialog.NumberError.title"));
mb.setMessage(MessageText.getString("MyTorrentsView.dialog.NumberError.text"));
mb.open();
return;
}
moveSelectedTorrentsTo(tv, dms, newPosition);
}
});
// back to main menu
if (userMode > 0 && isTrackerOn) {
// Host
final MenuItem itemHost = new MenuItem(menu, SWT.PUSH);
Messages.setLanguageText(itemHost, "MyTorrentsView.menu.host");
Utils.setMenuItemImage(itemHost, "host");
itemHost.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
hostTorrents(dms, azureus_core, composite);
}
});
// Publish
final MenuItem itemPublish = new MenuItem(menu, SWT.PUSH);
Messages.setLanguageText(itemPublish, "MyTorrentsView.menu.publish");
Utils.setMenuItemImage(itemPublish, "publish");
itemPublish.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
publishTorrents(dms, azureus_core, composite);
}
});
itemHost.setEnabled(hasSelection);
itemPublish.setEnabled(hasSelection);
}
/* Do we really need the Move submenu? There's shortcut keys and toolbar
* buttons..
new MenuItem(menu, SWT.SEPARATOR);
final MenuItem itemMove = new MenuItem(menu, SWT.CASCADE);
Messages.setLanguageText(itemMove, "MyTorrentsView.menu.move");
Utils.setMenuItemImage(itemMove, "move");
itemMove.setEnabled(hasSelection);
final Menu menuMove = new Menu(composite.getShell(), SWT.DROP_DOWN);
itemMove.setMenu(menuMove);
final MenuItem itemMoveTop = new MenuItem(menuMove, SWT.PUSH);
Messages.setLanguageText(itemMoveTop, "MyTorrentsView.menu.moveTop");
Utils.setMenuItemImage(itemMoveTop, "top");
itemMoveTop.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
moveSelectedTorrentsTop();
}
});
itemMoveTop.setEnabled(moveUp);
final MenuItem itemMoveUp = new MenuItem(menuMove, SWT.PUSH);
Messages.setLanguageText(itemMoveUp, "MyTorrentsView.menu.moveUp");
Utils.setMenuItemImage(itemMoveUp, "up");
itemMoveUp.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
moveSelectedTorrentsUp();
}
});
final MenuItem itemMoveDown = new MenuItem(menuMove, SWT.PUSH);
Messages.setLanguageText(itemMoveDown, "MyTorrentsView.menu.moveDown");
Utils.setMenuItemImage(itemMoveDown, "down");
itemMoveDown.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
moveSelectedTorrentsDown();
}
});
final MenuItem itemMoveEnd = new MenuItem(menuMove, SWT.PUSH);
Messages.setLanguageText(itemMoveEnd, "MyTorrentsView.menu.moveEnd");
Utils.setMenuItemImage(itemMoveEnd, "bottom");
itemMoveEnd.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
moveSelectedTorrentsEnd();
}
});
itemMoveEnd.setEnabled(moveDown);
*/
/* //TODO ensure that all limits combined don't go under the min 5kbs ?
//Disable at the end of the list, thus the first item of the array is instanciated last.
itemsSpeed[0] = new MenuItem(menuSpeed,SWT.PUSH);
Messages.setLanguageText(itemsSpeed[0],"MyTorrentsView.menu.setSpeed.disable");
itemsSpeed[0].setData("maxul", new Integer(-1));
itemsSpeed[0].addListener(SWT.Selection,itemsSpeedListener);
*/
// Category
Menu menuCategory = new Menu(composite.getShell(), SWT.DROP_DOWN);
final MenuItem itemCategory = new MenuItem(menu, SWT.CASCADE);
Messages.setLanguageText(itemCategory, "MyTorrentsView.menu.setCategory"); //$NON-NLS-1$
//itemCategory.setImage(ImageRepository.getImage("speed"));
itemCategory.setMenu(menuCategory);
itemCategory.setEnabled(hasSelection);
addCategorySubMenu(dms, menuCategory, composite);
// Rename
final MenuItem itemRename = new MenuItem(menu, SWT.CASCADE);
Messages.setLanguageText(itemRename, "MyTorrentsView.menu.rename");
itemRename.setEnabled(hasSelection);
final Menu menuRename = new Menu(composite.getShell(), SWT.DROP_DOWN);
itemRename.setMenu(menuRename);
DownloadManager first_selected = (dms.length == 0) ? null : dms[0];
// Rename -> Displayed Name
final MenuItem itemRenameDisplayed = new MenuItem(menuRename, SWT.CASCADE);
Messages.setLanguageText(itemRenameDisplayed, "MyTorrentsView.menu.rename.displayed");
itemRenameDisplayed.setEnabled(hasSelection);
if (itemRenameDisplayed.isEnabled()) {
itemRenameDisplayed.setData("suggested_text", first_selected.getDisplayName());
itemRenameDisplayed.setData("display_name", Boolean.valueOf(true));
itemRenameDisplayed.setData("save_name", Boolean.valueOf(false));
itemRenameDisplayed.setData("msg_key", "displayed");
}
// Rename -> Save Name
final MenuItem itemRenameSavePath = new MenuItem(menuRename, SWT.CASCADE);
Messages.setLanguageText(itemRenameSavePath, "MyTorrentsView.menu.rename.save_path");
itemRenameSavePath.setEnabled(fileMove && dms.length == 1);
if (itemRenameSavePath.isEnabled()) {
itemRenameSavePath.setData("suggested_text", first_selected.getAbsoluteSaveLocation().getName());
itemRenameSavePath.setData("display_name", Boolean.valueOf(false));
itemRenameSavePath.setData("save_name", Boolean.valueOf(true));
itemRenameSavePath.setData("msg_key", "save_path");
}
// Rename -> Both
final MenuItem itemRenameBoth = new MenuItem(menuRename, SWT.CASCADE);
Messages.setLanguageText(itemRenameBoth, "MyTorrentsView.menu.rename.displayed_and_save_path");
itemRenameBoth.setEnabled(fileMove && dms.length == 1);
if (itemRenameBoth.isEnabled()) {
itemRenameBoth.setData("suggested_text", first_selected.getAbsoluteSaveLocation().getName());
itemRenameBoth.setData("display_name", Boolean.valueOf(true));
itemRenameBoth.setData("save_name", Boolean.valueOf(true));
itemRenameBoth.setData("msg_key", "displayed_and_save_path");
}
Listener rename_listener = new Listener() {
public void handleEvent(Event event) {
MenuItem mi = (MenuItem) event.widget;
String suggested = (String) mi.getData("suggested_text");
final boolean change_displayed_name = ((Boolean) mi.getData("display_name")).booleanValue();
final boolean change_save_name = ((Boolean) mi.getData("save_name")).booleanValue();
String msg_key_prefix = "MyTorrentsView.menu.rename." + (String) mi.getData("msg_key") + ".enter.";
SimpleTextEntryWindow text_entry = new SimpleTextEntryWindow(composite.getDisplay());
text_entry.setTitle(msg_key_prefix + "title");
text_entry.setMessages(new String[] { msg_key_prefix + "message", msg_key_prefix + "message.2" });
text_entry.setPreenteredText(suggested, false);
text_entry.prompt();
if (text_entry.hasSubmittedInput()) {
String value = text_entry.getSubmittedInput();
final String value_to_set = (value.length() == 0) ? null : value;
DMTask task = new DMTask(dms) {
public void run(DownloadManager dm) {
if (change_displayed_name) {
dm.getDownloadState().setDisplayName(value_to_set);
}
if (change_save_name) {
try {
dm.renameDownload((value_to_set == null) ? dm.getDisplayName() : value_to_set);
}
catch (Exception e) {
Logger.log(new LogAlert(dm, LogAlert.REPEATABLE,
"Download data rename operation failed", e));
}
}
}
};
task.go();
}
}
};
itemRenameDisplayed.addListener(SWT.Selection, rename_listener);
itemRenameSavePath.addListener(SWT.Selection, rename_listener);
itemRenameBoth.addListener(SWT.Selection, rename_listener);
// Edit Comment
final MenuItem itemEditComment = new MenuItem(menu, SWT.CASCADE);
Messages.setLanguageText(itemEditComment, "MyTorrentsView.menu.edit_comment");
itemEditComment.setEnabled(dms.length > 0);
itemEditComment.addListener(SWT.Selection, new DMTask(dms) {
public void run(DownloadManager[] dms) {
promptUserForComment(dms);
}
});
// ---
new MenuItem(menu, SWT.SEPARATOR);
// Queue
final MenuItem itemQueue = new MenuItem(menu, SWT.PUSH);
Messages.setLanguageText(itemQueue, "MyTorrentsView.menu.queue"); //$NON-NLS-1$
Utils.setMenuItemImage(itemQueue, "start");
itemQueue.addListener(SWT.Selection, new DMTask(dms) {
public void run(DownloadManager[] dms) {
queueTorrents(dms, menu.getShell());
}
});
itemQueue.setEnabled(start);
// Force Start
if (userMode > 0) {
final MenuItem itemForceStart = new MenuItem(menu, SWT.CHECK);
Messages.setLanguageText(itemForceStart, "MyTorrentsView.menu.forceStart");
Utils.setMenuItemImage(itemForceStart, "forcestart");
itemForceStart.addListener(SWT.Selection, new DMTask(dms) {
public void run(DownloadManager dm) {
if (ManagerUtils.isForceStartable(dm)) {
dm.setForceStart(itemForceStart.getSelection());
}
}
});
itemForceStart.setSelection(forceStart);
itemForceStart.setEnabled(forceStartEnabled);
}
// Stop
final MenuItem itemStop = new MenuItem(menu, SWT.PUSH);
Messages.setLanguageText(itemStop, "MyTorrentsView.menu.stop"); //$NON-NLS-1$
Utils.setMenuItemImage(itemStop, "stop");
itemStop.addListener(SWT.Selection, new DMTask(dms) {
public void run(DownloadManager[] dms) {
stopTorrents(dms, menu.getShell());
}
});
itemStop.setEnabled(stop);
// Force Recheck
final MenuItem itemRecheck = new MenuItem(menu, SWT.PUSH);
Messages.setLanguageText(itemRecheck, "MyTorrentsView.menu.recheck");
Utils.setMenuItemImage(itemRecheck, "recheck");
itemRecheck.addListener(SWT.Selection, new DMTask(dms) {
public void run(DownloadManager dm) {
if (dm.canForceRecheck()) {
dm.forceRecheck();
}
}
});
itemRecheck.setEnabled(recheck);
// Remove
final MenuItem itemRemove = new MenuItem(menu, SWT.PUSH);
Messages.setLanguageText(itemRemove, "MyTorrentsView.menu.remove"); //$NON-NLS-1$
Utils.setMenuItemImage(itemRemove, "delete");
itemRemove.addListener(SWT.Selection, new DMTask(dms) {
public void run(DownloadManager dm) {
removeTorrent(dm, false, false, menu.getShell());
}
});
itemRemove.setEnabled(hasSelection);
// === Remove And ===
// ==================
final MenuItem itemRemoveAnd = new MenuItem(menu, SWT.CASCADE);
Messages.setLanguageText(itemRemoveAnd, "MyTorrentsView.menu.removeand"); //$NON-NLS-1$
Utils.setMenuItemImage(itemRemoveAnd, "delete");
itemRemoveAnd.setEnabled(hasSelection);
final Menu menuRemove = new Menu(composite.getShell(), SWT.DROP_DOWN);
itemRemoveAnd.setMenu(menuRemove);
// Remove And > Delete Torrent
final MenuItem itemDeleteTorrent = new MenuItem(menuRemove, SWT.PUSH);
Messages.setLanguageText(itemDeleteTorrent, "MyTorrentsView.menu.removeand.deletetorrent"); //$NON-NLS-1$
itemDeleteTorrent.addListener(SWT.Selection, new DMTask(dms) {
public void run(DownloadManager dm) {
removeTorrent(dm, true, false, menu.getShell());
}
});
// Remove And > Delete Data
final MenuItem itemDeleteData = new MenuItem(menuRemove, SWT.PUSH);
Messages.setLanguageText(itemDeleteData, "MyTorrentsView.menu.removeand.deletedata");
itemDeleteData.addListener(SWT.Selection, new DMTask(dms) {
public void run(DownloadManager dm) {
removeTorrent(dm, false, true, menu.getShell());
}
});
// Remove And > Delete Both
final MenuItem itemDeleteBoth = new MenuItem(menuRemove, SWT.PUSH);
Messages.setLanguageText(itemDeleteBoth, "MyTorrentsView.menu.removeand.deleteboth");
itemDeleteBoth.addListener(SWT.Selection, new DMTask(dms) {
public void run(DownloadManager dm) {
removeTorrent(dm, true, true, menu.getShell());
}
});
}
private static void addCategorySubMenu(final DownloadManager[] dms, Menu menuCategory, final Composite composite) {
MenuItem[] items = menuCategory.getItems();
int i;
for (i = 0; i < items.length; i++) {
items[i].dispose();
}
Category[] categories = CategoryManager.getCategories();
Arrays.sort(categories);
// Ensure that there is at least one user category available.
boolean allow_category_selection = categories.length > 0;
if (allow_category_selection) {
boolean user_category_found = false;
for (i=0; i<categories.length; i++) {
if (categories[i].getType() == Category.TYPE_USER) {
user_category_found = true;
break;
}
}
// It may be the categories array just contains "uncategorised".
allow_category_selection = user_category_found;
}
if (allow_category_selection) {
final Category catUncat = CategoryManager.getCategory(Category.TYPE_UNCATEGORIZED);
if (catUncat != null) {
final MenuItem itemCategory = new MenuItem(menuCategory, SWT.PUSH);
Messages.setLanguageText(itemCategory, catUncat.getName());
itemCategory.addListener(SWT.Selection, new DMTask(dms) {
public void run(DownloadManager dm) {
dm.getDownloadState().setCategory(catUncat);
}
});
new MenuItem(menuCategory, SWT.SEPARATOR);
}
for (i = 0; i < categories.length; i++) {
final Category category = categories[i];
if (category.getType() == Category.TYPE_USER) {
final MenuItem itemCategory = new MenuItem(menuCategory, SWT.PUSH);
itemCategory.setText(category.getName());
itemCategory.addListener(SWT.Selection, new DMTask(dms) {
public void run(DownloadManager dm) {
dm.getDownloadState().setCategory(category);
}
});
}
}
new MenuItem(menuCategory, SWT.SEPARATOR);
}
final MenuItem itemAddCategory = new MenuItem(menuCategory, SWT.PUSH);
Messages.setLanguageText(itemAddCategory, "MyTorrentsView.menu.setCategory.add");
itemAddCategory.addListener(SWT.Selection, new DMTask(dms) {
public void run(DownloadManager[] dms) {
CategoryAdderWindow adderWindow = new CategoryAdderWindow(composite.getDisplay());
Category newCategory = adderWindow.getNewCategory();
if (newCategory != null) assignToCategory(dms, newCategory);
}
});
}
private static void moveSelectedTorrentsTo(TableView tv,
DownloadManager[] dms, int iNewPos) {
if (dms == null || dms.length == 0) {
return;
}
TableColumnCore sortColumn = tv == null ? null : tv.getSortColumn();
boolean isSortAscending = sortColumn == null ? true
: sortColumn.isSortAscending();
for (int i = 0; i < dms.length; i++) {
DownloadManager dm = dms[i];
int iOldPos = dm.getPosition();
dm.getGlobalManager().moveTo(dm, iNewPos);
if (isSortAscending) {
if (iOldPos > iNewPos)
iNewPos++;
} else {
if (iOldPos < iNewPos)
iNewPos--;
}
}
if (tv != null) {
boolean bForceSort = sortColumn.getName().equals("#");
tv.columnInvalidate("#");
tv.refreshTable(bForceSort);
}
}
private static void changeDirSelectedTorrents(DownloadManager[] dms, Shell shell) {
if (dms.length <= 0) return;
String sDefPath = COConfigurationManager.getBooleanParameter("Use default data dir") ? COConfigurationManager
.getStringParameter("Default save path") : "";
if (sDefPath.length() > 0) {
File f = new File(sDefPath);
if (!f.exists()) {
FileUtil.mkdirs(f);
}
}
DirectoryDialog dDialog = new DirectoryDialog(shell, SWT.SYSTEM_MODAL);
dDialog.setFilterPath(sDefPath);
dDialog.setMessage(MessageText.getString("MainWindow.dialog.choose.savepath"));
String sSavePath = dDialog.open();
if (sSavePath != null) {
for (int i = 0; i < dms.length; i++) {
DownloadManager dm = dms[i];
if (dm.getState() == DownloadManager.STATE_ERROR) {
dm.setTorrentSaveDir(sSavePath);
if (dm.filesExist()) {
dm.stopIt(DownloadManager.STATE_STOPPED, false, false);
ManagerUtils.queue(dm, shell);
}
}
}
}
}
public static void runTorrents(Object[] download_managers) {
for (int i = download_managers.length - 1; i >= 0; i--) {
DownloadManager dm = (DownloadManager) download_managers[i];
if (dm != null) {
ManagerUtils.run(dm);
}
}
}
public static void hostTorrents(final Object[] download_managers, final AzureusCore azureus_core,
final Composite composite) {
DMTask task = new DMTask(toDMS(download_managers)) {
public void run(DownloadManager dm) {
ManagerUtils.host(azureus_core, dm, composite);
}
};
task.go();
UIFunctions uiFunctions = UIFunctionsManager.getUIFunctions();
if (uiFunctions != null) {
uiFunctions.showMyTracker();
}
}
public static void publishTorrents(final Object[] download_managers, final AzureusCore azureus_core,
final Composite composite) {
DMTask task = new DMTask(toDMS(download_managers)) {
public void run(DownloadManager dm) {
ManagerUtils.publish(azureus_core, dm, composite);
}
};
task.go();
UIFunctions uiFunctions = UIFunctionsManager.getUIFunctions();
if (uiFunctions != null) {
uiFunctions.showMyTracker();
}
}
public static void removeTorrent(final DownloadManager dm, final boolean bDeleteTorrent, final boolean bDeleteData,
Shell shell) {
ManagerUtils.remove(dm, shell, bDeleteTorrent, bDeleteData);
}
public static void removeTorrents(Object[] download_managers, final Shell shell) {
DMTask task = new DMTask(toDMS(download_managers)) {
public void run(DownloadManager dm) {
removeTorrent(dm, false, false, shell);
}
};
task.go();
}
public static void stopTorrents(Object[] download_managers, final Shell shell) {
DMTask task = new DMTask(toDMS(download_managers)) {
public void run(DownloadManager dm) {
ManagerUtils.stop(dm, shell);
}
};
task.go();
}
public static void queueTorrents(Object[] download_managers, final Shell shell) {
DMTask task = new DMTask(toDMS(download_managers)) {
public void run(DownloadManager dm) {
ManagerUtils.queue(dm, shell);
}
};
task.go();
}
public static void resumeTorrents(Object[] download_managers) {
DMTask task = new DMTask(toDMS(download_managers)) {
public void run(DownloadManager dm) {
ManagerUtils.start(dm);
}
};
task.go();
}
// Category Stuff
public static void assignToCategory(Object[] download_managers, final Category category) {
DMTask task = new DMTask(toDMS(download_managers)) {
public void run(DownloadManager dm) {
dm.getDownloadState().setCategory(category);
}
};
task.go();
}
public static void promptUserForComment(DownloadManager[] dms) {
if (dms.length == 0) {return;}
DownloadManager dm = dms[0];
// Create dialog box.
String suggested = dm.getDownloadState().getUserComment();
String msg_key_prefix = "MyTorrentsView.menu.edit_comment.enter.";
SimpleTextEntryWindow text_entry = new SimpleTextEntryWindow(Display.getCurrent());
text_entry.setTitle(msg_key_prefix + "title");
text_entry.setMessage(msg_key_prefix + "message");
text_entry.setPreenteredText(suggested, false);
text_entry.setMultiLine(true);
text_entry.prompt();
if (text_entry.hasSubmittedInput()) {
String value = text_entry.getSubmittedInput();
final String value_to_set = (value.length() == 0) ? null : value;
DMTask task = new DMTask(dms) {
public void run(DownloadManager dm) {
dm.getDownloadState().setUserComment(value_to_set);
}
};
task.go();
}
}
private static DownloadManager[] toDMS(Object[] objects) {
if (objects instanceof DownloadManager[]) { return (DownloadManager[]) objects; }
DownloadManager[] result = new DownloadManager[objects.length];
System.arraycopy(objects, 0, result, 0, result.length);
return result;
}
private abstract static class DMTask implements Listener {
private DownloadManager[] dms;
private boolean ascending;
public DMTask(DownloadManager[] dms) {
this(dms, true);
}
public DMTask(DownloadManager[] dms, boolean ascending) {
this.dms = dms;
this.ascending = ascending;
}
// One of the following methods should be overridden.
public void run(DownloadManager dm) {
}
public void run(DownloadManager[] dm) {
}
public void handleEvent(Event event) {
go();
}
public void go() {
try {
DownloadManager dm = null;
for (int i = 0; i < dms.length; i++) {
dm = dms[ascending ? i : (dms.length - 1) - i];
if (dm == null) {
continue;
}
this.run(dm);
}
this.run(dms);
}
catch (Exception e) {
Debug.printStackTrace(e);
}
}
}
/**
* quick check to see if a file might be a torrent
* @param torrentFile
* @param deleteFileOnCancel
* @param parentShell non-null: display a window if it's not a torrent
* @return
*
* @since 3.0.2.3
*/
public static boolean isFileTorrent(File torrentFile, Shell parentShell,
String torrentName) {
String sFirstChunk = null;
try {
sFirstChunk = FileUtil.readFileAsString(torrentFile, 16384).toLowerCase();
} catch (IOException e) {
Debug.out("warning", e);
}
if (sFirstChunk == null) {
sFirstChunk = "";
}
if (!sFirstChunk.startsWith("d")) {
if (parentShell != null) {
boolean isHTML = sFirstChunk.indexOf("<html") >= 0;
MessageBoxShell boxShell = new MessageBoxShell(parentShell,
MessageText.getString("OpenTorrentWindow.mb.notTorrent.title"),
MessageText.getString("OpenTorrentWindow.mb.notTorrent.text",
new String[] {
torrentName,
isHTML ? "" : MessageText.getString("OpenTorrentWindow.mb.notTorrent.cannot.display")
}), new String[] {
MessageText.getString("Button.ok")
}, 0);
if (isHTML) {
boxShell.setHtml(sFirstChunk);
}
boxShell.open();
}
return false;
}
return true;
}
}