gnome-scan r673 - in trunk: . modules/gsane



Author: bersace
Date: Sun Dec 14 13:28:38 2008
New Revision: 673
URL: http://svn.gnome.org/viewvc/gnome-scan?rev=673&view=rev

Log:
Set/Get SANE option value.

Modified:
   trunk/ChangeLog
   trunk/modules/gsane/gsane-option-handler-generic.c
   trunk/modules/gsane/gsane-option-handler.c
   trunk/modules/gsane/gsane-option-handler.h

Modified: trunk/modules/gsane/gsane-option-handler-generic.c
==============================================================================
--- trunk/modules/gsane/gsane-option-handler-generic.c	(original)
+++ trunk/modules/gsane/gsane-option-handler-generic.c	Sun Dec 14 13:28:38 2008
@@ -27,29 +27,38 @@
 
 struct _GSaneOptionHandlerGenericPrivate
 {
-	SANE_Int n;
+	SANE_Int index;
 	const SANE_Option_Descriptor* desc;
-	const gchar*		group;
-	GnomeScanOption*	option;
+	GnomeScanOption* option;
 };
 
 static GSaneOptionHandlerClass*gsane_option_handler_generic_parent_class = NULL;
 
 static void
+gsane_option_handler_generic_bool_option_value_changed(GSaneOptionHandlerGeneric* self, GParamSpec* pspec, GObject* option)
+{
+	gboolean value;
+	g_object_get(option, "value", &value, NULL);
+	gsane_option_handler_set_bool(GSANE_OPTION_HANDLER(self), self->priv->desc, self->priv->index, value, NULL);
+}
+
+static void
 gsane_option_handler_generic_handle_option(GSaneOptionHandler *handler, SANE_Int n, const SANE_Option_Descriptor*desc, const gchar* group)
 {
 	GSaneOptionHandlerGeneric* self = GSANE_OPTION_HANDLER_GENERIC(handler);
-	self->priv->n = n;
+	gboolean boolval;
+	self->priv->index = n;
 	self->priv->desc = desc;
-	self->priv->group = group;
-	static gboolean monitor = FALSE;
 
 	/* don't trust SANE test backend */
 	GnomeScanOptionHint hint = GNOME_SCAN_OPTION_HINT_SECONDARY;
 
 	switch(desc->type) {
 	case SANE_TYPE_BOOL:
-		self->priv->option = GNOME_SCAN_OPTION(gnome_scan_option_bool_new(desc->name, desc->title, desc->desc, group, SANE_GETTEXT_PACKAGE, FALSE, hint));
+		boolval = gsane_option_handler_get_bool(GSANE_OPTION_HANDLER(self), desc, n, NULL);
+		self->priv->option = GNOME_SCAN_OPTION(gnome_scan_option_bool_new(desc->name, desc->title, desc->desc, group, SANE_GETTEXT_PACKAGE, boolval, hint));
+		g_signal_connect_swapped(self->priv->option, "notify::value", G_CALLBACK(gsane_option_handler_generic_bool_option_value_changed), self);
+		g_debug("\toption %d : boolean %s = %s", n, desc->name, GSANE_BOOLEAN_TO_STRING(boolval));
 		break;
 	default:
 		break;
@@ -58,7 +67,8 @@
 	if (!self->priv->option)
 		return;
 
-	/* register callbacks */
+	/* common */
+	g_object_set(self->priv->option, "active", SANE_OPTION_IS_ACTIVE(desc->cap), NULL);
 
 	/* install option */
 	gnome_scan_node_install_option(GNOME_SCAN_NODE(handler->scanner), self->priv->option);

Modified: trunk/modules/gsane/gsane-option-handler.c
==============================================================================
--- trunk/modules/gsane/gsane-option-handler.c	(original)
+++ trunk/modules/gsane/gsane-option-handler.c	Sun Dec 14 13:28:38 2008
@@ -20,6 +20,7 @@
  */
 
 #include "gsane-option-handler.h"
+#include "gsane-common.h"
 
 #define	GSANE_OPTION_HANDLER_GET_PRIVATE(obj)	(G_TYPE_INSTANCE_GET_PRIVATE((obj), GSANE_TYPE_OPTION_HANDLER, GSaneOptionHandlerPrivate))
 
@@ -67,6 +68,54 @@
 	GSANE_OPTION_HANDLER_GET_CLASS(self)->handle_option(self, n, desc, group);
 }
 
+static void
+gsane_option_handler_control_option(GSaneOptionHandler*self, const SANE_Option_Descriptor* desc, SANE_Int index, SANE_Action action, gpointer data, GError**error)
+{
+	SANE_Status status;
+	SANE_Int flags = 0;
+
+	if (!SANE_OPTION_IS_ACTIVE(desc->cap)) {
+		g_propagate_error(error, g_error_new(GSANE_ERROR, GSANE_ERROR_OPTION_INACTIVE,
+						     "Option %s is inactive", desc->name));
+		return;
+	}
+
+	if (action == SANE_ACTION_SET_VALUE && !SANE_OPTION_IS_SETTABLE(desc->cap)) {
+		g_propagate_error(error, g_error_new(GSANE_ERROR, GSANE_ERROR_OPTION_READONLY,
+						     "Unable to set readonly option %s", desc->name));
+		return;
+	}
+
+	status = sane_control_option(self->priv->handle, index, action, data, &flags);
+
+	if (status != SANE_STATUS_GOOD) {
+		gsane_propagate_prefixed_status(error, status,
+						"%s(%s)", GSANE_ACTION_TO_STRING(action), desc->name);
+		return;
+	}
+
+	if (flags & SANE_INFO_INEXACT)
+		g_debug("Value inexact");
+	if (flags & SANE_INFO_RELOAD_OPTIONS)
+		g_debug("Reload options");
+	if (flags & SANE_INFO_RELOAD_PARAMS)
+		g_debug("Reload params");
+}
+
+gboolean
+gsane_option_handler_get_bool(GSaneOptionHandler *self, const SANE_Option_Descriptor* desc, SANE_Int index, GError**error)
+{
+	gboolean value = FALSE;
+	gsane_option_handler_control_option(self, desc, index, SANE_ACTION_GET_VALUE, &value, error);
+	return value;
+}
+
+void
+gsane_option_handler_set_bool(GSaneOptionHandler *self, const SANE_Option_Descriptor* desc, SANE_Int index, gboolean value, GError**error)
+{
+	gsane_option_handler_control_option(self, desc, index, SANE_ACTION_SET_VALUE, &value, error);
+}
+
 
 /* GType instance boiler plate code */
 void

Modified: trunk/modules/gsane/gsane-option-handler.h
==============================================================================
--- trunk/modules/gsane/gsane-option-handler.h	(original)
+++ trunk/modules/gsane/gsane-option-handler.h	Sun Dec 14 13:28:38 2008
@@ -63,6 +63,8 @@
 GSaneOptionHandler* gsane_option_handler_new(GType type, GnomeScanScanner *scanner, SANE_Handle handle);
 void gsane_option_handler_destroy(GSaneOptionHandler *self);
 void gsane_option_handler_handle_option(GSaneOptionHandler *self, SANE_Int n, const SANE_Option_Descriptor* desc, const gchar*group);
+gboolean gsane_option_handler_get_bool(GSaneOptionHandler *self, const SANE_Option_Descriptor* desc, SANE_Int index, GError **error);
+void gsane_option_handler_set_bool(GSaneOptionHandler *self, const SANE_Option_Descriptor* desc, SANE_Int index, gboolean value, GError **error);
 
 GType gsane_option_handler_get_type(void) G_GNUC_CONST;
 



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