/*
- * "$Id: lpoptions.c 177 2006-06-21 00:20:03Z jlovell $"
+ * "$Id: lpoptions.c 7720 2008-07-11 22:46:21Z mike $"
*
* Printer option program for the Common UNIX Printing System (CUPS).
*
+ * Copyright 2007-2008 by Apple Inc.
* Copyright 1997-2006 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
- * property of Easy Software Products and are protected by Federal
- * copyright law. Distribution and use rights are outlined in the file
- * "LICENSE.txt" which should have been included with this file. If this
- * file is missing or damaged please contact Easy Software Products
- * at:
- *
- * Attn: CUPS Licensing Information
- * Easy Software Products
- * 44141 Airport View Drive, Suite 204
- * Hollywood, Maryland 20636 USA
- *
- * Voice: (301) 373-9600
- * EMail: cups-info@cups.org
- * WWW: http://www.cups.org
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
* Contents:
*
* Local functions...
*/
-void list_group(ppd_group_t *group);
-void list_options(cups_dest_t *dest);
-void usage(void);
+static void list_group(ppd_file_t *ppd, ppd_group_t *group);
+static void list_options(cups_dest_t *dest);
+static void usage(void);
/*
*option; /* Current option */
+ _cupsSetLocale(argv);
+
/*
* Loop through the command-line arguments...
*/
if (num_dests == 0)
num_dests = cupsGetDests(&dests);
- if ((dest = cupsGetDest(printer, instance, num_dests, dests)) == NULL)
+ if (num_dests == 0 || !dests ||
+ (dest = cupsGetDest(printer, instance, num_dests,
+ dests)) == NULL)
{
_cupsLangPuts(stderr,
_("lpoptions: Unknown printer or class!\n"));
break;
case 'o' : /* -o option[=value] */
+ if (dest == NULL)
+ {
+ if (num_dests == 0)
+ num_dests = cupsGetDests(&dests);
+
+ if ((dest = cupsGetDest(NULL, NULL, num_dests, dests)) == NULL)
+ dest = dests;
+
+ if (dest == NULL)
+ {
+ _cupsLangPuts(stderr, _("lpoptions: No printers!?!\n"));
+ return (1);
+ }
+
+ for (j = 0; j < dest->num_options; j ++)
+ if (cupsGetOption(dest->options[j].name, num_options, options) == NULL)
+ num_options = cupsAddOption(dest->options[j].name,
+ dest->options[j].value,
+ num_options, &options);
+ }
+
if (argv[i][2])
num_options = cupsParseOptions(argv[i] + 2, num_options, &options);
else
break;
case 'r' : /* -r option (remove) */
+ if (dest == NULL)
+ {
+ if (num_dests == 0)
+ num_dests = cupsGetDests(&dests);
+
+ if ((dest = cupsGetDest(NULL, NULL, num_dests, dests)) == NULL)
+ dest = dests;
+
+ if (dest == NULL)
+ {
+ _cupsLangPuts(stderr, _("lpoptions: No printers!?!\n"));
+ return (1);
+ }
+
+ for (j = 0; j < dest->num_options; j ++)
+ if (cupsGetOption(dest->options[j].name, num_options, options) == NULL)
+ num_options = cupsAddOption(dest->options[j].name,
+ dest->options[j].value,
+ num_options, &options);
+ }
+
if (argv[i][2])
option = argv[i] + 2;
else
}
for (j = 0; j < num_options; j ++)
- if (strcasecmp(options[j].name, option) == 0)
+ if (!strcasecmp(options[j].name, option))
{
/*
* Remove this option...
* 'list_group()' - List printer-specific options from the PPD group.
*/
-void
-list_group(ppd_group_t *group) /* I - Group to show */
+static void
+list_group(ppd_file_t *ppd, /* I - PPD file */
+ ppd_group_t *group) /* I - Group to show */
{
- int i, j; /* Looping vars */
- ppd_option_t *option; /* Current option */
- ppd_choice_t *choice; /* Current choice */
- ppd_group_t *subgroup; /* Current subgroup */
+ int i, j; /* Looping vars */
+ ppd_option_t *option; /* Current option */
+ ppd_choice_t *choice; /* Current choice */
+ ppd_group_t *subgroup; /* Current subgroup */
for (i = group->num_options, option = group->options; i > 0; i --, option ++)
{
+ if (!strcasecmp(option->keyword, "PageRegion"))
+ continue;
+
_cupsLangPrintf(stdout, "%s/%s:", option->keyword, option->text);
- for (j = option->num_choices, choice = option->choices; j > 0; j --, choice ++)
- if (choice->marked)
+ for (j = option->num_choices, choice = option->choices;
+ j > 0;
+ j --, choice ++)
+ if (!strcasecmp(choice->choice, "Custom"))
+ {
+ ppd_coption_t *coption; /* Custom option */
+ ppd_cparam_t *cparam; /* Custom parameter */
+ static const char * const types[] =
+ { /* Parameter types */
+ "CURVE",
+ "INTEGER",
+ "INVCURVE",
+ "PASSCODE",
+ "PASSWORD",
+ "POINTS",
+ "REAL",
+ "STRING"
+ };
+
+
+ if ((coption = ppdFindCustomOption(ppd, option->keyword)) == NULL ||
+ cupsArrayCount(coption->params) == 0)
+ _cupsLangPrintf(stdout, " %sCustom", choice->marked ? "*" : "");
+ else if (!strcasecmp(option->keyword, "PageSize") ||
+ !strcasecmp(option->keyword, "PageRegion"))
+ _cupsLangPrintf(stdout, " %sCustom.WIDTHxHEIGHT",
+ choice->marked ? "*" : "");
+ else
+ {
+ cparam = (ppd_cparam_t *)cupsArrayFirst(coption->params);
+
+ if (cupsArrayCount(coption->params) == 1)
+ _cupsLangPrintf(stdout, " %sCustom.%s", choice->marked ? "*" : "",
+ types[cparam->type]);
+ else
+ {
+ const char *prefix; /* Prefix string */
+
+
+ if (choice->marked)
+ prefix = " *{";
+ else
+ prefix = " {";
+
+ while (cparam)
+ {
+ _cupsLangPrintf(stdout, "%s%s=%s", prefix, cparam->name,
+ types[cparam->type]);
+ cparam = (ppd_cparam_t *)cupsArrayNext(coption->params);
+ prefix = " ";
+ }
+
+ _cupsLangPuts(stdout, "}");
+ }
+ }
+ }
+ else if (choice->marked)
_cupsLangPrintf(stdout, " *%s", choice->choice);
else
_cupsLangPrintf(stdout, " %s", choice->choice);
}
for (i = group->num_subgroups, subgroup = group->subgroups; i > 0; i --, subgroup ++)
- list_group(subgroup);
+ list_group(ppd, subgroup);
}
* 'list_options()' - List printer-specific options from the PPD file.
*/
-void
-list_options(cups_dest_t *dest) /* I - Destination to list */
+static void
+list_options(cups_dest_t *dest) /* I - Destination to list */
{
- int i; /* Looping var */
- const char *filename; /* PPD filename */
- ppd_file_t *ppd; /* PPD data */
- ppd_group_t *group; /* Current group */
+ int i; /* Looping var */
+ const char *filename; /* PPD filename */
+ ppd_file_t *ppd; /* PPD data */
+ ppd_group_t *group; /* Current group */
if ((filename = cupsGetPPD(dest->name)) == NULL)
{
_cupsLangPrintf(stderr,
- _("lpoptions: Destination %s has no PPD file!\n"),
- dest->name);
+ _("lpoptions: Unable to get PPD file for %s: %s\n"),
+ dest->name, cupsLastErrorString());
return;
}
cupsMarkOptions(ppd, dest->num_options, dest->options);
for (i = ppd->num_groups, group = ppd->groups; i > 0; i --, group ++)
- list_group(group);
+ list_group(ppd, group);
ppdClose(ppd);
unlink(filename);
* 'usage()' - Show program usage and exit.
*/
-void
+static void
usage(void)
{
_cupsLangPuts(stdout,
/*
- * End of "$Id: lpoptions.c 177 2006-06-21 00:20:03Z jlovell $".
+ * End of "$Id: lpoptions.c 7720 2008-07-11 22:46:21Z mike $".
*/