public UnoInterfaceInfo(com.sun.star.bridges.mono_uno.Bridge bridge, IntPtr unoInterface, InterfaceTypeDescription *td) { Bridge = bridge; UnoInterface = unoInterface; Type = Bridge.MapUnoType((TypeDescription *)td); uno.Binary.Interface.Acquire(UnoInterface); TypeDesc = td; InterfaceTypeDescription.Acquire(TypeDesc); fixed (InterfaceTypeDescription **ppTypeDesc = &TypeDesc) if (((TypeDescription *)TypeDesc)->bComplete == 0 && TypeDescription.Complete((TypeDescription **)ppTypeDesc)) { // FIXME throw a uno runtime exception } }
public static unsafe object Create(Bridge bridge, IntPtr unoInterface, InterfaceTypeDescription *TD, string oid) { UnoInterfaceProxy realProxy = new UnoInterfaceProxy(bridge, unoInterface, TD, oid); object proxy = realProxy.GetTransparentProxy(); bridge.RegisterWithCliEnvironment(proxy, oid); return proxy; }
// internals public unsafe void AddUnoInterface(IntPtr unoInterface, InterfaceTypeDescription *TD) { lock (this) { foreach (UnoInterfaceInfo info in interfaces) { if (InterfaceTypeDescription.Equal(info.TypeDesc, TD)) return; } // This proxy does not contain the unoInterface. Add it. bridge.RegisterWithUnoEnvironment(ref unoInterface, oid, TD); interfaces.Add(new UnoInterfaceInfo(bridge, unoInterface, TD)); } }
private unsafe UnoInterfaceProxy(Bridge bridge, IntPtr unoInterface, InterfaceTypeDescription *TD, string oid) : base(typeof(MarshalByRefObject)) // FIXME is there a better type? { this.bridge = bridge; this.oid = oid; AddUnoInterface(unoInterface, TD); }