/** * 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 63.529,40 euros * 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France. * */ package com.aelitis.azureus.ui.swt.extlistener; import java.util.Collections; import java.util.Map; import org.gudy.azureus2.core3.config.COConfigurationManager; import org.gudy.azureus2.core3.util.Debug; import org.gudy.azureus2.ui.swt.donations.DonationWindow; import com.aelitis.azureus.core.AzureusCore; import com.aelitis.azureus.core.cnetwork.ContentNetwork; import com.aelitis.azureus.core.cnetwork.ContentNetworkManagerFactory; import com.aelitis.azureus.core.messenger.ClientMessageContext; import com.aelitis.azureus.core.messenger.PlatformMessenger; import com.aelitis.azureus.core.messenger.browser.BrowserMessage; import com.aelitis.azureus.core.messenger.browser.BrowserMessageDispatcher; import com.aelitis.azureus.ui.UIFunctions; import com.aelitis.azureus.ui.UIFunctionsManager; import com.aelitis.azureus.ui.mdi.MdiEntry; import com.aelitis.azureus.ui.mdi.MultipleDocumentInterface; import com.aelitis.azureus.ui.selectedcontent.DownloadUrlInfo; import com.aelitis.azureus.ui.selectedcontent.DownloadUrlInfoContentNetwork; import com.aelitis.azureus.ui.swt.browser.listener.ConfigListener; import com.aelitis.azureus.ui.swt.browser.listener.DisplayListener; import com.aelitis.azureus.ui.swt.browser.listener.TorrentListener; import com.aelitis.azureus.ui.swt.shells.main.MainWindow; import com.aelitis.azureus.ui.swt.utils.TorrentUIUtilsV3; import com.aelitis.azureus.ui.swt.views.skin.SkinViewManager; import com.aelitis.azureus.ui.swt.views.skin.sidebar.SideBar; import com.aelitis.azureus.ui.swt.views.skin.sidebar.SideBarEntrySWT; import com.aelitis.azureus.util.*; /** * @author TuxPaper * @created Feb 7, 2008 * */ public class StimulusRPC { /** * Hooks some listeners * @param mainWindow */ public static void hookListeners(final AzureusCore core, final MainWindow mainWindow) { /* * This code block was moved here from being in-line in MainWindow */ ExternalStimulusHandler.addListener(new ExternalStimulusListener() { public boolean receive(String name, Map values) { try { if (values == null) { return false; } if (!name.equals("AZMSG")) { return false; } Object valueObj = values.get("value"); if (!(valueObj instanceof String)) { return false; } String value = (String) valueObj; ClientMessageContext context = PlatformMessenger.getClientMessageContext(); if (context == null) { return false; } // AZMSG;x;listener-id;op-id;params String[] splitVal = value.split(";", 5); if (splitVal.length != 5) { return false; } String lId = splitVal[2]; String opId = splitVal[3]; Map decodedMap = JSONUtils.decodeJSON(splitVal[4]); if (decodedMap == null) { decodedMap = Collections.EMPTY_MAP; } if (opId.equals(DisplayListener.OP_OPEN_URL)) { String url = MapUtils.getMapString(decodedMap, "url", null); if (!decodedMap.containsKey("target")) { context.debug("no target for url: " + url); } else if (UrlFilter.getInstance().urlIsBlocked(url)) { context.debug("url blocked: " + url); } else if (!UrlFilter.getInstance().urlCanRPC(url)) { context.debug("url not in whitelistL " + url); } else { // implicit bring to front final UIFunctions functions = UIFunctionsManager.getUIFunctions(); if (functions != null) { functions.bringToFront(); } // this is actually sync.. so we could add a completion listener // and return the boolean result if we wanted/needed BrowserMessageDispatcher dispatcher = context.getDispatcher(); if (dispatcher != null) { dispatcher.dispatch(new BrowserMessage(lId, opId, decodedMap)); } else { context.debug("No dispatcher for StimulusRPC" + opId); } return true; } } else if (opId.equals(TorrentListener.OP_LOAD_TORRENT)) { if (decodedMap.containsKey("b64")) { String b64 = MapUtils.getMapString(decodedMap, "b64", null); return TorrentListener.loadTorrentByB64(core, b64); } else if (decodedMap.containsKey("url")) { String url = MapUtils.getMapString(decodedMap, "url", null); boolean blocked = UrlFilter.getInstance().urlIsBlocked(url); // Security: Only allow torrents from whitelisted urls if (blocked) { Debug.out("stopped loading torrent URL because it's not in whitelist"); return false; } boolean playNow = MapUtils.getMapBoolean(decodedMap, "play-now", false); boolean playPrepare = MapUtils.getMapBoolean(decodedMap, "play-prepare", false); boolean bringToFront = MapUtils.getMapBoolean(decodedMap, "bring-to-front", true); // Content Network of context is invalid because it's the // internal one used for anythin. Get network id from params instead long contentNetworkID = MapUtils.getMapLong(decodedMap, "content-network", ConstantsVuze.getDefaultContentNetwork().getID()); ContentNetwork cn = ContentNetworkManagerFactory.getSingleton().getContentNetwork(contentNetworkID); if (cn == null) { cn = ConstantsVuze.getDefaultContentNetwork(); } DownloadUrlInfo dlInfo = new DownloadUrlInfoContentNetwork(url, cn); dlInfo.setReferer(MapUtils.getMapString(decodedMap, "referer", null)); TorrentUIUtilsV3.loadTorrent(dlInfo, playNow, playPrepare, bringToFront); return true; } } else if (opId.equals("is-ready")) { // The platform needs to know when it can call open-url, and it // determines this by the is-ready function return mainWindow.isReady(); } else if (opId.equals("is-version-ge")) { if (decodedMap.containsKey("version")) { String id = MapUtils.getMapString(decodedMap, "id", "client"); String version = MapUtils.getMapString(decodedMap, "version", ""); if (id.equals("client")) { return org.gudy.azureus2.core3.util.Constants.compareVersions( org.gudy.azureus2.core3.util.Constants.AZUREUS_VERSION, version) >= 0; } } return false; } else if (opId.equals("is-active-tab")) { if (decodedMap.containsKey("tab")) { String tabID = MapUtils.getMapString(decodedMap, "tab", ""); if (tabID.length() > 0) { // 3.2 TODO: Should we be checking for partial matches? MultipleDocumentInterface mdi = UIFunctionsManager.getUIFunctions().getMDI(); MdiEntry entry = mdi.getCurrentEntry(); if (entry != null) { return entry.getId().equals(tabID); } } } return false; } else if (ConfigListener.DEFAULT_LISTENER_ID.equals(lId)) { if (ConfigListener.OP_NEW_INSTALL.equals(opId)) { return COConfigurationManager.isNewInstall(); } else if (ConfigListener.OP_CHECK_FOR_UPDATES.equals(opId)) { ConfigListener.checkForUpdates(); return true; } else if (ConfigListener.OP_LOG_DIAGS.equals(opId)) { ConfigListener.logDiagnostics(); return true; } } else if (DisplayListener.DEFAULT_LISTENER_ID.equals(lId)) { if (DisplayListener.OP_REFRESH_TAB.equals(opId)) { DisplayListener.refreshTab(MapUtils.getMapString(decodedMap, "browser-id", "")); } else if (DisplayListener.OP_SWITCH_TO_TAB.equals(opId)) { DisplayListener.switchToTab(MapUtils.getMapString(decodedMap, "target", ""), MapUtils.getMapString(decodedMap, "source-ref", null)); } } else if (DisplayListener.OP_SHOW_DONATION_WINDOW.equals(lId)) { DonationWindow.open(true, MapUtils.getMapString(decodedMap, "source-ref", "SRPC")); } if (System.getProperty( "browser.route.all.external.stimuli.for.testing", "false").equalsIgnoreCase( "true")) { BrowserMessageDispatcher dispatcher = context.getDispatcher(); if (dispatcher != null) { dispatcher.dispatch(new BrowserMessage(lId, opId, decodedMap)); } } else { System.err.println("Unhandled external stimulus: " + value); } } catch (Exception e) { Debug.out(e); } return false; } public int query(String name, Map values) { return (Integer.MIN_VALUE); } }); } }