java-gobject-introspection r35 - in trunk/src/org/gnome/gir: compiler gobject repository



Author: walters
Date: Fri Sep  5 21:55:29 2008
New Revision: 35
URL: http://svn.gnome.org/viewvc/java-gobject-introspection?rev=35&view=rev

Log:
Readd bits to peek at g_class and attempt to find exact mapped class


Modified:
   trunk/src/org/gnome/gir/compiler/CodeFactory.java
   trunk/src/org/gnome/gir/compiler/Test.java
   trunk/src/org/gnome/gir/gobject/GType.java
   trunk/src/org/gnome/gir/gobject/NativeObject.java
   trunk/src/org/gnome/gir/repository/GIntrospectionAPI.java
   trunk/src/org/gnome/gir/repository/Repository.java

Modified: trunk/src/org/gnome/gir/compiler/CodeFactory.java
==============================================================================
--- trunk/src/org/gnome/gir/compiler/CodeFactory.java	(original)
+++ trunk/src/org/gnome/gir/compiler/CodeFactory.java	Fri Sep  5 21:55:29 2008
@@ -62,6 +62,7 @@
 import org.gnome.gir.gobject.GList;
 import org.gnome.gir.gobject.GObjectAPI;
 import org.gnome.gir.gobject.GSList;
+import org.gnome.gir.gobject.GType;
 import org.gnome.gir.repository.ArgInfo;
 import org.gnome.gir.repository.BaseInfo;
 import org.gnome.gir.repository.BoxedInfo;
