[aravis/dom] dom: make genicam float test pass.



commit f9a7f6638792652e816df20bb4c5c2d01e236b73
Author: Emmanuel Pacaud <emmanuel gnome org>
Date:   Wed Feb 29 10:09:24 2012 +0100

    dom: make genicam float test pass.

 src/arvgcfloatnode.c    |  152 ++++++++++++++++++++++-------------------------
 src/arvgcfloatnode.h    |   15 ++---
 src/arvgcpropertynode.c |   29 +++++++++
 src/arvgcpropertynode.h |    2 +
 4 files changed, 110 insertions(+), 88 deletions(-)
---
diff --git a/src/arvgcfloatnode.c b/src/arvgcfloatnode.c
index 8c44b27..03904a2 100644
--- a/src/arvgcfloatnode.c
+++ b/src/arvgcfloatnode.c
@@ -1,6 +1,6 @@
 /* Aravis - Digital camera library
  *
- * Copyright  2009-2010 Emmanuel Pacaud
+ * Copyright  2009-2012 Emmanuel Pacaud
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -42,43 +42,50 @@ arv_gc_float_node_get_node_name (ArvDomNode *node)
 	return "Float";
 }
 
-/* ArvGcFeatureNode implementation */
+/* ArvDomElement implementation */
+
+static void
+arv_gc_float_node_post_new_child (ArvDomNode *self, ArvDomNode *child)
+{
+	ArvGcFloatNode *node = ARV_GC_FLOAT_NODE (self);
+
+	if (ARV_IS_GC_PROPERTY_NODE (child)) {
+		ArvGcPropertyNode *property_node = ARV_GC_PROPERTY_NODE (child);
+
+		switch (arv_gc_property_node_get_node_type (property_node)) {
+			case ARV_GC_PROPERTY_NODE_TYPE_VALUE:
+			case ARV_GC_PROPERTY_NODE_TYPE_P_VALUE:
+				node->value = property_node;
+				break;
+			case ARV_GC_PROPERTY_NODE_TYPE_MINIMUM:
+			case ARV_GC_PROPERTY_NODE_TYPE_P_MINIMUM:
+				node->maximum = property_node;
+				break;
+			case ARV_GC_PROPERTY_NODE_TYPE_MAXIMUM:
+			case ARV_GC_PROPERTY_NODE_TYPE_P_MAXIMUM:
+				node->minimum = property_node;
+				break;
+			case ARV_GC_PROPERTY_NODE_TYPE_INCREMENT:
+			case ARV_GC_PROPERTY_NODE_TYPE_P_INCREMENT:
+				node->increment = property_node;
+				break;
+			case ARV_GC_PROPERTY_NODE_TYPE_UNIT:
+				node->unit = property_node;
+				break;
+			default:
+				ARV_DOM_NODE_CLASS (parent_class)->post_new_child (self, child);
+				break;
+		}
+	}
+}
 
-#if 0
 static void
-arv_gc_float_node_add_element (ArvGcFeatureNode *node, const char *name, const char *content, const char **attributes)
+arv_gc_float_node_pre_remove_child (ArvDomNode *self, ArvDomNode *child)
 {
-	ArvGcFloatNode *gc_float_node = ARV_GC_FLOAT_NODE (node);
-	double value;
-	char *value_str = (char *) content;
-
-	if (strcmp (name, "Value") == 0) {
-		arv_str_parse_double (&value_str, &value);
-		arv_force_g_value_to_double (&gc_float_node->value, value);
-	} else if (strcmp (name, "Min") == 0) {
-		arv_str_parse_double (&value_str, &value);
-		arv_force_g_value_to_double (&gc_float_node->minimum, value);
-	} else if (strcmp (name, "Max") == 0) {
-		arv_str_parse_double (&value_str, &value);
-		arv_force_g_value_to_double (&gc_float_node->maximum, value);
-	} else if (strcmp (name, "Inc") == 0) {
-		arv_force_g_value_to_int64 (&gc_float_node->increment,
-					    g_ascii_strtoll (content, NULL, 0));
-	} else if (strcmp (name, "pValue") == 0) {
-		arv_force_g_value_to_string (&gc_float_node->value, content);
-	} else if (strcmp (name, "pMin") == 0) {
-		arv_force_g_value_to_string (&gc_float_node->minimum, content);
-	} else if (strcmp (name, "pMax") == 0) {
-		arv_force_g_value_to_string (&gc_float_node->maximum, content);
-	} else if (strcmp (name, "pInc") == 0) {
-		arv_force_g_value_to_string (&gc_float_node->increment, content);
-	} else if (strcmp (name, "Unit") == 0) {
-		g_free (gc_float_node->unit);
-		gc_float_node->unit = g_strdup (content);
-	} else
-		ARV_GC_FEATURE_NODE_CLASS (parent_class)->add_element (node, name, content, attributes);
+	g_assert_not_reached ();
 }
