]> git.ipfire.org Git - thirdparty/cups.git/commitdiff
Merge changes from CUPS 1.6svn-r10056
authormsweet <msweet@a1ca3aef-8c08-0410-bb20-df032aa958be>
Tue, 4 Oct 2011 06:53:26 +0000 (06:53 +0000)
committermsweet <msweet@a1ca3aef-8c08-0410-bb20-df032aa958be>
Tue, 4 Oct 2011 06:53:26 +0000 (06:53 +0000)
git-svn-id: svn+ssh://src.apple.com/svn/cups/easysw/current@3448 a1ca3aef-8c08-0410-bb20-df032aa958be

16 files changed:
CHANGES-1.5.txt
CHANGES-IPPTOOL.txt
cups/array-private.h
cups/http.c
cups/ipp-support.c
cups/ipp.c
cups/ipp.h
man/lp.man
notifier/dbus.c
systemv/cupstestppd.c
test/ipp-1.1.test
test/ipp-2.0.test
test/ipp-2.2.test
test/ippserver.c
test/ipptool.c
xcode/CUPS.xcodeproj/project.pbxproj

index 70e96810920161a0fbc9ba5e4bf091dcd3fca09f..736f43be451ec363b1b40987d2e48783d4ea719e 100644 (file)
@@ -3,13 +3,17 @@ CHANGES-1.5.txt
 
 CHANGES IN CUPS V1.5.1
 
