/*******************************************************************************
 * Copyright (c) 2000, 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
 *******************************************************************************/

/* Eclipse Mozilla Utility Methods */

#ifdef MOZILLA_FIX

#include "eclipseMozilla.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>


/* Filter function used by fixEnvForMozilla() for finding directories
 * with a desired prefix.
 */
int filter(const struct dirent *dir)
{
	char* prefixes[] = {
		"xulrunner-",
		"mozilla-seamonkey-",
		"seamonkey-",
		"mozilla-",
		"mozilla-firefox-",
		"firefox-",
		NULL
	};
	int XULRUNNER_INDEX = 0;
#if defined(__amd64__) || defined(__x86_64__) || defined(__powerpc64__)
	char* root = "/usr/lib64/";
#else
	char* root = "/usr/lib/";
#endif

#if defined (SOLARIS)
	/*
	 * The solaris compiler does not do static linking, so just check
	 * for a common lib to ensure that the install seems valid.
	 */
	char* testlib = "/libxpcom.so";
#else
	/* Ensure that the install is dynamically-linked and is built with GTK2 */
	char* testlib = "/components/libwidget_gtk2.so";
#endif

	struct stat buf;
	int index = 0;
	char* dirname = (char *)dir->d_name;

	char* prefix = prefixes [index];
	while (prefix != NULL)
	{
		int prefixLength = strlen(prefix);
		if (strncmp(dirname, prefix, prefixLength) == 0)
		{
			if (index == XULRUNNER_INDEX) return 1;	/* include in scandir result */

			/* Check if the first character following the prefix is a numeric digit.
			 * This ensures that the suffix represents a version number like
			 * "mozilla-1.7.3", and not a different product like "mozilla-thunderbird".
			 */
			int dirLength = strlen(dirname);
			if ('0' <= dirname[prefixLength] && dirname[prefixLength] <= '9') {
				/* If a xulrunner install is found then success is immediate since
				 * xulrunner always provides an embeddable GRE.
				 */				
				if (index == XULRUNNER_INDEX) return 1;	/* include in scandir result */
				
				char* testpath = malloc (strlen(root) + dirLength + strlen(testlib) + 1);
				strcpy(testpath, root);
				strcat(testpath, dirname);
				strcat(testpath, testlib);
				int success = stat(testpath, &buf) == 0;
				free(testpath);
				if (success)
				{
					return 1;	/* include in scandir result */
				}
			}
		}
		prefix = prefixes [++index];
	}
	return 0;	/* exclude from scandir result */
}

#if defined (SOLARIS)
/*
 * A replacement for 
 * 			scandir(const char *dir, struct dirent ***namelist, filter, alphasort);
 * because scandir & alphasort don't exist on Solaris 9.
 * Return the dirent->d_name that was sorted the highest according to strcoll, 
 *            or NULL on error or if no entries matched the filter.
 * The caller is responsible for freeing the returned string
 */
char * scan(const char * path) {
	DIR *dir = NULL;
	struct dirent * entry = NULL;
	char * candidate = NULL;
	
	if ((dir = opendir(path)) == NULL) {
		return NULL;
	}

	while ((entry = readdir(dir)) != NULL) {
		if (filter(entry)) {
			if (candidate == NULL) {
				candidate = strdup(entry->d_name);
			} else if (strcoll(candidate, entry->d_name) < 0) {
				free(candidate);
				candidate = strdup(entry->d_name);
			}
		}
	}
	closedir(dir);
	
	return candidate;
}
#endif

/* Set the environmnent required by the SWT Browser widget to bind to Mozilla. 
 * The SWT Browser widget relies on Mozilla on Linux. The LD_LIBRARY_PATH
 * and the Mozilla environment variable MOZILLA_FIVE_HOME must point
 * to the installation directory of Mozilla.
 * 
 * 1. Use the location set by MOZILLA_FIVE_HOME if it is defined
 * 2. Parse the file /etc/gre.conf if it is defined. This file is
 *    set by the RedtHat RPM manager.
 * 3. Try some common installation locations.
 */
