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.JavaDispatch; 20 import com.google.gwt.dev.shell.JavaDispatchImpl; 21 import com.google.gwt.dev.shell.JsValueGlue; 22 import com.google.gwt.dev.shell.LowLevel; 23 24 import org.eclipse.swt.internal.ole.win32.COM; 25 import org.eclipse.swt.internal.ole.win32.IDispatch; 26 import org.eclipse.swt.ole.win32.Variant; 27 28 import java.lang.reflect.Field ; 29 import java.lang.reflect.InvocationTargetException ; 30 import java.lang.reflect.Method ; 31 32 57 class IDispatchProxy extends IDispatchImpl { 58 59 public static final int DISPID_MAGIC_GETGLOBALREF = 0xC131FB56; 61 62 private final CompilingClassLoader classLoader; 63 64 private boolean isDisposed = false; 65 66 private final JavaDispatch javaDispatch; 67 68 private final int myGlobalRef; 69 70 76 IDispatchProxy(CompilingClassLoader cl) { 77 javaDispatch = new JavaDispatchImpl(cl); 78 classLoader = cl; 79 myGlobalRef = 0; 80 } 81 82 88 IDispatchProxy(CompilingClassLoader cl, Object target) { 89 javaDispatch = new JavaDispatchImpl(cl, target); 90 classLoader = cl; 91 myGlobalRef = LowLevel.newGlobalRefInt(this); 92 } 93 94 98 public void dispose() { 99 if (myGlobalRef != 0) { 101 LowLevel.deleteGlobalRefInt(myGlobalRef); 102 } 103 super.dispose(); 104 isDisposed = true; 105 } 106 107 public Object getTarget() { 108 return javaDispatch.getTarget(); 109 } 110 111 115 public boolean isDisposed() { 116 return isDisposed; 117 } 118 119 protected void getIDsOfNames(String [] names, int[] ids) 120 throws HResultException { 121 ids[0] = classLoader.getDispId(names[0]); 122 if (ids[0] == -1 || names.length >= 2) { 123 throw new HResultException(DISP_E_UNKNOWNNAME); 124 } 125 } 126 127 protected Variant invoke(int dispId, int flags, Variant[] params) 128 throws HResultException, InvocationTargetException { 129 try { 130 if (dispId == DISPID_MAGIC_GETGLOBALREF && myGlobalRef != 0) { 133 return new Variant(myGlobalRef); 136 } else if (dispId == 0) { 137 if ((flags & COM.DISPATCH_METHOD) != 0) { 138 } else if ((flags & COM.DISPATCH_PROPERTYGET) != 0) { 141 return new Variant(getTarget().toString()); 143 } 144 145 } else if (dispId > 0) { 146 if (javaDispatch.isMethod(dispId)) { 147 Method method = javaDispatch.getMethod(dispId); 148 if ((flags & COM.DISPATCH_METHOD) != 0) { 149 return callMethod(classLoader, getTarget(), params, method); 151 } else if (flags == COM.DISPATCH_PROPERTYGET) { 152 IDispatchImpl funcObj = new MethodDispatch(classLoader, method); 154 IDispatch disp = new IDispatch(funcObj.getAddress()); 155 disp.AddRef(); 156 return new Variant(disp); 157 } 158 } else if (javaDispatch.isField(dispId)) { 159 Field field = javaDispatch.getField(dispId); 160 if (flags == COM.DISPATCH_PROPERTYGET) { 161 return SwtOleGlue.convertObjectToVariant(classLoader, 162 field.getType(), javaDispatch.getFieldValue(dispId)); 163 } else if ((flags & (COM.DISPATCH_PROPERTYPUT | COM.DISPATCH_PROPERTYPUTREF)) != 0) { 164 javaDispatch.setFieldValue(dispId, JsValueGlue.get(new JsValueIE6( 165 params[0]), field.getType(), "Setting field '" 166 + field.getName() + "'")); 167 return new Variant(); 168 } 169 } 170 } else { 171 throw new HResultException(COM.DISP_E_MEMBERNOTFOUND); 173 } 174 } catch (IllegalArgumentException e) { 175 e.printStackTrace(); 177 throw new HResultException(e); 178 } 179 180 System.err.println("IDispatchProxy cannot be invoked with flags: " 181 + Integer.toHexString(flags)); 182 throw new HResultException(COM.E_NOTSUPPORTED); 183 } 184 } 185 | Popular Tags |