1 16 package com.google.gwt.dev.shell.ie; 17 18 import com.google.gwt.dev.shell.CompilingClassLoader; 19 import com.google.gwt.dev.shell.JsValueGlue; 20 import com.google.gwt.dev.shell.LowLevel; 21 22 import org.eclipse.swt.browser.Browser; 23 import org.eclipse.swt.internal.ole.win32.COM; 24 import org.eclipse.swt.internal.ole.win32.COMObject; 25 import org.eclipse.swt.internal.win32.OS; 26 import org.eclipse.swt.ole.win32.Variant; 27 28 33 class SwtOleGlue { 34 35 39 public static Variant convertObjectToVariant(CompilingClassLoader cl, 40 Class type, Object o) { 41 if (type.equals(Variant.class)) { 42 return (Variant) o; 43 } 44 JsValueIE6 jsValue = new JsValueIE6(); 45 JsValueGlue.set(jsValue, cl, type, o); 46 return jsValue.getVariant(); 47 } 48 49 52 public static Object [] convertVariantsToObjects(Class [] argTypes, 53 Variant[] varArgs, String msgPrefix) { 54 Object [] javaArgs = new Object [Math.min(varArgs.length, argTypes.length)]; 55 for (int i = 0; i < javaArgs.length; i++) { 56 try { 57 Object javaArg = JsValueGlue.get(new JsValueIE6(varArgs[i]), 58 argTypes[i], msgPrefix); 59 javaArgs[i] = javaArg; 60 } catch (IllegalArgumentException e) { 61 throw new IllegalArgumentException ("Error converting argument " 62 + (i + 1) + ": " + e.getMessage()); 63 } 64 } 65 66 return javaArgs; 67 } 68 69 73 public static String [] extractStringArrayFromOleCharPtrPtr(int ppchar, 74 int count) { 75 String [] strings = new String [count]; 76 for (int i = 0; i < count; ++i) { 77 int[] pchar = new int[1]; 78 OS.MoveMemory(pchar, ppchar + 4 * i, 4); 79 strings[i] = extractStringFromOleCharPtr(pchar[0]); 80 } 81 return strings; 82 } 83 84 87 public static String extractStringFromOleCharPtr(int pOleChar) { 88 int size = COM.SysStringByteLen(pOleChar); 90 if (size > 8192) { 91 size = 8192; 92 } 93 char[] buffer = new char[(size + 1) / 2]; 94 COM.MoveMemory(buffer, pOleChar, size); 95 96 String s = new String (buffer); 97 if (s.indexOf('\0') != -1) { 98 return s.substring(0, s.indexOf('\0')); 99 } else { 100 return s; 101 } 102 } 103 104 108 public static void injectBrowserScriptExternalObject(Browser browser, 109 final IDispatchImpl external) { 110 Object webSite = LowLevel.snatchFieldObjectValue(browser, "site"); 113 COMObject iDocHostUIHandler = (COMObject) LowLevel.snatchFieldObjectValue( 114 webSite, "iDocHostUIHandler"); 115 116 COMObjectProxy webSiteProxy = new COMObjectProxy(new int[] { 119 2, 0, 0, 4, 1, 5, 0, 0, 1, 1, 1, 3, 3, 2, 2, 1, 3, 2}) { 120 121 { 122 external.AddRef(); 124 } 125 126 public int method15(int[] args) { 127 return GetExternal(args[0]); 130 } 131 132 public int method2(int[] args) { 133 int result = super.method2(args); 134 if (result == 0) { 135 external.Release(); 136 } 137 return result; 138 } 139 140 int GetExternal(int ppDispatch) { 142 if (ppDispatch != 0) { 144 try { 145 external.AddRef(); 148 OS.MoveMemory(ppDispatch, new int[] {external.getAddress()}, 4); 149 return COM.S_OK; 150 } catch (Throwable e) { 151 e.printStackTrace(); 152 return COM.E_FAIL; 153 } 154 } else { 155 OS.MoveMemory(ppDispatch, new int[] {0}, 4); 156 return COM.E_NOTIMPL; 157 } 158 } 159 160 }; 161 162 webSiteProxy.interpose(iDocHostUIHandler); 165 } 166 167 170 public static int sysAllocString(String s) { 171 int len = s.length(); 172 char[] chars = new char[len + 1]; 173 s.getChars(0, len, chars, 0); 174 return COM.SysAllocString(chars); 175 } 176 177 } 178 | Popular Tags |