diff --git a/lib/jitsi-defaults.properties b/lib/jitsi-defaults.properties index ac2f01f19..c9987ed87 100644 --- a/lib/jitsi-defaults.properties +++ b/lib/jitsi-defaults.properties @@ -179,3 +179,16 @@ net.java.sip.communicator.plugin.pluginmanager.SYSTEM_BUNDLES=\ gnu.java.zrtp4j,\ SDES4J,\ log4j + +#a colon-separated list of commands to be tried as browsers on linux +net.java.sip.communicator.impl.browserlauncher.LINUX_BROWSERS=xdg-open\ + :gnome-open\ + :iceweasel\ + :firefox\ + :chromium-browser\ + :google-chrome\ + :opera\ + :konqueror\ + :epiphany\ + :mozilla\ + :netscape diff --git a/src/net/java/sip/communicator/impl/browserlauncher/BrowserLauncherActivator.java b/src/net/java/sip/communicator/impl/browserlauncher/BrowserLauncherActivator.java index b3e2c946c..3dabdc802 100644 --- a/src/net/java/sip/communicator/impl/browserlauncher/BrowserLauncherActivator.java +++ b/src/net/java/sip/communicator/impl/browserlauncher/BrowserLauncherActivator.java @@ -8,6 +8,8 @@ import net.java.sip.communicator.service.browserlauncher.*; import net.java.sip.communicator.util.*; +import org.jitsi.service.configuration.*; +import org.osgi.framework.*; /** * Implements BundleActivator for the browserlauncher bundle. @@ -19,6 +21,15 @@ public class BrowserLauncherActivator extends SimpleServiceActivator { + /** + * The BundleContext + */ + private static BundleContext bundleContext = null; + + /** + * The ServiceConfiguration to be used by this service. + */ + private static ConfigurationService configService = null; /** * Creates new instance of BrowserLauncherActivator. @@ -36,4 +47,39 @@ protected BrowserLauncherImpl createServiceImpl() { return new BrowserLauncherImpl(); } + + /** + * {@inheritDoc} + * + * Saves bundleContext locally. + */ + @Override + public void start(BundleContext bundleContext) + throws Exception + { + BrowserLauncherActivator.bundleContext = bundleContext; + + super.start(bundleContext); + } + + /** + * Returns the ConfigurationService obtained from the + * the BundleContext + * + * @return the ConfigurationService obtained from the + * the BundleContext + */ + public static ConfigurationService getConfigurationService() + { + if (configService == null && bundleContext != null) + { + ServiceReference serviceReference = bundleContext + .getServiceReference(ConfigurationService.class.getName()); + + configService = (ConfigurationService)bundleContext + .getService(serviceReference); + } + + return configService; + } } diff --git a/src/net/java/sip/communicator/impl/browserlauncher/BrowserLauncherImpl.java b/src/net/java/sip/communicator/impl/browserlauncher/BrowserLauncherImpl.java index 0a0912de3..2f7df15f7 100644 --- a/src/net/java/sip/communicator/impl/browserlauncher/BrowserLauncherImpl.java +++ b/src/net/java/sip/communicator/impl/browserlauncher/BrowserLauncherImpl.java @@ -9,6 +9,7 @@ import net.java.sip.communicator.service.browserlauncher.*; import net.java.sip.communicator.util.Logger; +import org.jitsi.service.configuration.*; import org.jitsi.util.*; import com.apple.eio.*; @@ -23,7 +24,12 @@ public class BrowserLauncherImpl implements BrowserLauncherService { - + /** + * The name of the property which holds the colon-separated list of browsers + * to try on linux. + */ + private static String LINUX_BROWSERS_PROP_NAME + = "net.java.sip.communicator.impl.browserlauncher.LINUX_BROWSERS"; /** * The Logger instance used by the BrowserLauncherImpl * class and its instances for logging output. @@ -31,6 +37,11 @@ public class BrowserLauncherImpl private static final Logger logger = Logger.getLogger(BrowserLauncherImpl.class); + /** + * The name of the browser executable to use on linux + */ + private static String linuxBrowser = null; + /** * Opens the specified URL in an OS-specific associated browser. * @@ -56,35 +67,56 @@ else if (OSUtils.IS_WINDOWS) } else { - String[] browsers - = new String[] - { - "google-chrome", - "chromium-browser", - "firefox", - "iceweasel", - "opera", - "konqueror", - "epiphany", - "mozilla", - "netscape", - "gnome-open" - }; - - Runtime runtime = Runtime.getRuntime(); - String browser = null; - - for (String b : browsers) - if (runtime.exec(new String[] { "which", b }).waitFor() == 0) - browser = b; + String browser = getLinuxBrowser(); if (browser == null) - throw new Exception("Could not find web browser"); + logger.error("Could not find web browser"); else - runtime.exec(new String[] { browser, url }); + Runtime.getRuntime().exec(new String[]{browser, url}); } } + /** + * Gets the name (or absolute path) to the executable to use as a browser + * on linux. + * + * @return the name (or absolute path) to the executable to use as a browser + * on linux. + * + * @throws Exception on failure from Runtime.exec() + */ + private String getLinuxBrowser() + throws Exception + { + if (linuxBrowser == null) + { + ConfigurationService cfg + = BrowserLauncherActivator.getConfigurationService(); + if (cfg != null) + { + String browsers= cfg.getString(LINUX_BROWSERS_PROP_NAME); + if (browsers== null) + { + logger.error("Required property not set: " + + LINUX_BROWSERS_PROP_NAME); + return null; + } + + Runtime runtime = Runtime.getRuntime(); + for (String b : browsers.split(":")) + { + if (runtime.exec(new String[] { "which", b }).waitFor() == 0) + { + linuxBrowser = b; + break; + } + } + } + } + + return linuxBrowser; + } + /** * Tries to open the specified URL in a browser. The attempt is asynchronously * executed and does not wait for possible errors related to the launching diff --git a/src/net/java/sip/communicator/impl/browserlauncher/browserlauncher.manifest.mf b/src/net/java/sip/communicator/impl/browserlauncher/browserlauncher.manifest.mf index c093bcfc4..5a79b05b3 100644 --- a/src/net/java/sip/communicator/impl/browserlauncher/browserlauncher.manifest.mf +++ b/src/net/java/sip/communicator/impl/browserlauncher/browserlauncher.manifest.mf @@ -6,6 +6,7 @@ Bundle-Version: 0.0.1 Bundle-SymbolicName: net.java.sip.communicator.browserlauncher Export-Package: net.java.sip.communicator.service.browserlauncher Import-Package: org.osgi.framework, + org.jitsi.service.configuration, org.jitsi.util, net.java.sip.communicator.util, net.java.sip.communicator.service.browserlauncher,