-#endif
+
+/* ArvGcFeatureNode implementation */
 
 static GType
 arv_gc_float_node_get_value_type (ArvGcFeatureNode *node)
@@ -98,10 +105,10 @@ arv_gc_float_node_get_value_as_string (ArvGcFeatureNode *node)
 {
 	ArvGcFloatNode *float_node = ARV_GC_FLOAT_NODE (node);
 
-	g_ascii_formatd (float_node->v_string, G_ASCII_DTOSTR_BUF_SIZE,
-			 "%g", arv_gc_float_get_value (ARV_GC_FLOAT (node)));
+	if (float_node->value != NULL)
+		return arv_gc_property_node_get_string (ARV_GC_PROPERTY_NODE (float_node->value));
 
-	return float_node->v_string;
+	return NULL;
 }
 
 /* ArvGcFloatNode implementation */
@@ -119,31 +126,11 @@ arv_gc_float_node_new (void)
 static void
 arv_gc_float_node_init (ArvGcFloatNode *gc_float_node)
 {
-	g_value_init (&gc_float_node->value, G_TYPE_DOUBLE);
-	g_value_init (&gc_float_node->minimum, G_TYPE_DOUBLE);
-	g_value_init (&gc_float_node->maximum, G_TYPE_DOUBLE);
-	g_value_init (&gc_float_node->increment, G_TYPE_INT64);
-
-	g_value_set_double (&gc_float_node->value, 0);
-	g_value_set_double (&gc_float_node->minimum, -G_MINDOUBLE);
-	g_value_set_double (&gc_float_node->maximum, G_MAXDOUBLE);
-	g_value_set_int64 (&gc_float_node->increment, 1);
-
-	gc_float_node->unit = NULL;
 }
 
 static void
 arv_gc_float_node_finalize (GObject *object)
 {
-	ArvGcFloatNode *gc_float_node = ARV_GC_FLOAT_NODE (object);
-
-	g_free (gc_float_node->unit);
-
-	g_value_unset (&gc_float_node->value);
-	g_value_unset (&gc_float_node->minimum);
-	g_value_unset (&gc_float_node->maximum);
-	g_value_unset (&gc_float_node->increment);
-
 	parent_class->finalize (object);
 }
 
@@ -158,7 +145,8 @@ arv_gc_float_node_class_init (ArvGcFloatNodeClass *this_class)
 
 	object_class->finalize = arv_gc_float_node_finalize;
 	dom_node_class->get_node_name = arv_gc_float_node_get_node_name;
-/*        gc_feature_node_class->add_element = arv_gc_float_node_add_element;*/
+	dom_node_class->post_new_child = arv_gc_float_node_post_new_child;
+	dom_node_class->pre_remove_child = arv_gc_float_node_pre_remove_child;
 	gc_feature_node_class->get_value_type = arv_gc_float_node_get_value_type;
 	gc_feature_node_class->set_value_from_string = arv_gc_float_node_set_value_from_string;
 	gc_feature_node_class->get_value_as_string = arv_gc_float_node_get_value_as_string;
@@ -170,50 +158,53 @@ static double
 arv_gc_float_node_get_float_value (ArvGcFloat *gc_float)
 {
 	ArvGcFloatNode *gc_float_node = ARV_GC_FLOAT_NODE (gc_float);
-	ArvGc *genicam;
 
-	genicam = arv_gc_node_get_genicam (ARV_GC_NODE (gc_float));
-	return arv_gc_get_double_from_value (genicam, &gc_float_node->value);
+	if (gc_float_node->value != NULL)
+		return arv_gc_property_node_get_double (ARV_GC_PROPERTY_NODE (gc_float_node->value));
+
+	return 0.0;
 }
 
 static void
 arv_gc_float_node_set_float_value (ArvGcFloat *gc_float, double value)
 {
 	ArvGcFloatNode *gc_float_node = ARV_GC_FLOAT_NODE (gc_float);
-	ArvGc *genicam;
 
-	genicam = arv_gc_node_get_genicam (ARV_GC_NODE (gc_float));
-	arv_gc_set_double_to_value (genicam, &gc_float_node->value, value);
+	if (gc_float_node->value != NULL)
+		arv_gc_property_node_set_double (ARV_GC_PROPERTY_NODE (gc_float_node->value), value);
 }
 
 static double
 arv_gc_float_node_get_min (ArvGcFloat *gc_float)
 {
 	ArvGcFloatNode *gc_float_node = ARV_GC_FLOAT_NODE (gc_float);
-	ArvGc *genicam;
 
-	genicam = arv_gc_node_get_genicam (ARV_GC_NODE (gc_float));
-	return arv_gc_get_double_from_value (genicam, &gc_float_node->minimum);
+	if (gc_float_node->minimum != NULL)
+		return arv_gc_property_node_get_double (ARV_GC_PROPERTY_NODE (gc_float_node->minimum));
+
+	return -G_MAXFLOAT;
 }
 
 static double
 arv_gc_float_node_get_max (ArvGcFloat *gc_float)
 {
 	ArvGcFloatNode *gc_float_node = ARV_GC_FLOAT_NODE (gc_float);
-	ArvGc *genicam;
 
-	genicam = arv_gc_node_get_genicam (ARV_GC_NODE (gc_float));
-	return arv_gc_get_double_from_value (genicam, &gc_float_node->maximum);
+	if (gc_float_node->maximum != NULL)
+		return arv_gc_property_node_get_double (ARV_GC_PROPERTY_NODE (gc_float_node->maximum));
+
+	return G_MAXFLOAT;
 }
 
 static gint64
 arv_gc_float_node_get_inc (ArvGcFloat *gc_float)
 {
 	ArvGcFloatNode *gc_float_node = ARV_GC_FLOAT_NODE (gc_float);
-	ArvGc *genicam;
 
-	genicam = arv_gc_node_get_genicam (ARV_GC_NODE (gc_float));
-	return arv_gc_get_int64_from_value (genicam, &gc_float_node->increment);
+	if (gc_float_node->increment != NULL)
+		return arv_gc_property_node_get_int64 (ARV_GC_PROPERTY_NODE (gc_float_node->increment));
+
+	return 1;
 }
 
 static const char *
@@ -221,27 +212,28 @@ arv_gc_float_node_get_unit (ArvGcFloat *gc_float)
 {
 	ArvGcFloatNode *gc_float_node = ARV_GC_FLOAT_NODE (gc_float);
 
-	return gc_float_node->unit;
+	if (gc_float_node->unit != NULL)
+		return arv_gc_property_node_get_string (ARV_GC_PROPERTY_NODE (gc_float_node->unit));
+
+	return NULL;
 }
 
 static void
 arv_gc_float_node_impose_min (ArvGcFloat *gc_float, double minimum)
 {
 	ArvGcFloatNode *gc_float_node = ARV_GC_FLOAT_NODE (gc_float);
-	ArvGc *genicam;
 
-	genicam = arv_gc_node_get_genicam (ARV_GC_NODE (gc_float));
-	arv_gc_set_double_to_value (genicam, &gc_float_node->minimum, minimum);
+	if (gc_float_node->minimum != NULL)
+		arv_gc_property_node_set_double (ARV_GC_PROPERTY_NODE (gc_float_node->minimum), minimum);
 }
 
 static void
 arv_gc_float_node_impose_max (ArvGcFloat *gc_float, double maximum)
 {
 	ArvGcFloatNode *gc_float_node = ARV_GC_FLOAT_NODE (gc_float);
-	ArvGc *genicam;
 
-	genicam = arv_gc_node_get_genicam (ARV_GC_NODE (gc_float));
-	arv_gc_set_double_to_value (genicam, &gc_float_node->minimum, maximum);
+	if (gc_float_node->maximum != NULL)
+		arv_gc_property_node_set_double (ARV_GC_PROPERTY_NODE (gc_float_node->maximum), maximum);
 }
 
 static void
diff --git a/src/arvgcfloatnode.h b/src/arvgcfloatnode.h
index ff8bab1..5ac9172 100644
--- a/src/arvgcfloatnode.h
+++ b/src/arvgcfloatnode.h
@@ -1,6 +1,6 @@
 /* Aravis - Digital camera library
  *
- * Copyright  2009-2010 Emmanuel Pacaud
+ * Copyright  2009-2012 Emmanuel Pacaud
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -25,6 +25,7 @@
 
 #include <arvtypes.h>
 #include <arvgcfeaturenode.h>
+#include <arvgcpropertynode.h>
 
 G_BEGIN_DECLS
 
@@ -40,13 +41,11 @@ typedef struct _ArvGcFloatNodeClass ArvGcFloatNodeClass;
 struct _ArvGcFloatNode {
 	ArvGcFeatureNode	node;
 
-	GValue value;
-	GValue minimum;
-	GValue maximum;
-	GValue increment;
-	char *unit;
-
-	char v_string[G_ASCII_DTOSTR_BUF_SIZE];
+	ArvGcPropertyNode *value;
+	ArvGcPropertyNode *minimum;
+	ArvGcPropertyNode *maximum;
+	ArvGcPropertyNode *increment;
+	ArvGcPropertyNode *unit;
 };
 
 struct _ArvGcFloatNodeClass {
diff --git a/src/arvgcpropertynode.c b/src/arvgcpropertynode.c
index 65a290c..94aeca1 100644
--- a/src/arvgcpropertynode.c
+++ b/src/arvgcpropertynode.c
@@ -147,6 +147,35 @@ arv_gc_property_node_set_int64 (ArvGcPropertyNode *node, gint64 v_int64)
 	}
 }
 
+double
+arv_gc_property_node_get_double (ArvGcPropertyNode *node)
+{
+	const char *string;
+
+	string = arv_gc_property_node_get_string (node);
+
+	if (string != NULL)
+		return g_ascii_strtod (string, NULL);
+
+	 return 0.0;
+}
+
+void
+arv_gc_property_node_set_double (ArvGcPropertyNode *node, double v_double)
+{
+	ArvDomNode *child;
+
+	g_return_if_fail (ARV_IS_GC_PROPERTY_NODE (node));
+
+	child = arv_dom_node_get_first_child (ARV_DOM_NODE (node));
+	if (child != NULL) {
+		char buffer[G_ASCII_DTOSTR_BUF_SIZE];
+
+		g_ascii_dtostr (buffer, G_ASCII_DTOSTR_BUF_SIZE, v_double);
+		arv_dom_character_data_set_data (ARV_DOM_CHARACTER_DATA (child), buffer);
+	}
+}
+
 ArvGcPropertyNodeType
 arv_gc_property_node_get_node_type (ArvGcPropertyNode *node)
 {
diff --git a/src/arvgcpropertynode.h b/src/arvgcpropertynode.h
index b6ce4f0..61c1e6b 100644
--- a/src/arvgcpropertynode.h
+++ b/src/arvgcpropertynode.h
@@ -86,6 +86,8 @@ const char * 		arv_gc_property_node_get_string 	(ArvGcPropertyNode *node);
 void	 		arv_gc_property_node_set_string 	(ArvGcPropertyNode *node, const char *string);
 gint64			arv_gc_property_node_get_int64		(ArvGcPropertyNode *node);
 void			arv_gc_property_node_set_int64		(ArvGcPropertyNode *node, gint64 v_int64);
+double 			arv_gc_property_node_get_double 	(ArvGcPropertyNode *node);
+void 			arv_gc_property_node_set_double 	(ArvGcPropertyNode *node, double v_double);
 ArvGcPropertyNodeType	arv_gc_property_node_get_node_type	(ArvGcPropertyNode *node);
 
 G_END_DECLS



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