void fixEnvForMozilla() {
	static int fixed = 0;
	if (fixed) return; 
	{
		char *ldPath = (char*)getenv("LD_LIBRARY_PATH");
		char *mozillaFiveHome = (char*)getenv("MOZILLA_FIVE_HOME");
		char *grePath = NULL; /* Gecko Runtime Environment Location */
		fixed = 1;
		/* Always dup the string so we can free later */
		if (ldPath != NULL) ldPath = strdup(ldPath);
		else ldPath = strdup("");
		
		/* MOZILLA_FIVE_HOME (if defined) points to the Mozilla
		 * install directory. Don't look any further if it is set.
		 */
		if (mozillaFiveHome != NULL) 
		{
			grePath = strdup(mozillaFiveHome);
		}

		/* The file gre.conf (if available) points to the
		 * Mozilla install directory. Don't look any further if 
		 * it is set.
		 */
		if (grePath == NULL)
		{
			struct stat buf;
			FILE *file = NULL;
#if defined(__amd64__) || defined(__x86_64__) || defined(__powerpc64__)
			if (stat("/etc/gre64.conf", &buf) == 0)
			{
				file = fopen("/etc/gre64.conf", "r");
			}
			else if (stat("/etc/gre.d/gre64.conf", &buf) == 0)
			{
				file = fopen("/etc/gre.d/gre64.conf", "r");
			} else
#endif
			if (stat("/etc/gre.conf", &buf) == 0)
			{
				file = fopen("/etc/gre.conf", "r");
			}
			else if (stat("/etc/gre.d/gre.conf", &buf) == 0)
			{
				file = fopen("/etc/gre.d/gre.conf", "r");
			}
			if (file != NULL)
			{
				char buffer[1024];
				char path[1024];
				while (fgets(buffer, 1024, file) != NULL)
				{
					if (sscanf(buffer, "GRE_PATH=%s", path) == 1)
					{
						grePath = strdup(path);
						break;
					}
				}
				fclose(file);
			}
		}

		/* Try some common installation locations. */
		if (grePath == NULL)
		{
			/* try xulrunner-*, mozilla-*, firefox-* directories in /usr/lib/ */
#if defined(__amd64__) || defined(__x86_64__) || defined(__powerpc64__)
			char* dir = "/usr/lib64/";
#else
			char* dir = "/usr/lib/";
#endif
#if defined (SOLARIS)
			char * name = scan(dir);
			if (name != NULL) {
#else
			struct dirent **namelist;
			int i;
			int count = scandir(dir, &namelist, filter, alphasort);
			if (count > 0)
			{
				/* count-1 is used below in an attempt to get the matched directory
				 * with the latest version number.
				 */
				char* name = namelist [count - 1]->d_name;
#endif
				grePath = malloc (strlen(dir) + strlen(name) + 1);
				strcpy(grePath, dir);
				strcat(grePath, name);
#if defined (SOLARIS)
				free(name);
#else
				for (i = 0; i < count; i++) {
					free(namelist [i]);
				}
				free(namelist);
#endif
			}

			if (grePath == NULL)
			{
				/* some other typical installation locations */
				char* dirs[] = {
#if defined(__amd64__) || defined(__x86_64__) || defined(__powerpc64__)
					"/usr/lib64/xulrunner/",
					"/usr/lib64/mozilla-firefox/",
					"/usr/lib64/firefox/",
					"/usr/lib64/mozilla-seamonkey/",
					"/usr/lib64/seamonkey/",
					"/usr/lib64/mozilla/",
#endif
#if defined (SOLARIS)
					"/usr/sfw/lib/xulrunner/",
					"/usr/sfw/lib/mozilla-firefox/",
					"/usr/sfw/lib/firefox/",
					"/usr/sfw/lib/mozilla/",
					"/usr/sfw/lib/mozilla-seamonkey/",
					"/usr/sfw/lib/seamonkey/",
#endif
					"/usr/lib/xulrunner/",
					"/usr/lib/mozilla-firefox/",
					"/usr/lib/firefox/",
					"/usr/lib/mozilla-seamonkey/",
					"/usr/lib/seamonkey/",
					"/usr/lib/mozilla/",
					"/usr/local/xulrunner/",
					"/opt/xulrunner/",
					"/usr/local/mozilla-firefox/",
					"/usr/local/firefox/",
					"/opt/mozilla-firefox/",
					"/opt/firefox/",
					"/usr/local/mozilla-seamonkey/",
					"/usr/local/seamonkey/",
					"/opt/mozilla-seamonkey/",
					"/opt/seamonkey/",
					"/usr/local/mozilla/",
					"/opt/mozilla/",
					NULL
				};

#if defined (SOLARIS)
				/*
				 * The solaris compiler does not do static linking, so just check
				 * for a common lib to ensure that the install seems valid.
				 */
				char* testlib = "libxpcom.so";
#else
				/* Ensure that the install is dynamically-linked and is built with GTK2 */
				char* testlib = "components/libwidget_gtk2.so";
#endif

				struct stat buf;
				int index = 0;

				char* dir = dirs [index++];
				while (dir != NULL)
				{
					char* testpath = malloc (strlen(dir) + strlen(testlib) + 1);
					strcpy(testpath, dir);
					strcat(testpath, testlib);
					int success = stat(testpath, &buf) == 0;
					free(testpath);
					if (success)
					{
						grePath = strdup(dir);
						break;
					}
					dir = dirs [index++];
				}
			}
		}

		if (grePath != NULL)
		{
			ldPath = (char*)realloc(ldPath, strlen(ldPath) + strlen(grePath) + 2);
			if (strlen(ldPath) > 0) strcat(ldPath, ":");
			strcat(ldPath, grePath);
			setenv("LD_LIBRARY_PATH", ldPath, 1);
			
			if (mozillaFiveHome == NULL) setenv("MOZILLA_FIVE_HOME", grePath, 1);
			free(grePath);
		}
		free(ldPath);
	}
}
#endif /* MOZILLA_FIX */
