java-gobject-introspection r58 - in trunk: src/org/gnome/gir/gobject stub-examples



Author: walters
Date: Thu Sep 18 17:15:44 2008
New Revision: 58
URL: http://svn.gnome.org/viewvc/java-gobject-introspection?rev=58&view=rev

Log:
Move GValue transformation into GValue; add initial connectNotify implementation

We want to keep core GValue logic centralized in GValue; this also avoids
bloat in GObject.

connectNotify is required to listen to GObject notify:: for properties.


Modified:
   trunk/src/org/gnome/gir/gobject/GObject.java
   trunk/src/org/gnome/gir/gobject/GValue.java
   trunk/stub-examples/Test.java

Modified: trunk/src/org/gnome/gir/gobject/GObject.java
==============================================================================
--- trunk/src/org/gnome/gir/gobject/GObject.java	(original)
+++ trunk/src/org/gnome/gir/gobject/GObject.java	Thu Sep 18 17:15:44 2008
@@ -45,7 +45,7 @@
 
 package org.gnome.gir.gobject;
 
-import java.net.URI;
+import java.lang.reflect.Method;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
@@ -172,65 +172,7 @@
         
         GValue propValue = new GValue();
         GValueAPI.gvalue.g_value_init(propValue, propType);
-        if (propType.equals(GType.INT)) {
-            GValueAPI.gvalue.g_value_set_int(propValue, intValue(data));
-        } else if (propType.equals(GType.UINT)) {
-            GValueAPI.gvalue.g_value_set_uint(propValue, intValue(data));
-        } else if (propType.equals(GType.CHAR)) {
-            GValueAPI.gvalue.g_value_set_char(propValue, (byte) intValue(data));
-        } else if (propType.equals(GType.UCHAR)) {
-            GValueAPI.gvalue.g_value_set_uchar(propValue, (byte) intValue(data));
-        } else if (propType.equals(GType.LONG)) {
-            GValueAPI.gvalue.g_value_set_long(propValue, new NativeLong(longValue(data)));
-        } else if (propType.equals(GType.ULONG)) {
-            GValueAPI.gvalue.g_value_set_ulong(propValue, new NativeLong(longValue(data)));
-        } else if (propType.equals(GType.INT64)) {
-            GValueAPI.gvalue.g_value_set_int64(propValue, longValue(data));
-        } else if (propType.equals(GType.UINT64)) {
-            GValueAPI.gvalue.g_value_set_uint64(propValue, longValue(data));
-        } else if (propType.equals(GType.BOOLEAN)) {
-            GValueAPI.gvalue.g_value_set_boolean(propValue, booleanValue(data));
-        } else if (propType.equals(GType.FLOAT)) {
-            GValueAPI.gvalue.g_value_set_float(propValue, floatValue(data));
-        } else if (propType.equals(GType.DOUBLE)) {
-            GValueAPI.gvalue.g_value_set_double(propValue, doubleValue(data));
-        } else if (propType.equals(GType.STRING)) {
-            //
-            // Special conversion of java URI to gstreamer compatible uri
-            //
-            if (data instanceof URI) {
-                URI uri = (URI) data;
-                String uriString = uri.toString();
-                // Need to fixup file:/ to be file:/// for gstreamer
-                if ("file".equals(uri.getScheme()) && uri.getHost() == null) {
-                    final String path = uri.getRawPath();
-                    if (com.sun.jna.Platform.isWindows()) {
-                        uriString = "file:/" + path;
-                    } else {
-                        uriString = "file://" + path;
-                    }
-                }
-                GValueAPI.gvalue.g_value_set_string(propValue, uriString);
-            } else {
-                GValueAPI.gvalue.g_value_set_string(propValue, data.toString());
-            }
-        } else if (propType.equals(GType.OBJECT)) {
-            GValueAPI.gvalue.g_value_set_object(propValue, (GObject) data);
-        } else if (GValueAPI.gvalue.g_value_type_transformable(GType.INT64, propType)) {
-            transform(data, GType.INT64, propValue);
-        } else if (GValueAPI.gvalue.g_value_type_transformable(GType.LONG, propType)) {
-            transform(data, GType.LONG, propValue);
-        } else if (GValueAPI.gvalue.g_value_type_transformable(GType.INT, propType)) {
-            transform(data, GType.INT, propValue);
-        } else if (GValueAPI.gvalue.g_value_type_transformable(GType.DOUBLE, propType)) {
-            transform(data, GType.DOUBLE, propValue);
-        } else if (GValueAPI.gvalue.g_value_type_transformable(GType.FLOAT, propType)) {
-            transform(data, GType.FLOAT, propValue);
-        } else {
-            // Old behaviour
-            GObjectAPI.gobj.g_object_set(this, property, data);
-            return;
-        }
+        propValue.set(data);
         GObjectAPI.gobj.g_object_set_property(this, property, propValue);
         GValueAPI.gvalue.g_value_unset(propValue); // Release any memory
     }
