All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.eclipse.swt.program.Program Maven / Gradle / Ivy

Go to download

SWT is an open source widget toolkit for Java designed to provide efficient, portable access to the user-interface facilities of the operating systems on which it is implemented.

The newest version!
/*******************************************************************************
 * Copyright (c) 2000, 2013 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.swt.program;


import org.eclipse.swt.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.internal.*;
import org.eclipse.swt.internal.gnome.*;
import org.eclipse.swt.internal.cde.*;
import org.eclipse.swt.internal.gtk.*;
import org.eclipse.swt.widgets.*;

import java.io.*;
import java.util.*;

/**
 * Instances of this class represent programs and
 * their associated file extensions in the operating
 * system.
 *
 * @see Program snippets
 * @see Sample code and further information
 */
public final class Program {
	String name = ""; //$NON-NLS-1$
	String command;
	String iconPath;
	Display display;

	/* Gnome & GIO specific
	 * true if command expects a URI
	 * false if expects a path
	 */
	boolean gnomeExpectUri;
	
	static long /*int*/ modTime;
	static Hashtable mimeTable;
	
	static long /*int*/ cdeShell;

	static final String[] CDE_ICON_EXT = { ".m.pm",   ".l.pm",   ".s.pm",   ".t.pm" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
	static final String[] CDE_MASK_EXT = { ".m_m.bm", ".l_m.bm", ".s_m.bm", ".t_m.bm" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
	static final String DESKTOP_DATA = "Program_DESKTOP"; //$NON-NLS-1$
	static final String ICON_THEME_DATA = "Program_GNOME_ICON_THEME"; //$NON-NLS-1$
	static final String PREFIX_HTTP = "http://"; //$NON-NLS-1$
	static final String PREFIX_HTTPS = "https://"; //$NON-NLS-1$
	static final int DESKTOP_UNKNOWN = 0;
	static final int DESKTOP_GNOME = 1;
	static final int DESKTOP_GIO = 2;
	static final int DESKTOP_CDE = 3;
	static final int PREFERRED_ICON_SIZE = 16;
	
/**
 * Prevents uninitialized instances from being created outside the package.
 */
Program() {
}

/* Determine the desktop for the given display. */
static int getDesktop(final Display display) {
	if (display == null) return DESKTOP_UNKNOWN;	
	Integer desktopValue = (Integer)display.getData(DESKTOP_DATA);
	if (desktopValue != null) return desktopValue.intValue();
	int desktop = DESKTOP_UNKNOWN;

	/* Get the list of properties on the root window. */
	long /*int*/ xDisplay = OS.gdk_x11_display_get_xdisplay(OS.gdk_display_get_default());
	long /*int*/ rootWindow = OS.XDefaultRootWindow(xDisplay);
	int[] numProp = new int[1];
	long /*int*/ propList = OS.XListProperties(xDisplay, rootWindow, numProp);
	long /*int*/ [] property = new long /*int*/ [numProp[0]];
	if (propList != 0) {
		OS.memmove(property, propList, (property.length * OS.PTR_SIZEOF));
		OS.XFree(propList);
	}

	/*
	 * Feature in Linux Desktop. There is currently no official way to
	 * determine whether the Gnome window manager or gnome-vfs is
	 * available. Earlier versions including Red Hat 9 and Suse 9 provide
	 * a documented Gnome specific property on the root window 
	 * WIN_SUPPORTING_WM_CHECK. This property is no longer supported in newer
	 * versions such as Fedora Core 2.
	 * The workaround is to simply check that the window manager is a 
	 * compliant one (property _NET_SUPPORTING_WM_CHECK) and to attempt to load 
	 * our native library that depends on gnome-vfs.
	 * 
	 * Note: GIO is used when available instead of gnome-vfs.
	 */
	if (desktop == DESKTOP_UNKNOWN) {
		byte[] gnomeName = Converter.wcsToMbcs(null, "_NET_SUPPORTING_WM_CHECK", true);
		long /*int*/ gnome = OS.XInternAtom(xDisplay, gnomeName, true);
		if (gnome != OS.None) {
			/* Check for the existence of libgio libraries first */
			byte[] buffer;
			int flags = OS.RTLD_LAZY;
			if (OS.IsAIX) {
				buffer = Converter.wcsToMbcs(null, "libgio-2.0.a(libgio-2.0.so.0)", true);
				flags |= OS.RTLD_MEMBER;
			} else  if (OS.IsHPUX) {
				buffer = Converter.wcsToMbcs(null, "libgio-2.0.so", true);
			} else {
				buffer =  Converter.wcsToMbcs(null, "libgio-2.0.so.0", true);
			}
			long /*int*/ libgio = OS.dlopen(buffer, flags);
			if (libgio != 0) {
				buffer = Converter.wcsToMbcs(null, "g_app_info_launch_default_for_uri", true);
				long /*int*/ g_app_info_launch_default_for_uri = OS.dlsym(libgio, buffer);
				if (g_app_info_launch_default_for_uri != 0) {
					desktop = DESKTOP_GIO;
				}
				OS.dlclose(libgio);
			}
			
			if (desktop == DESKTOP_UNKNOWN && gnome_init()) {
				desktop = DESKTOP_GNOME;
				long /*int*/ icon_theme = GNOME.gnome_icon_theme_new();
				display.setData(ICON_THEME_DATA, new LONG(icon_theme));
				display.addListener(SWT.Dispose, new Listener() {
					public void handleEvent(Event event) {
						LONG gnomeIconTheme = (LONG)display.getData(ICON_THEME_DATA);
						if (gnomeIconTheme == null) return;
						display.setData(ICON_THEME_DATA, null);
						/* 
						 * Note.  gnome_icon_theme_new uses g_object_new to allocate the
						 * data it returns. Use g_object_unref to free the pointer it returns.
						 */
						if (gnomeIconTheme.value != 0) OS.g_object_unref(gnomeIconTheme.value);
					}
				});
			}
		}
	}

	/*
	* On CDE, the atom below may exist without DTWM running. If the atom 
	* below is defined, the CDE database exists and the available
	* applications can be queried.
	*/
	if (desktop == DESKTOP_UNKNOWN) {
		byte[] cdeName = Converter.wcsToMbcs(null, "_DT_SM_PREFERENCES", true);
		long /*int*/ cde = OS.XInternAtom(xDisplay, cdeName, true);
		for (int index = 0; desktop == DESKTOP_UNKNOWN && index < property.length; index++) {
			if (property[index] == OS.None) continue; /* do not match atoms that do not exist */
			if (property[index] == cde && cde_init(display)) desktop = DESKTOP_CDE;
		}
	}

	display.setData(DESKTOP_DATA, new Integer(desktop));
	return desktop;
}

boolean cde_execute(String fileName) {
	/* Use the character encoding for the default locale */
	byte[] action = Converter.wcsToMbcs(null, command, true);
	byte[] fileArg = Converter.wcsToMbcs(null, fileName, true);
	long /*int*/ ptr = OS.g_malloc(fileArg.length);
	OS.memmove(ptr, fileArg, fileArg.length);
	DtActionArg args = new DtActionArg();
	args.argClass = CDE.DtACTION_FILE;
	args.name = ptr;
	long actionID = CDE.DtActionInvoke(cdeShell, action, args, 1, null, null, null, 1, 0, 0);
	OS.g_free(ptr);
	return actionID != 0;
}

static String cde_getAction(String dataType) {
	String action  = null;
	String actions = cde_getAttribute(dataType, CDE.DtDTS_DA_ACTION_LIST);
	if (actions != null) {
		int index = actions.indexOf("Open");
		if (index != -1) {
			action = actions.substring(index, index + 4);
		} else {
			index = actions.indexOf(",");
			action = index != -1 ? actions.substring(0, index) : actions;
		}
	}
	return action;
}

static String cde_getAttribute(String dataType, String attrName) {
	/* Use the character encoding for the default locale */
	byte[] dataTypeBuf = Converter.wcsToMbcs(null, dataType, true);
	byte[] attrNameBuf = Converter.wcsToMbcs(null, attrName, true);
	byte[] optNameBuf = null;
	long /*int*/ attrValue = CDE.DtDtsDataTypeToAttributeValue(dataTypeBuf, attrNameBuf, optNameBuf);
	if (attrValue == 0) return null;
	int length = OS.strlen(attrValue);
	byte[] attrValueBuf = new byte[length];
	OS.memmove(attrValueBuf, attrValue, length);
	CDE.DtDtsFreeAttributeValue(attrValue);
	/* Use the character encoding for the default locale */
	return new String(Converter.mbcsToWcs(null, attrValueBuf));
}

static Hashtable cde_getDataTypeInfo() {
	Hashtable dataTypeInfo = new Hashtable();
	int index;
	long /*int*/ dataTypeList = CDE.DtDtsDataTypeNames();
	if (dataTypeList != 0) {
		/* For each data type name in the list */
		index = 0; 
		long /*int*/ [] dataType = new long /*int*/ [1];
		OS.memmove(dataType, dataTypeList + (index++ * 4), 4);
		while (dataType[0] != 0) {
			int length = OS.strlen(dataType[0]);
			byte[] dataTypeBuf = new byte[length];
			OS.memmove(dataTypeBuf, dataType[0], length);
			/* Use the character encoding for the default locale */
			String dataTypeName = new String(Converter.mbcsToWcs(null, dataTypeBuf));
     		
			/* The data type is valid if it is not an action, and it has an extension and an action. */
			String extension = cde_getExtension(dataTypeName);
			if (!CDE.DtDtsDataTypeIsAction(dataTypeBuf) &&
				extension != null && cde_getAction(dataTypeName) != null) {
				Vector exts = new Vector();
				exts.addElement(extension);
				dataTypeInfo.put(dataTypeName, exts);
			}
			OS.memmove(dataType, dataTypeList + (index++ * 4), 4);
		}
		CDE.DtDtsFreeDataTypeNames(dataTypeList);
	}
	
	return dataTypeInfo;
}

static String cde_getExtension(String dataType) {
	String fileExt = cde_getAttribute(dataType, CDE.DtDTS_DA_NAME_TEMPLATE);
	if (fileExt == null || fileExt.indexOf("%s.") == -1) return null;
	int dot = fileExt.indexOf(".");
	return fileExt.substring(dot);
}

/**
 * CDE - Get Image Data
 * 
 * This method returns the image data of the icon associated with
 * the data type. Since CDE supports multiple sizes of icons, several
 * attempts are made to locate an icon of the desired size and format.
 * CDE supports the sizes: tiny, small, medium and large. The best
 * search order is medium, large, small and then tiny. Althoug CDE supports
 * colour and monochrome bitmaps, only colour icons are tried. (The order is
 * defined by the  cdeIconExt and cdeMaskExt arrays above.)
 */
ImageData cde_getImageData() {
	// TODO
	return null;	
}

static String cde_getMimeType(String extension) {
	String mimeType = null;
	Hashtable mimeInfo = cde_getDataTypeInfo();
	if (mimeInfo == null) return null;
	Enumeration keys = mimeInfo.keys();
	while (mimeType == null && keys.hasMoreElements()) {
		String type = (String)keys.nextElement();
		Vector mimeExts = (Vector)mimeInfo.get(type);
		for (int index = 0; index < mimeExts.size(); index++){
			if (extension.equals(mimeExts.elementAt(index))) {
				mimeType = type;
				break;
			}
		}
	}
	return mimeType;
}

static Program cde_getProgram(Display display, String mimeType) {
	String command = cde_getAction(mimeType);
	if (command == null) return null;

	Program program = new Program();
	program.display = display;
	program.name = mimeType;
	program.command = command;
	program.iconPath = cde_getAttribute(program.name, CDE.DtDTS_DA_ICON);
	return program;
}

static boolean cde_init(Display display) {
	try {
		Library.loadLibrary("swt-cde");
	} catch (Throwable e) {
		return false;
	}

	/* Use the character encoding for the default locale */
	CDE.XtToolkitInitialize();
	long /*int*/ xtContext = CDE.XtCreateApplicationContext ();
	long /*int*/ xDisplay = OS.gdk_x11_display_get_xdisplay(OS.gdk_display_get_default());
	byte[] appName = Converter.wcsToMbcs(null, "CDE", true);
	byte[] appClass = Converter.wcsToMbcs(null, "CDE", true);
	long /*int*/ [] argc = new long /*int*/ [] {0};
	CDE.XtDisplayInitialize(xtContext, xDisplay, appName, appClass, 0, 0, argc, 0);
	long /*int*/ widgetClass = CDE.topLevelShellWidgetClass ();
	cdeShell = CDE.XtAppCreateShell (appName, appClass, widgetClass, xDisplay, null, 0);
	CDE.XtSetMappedWhenManaged (cdeShell, false);
	CDE.XtResizeWidget (cdeShell, 10, 10, 0);
	CDE.XtRealizeWidget (cdeShell);
	boolean initOK = CDE.DtAppInitialize(xtContext, xDisplay, cdeShell, appName, appName);
	if (initOK) CDE.DtDbLoad();
	return initOK;
}

static boolean cde_isExecutable(String fileName) {
	byte [] fileNameBuffer = Converter.wcsToMbcs(null, fileName, true);
	return OS.access(fileNameBuffer, OS.X_OK) == 0;
	//TODO find the content type of the file and check if it is executable
}

static String[] parseCommand(String cmd) {
	Vector args = new Vector();
	int sIndex = 0;
	int eIndex;
	while (sIndex < cmd.length()) {
		/* Trim initial white space of argument. */
		while (sIndex < cmd.length() && Compatibility.isWhitespace(cmd.charAt(sIndex))) {
			sIndex++;
		}
		if (sIndex < cmd.length()) {
			/* If the command is a quoted string */
			if (cmd.charAt(sIndex) == '"' || cmd.charAt(sIndex) == '\'') {
				/* Find the terminating quote (or end of line).
				 * This code currently does not handle escaped characters (e.g., " a\"b").
				 */
				eIndex = sIndex + 1;
				while (eIndex < cmd.length() && cmd.charAt(eIndex) != cmd.charAt(sIndex)) eIndex++;
				if (eIndex >= cmd.length()) { 
					/* The terminating quote was not found
					 * Add the argument as is with only one initial quote.
					 */
					args.addElement(cmd.substring(sIndex, eIndex));
				} else {
					/* Add the argument, trimming off the quotes. */
					args.addElement(cmd.substring(sIndex + 1, eIndex));
				}
				sIndex = eIndex + 1;
			}
			else {
				/* Use white space for the delimiters. */
				eIndex = sIndex;
				while (eIndex < cmd.length() && !Compatibility.isWhitespace(cmd.charAt(eIndex))) eIndex++;
				args.addElement(cmd.substring(sIndex, eIndex));
				sIndex = eIndex + 1;
			}
		}
	}
	
	String[] strings = new String[args.size()];
	for (int index =0; index < args.size(); index++) {
		strings[index] = (String)args.elementAt(index);
	}
	return strings;
}

/**
 * GNOME 2.4 - Execute the program for the given file. 
 */
boolean gnome_execute(String fileName) {
	byte[] mimeTypeBuffer = Converter.wcsToMbcs(null, name, true);
	long /*int*/ ptr = GNOME.gnome_vfs_mime_get_default_application(mimeTypeBuffer);
	byte[] fileNameBuffer = Converter.wcsToMbcs(null, fileName, true);
	long /*int*/ uri = GNOME.gnome_vfs_make_uri_from_input_with_dirs(fileNameBuffer, GNOME.GNOME_VFS_MAKE_URI_DIR_CURRENT);
	long /*int*/ list = OS.g_list_append(0, uri);
	int result = GNOME.gnome_vfs_mime_application_launch(ptr, list);
	GNOME.gnome_vfs_mime_application_free(ptr);
	OS.g_free(uri);
	OS.g_list_free(list);
	return result == GNOME.GNOME_VFS_OK;
}

/**
 * GNOME 2.4 - Launch the default program for the given file. 
 */
static boolean gnome_launch(String fileName) {
	byte[] fileNameBuffer = Converter.wcsToMbcs(null, fileName, true);
	long /*int*/ uri = GNOME.gnome_vfs_make_uri_from_input_with_dirs(fileNameBuffer, GNOME.GNOME_VFS_MAKE_URI_DIR_CURRENT);
	int result = GNOME.gnome_vfs_url_show(uri);
	OS.g_free(uri);
	return (result == GNOME.GNOME_VFS_OK);
}

/**
 * GNOME - Get Image Data
 * 
 */ 
ImageData gnome_getImageData() {
	if (iconPath == null) return null;
	try {
		return new ImageData(iconPath);
	} catch (Exception e) {}
	return null;
}


static String gnome_getMimeType(String extension) {
	String mimeType = null;
	String fileName = "swt" + extension;
	byte[] extensionBuffer = Converter.wcsToMbcs(null, fileName, true);
	long /*int*/ typeName = GNOME.gnome_vfs_mime_type_from_name(extensionBuffer);
	if (typeName != 0) {
		int length = OS.strlen(typeName);
		if (length > 0) {
			byte [] buffer = new byte[length];
			OS.memmove(buffer, typeName, length);
			mimeType = new String(Converter.mbcsToWcs(null, buffer));
		}
	}
	return mimeType;
}

static Program gnome_getProgram(Display display, String mimeType) {
	Program program = null;
	byte[] mimeTypeBuffer = Converter.wcsToMbcs(null, mimeType, true);
	long /*int*/ ptr = GNOME.gnome_vfs_mime_get_default_application(mimeTypeBuffer);
	if (ptr != 0) {
		program = new Program();
		program.display = display;
		program.name = mimeType;
		GnomeVFSMimeApplication application = new GnomeVFSMimeApplication();
		GNOME.memmove(application, ptr, GnomeVFSMimeApplication.sizeof);
		if (application.command != 0) {
			int length = OS.strlen(application.command);
			if (length > 0) {
				byte[] buffer = new byte[length];
				OS.memmove(buffer, application.command, length);		
				program.command = new String(Converter.mbcsToWcs(null, buffer));
			}
		}
		program.gnomeExpectUri = application.expects_uris == GNOME.GNOME_VFS_MIME_APPLICATION_ARGUMENT_TYPE_URIS;
		
		int length = OS.strlen(application.id);
		byte[] buffer = new byte[length + 1];
		OS.memmove(buffer, application.id, length);
		LONG gnomeIconTheme = (LONG)display.getData(ICON_THEME_DATA);
		long /*int*/ icon_name = GNOME.gnome_icon_lookup(gnomeIconTheme.value, 0, null, buffer, 0, mimeTypeBuffer, 
				GNOME.GNOME_ICON_LOOKUP_FLAGS_NONE, null);
		long /*int*/ path = 0;
		if (icon_name != 0) path = GNOME.gnome_icon_theme_lookup_icon(gnomeIconTheme.value, icon_name, PREFERRED_ICON_SIZE, null, null);
		if (path != 0) {
			length = OS.strlen(path);
			if (length > 0) {
				buffer = new byte[length];
				OS.memmove(buffer, path, length);
				program.iconPath = new String(Converter.mbcsToWcs(null, buffer));
			}
			OS.g_free(path);
		}
		if (icon_name != 0) OS.g_free(icon_name);
		GNOME.gnome_vfs_mime_application_free(ptr);
	}
	
	return program != null && program.command != null ? program : null;
}

static boolean gnome_init() {
	try {
		return GNOME.gnome_vfs_init();
	} catch (Throwable e) {
		return false;
	}
}

static boolean gnome_isExecutable(String fileName) {
	/* check if the file is executable */
	byte [] fileNameBuffer = Converter.wcsToMbcs(null, fileName, true);
	if (!GNOME.gnome_vfs_is_executable_command_string(fileNameBuffer)) return false;
	
	/* check if the mime type is executable */
	long /*int*/ uri = GNOME.gnome_vfs_make_uri_from_input(fileNameBuffer);
	long /*int*/ mimeType = GNOME.gnome_vfs_get_mime_type(uri);
	OS.g_free(uri);
	
	byte[] exeType = Converter.wcsToMbcs (null, "application/x-executable", true); //$NON-NLS-1$
	boolean result = GNOME.gnome_vfs_mime_type_get_equivalence(mimeType, exeType) != GNOME.GNOME_VFS_MIME_UNRELATED;
	if (!result) {
		byte [] shellType = Converter.wcsToMbcs (null, "application/x-shellscript", true); //$NON-NLS-1$
		result = GNOME.gnome_vfs_mime_type_get_equivalence(mimeType, shellType) == GNOME.GNOME_VFS_MIME_IDENTICAL;
	}
	return result;
}

/**
 * Finds the program that is associated with an extension.
 * The extension may or may not begin with a '.'.  Note that
 * a Display must already exist to guarantee that
 * this method returns an appropriate result.
 *
 * @param extension the program extension
 * @return the program or null
 *
 * @exception IllegalArgumentException 
    *
  • ERROR_NULL_ARGUMENT when extension is null
  • *
*/ public static Program findProgram(String extension) { return findProgram(Display.getCurrent(), extension); } /* * API: When support for multiple displays is added, this method will * become public and the original method above can be deprecated. */ static Program findProgram(Display display, String extension) { if (extension == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); if (extension.length() == 0) return null; if (extension.charAt(0) != '.') extension = "." + extension; int desktop = getDesktop(display); String mimeType = null; switch (desktop) { case DESKTOP_GIO: mimeType = gio_getMimeType(extension); break; case DESKTOP_GNOME: mimeType = gnome_getMimeType(extension); break; case DESKTOP_CDE: mimeType = cde_getMimeType(extension); break; } if (mimeType == null) return null; Program program = null; switch (desktop) { case DESKTOP_GIO: program = gio_getProgram(display, mimeType); break; case DESKTOP_GNOME: program = gnome_getProgram(display, mimeType); break; case DESKTOP_CDE: program = cde_getProgram(display, mimeType); break; } return program; } /** * Answer all program extensions in the operating system. Note * that a Display must already exist to guarantee * that this method returns an appropriate result. * * @return an array of extensions */ public static String[] getExtensions() { return getExtensions(Display.getCurrent()); } /* * API: When support for multiple displays is added, this method will * become public and the original method above can be deprecated. */ static String[] getExtensions(Display display) { int desktop = getDesktop(display); Hashtable mimeInfo = null; switch (desktop) { case DESKTOP_GIO: return gio_getExtensions(); case DESKTOP_GNOME: break; case DESKTOP_CDE: mimeInfo = cde_getDataTypeInfo(); break; } if (mimeInfo == null) return new String[0]; /* Create a unique set of the file extensions. */ Vector extensions = new Vector(); Enumeration keys = mimeInfo.keys(); while (keys.hasMoreElements()) { String mimeType = (String)keys.nextElement(); Vector mimeExts = (Vector)mimeInfo.get(mimeType); for (int index = 0; index < mimeExts.size(); index++){ if (!extensions.contains(mimeExts.elementAt(index))) { extensions.addElement(mimeExts.elementAt(index)); } } } /* Return the list of extensions. */ String[] extStrings = new String[extensions.size()]; for (int index = 0; index < extensions.size(); index++) { extStrings[index] = (String)extensions.elementAt(index); } return extStrings; } /** * Answers all available programs in the operating system. Note * that a Display must already exist to guarantee * that this method returns an appropriate result. * * @return an array of programs */ public static Program[] getPrograms() { return getPrograms(Display.getCurrent()); } /* * API: When support for multiple displays is added, this method will * become public and the original method above can be deprecated. */ static Program[] getPrograms(Display display) { int desktop = getDesktop(display); Hashtable mimeInfo = null; switch (desktop) { case DESKTOP_GIO: return gio_getPrograms(display); case DESKTOP_GNOME: break; case DESKTOP_CDE: mimeInfo = cde_getDataTypeInfo(); break; } if (mimeInfo == null) return new Program[0]; Vector programs = new Vector(); Enumeration keys = mimeInfo.keys(); while (keys.hasMoreElements()) { String mimeType = (String)keys.nextElement(); Program program = null; switch (desktop) { case DESKTOP_CDE: program = cde_getProgram(display, mimeType); break; } if (program != null) programs.addElement(program); } Program[] programList = new Program[programs.size()]; for (int index = 0; index < programList.length; index++) { programList[index] = (Program)programs.elementAt(index); } return programList; } ImageData gio_getImageData() { if (iconPath == null) return null; ImageData data = null; long /*int*/ icon_theme =OS.gtk_icon_theme_get_default(); byte[] icon = Converter.wcsToMbcs (null, iconPath, true); long /*int*/ gicon = OS.g_icon_new_for_string(icon, null); if (gicon != 0) { long /*int*/ gicon_info = OS.gtk_icon_theme_lookup_by_gicon (icon_theme, gicon, 16/*size*/, 0); if (gicon_info != 0) { long /*int*/ pixbuf = OS.gtk_icon_info_load_icon(gicon_info, null); if (pixbuf != 0) { int stride = OS.gdk_pixbuf_get_rowstride(pixbuf); long /*int*/ pixels = OS.gdk_pixbuf_get_pixels(pixbuf); int height = OS.gdk_pixbuf_get_height(pixbuf); int width = OS.gdk_pixbuf_get_width(pixbuf); boolean hasAlpha = OS.gdk_pixbuf_get_has_alpha(pixbuf); byte[] srcData = new byte[stride * height]; OS.memmove(srcData, pixels, srcData.length); OS.g_object_unref(pixbuf); if (hasAlpha) { PaletteData palette = new PaletteData(0xFF000000, 0xFF0000, 0xFF00); data = new ImageData(width, height, 32, palette, 4, srcData); data.bytesPerLine = stride; int s = 3, a = 0; byte[] alphaData = new byte[width*height]; for (int y=0; y 0) { Vector mimeTypes = new Vector (); String mimeType = line.substring (0, separatorIndex); String extensionFormat = line.substring (separatorIndex+1); int extensionIndex = extensionFormat.indexOf ("."); if (extensionIndex > 0) { String extension = extensionFormat.substring (extensionIndex); mimeTypes.add (mimeType); if (mimeTable.containsKey (extension)) { /* * If mimeType already exists, it is required to update * the existing key (mime-type) with the new extension. */ Vector value = (Vector) mimeTable.get (extension); mimeTypes.addAll (value); } mimeTable.put (extension, mimeTypes); } } OS.g_free(linePtr); linePtr = OS.g_data_input_stream_read_line (reader, length, 0, 0); } } if (reader != 0) OS.g_object_unref (reader); return mimeTable; } } return null; } finally { if (fileInfo != 0) OS.g_object_unref(fileInfo); if (fileInputStream != 0) OS.g_object_unref(fileInputStream); if (mimeDatabase != 0) OS.g_object_unref (mimeDatabase); } } static String gio_getMimeType(String extension) { String mimeType = null; Hashtable h = gio_getMimeInfo(); if (h != null && h.containsKey(extension)) { Vector mimeTypes = (Vector) h.get(extension); mimeType = (String) mimeTypes.get(0); } return mimeType; } static Program gio_getProgram(Display display, String mimeType) { Program program = null; byte[] mimeTypeBuffer = Converter.wcsToMbcs (null, mimeType, true); long /*int*/ application = OS.g_app_info_get_default_for_type (mimeTypeBuffer, false); if (application != 0) { program = gio_getProgram(display, application); } return program; } static Program gio_getProgram (Display display, long /*int*/ application) { Program program = new Program(); program.display = display; int length; byte[] buffer; long /*int*/ applicationName = OS.g_app_info_get_name (application); if (applicationName != 0) { length = OS.strlen (applicationName); if (length > 0) { buffer = new byte [length]; OS.memmove (buffer, applicationName, length); program.name = new String (Converter.mbcsToWcs (null, buffer)); } } long /*int*/ applicationCommand = OS.g_app_info_get_executable (application); if (applicationCommand != 0) { length = OS.strlen (applicationCommand); if (length > 0) { buffer = new byte [length]; OS.memmove (buffer, applicationCommand, length); program.command = new String (Converter.mbcsToWcs (null, buffer)); } } program.gnomeExpectUri = OS.g_app_info_supports_uris(application); long /*int*/ icon = OS.g_app_info_get_icon(application); if (icon != 0) { long /*int*/ icon_name = OS.g_icon_to_string(icon); if (icon_name != 0) { length = OS.strlen(icon_name); if (length > 0) { buffer = new byte[length]; OS.memmove(buffer, icon_name, length); program.iconPath = new String(Converter.mbcsToWcs(null, buffer)); } OS.g_free(icon_name); } OS.g_object_unref(icon); } return program.command != null ? program : null; } static Program[] gio_getPrograms(Display display) { long /*int*/ applicationList = OS.g_app_info_get_all (); long /*int*/ list = applicationList; Program program; Vector programs = new Vector(); while (list != 0) { long /*int*/ application = OS.g_list_data(list); if (application != 0) { //TODO: Should the list be filtered or not? // if (OS.g_app_info_should_show(application)) { program = gio_getProgram(display, application); if (program != null) programs.addElement(program); // } } list = OS.g_list_next(list); } if (applicationList != 0) OS.g_list_free(applicationList); Program[] programList = new Program[programs.size()]; for (int index = 0; index < programList.length; index++) { programList[index] = (Program)programs.elementAt(index); } return programList; } static boolean gio_isExecutable(String fileName) { byte[] fileNameBuffer = Converter.wcsToMbcs (null, fileName, true); if (OS.g_file_test(fileNameBuffer, OS.G_FILE_TEST_IS_DIR)) return false; if (!OS.g_file_test(fileNameBuffer, OS.G_FILE_TEST_IS_EXECUTABLE)) return false; long /*int*/ file = OS.g_file_new_for_path (fileNameBuffer); boolean result = false; if (file != 0) { byte[] buffer = Converter.wcsToMbcs (null, "*", true); //$NON-NLS-1$ long /*int*/ fileInfo = OS.g_file_query_info(file, buffer, 0, 0, 0); if (fileInfo != 0) { long /*int*/ contentType = OS.g_file_info_get_content_type(fileInfo); if (contentType != 0) { byte[] exeType = Converter.wcsToMbcs (null, "application/x-executable", true); //$NON-NLS-1$ result = OS.g_content_type_is_a(contentType, exeType); if (!result) { byte [] shellType = Converter.wcsToMbcs (null, "application/x-shellscript", true); //$NON-NLS-1$ result = OS.g_content_type_equals(contentType, shellType); } } OS.g_object_unref(fileInfo); } OS.g_object_unref (file); } return result; } /** * GNOME 2.4 - Launch the default program for the given file. */ static boolean gio_launch(String fileName) { boolean result = false; byte[] fileNameBuffer = Converter.wcsToMbcs (null, fileName, true); long /*int*/ file = OS.g_file_new_for_commandline_arg (fileNameBuffer); if (file != 0) { long /*int*/ uri = OS.g_file_get_uri (file); if (uri != 0) { result = OS.g_app_info_launch_default_for_uri (uri, 0, 0); OS.g_free(uri); } OS.g_object_unref (file); } return result; } /** * GIO - Execute the program for the given file. */ boolean gio_execute(String fileName) { boolean result = false; byte[] commandBuffer = Converter.wcsToMbcs (null, command, true); byte[] nameBuffer = Converter.wcsToMbcs (null, name, true); long /*int*/ application = OS.g_app_info_create_from_commandline(commandBuffer, nameBuffer, gnomeExpectUri ? OS.G_APP_INFO_CREATE_SUPPORTS_URIS : OS.G_APP_INFO_CREATE_NONE, 0); if (application != 0) { byte[] fileNameBuffer = Converter.wcsToMbcs (null, fileName, true); long /*int*/ file = 0; if (fileName.length() > 0) { if (OS.g_app_info_supports_uris (application)) { file = OS.g_file_new_for_uri (fileNameBuffer); } else { file = OS.g_file_new_for_path (fileNameBuffer); } } long /*int*/ list = 0; if (file != 0) list = OS.g_list_append (0, file); result = OS.g_app_info_launch (application, list, 0, 0); if (list != 0) { OS.g_list_free (list); OS.g_object_unref (file); } OS.g_object_unref (application); } return result; } static String[] gio_getExtensions() { Hashtable mimeInfo = gio_getMimeInfo(); if (mimeInfo == null) return new String[0]; /* Create a unique set of the file extensions. */ Vector extensions = new Vector(); Enumeration keys = mimeInfo.keys(); while (keys.hasMoreElements()) { String extension = (String)keys.nextElement(); extensions.add(extension); } /* Return the list of extensions. */ String [] extStrings = new String[extensions.size()]; for (int index = 0; index < extensions.size(); index++) { extStrings[index] = (String)extensions.elementAt(index); } return extStrings; } static boolean isExecutable(Display display, String fileName) { switch(getDesktop(display)) { case DESKTOP_GIO: return gio_isExecutable(fileName); case DESKTOP_GNOME: return gnome_isExecutable(fileName); case DESKTOP_CDE: return false; //cde_isExecutable() } return false; } /** * Launches the operating system executable associated with the file or * URL (http:// or https://). If the file is an executable then the * executable is launched. Note that a Display must already * exist to guarantee that this method returns an appropriate result. * * @param fileName the file or program name or URL (http:// or https://) * @return true if the file is launched, otherwise false * * @exception IllegalArgumentException
    *
  • ERROR_NULL_ARGUMENT when fileName is null
  • *
*/ public static boolean launch(String fileName) { return launch(Display.getCurrent(), fileName, null); } /** * Launches the operating system executable associated with the file or * URL (http:// or https://). If the file is an executable then the * executable is launched. The program is launched with the specified * working directory only when the workingDir exists and * fileName is an executable. * Note that a Display must already exist to guarantee * that this method returns an appropriate result. * * @param fileName the file name or program name or URL (http:// or https://) * @param workingDir the name of the working directory or null * @return true if the file is launched, otherwise false * * @exception IllegalArgumentException
    *
  • ERROR_NULL_ARGUMENT when fileName is null
  • *
* * @since 3.6 */ public static boolean launch (String fileName, String workingDir) { return launch(Display.getCurrent(), fileName, workingDir); } /* * API: When support for multiple displays is added, this method will * become public and the original method above can be deprecated. */ static boolean launch (Display display, String fileName, String workingDir) { if (fileName == null) SWT.error (SWT.ERROR_NULL_ARGUMENT); if (workingDir != null && isExecutable(display, fileName)) { try { Compatibility.exec (new String [] {fileName}, null, workingDir); return true; } catch (IOException e) { return false; } } switch (getDesktop (display)) { case DESKTOP_GIO: if (gio_launch (fileName)) return true; case DESKTOP_GNOME: if (gnome_launch (fileName)) return true; default: int index = fileName.lastIndexOf ('.'); if (index != -1) { String extension = fileName.substring (index); Program program = Program.findProgram (display, extension); if (program != null && program.execute (fileName)) return true; } String lowercaseName = fileName.toLowerCase (); if (lowercaseName.startsWith (PREFIX_HTTP) || lowercaseName.startsWith (PREFIX_HTTPS)) { Program program = Program.findProgram (display, ".html"); //$NON-NLS-1$ if (program == null) { program = Program.findProgram (display, ".htm"); //$NON-NLS-1$ } if (program != null && program.execute (fileName)) return true; } break; } /* If the above launch attempts didn't launch the file, then try with exec().*/ try { Compatibility.exec (new String [] {fileName}, null, workingDir); return true; } catch (IOException e) { return false; } } /** * Compares the argument to the receiver, and returns true * if they represent the same object using a class * specific comparison. * * @param other the object to compare with this object * @return true if the object is the same as this object and false otherwise * * @see #hashCode() */ public boolean equals(Object other) { if (this == other) return true; if (!(other instanceof Program)) return false; Program program = (Program)other; return display == program.display && name.equals(program.name) && command.equals(program.command); } /** * Executes the program with the file as the single argument * in the operating system. It is the responsibility of the * programmer to ensure that the file contains valid data for * this program. * * @param fileName the file or program name * @return true if the file is launched, otherwise false * * @exception IllegalArgumentException
    *
  • ERROR_NULL_ARGUMENT when fileName is null
  • *
*/ public boolean execute(String fileName) { if (fileName == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); int desktop = getDesktop(display); switch (desktop) { case DESKTOP_GIO: return gio_execute(fileName); case DESKTOP_GNOME: return gnome_execute(fileName); case DESKTOP_CDE: return cde_execute(fileName); } return false; } /** * Returns the receiver's image data. This is the icon * that is associated with the receiver in the operating * system. * * @return the image data for the program, may be null */ public ImageData getImageData() { switch (getDesktop(display)) { case DESKTOP_GIO: return gio_getImageData(); case DESKTOP_GNOME: return gnome_getImageData(); case DESKTOP_CDE: return cde_getImageData(); } return null; } /** * Returns the receiver's name. This is as short and * descriptive a name as possible for the program. If * the program has no descriptive name, this string may * be the executable name, path or empty. * * @return the name of the program */ public String getName() { return name; } /** * Returns an integer hash code for the receiver. Any two * objects that return true when passed to * equals must return the same value for this * method. * * @return the receiver's hash * * @see #equals(Object) */ public int hashCode() { return name.hashCode() ^ command.hashCode() ^ display.hashCode(); } /** * Returns a string containing a concise, human-readable * description of the receiver. * * @return a string representation of the program */ public String toString() { return "Program {" + name + "}"; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy