/*******************************************************************************
* 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 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.snippets;
/*
* OLE and ActiveX example snippet: browse the typelibinfo for a program id (win32 only)
* NOTE: This snippet uses internal SWT packages that are
* subject to change without notice.
*
* For a list of all SWT example snippets see
* http://www.eclipse.org/swt/snippets/
*/
import org.eclipse.swt.*;
import org.eclipse.swt.internal.ole.win32.*;
import org.eclipse.swt.ole.win32.*;
import org.eclipse.swt.widgets.*;
public class Snippet81 {
public static void main(String[] args) {
if (args.length == 0) {
System.out.println("Usage: java Main <program id>");
return;
}
String progID = args[0];
Display display = new Display();
Shell shell = new Shell(display);
OleFrame frame = new OleFrame(shell, SWT.NONE);
OleControlSite site = null;
OleAutomation auto = null;
try {
site = new OleControlSite(frame, SWT.NONE, progID);
auto = new OleAutomation(site);
} catch (SWTException ex) {
System.out.println("Unable to open type library for "+progID);
display.dispose();
return;
}
printTypeInfo(auto);
auto.dispose();
shell.dispose();
display.dispose();
}
private static void printTypeInfo(OleAutomation auto) {
TYPEATTR typeattr = auto.getTypeInfoAttributes();
if (typeattr != null) {
if (typeattr.cFuncs > 0) System.out.println("Functions :\n");
for (int i = 0; i < typeattr.cFuncs; i++) {
OleFunctionDescription data = auto.getFunctionDescription(i);
String argList = "";
int firstOptionalArgIndex = data.args.length - data.optionalArgCount;
for (int j = 0; j < data.args.length; j++) {
argList += "[";
if (j >= firstOptionalArgIndex) argList += "optional, ";
argList += getDirection(data.args[j].flags)+"] "+getTypeName(data.args[j].type)+" "+data.args[j].name;
if ( j < data.args.length - 1) argList += ", ";
}
System.out.println(getInvokeKind(data.invokeKind)+" (id = "+data.id+") : "
+"\n\tSignature : "+getTypeName(data.returnType)+" "+data.name+"("+argList+")"
+"\n\tDescription : "+data.documentation
+"\n\tHelp File : "+data.helpFile+"\n");
}
if (typeattr.cVars > 0) System.out.println("\n\nVariables :\n");
for (int i = 0; i < typeattr.cVars; i++) {
OlePropertyDescription data = auto.getPropertyDescription(i);
System.out.println("PROPERTY (id = "+data.id+") :"
+"\n\tName : "+data.name
+"\n\tType : "+getTypeName(data.type)+"\n");
}
}
}
private static String getTypeName(int type) {
switch (type) {
case OLE.VT_BOOL : return "boolean";
case OLE.VT_R4 : return "float";
case OLE.VT_R8 : return "double";
case OLE.VT_I4 : return "int";
case OLE.VT_DISPATCH : return "IDispatch";
case OLE.VT_UNKNOWN : return "IUnknown";
case OLE.VT_I2 : return "short";
case OLE.VT_BSTR : return "String";
case OLE.VT_VARIANT : return "Variant";
case OLE.VT_CY : return "Currency";
case OLE.VT_DATE : return "Date";
case OLE.VT_UI1 : return "unsigned char";
case OLE.VT_UI4 : return "unsigned int";
case OLE.VT_USERDEFINED : return "UserDefined";
case OLE.VT_HRESULT : return "int";
case OLE.VT_VOID : return "void";
case OLE.VT_BYREF | OLE.VT_BOOL : return "boolean *";
case OLE.VT_BYREF | OLE.VT_R4 : return "float *";
case OLE.VT_BYREF | OLE.VT_R8 : return "double *";
case OLE.VT_BYREF | OLE.VT_I4 : return "int *";
case OLE.VT_BYREF | OLE.VT_DISPATCH : return "IDispatch *";
case OLE.VT_BYREF | OLE.VT_UNKNOWN : return "IUnknown *";
case OLE.VT_BYREF | OLE.VT_I2 : return "short *";
case OLE.VT_BYREF | OLE.VT_BSTR : return "String *";
case OLE.VT_BYREF | OLE.VT_VARIANT : return "Variant *";
case OLE.VT_BYREF | OLE.VT_CY : return "Currency *";
case OLE.VT_BYREF | OLE.VT_DATE : return "Date *";
case OLE.VT_BYREF | OLE.VT_UI1 : return "unsigned char *";
case OLE.VT_BYREF | OLE.VT_UI4 : return "unsigned int *";
case OLE.VT_BYREF | OLE.VT_USERDEFINED : return "UserDefined *";
}
return "unknown "+ type;
}
private static String getDirection(int direction){
String dirString = "";
boolean comma = false;
if ((direction & OLE.IDLFLAG_FIN) != 0) {
dirString += "in";
comma = true;
}
if ((direction & OLE.IDLFLAG_FOUT) != 0){
if (comma) dirString += ", ";
dirString += "out";
comma = true;
}
if ((direction & OLE.IDLFLAG_FLCID) != 0){
if (comma) dirString += ", ";
dirString += "lcid";
comma = true;
}
if ((direction & OLE.IDLFLAG_FRETVAL) != 0){
if (comma) dirString += ", ";
dirString += "retval";
}
return dirString;
}
private static String getInvokeKind(int invKind) {
switch (invKind) {
case OLE.INVOKE_FUNC : return "METHOD";
case OLE.INVOKE_PROPERTYGET : return "PROPERTY GET";
case OLE.INVOKE_PROPERTYPUT : return "PROPERTY PUT";
case OLE.INVOKE_PROPERTYPUTREF : return "PROPERTY PUT BY REF";
}
return "unknown "+invKind;
}
}