/** * Copyright (C) 2006 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.core.messenger.config; import java.util.*; import java.util.regex.Pattern; import org.gudy.azureus2.core3.config.COConfigurationManager; import org.gudy.azureus2.core3.internat.MessageText; import org.gudy.azureus2.core3.util.Debug; import org.gudy.azureus2.core3.util.SystemTime; import org.gudy.azureus2.platform.PlatformManager; import org.gudy.azureus2.platform.PlatformManagerFactory; import com.aelitis.azureus.core.messenger.PlatformMessage; import com.aelitis.azureus.core.messenger.PlatformMessenger; import com.aelitis.azureus.core.messenger.PlatformMessengerListener; import com.aelitis.azureus.core.torrent.PlatformTorrentUtils; import com.aelitis.azureus.core.util.CopyOnWriteList; import com.aelitis.azureus.util.*; /** * @author TuxPaper * @created Sep 26, 2006 * */ public class PlatformConfigMessenger { public static final String LISTENER_ID = "config"; private static final String OP_LOG_PLUGIN = "log-plugin"; private static boolean allowSendDeviceList = false; private static int iRPCVersion = 0; private static String playAfterURL = null; private static boolean sendStats = true; private static boolean doUrlQOS = false; private static boolean platformLoginComplete = false; protected static List platformLoginCompleteListeners = Collections.EMPTY_LIST; private static CopyOnWriteList<String> externalLinks = new CopyOnWriteList<String>(); public static void login(long maxDelayMS) { PlatformManager pm = PlatformManagerFactory.getPlatformManager(); Object[] params = new Object[] { "version", org.gudy.azureus2.core3.util.Constants.AZUREUS_VERSION, "locale", MessageText.getCurrentLocale().toString(), "vid", COConfigurationManager.getStringParameter("ID"), }; PlatformMessage message = new PlatformMessage("AZMSG", LISTENER_ID, "login", params, maxDelayMS); PlatformMessengerListener listener = new PlatformMessengerListener() { public void replyReceived(PlatformMessage message, String replyType, Map reply) { if (reply == null) { return; } boolean allowMulti = MapUtils.getMapBoolean(reply, "allow-multi-rpc", PlatformMessenger.getAllowMulti()); PlatformMessenger.setAllowMulti(allowMulti); try { List listURLs = (List) MapUtils.getMapObject(reply, "url-whitelist", null, List.class); if (listURLs != null) { for (int i = 0; i < listURLs.size(); i++) { String string = (String) listURLs.get(i); UrlFilter.getInstance().addUrlWhitelist(string); } } } catch (Exception e) { Debug.out(e); } try { List listURLs = (List) MapUtils.getMapObject(reply, "url-blacklist", null, List.class); if (listURLs != null) { for (int i = 0; i < listURLs.size(); i++) { String string = (String) listURLs.get(i); UrlFilter.getInstance().addUrlBlacklist(string); } } } catch (Exception e) { Debug.out(e); } try { List listDomains = (List) MapUtils.getMapObject(reply, "tracker-domains", null, List.class); if (listDomains != null) { for (int i = 0; i < listDomains.size(); i++) { String s = (String) listDomains.get(i); PlatformTorrentUtils.addPlatformHost(s); PlatformMessenger.debug("v3.login: got tracker domain of " + s); } } } catch (Exception e) { Debug.out(e); } try { List list = MapUtils.getMapList(reply, "external-links", Collections.EMPTY_LIST); externalLinks.addAll(list); } catch (Exception e) { Debug.out(e); } try { sendStats = MapUtils.getMapBoolean(reply, "send-stats", false); doUrlQOS = MapUtils.getMapBoolean(reply, "do-url-qos", false); allowSendDeviceList = MapUtils.getMapBoolean(reply, "send-device-list", false); } catch (Exception e) { } try { iRPCVersion = MapUtils.getMapInt(reply, "rpc-version", 0); playAfterURL = (String) MapUtils.getMapString(reply, "play-after-url", null); } catch (Exception e) { Debug.out(e); } platformLoginComplete = true; Object[] listeners = platformLoginCompleteListeners.toArray(); platformLoginCompleteListeners = Collections.EMPTY_LIST; for (int i = 0; i < listeners.length; i++) { try { PlatformLoginCompleteListener l = (PlatformLoginCompleteListener) listeners[i]; l.platformLoginComplete(); } catch (Exception e) { Debug.out(e); } } } public void messageSent(PlatformMessage message) { } }; PlatformMessenger.pushMessageNow(message, listener); } public static void logPlugin(String event, String pluginID) { boolean send_info = COConfigurationManager.getBooleanParameter( "Send Version Info" ); if (!send_info || true) { return; } try { PlatformMessage message = new PlatformMessage("AZMSG", LISTENER_ID, OP_LOG_PLUGIN, new Object[] { "event", event, "plugin-id", pluginID, }, 5000); PlatformMessenger.queueMessage(message, null); } catch (Exception e) { Debug.out(e); } } public static void sendUsageStats(Map stats, long timestamp, String version, PlatformMessengerListener l) { if (!sendStats) { return; } try { PlatformMessage message = new PlatformMessage("AZMSG", LISTENER_ID, "send-usage-stats2", new Object[] { "stats", stats, "version", version, "timestamp", new Long(timestamp), "ago-ms", new Long(SystemTime.getCurrentTime() - timestamp), }, 5000); PlatformMessenger.queueMessage(message, l); } catch (Exception e) { Debug.out(e); } } public static void sendVersionServerMap(Map mapVerServer) { boolean send_info = COConfigurationManager.getBooleanParameter("Send Version Info"); if (!send_info || true) { //TODO if we ever re-enable this rpc, need to fix it being called 2x back-to-back bug.... return; } try { PlatformMessage message = new PlatformMessage("AZMSG", LISTENER_ID, "send-version-info", mapVerServer, 5000); PlatformMessenger.queueMessage(message, null); } catch (Exception e) { Debug.out(e); } } public static interface GetBrowseSectionsReplyListener { public void messageSent(); public void replyReceived(Map[] browseSections); } /** * @return the iRPCVersion */ public static int getRPCVersion() { return iRPCVersion; } public static String getPlayAfterURL() { return playAfterURL; } public static boolean allowSendStats() { return sendStats; } /** * @return * * @since 4.0.0.1 */ public static boolean doUrlQOS() { return doUrlQOS; } public static void addPlatformLoginCompleteListener( PlatformLoginCompleteListener l) { try { if (l == null) { return; } if (platformLoginComplete) { l.platformLoginComplete(); return; } if (platformLoginCompleteListeners == Collections.EMPTY_LIST) { platformLoginCompleteListeners = new ArrayList(1); } platformLoginCompleteListeners.add(l); } catch (Exception e) { Debug.out(e); } } public static interface PlatformLoginCompleteListener { public void platformLoginComplete(); } public static boolean allowSendDeviceList() { return allowSendDeviceList; } public static boolean areLinksExternal(String url) { for (String regex : externalLinks) { try { if (Pattern.compile(regex).matcher(url).find()) { return true; } } catch (Exception e) { } } return false; } public static void addLinkExternal(String link) { if (externalLinks.contains(link)) { return; } externalLinks.add(link); } }