| /******************************************************************************* |
| * Copyright (c) 2000, 2004 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Common Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/cpl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.help.internal.browser; |
| |
| import java.util.*; |
| |
| import org.eclipse.core.runtime.*; |
| import org.eclipse.help.browser.*; |
| import org.eclipse.help.internal.base.*; |
| import org.eclipse.osgi.service.environment.*; |
| |
| /** |
| * |
| */ |
| public class CustomBrowser implements IBrowser { |
| public static final String CUSTOM_BROWSER_PATH_KEY = "custom_browser_path"; //$NON-NLS-1$ |
| |
| /** |
| * @see org.eclipse.help.browser.IBrowser#close() |
| */ |
| public void close() { |
| } |
| |
| /** |
| * @see org.eclipse.help.browser.IBrowser#isCloseSupported() |
| */ |
| public boolean isCloseSupported() { |
| return false; |
| } |
| |
| /** |
| * @see org.eclipse.help.browser.IBrowser#displayURL(java.lang.String) |
| */ |
| public void displayURL(String url) throws Exception { |
| String path = HelpBasePlugin.getDefault().getPluginPreferences() |
| .getString(CustomBrowser.CUSTOM_BROWSER_PATH_KEY); |
| |
| String[] command = prepareCommand(path, url); |
| |
| try { |
| Process pr = Runtime.getRuntime().exec(command); |
| Thread outConsumer = new StreamConsumer(pr.getInputStream()); |
| outConsumer.setName("Custom browser adapter output reader"); //$NON-NLS-1$ |
| outConsumer.start(); |
| Thread errConsumer = new StreamConsumer(pr.getErrorStream()); |
| errConsumer.setName("Custom browser adapter error reader"); //$NON-NLS-1$ |
| errConsumer.start(); |
| } catch (Exception e) { |
| HelpBasePlugin |
| .logError( |
| "Launching URL \"" //$NON-NLS-1$ |
| + url |
| + "\" using browser program \"" //$NON-NLS-1$ |
| + path |
| + "\" has failed. Specify another browser in help preferences.", //$NON-NLS-1$ |
| e); |
| throw new Exception(HelpBaseResources.getString( |
| "CustomBrowser.errorLaunching", url, path)); //$NON-NLS-1$ |
| } |
| } |
| |
| /** |
| * @see org.eclipse.help.browser.IBrowser#isSetLocationSupported() |
| */ |
| public boolean isSetLocationSupported() { |
| return false; |
| } |
| |
| /** |
| * @see org.eclipse.help.browser.IBrowser#isSetSizeSupported() |
| */ |
| public boolean isSetSizeSupported() { |
| return false; |
| } |
| |
| /** |
| * @see org.eclipse.help.browser.IBrowser#setLocation(int, int) |
| */ |
| public void setLocation(int x, int y) { |
| } |
| |
| /** |
| * @see org.eclipse.help.browser.IBrowser#setSize(int, int) |
| */ |
| public void setSize(int width, int height) { |
| } |
| |
| /** |
| * Creates the final command to launch. |
| * |
| * @param path |
| * @param url |
| * @return String[] |
| */ |
| private String[] prepareCommand(String path, String url) { |
| ArrayList tokenList = new ArrayList(); |
| //Divide along quotation marks |
| StringTokenizer qTokenizer = new StringTokenizer(path.trim(), |
| "\"", true); //$NON-NLS-1$ |
| boolean withinQuotation = false; |
| String quotedString = ""; //$NON-NLS-1$ |
| while (qTokenizer.hasMoreTokens()) { |
| String curToken = qTokenizer.nextToken(); |
| if (curToken.equals("\"")) { //$NON-NLS-1$ |
| if (withinQuotation) { |
| if (Constants.OS_WIN32.equalsIgnoreCase(Platform.getOS())) { |
| // need to quote URLs on Windows |
| tokenList.add("\"" + quotedString + "\""); //$NON-NLS-1$ //$NON-NLS-2$ |
| } else { |
| // qotes prevent launching on Unix 35673 |
| tokenList.add(quotedString); |
| } |
| } else { |
| quotedString = ""; //$NON-NLS-1$ |
| } |
| withinQuotation = !withinQuotation; |
| continue; |
| } else if (withinQuotation) { |
| quotedString = curToken; |
| continue; |
| } else { |
| //divide unquoted strings along white space |
| StringTokenizer parser = new StringTokenizer(curToken.trim()); |
| while (parser.hasMoreTokens()) { |
| tokenList.add(parser.nextToken()); |
| } |
| } |
| } |
| // substitute %1 by url |
| boolean substituted = false; |
| for (int i = 0; i < tokenList.size(); i++) { |
| String token = (String) tokenList.get(i); |
| if ("%1".equals(token)) { //$NON-NLS-1$ |
| tokenList.set(i, url); |
| substituted = true; |
| } else if ("\"%1\"".equals(token)) { //$NON-NLS-1$ |
| tokenList.set(i, "\"" + url + "\""); //$NON-NLS-1$ //$NON-NLS-2$ |
| substituted = true; |
| } |
| } |
| // add the url if not substituted already |
| if (!substituted) |
| tokenList.add(url); |
| |
| String[] command = new String[tokenList.size()]; |
| tokenList.toArray(command); |
| return command; |
| } |
| } |