printing: Get output bin via IPP

Request "output-bin-supported" and "output-bin-default" attributes through
IPP if there is no PPD for selected printer.
Pass "output-bin" option with other options in printer_get_options().
Translate standard IPP values of "output-bin" option.

https://bugzilla.gnome.org/show_bug.cgi?id=725441
This commit is contained in:
Marek Kasik 2015-06-23 13:28:21 +02:00
parent 7ce96cb6ac
commit 4e4a2fe17e
3 changed files with 135 additions and 11 deletions

View File

@ -1939,6 +1939,8 @@ static const char * const printer_attrs_detailed[] =
"media-top-margin-supported",
"sides-default",
"sides-supported",
"output-bin-default",
"output-bin-supported",
};
typedef enum
@ -1996,6 +1998,8 @@ typedef struct
GList *sides_supported;
char **covers;
int number_of_covers;
gchar *output_bin_default;
GList *output_bin_supported;
} PrinterSetupInfo;
static void
@ -2365,6 +2369,17 @@ cups_printer_handle_attribute (GtkPrintBackendCups *cups_backend,
info->media_size_supported = g_list_reverse (info->media_size_supported);
}
else if (g_strcmp0 (ippGetName (attr), "output-bin-default") == 0)
{
info->output_bin_default = g_strdup (ippGetString (attr, 0, NULL));
}
else if (g_strcmp0 (ippGetName (attr), "output-bin-supported") == 0)
{
for (i = 0; i < ippGetCount (attr); i++)
info->output_bin_supported = g_list_prepend (info->output_bin_supported, g_strdup (ippGetString (attr, i, NULL)));
info->output_bin_supported = g_list_reverse (info->output_bin_supported);
}
else
{
GTK_NOTE (PRINTING,
@ -2673,6 +2688,8 @@ cups_request_printer_info_cb (GtkPrintBackendCups *cups_backend,
}
GTK_PRINTER_CUPS (printer)->sides_default = info->sides_default;
GTK_PRINTER_CUPS (printer)->sides_supported = info->sides_supported;
GTK_PRINTER_CUPS (printer)->output_bin_default = info->output_bin_default;
GTK_PRINTER_CUPS (printer)->output_bin_supported = info->output_bin_supported;
gtk_printer_set_has_details (printer, TRUE);
g_signal_emit_by_name (printer, "details-acquired", TRUE);
@ -4306,6 +4323,7 @@ static const struct {
const char *translation;
} ipp_option_translations[] = {
{ "sides", "gtk-duplex", N_("Two Sided") },
{ "output-bin", "gtk-output-tray", N_("Output Tray") },
};
static const struct {
@ -4318,6 +4336,37 @@ static const struct {
{ "sides", "two-sided-long-edge", NC_("sides", "Long Edge (Standard)") },
/* Translators: this is an option of "Two Sided" */
{ "sides", "two-sided-short-edge", NC_("sides", "Short Edge (Flip)") },
/* Translators: Top output bin */
{ "output-bin", "top", NC_("output-bin", "Top Bin") },
/* Translators: Middle output bin */
{ "output-bin", "middle", NC_("output-bin", "Middle Bin") },
/* Translators: Bottom output bin */
{ "output-bin", "bottom", NC_("output-bin", "Bottom Bin") },
/* Translators: Side output bin */
{ "output-bin", "side", NC_("output-bin", "Side Bin") },
/* Translators: Left output bin */
{ "output-bin", "left", NC_("output-bin", "Left Bin") },
/* Translators: Right output bin */
{ "output-bin", "right", NC_("output-bin", "Right Bin") },
/* Translators: Center output bin */
{ "output-bin", "center", NC_("output-bin", "Center Bin") },
/* Translators: Rear output bin */
{ "output-bin", "rear", NC_("output-bin", "Rear Bin") },
/* Translators: Output bin where one sided output is oriented in the face-up position */
{ "output-bin", "face-up", NC_("output-bin", "Face Up Bin") },
/* Translators: Output bin where one sided output is oriented in the face-down position */
{ "output-bin", "face-down", NC_("output-bin", "Face Down Bin") },
/* Translators: Large capacity output bin */
{ "output-bin", "large-capacity", NC_("output-bin", "Large Capacity Bin") },
/* Translators: Output stacker number %d */
{ "output-bin", "stacker-N", NC_("output-bin", "Stacker %d") },
/* Translators: Output mailbox number %d */
{ "output-bin", "mailbox-N", NC_("output-bin", "Mailbox %d") },
/* Translators: Private mailbox */
{ "output-bin", "my-mailbox", NC_("output-bin", "My Mailbox") },
/* Translators: Output tray number %d */
{ "output-bin", "tray-N", NC_("output-bin", "Tray %d") },
};
static const struct {
@ -5036,24 +5085,84 @@ static gchar *
get_ipp_choice_translation (const gchar *ipp_option_name,
const gchar *ipp_choice)
{
gchar *translation = NULL;
gint i;
const gchar *nptr;
guint64 index;
gchar *translation = NULL;
gsize ipp_choice_length;
gchar *endptr;
gint i;
for (i = 0; i < G_N_ELEMENTS (ipp_choice_translations); i++)
{
if (g_strcmp0 (ipp_choice_translations[i].ipp_option_name, ipp_option_name) == 0 &&
g_strcmp0 (ipp_choice_translations[i].ipp_choice, ipp_choice) == 0)
if (g_strcmp0 (ipp_choice_translations[i].ipp_option_name, ipp_option_name) == 0)
{
translation = g_strdup (g_dpgettext2 (GETTEXT_PACKAGE,
ipp_option_name,
ipp_choice_translations[i].translation));
break;
ipp_choice_length = strlen (ipp_choice_translations[i].ipp_choice);
if (g_strcmp0 (ipp_choice_translations[i].ipp_choice, ipp_choice) == 0)
{
translation = g_strdup (g_dpgettext2 (GETTEXT_PACKAGE,
ipp_option_name,
ipp_choice_translations[i].translation));
break;
}
else if (g_str_has_suffix (ipp_choice_translations[i].ipp_choice, "-N") &&
g_ascii_strncasecmp (ipp_choice_translations[i].ipp_choice,
ipp_choice,
ipp_choice_length - 2) == 0)
{
/* Find out index of the ipp_choice if it is supported for the choice. */
endptr = NULL;
nptr = ipp_choice + ipp_choice_length - 1;
index = g_ascii_strtoull (nptr,
&endptr,
10);
if (index != 0 || endptr != nptr)
{
translation = g_strdup_printf (g_dpgettext2 (GETTEXT_PACKAGE,
ipp_option_name,
ipp_choice_translations[i].translation),
index);
break;
}
}
}
}
return translation;
}
/*
* Format an IPP choice to a displayable string.
*/
static gchar *
format_ipp_choice (const gchar *ipp_choice)
{
gboolean after_space = TRUE;
gchar *result = NULL;
gsize i;
if (ipp_choice != NULL)
{
result = g_strdup (ipp_choice);
/* Replace all '-' by spaces. */
result = g_strdelimit (result, "-", ' ');
if (g_str_is_ascii (result))
{
/* Convert all leading characters to upper case. */
for (i = 0; i < strlen (result); i++)
{
if (after_space && g_ascii_isalpha (result[i]))
result[i] = g_ascii_toupper (result[i]);
after_space = g_ascii_isspace (result[i]);
}
}
}
return result;
}
/*
* Look the IPP option up in given set of options.
* Create it if it doesn't exist and set its default value
@ -5109,7 +5218,7 @@ setup_ipp_option (gchar *ipp_option_name,
if (translation != NULL)
choices_display[i] = translation;
else
choices_display[i] = g_strdup (ipp_choice);
choices_display[i] = format_ipp_choice (ipp_choice);
i++;
}
@ -5392,6 +5501,14 @@ cups_printer_get_options (GtkPrinter *printer,
if (option != NULL)
set_option_from_settings (option, settings);
option = setup_ipp_option ("output-bin",
cups_printer->output_bin_default,
cups_printer->output_bin_supported,
set);
if (option != NULL)
set_option_from_settings (option, settings);
}
/* Now honor the user set defaults for this printer */
@ -5793,7 +5910,7 @@ set_option_from_settings (GtkPrinterOption *option,
else if (strcmp (option->name, "gtk-output-tray") == 0)
map_settings_to_option (option, output_tray_map, G_N_ELEMENTS (output_tray_map),
settings, GTK_PRINT_SETTINGS_OUTPUT_BIN,
"OutputBin", NULL);
"OutputBin", "output-bin");
else if (strcmp (option->name, "gtk-duplex") == 0)
map_settings_to_option (option, duplex_map, G_N_ELEMENTS (duplex_map),
settings, GTK_PRINT_SETTINGS_DUPLEX,
@ -5910,7 +6027,7 @@ foreach_option_get_settings (GtkPrinterOption *option,
else if (strcmp (option->name, "gtk-output-tray") == 0)
map_option_to_settings (value, output_tray_map, G_N_ELEMENTS (output_tray_map),
settings, GTK_PRINT_SETTINGS_OUTPUT_BIN,
"OutputBin", NULL, FALSE);
"OutputBin", "output-bin", option_is_ipp_option (option));
else if (strcmp (option->name, "gtk-duplex") == 0)
map_option_to_settings (value, duplex_map, G_N_ELEMENTS (duplex_map),
settings, GTK_PRINT_SETTINGS_DUPLEX,

View File

@ -137,6 +137,8 @@ gtk_printer_cups_init (GtkPrinterCups *printer)
printer->sides_supported = NULL;
printer->number_of_covers = 0;
printer->covers = NULL;
printer->output_bin_default = NULL;
printer->output_bin_supported = NULL;
}
static void
@ -190,6 +192,9 @@ gtk_printer_cups_finalize (GObject *object)
g_free (printer->sides_default);
g_list_free_full (printer->sides_supported, g_free);
g_free (printer->output_bin_default);
g_list_free_full (printer->output_bin_supported, g_free);
if (printer->get_remote_ppd_poll > 0)
g_source_remove (printer->get_remote_ppd_poll);
printer->get_remote_ppd_attempts = 0;

View File

@ -68,6 +68,8 @@ struct _GtkPrinterCups
gboolean media_margin_default_set;
gchar *sides_default;
GList *sides_supported;
gchar *output_bin_default;
GList *output_bin_supported;
gchar *default_cover_before;
gchar *default_cover_after;