/*******************************************************************************
 * Copyright (c) 2005 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - Initial API and implementation
 *******************************************************************************/
package org.eclipse.ui.internal.browser;

import java.net.URL;

import org.eclipse.osgi.util.NLS;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.browser.AbstractWebBrowser;

/**
 * An instance of a running Web browser. rundll32.exe
 * url.dll,FileProtocolHandler www.ibm.com
 */
public class ExternalBrowserInstance extends AbstractWebBrowser {
	protected IBrowserDescriptor browser;

	protected Process process;

	public ExternalBrowserInstance(String id, IBrowserDescriptor browser) {
		super(id);
		this.browser = browser;
	}

	public void openURL(URL url) throws PartInitException {
		String urlText = null;

		if (url != null)
			urlText = url.toExternalForm();

		// change spaces to "%20"
		if (urlText != null && !WebBrowserUtil.isWindows()) {
			int index = urlText.indexOf(" "); //$NON-NLS-1$
			while (index >= 0) {
				urlText = urlText.substring(0, index)
						+ "%20" + urlText.substring(index + 1); //$NON-NLS-1$
				index = urlText.indexOf(" "); //$NON-NLS-1$
			}
		}

		String location = browser.getLocation();
		String parameters = browser.getParameters();
		Trace
				.trace(
						Trace.FINEST,
						"Launching external Web browser: " + location + " - " + parameters + " - " + urlText); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$

		String params = parameters;
		if (params == null)
			params = ""; //$NON-NLS-1$

		if (urlText != null) {
			int urlIndex = params.indexOf(IBrowserDescriptor.URL_PARAMETER);
			if (urlIndex >= 0)
				params = params.substring(0, urlIndex)
						+ " " + urlText + " " + params.substring(urlIndex + IBrowserDescriptor.URL_PARAMETER.length()); //$NON-NLS-1$ //$NON-NLS-2$
			else {
				if (!params.endsWith(" ")) //$NON-NLS-1$
					params += " "; //$NON-NLS-1$ 
				params += urlText;
			}
		}

		try {
			Trace.trace(Trace.FINEST, "Launching " + location + " " + params); //$NON-NLS-1$//$NON-NLS-2$
			if (params == null || params.length() == 0)
				process = Runtime.getRuntime().exec(location);
			else
				process = Runtime.getRuntime().exec(location + " " + params); //$NON-NLS-1$
		} catch (Exception e) {
			Trace.trace(Trace.SEVERE, "Could not launch external browser", e); //$NON-NLS-1$
			WebBrowserUtil.openError(NLS.bind(
					Messages.errorCouldNotLaunchWebBrowser, urlText));
		}
		Thread thread = new Thread() {
			public void run() {
				try {
					process.waitFor();
					DefaultBrowserSupport.getInstance().removeBrowser(
							ExternalBrowserInstance.this);
				} catch (Exception e) {
					// ignore
				}
			}
		};
		thread.setDaemon(true);
		thread.start();
	}

	public boolean close() {
		try {
			process.destroy();
			return true;
		} catch (Exception e) {
			return false;
		}
	}
}