]> git.ipfire.org Git - thirdparty/cups.git/commitdiff
Save work on destination API unit test program.
authormsweet <msweet@a1ca3aef-8c08-0410-bb20-df032aa958be>
Fri, 16 May 2014 21:54:22 +0000 (21:54 +0000)
committermsweet <msweet@a1ca3aef-8c08-0410-bb20-df032aa958be>
Fri, 16 May 2014 21:54:22 +0000 (21:54 +0000)
Add cupsGetDestWithURI API.

Add cupsLocalizeDestMedia API.

git-svn-id: svn+ssh://src.apple.com/svn/cups/cups.org/trunk@11884 a1ca3aef-8c08-0410-bb20-df032aa958be

cups/Dependencies
cups/Makefile
cups/cups.h
cups/dest-localization.c
cups/dest.c
cups/testdest.c [new file with mode: 0644]
test/ipptool.c
xcode/CUPS.xcodeproj/project.pbxproj

index ad96cd483b0f944965d8e7ee5350cbf4f359bfef..54bd08c7c629e7f00a9c979f519eeb96d8343626 100644 (file)
@@ -114,7 +114,7 @@ http.o: http.c cups-private.h string-private.h ../config.h \
   ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
   md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
   ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
-  thread-private.h tls-darwin.c
+  thread-private.h
 http-addr.o: http-addr.c cups-private.h string-private.h ../config.h \
   debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
   ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
@@ -237,6 +237,11 @@ thread.o: thread.c cups-private.h string-private.h ../config.h \
   md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
   ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
   thread-private.h
+tls.o: tls.c cups-private.h string-private.h ../config.h debug-private.h \
+  ../cups/versioning.h array-private.h ../cups/array.h ipp-private.h \
+  ../cups/ipp.h http.h http-private.h ../cups/language.h md5-private.h \
+  language-private.h ../cups/transcode.h pwg-private.h ../cups/cups.h \
+  file.h pwg.h ppd-private.h ../cups/ppd.h thread-private.h tls-darwin.c
 transcode.o: transcode.c cups-private.h string-private.h ../config.h \
   debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
   ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
@@ -263,6 +268,8 @@ testconflicts.o: testconflicts.c cups.h file.h versioning.h ipp.h http.h \
   array.h language.h pwg.h ppd.h string-private.h ../config.h
 testcups.o: testcups.c string-private.h ../config.h cups.h file.h \
   versioning.h ipp.h http.h array.h language.h pwg.h ppd.h
+testdest.o: testdest.c cups.h file.h versioning.h ipp.h http.h array.h \
+  language.h pwg.h
 testfile.o: testfile.c string-private.h ../config.h debug-private.h \
   ../cups/versioning.h file.h
 testhttp.o: testhttp.c cups-private.h string-private.h ../config.h \
index 8af9d9d3fb4f020f3f35c89055e82730a5ab3b5d..94bec6836aff981895eecd5ee8df3907876aa3a2 100644 (file)
@@ -85,6 +85,7 @@ TESTOBJS      = \
                testarray.o \
                testconflicts.o \
                testcups.o \
+               testdest.o \
                testfile.o \
                testhttp.o \
                testi18n.o \
@@ -151,6 +152,7 @@ UNITTARGETS =       \
                testcache \
                testconflicts \
                testcups \
+               testdest \
                testfile \
                testhttp \
                testi18n \
@@ -404,6 +406,16 @@ testcups:  testcups.o $(LIBCUPSSTATIC)
                $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
 
 
+#
+# testdest (dependency on static CUPS library is intentional)
+#
+
+testdest:      testdest.o $(LIBCUPSSTATIC)
+       echo Linking $@...
+       $(CC) $(LDFLAGS) -o $@ testdest.o $(LIBCUPSSTATIC) \
+               $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
+
+
 #
 # testfile (dependency on static CUPS library is intentional)
 #
index 25dd43365a0f168cca4e68eeab75a9f4e0b84518..f28c28d938ba02791746026c02e72c39dd1ac041 100644 (file)
@@ -616,6 +616,8 @@ extern void         cupsSetUserAgent(const char *user_agent) _CUPS_API_1_7;
 extern const char      *cupsUserAgent(void) _CUPS_API_1_7;
 
 /* New in CUPS 2.0 */
+extern cups_dest_t     *cupsGetDestWithURI(const char *name, const char *uri) _CUPS_API_2_0;
+extern const char      *cupsLocalizeDestMedia(http_t *http, cups_dest_t *dest, cups_dinfo_t *info, unsigned flags, cups_size_t *size) _CUPS_API_2_0;
 extern int             cupsMakeServerCredentials(const char *path, const char *common_name, int num_alt_names, const char **alt_names, time_t expiration_date) _CUPS_API_2_0;
 extern int             cupsSetServerCredentials(const char *path, const char *common_name, int auto_create) _CUPS_API_2_0;
 
