summaryrefslogtreecommitdiffstats
path: root/bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/ole/win32/ITypeInfo.java
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/ole/win32/ITypeInfo.java')
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/ole/win32/ITypeInfo.java154
1 files changed, 154 insertions, 0 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/ole/win32/ITypeInfo.java b/bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/ole/win32/ITypeInfo.java
new file mode 100644
index 0000000000..c67a5069ef
--- /dev/null
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/ole/win32/ITypeInfo.java
@@ -0,0 +1,154 @@
+package org.eclipse.swt.internal.ole.win32;
+
+/*
+ * (c) Copyright IBM Corp. 2000, 2001.
+ * All Rights Reserved
+ */
+
+import org.eclipse.swt.internal.win32.OS;
+
+public class ITypeInfo extends IUnknown
+{
+
+public ITypeInfo(int address) {
+ super(address);
+}
+public int GetDocumentation(int index, String[] name, String[] docString, int[] pdwHelpContext, String[] helpFile ) {
+ int[] pBstrName = null;
+ if (name != null) pBstrName = new int[1];
+ int[] pBstrDocString = null;
+ if (docString != null) pBstrDocString = new int[1];
+ int[] pBstrHelpFile = null;
+ if (helpFile != null) pBstrHelpFile = new int[1];
+ int rc = COM.VtblCall(12, address, index, pBstrName, pBstrDocString, pdwHelpContext, pBstrHelpFile);
+ if (name != null && pBstrName[0] != 0) {
+ int size = COM.SysStringByteLen(pBstrName[0]);
+ if (size > 0){
+ // get the unicode character array from the global memory and create a String
+ char[] buffer = new char[(size + 1) /2]; // add one to avoid rounding errors
+ COM.MoveMemory(buffer, pBstrName[0], size);
+ name[0] = new String(buffer);
+ int subindex = name[0].indexOf("\0");
+ if (subindex > 0)
+ name[0] = name[0].substring(0, subindex);
+ }
+ COM.SysFreeString(pBstrName[0]);
+ }
+ if (docString != null && pBstrDocString[0] != 0) {
+ int size = COM.SysStringByteLen(pBstrDocString[0]);
+ if (size > 0){
+ // get the unicode character array from the global memory and create a String
+ char[] buffer = new char[(size + 1) /2]; // add one to avoid rounding errors
+ COM.MoveMemory(buffer, pBstrDocString[0], size);
+ docString[0] = new String(buffer);
+ int subindex = docString[0].indexOf("\0");
+ if (subindex > 0)
+ docString[0] = docString[0].substring(0, subindex);
+ }
+ COM.SysFreeString(pBstrDocString[0]);
+ }
+ if (helpFile != null && pBstrHelpFile[0] != 0) {
+ int size = COM.SysStringByteLen(pBstrHelpFile[0]);
+ if (size > 0){
+ // get the unicode character array from the global memory and create a String
+ char[] buffer = new char[(size + 1) /2]; // add one to avoid rounding errors
+ COM.MoveMemory(buffer, pBstrHelpFile[0], size);
+ helpFile[0] = new String(buffer);
+ int subindex = helpFile[0].indexOf("\0");
+ if (subindex > 0)
+ helpFile[0] = helpFile[0].substring(0, subindex);
+ }
+ COM.SysFreeString(pBstrHelpFile[0]);
+ }
+ return rc;
+}
+public int GetFuncDesc(int index, int[] ppFuncDesc) {
+ return COM.VtblCall(5, address, index, ppFuncDesc);
+}
+public int GetIDsOfNames(String[] rgszNames, int cNames, int[] pMemId) {
+
+ char[] buffer;
+ int size = rgszNames.length;
+
+ // create an array to hold the addresses
+ int hHeap = OS.GetProcessHeap();
+ int ppNames = OS.HeapAlloc(hHeap, OS.HEAP_ZERO_MEMORY, size*4);
+ int[] memTracker = new int[size];
+
+ try {
+ // add the address of each string to the array
+
+ for (int i=0; i<size; i++){
+ // create a null terminated array of char for each String
+ int nameSize = rgszNames[i].length();
+ buffer = new char[nameSize +1];
+ rgszNames[i].getChars(0, nameSize, buffer, 0);
+ // get the address of the start of the array of char
+ int pName = OS.HeapAlloc(hHeap, OS.HEAP_ZERO_MEMORY, buffer.length * 2);
+ OS.MoveMemory(pName, buffer, buffer.length * 2);
+ // copy the address to the array of addresses
+ COM.MoveMemory(ppNames + 4*i, new int[]{pName}, 4);
+ // keep track of the Global Memory so we can free it
+ memTracker[i] = pName;
+ }
+
+ return COM.VtblCall(10, address, ppNames, cNames, pMemId);
+
+ } finally {
+ // free the memory
+ for (int i=0; i<memTracker.length; i++){
+ OS.HeapFree(hHeap, 0, memTracker[i]);
+ }
+ OS.HeapFree(hHeap, 0, ppNames);
+ }
+}
+
+public int GetImplTypeFlags(int index, int[] pImplTypeFlags) {
+ return COM.VtblCall(9, address, index, pImplTypeFlags);
+}
+public int GetNames(int memid, String[] names, int cMaxNames, int[] pcNames){
+
+ int nameSize = names.length;
+ int[] rgBstrNames = new int[nameSize];
+ int rc = COM.VtblCall(7, address, memid, rgBstrNames, nameSize, pcNames);
+
+ if (rc == COM.S_OK) {
+ for (int i = 0; i < pcNames[0]; i++) {
+ int size = COM.SysStringByteLen(rgBstrNames[i]);
+ if (size > 0){
+ // get the unicode character array from the global memory and create a String
+ char[] buffer = new char[(size + 1) /2]; // add one to avoid rounding errors
+ COM.MoveMemory(buffer, rgBstrNames[i], size);
+ names[i] = new String(buffer);
+ int subindex = names[i].indexOf("\0");
+ if (subindex > 0)
+ names[i] = names[i].substring(0, subindex);
+ }
+ COM.SysFreeString(rgBstrNames[i]);
+ }
+ }
+
+ return rc;
+}
+public int GetRefTypeInfo(int hRefType, int[] ppTInfo) {
+ return COM.VtblCall(14, address, hRefType, ppTInfo);
+}
+public int GetRefTypeOfImplType(int index, int[] pRefType) {
+ return COM.VtblCall(8, address, index, pRefType);
+}
+public int GetTypeAttr(int[] ppTypeAttr) {
+ return COM.VtblCall(3, address, ppTypeAttr);
+}
+public int GetVarDesc(int index, int[] ppVarDesc ) {
+ return COM.VtblCall(6, address, index, ppVarDesc);
+}
+public int ReleaseFuncDesc(int pFuncDesc ) {
+ return COM.VtblCall(20, address, pFuncDesc);
+}
+public int ReleaseTypeAttr(int pTypeAttr) {
+ return COM.VtblCall(19, address, pTypeAttr);
+}
+public int ReleaseVarDesc(int pVarDesc ) {
+ return COM.VtblCall(21, address, pVarDesc);
+}
+}