/**
* 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.ui.swt.skin;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTError;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.*;
import org.gudy.azureus2.core3.config.COConfigurationManager;
import org.gudy.azureus2.core3.config.ParameterListener;
import org.gudy.azureus2.core3.util.AERunnable;
import org.gudy.azureus2.core3.util.AESemaphore;
import org.gudy.azureus2.core3.util.AEThread2;
import org.gudy.azureus2.core3.util.SystemTime;
import org.gudy.azureus2.core3.util.UrlUtils;
import org.gudy.azureus2.ui.swt.Utils;
import com.aelitis.azureus.core.cnetwork.ContentNetwork;
import com.aelitis.azureus.core.cnetwork.ContentNetworkManagerFactory;
import com.aelitis.azureus.core.proxy.AEProxyFactory;
import com.aelitis.azureus.ui.selectedcontent.SelectedContentManager;
import com.aelitis.azureus.ui.swt.browser.BrowserContext;
import com.aelitis.azureus.ui.swt.browser.BrowserWrapper;
import com.aelitis.azureus.ui.swt.browser.BrowserContext.loadingListener;
import com.aelitis.azureus.ui.swt.browser.listener.*;
import com.aelitis.azureus.util.UrlFilter;
/**
* @author TuxPaper
* @created Oct 9, 2006
*
*/
public class SWTSkinObjectBrowser
extends SWTSkinObjectBasic
{
private boolean generic_proxy_init_done;
private AEProxyFactory.PluginHTTPProxy generic_proxy;
private boolean generic_proxy_set;
private AESemaphore generic_proxy_sem = new AESemaphore( "sps" );
private void
initProxy(
final String target_url,
final String proxy_reason )
{
// can't make this a static initializer as class is loaded whenever we have a subscription
// in the sidebar, regardless of focus
synchronized( SWTSkinObjectBrowser.class ){
if ( generic_proxy_init_done ){
return;
}
generic_proxy_init_done = true;
}
new AEThread2( "GB_test" )
{
public void
run()
{
try{
try{
URL url = new URL( target_url );
url = UrlUtils.setProtocol( url, "https" );
url = UrlUtils.setPort( url, 443 );
boolean use_proxy = !COConfigurationManager.getStringParameter( "browser.internal.proxy.id", "none" ).equals( "none" );
if ( !use_proxy ){
Boolean looks_ok = AEProxyFactory.testPluginHTTPProxy( url, true );
use_proxy = looks_ok != null && !looks_ok;
}
if ( use_proxy ){
generic_proxy = AEProxyFactory.getPluginHTTPProxy( proxy_reason, url, true );
if ( generic_proxy != null ){
UrlFilter.getInstance().addUrlWhitelist( "https?://" + ((InetSocketAddress)generic_proxy.getProxy().address()).getAddress().getHostAddress() + ":?[0-9]*/.*" );
}
}
}catch( Throwable e ){
}
}finally{
synchronized( SWTSkinObjectBrowser.class ){
generic_proxy_set = true;
generic_proxy_sem.releaseForever();
if ( isDisposed()){
if ( generic_proxy != null ){
generic_proxy.destroy();
generic_proxy = null;
}
return;
}
}
setAutoReloadPending( false, generic_proxy == null );
if ( generic_proxy != null ){
updateBrowserProxy( generic_proxy );
}
}
}
}.start();
}
{
COConfigurationManager.addParameterListener(
"browser.internal.proxy.id",
new ParameterListener()
{
public void
parameterChanged(
String parameterName )
{
synchronized( SWTSkinObjectBrowser.class ){
if ( !generic_proxy_init_done ){
return;
}
generic_proxy_init_done = false;
generic_proxy_set = false;
if ( generic_proxy != null ){
generic_proxy.destroy();
generic_proxy = null;
}
}
}
});
}
private AEProxyFactory.PluginHTTPProxy
getGenericProxy(
String target_url,
String reason )
{
initProxy( target_url, reason );
boolean force_proxy = !COConfigurationManager.getStringParameter( "browser.internal.proxy.id", "none" ).equals( "none" );
generic_proxy_sem.reserve( force_proxy?60*1000:2500 );
synchronized( SWTSkinObjectBrowser.class ){
if ( generic_proxy_set ){
return( generic_proxy );
}else{
setAutoReloadPending( true, false );
return( null );
}
}
}
private BrowserWrapper browser;
private Composite cParent;
private Composite cArea;
private String sStartURL;
private BrowserContext context;
private String urlToUse;
private boolean forceVisibleAfterLoad;
private boolean use_generic_proxy = false;
private String proxy_reason = null;
private boolean autoReloadPending = false;
private static boolean doneTheUglySWTFocusHack = false;
/**
* @param skin
* @param properties
* @param sID
* @param sConfigID
* @param type
* @param parent
*/
public SWTSkinObjectBrowser(SWTSkin skin, SWTSkinProperties properties,
String sID, String sConfigID, SWTSkinObject parent) {
super(skin, properties, sID, sConfigID, "browser", parent);
cParent = parent == null ? skin.getShell()
: (Composite) parent.getControl();
cArea = cParent;
cArea = new Canvas(cParent, SWT.NO_BACKGROUND);
cArea.setLayout(new FormLayout());
setControl(cArea);
if (cParent.isVisible()) {
init();
} else {
addListener(new SWTSkinObjectListener() {
public Object eventOccured(SWTSkinObject skinObject, int eventType,
Object params) {
if (eventType == SWTSkinObjectListener.EVENT_SHOW) {
removeListener(this);
init();
}
return null;
}
});
}
}
public void init() {
if (browser != null && !browser.isDisposed()) {
return;
}
try {
browser = new BrowserWrapper(cArea, Utils.getInitialBrowserStyle(SWT.NONE));
browser.setLayoutData(Utils.getFilledFormData());
browser.getParent().layout(true);
} catch (SWTError e) {
System.err.println("Browser: " + e.toString());
return;
}
Control widgetIndicator = null;
String sIndicatorWidgetID = properties.getStringValue(sConfigID
+ ".indicator");
if (sIndicatorWidgetID != null) {
SWTSkinObject skinObjectIndicator = skin.getSkinObjectByID(sIndicatorWidgetID);
if (skinObjectIndicator != null) {
widgetIndicator = skinObjectIndicator.getControl();
}
}
String browserID = properties.getStringValue(sConfigID + ".view");
if (browserID == null) {
browserID = sID;
}
forceVisibleAfterLoad = properties.getBooleanValue(sConfigID + ".forceVisibleAfterLoad", true);
context = new BrowserContext(browserID, browser, widgetIndicator, forceVisibleAfterLoad);
if ( autoReloadPending ){
context.setAutoReloadPending( autoReloadPending, false );
}
boolean noListeners = properties.getBooleanValue(sConfigID + ".browser.nolisteners", false);
if (!noListeners) {
context.addMessageListener(new TorrentListener());
context.addMessageListener(new VuzeListener());
context.addMessageListener(new DisplayListener(browser));
context.addMessageListener(new ConfigListener(browser));
}
boolean popouts = properties.getBooleanValue(sConfigID + ".browser.allowPopouts", true);
context.setAllowPopups(popouts);
context.addListener(new loadingListener() {
public void browserLoadingChanged(boolean loading, String url) {
if (loading && browser.isVisible()) {
// hack so search results page doesn't clear cur selected
if (UrlFilter.getInstance().urlCanRPC(url)) {
SelectedContentManager.clearCurrentlySelectedContent();
}
}
}
});
String url = urlToUse != null ? urlToUse : sStartURL != null ? sStartURL
: properties.getStringValue(sConfigID + ".url", (String) null);
if (url != null) {
setURL(url);
}
}
public BrowserWrapper getBrowser() {
if (browser == null) {
init();
}
return browser;
}
public void setURL(final String url) {
urlToUse = url;
if (browser == null) {
return;
}
Utils.execSWTThread(new AERunnable() {
public void runSupport() {
if (browser.isDisposed()) {
return;
}
if (url == null) {
browser.setText("");
} else {
String urlToUse = url;
if (UrlFilter.getInstance().urlCanRPC(url)){
ContentNetwork contentNetwork = ContentNetworkManagerFactory.getSingleton().getContentNetwork(
context.getContentNetworkID());
if (contentNetwork != null) {
urlToUse = contentNetwork.appendURLSuffix(urlToUse,
false, true);
}
}
if (browser != null) {
setBrowserURL(urlToUse);
if(browser.isVisible()) {
browser.setFocus();
}
}
}
if (sStartURL == null) {
sStartURL = url;
if (browser != null) {
browser.setData("StartURL", url);
}
}
//System.out.println(SystemTime.getCurrentTime() + "] Set URL: " + url);
}
});
}
public void restart() {
if (null != sStartURL) {
String startURLUnique;
String sRand = "rand=" + SystemTime.getCurrentTime();
if (sStartURL.indexOf("rand=") > 0) {
startURLUnique = sStartURL.replaceAll("rand=[0-9.]+", sRand);
} else if (sStartURL.indexOf('?') > 0) {
startURLUnique = sStartURL + "&" + sRand;
} else {
startURLUnique = sStartURL + "?" + sRand;
}
System.out.println(startURLUnique);
setURL(startURLUnique);
}
}
/**
*
*/
public void layout() {
cParent.layout();
}
public BrowserContext getContext() {
return context;
}
public String getStartURL() {
return sStartURL;
}
public void setStartURL(String url) {
sStartURL = url;
if (null != browser) {
if (urlToUse == null) {
setBrowserURL( url );
}
browser.setData("StartURL", url);
}
}
private void
setBrowserURL(
String url )
{
if ( use_generic_proxy ){
browser.setData("CurrentURL", url);
AEProxyFactory.PluginHTTPProxy proxy = getGenericProxy( url, proxy_reason );
if ( proxy != null ){
url = proxy.proxifyURL( url );
browser.setData("StartURL", url);
}
}
browser.setUrl( url );
}
private void
updateBrowserProxy(
final AEProxyFactory.PluginHTTPProxy proxy )
{
Utils.execSWTThread(
new Runnable()
{
public void
run()
{
if ( browser != null && !browser.isDisposed()){
String url = (String)browser.getData( "CurrentURL" );
if ( url != null ){
url = proxy.proxifyURL( url );;
browser.setData("StartURL", url);
browser.setUrl( url );
}
}
}
});
}
public void
enablePluginProxy(
String reason )
{
use_generic_proxy = true;
proxy_reason = reason;
}
public void
setAutoReloadPending(
boolean is_pending,
boolean aborted )
{
autoReloadPending = is_pending;
BrowserContext bc = context;
if ( bc != null ){
bc.setAutoReloadPending( is_pending, aborted );
}
}
public boolean isPageLoading() {
return context == null ? false : context.isPageLoading();
}
// @see com.aelitis.azureus.ui.swt.skin.SWTSkinObjectBasic#setVisible(boolean)
public boolean setIsVisible(final boolean visible, boolean walkup) {
boolean changed = super.setIsVisible(visible, walkup);
if (changed) {
// notify browser after we've fully processed visibility
Utils.execSWTThreadLater(0, new AERunnable() {
public void runSupport() {
if (!isDisposed() && context != null) {
context.sendBrowserMessage("browser", visible ? "shown" : "hidden");
}
}
});
}
return changed;
}
public void addListener(loadingListener l) {
if (context != null) {
context.addListener(l);
}
}
public void refresh() {
Utils.execSWTThread(new AERunnable() {
public void runSupport() {
if (browser != null && !browser.isDisposed()) {
browser.refresh();
}
}
});
}
public void dispose() {
if ( generic_proxy != null ){
generic_proxy.destroy();
generic_proxy = null;
}
super.dispose();
}
}