index 1bd8324af3b335e3ba9705ab7aebda2a588fa589..cdec441b5f66ed1a1d9806b42949fcac7c5edd55 100644 (file)
@@ -31,6 +31,161 @@ static int  cups_read_strings(cups_file_t *fp, char *buffer, size_t bufsize,
 static char    *cups_scan_strings(char *buffer);
 
 
+/*
+ * 'cupsLocalizeDestMedia()' - Get the localized string for a destination media
+ *                             size.
+ *
+ * The returned string is stored in the destination information and will become
+ * invalid if the destination information is deleted.
+ *
+ * @since CUPS 2.0@
+ */
+
+const char *                           /* O - Localized string */
+cupsLocalizeDestMedia(
+    http_t       *http,                        /* I - Connection to destination */
+    cups_dest_t  *dest,                        /* I - Destination */
+    cups_dinfo_t *dinfo,               /* I - Destination information */
+    unsigned     flags,                        /* I - Media flags */
+    cups_size_t  *size)                        /* I - Media size */
+{
+  cups_lang_t          *lang;          /* Standard localizations */
+  _cups_message_t      key,            /* Search key */
+                       *match;         /* Matching entry */
+  pwg_media_t          *pwg;           /* PWG media information */
+  cups_array_t         *db;            /* Media database */
+  _cups_media_db_t     *mdb;           /* Media database entry */
+  char                 name[1024],     /* Size name */
+                       temp[256];      /* Temporary string */
+  const char           *lsize,         /* Localized media size */
+                       *lsource,       /* Localized media source */
+                       *ltype;         /* Localized media type */
+
+
+ /*
+  * Range check input...
+  */
+
+  if (!http || !dest || !dinfo || !size)
+  {
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
+    return (NULL);
+  }
+
+ /*
+  * See if the localization is cached...
+  */
+
+  if (!dinfo->localizations)
+    cups_create_localizations(http, dinfo);
+
+  key.id = size->media;
+  if ((match = (_cups_message_t *)cupsArrayFind(dinfo->localizations, &key)) != NULL)
+    return (match->str);
+
+ /*
+  * If not, get the localized size, source, and type strings...
+  */
+
+  lang = cupsLangDefault();
+  pwg  = pwgMediaForSize(size->width, size->length);
+
+  if (pwg->ppd)
+    lsize = _cupsLangString(lang, pwg->ppd);
+  else
+    lsize = NULL;
+
+  if (!lsize)
+  {
+    if ((size->width % 635) == 0 && (size->length % 635) == 0)
+    {
+     /*
+      * Use inches since the size is a multiple of 1/4 inch.
+      */
+
+      snprintf(temp, sizeof(temp), _cupsLangString(lang, _("%g x %g")), size->width / 2540.0, size->length / 2540.0);
+    }
+    else
+    {
+     /*
+      * Use millimeters since the size is not a multiple of 1/4 inch.
+      */
+
+      snprintf(temp, sizeof(temp), _cupsLangString(lang, _("%d x %d mm")), (size->width + 50) / 100, (size->length + 50) / 100);
+    }
+
+    lsize = temp;
+  }
+
+  if (flags & CUPS_MEDIA_FLAGS_READY)
+    db = dinfo->ready_db;
+  else
+    db = dinfo->media_db;
+
+  DEBUG_printf(("1cupsLocalizeDestMedia: size->media=\"%s\"", size->media));
+
+  for (mdb = (_cups_media_db_t *)cupsArrayFirst(db); mdb; mdb = (_cups_media_db_t *)cupsArrayNext(db))
+  {
+    if (mdb->key && !strcmp(mdb->key, size->media))
+      break;
+    else if (mdb->size_name && !strcmp(mdb->size_name, size->media))
+      break;
+    else if (mdb->width == size->width && mdb->length == size->length && mdb->bottom == size->bottom && mdb->left == size->left && mdb->right == size->right && mdb->top == size->top)
+      break;
+  }
+
+  if (mdb)
+  {
+    lsource = cupsLocalizeDestValue(http, dest, dinfo, "media-source", mdb->source);
+    ltype   = cupsLocalizeDestValue(http, dest, dinfo, "media-type", mdb->type);
+  }
+  else
+  {
+    lsource = NULL;
+    ltype   = NULL;
+  }
+
+  if (!lsource && !ltype)
+  {
+    if (size->bottom || size->left || size->right || size->top)
+      snprintf(name, sizeof(name), _cupsLangString(lang, _("%s (Borderless)")), lsize);
+    else
+      strlcpy(name, lsize, sizeof(name));
+  }
+  else if (!lsource)
+  {
+    if (size->bottom || size->left || size->right || size->top)
+      snprintf(name, sizeof(name), _cupsLangString(lang, _("%s (Borderless, %s)")), lsize, ltype);
+    else
+      snprintf(name, sizeof(name), _cupsLangString(lang, _("%s (%s)")), lsize, ltype);
+  }
+  else if (!ltype)
+  {
+    if (size->bottom || size->left || size->right || size->top)
+      snprintf(name, sizeof(name), _cupsLangString(lang, _("%s (Borderless, %s)")), lsize, lsource);
+    else
+      snprintf(name, sizeof(name), _cupsLangString(lang, _("%s (%s)")), lsize, lsource);
+  }
+  else
+  {
+    if (size->bottom || size->left || size->right || size->top)
+      snprintf(name, sizeof(name), _cupsLangString(lang, _("%s (Borderless, %s, %s)")), lsize, ltype, lsource);
+    else
+      snprintf(name, sizeof(name), _cupsLangString(lang, _("%s (%s, %s)")), lsize, ltype, lsource);
+  }
+
+  if ((match = (_cups_message_t *)calloc(1, sizeof(_cups_message_t))) == NULL)
+    return (NULL);
+
+  match->id  = strdup(size->media);
+  match->str = strdup(name);
+
+  cupsArrayAdd(dinfo->localizations, match);
+
+  return (match->str);
+}
+
+
 /*
  * 'cupsLocalizeDestOption()' - Get the localized string for a destination
  *                              option.
index 675bf5fb53ee0d2dcbead692e9daf16b80e2a843..dc7357309360ca8a40186c0d96a33346b30a8611 100644 (file)
@@ -1302,6 +1302,100 @@ _cupsGetDestResource(
 }
 
 
+/*
+ * 'cupsGetDestWithURI()' - Get a destination associated with a URI.
+ *
+ * "name" is the desired name for the printer. If @code NULL@, a name will be
+ * created using the URI.
+ *
+ * "uri" is the "ipp" or "ipps" URI for the printer.
+ *
+ * @since CUPS 2.0@
+ */
+
+cups_dest_t *                          /* O - Destination or @code NULL@ */
+cupsGetDestWithURI(const char *name,   /* I - Desired printer name or @code NULL@ */
+                   const char *uri)    /* I - URI for the printer */
+{
+  cups_dest_t  *dest;                  /* New destination */
+  char         temp[1024],             /* Temporary string */
+               scheme[256],            /* Scheme from URI */
+               userpass[256],          /* Username:password from URI */
+               hostname[256],          /* Hostname from URI */
+               resource[1024],         /* Resource path from URI */
+               *ptr;                   /* Pointer into string */
+  int          port;                   /* Port number from URI */
+
+
+ /*
+  * Range check input...
+  */
+
+  if (!uri)
+  {
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
+    return (NULL);
+  }
+
+  if (httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, sizeof(scheme), userpass, sizeof(userpass), hostname, sizeof(hostname), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK ||
+      (strncmp(uri, "ipp://", 6) && strncmp(uri, "ipps://", 7)))
+  {
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad printer URI."), 1);
+
+    return (NULL);
+  }
+
+  if (!name)
+  {
+   /*
+    * Create the name from the URI...
+    */
+
+    if (strstr(hostname, "._tcp"))
+    {
+     /*
+      * Use the service instance name...
+      */
+
+      if ((ptr = strchr(hostname, '.')) != NULL)
+        *ptr = '\0';
+
+      name = hostname;
+    }
+    else if (!strncmp(resource, "/classes/", 9))
+    {
+      snprintf(temp, sizeof(temp), "%s @ %s", resource + 9, hostname);
+      name = temp;
+    }
+    else if (!strncmp(resource, "/printers/", 10))
+    {
+      snprintf(temp, sizeof(temp), "%s @ %s", resource + 10, hostname);
+      name = temp;
+    }
+    else
+    {
+      name = hostname;
+    }
+  }
+
+ /*
+  * Create the destination...
+  */
+
+  if ((dest = calloc(1, sizeof(cups_dest_t))) == NULL)
+  {
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
+    return (NULL);
+  }
+
+  dest->name        = _cupsStrAlloc(name);
+  dest->num_options = cupsAddOption("printer-uri-supported", uri, dest->num_options, &(dest->options));
+  dest->num_options = cupsAddOption("printer-info", name, dest->num_options, &(dest->options));
+
+  return (dest);
+}
+
+
 /*
  * '_cupsGetDests()' - Get destinations from a server.
  *
diff --git a/cups/testdest.c b/cups/testdest.c
new file mode 100644 (file)
index 0000000..aefe881
--- /dev/null
@@ -0,0 +1,460 @@
+/*
+ * "$Id$"
+ *
+ * CUPS destination API test program for CUPS.
+ *
+ * Copyright 2014 by Apple Inc.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ * This file is subject to the Apple OS-Developed Software exception.
+ */
+
+/*
+ * Include necessary headers...
+ */
+
+#include <stdio.h>
+#include "cups.h"
+
+
+/*
+ * Local functions...
+ */
+
+static void    localize(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *option, const char *value);
+static void    print_file(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *filename, int num_options, cups_option_t *options);
+static void    show_conflicts(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, int num_options, cups_option_t *options);
+static void    show_default(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *option);
+static void    show_media(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, unsigned flags, const char *name);
+static void    show_supported(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *option, const char *value);
+static void    usage(const char *arg) __attribute__((noreturn));
+
+
+/*
+ * 'main()' - Main entry.
+ */
+
+int                                    /* O - Exit status */
+main(int  argc,                                /* I - Number of command-line arguments */
+     char *argv[])                     /* I - Command-line arguments */
+{
+  http_t       *http;                  /* Connection to destination */
+  cups_dest_t  *dest = NULL;           /* Destination */
+  cups_dinfo_t *dinfo;                 /* Destination info */
+
+
+  if (argc < 2)
+    usage(NULL);
+
+  if (!strcmp(argv[1], "--enum"))
+  {
+    return (0);
+  }
+  else if (!strncmp(argv[1], "ipp://", 6) || !strncmp(argv[1], "ipps://", 7))
+    dest = cupsGetDestWithURI(NULL, argv[1]);
+  else
+    dest = cupsGetNamedDest(CUPS_HTTP_DEFAULT, argv[1], NULL);
+
+  if (!dest)
+  {
+    printf("testdest: Unable to get destination \"%s\": %s\n", argv[1], cupsLastErrorString());
+    return (1);
+  }
+
+  if ((http = cupsConnectDest(dest, CUPS_DEST_FLAGS_NONE, 30000, NULL, NULL, 0, NULL, NULL)) == NULL)
+  {
+    printf("testdest: Unable to connect to destination \"%s\": %s\n", argv[1], cupsLastErrorString());
+    return (1);
+  }
+
+  if ((dinfo = cupsCopyDestInfo(http, dest)) == NULL)
+  {
+    printf("testdest: Unable to get information for destination \"%s\": %s\n", argv[1], cupsLastErrorString());
+    return (1);
+  }
+
+  if (argc == 2 || (!strcmp(argv[2], "supported") && argc < 6))
+  {
+    if (argc > 3)
+      show_supported(http, dest, dinfo, argv[3], argv[4]);
+    else if (argc > 2)
+      show_supported(http, dest, dinfo, argv[3], NULL);
+    else
+      show_supported(http, dest, dinfo, NULL, NULL);
+  }
+  else if (!strcmp(argv[2], "conflicts") && argc > 3)
+  {
+    int                        i,              /* Looping var */
+                       num_options = 0;/* Number of options */
+    cups_option_t      *options = NULL;/* Options */
+
+    for (i = 3; i < argc; i ++)
+      num_options = cupsParseOptions(argv[i], num_options, &options);
+
+    show_conflicts(http, dest, dinfo, num_options, options);
+  }
+  else if (!strcmp(argv[2], "default") && argc == 4)
+  {
+    show_default(http, dest, dinfo, argv[3]);
+  }
+  else if (!strcmp(argv[2], "localize") && argc > 3 && argc < 6)
+  {
+    localize(http, dest, dinfo, argv[3], argv[4]);
+  }
+  else if (!strcmp(argv[2], "media"))
+  {
+    int                i;                      /* Looping var */
+    const char *name = NULL;           /* Media name, if any */
+    unsigned   flags = CUPS_MEDIA_FLAGS_DEFAULT;
+                                       /* Media selection flags */
+
+    for (i = 3; i < argc; i ++)
+    {
+      if (!strcmp(argv[i], "borderless"))
+       flags = CUPS_MEDIA_FLAGS_BORDERLESS;
+      else if (!strcmp(argv[i], "duplex"))
+       flags = CUPS_MEDIA_FLAGS_DUPLEX;
+      else if (!strcmp(argv[i], "exact"))
+       flags = CUPS_MEDIA_FLAGS_EXACT;
+      else if (!strcmp(argv[i], "ready"))
+       flags = CUPS_MEDIA_FLAGS_READY;
+      else if (name)
+        usage(argv[i]);
+      else
+        name = argv[i];
+    }
+
+    show_media(http, dest, dinfo, flags, name);
+  }
+  else if (!strcmp(argv[2], "print") && argc > 3)
+  {
+    int                        i,              /* Looping var */
+                       num_options = 0;/* Number of options */
+    cups_option_t      *options = NULL;/* Options */
+
+    for (i = 4; i < argc; i ++)
+      num_options = cupsParseOptions(argv[i], num_options, &options);
+
+    print_file(http, dest, dinfo, argv[3], num_options, options);
+  }
+  else
+    usage(argv[2]);
+
+  return (0);
+}
+
+
+/*
+ * 'localize()' - Localize an option and value.
+ */
+
+static void
+localize(http_t       *http,           /* I - Connection to destination */
+         cups_dest_t  *dest,           /* I - Destination */
+        cups_dinfo_t *dinfo,           /* I - Destination information */
+         const char   *option,         /* I - Option */
+        const char   *value)           /* I - Value, if any */
+{
+  (void)http;
+  (void)dest;
+  (void)dinfo;
+  (void)option;
+  (void)value;
+}
+
+
+/*
+ * 'print_file()' - Print a file.
+ */
+
+static void
+print_file(http_t        *http,                /* I - Connection to destination */
+           cups_dest_t   *dest,                /* I - Destination */
+          cups_dinfo_t  *dinfo,        /* I - Destination information */
+           const char    *filename,    /* I - File to print */
+          int           num_options,   /* I - Number of options */
+          cups_option_t *options)      /* I - Options */
+{
+  (void)http;
+  (void)dest;
+  (void)dinfo;
+  (void)filename;
+  (void)num_options;
+  (void)options;
+}
+
+
+/*
+ * 'show_conflicts()' - Show conflicts for selected options.
+ */
+
+static void
+show_conflicts(
+    http_t        *http,               /* I - Connection to destination */
+    cups_dest_t   *dest,               /* I - Destination */
+    cups_dinfo_t  *dinfo,              /* I - Destination information */
+    int           num_options,         /* I - Number of options */
+    cups_option_t *options)            /* I - Options */
+{
+  (void)http;
+  (void)dest;
+  (void)dinfo;
+  (void)num_options;
+  (void)options;
+}
+
+
+/*
+ * 'show_default()' - Show default value for option.
+ */
+
+static void
+show_default(http_t       *http,       /* I - Connection to destination */
+            cups_dest_t  *dest,        /* I - Destination */
+            cups_dinfo_t *dinfo,       /* I - Destination information */
+            const char  *option)       /* I - Option */
+{
+  (void)http;
+  (void)dest;
+  (void)dinfo;
+  (void)option;
+}
+
+
+/*
+ * 'show_media()' - Show available media.
+ */
+
+static void
+show_media(http_t       *http,         /* I - Connection to destination */
+          cups_dest_t  *dest,          /* I - Destination */
+          cups_dinfo_t *dinfo,         /* I - Destination information */
+          unsigned     flags,          /* I - Media flags */
+          const char   *name)          /* I - Size name */
+{
+  int          i,                      /* Looping var */
+               count;                  /* Number of sizes */
+  cups_size_t  size;                   /* Media size info */
+
+
+  if (name)
+  {
+    double     dw, dl;                 /* Width and length from name */
+    char       units[32];              /* Units */
+    int                width,                  /* Width in 100ths of millimeters */
+               length;                 /* Length in 100ths of millimeters */
+
+
+    if (sscanf(name, "%lfx%lf%31s", &dw, &dl, units) == 3)
+    {
+      if (!strcmp(units, "in"))
+      {
+        width  = (int)(dw * 2540.0);
+       length = (int)(dl * 2540.0);
+      }
+      else if (!strcmp(units, "mm"))
+      {
+        width  = (int)(dw * 100.0);
+        length = (int)(dl * 100.0);
+      }
+      else
+      {
+        puts("  bad units in size");
+       return;
+      }
+
+      if (cupsGetDestMediaBySize(http, dest, dinfo, width, length, flags, &size))
+      {
+       printf("  %s (%s) %dx%d B%d L%d R%d T%d\n", size.media, cupsLocalizeDestMedia(http, dest, dinfo, flags, &size), size.width, size.length, size.bottom, size.left, size.right, size.top);
+      }
+      else
+      {
+       puts("  not supported");
+      }
+    }
+    else if (cupsGetDestMediaByName(http, dest, dinfo, name, flags, &size))
+    {
+      printf("  %s (%s) %dx%d B%d L%d R%d T%d\n", size.media, cupsLocalizeDestMedia(http, dest, dinfo, flags, &size), size.width, size.length, size.bottom, size.left, size.right, size.top);
+    }
+    else
+    {
+      puts("  not supported");
+    }
+  }
+  else
+  {
+    count = cupsGetDestMediaCount(http, dest, dinfo, flags);
+    printf("%d size%s:\n", count, count == 1 ? "" : "s");
+
+    for (i = 0; i < count; i ++)
+    {
+      if (cupsGetDestMediaByIndex(http, dest, dinfo, i, flags, &size))
+        printf("  %s (%s) %dx%d B%d L%d R%d T%d\n", size.media, cupsLocalizeDestMedia(http, dest, dinfo, flags, &size), size.width, size.length, size.bottom, size.left, size.right, size.top);
+      else
+        puts("  error");
+    }
+  }
+}
+
+
+/*
+ * 'show_supported()' - Show supported options, values, etc.
+ */
+
+static void
+show_supported(http_t       *http,     /* I - Connection to destination */
+              cups_dest_t  *dest,      /* I - Destination */
+              cups_dinfo_t *dinfo,     /* I - Destination information */
+              const char   *option,    /* I - Option, if any */
+              const char   *value)     /* I - Value, if any */
+{
+  ipp_attribute_t      *attr;          /* Attribute */
+  int                  i,              /* Looping var */
+                       count;          /* Number of values */
+
+
+  if (!option)
+  {
+    attr = cupsFindDestSupported(http, dest, dinfo, "job-creation-attributes");
+    if (attr)
+    {
+      count = ippGetCount(attr);
+      for (i = 0; i < count; i ++)
+        show_supported(http, dest, dinfo, ippGetString(attr, i, NULL), NULL);
+    }
+    else
+    {
+      static const char * const options[] =
+      {                                        /* List of standard options */
+        CUPS_COPIES,
+       CUPS_FINISHINGS,
+       CUPS_MEDIA,
+       CUPS_NUMBER_UP,
+       CUPS_ORIENTATION,
+       CUPS_PRINT_COLOR_MODE,
+       CUPS_PRINT_QUALITY,
+       CUPS_SIDES
+      };
+
+      puts("No job-creation-attributes-supported attribute, probing instead.");
+
+      for (i = 0; i < (int)(sizeof(options) / sizeof(options[0])); i ++)
+        if (cupsCheckDestSupported(http, dest, dinfo, options[i], NULL))
+         show_supported(http, dest, dinfo, options[i], NULL);
+    }
+  }
+  else if (!value)
+  {
+    puts(option);
+    if ((attr = cupsFindDestSupported(http, dest, dinfo, option)) != NULL)
+    {
+      count = ippGetCount(attr);
+
+      switch (ippGetValueTag(attr))
+      {
+        case IPP_TAG_INTEGER :
+           for (i = 0; i < count; i ++)
+              printf("  %d\n", ippGetInteger(attr, i));
+           break;
+
+        case IPP_TAG_ENUM :
+           for (i = 0; i < count; i ++)
+              printf("  %s\n", ippEnumString(option, ippGetInteger(attr, i)));
+           break;
+
+        case IPP_TAG_RANGE :
+           for (i = 0; i < count; i ++)
+           {
+             int upper, lower = ippGetRange(attr, i, &upper);
+
+              printf("  %d-%d\n", lower, upper);
+           }
+           break;
+
+       case IPP_TAG_TEXTLANG :
+       case IPP_TAG_NAMELANG :
+       case IPP_TAG_TEXT :
+       case IPP_TAG_NAME :
+       case IPP_TAG_KEYWORD :
+       case IPP_TAG_URI :
+       case IPP_TAG_URISCHEME :
+       case IPP_TAG_CHARSET :
+       case IPP_TAG_LANGUAGE :
+       case IPP_TAG_MIMETYPE :
+           for (i = 0; i < count; i ++)
+              printf("  %s\n", ippGetString(attr, i, NULL));
+           break;
+
+        case IPP_TAG_STRING :
+           for (i = 0; i < count; i ++)
+           {
+             int j, len;
+             unsigned char *data = ippGetOctetString(attr, i, &len);
+
+              fputs("  ", stdout);
+             for (j = 0; j < len; j ++)
+             {
+               if (data[j] < ' ' || data[j] >= 0x7f)
+                 printf("<%02X>", data[j]);
+               else
+                 putchar(data[j]);
+              }
+              putchar('\n');
+           }
+           break;
+
+        case IPP_TAG_BOOLEAN :
+           break;
+
+        default :
+           printf("  %s\n", ippTagString(ippGetValueTag(attr)));
+           break;
+      }
+    }
+    
+  }
+  else if (cupsCheckDestSupported(http, dest, dinfo, option, value))
+    puts("YES");
+  else
+    puts("NO");
+
+}
+
+
+/*
+ * 'usage()' - Show program usage.
+ */
+
+static void
+usage(const char *arg)                 /* I - Argument for usage message */
+{
+  if (arg)
+    printf("testdest: Unknown option \"%s\".\n", arg);
+
+  puts("Usage:");
+  puts("  ./testdest name [operation ...]");
+  puts("  ./testdest ipp://... [operation ...]");
+  puts("  ./testdest ipps://... [operation ...]");
+  puts("  ./testdest --enum [grayscale] [color] [duplex] [staple] [small]\n"
+       "                    [medium] [large]");
+  puts("");
+  puts("Operations:");
+  puts("  conflicts options");
+  puts("  default option");
+  puts("  localize option [value]");
+  puts("  media [borderless] [duplex] [exact] [ready] [name or size]");
+  puts("  print filename [options]");
+  puts("  supported [option [value]]");
+
+  exit(arg != NULL);
+}
+
+
+/*
+ * End of "$Id$".
+ */
index d171ac9c763b4aadc1d1c0ee56f77aaf20b2faaf..d8df4cb26fc8d32a65f7c7760be7a997d36109b4 100644 (file)
@@ -4285,7 +4285,7 @@ print_csv(
     for (i = 0; i < num_displayed; i ++)
     {
       if (i)
-        putchar(',');
+        fputc(',', outfile);
 
       buffer[0] = '\0';
 
@@ -4303,30 +4303,30 @@ print_csv(
       if (strchr(buffer, ',') != NULL || strchr(buffer, '\"') != NULL ||
          strchr(buffer, '\\') != NULL)
       {
-        putchar('\"');
+        putc('\"', outfile);
         for (bufptr = buffer; *bufptr; bufptr ++)
         {
           if (*bufptr == '\\' || *bufptr == '\"')
-            putchar('\\');
-          putchar(*bufptr);
+            putc('\\', outfile);
+          putc(*bufptr, outfile);
         }
-        putchar('\"');
+        putc('\"', outfile);
       }
       else
-        fputs(buffer, stdout);
+        fputs(buffer, outfile);
     }
-    putchar('\n');
+    putc('\n', outfile);
   }
   else
   {
     for (i = 0; i < num_displayed; i ++)
     {
       if (i)
-        putchar(',');
+        putc(',', outfile);
 
-      fputs(displayed[i], stdout);
+      fputs(displayed[i], outfile);
     }
-    putchar('\n');
+    putc('\n', outfile);
   }
 
   free(buffer);
@@ -4408,7 +4408,7 @@ print_line(
     for (i = 0; i < num_displayed; i ++)
     {
       if (i)
-        putchar(' ');
+        putc(' ', outfile);
 
       buffer[0] = '\0';
 
@@ -4423,31 +4423,31 @@ print_line(
         }
       }
 
-      printf("%*s", (int)-widths[i], buffer);
+      fprintf(outfile, "%*s", (int)-widths[i], buffer);
     }
-    putchar('\n');
+    putc('\n', outfile);
   }
   else
   {
     for (i = 0; i < num_displayed; i ++)
     {
       if (i)
-        putchar(' ');
+        putc(' ', outfile);
 
-      printf("%*s", (int)-widths[i], displayed[i]);
+      fprintf(outfile, "%*s", (int)-widths[i], displayed[i]);
     }
-    putchar('\n');
+    putc('\n', outfile);
 
     for (i = 0; i < num_displayed; i ++)
     {
       if (i)
-       putchar(' ');
+       putc(' ', outfile);
 
       memset(buffer, '-', widths[i]);
       buffer[widths[i]] = '\0';
-      fputs(buffer, stdout);
+      fputs(buffer, outfile);
     }
-    putchar('\n');
+    putc('\n', outfile);
   }
 
   free(buffer);
index c198e9983069485451370428b74fadd04e0a6a0a..046288d4ca36f9cd44c080a65874418ee7d246ad 100644 (file)
@@ -14,7 +14,9 @@
                        );
                        dependencies = (
                                726AD704135E8AA1002C930D /* PBXTargetDependency */,
+                               2767FC5419267469000F61D3 /* PBXTargetDependency */,
                                273BF6DE1333B6370022CAAB /* PBXTargetDependency */,
+                               2767FC5619267469000F61D3 /* PBXTargetDependency */,
                                278C58D6136B641D00836530 /* PBXTargetDependency */,
                                270CCDB2135E3CDE00007BE2 /* PBXTargetDependency */,
                        );
                276683FD1337F7B8000D33D0 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; };
                2766840F1337FA38000D33D0 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; };
                276684111337FA7C000D33D0 /* cupsaddsmb.c in Sources */ = {isa = PBXBuildFile; fileRef = 276684101337FA7C000D33D0 /* cupsaddsmb.c */; };
