Parse lpoptions correctly

Parse options job-sheets, job-hold-until and sides correctly.
Add get_lpoption_name() for translation of lpoption names to
gtk option names. Usable for options which values don't need
conversion (e.g. number-up, number-up-layout, job-billing
and job-priority).
Rename array option_names to ppd_option_names to reflect its
purpose better. Rename get_option_name() to get_ppd_option_name()
because of the same reason.
This commit is contained in:
Marek Kasik 2010-10-15 12:08:12 +02:00 committed by Matthias Clasen
parent d70b7f49b6
commit 95e69afea8
2 changed files with 97 additions and 12 deletions

View File

@ -2565,6 +2565,13 @@ dialog_get_number_up_layout (GtkPrintUnixDialog *dialog)
if (val == NULL)
return layout;
if (val[0] == '\0' && priv->options)
{
GtkPrinterOption *option = gtk_printer_option_set_lookup (priv->options, "gtk-n-up-layout");
if (option)
val = option->value;
}
enum_class = g_type_class_ref (GTK_TYPE_NUMBER_UP_LAYOUT);
enum_value = g_enum_get_value_by_nick (enum_class, val);
if (enum_value)

View File

@ -2828,13 +2828,23 @@ static const struct {
static const struct {
const char *ppd_keyword;
const char *name;
} option_names[] = {
} ppd_option_names[] = {
{"Duplex", "gtk-duplex" },
{"MediaType", "gtk-paper-type"},
{"InputSlot", "gtk-paper-source"},
{"OutputBin", "gtk-output-tray"},
};
static const struct {
const char *lpoption;
const char *name;
} lpoption_names[] = {
{"number-up", "gtk-n-up" },
{"number-up-layout", "gtk-n-up-layout"},
{"job-billing", "gtk-billing-info"},
{"job-priority", "gtk-job-prio"},
};
/* keep sorted when changing */
static const char *color_option_whitelist[] = {
"BRColorEnhancement",
@ -3350,17 +3360,33 @@ create_boolean_option (ppd_file_t *ppd_file,
}
static gchar *
get_option_name (const gchar *keyword)
get_ppd_option_name (const gchar *keyword)
{
int i;
for (i = 0; i < G_N_ELEMENTS (option_names); i++)
if (strcmp (option_names[i].ppd_keyword, keyword) == 0)
return g_strdup (option_names[i].name);
for (i = 0; i < G_N_ELEMENTS (ppd_option_names); i++)
if (strcmp (ppd_option_names[i].ppd_keyword, keyword) == 0)
return g_strdup (ppd_option_names[i].name);
return g_strdup_printf ("cups-%s", keyword);
}
static gchar *
get_lpoption_name (const gchar *lpoption)
{
int i;
for (i = 0; i < G_N_ELEMENTS (ppd_option_names); i++)
if (strcmp (ppd_option_names[i].ppd_keyword, lpoption) == 0)
return g_strdup (ppd_option_names[i].name);
for (i = 0; i < G_N_ELEMENTS (lpoption_names); i++)
if (strcmp (lpoption_names[i].lpoption, lpoption) == 0)
return g_strdup (lpoption_names[i].name);
return g_strdup_printf ("cups-%s", lpoption);
}
static int
strptr_cmp (const void *a,
const void *b)
@ -3395,7 +3421,7 @@ handle_option (GtkPrinterOptionSet *set,
if (STRING_IN_TABLE (ppd_option->keyword, cups_option_blacklist))
return;
name = get_option_name (ppd_option->keyword);
name = get_ppd_option_name (ppd_option->keyword);
option = NULL;
if (ppd_option->ui == PPD_UI_PICKONE)
@ -3719,10 +3745,62 @@ cups_printer_get_options (GtkPrinter *printer,
if (STRING_IN_TABLE (opts[i].name, cups_option_blacklist))
continue;
name = get_option_name (opts[i].name);
option = gtk_printer_option_set_lookup (set, name);
if (option)
gtk_printer_option_set (option, opts[i].value);
name = get_lpoption_name (opts[i].name);
if (strcmp (name, "cups-job-sheets") == 0)
{
gchar **values;
gint num_values;
values = g_strsplit (opts[i].value, ",", 2);
num_values = g_strv_length (values);
option = gtk_printer_option_set_lookup (set, "gtk-cover-before");
if (option && num_values > 0)
gtk_printer_option_set (option, g_strstrip (values[0]));
option = gtk_printer_option_set_lookup (set, "gtk-cover-after");
if (option && num_values > 1)
gtk_printer_option_set (option, g_strstrip (values[1]));
g_strfreev (values);
}
else if (strcmp (name, "cups-job-hold-until") == 0)
{
GtkPrinterOption *option2 = NULL;
option = gtk_printer_option_set_lookup (set, "gtk-print-time-text");
if (option && opts[i].value)
{
option2 = gtk_printer_option_set_lookup (set, "gtk-print-time");
if (option2)
{
if (strcmp (opts[i].value, "indefinite") == 0)
gtk_printer_option_set (option2, "on-hold");
else
{
gtk_printer_option_set (option2, "at");
gtk_printer_option_set (option, opts[i].value);
}
}
}
}
else if (strcmp (name, "cups-sides") == 0)
{
option = gtk_printer_option_set_lookup (set, "gtk-duplex");
if (option && opts[i].value)
{
if (strcmp (opts[i].value, "two-sided-short-edge") == 0)
gtk_printer_option_set (option, "DuplexTumble");
else if (strcmp (opts[i].value, "two-sided-long-edge") == 0)
gtk_printer_option_set (option, "DuplexNoTumble");
}
}
else
{
option = gtk_printer_option_set_lookup (set, name);
if (option)
gtk_printer_option_set (option, opts[i].value);
}
g_free (name);
}
@ -3738,7 +3816,7 @@ mark_option_from_set (GtkPrinterOptionSet *set,
ppd_option_t *ppd_option)
{
GtkPrinterOption *option;
char *name = get_option_name (ppd_option->keyword);
char *name = get_ppd_option_name (ppd_option->keyword);
option = gtk_printer_option_set_lookup (set, name);
@ -3773,7 +3851,7 @@ set_conflicts_from_option (GtkPrinterOptionSet *set,
if (ppd_option->conflicted)
{
name = get_option_name (ppd_option->keyword);
name = get_ppd_option_name (ppd_option->keyword);
option = gtk_printer_option_set_lookup (set, name);
if (option)