-       - Documentation updates (STR #3885)
+       - Documentation updates (STR #3885, STR #3946)
+       - The DBUS notifier could crash (STR #3947)
+       - Relaxed some of the page size checks in cupstestppd.
+       - The ipptool program now reports attributes that are repeated within
+         the same attribute group.
        - Updated the PWG raster support to match the current draft
          specification.
        - Fixed some IPP conformance issues in the scheduler.
        - Added ipptool support for repeating requests.
-       - Added IPP/2.2 conformance tests and greatly improved the IPP/1.1
-         conformance testing.
+       - Added IPP/2.2 conformance tests and greatly improved the IPP/1.1,
+         IPP/2.0, and IPP/2.1 conformance testing.
        - IPP messages containing mixed integer/rangeOfInteger values did not
          work (STR #3942)
        - The ipptool program now provides additional diagnostics for badly-
index e107c3cff617716aa0598bd6bf1b819d8b294559..b7c55a1c8523ae69ef91ef3f8113a9d5791d5eaf 100644 (file)
@@ -1,10 +1,43 @@
-CHANGES-IPPTOOL.txt - 2011-09-28
+CHANGES-IPPTOOL.txt - 2011-10-04
 --------------------------------
 
 This file provides a list of changes to the ipptool binary distribution posted
 on cups.org.
 
 
+2011-10-04
+
+       - Fixed a crasher bug that showed up on Windows.
+       - Fixed a typo in the IPP/2.0 test.
+
+
+2011-10-03
+
+       - Using OF-TYPE with the "no-value" or "unknown" out-of-band value tags
+         now works without special WITH-VALUE strings.
+       - ipptool now shows an error when an attribute appears more than once
+         within the same attribute group.
+       - ipptool did not display attributes as specified by the DISPLAY
+         directive when a test error failed.
+       - Fixed one spot where DEFINE-VALUE was still treated as an error when
+         the EXPECT test failed.
+       - uriScheme values were not displayed properly.
+       - Updated the IPP/1.1 tests to properly validate support for
+         job-hold-until-default and job-hold-until-supported when the Hold-Job
+         operation is supported.
+       - Updated the IPP/1.1 tests to properly check for the various standard
+         media sizes for the printing tests.
+       - Updated the IPP/1.1 tests to accept "no-value" for media-default an
+         orientation-requested-default.
+       - Updated the IPP/1.1 tests to accept "unknown" for job-state.
+       - Updated the IPP/1.1 tests to not perform the bogus URI printing tests
+         unless the "document-uri" variable is defined.
+       - Updated the IPP/2.0 tests to properly validate media-col
+         "media-xxx-supported" attributes.
+       - Updated the IPP/2.2 tests to properly validate media-ready and
+         media-col-ready.
+
+
 2011-09-28
 
        - Test output now includes a summary and overall score at the end.
index f6b24e3d0a200f2b576a516d03bbf79be27dcbdf..c0d9a92e87b783fd478a9fc598d49573b78f08ab 100644 (file)
@@ -21,7 +21,7 @@
  * Include necessary headers...
  */
 
-#  include "array.h"
+#  include <cups/array.h>
 
 
 /*
index 33307db463d7f878e0821f4a41e966c9bf81fb31..160a09d07cc4166cf865da065a2d975a51077de1 100644 (file)
@@ -167,8 +167,10 @@ static int         http_read_ssl(http_t *http, char *buf, int len);
 #  if defined(HAVE_CDSASSL) && defined(HAVE_SECCERTIFICATECOPYDATA)
 static int             http_set_credentials(http_t *http);
 #  endif /* HAVE_CDSASSL ** HAVE_SECCERTIFICATECOPYDATA */
+#endif /* HAVE_SSL */
 static void            http_set_timeout(int fd, double timeout);
 static void            http_set_wait(http_t *http);
+#ifdef HAVE_SSL
 static int             http_setup_ssl(http_t *http);
 static void            http_shutdown_ssl(http_t *http);
 static int             http_upgrade(http_t *http);
index a6c23f555667eb6c4225d960c89006ea428213cd..b22b4727be7b53ca59b66a2ee5d4c26669f54bb3 100644 (file)
@@ -100,8 +100,8 @@ static const char * const ipp_status_oks[] =        /* "OK" status codes */
 static char    * const ipp_std_ops[] =
                {
                  /* 0x0000 - 0x000f */
-                 "unknown-00",
-                 "unknown-01",
+                 "0x00",
+                 "0x01",
                  "Print-Job",
                  "Print-URI",
                  "Validate-Job",
@@ -115,7 +115,7 @@ static char * const ipp_std_ops[] =
                  "Hold-Job",
                  "Release-Job",
                  "Restart-Job",
-                 "unknown-0f",
+                 "0x0f",
 
                  /* 0x0010 - 0x001f */
                  "Pause-Printer",
@@ -132,11 +132,11 @@ static char       * const ipp_std_ops[] =
                  "Cancel-Subscription",
                  "Get-Notifications",
                  "Send-Notifications",
-                 "unknown-1e",
-                 "unknown-1f",
+                 "0x1e",
+                 "0x1f",
 
                  /* 0x0020 - 0x002f */
-                 "unknown-20",
+                 "0x20",
                  "Get-Printer-Support-Files",
                  "Enable-Printer",
                  "Disable-Printer",
@@ -156,7 +156,7 @@ static char * const ipp_std_ops[] =
                  /* 0x0030 - 0x003b */
                  "Promote-Job",
                  "Schedule-Job-After",
-                 "unknown-32",
+                 "0x32",
                  "Cancel-Document",
                  "Get-Document-Attributes",
                  "Get-Documents",
@@ -206,46 +206,47 @@ static char       * const ipp_std_ops[] =
                                        /* 0x06 */
                  "event-notification-attributes-tag",
                                        /* 0x07 */
-                 "unknown-08",         /* 0x08 */
-                 "unknown-09",         /* 0x09 */
-                 "unknown-0a",         /* 0x0a */
-                 "unknown-0b",         /* 0x0b */
-                 "unknown-0c",         /* 0x0c */
-                 "unknown-0d",         /* 0x0d */
-                 "unknown-0e",         /* 0x0e */
-                 "unknown-0f",         /* 0x0f */
+                 "0x08",               /* 0x08 */
+                 "document-attributes-tag",
+                                       /* 0x09 */
+                 "0x0a",               /* 0x0a */
+                 "0x0b",               /* 0x0b */
+                 "0x0c",               /* 0x0c */
+                 "0x0d",               /* 0x0d */
+                 "0x0e",               /* 0x0e */
+                 "0x0f",               /* 0x0f */
                  "unsupported",        /* 0x10 */
                  "default",            /* 0x11 */
                  "unknown",            /* 0x12 */
                  "no-value",           /* 0x13 */
-                 "unknown-14",         /* 0x14 */
+                 "0x14",               /* 0x14 */
                  "not-settable",       /* 0x15 */
                  "delete-attribute",   /* 0x16 */
                  "admin-define",       /* 0x17 */
-                 "unknown-18",         /* 0x18 */
-                 "unknown-19",         /* 0x19 */
-                 "unknown-1a",         /* 0x1a */
-                 "unknown-1b",         /* 0x1b */
-                 "unknown-1c",         /* 0x1c */
-                 "unknown-1d",         /* 0x1d */
-                 "unknown-1e",         /* 0x1e */
-                 "unknown-1f",         /* 0x1f */
-                 "unknown-20",         /* 0x20 */
+                 "0x18",               /* 0x18 */
+                 "0x19",               /* 0x19 */
+                 "0x1a",               /* 0x1a */
+                 "0x1b",               /* 0x1b */
+                 "0x1c",               /* 0x1c */
+                 "0x1d",               /* 0x1d */
+                 "0x1e",               /* 0x1e */
+                 "0x1f",               /* 0x1f */
+                 "0x20",               /* 0x20 */
                  "integer",            /* 0x21 */
                  "boolean",            /* 0x22 */
                  "enum",               /* 0x23 */
-                 "unknown-24",         /* 0x24 */
-                 "unknown-25",         /* 0x25 */
-                 "unknown-26",         /* 0x26 */
-                 "unknown-27",         /* 0x27 */
-                 "unknown-28",         /* 0x28 */
-                 "unknown-29",         /* 0x29 */
-                 "unknown-2a",         /* 0x2a */
-                 "unknown-2b",         /* 0x2b */
-                 "unknown-2c",         /* 0x2c */
-                 "unknown-2d",         /* 0x2d */
-                 "unknown-2e",         /* 0x2e */
-                 "unknown-2f",         /* 0x2f */
+                 "0x24",               /* 0x24 */
+                 "0x25",               /* 0x25 */
+                 "0x26",               /* 0x26 */
+                 "0x27",               /* 0x27 */
+                 "0x28",               /* 0x28 */
+                 "0x29",               /* 0x29 */
+                 "0x2a",               /* 0x2a */
+                 "0x2b",               /* 0x2b */
+                 "0x2c",               /* 0x2c */
+                 "0x2d",               /* 0x2d */
+                 "0x2e",               /* 0x2e */
+                 "0x2f",               /* 0x2f */
                  "octetString",        /* 0x30 */
                  "dateTime",           /* 0x31 */
                  "resolution",         /* 0x32 */
@@ -254,18 +255,18 @@ static char       * const ipp_std_ops[] =
                  "textWithLanguage",   /* 0x35 */
                  "nameWithLanguage",   /* 0x36 */
                  "endCollection",      /* 0x37 */
-                 "unknown-38",         /* 0x38 */
-                 "unknown-39",         /* 0x39 */
-                 "unknown-3a",         /* 0x3a */
-                 "unknown-3b",         /* 0x3b */
-                 "unknown-3c",         /* 0x3c */
-                 "unknown-3d",         /* 0x3d */
-                 "unknown-3e",         /* 0x3e */
-                 "unknown-3f",         /* 0x3f */
-                 "unknown-40",         /* 0x40 */
+                 "0x38",               /* 0x38 */
+                 "0x39",               /* 0x39 */
+                 "0x3a",               /* 0x3a */
+                 "0x3b",               /* 0x3b */
+                 "0x3c",               /* 0x3c */
+                 "0x3d",               /* 0x3d */
+                 "0x3e",               /* 0x3e */
+                 "0x3f",               /* 0x3f */
+                 "0x40",               /* 0x40 */
                  "textWithoutLanguage",/* 0x41 */
                  "nameWithoutLanguage",/* 0x42 */
-                 "unknown-43",         /* 0x43 */
+                 "0x43",               /* 0x43 */
                  "keyword",            /* 0x44 */
                  "uri",                /* 0x45 */
                  "uriScheme",          /* 0x46 */
@@ -448,6 +449,7 @@ _ippAttrString(ipp_attribute_t *attr,       /* I - Attribute */
       case IPP_TAG_KEYWORD :
       case IPP_TAG_CHARSET :
       case IPP_TAG_URI :
+      case IPP_TAG_URISCHEME :
       case IPP_TAG_MIMETYPE :
       case IPP_TAG_LANGUAGE :
       case IPP_TAG_TEXTLANG :
@@ -555,10 +557,10 @@ ippErrorString(ipp_status_t error)        /* I - Error status */
     return (ipp_status_1000s[error - IPP_AUTHENTICATION_CANCELED]);
 
  /*
-  * No, build an "unknown-xxxx" error string...
+  * No, build an "0xxxxx" error string...
   */
 
-  sprintf(cg->ipp_unknown, "unknown-%04x", error);
+  sprintf(cg->ipp_unknown, "0x%04x", error);
 
   return (cg->ipp_unknown);
 }
@@ -628,7 +630,7 @@ ippOpString(ipp_op_t op)            /* I - Operation ID */
     return (ipp_cups_ops2[0]);
 
  /*
-  * No, build an "unknown-xxxx" operation string...
+  * No, build an "0xxxxx" operation string...
   */
 
   sprintf(cg->ipp_unknown, "0x%04x", op);
index c98db83e4a66b0bc291a65b2195c69af5a31cbb6..d752c35c02f2cbda41013d3d764c7d0d31a2f890 100644 (file)
@@ -1507,7 +1507,7 @@ ippReadIO(void       *src,                /* I - Data source */
                n = (((((buffer[0] << 8) | buffer[1]) << 8) | buffer[2]) << 8) |
                    buffer[3];
 
-                if (value_tag == IPP_TAG_RANGE)
+                if (attr->value_tag == IPP_TAG_RANGE)
                   value->range.lower = value->range.upper = n;
                 else
                  value->integer = n;
index 1626cabb2893dd0bb61f4ebbf42125bd8fc7494e..78e76fcba737af6176c5939099b2d0436cd91665 100644 (file)
@@ -73,6 +73,7 @@ typedef enum ipp_tag_e                        /**** Format tags for attributes ****/
   IPP_TAG_UNSUPPORTED_GROUP,           /* Unsupported attributes group */
   IPP_TAG_SUBSCRIPTION,                        /* Subscription group */
   IPP_TAG_EVENT_NOTIFICATION,          /* Event group */
+  IPP_TAG_DOCUMENT = 0x09,             /* Document group */
   IPP_TAG_UNSUPPORTED_VALUE = 0x10,    /* Unsupported value */
   IPP_TAG_DEFAULT,                     /* Default value */
   IPP_TAG_UNKNOWN,                     /* Unknown value */
index c313b52df473f5f74080d2f44582cb8dc47068b9..260921660ca969516a60a252a79d55db3e3b394c 100644 (file)
@@ -12,7 +12,7 @@
 .\"   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/".
 .\"
-.TH lp 1 "CUPS" "31 March 2011" "Apple Inc."
+.TH lp 1 "CUPS" "3 October 2011" "Apple Inc."
 .SH NAME
 lp - print files
 .SH SYNOPSIS
@@ -128,10 +128,6 @@ Do not report the resulting job IDs (silent mode.)
 .br
 Sets the job name.
 .TP 5
--u username
-.br
-Submits jobs as \fIusername\fR.
-.TP 5
 -H hh:mm
 .TP 5
 -H hold
index 542a929da6eb9fdc022ca248033a9e35073f544d..4f5b48c55b81aad9fb684dd40954cf594967d09b 100644 (file)
@@ -4,7 +4,7 @@
  *   D-Bus notifier for CUPS.
  *
  *   Copyright 2008-2010 by Apple Inc.
- *   Copyright (C) 2007 Red Hat, Inc.
+ *   Copyright (C) 2011 Red Hat, Inc.
  *   Copyright (C) 2007 Tim Waugh <twaugh@redhat.com>
  *   Copyright 1997-2005 by Easy Software Products.
  *
@@ -353,7 +353,7 @@ main(int  argc,                             /* I - Number of command-line args */
     /*
      * Create and send the new message...
      */
-    
+
     fprintf(stderr, "DEBUG: %s\n", signame);
     message = dbus_message_new_signal("/org/cups/cupsd/Notifier",
                                      "org.cups.cupsd.Notifier",
@@ -423,10 +423,11 @@ main(int  argc,                           /* I - Number of command-line args */
          p = printer_reasons;
          for (i = 0; i < attr->num_values; i++)
          {
-           strcpy(p, attr->values[i].string.text);
-           p += strlen(p);
            if (i)
              *p++ = ',';
+
+           strcpy(p, attr->values[i].string.text);
+           p += strlen(p);
          }
          dbus_message_iter_append_string(&iter, &printer_reasons);
        }
index 3765f4754593d8c61a73d99eacee02f1a11fd808..d08189a584c9ffcd8d9239c71cbe61f166466eaf 100644 (file)
@@ -3180,7 +3180,7 @@ check_sizes(ppd_file_t *ppd,              /* I - PPD file */
 
    /*
     * Verify that the size name is Adobe standard name if it's a standard size
-    * and the dementional name if it's not a standard size.  Suffix should be
+    * and the dimentional name if it's not a standard size.  Suffix should be
     * .Fullbleed, etc., or numeric, e.g., Letter, Letter.Fullbleed,
     * Letter.Transverse, Letter1, Letter2, 4x8, 55x91mm, 55x91mm.Fullbleed, etc.
     */
@@ -3198,39 +3198,53 @@ check_sizes(ppd_file_t *ppd,            /* I - PPD file */
 
       if (pwg_media && pwg_media->ppd)
       {
+        size_t ppdlen = strlen(pwg_media->ppd);
+                                       /* Length of standard PPD name */
+
         strlcpy(buf, pwg_media->ppd, sizeof(buf));
 
         if (size->left == 0 && size->bottom == 0 &&
            size->right == size->width && size->top == size->length)
         {
           snprintf(buf, sizeof(buf), "%s.Fullbleed", pwg_media->ppd);
-         if (strcmp(size->name, buf))
-           is_ok = 0;
-        }
-        else if (size->width > size->length)
-        {
-         if ((ptr = pwg_media->ppd + strlen(pwg_media->ppd) - 7)
-                 >= pwg_media->ppd && !strcmp(ptr, "Rotated"))
+         if (_cups_strcasecmp(size->name, buf))
          {
-           if (strcmp(size->name, buf))
+          /*
+           * Allow an additional qualifier such as ".WithTab"...
+           */
+
+           size_t buflen = strlen(buf);/* Length of full bleed name */
+
+            if (_cups_strncasecmp(size->name, buf, buflen) ||
+                size->name[buflen] != '.')
              is_ok = 0;
          }
-         else
-         {
+        }
+        else if (strcmp(size->name, buf) && size->width > size->length)
+        {
+          if (!strcmp(pwg_media->ppd, "DoublePostcardRotated"))
+            strlcpy(buf, "DoublePostcard", sizeof(buf));
+          else
            snprintf(buf, sizeof(buf), "%sRotated", pwg_media->ppd);
+
+         if (strcmp(size->name, buf))
+         {
+           snprintf(buf, sizeof(buf), "%s.Transverse", pwg_media->ppd);
            if (strcmp(size->name, buf))
-           {
-             snprintf(buf, sizeof(buf), "%s.Transverse", pwg_media->ppd);
-             if (strcmp(size->name, buf))
-               is_ok = 0;
-           }
+             is_ok = 0;
          }
         }
-       else
-        {
-         if ((!strncmp(size->name, pwg_media->ppd, strlen(pwg_media->ppd))))
+       else if (!strncmp(size->name, pwg_media->ppd, ppdlen))
+       {
+        /*
+         * Check for a proper qualifier (number, "Small", or .something)...
+         */
+
+         ptr = size->name + ppdlen;
+
+         if (isdigit(*ptr & 255))
           {
-            for (ptr = size->name + strlen(pwg_media->ppd); *ptr; ptr ++)
+            for (ptr ++; *ptr; ptr ++)
             {
               if (!isdigit(*ptr & 255))
              {
@@ -3239,9 +3253,20 @@ check_sizes(ppd_file_t *ppd,             /* I - PPD file */
              }
             }
           }
-          else
-            is_ok = 0;
+          else if (*ptr != '.' && *ptr && strcmp(ptr, "Small"))
+           is_ok = 0;
         }
+       else
+       {
+        /*
+         * Check for EnvSizeName as well...
+         */
+
+         snprintf(buf, sizeof(buf), "Env%s", pwg_media->ppd);
+
+         if (strcmp(size->name, buf))
+           is_ok = 0;
+       }
 
         if (!is_ok)
           _cupsLangPrintf(stdout,
@@ -3256,7 +3281,7 @@ check_sizes(ppd_file_t *ppd,              /* I - PPD file */
         length_tmp = (fabs(size->length - ceil(size->length)) < 0.1) ?
                         ceil(size->length) : size->length;
 
-        if (fmod(width_tmp, 18.0) == 0.0 && fmod(length_tmp, 18.0) == 0.0)
+        if (fmod(width_tmp, 18.0) == 0.0 || fmod(length_tmp, 18.0) == 0.0)
         {
           width_inch  = width_tmp / 72.0;
           length_inch = length_tmp / 72.0;
@@ -3277,10 +3302,16 @@ check_sizes(ppd_file_t *ppd,            /* I - PPD file */
         else if (size->width > size->length)
           strlcat(buf, ".Transverse", sizeof(buf));
 
-        if (strcmp(size->name, buf))
-          _cupsLangPrintf(stdout,
-                          _("      %s  Size \"%s\" should be \"%s\"."),
-                          prefix, size->name, buf);
+        if (_cups_strcasecmp(size->name, buf))
+        {
+          size_t buflen = strlen(buf); /* Length of proposed name */
+
+          if (_cups_strncasecmp(size->name, buf, buflen) ||
+              strcmp(size->name + buflen, "in"))
+           _cupsLangPrintf(stdout,
+                           _("      %s  Size \"%s\" should be \"%s\"."),
+                           prefix, size->name, buf);
+        }
       }
     }
   }
index 12d6ea674ace1aeddd2f188773d9ac7bb256e492..8e789dcb64c15800469abb992e84a37d3cf11791 100644 (file)
@@ -158,7 +158,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE >0
-       EXPECT job-state OF-TYPE enum COUNT 1 IN-GROUP job-attributes-tag
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE 3,4,5,6,7,8,9
        EXPECT job-state WITH-VALUE 7,8,9 DEFINE-MATCH PRINT_JOB_COMPLETED
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
@@ -204,20 +204,41 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        STATUS successful-ok
 
        # Display some useful information to identify the test
-       DISPLAY printer-name
-       DISPLAY printer-make-and-model
        DISPLAY color-supported
-       DISPLAY pages-per-minute
-       DISPLAY pages-per-minute-color
+       DISPLAY compression-supported
        DISPLAY document-format-supported
        DISPLAY finishings-supported
+       DISPLAY ipp-versions-supported
        DISPLAY job-sheets-supported
        DISPLAY media-supported
        DISPLAY number-up-supported
        DISPLAY operations-supported
+       DISPLAY pages-per-minute
+       DISPLAY pages-per-minute-color
        DISPLAY print-quality-supported
+       DISPLAY printer-uri-supported
        DISPLAY reference-uri-schemes-supported
        DISPLAY sizes-supported
+       DISPLAY uri-authentication-supported
+       DISPLAY uri-security-supported
+
+       # Operations
+       EXPECT operations-supported OF-TYPE enum IN-GROUP printer-attributes-tag WITH-VALUE 0x0002 # Print-Job
+       EXPECT operations-supported WITH-VALUE 0x0003 DEFINE-MATCH OPTIONAL_PRINT_URI # Print-URI
+       EXPECT operations-supported WITH-VALUE 0x0004 # Validate-Job
+       EXPECT operations-supported WITH-VALUE 0x0005 DEFINE-MATCH OPTIONAL_CREATE_JOB # Create-Job
+       EXPECT operations-supported WITH-VALUE 0x0006 DEFINE-MATCH OPTIONAL_SEND_DOCUMENT # Send-Document
+       EXPECT operations-supported WITH-VALUE 0x0007 DEFINE-MATCH OPTIONAL_SEND_URI # Send-URI
+       EXPECT operations-supported WITH-VALUE 0x0008 # Cancel-Job
+       EXPECT operations-supported WITH-VALUE 0x0009 # Get-Job-Attributes
+       EXPECT operations-supported WITH-VALUE 0x000a # Get-Jobs
+       EXPECT operations-supported WITH-VALUE 0x000b # Get-Printer-Attributes
+       EXPECT operations-supported WITH-VALUE 0x000c DEFINE-MATCH OPTIONAL_HOLD_JOB # Hold-Job
+       EXPECT operations-supported WITH-VALUE 0x000d DEFINE-MATCH OPTIONAL_RELEASE_JOB # Release-Job
+       EXPECT operations-supported WITH-VALUE 0x000e DEFINE-MATCH OPTIONAL_RESTART_JOB # Restart-Job
+       EXPECT operations-supported WITH-VALUE 0x0010 DEFINE-MATCH OPTIONAL_PAUSE_PRINTER # Pause-Printer
+       EXPECT operations-supported WITH-VALUE 0x0011 DEFINE-MATCH OPTIONAL_RESUME_PRINTER # Resume-Printer
+       EXPECT operations-supported WITH-VALUE 0x0012 DEFINE-MATCH OPTIONAL_PURGE_JOBS # Purge-Jobs
 
        # Job template attributes
        EXPECT ?copies-default OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE >0
@@ -226,11 +247,13 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT ?finishings-supported OF-TYPE enum IN-GROUP printer-attributes-tag WITH-VALUE 3
        EXPECT ?job-hold-until-default OF-TYPE keyword|name IN-GROUP printer-attributes-tag COUNT 1
        EXPECT ?job-hold-until-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag WITH-VALUE no-hold
+       EXPECT job-hold-until-default IF-DEFINED OPTIONAL_HOLD_JOB
+       EXPECT job-hold-until-supported IF-DEFINED OPTIONAL_HOLD_JOB
        EXPECT ?job-priority-default OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE >0,<101
        EXPECT ?job-priority-supported OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE >0,<101
        EXPECT ?job-sheets-default OF-TYPE keyword|name IN-GROUP printer-attributes-tag
        EXPECT ?job-sheets-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag WITH-VALUE none
-       EXPECT ?media-default OF-TYPE keyword|name IN-GROUP printer-attributes-tag COUNT 1
+       EXPECT ?media-default OF-TYPE no-value|keyword|name IN-GROUP printer-attributes-tag COUNT 1
        EXPECT ?media-ready OF-TYPE keyword|name IN-GROUP printer-attributes-tag
        EXPECT ?media-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag
        EXPECT ?multiple-document-handling-default OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "/^(single-document|separate-documents-uncollated-copies|separate-documents-collated-copies|single-document-new-sheet)$$/"
@@ -238,7 +261,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT ?number-up-default OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE >0
        EXPECT ?number-up-supported OF-TYPE integer|rangeOfInteger IN-GROUP printer-attributes-tag WITH-VALUE >0
        EXPECT ?number-up-supported WITH-VALUE 1
-       EXPECT ?orientation-requested-default OF-TYPE enum,no-value IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE no-value,3,4,5,6
+       EXPECT ?orientation-requested-default OF-TYPE no-value|enum IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE 3,4,5,6
        EXPECT ?orientation-requested-supported OF-TYPE enum IN-GROUP printer-attributes-tag WITH-VALUE 3,4,5,6
        EXPECT ?pages-ranges-supported OF-TYPE boolean IN-GROUP printer-attributes-tag
        EXPECT ?print-quality-default OF-TYPE enum IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE 3,4,5
@@ -254,9 +277,14 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT document-format-supported WITH-VALUE "application/postscript" DEFINE-MATCH OPTIONAL_POSTSCRIPT
        EXPECT document-format-supported WITH-VALUE "image/jpeg" DEFINE-MATCH OPTIONAL_JPEG
        EXPECT job-sheets-supported WITH-VALUE "standard" DEFINE-MATCH OPTIONAL_STANDARD_SHEET
-       EXPECT media-supported WITH-VALUE "/^(a4|iso-a4|iso_a4_210x297mm)$$/" DEFINE-VALUE OPTIONAL_A4_MEDIA
-       EXPECT media-supported WITH-VALUE "/^(letter|na-letter|na_letter_8.5x11in)$$/" DEFINE-VALUE OPTIONAL_LETTER_MEDIA
-       EXPECT media-supported WITH-VALUE "/^(index-4x6|na_index-4x6_4x6in)$$/" DEFINE-VALUE OPTIONAL_4X6_MEDIA
+       EXPECT media-supported WITH-VALUE "a4" DEFINE-VALUE OPTIONAL_A4_MEDIA
+       EXPECT media-supported WITH-VALUE "iso-a4" DEFINE-VALUE OPTIONAL_A4_MEDIA
+       EXPECT media-supported WITH-VALUE "iso_a4_210x297mm" DEFINE-VALUE OPTIONAL_A4_MEDIA
+       EXPECT media-supported WITH-VALUE "letter" DEFINE-VALUE OPTIONAL_LETTER_MEDIA
+       EXPECT media-supported WITH-VALUE "na-letter" DEFINE-VALUE OPTIONAL_LETTER_MEDIA
+       EXPECT media-supported WITH-VALUE "na_letter_8.5x11in" DEFINE-VALUE OPTIONAL_LETTER_MEDIA
+       EXPECT media-supported WITH-VALUE "index-4x6" DEFINE-VALUE OPTIONAL_4X6_MEDIA
+       EXPECT media-supported WITH-VALUE "na_index-4x6_4x6in" DEFINE-VALUE OPTIONAL_4X6_MEDIA
        EXPECT number-up-supported WITH-VALUE 2 DEFINE-MATCH OPTIONAL_2UP
        EXPECT print-quality WITH-VALUE 3 DEFINE-MATCH OPTIONAL_DRAFT_QUALITY
        EXPECT print-quality WITH-VALUE 4 DEFINE-MATCH OPTIONAL_NORMAL_QUALITY
@@ -281,6 +309,8 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT ?printer-more-info-manufacturer OF-TYPE uri IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "$HTTP_URI_SCHEME"
        EXPECT ?printer-state-message OF-TYPE text IN-GROUP printer-attributes-tag
        EXPECT ?reference-uri-schemes-supported OF-TYPE uriScheme IN-GROUP printer-attributes-tag
+       EXPECT reference-uri-schemes-supported WITH-VALUE "ftp" IF-DEFINED OPTIONAL_PRINT_URI
+       EXPECT reference-uri-schemes-supported WITH-VALUE "ftp" IF-DEFINED OPTIONAL_SEND_URI IF-NOT-DEFINED OPTIONAL_PRINT_URI
        EXPECT charset-configured OF-TYPE charset IN-GROUP printer-attributes-tag COUNT 1
        EXPECT charset-supported OF-TYPE charset IN-GROUP printer-attributes-tag WITH-VALUE utf-8
        EXPECT compression-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE none
@@ -299,24 +329,6 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT queued-job-count OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1
        EXPECT uri-authentication-supported OF-TYPE keyword IN-GROUP printer-attributes-tag
        EXPECT uri-security-supported OF-TYPE keyword IN-GROUP printer-attributes-tag SAME-COUNT-AS uri-authentication-supported
-
-       # Operations
-       EXPECT operations-supported OF-TYPE enum IN-GROUP printer-attributes-tag WITH-VALUE 0x0002 # Print-Job
-       EXPECT operations-supported WITH-VALUE 0x0003 DEFINE-MATCH OPTIONAL_PRINT_URI # Print-URI
-       EXPECT operations-supported WITH-VALUE 0x0004 # Validate-Job
-       EXPECT operations-supported WITH-VALUE 0x0005 DEFINE-MATCH OPTIONAL_CREATE_JOB # Create-Job
-       EXPECT operations-supported WITH-VALUE 0x0006 DEFINE-MATCH OPTIONAL_SEND_DOCUMENT # Send-Document
-       EXPECT operations-supported WITH-VALUE 0x0007 DEFINE-MATCH OPTIONAL_SEND_URI # Send-URI
-       EXPECT operations-supported WITH-VALUE 0x0008 # Cancel-Job
-       EXPECT operations-supported WITH-VALUE 0x0009 # Get-Job-Attributes
-       EXPECT operations-supported WITH-VALUE 0x000a # Get-Jobs
-       EXPECT operations-supported WITH-VALUE 0x000b # Get-Printer-Attributes
-       EXPECT operations-supported WITH-VALUE 0x000c DEFINE-MATCH OPTIONAL_HOLD_JOB # Hold-Job
-       EXPECT operations-supported WITH-VALUE 0x000d DEFINE-MATCH OPTIONAL_RELEASE_JOB # Release-Job
-       EXPECT operations-supported WITH-VALUE 0x000e DEFINE-MATCH OPTIONAL_RESTART_JOB # Restart-Job
-       EXPECT operations-supported WITH-VALUE 0x0010 DEFINE-MATCH OPTIONAL_PAUSE_PRINTER # Pause-Printer
-       EXPECT operations-supported WITH-VALUE 0x0011 DEFINE-MATCH OPTIONAL_RESUME_PRINTER # Resume-Printer
-       EXPECT operations-supported WITH-VALUE 0x0012 DEFINE-MATCH OPTIONAL_PURGE_JOBS # Purge-Jobs
 }
 
 
@@ -420,19 +432,19 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT ?job-more-info OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$HTTP_URI_SCHEME"
        EXPECT job-name OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
        EXPECT job-originating-user-name OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
-       EXPECT job-state OF-TYPE enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >2,<10
+       EXPECT job-state OF-TYPE unknown|enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >2,<10
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag COUNT 1
        EXPECT ?job-detailed-status-messages OF-TYPE text IN-GROUP job-attributes-tag
        EXPECT ?number-of-documents OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
        EXPECT ?output-device-assigned OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
-       EXPECT time-at-creation OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE no-value,>-1
-       EXPECT time-at-processing OF-TYPE no-value,integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE no-value,>-1
-       EXPECT time-at-completed OF-TYPE no-value,integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE no-value,>-1
-       EXPECT job-printer-up-time OF-TYPE no-value,integer IN-GROUP job-attributes-tag COUNT 1
-       EXPECT ?date-time-at-creation OF-TYPE no-value,dateTime IN-GROUP job-attributes-tag COUNT 1
-       EXPECT ?date-time-at-processing OF-TYPE no-value,dateTime IN-GROUP job-attributes-tag COUNT 1
-       EXPECT ?date-time-at-completed OF-TYPE no-value,dateTime IN-GROUP job-attributes-tag COUNT 1
+       EXPECT time-at-creation OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
+       EXPECT time-at-processing OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
+       EXPECT time-at-completed OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
+       EXPECT job-printer-up-time OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?date-time-at-creation OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?date-time-at-processing OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?date-time-at-completed OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
        EXPECT ?number-of-intervening-jobs OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
        EXPECT ?job-message-from-operator OF-TYPE text IN-GROUP job-attributes-tag COUNT 1
        EXPECT ?job-k-octets OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
@@ -642,6 +654,22 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
 }
 
 
+# Wait for job to complete...
+{
+       NAME "Get-Job-Attributes Until Job Complete"
+       OPERATION Get-Job-Attributes
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR integer job-id $job-id
+       ATTR name requesting-user-name $user
+
+       STATUS successful-ok
+       EXPECT job-state OF-TYPE unknown|enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >6,<10 REPEAT-NO-MATCH
+}
+
+
 # Test Get-Jobs operation
 #
 # Required by: RFC 2911 section 3.2.6
@@ -654,7 +682,6 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        ATTR uri printer-uri $uri
        ATTR name requesting-user-name $user
        ATTR keyword which-jobs completed
-       DELAY 20
 
        STATUS successful-ok
        EXPECT job-id OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
@@ -724,19 +751,19 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT ?job-more-info OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$HTTP_URI_SCHEME"
        EXPECT job-name OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
        EXPECT job-originating-user-name OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
-       EXPECT job-state OF-TYPE enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >2,<10
+       EXPECT job-state OF-TYPE unknown|enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >2,<10
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag COUNT 1
        EXPECT ?job-detailed-status-messages OF-TYPE text IN-GROUP job-attributes-tag
        EXPECT ?number-of-documents OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
        EXPECT ?output-device-assigned OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
-       EXPECT time-at-creation OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE no-value,>-1
-       EXPECT time-at-processing OF-TYPE no-value,integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE no-value,>-1
-       EXPECT time-at-completed OF-TYPE no-value,integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE no-value,>-1
-       EXPECT job-printer-up-time OF-TYPE no-value,integer IN-GROUP job-attributes-tag COUNT 1
-       EXPECT ?date-time-at-creation OF-TYPE no-value,dateTime IN-GROUP job-attributes-tag COUNT 1
-       EXPECT ?date-time-at-processing OF-TYPE no-value,dateTime IN-GROUP job-attributes-tag COUNT 1
-       EXPECT ?date-time-at-completed OF-TYPE no-value,dateTime IN-GROUP job-attributes-tag COUNT 1
+       EXPECT time-at-creation OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
+       EXPECT time-at-processing OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
+       EXPECT time-at-completed OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
+       EXPECT job-printer-up-time OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?date-time-at-creation OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?date-time-at-processing OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?date-time-at-completed OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
        EXPECT ?number-of-intervening-jobs OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
        EXPECT ?job-message-from-operator OF-TYPE text IN-GROUP job-attributes-tag COUNT 1
        EXPECT ?job-k-octets OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
@@ -805,7 +832,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE >0
-       EXPECT job-state OF-TYPE enum COUNT 1 IN-GROUP job-attributes-tag
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE 3,4,5,6,7,8,9
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
@@ -852,19 +879,19 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT ?job-more-info OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$HTTP_URI_SCHEME"
        EXPECT job-name OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
        EXPECT job-originating-user-name OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
-       EXPECT job-state OF-TYPE enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >2,<10
+       EXPECT job-state OF-TYPE unknown|enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >2,<10
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag COUNT 1
        EXPECT ?job-detailed-status-messages OF-TYPE text IN-GROUP job-attributes-tag
        EXPECT ?number-of-documents OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
        EXPECT ?output-device-assigned OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
-       EXPECT time-at-creation OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE no-value,>-1
-       EXPECT time-at-processing OF-TYPE no-value,integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE no-value,>-1
-       EXPECT time-at-completed OF-TYPE no-value,integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE no-value,>-1
-       EXPECT job-printer-up-time OF-TYPE no-value,integer IN-GROUP job-attributes-tag COUNT 1
-       EXPECT ?date-time-at-creation OF-TYPE no-value,dateTime IN-GROUP job-attributes-tag COUNT 1
-       EXPECT ?date-time-at-processing OF-TYPE no-value,dateTime IN-GROUP job-attributes-tag COUNT 1
-       EXPECT ?date-time-at-completed OF-TYPE no-value,dateTime IN-GROUP job-attributes-tag COUNT 1
+       EXPECT time-at-creation OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
+       EXPECT time-at-processing OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
+       EXPECT time-at-completed OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
+       EXPECT job-printer-up-time OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?date-time-at-creation OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?date-time-at-processing OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?date-time-at-completed OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
        EXPECT ?number-of-intervening-jobs OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
        EXPECT ?job-message-from-operator OF-TYPE text IN-GROUP job-attributes-tag COUNT 1
        EXPECT ?job-k-octets OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
@@ -917,7 +944,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE >0
-       EXPECT job-state OF-TYPE enum COUNT 1 IN-GROUP job-attributes-tag
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE 3,4,5,6,7,8,9
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
@@ -931,6 +958,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
 # Defined by: RFC 2911 section 3.2.2
 {
        SKIP-IF-NOT-DEFINED OPTIONAL_PRINT_URI
+       SKIP-IF-NOT-DEFINED document-uri
 
        NAME "Print-URI with bad URI: Print-URI Operation"
        OPERATION Print-URI
@@ -977,7 +1005,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE >0
-       EXPECT job-state OF-TYPE enum COUNT 1 IN-GROUP job-attributes-tag
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE 3,4,5,6,7,8,9
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
@@ -1031,7 +1059,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE >0
-       EXPECT job-state OF-TYPE enum COUNT 1 IN-GROUP job-attributes-tag
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE 3,4,5,6,7,8,9
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
@@ -1101,7 +1129,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE >0
-       EXPECT job-state OF-TYPE enum COUNT 1 IN-GROUP job-attributes-tag
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE 3,4,5,6,7,8,9
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
@@ -1155,7 +1183,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE >0
-       EXPECT job-state OF-TYPE enum COUNT 1 IN-GROUP job-attributes-tag
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE 3,4,5,6,7,8,9
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
@@ -1166,6 +1194,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
 {
        SKIP-IF-NOT-DEFINED OPTIONAL_CREATE_JOB
        SKIP-IF-NOT-DEFINED OPTIONAL_SEND_URI
+       SKIP-IF-NOT-DEFINED document-uri
        SKIP-PREVIOUS-ERROR yes
 
        NAME "Send-URI with bad URI: Send-URI Operation (bad URI)"
@@ -1232,7 +1261,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE >0
-       EXPECT job-state OF-TYPE enum COUNT 1 IN-GROUP job-attributes-tag
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE 3,4,5,6,7,8,9
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
@@ -1269,7 +1298,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE >0
-       EXPECT job-state OF-TYPE enum COUNT 1 IN-GROUP job-attributes-tag
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE 3,4,5,6,7,8,9
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
@@ -1306,7 +1335,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE >0
-       EXPECT job-state OF-TYPE enum COUNT 1 IN-GROUP job-attributes-tag
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE 3,4,5,6,7,8,9
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
@@ -1341,7 +1370,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE >0
-       EXPECT job-state OF-TYPE enum COUNT 1 IN-GROUP job-attributes-tag
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE 3,4,5,6,7,8,9
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
@@ -1378,7 +1407,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE >0
-       EXPECT job-state OF-TYPE enum COUNT 1 IN-GROUP job-attributes-tag
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE 3,4,5,6,7,8,9
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
@@ -1415,7 +1444,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE >0
-       EXPECT job-state OF-TYPE enum COUNT 1 IN-GROUP job-attributes-tag
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE 3,4,5,6,7,8,9
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
@@ -1452,7 +1481,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE >0
-       EXPECT job-state OF-TYPE enum COUNT 1 IN-GROUP job-attributes-tag
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE 3,4,5,6,7,8,9
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
@@ -1487,7 +1516,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE >0
-       EXPECT job-state OF-TYPE enum COUNT 1 IN-GROUP job-attributes-tag
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE 3,4,5,6,7,8,9
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
@@ -1524,7 +1553,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE >0
-       EXPECT job-state OF-TYPE enum COUNT 1 IN-GROUP job-attributes-tag
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE 3,4,5,6,7,8,9
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
@@ -1561,7 +1590,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE >0
-       EXPECT job-state OF-TYPE enum COUNT 1 IN-GROUP job-attributes-tag
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE 3,4,5,6,7,8,9
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
@@ -1596,7 +1625,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE >0
-       EXPECT job-state OF-TYPE enum COUNT 1 IN-GROUP job-attributes-tag
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE 3,4,5,6,7,8,9
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
@@ -1631,7 +1660,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE >0
-       EXPECT job-state OF-TYPE enum COUNT 1 IN-GROUP job-attributes-tag
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE 3,4,5,6,7,8,9
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
@@ -1666,7 +1695,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE >0
-       EXPECT job-state OF-TYPE enum COUNT 1 IN-GROUP job-attributes-tag
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE 3,4,5,6,7,8,9
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
@@ -1701,7 +1730,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE >0
-       EXPECT job-state OF-TYPE enum COUNT 1 IN-GROUP job-attributes-tag
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE 3,4,5,6,7,8,9
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
@@ -1736,7 +1765,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE >0
-       EXPECT job-state OF-TYPE enum COUNT 1 IN-GROUP job-attributes-tag
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE 3,4,5,6,7,8,9
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
@@ -1775,7 +1804,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE >0
-       EXPECT job-state OF-TYPE enum COUNT 1 IN-GROUP job-attributes-tag
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE 3,4,5,6,7,8,9
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
@@ -1812,7 +1841,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE >0
-       EXPECT job-state OF-TYPE enum COUNT 1 IN-GROUP job-attributes-tag
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE 3,4,5,6,7,8,9
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
@@ -1849,7 +1878,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE >0
-       EXPECT job-state OF-TYPE enum COUNT 1 IN-GROUP job-attributes-tag
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE 3,4,5,6,7,8,9
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
@@ -1886,7 +1915,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE >0
-       EXPECT job-state OF-TYPE enum COUNT 1 IN-GROUP job-attributes-tag
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE 3,4,5,6,7,8,9
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
@@ -1925,7 +1954,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE >0
-       EXPECT job-state OF-TYPE enum COUNT 1 IN-GROUP job-attributes-tag
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE 3,4,5,6,7,8,9
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
@@ -1962,7 +1991,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE >0
-       EXPECT job-state OF-TYPE enum COUNT 1 IN-GROUP job-attributes-tag
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE 3,4,5,6,7,8,9
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
@@ -1999,7 +2028,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE >0
-       EXPECT job-state OF-TYPE enum COUNT 1 IN-GROUP job-attributes-tag
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE 3,4,5,6,7,8,9
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
@@ -2036,7 +2065,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE >0
-       EXPECT job-state OF-TYPE enum COUNT 1 IN-GROUP job-attributes-tag
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE 3,4,5,6,7,8,9
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
@@ -2075,7 +2104,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE >0
-       EXPECT job-state OF-TYPE enum COUNT 1 IN-GROUP job-attributes-tag
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE 3,4,5,6,7,8,9
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
@@ -2112,7 +2141,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE >0
-       EXPECT job-state OF-TYPE enum COUNT 1 IN-GROUP job-attributes-tag
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE 3,4,5,6,7,8,9
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
@@ -2149,7 +2178,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE >0
-       EXPECT job-state OF-TYPE enum COUNT 1 IN-GROUP job-attributes-tag
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE 3,4,5,6,7,8,9
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
@@ -2186,7 +2215,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE >0
-       EXPECT job-state OF-TYPE enum COUNT 1 IN-GROUP job-attributes-tag
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE 3,4,5,6,7,8,9
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
@@ -2223,7 +2252,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE >0
-       EXPECT job-state OF-TYPE enum COUNT 1 IN-GROUP job-attributes-tag
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE 3,4,5,6,7,8,9
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
@@ -2258,7 +2287,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE >0
-       EXPECT job-state OF-TYPE enum COUNT 1 IN-GROUP job-attributes-tag
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
               WITH-VALUE 3,4,5,6,7,8,9
        EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
index 44c3cf2b4c044e8e77473b1174038887f59701e8..3800d52d396074a9e5d45de058d5413da90988be 100644 (file)
@@ -3,7 +3,7 @@
 #
 #   IPP/2.0 test suite.
 #
-#   Copyright 2007-2010 by Apple Inc.
+#   Copyright 2007-2011 by Apple Inc.
 #   Copyright 2001-2006 by Easy Software Products. All rights reserved.
 #
 #   These coded instructions, statements, and computer programs are the
@@ -50,9 +50,10 @@ DEFINE MEDIA_REGEX "/^((custom|na|asme|roc|oe)_[a-z0-9][-a-z0-9]*_([1-9][0-9]*(\
        EXPECT copies-supported OF-TYPE rangeOfInteger IN-GROUP printer-attributes-tag
        EXPECT finishings-default OF-TYPE enum IN-GROUP printer-attributes-tag
        EXPECT finishings-supported OF-TYPE enum IN-GROUP printer-attributes-tag WITH-VALUE 3
-       EXPECT media-default OF-TYPE keyword|name IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "$MEDIA_REGEX"
+       EXPECT media-default OF-TYPE no-value|keyword|name IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "$MEDIA_REGEX"
+       EXPECT ?media-ready OF-TYPE keyword|name IN-GROUP printer-attributes-tag WITH-VALUE "$MEDIA_REGEX"
        EXPECT media-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag WITH-VALUE "$MEDIA_REGEX"
-       EXPECT orientation-requested-default OF-TYPE enum,no-value IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE no-value,3,4,5,6
+       EXPECT orientation-requested-default OF-TYPE no-value|enum IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE 3,4,5,6
        EXPECT orientation-requested-supported OF-TYPE enum IN-GROUP printer-attributes-tag WITH-VALUE 3,4,5,6
        EXPECT output-bin-default OF-TYPE keyword|name IN-GROUP printer-attributes-tag COUNT 1
        EXPECT output-bin-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag
@@ -63,6 +64,40 @@ DEFINE MEDIA_REGEX "/^((custom|na|asme|roc|oe)_[a-z0-9][-a-z0-9]*_([1-9][0-9]*(\
        EXPECT sides-default OF-TYPE keyword IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^(one-sided|two-sided-long-edge|two-sided-short-edge)$$/"
        EXPECT sides-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "/^(one-sided|two-sided-long-edge|two-sided-short-edge)$$/"
 
+       # Optional media-col support
+       EXPECT ?media-col-default OF-TYPE collection IN-GROUP printer-attributes-tag COUNT 1
+       EXPECT ?media-col-ready OF-TYPE collection IN-GROUP printer-attributes-tag
+       EXPECT ?media-col-supported OF-TYPE keyword IN-GROUP printer-attributes-tag
+       EXPECT media-col-supported WITH-VALUE media-back-coating DEFINE-MATCH HAVE_MEDIA_BACK_COATING
+       EXPECT media-col-supported WITH-VALUE media-color DEFINE-MATCH HAVE_MEDIA_COLOR
+       EXPECT media-col-supported WITH-VALUE media-front-coating DEFINE-MATCH HAVE_MEDIA_FRONT_COATING
+       EXPECT media-col-supported WITH-VALUE media-grain DEFINE-MATCH HAVE_MEDIA_GRAIN
+       EXPECT media-col-supported WITH-VALUE media-hole-count DEFINE-MATCH HAVE_MEDIA_HOLE_COUNT
+       EXPECT media-col-supported WITH-VALUE media-info DEFINE-MATCH HAVE_MEDIA_INFO
+       EXPECT media-col-supported WITH-VALUE media-key DEFINE-MATCH HAVE_MEDIA_KEY
+       EXPECT media-col-supported WITH-VALUE media-order-count DEFINE-MATCH HAVE_MEDIA_ORDER_COUNT
+       EXPECT media-col-supported WITH-VALUE media-pre-printed DEFINE-MATCH HAVE_MEDIA_PRE_PRINTED
+       EXPECT media-col-supported WITH-VALUE media-recycled DEFINE-MATCH HAVE_MEDIA_RECYCLED
+       EXPECT media-col-supported WITH-VALUE media-size DEFINE-MATCH HAVE_MEDIA_SIZE
+       EXPECT media-col-supported WITH-VALUE media-tooth DEFINE-MATCH HAVE_MEDIA_TOOTH
+       EXPECT media-col-supported WITH-VALUE media-type DEFINE-MATCH HAVE_MEDIA_TYPE
+       EXPECT media-col-supported WITH-VALUE media-weight-metric DEFINE-MATCH HAVE_MEDIA_WEIGHT_METRIC
+
+       EXPECT media-back-coating-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag IF-DEFINED HAVE_MEDIA_BACK_COATING
+       EXPECT media-color-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag IF-DEFINED HAVE_MEDIA_COLOR
+       EXPECT media-front-coating-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag IF-DEFINED HAVE_MEDIA_FRONT_COATING
+       EXPECT media-grain-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag IF-DEFINED HAVE_MEDIA_GRAIN
+       EXPECT media-hole-count-supported OF-TYPE rangeOfInteger IN-GROUP printer-attributes-tag WITH-VALUE >-1 IF-DEFINED HAVE_MEDIA_HOLE_COUNT
+       EXPECT media-info-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag IF-DEFINED HAVE_MEDIA_INFO
+       EXPECT media-key-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag IF-DEFINED HAVE_MEDIA_KEY
+       EXPECT media-order-count-supported OF-TYPE rangeOfInteger IN-GROUP printer-attributes-tag WITH-VALUE >0 IF-DEFINED HAVE_MEDIA_ORDER_COUNT
+       EXPECT media-pre-printed-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag IF-DEFINED HAVE_MEDIA_PRE_PRINTED
+       EXPECT media-recycled-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag IF-DEFINED HAVE_MEDIA_RECYCLED
+       EXPECT media-size-supported OF-TYPE collection IN-GROUP printer-attributes-tag IF-DEFINED HAVE_MEDIA_SIZE
+       EXPECT media-tooth-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag IF-DEFINED HAVE_MEDIA_TOOTH
+       EXPECT media-type-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag IF-DEFINED HAVE_MEDIA_TYPE
+       EXPECT media-weight-metric-supported OF-TYPE rangeOfInteger IN-GROUP printer-attributes-tag WITH-VALUE >-1 IF-DEFINED HAVE_MEDIA_WEIGHT_METRIC
+
        # Printer description attributes
        EXPECT color-supported OF-TYPE boolean IN-GROUP printer-attributes-tag COUNT 1
        EXPECT pages-per-minute OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1
index 935a62da91d45a80266029c2bb717b8523b33a60..3042ec2474ead08d0fe4cf8349152066d13af7c6 100644 (file)
@@ -46,6 +46,8 @@ INCLUDE "ipp-2.1.test"
        # Printer description attributes
        EXPECT job-creation-attributes-supported OF-TYPE keyword IN-GROUP printer-attributes-tag
        EXPECT job-ids-supported OF-TYPE boolean IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE 1
+       EXPECT media-col-ready
+       EXPECT media-ready
        EXPECT multiple-document-jobs-supported OF-TYPE boolean IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE 1
        EXPECT printer-alert OF-TYPE octetString IN-GROUP printer-attributes-tag
        EXPECT printer-alert-description OF-TYPE text IN-GROUP printer-attributes-tag SAME-COUNT-AS printer-alert
index dbe9cbd939c8927f1ebd7c13e2a703dafca19269..23b4ed9701b4f63210ce68db2ee5e21efc5a7832 100644 (file)
@@ -265,6 +265,7 @@ static _ipp_job_t   *create_job(_ipp_client_t *client);
 static int             create_listener(int family, int *port);
 static ipp_t           *create_media_col(const char *media, const char *type,
                                          int width, int length, int margins);
+static ipp_t           *create_media_size(int width, int length);
 static _ipp_printer_t  *create_printer(const char *servername,
                                        const char *name, const char *location,
                                        const char *make, const char *model,
@@ -803,7 +804,7 @@ copy_job_attributes(
     _ipp_job_t    *job,                        /* I - Job */
     cups_array_t  *ra)                 /* I - requested-attributes */
 {
-  copy_attributes(client->response, job->attrs, ra, IPP_TAG_ZERO, 0);
+  copy_attributes(client->response, job->attrs, ra, IPP_TAG_JOB, 0);
 
   if (!ra || cupsArrayFind(ra, "job-printer-up-time"))
     ippAddInteger(client->response, IPP_TAG_JOB, IPP_TAG_INTEGER,
@@ -1124,15 +1125,11 @@ create_media_col(const char *media,     /* I - Media name */
                 int        margins)    /* I - Value for margins */
 {
   ipp_t        *media_col = ippNew(),          /* media-col value */
-       *media_size = ippNew();         /* media-size value */
+       *media_size = create_media_size(width, length);
+                                       /* media-size value */
   char media_key[256];                 /* media-key value */
 
 
-  ippAddInteger(media_size, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "x-dimension",
-                width);
-  ippAddInteger(media_size, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "y-dimension",
-                length);
-
   snprintf(media_key, sizeof(media_key), "%s_%s%s", media, type,
            margins == 0 ? "_borderless" : "");
 
@@ -1156,6 +1153,26 @@ create_media_col(const char *media,      /* I - Media name */
 }
 
 
+/*
+ * 'create_media_size()' - Create a media-size value.
+ */
+
+static ipp_t *                         /* O - media-col collection */
+create_media_size(int width,           /* I - x-dimension in 2540ths */
+                 int length)           /* I - y-dimension in 2540ths */
+{
+  ipp_t        *media_size = ippNew();         /* media-size value */
+
+
+  ippAddInteger(media_size, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "x-dimension",
+                width);
+  ippAddInteger(media_size, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "y-dimension",
+                length);
+
+  return (media_size);
+}
+
+
 /*
  * 'create_printer()' - Create, register, and listen for connections to a
  *                      printer object.
@@ -1192,8 +1209,10 @@ create_printer(const char *servername,   /* I - Server hostname (NULL for default)
                        *ptr;           /* Pointer into string */
   const char           *prefix;        /* Prefix string */
   int                  num_database;   /* Number of database values */
-  ipp_attribute_t      *media_col_database;
+  ipp_attribute_t      *media_col_database,
                                        /* media-col-database value */
+                       *media_size_supported;
+                                       /* media-size-supported value */
   ipp_t                        *media_col_default;
                                        /* media-col-default value */
   ipp_value_t          *media_col_value;
@@ -1275,9 +1294,10 @@ create_printer(const char *servername,   /* I - Server hostname (NULL for default)
     IPP_QUALITY_NORMAL,
     IPP_QUALITY_HIGH
   };
-  static const char * const referenced_uri_scheme_supported[] =
-  {                                    /* referenced-uri-scheme-supported */
+  static const char * const reference_uri_schemes_supported[] =
+  {                                    /* reference-uri-schemes-supported */
     "file",
+    "ftp",
     "http"
 #ifdef HAVE_SSL
     , "https"
@@ -1624,6 +1644,18 @@ create_printer(const char *servername,   /* I - Server hostname (NULL for default)
                (int)(sizeof(media_supported) / sizeof(media_supported[0])),
                NULL, media_supported);
 
+  /* media-size-supported */
+  media_size_supported = ippAddCollections(printer->attrs, IPP_TAG_PRINTER,
+                                           "media-size-supported",
+                                           (int)(sizeof(media_col_sizes) /
+                                                 sizeof(media_col_sizes[0])),
+                                           NULL);
+  for (i = 0;
+       i < (int)(sizeof(media_col_sizes) / sizeof(media_col_sizes[0]));
+       i ++)
+    media_size_supported->values[i].collection =
+        create_media_size(media_col_sizes[i][0], media_col_sizes[i][1]);
+
   /* media-top-margin-supported */
   ippAddIntegers(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
                  "media-top-margin-supported",
@@ -1631,6 +1663,13 @@ create_printer(const char *servername,   /* I - Server hostname (NULL for default)
                       sizeof(media_xxx_margin_supported[0])),
                 media_xxx_margin_supported);
 
+  /* media-type-supported */
+  ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
+                "media-type-supported",
+               (int)(sizeof(media_type_supported) /
+                     sizeof(media_type_supported[0])),
+               NULL, media_type_supported);
+
   /* multiple-document-handling-supported */
   ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
                 "multiple-document-handling-supported",
@@ -1742,13 +1781,13 @@ create_printer(const char *servername,  /* I - Server hostname (NULL for default)
   ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI,
                "printer-uri-supported", NULL, uri);
 
-  /* referenced-uri-scheme-supported */
+  /* reference-uri-scheme-supported */
   ippAddStrings(printer->attrs, IPP_TAG_PRINTER,
                 IPP_TAG_URISCHEME | IPP_TAG_COPY,
-                "referenced-uri-scheme-supported",
-                (int)(sizeof(referenced_uri_scheme_supported) /
-                      sizeof(referenced_uri_scheme_supported[0])),
-                NULL, referenced_uri_scheme_supported);
+                "reference-uri-schemes-supported",
+                (int)(sizeof(reference_uri_schemes_supported) /
+                      sizeof(reference_uri_schemes_supported[0])),
+                NULL, reference_uri_schemes_supported);
 
   /* sides-default */
   ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
index de47d8fe5bddc0524315a25920275a712d595ca1..59b83253dde911b2072cdfd7061381ddb8003da2 100644 (file)
@@ -734,6 +734,7 @@ do_tests(_cups_vars_t *vars,                /* I - Variables */
   int          num_displayed = 0;      /* Number of displayed attributes */
   char         *displayed[200];        /* Displayed attributes */
   size_t       widths[200];            /* Width of columns */
+  cups_array_t *a;                     /* Duplicate attribute array */
 
 
  /*
@@ -2108,7 +2109,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
          print_attr(attrptr, NULL);
       }
 
-      printf("    %-69.69s [", name);
+      printf("    %-68.68s [", name);
       fflush(stdout);
     }
 
@@ -2314,14 +2315,50 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
              strlen(attrptr->values[0].string.text) > 1023)))
          prev_pass = pass = 0;
 
+       a = cupsArrayNew((cups_array_func_t)strcmp, NULL);
+
        for (attrptr = response->attrs, group = attrptr->group_tag;
             attrptr;
             attrptr = attrptr->next)
        {
-         if (attrptr->group_tag < group && attrptr->group_tag != IPP_TAG_ZERO)
+         if (attrptr->group_tag != group)
          {
-           prev_pass = pass = 0;
-           break;
+           cupsArrayClear(a);
+
+            switch (attrptr->group_tag)
+            {
+              case IPP_TAG_OPERATION :
+                  prev_pass = pass = 0;
+                  break;
+
+              case IPP_TAG_UNSUPPORTED_GROUP :
+                  if (group != IPP_TAG_OPERATION)
+                   prev_pass = pass = 0;
+                  break;
+
+              case IPP_TAG_JOB :
+              case IPP_TAG_PRINTER :
+                  if (group != IPP_TAG_OPERATION &&
+                      group != IPP_TAG_UNSUPPORTED_GROUP)
+                   prev_pass = pass = 0;
+                  break;
+
+              case IPP_TAG_SUBSCRIPTION :
+                  if (group > attrptr->group_tag &&
+                      group != IPP_TAG_DOCUMENT)
+                   prev_pass = pass = 0;
+                  break;
+
+              default :
+                  if (group > attrptr->group_tag)
+                   prev_pass = pass = 0;
+                  break;
+            }
+
+            if (!pass)
+             break;
+
+           group = attrptr->group_tag;
          }
 
          if (!validate_attr(attrptr, 0))
@@ -2329,8 +2366,21 @@ do_tests(_cups_vars_t *vars,             /* I - Variables */
            prev_pass = pass = 0;
            break;
          }
+
+          if (attrptr->name)
+          {
+            if (cupsArrayFind(a, attrptr->name))
+            {
+              prev_pass = pass = 0;
+              break;
+            }
+
+            cupsArrayAdd(a, attrptr->name);
+          }
        }
 
+        cupsArrayDelete(a);
+
        for (i = 0; i < num_statuses; i ++)
        {
          if (statuses[i].if_defined &&
@@ -2354,96 +2404,94 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
 
        if (i == num_statuses && num_statuses > 0)
          prev_pass = pass = 0;
-       else
+
+       for (i = num_expects, expect = expects; i > 0; i --, expect ++)
        {
-         for (i = num_expects, expect = expects; i > 0; i --, expect ++)
+         if (expect->if_defined && !get_variable(vars, expect->if_defined))
+           continue;
+
+         if (expect->if_not_defined &&
+             get_variable(vars, expect->if_not_defined))
+           continue;
+
+         found = ippFindAttribute(response, expect->name, IPP_TAG_ZERO);
+
+         if ((found && expect->not_expect) ||
+             (!found && !(expect->not_expect || expect->optional)) ||
+             (found && !expect_matches(expect, found->value_tag)) ||
+             (found && expect->in_group &&
+              found->group_tag != expect->in_group))
          {
-           if (expect->if_defined && !get_variable(vars, expect->if_defined))
-             continue;
+           if (expect->define_no_match)
+             set_variable(vars, expect->define_no_match, "1");
+           else if (!expect->define_match && !expect->define_value)
+             prev_pass = pass = 0;
 
-           if (expect->if_not_defined &&
-               get_variable(vars, expect->if_not_defined))
-             continue;
+           if (expect->repeat_no_match)
+             repeat_test = 1;
 
-           found = ippFindAttribute(response, expect->name, IPP_TAG_ZERO);
+           continue;
+         }
 
-           if ((found && expect->not_expect) ||
-               (!found && !(expect->not_expect || expect->optional)) ||
-               (found && !expect_matches(expect, found->value_tag)) ||
-               (found && expect->in_group &&
-                found->group_tag != expect->in_group))
-           {
-             if (expect->define_no_match)
-               set_variable(vars, expect->define_no_match, "1");
-             else if (!expect->define_match)
-               prev_pass = pass = 0;
+         if (found)
+           _ippAttrString(found, buffer, sizeof(buffer));
 
-              if (expect->repeat_no_match)
-                repeat_test = 1;
+         if (found &&
+             !with_value(expect->with_value, expect->with_regex, found, 0,
+                         buffer, sizeof(buffer)))
+         {
+           if (expect->define_no_match)
+             set_variable(vars, expect->define_no_match, "1");
+           else if (!expect->define_match && !expect->define_value)
+             prev_pass = pass = 0;
 
-             continue;
-           }
+           if (expect->repeat_no_match)
+             repeat_test = 1;
 
-           if (found)
-             _ippAttrString(found, buffer, sizeof(buffer));
+           continue;
+         }
 
-           if (found &&
-               !with_value(expect->with_value, expect->with_regex, found, 0,
-                           buffer, sizeof(buffer)))
-           {
-             if (expect->define_no_match)
-               set_variable(vars, expect->define_no_match, "1");
-             else if (!expect->define_match && !expect->define_value)
-               prev_pass = pass = 0;
+         if (found && expect->count > 0 &&
+             found->num_values != expect->count)
+         {
+           if (expect->define_no_match)
+             set_variable(vars, expect->define_no_match, "1");
+           else if (!expect->define_match && !expect->define_value)
+             prev_pass = pass = 0;
 
-              if (expect->repeat_no_match)
-                repeat_test = 1;
+           if (expect->repeat_no_match)
+             repeat_test = 1;
 
-             continue;
-           }
+           continue;
+         }
+
+         if (found && expect->same_count_as)
+         {
+           attrptr = ippFindAttribute(response, expect->same_count_as,
+                                      IPP_TAG_ZERO);
 
-           if (found && expect->count > 0 &&
-               found->num_values != expect->count)
+           if (!attrptr || attrptr->num_values != found->num_values)
            {
              if (expect->define_no_match)
                set_variable(vars, expect->define_no_match, "1");
              else if (!expect->define_match && !expect->define_value)
                prev_pass = pass = 0;
 
-              if (expect->repeat_no_match)
-                repeat_test = 1;
+             if (expect->repeat_no_match)
+               repeat_test = 1;
 
              continue;
            }
+         }
 
-           if (found && expect->same_count_as)
-           {
-             attrptr = ippFindAttribute(response, expect->same_count_as,
-                                        IPP_TAG_ZERO);
-
-             if (!attrptr || attrptr->num_values != found->num_values)
-             {
-               if (expect->define_no_match)
-                 set_variable(vars, expect->define_no_match, "1");
-               else if (!expect->define_match && !expect->define_value)
-                 prev_pass = pass = 0;
-
-               if (expect->repeat_no_match)
-                 repeat_test = 1;
-
-               continue;
-             }
-           }
-
-           if (found && expect->define_match)
-             set_variable(vars, expect->define_match, "1");
+         if (found && expect->define_match)
+           set_variable(vars, expect->define_match, "1");
 
-           if (found && expect->define_value)
-             set_variable(vars, expect->define_value, buffer);
+         if (found && expect->define_value)
+           set_variable(vars, expect->define_value, buffer);
 
-            if (found && expect->repeat_match)
-             repeat_test = 1;
-         }
+         if (found && expect->repeat_match)
+           repeat_test = 1;
        }
       }
 
@@ -2505,70 +2553,47 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
     else if (!prev_pass)
       fprintf(stderr, "%s\n", cupsLastErrorString());
 
-    if (prev_pass && Output != _CUPS_OUTPUT_PLIST &&
-        Output != _CUPS_OUTPUT_QUIET && !Verbosity && num_displayed > 0)
+    if (prev_pass && Output >= _CUPS_OUTPUT_LIST && !Verbosity &&
+        num_displayed > 0)
     {
-      if (Output >= _CUPS_OUTPUT_LIST)
+      size_t   width;                  /* Length of value */
+
+      for (i = 0; i < num_displayed; i ++)
       {
-       size_t  width;                  /* Length of value */
+       widths[i] = strlen(displayed[i]);
 
+       for (attrptr = ippFindAttribute(response, displayed[i], IPP_TAG_ZERO);
+            attrptr;
+            attrptr = ippFindNextAttribute(response, displayed[i],
+                                           IPP_TAG_ZERO))
+       {
+         width = _ippAttrString(attrptr, NULL, 0);
+         if (width > widths[i])
+           widths[i] = width;
+       }
+      }
 
-        for (i = 0; i < num_displayed; i ++)
-        {
-          widths[i] = strlen(displayed[i]);
+      if (Output == _CUPS_OUTPUT_CSV)
+       print_csv(NULL, num_displayed, displayed, widths);
+      else
+       print_line(NULL, num_displayed, displayed, widths);
 
-          for (attrptr = ippFindAttribute(response, displayed[i], IPP_TAG_ZERO);
-               attrptr;
-               attrptr = ippFindNextAttribute(response, displayed[i],
-                                              IPP_TAG_ZERO))
-          {
-            width = _ippAttrString(attrptr, NULL, 0);
-            if (width > widths[i])
-              widths[i] = width;
-          }
-        }
+      attrptr = response->attrs;
 
-        if (Output == _CUPS_OUTPUT_CSV)
-         print_csv(NULL, num_displayed, displayed, widths);
-       else
-         print_line(NULL, num_displayed, displayed, widths);
+      while (attrptr)
+      {
+       while (attrptr && attrptr->group_tag <= IPP_TAG_OPERATION)
+         attrptr = attrptr->next;
 
-        attrptr = response->attrs;
+       if (attrptr)
+       {
+         if (Output == _CUPS_OUTPUT_CSV)
+           print_csv(attrptr, num_displayed, displayed, widths);
+         else
+           print_line(attrptr, num_displayed, displayed, widths);
 
-        while (attrptr)
-        {
-         while (attrptr && attrptr->group_tag <= IPP_TAG_OPERATION)
+         while (attrptr && attrptr->group_tag > IPP_TAG_OPERATION)
            attrptr = attrptr->next;
-
-          if (attrptr)
-          {
-            if (Output == _CUPS_OUTPUT_CSV)
-             print_csv(attrptr, num_displayed, displayed, widths);
-           else
-             print_line(attrptr, num_displayed, displayed, widths);
-
-            while (attrptr && attrptr->group_tag > IPP_TAG_OPERATION)
-              attrptr = attrptr->next;
-          }
-        }
-      }
-      else
-      {
-       for (attrptr = response->attrs;
-            attrptr != NULL;
-            attrptr = attrptr->next)
-       {
-         if (attrptr->name)
-         {
-           for (i = 0; i < num_displayed; i ++)
-           {
-             if (!strcmp(displayed[i], attrptr->name))
-             {
-               print_attr(attrptr, NULL);
-               break;
-             }
-           }
-         }
        }
       }
     }
@@ -2695,18 +2720,71 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
                             (int)strlen(attrptr->values[0].string.text));
         }
 
+       a = cupsArrayNew((cups_array_func_t)strcmp, NULL);
+
        for (attrptr = response->attrs, group = attrptr->group_tag;
             attrptr;
             attrptr = attrptr->next)
        {
-         if (attrptr->group_tag < group && attrptr->group_tag != IPP_TAG_ZERO)
-           print_test_error("Attribute groups out of order (%s < %s)",
-                            ippTagString(attrptr->group_tag),
-                            ippTagString(group));
+         if (attrptr->group_tag != group)
+         {
+           cupsArrayClear(a);
+
+            switch (attrptr->group_tag)
+            {
+              case IPP_TAG_OPERATION :
+                  prev_pass = pass = 0;
+                  break;
+
+              case IPP_TAG_UNSUPPORTED_GROUP :
+                  if (group != IPP_TAG_OPERATION)
+                   print_test_error("Attribute groups out of order (%s < %s)",
+                                    ippTagString(attrptr->group_tag),
+                                    ippTagString(group));
+                  break;
+
+              case IPP_TAG_JOB :
+              case IPP_TAG_PRINTER :
+                  if (group != IPP_TAG_OPERATION &&
+                      group != IPP_TAG_UNSUPPORTED_GROUP)
+                   print_test_error("Attribute groups out of order (%s < %s)",
+                                    ippTagString(attrptr->group_tag),
+                                    ippTagString(group));
+                  break;
+
+              case IPP_TAG_SUBSCRIPTION :
+                  if (group > attrptr->group_tag &&
+                      group != IPP_TAG_DOCUMENT)
+                   print_test_error("Attribute groups out of order (%s < %s)",
+                                    ippTagString(attrptr->group_tag),
+                                    ippTagString(group));
+                  break;
+
+              default :
+                  if (group > attrptr->group_tag)
+                   print_test_error("Attribute groups out of order (%s < %s)",
+                                    ippTagString(attrptr->group_tag),
+                                    ippTagString(group));
+                  break;
+            }
+
+           group = attrptr->group_tag;
+         }
 
          validate_attr(attrptr, 1);
+
+          if (attrptr->name)
+          {
+            if (cupsArrayFind(a, attrptr->name))
+              print_test_error("Duplicate \"%s\" attribute in %s group",
+                               attrptr->name, ippTagString(group));
+
+            cupsArrayAdd(a, attrptr->name);
+          }
        }
 
+        cupsArrayDelete(a);
+
        for (i = 0; i < num_statuses; i ++)
        {
          if (statuses[i].if_defined &&
@@ -2817,11 +2895,34 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
        puts("</array>");
     }
 
+    if (num_displayed > 0 && !Verbosity &&
+        (Output == _CUPS_OUTPUT_TEST || Output == _CUPS_OUTPUT_PLIST))
+    {
+      for (attrptr = response->attrs;
+          attrptr != NULL;
+          attrptr = attrptr->next)
+      {
+       if (attrptr->name)
+       {
+         for (i = 0; i < num_displayed; i ++)
+         {
+           if (!strcmp(displayed[i], attrptr->name))
+           {
+             print_attr(attrptr, NULL);
+             break;
+           }
+         }
+       }
+      }
+    }
+
     skip_error:
 
     if (Output == _CUPS_OUTPUT_PLIST)
       puts("</dict>");
 
+    fflush(stdout);
+
     ippDelete(response);
     response = NULL;
 
@@ -5056,8 +5157,6 @@ with_value(char            *value,        /* I - Value string */
 
 
           valptr = value;
-         if (!strncmp(valptr, "no-value,", 9))
-           valptr += 9;
 
          while (isspace(*valptr & 255) || isdigit(*valptr & 255) ||
                 *valptr == '-' || *valptr == ',' || *valptr == '<' ||
@@ -5122,8 +5221,6 @@ with_value(char            *value,        /* I - Value string */
 
 
           valptr = value;
-         if (!strncmp(valptr, "no-value,", 9))
-           valptr += 9;
 
          while (isspace(*valptr & 255) || isdigit(*valptr & 255) ||
                 *valptr == '-' || *valptr == ',' || *valptr == '<' ||
@@ -5207,13 +5304,8 @@ with_value(char            *value,       /* I - Value string */
        break;
 
     case IPP_TAG_NOVALUE :
-        if (!strcmp(value, "no-value") || !strncmp(value, "no-value,", 9))
-        {
-          strlcpy(matchbuf, "no-value", matchlen);
-          return (1);
-        }
-        else
-          return (0);
+    case IPP_TAG_UNKNOWN :
+       return (1);
 
     case IPP_TAG_CHARSET :
     case IPP_TAG_KEYWORD :
index 5cc40ed70109a94641f1e226fe9ad640b6b78c7c..66174ef801db21a2a74f295447b3be658a3b5b6c 100644 (file)
                7263EE3913330EC500BA4D44 /* libldap.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libldap.dylib; path = SDKs/MacOSX10.6.sdk/usr/lib/libldap.dylib; sourceTree = DEVELOPER_DIR; };
                726AD6F7135E88F0002C930D /* ippserver */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ippserver; sourceTree = BUILT_PRODUCTS_DIR; };
                726AD701135E8A90002C930D /* ippserver.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ippserver.c; path = ../test/ippserver.c; sourceTree = "<group>"; };
-               7271881613746EA8001A2036 /* bannertops.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = bannertops.c; path = ../filter/bannertops.c; sourceTree = "<group>"; };
                7271881713746EA8001A2036 /* commandtops.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = commandtops.c; path = ../filter/commandtops.c; sourceTree = "<group>"; };
                7271881813746EA8001A2036 /* common.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = common.c; path = ../filter/common.c; sourceTree = "<group>"; };
                7271881913746EA8001A2036 /* common.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = common.h; path = ../filter/common.h; sourceTree = "<group>"; };
                7271881A13746EA8001A2036 /* gziptoany.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = gziptoany.c; path = ../filter/gziptoany.c; sourceTree = "<group>"; };
-               7271881B13746EA8001A2036 /* imagetops.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = imagetops.c; path = ../filter/imagetops.c; sourceTree = "<group>"; };
-               7271881C13746EA8001A2036 /* imagetoraster.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = imagetoraster.c; path = ../filter/imagetoraster.c; sourceTree = "<group>"; };
-               7271881D13746EA8001A2036 /* pdftops.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = pdftops.c; path = ../filter/pdftops.c; sourceTree = "<group>"; };
-               7271881E13746EA8001A2036 /* pstext.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = pstext.c; path = ../filter/pstext.c; sourceTree = "<group>"; };
-               7271881F13746EA8001A2036 /* pstext.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = pstext.h; path = ../filter/pstext.h; sourceTree = "<group>"; };
                7271882013746EA8001A2036 /* pstops.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = pstops.c; path = ../filter/pstops.c; sourceTree = "<group>"; };
                7271882113746EA8001A2036 /* rastertoepson.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = rastertoepson.c; path = ../filter/rastertoepson.c; sourceTree = "<group>"; };
                7271882213746EA8001A2036 /* rastertohp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = rastertohp.c; path = ../filter/rastertohp.c; sourceTree = "<group>"; };
                7271882313746EA8001A2036 /* rastertolabel.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = rastertolabel.c; path = ../filter/rastertolabel.c; sourceTree = "<group>"; };
-               7271882413746EA8001A2036 /* textcommon.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = textcommon.c; path = ../filter/textcommon.c; sourceTree = "<group>"; };
-               7271882513746EA8001A2036 /* textcommon.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = textcommon.h; path = ../filter/textcommon.h; sourceTree = "<group>"; };
-               7271882613746EA8001A2036 /* texttops.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = texttops.c; path = ../filter/texttops.c; sourceTree = "<group>"; };
-               7271882B137498E4001A2036 /* image-bmp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "image-bmp.c"; path = "../filter/image-bmp.c"; sourceTree = "<group>"; };
-               7271882C137498E4001A2036 /* image-colorspace.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "image-colorspace.c"; path = "../filter/image-colorspace.c"; sourceTree = "<group>"; };
-               7271882D137498E4001A2036 /* image-gif.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "image-gif.c"; path = "../filter/image-gif.c"; sourceTree = "<group>"; };
-               7271882E137498E4001A2036 /* image-jpeg.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "image-jpeg.c"; path = "../filter/image-jpeg.c"; sourceTree = "<group>"; };
-               7271882F137498E4001A2036 /* image-photocd.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "image-photocd.c"; path = "../filter/image-photocd.c"; sourceTree = "<group>"; };
-               72718830137498E4001A2036 /* image-pix.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "image-pix.c"; path = "../filter/image-pix.c"; sourceTree = "<group>"; };
-               72718831137498E4001A2036 /* image-png.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "image-png.c"; path = "../filter/image-png.c"; sourceTree = "<group>"; };
-               72718832137498E4001A2036 /* image-pnm.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "image-pnm.c"; path = "../filter/image-pnm.c"; sourceTree = "<group>"; };
-               72718833137498E4001A2036 /* image-private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "image-private.h"; path = "../filter/image-private.h"; sourceTree = "<group>"; };
-               72718834137498E4001A2036 /* image-sgi.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "image-sgi.c"; path = "../filter/image-sgi.c"; sourceTree = "<group>"; };
-               72718835137498E4001A2036 /* image-sgi.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "image-sgi.h"; path = "../filter/image-sgi.h"; sourceTree = "<group>"; };
-               72718836137498E4001A2036 /* image-sgilib.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "image-sgilib.c"; path = "../filter/image-sgilib.c"; sourceTree = "<group>"; };
-               72718837137498E4001A2036 /* image-sun.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "image-sun.c"; path = "../filter/image-sun.c"; sourceTree = "<group>"; };
-               72718838137498E4001A2036 /* image-tiff.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "image-tiff.c"; path = "../filter/image-tiff.c"; sourceTree = "<group>"; };
-               72718839137498E4001A2036 /* image-zoom.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "image-zoom.c"; path = "../filter/image-zoom.c"; sourceTree = "<group>"; };
-               7271883A137498E4001A2036 /* image.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = image.c; path = ../filter/image.c; sourceTree = "<group>"; };
-               7271883B137498E4001A2036 /* image.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = image.h; path = ../filter/image.h; sourceTree = "<group>"; };
                7271883C1374AB14001A2036 /* mime-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "mime-private.h"; path = "../scheduler/mime-private.h"; sourceTree = "<group>"; };
                72C16CB8137B195D007E4BF4 /* file.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = file.c; path = ../scheduler/file.c; sourceTree = SOURCE_ROOT; };
                72F75A4C1336F31B004BB496 /* libcups_static.a */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libcups_static.a; sourceTree = BUILT_PRODUCTS_DIR; };
                7258EADC134594A8009286F1 /* filters */ = {
                        isa = PBXGroup;
                        children = (
-                               7271881613746EA8001A2036 /* bannertops.c */,
                                7271881713746EA8001A2036 /* commandtops.c */,
                                7271881813746EA8001A2036 /* common.c */,
                                7271881913746EA8001A2036 /* common.h */,
                                7271881A13746EA8001A2036 /* gziptoany.c */,
-                               7271881B13746EA8001A2036 /* imagetops.c */,
-                               7271881C13746EA8001A2036 /* imagetoraster.c */,
-                               7271881D13746EA8001A2036 /* pdftops.c */,
-                               7271881E13746EA8001A2036 /* pstext.c */,
-                               7271881F13746EA8001A2036 /* pstext.h */,
                                7271882013746EA8001A2036 /* pstops.c */,
                                7271882113746EA8001A2036 /* rastertoepson.c */,
                                7271882213746EA8001A2036 /* rastertohp.c */,
                                7271882313746EA8001A2036 /* rastertolabel.c */,
                                7258EAEC134594EB009286F1 /* rastertopwg.c */,
-                               7271882413746EA8001A2036 /* textcommon.c */,
-                               7271882513746EA8001A2036 /* textcommon.h */,
-                               7271882613746EA8001A2036 /* texttops.c */,
                        );
                        name = filters;
                        sourceTree = "<group>";
                };
-               7271882A1374988C001A2036 /* Unused */ = {
-                       isa = PBXGroup;
-                       children = (
-                               7271882B137498E4001A2036 /* image-bmp.c */,
-                               7271882C137498E4001A2036 /* image-colorspace.c */,
-                               7271882D137498E4001A2036 /* image-gif.c */,
-                               7271882E137498E4001A2036 /* image-jpeg.c */,
-                               7271882F137498E4001A2036 /* image-photocd.c */,
-                               72718830137498E4001A2036 /* image-pix.c */,
-                               72718831137498E4001A2036 /* image-png.c */,
-                               72718832137498E4001A2036 /* image-pnm.c */,
-                               72718833137498E4001A2036 /* image-private.h */,
-                               72718834137498E4001A2036 /* image-sgi.c */,
-                               72718835137498E4001A2036 /* image-sgi.h */,
-                               72718836137498E4001A2036 /* image-sgilib.c */,
-                               72718837137498E4001A2036 /* image-sun.c */,
-                               72718838137498E4001A2036 /* image-tiff.c */,
-                               72718839137498E4001A2036 /* image-zoom.c */,
-                               7271883A137498E4001A2036 /* image.c */,
-                               7271883B137498E4001A2036 /* image.h */,
-                       );
-                       name = Unused;
-                       sourceTree = "<group>";
-               };
                72BF96351333042100B1EAD7 = {
                        isa = PBXGroup;
                        children = (
                72F75A681336FA42004BB496 /* libcupsimage */ = {
                        isa = PBXGroup;
                        children = (
-                               7271882A1374988C001A2036 /* Unused */,
                                72F75A691336FA8A004BB496 /* error.c */,
                                72F75A6A1336FA8A004BB496 /* interpret.c */,
                                72F75A6B1336FA8A004BB496 /* raster.c */,
                72BF96371333042100B1EAD7 /* Project object */ = {
                        isa = PBXProject;
                        attributes = {
-                               LastUpgradeCheck = 0410;
+                               LastUpgradeCheck = 0420;
                                ORGANIZATIONNAME = "Apple Inc.";
                        };
                        buildConfigurationList = 72BF963A1333042100B1EAD7 /* Build configuration list for PBXProject "CUPS" */;