+               2767FC5219266A36000F61D3 /* testdest.c in Sources */ = {isa = PBXBuildFile; fileRef = 2767FC5119266A36000F61D3 /* testdest.c */; };
+               2767FC57192674C4000F61D3 /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; };
+               2767FC58192674E0000F61D3 /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; };
+               2767FC5F1926750C000F61D3 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC591926750C000F61D3 /* CoreFoundation.framework */; };
+               2767FC601926750C000F61D3 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5A1926750C000F61D3 /* libiconv.dylib */; };
+               2767FC611926750C000F61D3 /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5B1926750C000F61D3 /* libresolv.dylib */; };
+               2767FC621926750C000F61D3 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5C1926750C000F61D3 /* libz.dylib */; };
+               2767FC631926750C000F61D3 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5D1926750C000F61D3 /* Security.framework */; };
+               2767FC641926750C000F61D3 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5E1926750C000F61D3 /* SystemConfiguration.framework */; };
+               2767FC6519267538000F61D3 /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; };
+               2767FC6619267538000F61D3 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC591926750C000F61D3 /* CoreFoundation.framework */; };
+               2767FC6719267538000F61D3 /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5B1926750C000F61D3 /* libresolv.dylib */; };
+               2767FC6819267538000F61D3 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5C1926750C000F61D3 /* libz.dylib */; };
+               2767FC6919267538000F61D3 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5D1926750C000F61D3 /* Security.framework */; };
+               2767FC6A19267538000F61D3 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5E1926750C000F61D3 /* SystemConfiguration.framework */; };
+               2767FC6B192685E6000F61D3 /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; };
+               2767FC6C192685E6000F61D3 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC591926750C000F61D3 /* CoreFoundation.framework */; };
+               2767FC6D192685E6000F61D3 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5A1926750C000F61D3 /* libiconv.dylib */; };
+               2767FC6E192685E6000F61D3 /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5B1926750C000F61D3 /* libresolv.dylib */; };
+               2767FC6F192685E6000F61D3 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5C1926750C000F61D3 /* libz.dylib */; };
+               2767FC70192685E6000F61D3 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5D1926750C000F61D3 /* Security.framework */; };
+               2767FC71192685E6000F61D3 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5E1926750C000F61D3 /* SystemConfiguration.framework */; };
+               2767FC7219268F06000F61D3 /* dest-job.c in Sources */ = {isa = PBXBuildFile; fileRef = 72CF95E018A13543000FCAE4 /* dest-job.c */; };
+               2767FC7319268F09000F61D3 /* dest-localization.c in Sources */ = {isa = PBXBuildFile; fileRef = 72CF95E118A13543000FCAE4 /* dest-localization.c */; };
+               2767FC7419268F0C000F61D3 /* dest-options.c in Sources */ = {isa = PBXBuildFile; fileRef = 72CF95E218A13543000FCAE4 /* dest-options.c */; };
                278C58E3136B647200836530 /* testhttp.c in Sources */ = {isa = PBXBuildFile; fileRef = 278C58E2136B647200836530 /* testhttp.c */; };
                278C58E9136B64B000836530 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; };
                278C58EA136B64B000836530 /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; };
                        remoteGlobalIDString = 276684031337FA1D000D33D0;
                        remoteInfo = cupsaddsmb;
                };