@@ -100,78 +101,7 @@
 public class CodeFactory {
 	
 	private static final Logger logger = Logger.getLogger("org.gnome.gir.Compiler");
-	
-	private static final Map<String,String> overrides = new HashMap<String,String>() {
-		private static final long serialVersionUID = 1L;
 
-		{
-			put("GLib.Value", "org/gnome/gir/gobject/GValue");
-			put("GLib.List", "org/gnome/gir/gobject/GList");
-			put("GLib.SList", "org/gnome/gir/gobject/GSList");
-
-			put("GLib.Closure", "org/gnome/gir/gobject/GClosure");
-			put("GLib.Quark", "org/gnome/gir/gobject/GQuark");
-			put("GLib.TimeVal", "org/gnome/gir/gobject/GTimeVal");
-			put("GLib.Scanner", "org/gnome/gir/gobject/GScanner");
-			put("GLib.OptionContext", "org/gnome/gir/gobject/GOptionContext");
-			put("GLib.OptionGroup", "org/gnome/gir/gobject/GOptionGroup");
-			put("GLib.OptionEntry", "org/gnome/gir/gobject/GOptionEntry");
-			put("GLib.String", "org/gnome/gir/gobject/GString");	
-			put("GLib.Callback", "com/sun/jna/Callback");
-			put("GLib.Mutex", "org/gnome/gir/gobject/GLibAPI$GMutex");
-			put("GLib.StaticRecMutex", "org/gnome/gir/gobject/GLibAPI$GStaticRecMutex");			
-			
-			String[] glibPointerUnmapped = new String[] { "Mutex", "Cond", "FreeFunc", "DestroyNotify", "MarkupParser",
-					"SpawnChildSetupFunc", "SourceFunc", "Node", "CompareFunc", "KeyFile", "PtrArray", "Func",
-					"ThreadPool", "Source", "CompareDataFunc", "Array" };
-			for (String unmapped : glibPointerUnmapped)
-				put("GLib." + unmapped, "com/sun/jna/Pointer");
-			String[] glibIntegerUnmapped = new String[] { "SpawnFlags", "SeekType", };
-			for (String unmapped : glibIntegerUnmapped)
-				put("GLib." + unmapped, "java/lang/Integer");			
-			
-			put("GObject.ParamSpec", "org/gnome/gir/gobject/GObjectAPI$GParamSpec");			
-			put("GObject.Object", "org/gnome/gir/gobject/GObject");
-			put("GObject.InitiallyUnowned", "org/gnome/gir/gobject/GInitiallyUnowned");					
-			put("GObject.Type", "org/gnome/gir/gobject/GType");
-			put("GObject.Value", "org/gnome/gir/gobject/GValue");			
-			put("GObject.TypePlugin", "org/gnome/gir/gobject/GTypePlugin");
-			put("GObject.TypeModule", "org/gnome/gir/gobject/GTypeModule");	
-			put("GObject.TypeClass", "org/gnome/gir/gobject/GObjectAPI$GTypeClass");			
-			put("GObject.TypeQuery", "org/gnome/gir/gobject/GObjectAPI$GTypeQuery");
-			put("GObject.TypeInfo", "org/gnome/gir/gobject/GObjectAPI$GTypeInfo");
-			put("GObject.InterfaceInfo", "org/gnome/gir/gobject/GObjectAPI$GInterfaceInfo");
-			put("GObject.TypeValueTable", "org/gnome/gir/gobject/GObjectAPI$GTypeValueTable");			
-			put("GObject.TypeFundamentalInfo", "org/gnome/gir/gobject/GObjectAPI$GTypeFundamentalInfo");			
-			put("GObject.Class", "org/gnome/gir/gobject/GObjectAPI$GObjectClass");
-			put("GObject.InitiallyUnownedClass", "org/gnome/gir/gobject/GObjectAPI$GInitiallyUnownedClass");			
-			put("GObject.TypeDebugFlags", "org/gnome/gir/gobject/GObjectAPI$GTypeDebugFlags");
-			put("GObject.TypeInstance", "org/gnome/gir/gobject/GObjectAPI$GTypeInstance");
-			put("GObject.TypeInterface", "org/gnome/gir/gobject/GObjectAPI$GTypeInterface");			
-			put("GObject.String", "org/gnome/gir/gobject/GString");
-			put("GObject.Closure", "org/gnome/gir/gobject/GClosure");			
-			put("GObject.SignalInvocationHint", "org/gnome/gir/gobject/GSignalAPI$GSignalInvocationHint");			
-			put("GObject.EnumValue", "org/gnome/gir/gobject/GObjectAPI$GEnumValue");
-			put("GObject.EnumClass", "org/gnome/gir/gobject/GObjectAPI$GEnumClass");			
-			put("GObject.FlagsValue", "org/gnome/gir/gobject/GObjectAPI$GFlagsValue");
-			put("GObject.FlagsClass", "org/gnome/gir/gobject/GObjectAPI$GFlagsClass");
-			
-			String[] gobjectUnmapped = new String[] { "Callback", "BaseInitFunc", "InstanceInitFunc", 
-					"SignalAccumulator", "ClosureMarshal", "ClassInitFunc", "SignalEmissionHook",
-					"IOChannel", "Date", "BaseFinalizeFunc", "ClassFinalizeFunc" };
-			for (String unmapped : gobjectUnmapped)
-				put("GObject." + unmapped, "com/sun/jna/Pointer");
-			String[] gobjectIntegerUnmapped = new String[] { "SignalFlags", "ConnectFlags", "SignalMatchType", 
-					"TypeFlags", "ParamFlags"  };
-			for (String unmapped : gobjectIntegerUnmapped)
-				put("GObject." + unmapped, "java/lang/Integer");				
-			
-			for (String name : new String[] { "Context" }) {
-				put("Cairo." + name, "com/sun/jna/Pointer");
-			}
-		}
-	};
-	
 	public static Type toJava(TypeTag tag) {
 		if (tag == TypeTag.LONG || tag == TypeTag.ULONG ||
 				tag == TypeTag.SSIZE || tag == TypeTag.SIZE)
@@ -197,7 +127,7 @@
 		/* Unfortunately, flags are best mapped as plain Integer  for now */
 		if (info instanceof FlagsInfo)
 			return Type.getObjectType("java/lang/Integer");
-		String internalName = getInternalNameMapped(info.getNamespace(), info.getName());
+		String internalName = GType.getInternalNameMapped(info.getNamespace(), info.getName());
 		if (internalName != null)
 			return Type.getObjectType(internalName);
 		return null;
@@ -232,7 +162,7 @@
 			if (iface instanceof StructInfo) {
 				StructInfo struct = (StructInfo) iface;
 				String internalName = getInternalNameMapped(struct);
-				if (type.isPointer() && internalName.startsWith(dynamicNamespace))
+				if (type.isPointer() && internalName.startsWith(GType.dynamicNamespace))
 					internalName += "$ByReference";
 				return Type.getObjectType(internalName);
 			} else if (iface instanceof InterfaceInfo || iface instanceof ObjectInfo ||
@@ -302,9 +232,6 @@
 		return null;
 	}
 
-	private static final String dynamicNamespace = "org/gnome/gir/dynamic/";
-	private static final String publicDynamicNamespace = "org.gnome.gir.dynamic.";
-	
 	private Type getCallableReturn(CallableInfo callable) {
 		TypeInfo info = callable.getReturnType();
 		if (info.getTag().equals(TypeTag.INTERFACE)) {
@@ -345,26 +272,6 @@
 		return types;
 	}
 	
-	private static String getInternalNameMapped(String namespace, String name) {
-		String key = namespace + "." + name;
-		String val = overrides.get(key);
-		if (val != null)
-			return val;
-		if (namespace.equals("GLib") || namespace.equals("GObject"))
-			throw new RuntimeException(String.format("Unmapped internal ns=%s name=%s", namespace, name));
-		return getInternalName(namespace, name);
-	}
-	
-	private static String getInternalName(String namespace, String name) {
-		String caps = name.substring(0, 1).toUpperCase() + name.substring(1);
-		return dynamicNamespace + namespace + "/" + caps;
-	}
-	
-	private static String getPublicName(String namespace, String name) {
-		String caps = name.substring(0, 1).toUpperCase() + name.substring(1);
-		return publicDynamicNamespace + namespace + "." + caps;
-	}
-	
 	private static abstract class ClassCompilation {
 		String namespace;
 		String baseName;
@@ -373,7 +280,7 @@
 		public ClassCompilation(String namespace, String baseName) {
 			this.namespace = namespace;
 			this.baseName = baseName;
-			this.internalName = getInternalName(namespace, baseName);
+			this.internalName = GType.getInternalName(namespace, baseName);
 			this.writer = new ClassWriter(0);
 		}
 
@@ -386,7 +293,7 @@
 		}
 		
 		public String getPublicName() {
-			return CodeFactory.getPublicName(namespace, baseName);
+			return GType.getPublicNameMapped(namespace, baseName);
 		}
 		
 		public abstract void close();
@@ -414,7 +321,7 @@
 			super(namespace, name);
 			this.innerClasses = new HashSet<InnerClassCompilation>();
 			this.baseName = name.substring(0, 1).toUpperCase() + name.substring(1);
-			this.publicName = CodeFactory.getPublicName(namespace, name);
+			this.publicName = GType.getPublicNameMapped(namespace, name);
 		}
 		
 		public ClassCompilation newInner() {
@@ -447,7 +354,7 @@
 	}
 
 	public StubClassCompilation getCompilation(String namespace, String name) {
-		String peerInternalName = getInternalName(namespace, name);
+		String peerInternalName = GType.getInternalName(namespace, name);
 		StubClassCompilation ret = writers.get(peerInternalName);
 		if (ret == null) {
 			ret = new StubClassCompilation(namespace, name);
@@ -461,7 +368,7 @@
 	}
 	
 	public String getGlobalsName(String namespace) {
-		return getInternalName(namespace, namespace+"Globals");
+		return GType.getInternalName(namespace, namespace+"Globals");
 	}
 	
 	public GlobalsCompilation getGlobals(String namespace) {
@@ -493,18 +400,13 @@
 		= new WeakHashMap<Repository, List<ClassCompilation>>();
 	
 	private static String getInternalName(BaseInfo info) {
-		return getInternalName(info.getNamespace(), info.getName());
+		return GType.getInternalName(info.getNamespace(), info.getName());
 	}
 	
 	private static String getInternalNameMapped(BaseInfo info) {
-		return getInternalNameMapped(info.getNamespace(), info.getName());
+		return GType.getInternalNameMapped(info.getNamespace(), info.getName());
 	}	
-	
-	@SuppressWarnings("unused")
-	private static String getPublicName(BaseInfo info) {
-		return getPublicName(info.getNamespace(), info.getName());
-	}
-	
+
 	private String enumNameToUpper(String nick) {
 		return nick.replace("-", "_").toUpperCase();
 	}
@@ -1583,7 +1485,7 @@
 		}
 		
 		String globalName = namespace + "Globals";
-		String peerInternalName = getInternalName(namespace, globalName);
+		String peerInternalName = GType.getInternalName(namespace, globalName);
 		GlobalsCompilation global = new GlobalsCompilation(namespace, globalName);
 		writers.put(peerInternalName, global);		
 		globals.put(namespace, global);
@@ -1592,13 +1494,6 @@
 
 		compileNamespaceComponents(namespace);
 		
-		for (Map.Entry<String, String> iface : global.interfaceTypes.entrySet()) {
-			global.clinit.visitLdcInsn(Type.getType("L" + iface.getKey() + ";"));
-			global.clinit.visitFieldInsn(GETSTATIC, peerInternalName + "$Internals", "library", "Lcom/sun/jna/NativeLibrary;");
-			global.clinit.visitLdcInsn(iface.getValue());
-			global.clinit.visitMethodInsn(INVOKEVIRTUAL, "com/sun/jna/NativeLibrary", "getFunction", "(Ljava/lang/String;)Lcom/sun/jna/Function;");
-			global.clinit.visitMethodInsn(INVOKESTATIC, "org/gnome/gir/gobject/GType", "registerIface", "(Ljava/lang/Class;Lcom/sun/jna/Function;)V");			
-		}
 		global.clinit.visitInsn(RETURN);
 		global.clinit.visitMaxs(3, 0);
 		global.clinit.visitEnd();

Modified: trunk/src/org/gnome/gir/compiler/Test.java
==============================================================================
--- trunk/src/org/gnome/gir/compiler/Test.java	(original)
+++ trunk/src/org/gnome/gir/compiler/Test.java	Fri Sep  5 21:55:29 2008
@@ -7,7 +7,6 @@
 import org.gnome.gir.gobject.GErrorStruct;
 import org.gnome.gir.gobject.GObject;
 import org.gnome.gir.gobject.GType;
-import org.gnome.gir.gobject.GTypeInstance;
 import org.gnome.gir.gobject.GTypeMapper;
 import org.gnome.gir.repository.Direction;
 import org.gnome.gir.repository.Repository;
@@ -96,12 +95,6 @@
 				put(Library.OPTION_TYPE_MAPPER, new GTypeMapper());
 			}
 		};
-		static {
-			GType.registerIface(TestIface.class, library.getFunction("test_iface_get_type"));			
-		}
-		static {
-			GType.registerIface(TestIface.class, library.getFunction("test_iface_get_type"));			
-		}		
 	};
 
 	public static final void init() {
@@ -112,7 +105,7 @@
 	
 	public static final Boolean eventsPending() {
 		Function f = Internals.library.getFunction("gtk_events_pending");
-		Object[] args = new Object[] {}; 		
+		Object[] args = new Object[] {};
 		return (Boolean) f.invoke(Boolean.class, args, Internals.invocationOptions);
 	}
 	
@@ -130,7 +123,7 @@
 	
 	public void ifaceFoo(String blah) {
 		Function f = Internals.library.getFunction("gtk_propagate_event");
-		Object[] args = new Object[] { GTypeInstance.peekInterface(this.handle(), GType.getIfaceGType(TestIface.class)), blah };
+		Object[] args = new Object[] { this, blah };
 		f.invoke(Void.class, args, Internals.invocationOptions);
 	}
 	

Modified: trunk/src/org/gnome/gir/gobject/GType.java
==============================================================================
--- trunk/src/org/gnome/gir/gobject/GType.java	(original)
+++ trunk/src/org/gnome/gir/gobject/GType.java	Fri Sep  5 21:55:29 2008
@@ -45,32 +45,149 @@
 
 package org.gnome.gir.gobject;
 
+import java.util.HashMap;
 import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
+
+import org.gnome.gir.repository.BaseInfo;
+import org.gnome.gir.repository.Repository;
 
 import com.sun.jna.FromNativeContext;
-import com.sun.jna.Function;
 import com.sun.jna.NativeLong;
+import com.sun.jna.Pointer;
 
 
 public class GType extends NativeLong {
 	private static final long serialVersionUID = 1L;
 
-    private static final Map<Class<?>,Function> ifaceGetTypeMap 
-    	= new ConcurrentHashMap<Class<?>, Function>();
+    private static final Map<GType,Class<?>> classTypeMap 
+    	= new HashMap<GType, Class<?>>();
+    
+	public static final String dynamicNamespace = "org/gnome/gir/dynamic/";
+
+	public static final Map<String,String> overrides = new HashMap<String,String>() {
+		private static final long serialVersionUID = 1L;
+
+		{
+			put("GLib.Value", "org/gnome/gir/gobject/GValue");
+			put("GLib.List", "org/gnome/gir/gobject/GList");
+			put("GLib.SList", "org/gnome/gir/gobject/GSList");
+
+			put("GLib.Closure", "org/gnome/gir/gobject/GClosure");
+			put("GLib.Quark", "org/gnome/gir/gobject/GQuark");
+			put("GLib.TimeVal", "org/gnome/gir/gobject/GTimeVal");
+			put("GLib.Scanner", "org/gnome/gir/gobject/GScanner");
+			put("GLib.OptionContext", "org/gnome/gir/gobject/GOptionContext");
+			put("GLib.OptionGroup", "org/gnome/gir/gobject/GOptionGroup");
+			put("GLib.OptionEntry", "org/gnome/gir/gobject/GOptionEntry");
+			put("GLib.String", "org/gnome/gir/gobject/GString");	
+			put("GLib.Callback", "com/sun/jna/Callback");
+			put("GLib.Mutex", "org/gnome/gir/gobject/GLibAPI$GMutex");
+			put("GLib.StaticRecMutex", "org/gnome/gir/gobject/GLibAPI$GStaticRecMutex");			
+			
+			String[] glibPointerUnmapped = new String[] { "Mutex", "Cond", "FreeFunc", "DestroyNotify", "MarkupParser",
+					"SpawnChildSetupFunc", "SourceFunc", "Node", "CompareFunc", "KeyFile", "PtrArray", "Func",
+					"ThreadPool", "Source", "CompareDataFunc", "Array" };
+			for (String unmapped : glibPointerUnmapped)
+				put("GLib." + unmapped, "com/sun/jna/Pointer");
+			String[] glibIntegerUnmapped = new String[] { "SpawnFlags", "SeekType", };
+			for (String unmapped : glibIntegerUnmapped)
+				put("GLib." + unmapped, "java/lang/Integer");			
+			
+			put("GObject.ParamSpec", "org/gnome/gir/gobject/GObjectAPI$GParamSpec");			
+			put("GObject.Object", "org/gnome/gir/gobject/GObject");
+			put("GObject.InitiallyUnowned", "org/gnome/gir/gobject/GInitiallyUnowned");					
+			put("GObject.Type", "org/gnome/gir/gobject/GType");
+			put("GObject.Value", "org/gnome/gir/gobject/GValue");			
+			put("GObject.TypePlugin", "org/gnome/gir/gobject/GTypePlugin");
+			put("GObject.TypeModule", "org/gnome/gir/gobject/GTypeModule");	
+			put("GObject.TypeClass", "org/gnome/gir/gobject/GObjectAPI$GTypeClass");			
+			put("GObject.TypeQuery", "org/gnome/gir/gobject/GObjectAPI$GTypeQuery");
+			put("GObject.TypeInfo", "org/gnome/gir/gobject/GObjectAPI$GTypeInfo");
+			put("GObject.InterfaceInfo", "org/gnome/gir/gobject/GObjectAPI$GInterfaceInfo");
+			put("GObject.TypeValueTable", "org/gnome/gir/gobject/GObjectAPI$GTypeValueTable");			
+			put("GObject.TypeFundamentalInfo", "org/gnome/gir/gobject/GObjectAPI$GTypeFundamentalInfo");			
+			put("GObject.Class", "org/gnome/gir/gobject/GObjectAPI$GObjectClass");
+			put("GObject.InitiallyUnownedClass", "org/gnome/gir/gobject/GObjectAPI$GInitiallyUnownedClass");			
+			put("GObject.TypeDebugFlags", "org/gnome/gir/gobject/GObjectAPI$GTypeDebugFlags");
+			put("GObject.TypeInstance", "org/gnome/gir/gobject/GObjectAPI$GTypeInstance");
+			put("GObject.TypeInterface", "org/gnome/gir/gobject/GObjectAPI$GTypeInterface");			
+			put("GObject.String", "org/gnome/gir/gobject/GString");
+			put("GObject.Closure", "org/gnome/gir/gobject/GClosure");			
+			put("GObject.SignalInvocationHint", "org/gnome/gir/gobject/GSignalAPI$GSignalInvocationHint");			
+			put("GObject.EnumValue", "org/gnome/gir/gobject/GObjectAPI$GEnumValue");
+			put("GObject.EnumClass", "org/gnome/gir/gobject/GObjectAPI$GEnumClass");			
+			put("GObject.FlagsValue", "org/gnome/gir/gobject/GObjectAPI$GFlagsValue");
+			put("GObject.FlagsClass", "org/gnome/gir/gobject/GObjectAPI$GFlagsClass");
+			
+			String[] gobjectUnmapped = new String[] { "Callback", "BaseInitFunc", "InstanceInitFunc", 
+					"SignalAccumulator", "ClosureMarshal", "ClassInitFunc", "SignalEmissionHook",
+					"IOChannel", "Date", "BaseFinalizeFunc", "ClassFinalizeFunc" };
+			for (String unmapped : gobjectUnmapped)
+				put("GObject." + unmapped, "com/sun/jna/Pointer");
+			String[] gobjectIntegerUnmapped = new String[] { "SignalFlags", "ConnectFlags", "SignalMatchType", 
+					"TypeFlags", "ParamFlags"  };
+			for (String unmapped : gobjectIntegerUnmapped)
+				put("GObject." + unmapped, "java/lang/Integer");				
+			
+			for (String name : new String[] { "Context" }) {
+				put("Cairo." + name, "com/sun/jna/Pointer");
+			}
+		}
+	};
+
+	public static String getInternalNameMapped(String namespace, String name) {
+		String key = namespace + "." + name;
+		String val = GType.overrides.get(key);
+		if (val != null)
+			return val;
+		if (namespace.equals("GLib") || namespace.equals("GObject"))
+			throw new RuntimeException(String.format("Unmapped internal ns=%s name=%s", namespace, name));
+		return getInternalName(namespace, name);
+	}
+	
+	public static String getInternalName(String namespace, String name) {
+		String caps = name.substring(0, 1).toUpperCase() + name.substring(1);
+		return dynamicNamespace + namespace + "/" + caps;
+	}
+	
+	public static String getPublicNameMapped(String namespace, String name) {
+		return getInternalNameMapped(namespace, name).replace('/', '.');
+	}	
     
-    public static final void registerIface(Class<?> klass, Function getType) {
-    	ifaceGetTypeMap.put(klass, getType);
+    public static final void registerProxyClass(GType gtype, Class<?> klass) {
+    	classTypeMap.put(gtype, klass);
     };
     
-    public static GType getIfaceGType(Class<?> klass) {
-    	Function f = ifaceGetTypeMap.get(klass);
-    	if (f == null)
-    		return INVALID;
-    	NativeLong result = (NativeLong) f.invoke(NativeLong.class, null);
-    	return new GType(result.longValue());
+    /* If we haven't yet seen a GType, we do a full search of the repository.  This
+     * is VERY slow right now, so it's cached.
+     */
+    private static synchronized final Class<?> lookupProxyClass(NativeLong g_type) {
+    	Class<?> klass = classTypeMap.get(g_type);
+    	if (klass != null)
+    		return klass;
+    	BaseInfo info = Repository.getDefault().findByGType(g_type);
+    	if (info == null)
+    		return null;
+    	String klassName = getPublicNameMapped(info.getNamespace(), info.getName());
+    	try {
+			klass = Class.forName(klassName);
+		} catch (ClassNotFoundException e) {
+			throw new RuntimeException(e);
+		}
+		classTypeMap.put(new GType(g_type.longValue()), klass);
+		return klass;
     }
     
+    public final Class<?> lookupProxyClass() {
+    	return lookupProxyClass((NativeLong) this);
+    }
+    
+    public static final Class<?> lookupProxyClass(Pointer ptr) {
+    	Pointer g_class = ptr.getPointer(0);
+    	NativeLong g_type = g_class.getNativeLong(0);
+    	return lookupProxyClass(g_type);
+    };    
+    
     public static final void init() {
     	GObjectAPI.gobj.g_type_init();
     }

Modified: trunk/src/org/gnome/gir/gobject/NativeObject.java
==============================================================================
--- trunk/src/org/gnome/gir/gobject/NativeObject.java	(original)
+++ trunk/src/org/gnome/gir/gobject/NativeObject.java	Fri Sep  5 21:55:29 2008
@@ -202,6 +202,12 @@
         if (GObject.GObjectProxy.class.isAssignableFrom(cls)) {
         	cls = (Class<T>) getStubClassFor(cls);
         }
+        /* For GObject, read the g_class field to find
+         * the most exact class match
+         */        	
+        else if (GObject.class.isAssignableFrom(cls)) {
+        	cls = classFor(ptr, cls);
+        }        
         /* Ok, let's try to find an Initializer constructor
          */
         try {
@@ -223,6 +229,12 @@
         }
 
     }
+    
+    @SuppressWarnings("unchecked")
+	protected static <T extends NativeObject> Class<T> classFor(Pointer ptr, Class<T> defaultClass) {
+    	Class<?> cls = GType.lookupProxyClass(ptr);
+    	return (cls != null && defaultClass.isAssignableFrom(cls)) ? (Class<T>) cls : defaultClass; 
+    }    
 
     @Override
     public boolean equals(Object o) {

Modified: trunk/src/org/gnome/gir/repository/GIntrospectionAPI.java
==============================================================================
--- trunk/src/org/gnome/gir/repository/GIntrospectionAPI.java	(original)
+++ trunk/src/org/gnome/gir/repository/GIntrospectionAPI.java	Fri Sep  5 21:55:29 2008
@@ -52,6 +52,7 @@
 	boolean g_irepository_is_registered (Repository repository, String namespace);
 	boolean g_irepository_require(Repository repo, String namespace, int flags, PointerByReference error);
 	BaseInfo g_irepository_find_by_name(Repository repo, String namespace, String name);
+	BaseInfo g_irepository_find_by_gtype(Repository repository, NativeLong g_type);	
 	@RepositoryId(namespace="girepository", name="get_namespaces") ZeroTerminatedArray<String> g_irepository_get_namespaces(Repository repo);
 	BaseInfo g_irepository_get_info(Repository repo, String namespace, int idx);
 	String g_irepository_get_shared_library(Repository repository, String namespace);

Modified: trunk/src/org/gnome/gir/repository/Repository.java
==============================================================================
--- trunk/src/org/gnome/gir/repository/Repository.java	(original)
+++ trunk/src/org/gnome/gir/repository/Repository.java	Fri Sep  5 21:55:29 2008
@@ -7,6 +7,7 @@
 import org.gnome.gir.gobject.GObjectGlobals;
 import org.gnome.gir.gobject.ZeroTerminatedArray;
 
+import com.sun.jna.NativeLong;
 import com.sun.jna.PointerType;
 import com.sun.jna.ptr.PointerByReference;
 
@@ -15,6 +16,10 @@
 	public BaseInfo findByName(String namespace, String name) {
 		return GIntrospectionAPI.gi.g_irepository_find_by_name(this, namespace, name);
 	}
+	
+	public BaseInfo findByGType(NativeLong g_type) {
+		return GIntrospectionAPI.gi.g_irepository_find_by_gtype(this, g_type);
+	}
 		
 	public void require(String namespace) throws GErrorException {
 		PointerByReference error = new PointerByReference(null);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]