printing: List Avahi printers

Show printers advertised by avahi on local network. CUPS
backend now looks for _ipps._tcp and _ipp._tcp services
offered by avahi. If it finds such a service (printer)
it requests its attributes through IPP_GET_PRINTER_ATTRIBUTES
ipp request and adds it to the list of printers. Such printer
behaves like a remote printer then.
If an avahi printer is a default printer then it is considered
default by the backend only if there is no local or remote
default printer.
This functionality is enabled when building Gtk+ with CUPS 1.6
or later because it replaces browsing protocol removed in CUPS 1.6.

https://bugzilla.gnome.org/show_bug.cgi?id=688956
This commit is contained in:
Marek Kasik
2013-03-04 14:29:24 +01:00
parent bfb327deda
commit eed9e72e83
7 changed files with 1081 additions and 160 deletions

View File

@ -12,6 +12,7 @@ AM_CPPFLAGS = \
-I$(top_builddir)/gdk \
$(CUPS_CFLAGS) \
$(COLORD_CFLAGS) \
$(AVAHI_CFLAGS) \
-DGTK_COMPILATION \
-DGTK_PRINT_BACKEND_ENABLE_UNSUPPORTED \
$(GTK_DEP_CFLAGS) \
@ -37,6 +38,6 @@ noinst_HEADERS = \
gtkcupsutils.h
libprintbackend_cups_la_LDFLAGS = -avoid-version -module $(no_undefined)
libprintbackend_cups_la_LIBADD = $(LDADDS) $(CUPS_LIBS)
libprintbackend_cups_la_LIBADD = $(LDADDS) $(CUPS_LIBS) $(AVAHI_LIBS)
-include $(top_srcdir)/git.mk

View File

@ -87,6 +87,20 @@ static GtkCupsRequestStateFunc get_states[] = {
#define ippSetState(ipp_request, ipp_state) ipp_request->state = ipp_state
#define ippGetString(attr, index, foo) attr->values[index].string.text
#define ippGetCount(attr) attr->num_values
int
ippSetVersion (ipp_t *ipp,
int major,
int minor)
{
if (!ipp || major < 0 || minor < 0)
return 0;
ipp->request.any.version[0] = major;
ipp->request.any.version[1] = minor;
return 1;
}
#endif
static void
@ -656,6 +670,13 @@ gtk_cups_request_encode_option (GtkCupsRequest *request,
}
}
void
gtk_cups_request_set_ipp_version (GtkCupsRequest *request,
gint major,
gint minor)
{
ippSetVersion (request->ipp_request, major, minor);
}
static void
_connect (GtkCupsRequest *request)

View File

@ -178,6 +178,9 @@ gboolean gtk_cups_request_is_done (GtkCupsRequest *
void gtk_cups_request_encode_option (GtkCupsRequest *request,
const gchar *option,
const gchar *value);
void gtk_cups_request_set_ipp_version (GtkCupsRequest *request,
gint major,
gint minor);
gboolean gtk_cups_result_is_error (GtkCupsResult *result);
ipp_t * gtk_cups_result_get_response (GtkCupsResult *result);
GtkCupsErrorType gtk_cups_result_get_error_type (GtkCupsResult *result);

File diff suppressed because it is too large Load Diff

View File

@ -114,6 +114,17 @@ gtk_printer_cups_init (GtkPrinterCups *printer)
printer->remote_cups_connection_test = NULL;
printer->auth_info_required = NULL;
printer->default_number_up = 1;
#ifdef HAVE_AVAHI_BROWSING
printer->avahi_browsed = FALSE;
printer->avahi_name = NULL;
printer->avahi_type = NULL;
printer->avahi_domain = NULL;
#endif
printer->ipp_version_major = 1;
printer->ipp_version_minor = 1;
printer->supports_copies = FALSE;
printer->supports_collate = FALSE;
printer->supports_number_up = FALSE;
}
static void
@ -134,8 +145,11 @@ gtk_printer_cups_finalize (GObject *object)
g_strfreev (printer->auth_info_required);
#ifdef HAVE_COLORD
g_cancellable_cancel (printer->colord_cancellable);
g_object_unref (printer->colord_cancellable);
if (printer->colord_cancellable)
{
g_cancellable_cancel (printer->colord_cancellable);
g_object_unref (printer->colord_cancellable);
}
g_free (printer->colord_title);
g_free (printer->colord_qualifier);
if (printer->colord_client)
@ -146,6 +160,12 @@ gtk_printer_cups_finalize (GObject *object)
g_object_unref (printer->colord_profile);
#endif
#ifdef HAVE_AVAHI_BROWSING
g_free (printer->avahi_name);
g_free (printer->avahi_type);
g_free (printer->avahi_domain);
#endif
if (printer->ppd_file)
ppdClose (printer->ppd_file);
@ -512,7 +532,8 @@ colord_printer_details_aquired_cb (GtkPrinterCups *printer,
gpointer user_data)
{
/* refresh the device */
colord_update_device (printer);
if (printer->colord_client)
colord_update_device (printer);
}
#endif
@ -565,6 +586,14 @@ gtk_printer_cups_new (const char *name,
G_CALLBACK (colord_printer_details_aquired_cb),
printer);
#endif
/*
* IPP version 1.1 has to be supported
* by all implementations according to rfc 2911
*/
printer->ipp_version_major = 1;
printer->ipp_version_minor = 1;
return printer;
}

View File

@ -75,6 +75,17 @@ struct _GtkPrinterCups
gchar *colord_title;
gchar *colord_qualifier;
#endif
#ifdef HAVE_AVAHI_BROWSING
gboolean avahi_browsed;
gchar *avahi_name;
gchar *avahi_type;
gchar *avahi_domain;
#endif
guchar ipp_version_major;
guchar ipp_version_minor;
gboolean supports_copies;
gboolean supports_collate;
gboolean supports_number_up;
};
struct _GtkPrinterCupsClass