package com.aelitis.azureus.ui.swt.browser.listener; import java.io.File; import java.util.Map; import org.eclipse.swt.widgets.Shell; import org.minicastle.util.encoders.Base64; import org.gudy.azureus2.core3.config.COConfigurationManager; import org.gudy.azureus2.core3.torrent.TOTorrent; import org.gudy.azureus2.core3.util.*; import com.aelitis.azureus.core.AzureusCore; import com.aelitis.azureus.core.AzureusCoreRunningListener; import com.aelitis.azureus.core.AzureusCoreFactory; import com.aelitis.azureus.core.cnetwork.ContentNetworkManagerFactory; import com.aelitis.azureus.core.messenger.ClientMessageContext; import com.aelitis.azureus.core.messenger.ClientMessageContext.torrentURLHandler; import com.aelitis.azureus.core.messenger.browser.BrowserMessage; import com.aelitis.azureus.core.messenger.browser.listeners.AbstractBrowserMessageListener; import com.aelitis.azureus.core.torrent.PlatformTorrentUtils; import com.aelitis.azureus.ui.selectedcontent.DownloadUrlInfo; import com.aelitis.azureus.ui.selectedcontent.DownloadUrlInfoContentNetwork; import com.aelitis.azureus.ui.swt.utils.TorrentUIUtilsV3; import com.aelitis.azureus.util.MapUtils; public class TorrentListener extends AbstractBrowserMessageListener { public static final String DEFAULT_LISTENER_ID = "torrent"; public static final String OP_LOAD_TORRENT_OLD = "loadTorrent"; public static final String OP_LOAD_TORRENT = "load-torrent"; private ClientMessageContext.torrentURLHandler torrentURLHandler; public TorrentListener(String id) { super(id); } public TorrentListener() { this(DEFAULT_LISTENER_ID); } public void setTorrentURLHandler( torrentURLHandler handler) { torrentURLHandler = handler; } public void setShell(Shell shell) { } public void handleMessage(final BrowserMessage message) { String opid = message.getOperationId(); if (OP_LOAD_TORRENT.equals(opid) || OP_LOAD_TORRENT_OLD.equals(opid)) { final Map decodedMap = message.getDecodedMap(); String url = MapUtils.getMapString(decodedMap, "url", null); final boolean playNow = MapUtils.getMapBoolean(decodedMap, "play-now", false); final boolean playPrepare = MapUtils.getMapBoolean(decodedMap, "play-prepare", false); final boolean bringToFront = MapUtils.getMapBoolean(decodedMap, "bring-to-front", true); if (url != null) { if ( torrentURLHandler != null ){ try{ torrentURLHandler.handleTorrentURL( url ); }catch( Throwable e ){ Debug.printStackTrace(e); } } final DownloadUrlInfo dlInfo = new DownloadUrlInfoContentNetwork(url, ContentNetworkManagerFactory.getSingleton().getContentNetwork( context.getContentNetworkID())); dlInfo.setReferer(message.getReferer()); AzureusCoreFactory.addCoreRunningListener(new AzureusCoreRunningListener() { public void azureusCoreRunning(AzureusCore core) { TorrentUIUtilsV3.loadTorrent(dlInfo, playNow, playPrepare, bringToFront); } }); } else { AzureusCoreFactory.addCoreRunningListener(new AzureusCoreRunningListener() { public void azureusCoreRunning(AzureusCore core) { loadTorrentByB64(core, message, MapUtils.getMapString(decodedMap, "b64", null)); } }); } } else { throw new IllegalArgumentException("Unknown operation: " + opid); } } public static boolean loadTorrentByB64(AzureusCore core, String b64) { return loadTorrentByB64(core, null, b64); } /** * @param mapString * * @since 3.0.1.7 */ private static boolean loadTorrentByB64(AzureusCore core, BrowserMessage message, String b64) { if (b64 == null) { return false; } byte[] decodedTorrent = Base64.decode(b64); File tempTorrentFile; try { tempTorrentFile = File.createTempFile("AZU", ".torrent"); tempTorrentFile.deleteOnExit(); String filename = tempTorrentFile.getAbsolutePath(); FileUtil.writeBytesAsFile(filename, decodedTorrent); TOTorrent torrent = TorrentUtils.readFromFile(tempTorrentFile, false); // Security: Only allow torrents from whitelisted trackers if (!PlatformTorrentUtils.isPlatformTracker(torrent)) { Debug.out("stopped loading torrent because it's not in whitelist"); return false; } String savePath = COConfigurationManager.getStringParameter("Default save path"); if (savePath == null || savePath.length() == 0) { savePath = "."; } core.getGlobalManager().addDownloadManager(filename, savePath); } catch (Throwable t) { if (message != null) { message.debug("loadUrl error", t); } else { Debug.out(t); } return false; } return true; } }