]> git.ipfire.org Git - thirdparty/cups.git/blobdiff - systemv/lpoptions.c
Merge changes from CUPS 1.4svn-r7961.
[thirdparty/cups.git] / systemv / lpoptions.c
index 3eec93def0690ccbe1f7b9346859d52b34cab793..208ddcd9425368a718f282de6e4288bf6de3bf35 100644 (file)
@@ -1,25 +1,16 @@
 /*
- * "$Id: lpoptions.c 5926 2006-09-05 20:45:47Z mike $"
+ * "$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:
  *
@@ -44,9 +35,9 @@
  * 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);
 
 
 /*
@@ -105,7 +96,9 @@ main(int  argc,                              /* I - Number of 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"));
@@ -174,6 +167,12 @@ main(int  argc,                            /* I - Number of command-line arguments */
              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,
@@ -244,6 +243,12 @@ main(int  argc,                            /* I - Number of command-line arguments */
              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,
@@ -397,21 +402,80 @@ main(int  argc,                           /* I - Number of command-line arguments */
  * '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);
@@ -420,7 +484,7 @@ list_group(ppd_group_t *group)      /* I - Group to show */
   }
 
   for (i = group->num_subgroups, subgroup = group->subgroups; i > 0; i --, subgroup ++)
-    list_group(subgroup);
+    list_group(ppd, subgroup);
 }
 
 
@@ -428,20 +492,20 @@ list_group(ppd_group_t *group)    /* I - Group to show */
  * '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;
   }
 
@@ -458,7 +522,7 @@ list_options(cups_dest_t *dest)     /* I - Destination to list */
   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);
@@ -469,7 +533,7 @@ list_options(cups_dest_t *dest)     /* I - Destination to list */
  * 'usage()' - Show program usage and exit.
  */
 
-void
+static void
 usage(void)
 {
   _cupsLangPuts(stdout,
@@ -484,5 +548,5 @@ usage(void)
 
 
 /*
- * End of "$Id: lpoptions.c 5926 2006-09-05 20:45:47Z mike $".
+ * End of "$Id: lpoptions.c 7720 2008-07-11 22:46:21Z mike $".
  */