@@ -251,123 +193,7 @@
         GValue propValue = new GValue();
         GValueAPI.gvalue.g_value_init(propValue, propType);
         GObjectAPI.gobj.g_object_get_property(this, property, propValue);
-        if (propType.equals(GType.INT)) {
-            return GValueAPI.gvalue.g_value_get_int(propValue);
-        } else if (propType.equals(GType.UINT)) {
-            return GValueAPI.gvalue.g_value_get_uint(propValue);
-        } else if (propType.equals(GType.CHAR)) {
-            return Integer.valueOf(GValueAPI.gvalue.g_value_get_char(propValue));
-        } else if (propType.equals(GType.UCHAR)) {
-            return Integer.valueOf(GValueAPI.gvalue.g_value_get_uchar(propValue));
-        } else if (propType.equals(GType.LONG)) {
-            return GValueAPI.gvalue.g_value_get_long(propValue).longValue();
-        } else if (propType.equals(GType.ULONG)) {
-            return GValueAPI.gvalue.g_value_get_ulong(propValue).longValue();
-        } else if (propType.equals(GType.INT64)) {
-            return GValueAPI.gvalue.g_value_get_int64(propValue);
-        } else if (propType.equals(GType.UINT64)) {
-            return GValueAPI.gvalue.g_value_get_uint64(propValue);
-        } else if (propType.equals(GType.BOOLEAN)) {
-            return GValueAPI.gvalue.g_value_get_boolean(propValue);
-        } else if (propType.equals(GType.FLOAT)) {
-            return GValueAPI.gvalue.g_value_get_float(propValue);
-        } else if (propType.equals(GType.DOUBLE)) {
-            return GValueAPI.gvalue.g_value_get_double(propValue);
-        } else if (propType.equals(GType.STRING)) {
-            return GValueAPI.gvalue.g_value_get_string(propValue);
-        } else if (propType.equals(GType.OBJECT)) {
-            return GValueAPI.gvalue.g_value_dup_object(propValue);
-        } else if (GValueAPI.gvalue.g_value_type_transformable(propType, GType.OBJECT)) {
-            return GValueAPI.gvalue.g_value_dup_object(transform(propValue, GType.OBJECT));
-        } else if (GValueAPI.gvalue.g_value_type_transformable(propType, GType.INT)) {
-            return GValueAPI.gvalue.g_value_get_int(transform(propValue, GType.INT));
-        } else if (GValueAPI.gvalue.g_value_type_transformable(propType, GType.INT64)) {
-            return GValueAPI.gvalue.g_value_get_int64(transform(propValue, GType.INT64));
-        } else {
-            throw new IllegalArgumentException("Unknown conversion from GType=" + propType);
-        }
-    }
-    private static GValue transform(GValue src, GType dstType) {
-        GValue dst = new GValue();
-        GValueAPI.gvalue.g_value_init(dst, dstType);
-        GValueAPI.gvalue.g_value_transform(src, dst);
-        return dst;
-    }
-    private static void transform(Object data, GType type, GValue dst) {
-        GValue src = new GValue();
-        GValueAPI.gvalue.g_value_init(src, type);
-        setGValue(src, type, data);
-        GValueAPI.gvalue.g_value_transform(src, dst);
-    }
-    private static boolean setGValue(GValue value, GType type, Object data) {
-        if (type.equals(GType.INT)) {
-            GValueAPI.gvalue.g_value_set_int(value, intValue(data));
-        } else if (type.equals(GType.UINT)) {
-            GValueAPI.gvalue.g_value_set_uint(value, intValue(data));
-        } else if (type.equals(GType.CHAR)) {
-            GValueAPI.gvalue.g_value_set_char(value, (byte) intValue(data));
-        } else if (type.equals(GType.UCHAR)) {
-            GValueAPI.gvalue.g_value_set_uchar(value, (byte) intValue(data));
-        } else if (type.equals(GType.LONG)) {
-            GValueAPI.gvalue.g_value_set_long(value, new NativeLong(longValue(data)));
-        } else if (type.equals(GType.ULONG)) {
-            GValueAPI.gvalue.g_value_set_ulong(value, new NativeLong(longValue(data)));
-        } else if (type.equals(GType.INT64)) {
-            GValueAPI.gvalue.g_value_set_int64(value, longValue(data));
-        } else if (type.equals(GType.UINT64)) {
-            GValueAPI.gvalue.g_value_set_uint64(value, longValue(data));
-        } else if (type.equals(GType.BOOLEAN)) {
-            GValueAPI.gvalue.g_value_set_boolean(value, booleanValue(data));
-        } else if (type.equals(GType.FLOAT)) {
-            GValueAPI.gvalue.g_value_set_float(value, floatValue(data));
-        } else if (type.equals(GType.DOUBLE)) {
-            GValueAPI.gvalue.g_value_set_double(value, doubleValue(data));
-        } else {
-            return false;
-        }
-        return true;
-    }
-    private static boolean booleanValue(Object value) {
-        if (value instanceof Boolean) {
-            return ((Boolean) value).booleanValue();
-        } else if (value instanceof Number) {
-            return ((Number) value).intValue() != 0;
-        } else if (value instanceof String) {
-            return Boolean.parseBoolean((String) value);
-        }
-        throw new IllegalArgumentException("Expected boolean value, not " + value.getClass());
-    }
-    private static int intValue(Object value) {
-        if (value instanceof Number) {
-            return ((Number) value).intValue();
-        } else if (value instanceof String) {
-            return Integer.parseInt((String) value);
-        }
-        throw new IllegalArgumentException("Expected integer value, not " + value.getClass());
-    }
-    private static long longValue(Object value) {
-        if (value instanceof Number) {
-            return ((Number) value).longValue();
-        } else if (value instanceof String) {
-            return Long.parseLong((String) value);
-        }
-        throw new IllegalArgumentException("Expected long value, not " + value.getClass());
-    }
-    private static float floatValue(Object value) {
-        if (value instanceof Number) {
-            return ((Number) value).floatValue();
-        } else if (value instanceof String) {
-            return Float.parseFloat((String) value);
-        }
-        throw new IllegalArgumentException("Expected float value, not " + value.getClass());
-    }
-    private static double doubleValue(Object value) {
-        if (value instanceof Number) {
-            return  ((Number) value).doubleValue();
-        } else if (value instanceof String) {
-            return Double.parseDouble((String) value);
-        }
-        throw new IllegalArgumentException("Expected double value, not " + value.getClass());
+        return propValue.toJava();
     }
     
     protected void disposeNativeHandle(Pointer ptr) {
@@ -409,6 +235,32 @@
         return id;
     }
     