+               2767FC4819266A0D000F61D3 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 72BF96371333042100B1EAD7 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 274FF6891333B1C400317ECB;
+                       remoteInfo = libcups_static;
+               };
+               2767FC5319267469000F61D3 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 72BF96371333042100B1EAD7 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 276683EF1337F78E000D33D0;
+                       remoteInfo = ipptool;
+               };
+               2767FC5519267469000F61D3 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 72BF96371333042100B1EAD7 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 2767FC4619266A0D000F61D3;
+                       remoteInfo = testdest;
+               };
                278C58D5136B641D00836530 /* PBXContainerItemProxy */ = {
                        isa = PBXContainerItemProxy;
                        containerPortal = 72BF96371333042100B1EAD7 /* Project object */;
                        );
                        runOnlyForDeploymentPostprocessing = 1;
                };
+               2767FC4C19266A0D000F61D3 /* CopyFiles */ = {
+                       isa = PBXCopyFilesBuildPhase;
+                       buildActionMask = 2147483647;
+                       dstPath = /usr/share/man/man1/;
+                       dstSubfolderSpec = 0;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 1;
+               };
                278C58C9136B640300836530 /* CopyFiles */ = {
                        isa = PBXCopyFilesBuildPhase;
                        buildActionMask = 2147483647;
                276683F91337F7A9000D33D0 /* ipptool.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ipptool.c; path = ../test/ipptool.c; sourceTree = "<group>"; };
                276684041337FA1D000D33D0 /* cupsaddsmb */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = cupsaddsmb; sourceTree = BUILT_PRODUCTS_DIR; };
                276684101337FA7C000D33D0 /* cupsaddsmb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cupsaddsmb.c; path = ../systemv/cupsaddsmb.c; sourceTree = "<group>"; };
+               2767FC5019266A0D000F61D3 /* testdest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testdest; sourceTree = BUILT_PRODUCTS_DIR; };
+               2767FC5119266A36000F61D3 /* testdest.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = testdest.c; path = ../cups/testdest.c; sourceTree = "<group>"; };
+               2767FC591926750C000F61D3 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; };
+               2767FC5A1926750C000F61D3 /* libiconv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.dylib; path = usr/lib/libiconv.dylib; sourceTree = SDKROOT; };
+               2767FC5B1926750C000F61D3 /* libresolv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libresolv.dylib; path = usr/lib/libresolv.dylib; sourceTree = SDKROOT; };
+               2767FC5C1926750C000F61D3 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; };
+               2767FC5D1926750C000F61D3 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; };
+               2767FC5E1926750C000F61D3 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; };
+               2767FC7519269687000F61D3 /* pwg.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = pwg.h; path = ../cups/pwg.h; sourceTree = "<group>"; };
+               2767FC76192696A0000F61D3 /* raster-private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "raster-private.h"; path = "../cups/raster-private.h"; sourceTree = "<group>"; };
                278C58CB136B640300836530 /* testhttp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testhttp; sourceTree = BUILT_PRODUCTS_DIR; };
                278C58E2136B647200836530 /* testhttp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = testhttp.c; path = ../cups/testhttp.c; sourceTree = "<group>"; };
                278C58E5136B64AF00836530 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = "<absolute>"; };
                        isa = PBXFrameworksBuildPhase;
                        buildActionMask = 2147483647;
                        files = (
+                               2767FC57192674C4000F61D3 /* libcups_static.a in Frameworks */,
                                278C58E9136B64B000836530 /* CoreFoundation.framework in Frameworks */,
                                278C58EA136B64B000836530 /* Kerberos.framework in Frameworks */,
                                278C58EB136B64B000836530 /* Security.framework in Frameworks */,
                        isa = PBXFrameworksBuildPhase;
                        buildActionMask = 2147483647;
                        files = (
+                               2767FC5F1926750C000F61D3 /* CoreFoundation.framework in Frameworks */,
+                               2767FC601926750C000F61D3 /* libiconv.dylib in Frameworks */,
+                               2767FC611926750C000F61D3 /* libresolv.dylib in Frameworks */,
+                               2767FC621926750C000F61D3 /* libz.dylib in Frameworks */,
+                               2767FC631926750C000F61D3 /* Security.framework in Frameworks */,
+                               2767FC641926750C000F61D3 /* SystemConfiguration.framework in Frameworks */,
+                               2767FC58192674E0000F61D3 /* libcups_static.a in Frameworks */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
+               2767FC4B19266A0D000F61D3 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               2767FC6B192685E6000F61D3 /* libcups_static.a in Frameworks */,
+                               2767FC6C192685E6000F61D3 /* CoreFoundation.framework in Frameworks */,
+                               2767FC6D192685E6000F61D3 /* libiconv.dylib in Frameworks */,
+                               2767FC6E192685E6000F61D3 /* libresolv.dylib in Frameworks */,
+                               2767FC6F192685E6000F61D3 /* libz.dylib in Frameworks */,
+                               2767FC70192685E6000F61D3 /* Security.framework in Frameworks */,
+                               2767FC71192685E6000F61D3 /* SystemConfiguration.framework in Frameworks */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
                278C58C8136B640300836530 /* Frameworks */ = {
                        isa = PBXFrameworksBuildPhase;
                        buildActionMask = 2147483647;
                        isa = PBXFrameworksBuildPhase;
                        buildActionMask = 2147483647;
                        files = (
+                               2767FC6519267538000F61D3 /* libcups_static.a in Frameworks */,
+                               2767FC6619267538000F61D3 /* CoreFoundation.framework in Frameworks */,
+                               2767FC6719267538000F61D3 /* libresolv.dylib in Frameworks */,
+                               2767FC6819267538000F61D3 /* libz.dylib in Frameworks */,
+                               2767FC6919267538000F61D3 /* Security.framework in Frameworks */,
+                               2767FC6A19267538000F61D3 /* SystemConfiguration.framework in Frameworks */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
                273BF6B81333B4A90022CAAB /* tests */ = {
                        isa = PBXGroup;
                        children = (
+                               2767FC5119266A36000F61D3 /* testdest.c */,
                                273BF6C61333B5370022CAAB /* testcups.c */,
                                278C58E2136B647200836530 /* testhttp.c */,
                                270CCDBB135E3D3E00007BE2 /* testmime.c */,
                                278C58CB136B640300836530 /* testhttp */,
                                72A4332F155844CF002E172D /* libcups_static.a */,
                                72CF95F118A19134000FCAE4 /* ipptool copy */,
+                               2767FC5019266A0D000F61D3 /* testdest */,
                        );
                        name = Products;
                        sourceTree = "<group>";
                                72220FB413330BCE00FCA411 /* mime.h */,
                                72220EF7133305BB00FCA411 /* ppd.h */,
                                274FF6091333315100317ECB /* ppdc.h */,
+                               2767FC7519269687000F61D3 /* pwg.h */,
                                72220EFA133305BB00FCA411 /* raster.h */,
                                72220EFD133305BB00FCA411 /* sidechannel.h */,
                                72220F07133305BB00FCA411 /* transcode.h */,
                                7271883C1374AB14001A2036 /* mime-private.h */,
                                72220EF5133305BB00FCA411 /* ppd-private.h */,
                                72220EF9133305BB00FCA411 /* pwg-private.h */,
+                               2767FC76192696A0000F61D3 /* raster-private.h */,
                                72220EFE133305BB00FCA411 /* snmp-private.h */,
                                72220F01133305BB00FCA411 /* string-private.h */,
                                72220F04133305BB00FCA411 /* thread-private.h */,
                72220FB113330B4A00FCA411 /* Frameworks */ = {
                        isa = PBXGroup;
                        children = (
+                               2767FC591926750C000F61D3 /* CoreFoundation.framework */,
+                               2767FC5A1926750C000F61D3 /* libiconv.dylib */,
+                               2767FC5B1926750C000F61D3 /* libresolv.dylib */,
+                               2767FC5C1926750C000F61D3 /* libz.dylib */,
+                               2767FC5D1926750C000F61D3 /* Security.framework */,
+                               2767FC5E1926750C000F61D3 /* SystemConfiguration.framework */,
                                72D53A3915B492FA003F877F /* libpam.dylib */,
                                72D53A3315B4925B003F877F /* ApplicationServices.framework */,
                                72D53A2C15B4913D003F877F /* IOKit.framework */,
                        productReference = 276684041337FA1D000D33D0 /* cupsaddsmb */;
                        productType = "com.apple.product-type.tool";
                };
+               2767FC4619266A0D000F61D3 /* testdest */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = 2767FC4D19266A0D000F61D3 /* Build configuration list for PBXNativeTarget "testdest" */;
+                       buildPhases = (
+                               2767FC4919266A0D000F61D3 /* Sources */,
+                               2767FC4B19266A0D000F61D3 /* Frameworks */,
+                               2767FC4C19266A0D000F61D3 /* CopyFiles */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                               2767FC4719266A0D000F61D3 /* PBXTargetDependency */,
+                       );
+                       name = testdest;
+                       productName = testcups;
+                       productReference = 2767FC5019266A0D000F61D3 /* testdest */;
+                       productType = "com.apple.product-type.tool";
+               };
                278C58CA136B640300836530 /* testhttp */ = {
                        isa = PBXNativeTarget;
                        buildConfigurationList = 278C58D3136B640300836530 /* Build configuration list for PBXNativeTarget "testhttp" */;
                                720DD6C11358FD5F0064AA82 /* snmp */,
                                7243792F1333FB85009631B9 /* socket */,
                                273BF6BC1333B5000022CAAB /* testcups */,
+                               2767FC4619266A0D000F61D3 /* testdest */,
                                278C58CA136B640300836530 /* testhttp */,
                                270CCDA6135E3C9E00007BE2 /* testmime */,
                                7243795A1333FF1D009631B9 /* usb */,
                                274FF69E1333B1C400317ECB /* http-addrlist.c in Sources */,
                                274FF69F1333B1C400317ECB /* http-support.c in Sources */,
                                274FF6A01333B1C400317ECB /* http.c in Sources */,
+                               2767FC7419268F0C000F61D3 /* dest-options.c in Sources */,
                                274FF6A11333B1C400317ECB /* ipp-support.c in Sources */,
                                274FF6A21333B1C400317ECB /* ipp.c in Sources */,
                                274FF6A31333B1C400317ECB /* langprintf.c in Sources */,
                                727AD5B819100A58009F6862 /* tls.c in Sources */,
                                274FF6AB1333B1C400317ECB /* page.c in Sources */,
                                274FF6AC1333B1C400317ECB /* ppd-cache.c in Sources */,
+                               2767FC7219268F06000F61D3 /* dest-job.c in Sources */,
                                274FF6AD1333B1C400317ECB /* ppd.c in Sources */,
                                274FF6AE1333B1C400317ECB /* pwg-media.c in Sources */,
+                               2767FC7319268F09000F61D3 /* dest-localization.c in Sources */,
                                274FF6AF1333B1C400317ECB /* request.c in Sources */,
                                274FF6B01333B1C400317ECB /* sidechannel.c in Sources */,
                                274FF6B11333B1C400317ECB /* snmp.c in Sources */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
+               2767FC4919266A0D000F61D3 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               2767FC5219266A36000F61D3 /* testdest.c in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
                278C58C7136B640300836530 /* Sources */ = {
                        isa = PBXSourcesBuildPhase;
                        buildActionMask = 2147483647;
                        target = 276684031337FA1D000D33D0 /* cupsaddsmb */;
                        targetProxy = 276684121337FA8D000D33D0 /* PBXContainerItemProxy */;
                };
+               2767FC4719266A0D000F61D3 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = 274FF6891333B1C400317ECB /* libcups_static */;
+                       targetProxy = 2767FC4819266A0D000F61D3 /* PBXContainerItemProxy */;
+               };
+               2767FC5419267469000F61D3 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = 276683EF1337F78E000D33D0 /* ipptool */;
+                       targetProxy = 2767FC5319267469000F61D3 /* PBXContainerItemProxy */;
+               };
+               2767FC5619267469000F61D3 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = 2767FC4619266A0D000F61D3 /* testdest */;
+                       targetProxy = 2767FC5519267469000F61D3 /* PBXContainerItemProxy */;
+               };
                278C58D6136B641D00836530 /* PBXTargetDependency */ = {
                        isa = PBXTargetDependency;
                        target = 278C58CA136B640300836530 /* testhttp */;
                        };
                        name = Release;
                };
+               2767FC4E19266A0D000F61D3 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               PRODUCT_NAME = testdest;
+                       };
+                       name = Debug;
+               };
+               2767FC4F19266A0D000F61D3 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               PRODUCT_NAME = testdest;
+                       };
+                       name = Release;
+               };
                278C58D1136B640300836530 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
                        defaultConfigurationIsVisible = 0;
                        defaultConfigurationName = Release;
                };
+               2767FC4D19266A0D000F61D3 /* Build configuration list for PBXNativeTarget "testdest" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               2767FC4E19266A0D000F61D3 /* Debug */,
+                               2767FC4F19266A0D000F61D3 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
                278C58D3136B640300836530 /* Build configuration list for PBXNativeTarget "testhttp" */ = {
                        isa = XCConfigurationList;
                        buildConfigurations = (