package com.aelitis.azureus.ui.swt.browser.listener; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.eclipse.swt.browser.Browser; import org.eclipse.swt.dnd.*; import org.eclipse.swt.widgets.Display; import org.gudy.azureus2.core3.download.DownloadManager; import org.gudy.azureus2.core3.torrent.TOTorrent; import org.gudy.azureus2.core3.torrent.TOTorrentFactory; import org.gudy.azureus2.core3.util.*; import org.gudy.azureus2.pluginsimpl.local.PluginInitializer; import org.gudy.azureus2.ui.swt.Utils; import org.gudy.azureus2.ui.swt.donations.DonationWindow; import org.gudy.azureus2.ui.swt.plugins.UISWTInstance; import org.gudy.azureus2.ui.swt.plugins.UISWTView; import com.aelitis.azureus.core.cnetwork.ContentNetwork; import com.aelitis.azureus.core.cnetwork.ContentNetworkManagerFactory; import com.aelitis.azureus.core.messenger.browser.BrowserMessage; import com.aelitis.azureus.core.messenger.browser.listeners.AbstractBrowserMessageListener; import com.aelitis.azureus.core.subs.Subscription; import com.aelitis.azureus.core.subs.SubscriptionManagerFactory; import com.aelitis.azureus.core.torrent.PlatformTorrentUtils; import com.aelitis.azureus.ui.UIFunctions; import com.aelitis.azureus.ui.UIFunctionsManager; import com.aelitis.azureus.ui.mdi.MultipleDocumentInterface; import com.aelitis.azureus.ui.selectedcontent.*; import com.aelitis.azureus.ui.skin.SkinConstants; import com.aelitis.azureus.ui.swt.UIFunctionsManagerSWT; import com.aelitis.azureus.ui.swt.UIFunctionsSWT; import com.aelitis.azureus.ui.swt.browser.BrowserWrapper; import com.aelitis.azureus.ui.swt.feature.FeatureManagerUI; import com.aelitis.azureus.ui.swt.mdi.BaseMdiEntry; import com.aelitis.azureus.ui.swt.mdi.MultipleDocumentInterfaceSWT; import com.aelitis.azureus.ui.swt.shells.BrowserWindow; import com.aelitis.azureus.ui.swt.skin.*; import com.aelitis.azureus.ui.swt.views.skin.SBC_BurnFTUX; import com.aelitis.azureus.ui.swt.views.skin.SBC_PlusFTUX; import com.aelitis.azureus.util.*; import org.gudy.azureus2.plugins.PluginInterface; import org.gudy.azureus2.plugins.PluginManager; import org.gudy.azureus2.plugins.ui.*; public class DisplayListener extends AbstractBrowserMessageListener { public static final String DEFAULT_LISTENER_ID = "display"; public static final String OP_COPY_TO_CLIPBOARD = "copy-text"; public static final String OP_OPEN_URL = "open-url"; public static final String OP_RESET_URL = "reset-url"; public static final String OP_SEND_EMAIL = "send-email"; public static final String OP_IRC_SUPPORT = "irc-support"; public static final String OP_BRING_TO_FRONT = "bring-to-front"; public static final String OP_SWITCH_TO_TAB = "switch-to-tab"; public static final String OP_REFRESH_TAB = "refresh-browser"; public static final String VZ_NON_ACTIVE = "vz-non-active"; public static final String OP_SET_SELECTED_CONTENT = "set-selected-content"; public static final String OP_GET_SELECTED_CONTENT = "get-selected-content"; public static final String OP_SHOW_DONATION_WINDOW = "show-donation-window"; public static final String OP_OPEN_SEARCH = "open-search"; public static final String OP_REGISTER = "open-register"; private BrowserWrapper browser; public DisplayListener(String id, BrowserWrapper browser) { super(id); this.browser = browser; } /** * */ public DisplayListener(BrowserWrapper browser) { this(DEFAULT_LISTENER_ID, browser); } public void handleMessage(BrowserMessage message) { String opid = message.getOperationId(); if (OP_COPY_TO_CLIPBOARD.equals(opid)) { Map decodedMap = message.getDecodedMap(); copyToClipboard(MapUtils.getMapString(decodedMap, "text", "")); } else if (OP_OPEN_URL.equals(opid)) { Map decodedMap = message.getDecodedMap(); String target = MapUtils.getMapString(decodedMap, "target", null); if ((target == null || "_blank".equals(target)) && !decodedMap.containsKey("width")) { launchUrl(MapUtils.getMapString(decodedMap, "url", null), MapUtils.getMapBoolean(decodedMap, "append-suffix", false)); } else { String ref = message.getReferer(); if (target != null && target.equals(SkinConstants.VIEWID_BROWSER_BROWSE) && ref != null) { ContentNetwork cn = ContentNetworkManagerFactory.getSingleton().getContentNetworkForURL( ref); if (cn != null) { target = ContentNetworkUtils.getTarget(cn); System.err.println("TARGET REWRITTEN TO " + target); } } message.setCompleteDelayed(true); showBrowser(MapUtils.getMapString(decodedMap, "url", null), target, MapUtils.getMapInt(decodedMap, "width", 0), MapUtils.getMapInt( decodedMap, "height", 0), MapUtils.getMapBoolean(decodedMap, "resizable", false), message, MapUtils.getMapString(decodedMap, "source-ref", ref)); } } else if (OP_RESET_URL.equals(opid)) { resetURL(); } else if (OP_SEND_EMAIL.equals(opid)) { Map decodedMap = message.getDecodedMap(); String to = MapUtils.getMapString(decodedMap, "to", ""); String subject = MapUtils.getMapString(decodedMap, "subject", ""); String body = MapUtils.getMapString(decodedMap, "body", null); sendEmail(to, subject, body); } else if (OP_IRC_SUPPORT.equals(opid)) { Map decodedMap = message.getDecodedMap(); openIrc(null, MapUtils.getMapString(decodedMap, "channel", ""), MapUtils.getMapString(decodedMap, "user", "")); } else if (OP_BRING_TO_FRONT.equals(opid)) { bringToFront(); } else if (OP_SWITCH_TO_TAB.equals(opid)) { Map decodedMap = message.getDecodedMap(); switchToTab(MapUtils.getMapString(decodedMap, "target", ""), MapUtils.getMapString(decodedMap, "source-ref", message.getReferer())); } else if (OP_REFRESH_TAB.equals(opid)) { Map decodedMap = message.getDecodedMap(); refreshTab(MapUtils.getMapString(decodedMap, "browser-id", "")); } else if (OP_SET_SELECTED_CONTENT.equals(opid)) { Map decodedMap = message.getDecodedMap(); if (decodedMap != null) { setSelectedContent(message, decodedMap); } } else if (OP_GET_SELECTED_CONTENT.equals(opid)) { Map decodedMap = message.getDecodedMap(); if (decodedMap != null) { getSelectedContent(message, decodedMap); } } else if (OP_SHOW_DONATION_WINDOW.equals(opid)) { Map decodedMap = message.getDecodedMap(); DonationWindow.open(true, MapUtils.getMapString(decodedMap, "source-ref", "RPC")); } else if (OP_OPEN_SEARCH.equals(opid)) { Map decodedMap = message.getDecodedMap(); UIFunctions uif = UIFunctionsManager.getUIFunctions(); if (uif != null) { uif.doSearch(MapUtils.getMapString(decodedMap, "search-text", "")); } } else if (OP_REGISTER.equals(opid)) { FeatureManagerUI.openLicenceEntryWindow(false, null); } else { throw new IllegalArgumentException("Unknown operation: " + opid); } } private void getSelectedContent(BrowserMessage message, Map decodedMap) { String callback = MapUtils.getMapString(decodedMap, "callback", null); if (callback == null) { return; } List<Map> list = new ArrayList<Map>(); DownloadManager[] dms = SelectedContentManager.getDMSFromSelectedContent(); if (dms != null ){ for (DownloadManager dm : dms) { if (dm != null) { Map<String, Object> mapDM = new HashMap<String, Object>(); TOTorrent torrent = dm.getTorrent(); if (torrent != null && !TorrentUtils.isReallyPrivate(torrent)) { try { // make a copy of the torrent Map torrent_map = torrent.serialiseToMap(); TOTorrent torrent_to_send = TOTorrentFactory.deserialiseFromMap( torrent_map ); Map vuze_map = (Map)torrent_map.get( "vuze" ); // remove any non-standard stuff (e.g. resume data) torrent_to_send.removeAdditionalProperties(); torrent_map = torrent_to_send.serialiseToMap(); if ( vuze_map != null ){ torrent_map.put( "vuze", vuze_map ); } byte[] encode = BEncoder.encode(torrent_map); mapDM.put("name", PlatformTorrentUtils.getContentTitle2(dm)); mapDM.put("torrent", Base32.encode(encode)); list.add(mapDM); } catch (Throwable t) { Debug.out(t); } } } } } if (list.size() > 0 && context != null) { context.executeInBrowser(callback + "(" + JSONUtils.encodeToJSON(list) + ")"); } } /** * @param message * @param decodedMap * * @since 3.1.1.1 */ private void setSelectedContent(BrowserMessage message, Map decodedMap) { String hash = MapUtils.getMapString(decodedMap, "torrent-hash", null); String displayName = MapUtils.getMapString(decodedMap, "display-name", null); String dlURL = MapUtils.getMapString(decodedMap, "download-url", null); String referer = MapUtils.getMapString(decodedMap, "referer", "displaylistener"); if (hash == null && dlURL == null) { SelectedContentManager.changeCurrentlySelectedContent(referer, null); } String callback = MapUtils.getMapString(decodedMap, "callback", null); if (callback != null && context != null) { DownloadUrlInfoSWT dlInfo = new DownloadUrlInfoSWT(context, callback, hash); boolean canPlay = MapUtils.getMapBoolean(decodedMap, "can-play", false); boolean isVuzeContent = MapUtils.getMapBoolean(decodedMap, "is-vuze-content", true); SelectedContentV3 content = new SelectedContentV3(hash, displayName, isVuzeContent, canPlay); content.setDownloadInfo(dlInfo); SelectedContentManager.changeCurrentlySelectedContent(referer, new ISelectedContent[] { content }); return; } if (displayName != null && context != null ) { String dlReferer = MapUtils.getMapString(decodedMap, "download-referer", null); String dlCookies = MapUtils.getMapString(decodedMap, "download-cookies", null); Map dlHeader = MapUtils.getMapMap(decodedMap, "download-header", null); boolean canPlay = MapUtils.getMapBoolean(decodedMap, "can-play", false); boolean isVuzeContent = MapUtils.getMapBoolean(decodedMap, "is-vuze-content", true); SelectedContentV3 content = new SelectedContentV3(hash, displayName, isVuzeContent, canPlay); content.setThumbURL(MapUtils.getMapString(decodedMap, "thumbnail.url", null)); DownloadUrlInfo dlInfo = new DownloadUrlInfoContentNetwork(dlURL, ContentNetworkManagerFactory.getSingleton().getContentNetwork( context.getContentNetworkID())); dlInfo.setReferer(dlReferer); if (dlCookies != null) { if (dlHeader == null) { dlHeader = new HashMap(); } dlHeader.put("Cookie", dlCookies); } dlInfo.setRequestProperties(dlHeader); String subID = MapUtils.getMapString(decodedMap, "subscription-id", null); String subresID = MapUtils.getMapString(decodedMap, "subscription-result-id", null); if (subID != null && subresID != null) { Subscription subs = SubscriptionManagerFactory.getSingleton().getSubscriptionByID( subID); if (subs != null) { subs.addPotentialAssociation(subresID, dlURL); } } // pass decodeMap down to TorrentUIUtilsV3.loadTorrent in case // is needs some other params dlInfo.setAdditionalProperties(decodedMap); content.setDownloadInfo(dlInfo); SelectedContentManager.changeCurrentlySelectedContent(referer, new ISelectedContent[] { content }); } else { SelectedContentManager.changeCurrentlySelectedContent(referer, null); } } /** * @param string * * @since 3.0.0.7 */ public static void switchToTab(String tabID, String sourceRef) { MultipleDocumentInterface mdi = UIFunctionsManager.getUIFunctions().getMDI(); if (mdi == null) { return; } if (sourceRef != null) { if (MultipleDocumentInterface.SIDEBAR_SECTION_PLUS.equals(tabID) || MultipleDocumentInterface.SIDEBAR_SECTION_BURN_INFO.equals(tabID)) { Pattern pattern = Pattern.compile("http.*//[^/]+/([^.]+)"); Matcher matcher = pattern.matcher(sourceRef); String sourceRef2; if (matcher.find()) { sourceRef2 = matcher.group(1); } else { sourceRef2 = sourceRef; } if (MultipleDocumentInterface.SIDEBAR_SECTION_PLUS.equals(tabID)) { SBC_PlusFTUX.setSourceRef(sourceRef2); } else { SBC_BurnFTUX.setSourceRef(sourceRef2); } } } mdi.showEntryByID(tabID); } /** * */ private void bringToFront() { final UIFunctions functions = UIFunctionsManager.getUIFunctions(); if (functions != null) { functions.bringToFront(); } } /** * */ private void resetURL() { if (browser == null || browser.isDisposed()) { return; } Utils.execSWTThread(new AERunnable() { public void runSupport() { if (browser == null || browser.isDisposed()) { return; } String sURL = (String) browser.getData("StartURL"); context.debug("reset " + sURL); if (sURL != null && sURL.length() > 0) { String startURLUnique; String sRand = "rand=" + SystemTime.getCurrentTime(); if (sURL.indexOf("rand=") > 0) { startURLUnique = sURL.replaceAll("rand=[0-9.]+", sRand); } else if (sURL.indexOf('?') > 0) { startURLUnique = sURL + "&" + sRand; } else { startURLUnique = sURL + "?" + sRand; } browser.setUrl(startURLUnique); } } }); } /** * @param string * * @since 3.0.5.0 */ public static void refreshTab(String tabID) { if (null == tabID || tabID.length() < 1) { return; } SWTSkin skin = SWTSkinFactory.getInstance(); /* * Refreshes all except the currently active tab */ if (true == VZ_NON_ACTIVE.equals(tabID)) { // 3.2 TODO: Need to fix this up List browserViewIDs = new ArrayList(); // Check if not active view and refresh (personally, sounds dangerous) for (Iterator iterator = browserViewIDs.iterator(); iterator.hasNext();) { refreshBrowser(iterator.next().toString()); } } else { refreshBrowser(tabID); } } private static void refreshBrowser(final String browserID) { Utils.execSWTThread(new AERunnable() { public void runSupport() { UIFunctionsSWT uiSWT = UIFunctionsManagerSWT.getUIFunctionsSWT(); MultipleDocumentInterfaceSWT mdi = uiSWT==null?null:uiSWT.getMDISWT(); BaseMdiEntry entry = mdi==null?null:(BaseMdiEntry) mdi.getEntrySWT(browserID); //MdiEntrySWT entry = mdi.getEntrySWT(browserID); // Use when UIs merged if ( entry != null ){ SWTSkinObjectBrowser soBrowser = SWTSkinUtils.findBrowserSO(entry.getSkinObject()); if (soBrowser != null) { soBrowser.refresh(); return; } } SWTSkin skin = SWTSkinFactory.getInstance(); SWTSkinObject skinObject = skin.getSkinObject(browserID); if (skinObject instanceof SWTSkinObjectBrowser) { final BrowserWrapper browser = ((SWTSkinObjectBrowser) skinObject).getBrowser(); if (null != browser && false == browser.isDisposed()) { browser.refresh(); } } } }); } private void launchUrl(String url, boolean appendSuffix) { ContentNetwork cn = ContentNetworkUtils.getContentNetworkFromTarget(null); if (url.startsWith("/")){ url = cn.getExternalSiteRelativeURL(url, appendSuffix); } else if (appendSuffix) { url = cn.appendURLSuffix(url, false, true); } if (url.startsWith("http://") || url.startsWith("https://") || url.startsWith("mailto:")) { Utils.launch(url); } } private void sendEmail(final String to, final String subject, final String body) { String url = "mailto:" + to + "?subject=" + UrlUtils.encode(subject); if (body != null) { url = url + "&body=" + UrlUtils.encode(body); } Utils.launch(url); } private void copyToClipboard(final String text) { if (browser == null || browser.isDisposed()) { return; } Utils.execSWTThread(new AERunnable() { public void runSupport() { if (browser == null || browser.isDisposed()) { return; } final Clipboard cb = new Clipboard(browser.getDisplay()); TextTransfer textTransfer = TextTransfer.getInstance(); cb.setContents(new Object[] { text }, new Transfer[] { textTransfer }); cb.dispose(); } }); } private void openIrc(final String server, final String channel, final String alias) { try { PluginManager pluginManager = PluginInitializer.getDefaultInterface().getPluginManager(); PluginInterface piChat = pluginManager.getPluginInterfaceByID("azplugins"); if ( piChat == null ){ debug( "IRC plugin not found" ); }else{ UIManager manager = piChat.getUIManager(); manager.addUIListener(new UIManagerListener() { public void UIDetached(UIInstance instance) { } public void UIAttached(UIInstance instance) { if (instance instanceof UISWTInstance) { try { debug("Opening IRC channel " + channel + " on " + server + " for user " + alias); UISWTInstance swtInstance = (UISWTInstance) instance; UISWTView[] openViews = swtInstance.getOpenViews(UISWTInstance.VIEW_MAIN); for (int i = 0; i < openViews.length; i++) { UISWTView view = openViews[i]; // if only there was a way to tell if it was our IRC view.closeView(); } swtInstance.openView(UISWTInstance.VIEW_MAIN, "IRC", new String[] { server, channel, alias }); } catch (Exception e) { debug("Failure opening IRC channel " + channel + " on " + server, e); } } } }); } } catch (Exception e) { debug("Failure opening IRC channel " + channel + " on " + server, e); } } private void showBrowser(final String url, final String target, final int w, final int h, final boolean allowResize, final BrowserMessage message, final String sourceRef) { final UIFunctions functions = UIFunctionsManager.getUIFunctions(); if (functions == null) { AEThread2 thread = new AEThread2("show browser " + url, true) { public void run() { final Display display = Display.getDefault(); display.asyncExec(new AERunnable() { public void runSupport() { BrowserWindow window = new BrowserWindow( display.getActiveShell(), url, w, h, allowResize, false); window.waitUntilClosed(); message.complete(false, true, null); } }); } }; thread.start(); return; } AEThread2 thread = new AEThread2("show browser " + url, true) { public void run() { if (w == 0 && target != null) { functions.viewURL(url, target, sourceRef); } else { functions.viewURL(url, target, w, h, allowResize, false); } message.complete(false, true, null); } }; thread.start(); } }