+    private interface NotifyCallback extends Callback {
+    	public void onNotify(GObject object, GParamSpec param, Pointer data);
+    }
+    
+    public synchronized long connectNotify(final String propName, final Callback callback) {
+    	NotifyCallback trampoline = new NotifyCallback() {
+			@Override
+			public void onNotify(GObject object, GParamSpec param, Pointer data) {
+				Method[] methods = callback.getClass().getDeclaredMethods();
+				if (methods.length != 1)
+					throw new RuntimeException(String.format("Callback %s must declare exactly one method", callback.getClass()));
+				Method meth = methods[0];
+				Class<?>[] params = meth.getParameterTypes();
+				if (params.length != 2)
+					throw new RuntimeException(String.format("Callback %s entry must have exactly two parameters", callback.getClass()));
+				Object propValue = get(propName);
+				try {
+					methods[0].invoke(callback, new Object[] { object, propValue });
+				} catch (Exception e) {
+					throw new RuntimeException(e);
+				}
+			}
+    	};
+    	return connect("notify::" + propName, trampoline);
+    }
+    
     public synchronized void disconnect(String signal, long id) {
     	Callback cb = signalHandlers.get(id);
     	if (cb == null)

Modified: trunk/src/org/gnome/gir/gobject/GValue.java
==============================================================================
--- trunk/src/org/gnome/gir/gobject/GValue.java	(original)
+++ trunk/src/org/gnome/gir/gobject/GValue.java	Thu Sep 18 17:15:44 2008
@@ -45,6 +45,9 @@
 
 package org.gnome.gir.gobject;
 
+import java.net.URI;
+
+import com.sun.jna.NativeLong;
 import com.sun.jna.Pointer;
 
 public class GValue extends com.sun.jna.Structure {
@@ -62,4 +65,187 @@
 	}
 
 	public volatile GValueData data[] = new GValueData[2];
+	
+    private static GValue transform(GValue src, GType dstType) {
+        GValue dst = new GValue();
+        GValueAPI.gvalue.g_value_init(dst, dstType);
+        GValueAPI.gvalue.g_value_transform(src, dst);
+        return dst;
+    }
+    private static void transform(Object data, GType type, GValue dst) {
+        GValue src = new GValue();
+        GValueAPI.gvalue.g_value_init(src, type);
+        setGValue(src, type, data);
+        GValueAPI.gvalue.g_value_transform(src, dst);
+    }	
+    
+    private static boolean setGValue(GValue value, GType type, Object data) {
+        if (type.equals(GType.INT)) {
+            GValueAPI.gvalue.g_value_set_int(value, intValue(data));
+        } else if (type.equals(GType.UINT)) {
+            GValueAPI.gvalue.g_value_set_uint(value, intValue(data));
+        } else if (type.equals(GType.CHAR)) {
+            GValueAPI.gvalue.g_value_set_char(value, (byte) intValue(data));
+        } else if (type.equals(GType.UCHAR)) {
+            GValueAPI.gvalue.g_value_set_uchar(value, (byte) intValue(data));
+        } else if (type.equals(GType.LONG)) {
+            GValueAPI.gvalue.g_value_set_long(value, new NativeLong(longValue(data)));
+        } else if (type.equals(GType.ULONG)) {
+            GValueAPI.gvalue.g_value_set_ulong(value, new NativeLong(longValue(data)));
+        } else if (type.equals(GType.INT64)) {
+            GValueAPI.gvalue.g_value_set_int64(value, longValue(data));
+        } else if (type.equals(GType.UINT64)) {
+            GValueAPI.gvalue.g_value_set_uint64(value, longValue(data));
+        } else if (type.equals(GType.BOOLEAN)) {
+            GValueAPI.gvalue.g_value_set_boolean(value, booleanValue(data));
+        } else if (type.equals(GType.FLOAT)) {
+            GValueAPI.gvalue.g_value_set_float(value, floatValue(data));
+        } else if (type.equals(GType.DOUBLE)) {
+            GValueAPI.gvalue.g_value_set_double(value, doubleValue(data));
+        } else {
+            return false;
+        }
+        return true;
+    }
+    
+    private static boolean booleanValue(Object value) {
+        if (value instanceof Boolean) {
+            return ((Boolean) value).booleanValue();
+        } else if (value instanceof Number) {
+            return ((Number) value).intValue() != 0;
+        } else if (value instanceof String) {
+            return Boolean.parseBoolean((String) value);
+        }
+        throw new IllegalArgumentException("Expected boolean value, not " + value.getClass());
+    }
+    private static int intValue(Object value) {
+        if (value instanceof Number) {
+            return ((Number) value).intValue();
+        } else if (value instanceof String) {
+            return Integer.parseInt((String) value);
+        }
+        throw new IllegalArgumentException("Expected integer value, not " + value.getClass());
+    }
+    private static long longValue(Object value) {
+        if (value instanceof Number) {
+            return ((Number) value).longValue();
+        } else if (value instanceof String) {
+            return Long.parseLong((String) value);
+        }
+        throw new IllegalArgumentException("Expected long value, not " + value.getClass());
+    }
+    private static float floatValue(Object value) {
+        if (value instanceof Number) {
+            return ((Number) value).floatValue();
+        } else if (value instanceof String) {
+            return Float.parseFloat((String) value);
+        }
+        throw new IllegalArgumentException("Expected float value, not " + value.getClass());
+    }
+    private static double doubleValue(Object value) {
+        if (value instanceof Number) {
+            return  ((Number) value).doubleValue();
+        } else if (value instanceof String) {
+            return Double.parseDouble((String) value);
+        }
+        throw new IllegalArgumentException("Expected double value, not " + value.getClass());
+    }    
+	
+	public Object toJava() {
+		if (g_type.equals(GType.INT)) {
+			return GValueAPI.gvalue.g_value_get_int(this);
+		} else if (g_type.equals(GType.UINT)) {
+			return GValueAPI.gvalue.g_value_get_uint(this);
+		} else if (g_type.equals(GType.CHAR)) {
+			return Integer.valueOf(GValueAPI.gvalue.g_value_get_char(this));
+		} else if (g_type.equals(GType.UCHAR)) {
+			return Integer.valueOf(GValueAPI.gvalue.g_value_get_uchar(this));
+		} else if (g_type.equals(GType.LONG)) {
+			return GValueAPI.gvalue.g_value_get_long(this).longValue();
+		} else if (g_type.equals(GType.ULONG)) {
+			return GValueAPI.gvalue.g_value_get_ulong(this).longValue();
+		} else if (g_type.equals(GType.INT64)) {
+			return GValueAPI.gvalue.g_value_get_int64(this);
+		} else if (g_type.equals(GType.UINT64)) {
+			return GValueAPI.gvalue.g_value_get_uint64(this);
+		} else if (g_type.equals(GType.BOOLEAN)) {
+			return GValueAPI.gvalue.g_value_get_boolean(this);
+		} else if (g_type.equals(GType.FLOAT)) {
+			return GValueAPI.gvalue.g_value_get_float(this);
+		} else if (g_type.equals(GType.DOUBLE)) {
+			return GValueAPI.gvalue.g_value_get_double(this);
+		} else if (g_type.equals(GType.STRING)) {
+			return GValueAPI.gvalue.g_value_get_string(this);
+		} else if (g_type.equals(GType.OBJECT)) {
+			return GValueAPI.gvalue.g_value_dup_object(this);
+		} else if (GValueAPI.gvalue.g_value_type_transformable(g_type, GType.OBJECT)) {
+			return GValueAPI.gvalue.g_value_dup_object(transform(this, GType.OBJECT));
+		} else if (GValueAPI.gvalue.g_value_type_transformable(g_type, GType.INT)) {
+			return GValueAPI.gvalue.g_value_get_int(transform(this, GType.INT));
+		} else if (GValueAPI.gvalue.g_value_type_transformable(g_type, GType.INT64)) {
+			return GValueAPI.gvalue.g_value_get_int64(transform(this, GType.INT64));
+		} else {
+			throw new IllegalArgumentException("Unknown conversion from GType=" + g_type);
+		}
+	}
+	
+	public void set(Object data) {
+	    if (g_type.equals(GType.INT)) {
+			GValueAPI.gvalue.g_value_set_int(this, intValue(data));
+		} else if (g_type.equals(GType.UINT)) {
+			GValueAPI.gvalue.g_value_set_uint(this, intValue(data));
+		} else if (g_type.equals(GType.CHAR)) {
+			GValueAPI.gvalue.g_value_set_char(this, (byte) intValue(data));
+		} else if (g_type.equals(GType.UCHAR)) {
+			GValueAPI.gvalue.g_value_set_uchar(this, (byte) intValue(data));
+		} else if (g_type.equals(GType.LONG)) {
+			GValueAPI.gvalue.g_value_set_long(this, new NativeLong(longValue(data)));
+		} else if (g_type.equals(GType.ULONG)) {
+			GValueAPI.gvalue.g_value_set_ulong(this, new NativeLong(longValue(data)));
+		} else if (g_type.equals(GType.INT64)) {
+			GValueAPI.gvalue.g_value_set_int64(this, longValue(data));
+		} else if (g_type.equals(GType.UINT64)) {
+			GValueAPI.gvalue.g_value_set_uint64(this, longValue(data));
+		} else if (g_type.equals(GType.BOOLEAN)) {
+			GValueAPI.gvalue.g_value_set_boolean(this, booleanValue(data));
+		} else if (g_type.equals(GType.FLOAT)) {
+			GValueAPI.gvalue.g_value_set_float(this, floatValue(data));
+		} else if (g_type.equals(GType.DOUBLE)) {
+			GValueAPI.gvalue.g_value_set_double(this, doubleValue(data));
+		} else if (g_type.equals(GType.STRING)) {
+			//
+			// Special conversion of java URI to gstreamer compatible uri
+			//
+			if (data instanceof URI) {
+				URI uri = (URI) data;
+				String uriString = uri.toString();
+				// Need to fixup file:/ to be file:/// for gstreamer
+				if ("file".equals(uri.getScheme()) && uri.getHost() == null) {
+					final String path = uri.getRawPath();
+					if (com.sun.jna.Platform.isWindows()) {
+						uriString = "file:/" + path;
+					} else {
+						uriString = "file://" + path;
+					}
+				}
+				GValueAPI.gvalue.g_value_set_string(this, uriString);
+			} else {
+				GValueAPI.gvalue.g_value_set_string(this, data.toString());
+			}
+		} else if (g_type.equals(GType.OBJECT)) {
+			GValueAPI.gvalue.g_value_set_object(this, (GObject) data);
+		} else if (GValueAPI.gvalue.g_value_type_transformable(GType.INT64, g_type)) {
+			transform(data, GType.INT64, this);
+		} else if (GValueAPI.gvalue.g_value_type_transformable(GType.LONG, g_type)) {
+			transform(data, GType.LONG, this);
+		} else if (GValueAPI.gvalue.g_value_type_transformable(GType.INT, g_type)) {
+			transform(data, GType.INT, this);
+		} else if (GValueAPI.gvalue.g_value_type_transformable(GType.DOUBLE, g_type)) {
+			transform(data, GType.DOUBLE, this);
+		} else if (GValueAPI.gvalue.g_value_type_transformable(GType.FLOAT, g_type)) {
+			transform(data, GType.FLOAT, this);
+		} else {
+			throw new RuntimeException(String.format("Unsupported transformation of GType %s",  g_type));
+		}
+	}
 }

Modified: trunk/stub-examples/Test.java
==============================================================================
--- trunk/stub-examples/Test.java	(original)
+++ trunk/stub-examples/Test.java	Thu Sep 18 17:15:44 2008
@@ -80,6 +80,14 @@
 		return connect("clicked", c);
 	}
 	
+	public interface FooNotify extends Callback {
+		public void onFooNotify(boolean foo);
+	}
+	
+	public long connectNotify(FooNotify notify) {
+		return connect("notify::foo", notify);
+	}
+	
 	public Test() {
 		super(getGType(), (Object[])null);
 	}



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