/*
* Created on Aug 14, 2012
* Created by Paul Gardner
*
* Copyright 2012 Vuze, Inc. 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; version 2 of the License only.
*
* 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.
*/
package com.aelitis.azureus.core.proxy.impl.swt;
import java.net.InetAddress;
import java.net.Proxy;
import java.util.List;
import org.eclipse.swt.graphics.Image;
import org.gudy.azureus2.core3.config.COConfigurationManager;
import org.gudy.azureus2.core3.config.ParameterListener;
import org.gudy.azureus2.core3.download.DownloadManager;
import org.gudy.azureus2.core3.internat.MessageText;
import org.gudy.azureus2.core3.peer.PEPeer;
import org.gudy.azureus2.core3.peer.PEPeerManager;
import org.gudy.azureus2.core3.util.AERunnable;
import org.gudy.azureus2.core3.util.HostNameToIPResolver;
import org.gudy.azureus2.core3.util.SystemTime;
import org.gudy.azureus2.plugins.PluginInterface;
import org.gudy.azureus2.plugins.ui.UIInstance;
import org.gudy.azureus2.plugins.ui.UIManagerListener;
import org.gudy.azureus2.plugins.ui.menus.MenuItem;
import org.gudy.azureus2.plugins.ui.menus.MenuItemListener;
import org.gudy.azureus2.pluginsimpl.local.PluginInitializer;
import org.gudy.azureus2.ui.swt.Utils;
import org.gudy.azureus2.ui.swt.plugins.UISWTInstance;
import org.gudy.azureus2.ui.swt.plugins.UISWTStatusEntry;
import org.gudy.azureus2.ui.swt.plugins.UISWTStatusEntryListener;
import org.gudy.azureus2.ui.swt.views.stats.StatsView;
import com.aelitis.azureus.core.AzureusCore;
import com.aelitis.azureus.core.proxy.impl.AEProxySelectorImpl;
import com.aelitis.azureus.ui.UIFunctions;
import com.aelitis.azureus.ui.UIFunctionsManager;
import com.aelitis.azureus.ui.common.updater.UIUpdater;
import com.aelitis.azureus.ui.swt.imageloader.ImageLoader;
public class
AEProxySelectorSWTImpl
{
private AzureusCore core;
private AEProxySelectorImpl proxy_selector;
private UISWTStatusEntry status;
private Image icon_grey;
private Image icon_green;
private Image icon_yellow;
private Image icon_red;
private Image last_icon;
private boolean flag_incoming;
{
COConfigurationManager.addAndFireParameterListener(
"Proxy.SOCKS.ShowIcon.FlagIncoming",
new ParameterListener()
{
public void parameterChanged(String name) {
flag_incoming = COConfigurationManager.getBooleanParameter( name );
}
});
}
private long last_bad_peer_update;
private volatile boolean is_visible;
public
AEProxySelectorSWTImpl(
AzureusCore _core,
AEProxySelectorImpl _proxy_selector )
{
core = _core;
proxy_selector = _proxy_selector;
final PluginInterface default_pi = PluginInitializer.getDefaultInterface();
default_pi.getUIManager().addUIListener(
new UIManagerListener()
{
public void
UIAttached(
final UIInstance instance )
{
if ( instance instanceof UISWTInstance ){
UIFunctions uif = UIFunctionsManager.getUIFunctions();
if ( uif != null ){
uif.getUIUpdater().addListener(
new UIUpdater.UIUpdaterListener()
{
public void
updateComplete(
int count )
{
updateStatus();
}
});
}
Utils.execSWTThread(
new AERunnable()
{
public void
runSupport()
{
ImageLoader imageLoader = ImageLoader.getInstance();
icon_grey = imageLoader.getImage( "grayled" );
icon_yellow = imageLoader.getImage( "yellowled" );
icon_green = imageLoader.getImage( "greenled" );
icon_red = imageLoader.getImage( "redled" );
final UISWTInstance ui_instance = (UISWTInstance)instance;
status = ui_instance.createStatusEntry();
status.setText( "SOCKS" );
status.setImageEnabled( true );
status.setImage( icon_grey );
final String icon_param = "Proxy.SOCKS.ShowIcon";
boolean enable_proxy = COConfigurationManager.getBooleanParameter("Enable.Proxy");
boolean enable_socks = COConfigurationManager.getBooleanParameter("Enable.SOCKS");
is_visible =
enable_proxy && enable_socks &&
COConfigurationManager.getBooleanParameter( icon_param );
status.setVisible( is_visible );
if ( is_visible ){
updateStatus();
}
final MenuItem mi_show =
default_pi.getUIManager().getMenuManager().addMenuItem(
status.getMenuContext(),
"pairing.ui.icon.show" );
mi_show.setStyle( MenuItem.STYLE_CHECK );
mi_show.setData( new Boolean( is_visible ));
mi_show.addListener(
new MenuItemListener()
{
public void
selected(
MenuItem menu,
Object target )
{
COConfigurationManager.setParameter( icon_param, false );
}
});
COConfigurationManager.addParameterListener(
new String[]{ "Enable.Proxy", "Enable.SOCKS", icon_param },
new ParameterListener()
{
public void
parameterChanged(
String parameterName)
{
boolean enable_proxy = COConfigurationManager.getBooleanParameter("Enable.Proxy");
boolean enable_socks = COConfigurationManager.getBooleanParameter("Enable.SOCKS");
is_visible =
enable_proxy && enable_socks &&
COConfigurationManager.getBooleanParameter( icon_param );
status.setVisible( is_visible );
mi_show.setData( new Boolean( is_visible ));
if ( is_visible ){
updateStatus();
}
}
});
MenuItem mi_sep =
default_pi.getUIManager().getMenuManager().addMenuItem(
status.getMenuContext(),
"" );
mi_sep.setStyle( MenuItem.STYLE_SEPARATOR );
MenuItem mi_options =
default_pi.getUIManager().getMenuManager().addMenuItem(
status.getMenuContext(),
"MainWindow.menu.view.configuration" );
mi_options.addListener(
new MenuItemListener()
{
public void
selected(
MenuItem menu,
Object target )
{
UIFunctions uif = UIFunctionsManager.getUIFunctions();
if ( uif != null ){
uif.openView( UIFunctions.VIEW_CONFIG, "proxy" );
}
}
});
UISWTStatusEntryListener click_listener =
new UISWTStatusEntryListener()
{
public void
entryClicked(
UISWTStatusEntry entry )
{
UIFunctions uif = UIFunctionsManager.getUIFunctions();
if ( uif != null ){
uif.getMDI().loadEntryByID( StatsView.VIEW_ID, true, false, "TransferStatsView" );
}
}
};
status.setListener( click_listener );
}
});
}
}
public void
UIDetached(
UIInstance instance )
{
}
});
}
private void
updateStatus()
{
if ( !is_visible ){
return;
}
Image icon;
String tip_key;
Proxy active_proxy = proxy_selector.getActiveProxy();
long now = SystemTime.getMonotonousTime();
if ( active_proxy == null ){
icon = icon_grey;
tip_key = "label.inactive";
}else{
long last_con = proxy_selector.getLastConnectionTime();
long last_fail = proxy_selector.getLastFailTime();
long con_ago = now - last_con;
long fail_ago = now - last_fail;
if ( last_fail < 0 ){
icon = icon_green;
tip_key = "PeerManager.status.ok";
}else{
if ( fail_ago > 60*1000 ){
if ( con_ago < fail_ago ){
icon = icon_green;
tip_key = "PeerManager.status.ok";
}else{
icon = icon_grey;
tip_key = "PeersView.state.pending";
}
}else{
icon = icon_yellow;
tip_key = "label.con_prob";
}
}
}
if ( flag_incoming ){
boolean bad_incoming = false;
if ( now - last_bad_peer_update > 15*1000 ){
last_bad_peer_update = now;
List<DownloadManager> dms = core.getGlobalManager().getDownloadManagers();
for ( DownloadManager dm: dms ){
PEPeerManager pm = dm.getPeerManager();
if ( pm != null ){
if ( pm.getNbRemoteTCPConnections() + pm.getNbRemoteUDPConnections() + pm.getNbRemoteUTPConnections() > 0 ){
List<PEPeer> peers = pm.getPeers();
for ( PEPeer peer: peers ){
if ( peer.isIncoming()){
if ( !peer.isLANLocal()){
try{
if ( InetAddress.getByAddress( HostNameToIPResolver.hostAddressToBytes( peer.getIp())).isLoopbackAddress()){
continue;
}
}catch( Throwable e ){
}
bad_incoming = true;
break;
}
}
}
}
}
if ( bad_incoming ){
break;
}
}
}else if ( last_icon == icon_red ){
bad_incoming = true;
}
if ( bad_incoming ){
icon = icon_red;
tip_key = "proxy.socks.bad.incoming";
}
}
if ( last_icon != icon ){
final Image f_icon = icon;
final String f_key = tip_key;
Utils.execSWTThread(
new AERunnable()
{
public void
runSupport()
{
last_icon = f_icon;
status.setImage( f_icon );
status.setTooltipText(
MessageText.getString(
"proxy.socks.ui.icon.tip",
new String[]{ MessageText.getString(f_key)} ));
}
});
}
}
}