/* * Jitsi, the OpenSource Java VoIP and Instant Messaging client. * * Copyright @ 2015 Atlassian Pty Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.java.sip.communicator.impl.browserlauncher; 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.*; /** * Implements a <tt>BrowserLauncherService</tt> which opens a specified URL in * an OS-specific associated browser. * * @author Yana Stamcheva * @author Lubomir Marinov */ 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 <tt>Logger</tt> instance used by the <tt>BrowserLauncherImpl</tt> * class and its instances for logging output. */ 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. * * @param url a <tt>String</tt> value which represents the URL to be opened * in a browser * @throws Exception if no associated browser was found for the specified * URL or there was an error during the instruction of the found associated * browser to open the specified URL */ @SuppressWarnings("deprecation") private void launchBrowser(String url) throws Exception { if (OSUtils.IS_MAC) { FileManager.openURL(url); } else if (OSUtils.IS_WINDOWS) { Runtime .getRuntime() .exec("rundll32 url.dll,FileProtocolHandler " + url); } else { String browser = getLinuxBrowser(); if (browser == null) logger.error("Could not find web browser"); else 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 <tt>Runtime.exec()</tt> */ 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 * of the associated browser and the opening of the specified URL in it i.e. * the method returns immediately and does not report the success or the * failure of the opening. * * @param url a <tt>String</tt> value which represents the URL to be opened * in a browser * @see BrowserLauncherService#openURL(java.lang.String) */ public void openURL(final String url) { Thread launchBrowserThread = new Thread(getClass().getName()) { @Override public void run() { try { launchBrowser(url); } catch (Exception e) { logger.error("Failed to launch browser", e); } } }; launchBrowserThread.start(); } }