package org.eclipse.swt.ole.win32; | |
/* | |
* (c) Copyright IBM Corp. 2000, 2001. | |
* All Rights Reserved | |
*/ | |
import org.eclipse.swt.*; | |
import java.io.File; | |
import org.eclipse.swt.internal.ole.win32.COM; | |
import org.eclipse.swt.internal.win32.OS; | |
import org.eclipse.swt.internal.win32.TCHAR; | |
/** | |
* | |
* OLE contains all the constants used to create an ActiveX Control or an OLE Document. | |
* | |
* <p>Definitions for these constants can be found in MSDN. | |
* | |
*/ | |
public class OLE extends SWT { | |
public static final int S_FALSE = 1; // Used for functions that semantically return a Boolean FALSE result to indicate that the function succeeded. | |
public static final int S_OK = 0; // Function succeeded. | |
// Verbs that can be invoked on this client | |
public static final int OLEIVERB_DISCARDUNDOSTATE = -6; // close the OLE object and discard the undo state | |
public static final int OLEIVERB_HIDE = -3; // hide the OLE object | |
public static final int OLEIVERB_INPLACEACTIVATE = -5; // open the OLE for editing in-place | |
public static final int OLEIVERB_OPEN = -2; // open the OLE object for editing in a separate window | |
public static final int OLEIVERB_PRIMARY = 0; // opens the OLE object for editing | |
public static final int OLEIVERB_PROPERTIES = -7; // request the OLE object properties dialog | |
public static final int OLEIVERB_SHOW = -1; // show the OLE object | |
public static final int OLEIVERB_UIACTIVATE = -4; // activate the UI for the OLE object | |
public static final int PROPERTY_CHANGING = 0; | |
public static final int PROPERTY_CHANGED = 1; | |
/** | |
* Error code for OleError - No specific error information available | |
*/ | |
public static final int HRESULT_UNSPECIFIED = 0; | |
/** | |
* Error code for OleError - Failed to create file | |
*/ | |
public static final int ERROR_CANNOT_CREATE_FILE = 1000; | |
/** | |
* Error code for OleError - Failed to create Ole Client | |
*/ | |
public static final int ERROR_CANNOT_CREATE_OBJECT = 1001; | |
/** | |
* Error code for OleError - File does not exist, is not accessible to user or does not have the correct format | |
*/ | |
public static final int ERROR_CANNOT_OPEN_FILE = 1002; | |
/** | |
* Error code for OleError - Failed to find requested interface on OLE Object | |
*/ | |
public static final int ERROR_INTERFACE_NOT_FOUND = 1003; | |
/** | |
* Error code for OleError - Class ID not found in registry | |
*/ | |
public static final int ERROR_INVALID_CLASSID = 1004; | |
/** | |
* Error code for OleError - Failed to get the class factory for the specified classID | |
*/ | |
public static final int ERROR_CANNOT_ACCESS_CLASSFACTORY = 1005; | |
/** | |
* Error code for OleError - Failed to create Licensed instance | |
*/ | |
public static final int ERROR_CANNOT_CREATE_LICENSED_OBJECT = 1006; | |
/** | |
* Error code for OleError - Out of Memory | |
*/ | |
public static final int ERROR_OUT_OF_MEMORY = 1007; | |
/** | |
* Error code for OleError - Failed to change Variant type | |
*/ | |
public static final int ERROR_CANNOT_CHANGE_VARIANT_TYPE = 1010; | |
/** | |
* Error code for OleError - Invalid address received for Ole Interface | |
*/ | |
public static final int ERROR_INVALID_INTERFACE_ADDRESS = 1011; | |
/** | |
* Error code for OleError - Unable to find Application | |
*/ | |
public static final int ERROR_APPLICATION_NOT_FOUND = 1013; | |
/** | |
* Error code for OleError - Action can not be performed | |
*/ | |
public static final int ERROR_ACTION_NOT_PERFORMED = 1014; | |
public static final int OLECMDF_SUPPORTED = 1; | |
public static final int OLECMDF_ENABLED = 2; | |
public static final int OLECMDF_LATCHED = 4; | |
public static final int OLECMDF_NINCHED = 8; | |
public static final int OLECMDTEXTF_NONE = 0; | |
public static final int OLECMDTEXTF_NAME = 1; | |
public static final int OLECMDTEXTF_STATUS = 2; | |
public static final int OLECMDEXECOPT_DODEFAULT = 0; | |
public static final int OLECMDEXECOPT_PROMPTUSER = 1; | |
public static final int OLECMDEXECOPT_DONTPROMPTUSER = 2; | |
public static final int OLECMDEXECOPT_SHOWHELP = 3; | |
public static final int OLECMDID_OPEN = 1; | |
public static final int OLECMDID_NEW = 2; | |
public static final int OLECMDID_SAVE = 3; | |
public static final int OLECMDID_SAVEAS = 4; | |
public static final int OLECMDID_SAVECOPYAS = 5; | |
public static final int OLECMDID_PRINT = 6; | |
public static final int OLECMDID_PRINTPREVIEW = 7; | |
public static final int OLECMDID_PAGESETUP = 8; | |
public static final int OLECMDID_SPELL = 9; | |
public static final int OLECMDID_PROPERTIES = 10; | |
public static final int OLECMDID_CUT = 11; | |
public static final int OLECMDID_COPY = 12; | |
public static final int OLECMDID_PASTE = 13; | |
public static final int OLECMDID_PASTESPECIAL = 14; | |
public static final int OLECMDID_UNDO = 15; | |
public static final int OLECMDID_REDO = 16; | |
public static final int OLECMDID_SELECTALL = 17; | |
public static final int OLECMDID_CLEARSELECTION = 18; | |
public static final int OLECMDID_ZOOM = 19; | |
public static final int OLECMDID_GETZOOMRANGE = 20; | |
public static final int OLECMDID_UPDATECOMMANDS = 21; | |
public static final int OLECMDID_REFRESH = 22; | |
public static final int OLECMDID_STOP = 23; | |
public static final int OLECMDID_HIDETOOLBARS = 24; | |
public static final int OLECMDID_SETPROGRESSMAX = 25; | |
public static final int OLECMDID_SETPROGRESSPOS = 26; | |
public static final int OLECMDID_SETPROGRESSTEXT = 27; | |
public static final int OLECMDID_SETTITLE = 28; | |
public static final int OLECMDID_SETDOWNLOADSTATE = 29; | |
public static final int OLECMDID_STOPDOWNLOAD = 30; | |
/* Ole Property Description flags */ | |
public static int VARFLAG_FREADONLY = 0x1; | |
public static int VARFLAG_FSOURCE = 0x2; | |
public static int VARFLAG_FBINDABLE = 0x4; | |
public static int VARFLAG_FREQUESTEDIT = 0x8; | |
public static int VARFLAG_FDISPLAYBIND = 0x10; | |
public static int VARFLAG_FDEFAULTBIND = 0x20; | |
public static int VARFLAG_FHIDDEN = 0x40; | |
public static int VARFLAG_FRESTRICTED = 0x80; | |
public static int VARFLAG_FDEFAULTCOLLELEM = 0x100; | |
public static int VARFLAG_FUIDEFAULT = 0x200; | |
public static int VARFLAG_FNONBROWSABLE = 0x400; | |
public static int VARFLAG_FREPLACEABLE = 0x800; | |
public static int VARFLAG_FIMMEDIATEBIND = 0x1000; | |
/* Ole Property Description kind */ | |
public static int VAR_PERINSTANCE = 0; | |
public static int VAR_STATIC = 1; | |
public static int VAR_CONST = 2; | |
public static int VAR_DISPATCH = 3; | |
/* Ole Parameter Description flags */ | |
public static short IDLFLAG_NONE = 0; | |
public static short IDLFLAG_FIN = 1; | |
public static short IDLFLAG_FOUT = 2; | |
public static short IDLFLAG_FLCID = 4; | |
public static short IDLFLAG_FRETVAL = 8; | |
/* Ole Description types */ | |
public static final short VT_BOOL = 11; // Boolean; True=-1, False=0. | |
public static final short VT_BSTR = 8; // Binary String. | |
public static final short VT_BYREF = 16384; // By reference - must be combined with one of the othre VT values | |
public static final short VT_CY = 6; // Currency. | |
public static final short VT_DATE = 7; // Date. | |
public static final short VT_DISPATCH = 9; // IDispatch | |
public static final short VT_EMPTY = 0; // Not specified. | |
public static final short VT_ERROR = 10; // Scodes. | |
public static final short VT_I2 = 2; // 2-byte signed int. | |
public static final short VT_I4 = 3; // 4-byte signed int. | |
public static final short VT_NULL = 1; // Null. | |
public static final short VT_R4 = 4; // 4-byte real. | |
public static final short VT_R8 = 5; // 8-byte real. | |
public static final short VT_UI1 = 17; // Unsigned char. | |
public static final short VT_UI4 = 19; // Unsigned int. | |
public static final short VT_UNKNOWN = 13; // IUnknown FAR*. | |
public static final short VT_VARIANT = 12; // VARIANT FAR*. | |
public static final short VT_PTR = 26; | |
public static final short VT_USERDEFINED = 29; | |
public static final short VT_HRESULT = 25; | |
public static final short VT_DECIMAL = 14; | |
public static final short VT_I1 = 16; | |
public static final short VT_UI2 = 18; | |
public static final short VT_I8 = 20; | |
public static final short VT_UI8 = 21; | |
public static final short VT_INT = 22; | |
public static final short VT_UINT = 23; | |
public static final short VT_VOID = 24; | |
public static final short VT_SAFEARRAY = 27; | |
public static final short VT_CARRAY = 28; | |
public static final short VT_LPSTR = 30; | |
public static final short VT_LPWSTR = 31; | |
public static final short VT_RECORD = 36; | |
public static final short VT_FILETIME = 64; | |
public static final short VT_BLOB = 65; | |
public static final short VT_STREAM = 66; | |
public static final short VT_STORAGE = 67; | |
public static final short VT_STREAMED_OBJECT = 68; | |
public static final short VT_STORED_OBJECT = 69; | |
public static final short VT_BLOB_OBJECT = 70; | |
public static final short VT_CF = 71; | |
public static final short VT_CLSID = 72; | |
public static final short VT_VERSIONED_STREAM = 73; | |
public static final short VT_BSTR_BLOB = 0xfff; | |
public static final short VT_VECTOR = 0x1000; | |
public static final short VT_ARRAY = 0x2000; | |
/* Ole Function Description Invoke Kind values */ | |
public static final int INVOKE_FUNC = 1; | |
public static final int INVOKE_PROPERTYGET = 2; | |
public static final int INVOKE_PROPERTYPUT = 4; | |
public static final int INVOKE_PROPERTYPUTREF = 8; | |
/* Ole Function Description function kind */ | |
public static final int FUNC_VIRTUAL = 0; | |
public static final int FUNC_PUREVIRTUAL = 1; | |
public static final int FUNC_NONVIRTUAL = 2; | |
public static final int FUNC_STATIC = 3; | |
public static final int FUNC_DISPATCH = 4; | |
/* Ole Function Description function flags */ | |
public static final short FUNCFLAG_FRESTRICTED = 1; | |
public static final short FUNCFLAG_FSOURCE = 0x2; | |
public static final short FUNCFLAG_FBINDABLE = 0x4; | |
public static final short FUNCFLAG_FREQUESTEDIT = 0x8; | |
public static final short FUNCFLAG_FDISPLAYBIND = 0x10; | |
public static final short FUNCFLAG_FDEFAULTBIND = 0x20; | |
public static final short FUNCFLAG_FHIDDEN = 0x40; | |
public static final short FUNCFLAG_FUSESGETLASTERROR = 0x80; | |
public static final short FUNCFLAG_FDEFAULTCOLLELEM = 0x100; | |
public static final short FUNCFLAG_FUIDEFAULT = 0x200; | |
public static final short FUNCFLAG_FNONBROWSABLE = 0x400; | |
public static final short FUNCFLAG_FREPLACEABLE = 0x800; | |
public static final short FUNCFLAG_FIMMEDIATEBIND = 0x1000; | |
/* Ole Function Description calling convention */ | |
public static final int CC_FASTCALL = 0; | |
public static final int CC_CDECL = 1; | |
public static final int CC_MSCPASCAL = 2; | |
public static final int CC_PASCAL = 2; | |
public static final int CC_MACPASCAL = 3; | |
public static final int CC_STDCALL = 4; | |
public static final int CC_FPFASTCALL = 5; | |
public static final int CC_SYSCALL = 6; | |
public static final int CC_MPWCDECL = 7; | |
public static final int CC_MPWPASCAL = 8; | |
public static final int CC_MAX = 9; | |
static final String ERROR_NOT_IMPLEMENTED_MSG = "Required functionality not currently supported."; | |
static final String ERROR_CANNOT_CREATE_FILE_MSG = "Failed to create file."; | |
static final String ERROR_CANNOT_CREATE_OBJECT_MSG = "Failed to create Ole Client."; | |
static final String ERROR_CANNOT_OPEN_FILE_MSG = "File does not exist, is not accessible to user or does not have the correct format."; | |
static final String ERROR_INTERFACE_NOT_FOUND_MSG = "Failed to find requested interface on OLE Object."; | |
static final String ERROR_INVALID_CLASSID_MSG = "Class ID not found in registry"; | |
static final String ERROR_CANNOT_ACCESS_CLASSFACTORY_MSG = "Failed to get the class factory for the specified classID"; | |
static final String ERROR_CANNOT_CREATE_LICENSED_OBJECT_MSG = "Failed to create Licensed instance"; | |
static final String ERROR_OUT_OF_MEMORY_MSG = "Out of Memory"; | |
static final String ERROR_CANNOT_CHANGE_VARIANT_TYPE_MSG = "Failed to change Variant type"; | |
static final String ERROR_INVALID_INTERFACE_ADDRESS_MSG = "Invalid address received for Ole Interface."; | |
static final String ERROR_APPLICATION_NOT_FOUND_MSG = "Unable to find Application."; | |
static final String ERROR_ACTION_NOT_PERFORMED_MSG = "Action can not be performed."; | |
public static void error (int code) { | |
error (code, 0); | |
} | |
public static void error (int code, int hresult) { | |
switch (code) { | |
/* Illegal Arguments (non-fatal) */ | |
case ERROR_INVALID_INTERFACE_ADDRESS :{ | |
throw new IllegalArgumentException (ERROR_INVALID_INTERFACE_ADDRESS_MSG); | |
} | |
/* SWT Errors (non-fatal) */ | |
case ERROR_CANNOT_CREATE_FILE : { | |
String msg = ERROR_CANNOT_CREATE_FILE_MSG; | |
if (hresult != 0) msg += " result = "+hresult; | |
throw new SWTException (code, msg); | |
} | |
case ERROR_CANNOT_CREATE_OBJECT : { | |
String msg = ERROR_CANNOT_CREATE_OBJECT_MSG; | |
if (hresult != 0) msg += " result = "+hresult; | |
throw new SWTException (code, msg); | |
} | |
case ERROR_CANNOT_OPEN_FILE : { | |
String msg = ERROR_CANNOT_OPEN_FILE_MSG; | |
if (hresult != 0) msg += " result = "+hresult; | |
throw new SWTException (code, msg); | |
} | |
case ERROR_INTERFACE_NOT_FOUND : { | |
String msg = ERROR_INTERFACE_NOT_FOUND_MSG; | |
if (hresult != 0) msg += " result = "+hresult; | |
throw new SWTException (code, msg); | |
} | |
case ERROR_INVALID_CLASSID : { | |
String msg = ERROR_INVALID_CLASSID_MSG; | |
if (hresult != 0) msg += " result = "+hresult; | |
throw new SWTException (code, msg); | |
} | |
case ERROR_CANNOT_ACCESS_CLASSFACTORY : { | |
String msg = ERROR_CANNOT_ACCESS_CLASSFACTORY_MSG; | |
if (hresult != 0) msg += " result = "+hresult; | |
throw new SWTException (code, msg); | |
} | |
case ERROR_CANNOT_CREATE_LICENSED_OBJECT : { | |
String msg = ERROR_CANNOT_CREATE_LICENSED_OBJECT_MSG; | |
if (hresult != 0) msg += " result = "+hresult; | |
throw new SWTException (code, msg); | |
} | |
case ERROR_CANNOT_CHANGE_VARIANT_TYPE : { | |
String msg = ERROR_CANNOT_CHANGE_VARIANT_TYPE_MSG; | |
if (hresult != 0) msg += " result = "+hresult; | |
throw new SWTException (code, msg); | |
} | |
case ERROR_APPLICATION_NOT_FOUND : { | |
String msg = ERROR_APPLICATION_NOT_FOUND_MSG; | |
if (hresult != 0) msg += " result = "+hresult; | |
throw new SWTException (code, msg); | |
} | |
case ERROR_ACTION_NOT_PERFORMED : { | |
String msg = ERROR_ACTION_NOT_PERFORMED_MSG; | |
if (hresult != 0) msg += " result = "+hresult; | |
throw new SWTException (code, msg); | |
} | |
/* OS Failure/Limit (fatal, may occur only on some platforms) */ | |
case ERROR_OUT_OF_MEMORY : { | |
String msg = ERROR_ACTION_NOT_PERFORMED_MSG; | |
if (hresult != 0) msg += " result = "+hresult; | |
throw new SWTError (code, msg); | |
} | |
} | |
/* Unknown/Undefined Error */ | |
SWT.error(code); | |
} | |
/* | |
* Finds the OLE program id that is associated with an extension. | |
* The extension may or may not begin with a '.'. On platforms | |
* that do not support OLE, an empty string is returned. | |
* | |
* @param extension the program extension | |
* @return a string that is the OLE program id or an empty string | |
* | |
* @exception SWTError <ul> | |
* <li>ERROR_NULL_ARGUMENT when extension is null</li> | |
* </ul> | |
*/ | |
public static String findProgramID (String extension) { | |
if (extension == null) SWT.error (SWT.ERROR_NULL_ARGUMENT); | |
if (extension.length () == 0) return ""; | |
if (extension.charAt (0) != '.') extension = "." + extension; | |
/* Use the character encoding for the default locale */ | |
TCHAR extensionKey = new TCHAR(0, extension, true); | |
String result = getKeyValue(extensionKey); | |
if (result != null) { | |
// look for "<programID>\NotInsertable" | |
TCHAR notInsertableKey = new TCHAR(0, result+"\\NotInsertable", true); | |
if (getKeyExists(notInsertableKey)) return ""; | |
// look for "<programID>\Insertable" | |
TCHAR insertableKey = new TCHAR(0, result+"\\Insertable", true); | |
if (getKeyExists(insertableKey)) return result; | |
// look for "<programID>\protocol\StdFileEditing\server" | |
TCHAR serverKey = new TCHAR(0, result+"\\protocol\\StdFileEditing\\server", true); | |
if (getKeyExists(serverKey)) return result; | |
} | |
return ""; | |
} | |
static String getKeyValue (TCHAR key) { | |
int [] phkResult = new int [1]; | |
if (OS.RegOpenKeyEx (OS.HKEY_CLASSES_ROOT, key, 0, OS.KEY_READ, phkResult) != 0) { | |
return null; | |
} | |
String result = null; | |
int [] lpcbData = new int [1]; | |
if (OS.RegQueryValueEx (phkResult [0], (TCHAR) null, 0, null, null, lpcbData) == 0) { | |
/* Use the character encoding for the default locale */ | |
TCHAR lpData = new TCHAR (0, lpcbData [0] / TCHAR.sizeof); | |
if (OS.RegQueryValueEx (phkResult [0], null, 0, null, lpData, lpcbData) == 0) { | |
int length = Math.max(0, lpData.length () - 1); | |
result = lpData.toString (0, length); | |
} | |
} | |
if (phkResult [0] != 0) OS.RegCloseKey (phkResult [0]); | |
return result; | |
} | |
private static boolean getKeyExists (TCHAR key) { | |
int [] phkResult = new int [1]; | |
if (OS.RegOpenKeyEx (OS.HKEY_CLASSES_ROOT, key, 0, OS.KEY_READ, phkResult) != 0) { | |
return false; | |
} | |
if (phkResult [0] != 0) OS.RegCloseKey (phkResult [0]); | |
return true; | |
} | |
/** | |
* Returns true if the specified file has an OLE Storage format. | |
* | |
* Note all empty files (regardless of extension) will return false. | |
* | |
* @param file the file to be checked | |
* | |
* @return true if this file has an OLE Storage format | |
*/ | |
public static boolean isOleFile(File file) { | |
if (file == null || !file.exists() || file.isDirectory()) | |
return false; | |
return (COM.StgIsStorageFile((file.getAbsolutePath()+"\0").toCharArray()) == COM.S_OK); | |
} | |
} |