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



Author: bersace
Date: Mon Dec 15 22:38:40 2008
New Revision: 703
URL: http://svn.gnome.org/viewvc/gnome-scan?rev=703&view=rev

Log:
Reload device parameters and determine actual device status.

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

Modified: trunk/modules/gsane/gsane-option-handler.c
==============================================================================
--- trunk/modules/gsane/gsane-option-handler.c	(original)
+++ trunk/modules/gsane/gsane-option-handler.c	Mon Dec 15 22:38:40 2008
@@ -20,6 +20,7 @@
  */
 
 #include "gsane-option-handler.h"
+#include "gsane-scanner.h"
 #include "gsane-common.h"
 
 #define	GSANE_OPTION_HANDLER_GET_PRIVATE(obj)	(G_TYPE_INSTANCE_GET_PRIVATE((obj), GSANE_TYPE_OPTION_HANDLER, GSaneOptionHandlerPrivate))
@@ -142,7 +143,7 @@
 	if (flags & SANE_INFO_RELOAD_OPTIONS)
 		g_signal_emit_by_name(self->scanner, "reload-options");
 	if (flags & SANE_INFO_RELOAD_PARAMS)
-		g_debug("Reload params");
+		gsane_scanner_reload_parameters(GSANE_SCANNER(self->scanner));
 
 	return inexact;
 }

Modified: trunk/modules/gsane/gsane-scanner.c
==============================================================================
--- trunk/modules/gsane/gsane-scanner.c	(original)
+++ trunk/modules/gsane/gsane-scanner.c	Mon Dec 15 22:38:40 2008
@@ -46,6 +46,7 @@
 
 	/* status */
 	gboolean probe_done;
+	gboolean guessing_parameters;
 };
 
 enum {
@@ -71,7 +72,9 @@
 	return GNOME_SCAN_SCANNER(object);
 }
 
-gboolean
+
+/* Returns whether the status is good */
+static gboolean
 gsane_scanner_check_sane_status(GSaneScanner *self, const gchar* operation, SANE_Status status)
 {
 	/* TODO: update node status, handle error/warning */
@@ -84,6 +87,37 @@
 }
 
 static void
+gsane_scanner_reload_parameters_thread(GSaneScanner* self)
+{
+	SANE_Status status;
+	SANE_Parameters params;
+	g_debug("%s: reload params", self->priv->sane_id);
+
+	status = sane_start(self->priv->handle);
+	if (!gsane_scanner_check_sane_status(self, "sane_start", status))
+		goto end;
+
+	status = sane_get_parameters(self->priv->handle, &params);
+	if (gsane_scanner_check_sane_status(self, "sane_get_parameters", status))
+		gnome_scan_node_update_status(GNOME_SCAN_NODE(self), GNOME_SCAN_STATUS_READY, NULL);
+
+	g_debug("%s parameters reloaded", self->priv->sane_id);
+ end:
+ 	sane_cancel(self->priv->handle);
+	self->priv->guessing_parameters = FALSE;
+}
+
+void
+gsane_scanner_reload_parameters(GSaneScanner* self)
+{
+	if (self->priv->guessing_parameters)
+		return;
+
+	self->priv->guessing_parameters = TRUE;
+	g_thread_create((GThreadFunc)gsane_scanner_reload_parameters_thread, self, FALSE, NULL);
+}
+
+static void
 gsane_scanner_handle_sane_option(GSaneScanner*self, SANE_Int n, const SANE_Option_Descriptor* desc, const gchar* group)
 {
 	/* retrieve handler type */
@@ -161,7 +195,7 @@
 	}
 
 	gnome_scan_node_update_status(GNOME_SCAN_NODE(self), GNOME_SCAN_STATUS_UNCONFIGURED, NULL);
-
+	gsane_scanner_reload_parameters(self);
  end:
 	self->priv->probe_done = TRUE;
 	return NULL;
@@ -192,6 +226,7 @@
 	self->priv->option_handlers	= g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify)gsane_option_handler_destroy);
 	self->priv->handle		= NULL;
 	self->priv->probe_done		= FALSE;
+	self->priv->guessing_parameters	= FALSE;
 }
 
 static void

Modified: trunk/modules/gsane/gsane-scanner.h
==============================================================================
--- trunk/modules/gsane/gsane-scanner.h	(original)
+++ trunk/modules/gsane/gsane-scanner.h	Mon Dec 15 22:38:40 2008
@@ -58,6 +58,7 @@
 GType gsane_scanner_get_type (void) G_GNUC_CONST;
 void gsane_scanner_register_type (GTypeModule *module);
 GnomeScanScanner* gsane_scanner_new (const SANE_Device *device);
+void gsane_scanner_reload_parameters(GSaneScanner* self);
 
 G_END_DECLS
 



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