Hi, This patch for libgnomecups adds optional DBus support for getting notification of printer additions and removals. This avoids polling the system cupsd every 5 seconds and filling up the logs. Requires an updated DBus patch for cupsd which I'll publish in eggcups soon.
--- libgnomecups-0.1.11/configure.in.dbus 2004-09-08 20:07:40.093144656 -0400
+++ libgnomecups-0.1.11/configure.in 2004-09-08 20:07:40.110142072 -0400
@@ -22,6 +22,26 @@
AC_SUBST(LIBGNOMECUPS_CFLAGS)
AC_SUBST(LIBGNOMECUPS_LIBS)
+AC_ARG_WITH(dbus, [--with-dbus Use DBus], ac_dbus=$withval, ac_dbus=auto)
+if test x"$ac_dbus" != xno; then
+ PKG_CHECK_MODULES(DBUS, dbus-glib-1, have_dbus=yes, have_dbus=no)
+else
+ have_dbus=no
+fi
+if test x"$have_dbus" = xno; then
+ if test x"$ac_dbus" = xyes; then
+ AC_MSG_ERROR([DBus explicitly requested but not found on system])
+ fi
+ ac_dbus=no
+else
+ if test x"$ac_dbus" != xno; then
+ AC_DEFINE(WITH_DBUS, 1, [Define if you have DBus])
+ DBUS_CFLAGS="-DDBUS_API_SUBJECT_TO_CHANGE $DBUS_CFLAGS"
+ AC_SUBST(DBUS_CFLAGS)
+ AC_SUBST(DBUS_LIBS)
+ fi
+fi
+
CUPS_CFLAGS=`cups-config --cflags | sed 's/-O[0-9]*//' | sed 's/-m[^\t]*//g'`
CUPS_LIBS=`cups-config --libs`
--- libgnomecups-0.1.11/libgnomecups/Makefile.am.dbus 2003-05-02 06:35:23.000000000 -0400
+++ libgnomecups-0.1.11/libgnomecups/Makefile.am 2004-09-08 20:07:40.114141464 -0400
@@ -2,6 +2,7 @@
-I$(top_srcdir) \
-I$(top_builddir) \
$(WARN_CFLAGS) \
+ $(DBUS_CFLAGS) \
$(CUPS_CFLAGS) \
$(LIBGNOMECUPS_CFLAGS) \
-DGNOMELOCALEDIR=\""$(prefix)/${DATADIRNAME}/locale"\" \
@@ -12,6 +13,7 @@
lib_LTLIBRARIES=libgnomecups-1.0.la
libgnomecups_1_0_la_LDFLAGS = \
$(CUPS_LIBS) \
+ $(DBUS_LIBS) \
$(LIBGNOMECUPS_LIBS)
libgnomecups_1_0_la_SOURCES = \
--- libgnomecups-0.1.11/libgnomecups/gnome-cups-printer.c.dbus 2004-09-08 20:07:40.079146784 -0400
+++ libgnomecups-0.1.11/libgnomecups/gnome-cups-printer.c 2004-09-08 20:11:42.407307304 -0400
@@ -25,6 +25,10 @@
#include "gnome-cups-printer.h"
+#ifdef WITH_DBUS
+#include <dbus/dbus.h>
+#include <dbus/dbus-glib-lowlevel.h>
+#endif
#include <cups/cups.h>
#include <time.h>
#include <stdlib.h>
@@ -98,6 +102,7 @@
};
static void update_printers (void);
+static gboolean init_dbus (void);
static void set_timeout (void);
static GList *printer_names = NULL;
@@ -608,7 +613,8 @@
char *printer_name = user_data;
g_hash_table_remove (printers, printer_name);
- set_timeout ();
+ if (!init_dbus ())
+ set_timeout ();
}
static void
@@ -741,6 +747,96 @@
return TRUE;
}
+#ifdef WITH_DBUS
+static DBusHandlerResult
+handle_system_dbus_message (DBusConnection *connection,
+ DBusMessage *message,
+ void *user_data)
+{
+ DBusError error;
+ gboolean is_addition;
+ char *printer_name;
+
+ if (dbus_message_is_signal (message,
+ "com.redhat.PrinterSpooler",
+ "PrinterAdded")) {
+ is_addition = TRUE;
+ } else if (dbus_message_is_signal (message,
+ "com.redhat.PrinterSpooler",
+ "PrinterRemoved")) {
+ is_addition = FALSE;
+ } else {
+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+ }
+
+ dbus_error_init (&error);
+ if (!dbus_message_get_args (message, &error,
+ DBUS_TYPE_STRING, &printer_name,
+ DBUS_TYPE_INVALID)) {
+ g_message ("Couldn't parse arguments for DBus message");
+ dbus_error_free (&error);
+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+ }
+
+ if (is_addition) {
+ printer_names = g_list_append (printer_names,
+ g_strdup (printer_name));
+ printer_added (printer_name);
+ } else {
+ GList *link = g_list_find_custom (printer_names,
+ printer_name,
+ (GCompareFunc) strcmp);
+ if (link) {
+ printer_names = g_list_remove_link (printer_names,
+ link);
+ g_free (link->data);
+ }
+ printer_removed (printer_name);
+ }
+ g_free (printer_name);
+
+ return DBUS_HANDLER_RESULT_HANDLED;
+}
+#endif
+
+static gboolean
+init_dbus (void)
+{
+#ifdef WITH_DBUS
+ static DBusConnection *dbus_connection = NULL;
+ DBusConnection *connection;
+ DBusError error;
+
+ if (dbus_connection &&
+ dbus_connection_get_is_connected (dbus_connection))
+ return TRUE;
+
+ if (dbus_connection &&
+ !dbus_connection_get_is_connected (dbus_connection)) {
+ dbus_connection_unref (dbus_connection);
+ dbus_connection = NULL;
+ }
+
+ dbus_error_init (&error);
+ connection = dbus_bus_get (DBUS_BUS_SYSTEM, &error);
+ if (connection == NULL || dbus_error_is_set (&error)) {
+ g_warning ("Couldn't connect to system bus");
+ dbus_error_free (&error);
+ return FALSE;
+ }
+
+ dbus_bus_add_match (connection,
+ "type='signal',"
+ "interface='com.redhat.PrinterSpooler'",
+ NULL);
+ dbus_connection_add_filter (connection, handle_system_dbus_message,
+ NULL, NULL);
+ dbus_connection_setup_with_g_main (connection, NULL);
+ dbus_connection = connection;
+#endif
+ return TRUE;
+}
+
static void
set_timeout (void)
{
@@ -775,7 +871,8 @@
add_notifies = g_list_append (add_notifies, notify);
- set_timeout ();
+ if (!init_dbus ())
+ set_timeout ();
return notify->id;
}
@@ -792,7 +889,8 @@
}
}
- set_timeout ();
+ if (!init_dbus ())
+ set_timeout ();
}
guint
@@ -812,7 +910,8 @@
removed_notifies = g_list_append (removed_notifies, notify);
- set_timeout ();
+ if (!init_dbus ())
+ set_timeout ();
return notify->id;
}
@@ -829,7 +928,8 @@
}
}
- set_timeout ();
+ if (!init_dbus ())
+ set_timeout ();
}
GnomeCupsPrinter *
@@ -884,7 +984,8 @@
key = g_strdup (printer_name);
g_hash_table_insert (printers, key, printer);
g_object_weak_ref (G_OBJECT (printer), remove_from_printers, key);
- set_timeout ();
+ if (!init_dbus ())
+ set_timeout ();
if (default_printer && !strcmp (printer_name, default_printer)) {
printer->details->is_default = TRUE;
@@ -1058,7 +1159,7 @@
gnome_cups_request_file (host, ppdpath, fd, &error);
if (error != NULL) {
- g_warning ("Couldn't retrieve PPD for %s: %s",
+ g_message ("Couldn't retrieve PPD for %s: %s",
printer->details->printer_name,
error->message);
g_error_free (error);
Attachment:
signature.asc
Description: This is a digitally signed message part