]> git.ipfire.org Git - thirdparty/cups.git/blobdiff - scheduler/filter.c
Remove all of the Subversion keywords from various source files.
[thirdparty/cups.git] / scheduler / filter.c
index e97e2541bb2fe26fedece6847205c227d315b08c..9a703abc9f1069de62e69e0ed3c818ad5fb4cbbf 100644 (file)
@@ -1,46 +1,22 @@
 /*
- * "$Id$"
+ * File type conversion routines for CUPS.
  *
- *   File type conversion routines for the Common UNIX Printing System (CUPS).
+ * Copyright 2007-2011 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   Copyright 1997-2006 by Easy Software Products, all rights reserved.
- *
- *   These coded instructions, statements, and computer programs are the
- *   property of Easy Software Products and are protected by Federal
- *   copyright law.  Distribution and use rights are outlined in the file
- *   "LICENSE.txt" which should have been included with this file.  If this
- *   file is missing or damaged please contact Easy Software Products
- *   at:
- *
- *       Attn: CUPS Licensing Information
- *       Easy Software Products
- *       44141 Airport View Drive, Suite 204
- *       Hollywood, Maryland 20636 USA
- *
- *       Voice: (301) 373-9600
- *       EMail: cups-info@cups.org
- *         WWW: http://www.cups.org
- *
- * Contents:
- *
- *   mimeAddFilter()   - Add a filter to the current MIME database.
- *   mimeFilter()      - Find the fastest way to convert from one type to
- *                       another.
- *   compare_filters() - Compare two filters...
- *   find_filters()    - Find the filters to convert from one type to another.
- *   lookup()          - Lookup a filter...
+ * 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/".
  */
 
 /*
  * Include necessary headers...
  */
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <ctype.h>
-
-#include <cups/debug.h>
-#include <cups/string.h>
+#include <cups/string-private.h>
+#include <cups/debug-private.h>
 #include "mime.h"
 
 
@@ -59,12 +35,11 @@ typedef struct _mime_typelist_s             /**** List of source types ****/
  * Local functions...
  */
 
-static int             compare_filters(mime_filter_t *, mime_filter_t *);
-static int             compare_srcs(mime_filter_t *, mime_filter_t *);
-static cups_array_t    *find_filters(mime_t *mime, mime_type_t *src,
-                                     mime_type_t *dst, int *cost,
-                                     _mime_typelist_t *visited);
-static mime_filter_t   *lookup(mime_t *, mime_type_t *, mime_type_t *);
+static int             mime_compare_filters(mime_filter_t *, mime_filter_t *);
+static int             mime_compare_srcs(mime_filter_t *, mime_filter_t *);
+static cups_array_t    *mime_find_filters(mime_t *mime, mime_type_t *src,
+                                     size_t srcsize, mime_type_t *dst,
+                                     int *cost, _mime_typelist_t *visited);
 
 
 /*
@@ -81,19 +56,28 @@ mimeAddFilter(mime_t      *mime,    /* I - MIME database */
   mime_filter_t        *temp;                  /* New filter */
 
 
+  DEBUG_printf(("mimeAddFilter(mime=%p, src=%p(%s/%s), dst=%p(%s/%s), cost=%d, "
+                "filter=\"%s\")", mime,
+               src, src ? src->super : "???", src ? src->type : "???",
+               dst, dst ? dst->super : "???", dst ? dst->type : "???",
+               cost, filter));
+               
  /*
   * Range-check the input...
   */
 
   if (!mime || !src || !dst || !filter)
+  {
+    DEBUG_puts("1mimeAddFilter: Returning NULL.");
     return (NULL);
+  }
 
  /*
   * See if we already have an existing filter for the given source and
   * destination...
   */
 
-  if ((temp = lookup(mime, src, dst)) != NULL)
+  if ((temp = mimeFilterLookup(mime, src, dst)) != NULL)
   {
    /*
     * Yup, does the existing filter have a higher cost?  If so, copy the
@@ -102,6 +86,8 @@ mimeAddFilter(mime_t      *mime,     /* I - MIME database */
 
     if (temp->cost > cost)
     {
+      DEBUG_printf(("1mimeAddFilter: Replacing filter \"%s\", cost %d.",
+                    temp->filter, temp->cost));
       temp->cost = cost;
       strlcpy(temp->filter, filter, sizeof(temp->filter));
     }
@@ -113,7 +99,7 @@ mimeAddFilter(mime_t      *mime,     /* I - MIME database */
     */
 
     if (!mime->filters)
-      mime->filters = cupsArrayNew((cups_array_func_t)compare_filters, NULL);
+      mime->filters = cupsArrayNew((cups_array_func_t)mime_compare_filters, NULL);
 
     if (!mime->filters)
       return (NULL);
@@ -130,13 +116,17 @@ mimeAddFilter(mime_t      *mime,  /* I - MIME database */
     temp->cost = cost;
     strlcpy(temp->filter, filter, sizeof(temp->filter));
 
+    DEBUG_puts("1mimeAddFilter: Adding new filter.");
     cupsArrayAdd(mime->filters, temp);
+    cupsArrayAdd(mime->srcs, temp);
   }
 
  /*
   * Return the new/updated filter...
   */
 
+  DEBUG_printf(("1mimeAddFilter: Returning %p.", temp));
+
   return (temp);
 }
 
@@ -151,17 +141,42 @@ mimeFilter(mime_t      *mime,             /* I - MIME database */
           mime_type_t *dst,            /* I - Destination file type */
           int         *cost)           /* O - Cost of filters */
 {
+  DEBUG_printf(("mimeFilter(mime=%p, src=%p(%s/%s), dst=%p(%s/%s), "
+                "cost=%p(%d))", mime,
+               src, src ? src->super : "???", src ? src->type : "???",
+               dst, dst ? dst->super : "???", dst ? dst->type : "???",
+               cost, cost ? *cost : 0));
+
+  return (mimeFilter2(mime, src, 0, dst, cost));
+}
+
+
+/*
+ * 'mimeFilter2()' - Find the fastest way to convert from one type to another,
+ *                   including file size.
+ */
+
+cups_array_t *                         /* O - Array of filters to run */
+mimeFilter2(mime_t      *mime,         /* I - MIME database */
+            mime_type_t *src,          /* I - Source file type */
+           size_t      srcsize,        /* I - Size of source file */
+           mime_type_t *dst,           /* I - Destination file type */
+           int         *cost)          /* O - Cost of filters */
+{
+  cups_array_t *filters;               /* Array of filters to run */
+
+
  /*
   * Range-check the input...
   */
 
-  DEBUG_printf(("mimeFilter(mime=%p, src=%p(%s/%s), dst=%p(%s/%s), "
-                "cost=%p(%d))\n",
-               mime, src, src ? src->super : "?", src ? src->type : "?",
-               dst, dst ? dst->super : "?", dst ? dst->type : "?",
+  DEBUG_printf(("mimeFilter2(mime=%p, src=%p(%s/%s), srcsize=" CUPS_LLFMT
+                ", dst=%p(%s/%s), cost=%p(%d))", mime,
+               src, src ? src->super : "???", src ? src->type : "???",
+               CUPS_LLCAST srcsize,
+               dst, dst ? dst->super : "???", dst ? dst->type : "???",
                cost, cost ? *cost : 0));
 
-
   if (cost)
     *cost = 0;
 
@@ -176,8 +191,7 @@ mimeFilter(mime_t      *mime,               /* I - MIME database */
   {
     mime_filter_t      *current;       /* Current filter */
 
-
-    mime->srcs = cupsArrayNew((cups_array_func_t)compare_srcs, NULL);
+    mime->srcs = cupsArrayNew((cups_array_func_t)mime_compare_srcs, NULL);
 
     for (current = mimeFirstFilter(mime);
          current;
@@ -189,17 +203,61 @@ mimeFilter(mime_t      *mime,             /* I - MIME database */
   * Find the filters...
   */
 
-  return (find_filters(mime, src, dst, cost, NULL));
+  filters = mime_find_filters(mime, src, srcsize, dst, cost, NULL);
+
+  DEBUG_printf(("1mimeFilter2: Returning %d filter(s), cost %d:",
+                cupsArrayCount(filters), cost ? *cost : -1));
+#ifdef DEBUG
+  {
+    mime_filter_t      *filter;        /* Current filter */
+
+    for (filter = (mime_filter_t *)cupsArrayFirst(filters);
+         filter;
+        filter = (mime_filter_t *)cupsArrayNext(filters))
+      DEBUG_printf(("1mimeFilter2: %s/%s %s/%s %d %s", filter->src->super,
+                    filter->src->type, filter->dst->super, filter->dst->type,
+                   filter->cost, filter->filter));
+  }
+#endif /* DEBUG */
+
+  return (filters);
+}
+
+
+/*
+ * 'mimeFilterLookup()' - Lookup a filter.
+ */
+
+mime_filter_t *                                /* O - Filter for src->dst */
+mimeFilterLookup(mime_t      *mime,    /* I - MIME database */
+                 mime_type_t *src,     /* I - Source type */
+                 mime_type_t *dst)     /* I - Destination type */
+{
+  mime_filter_t        key,                    /* Key record for filter search */
+               *filter;                /* Matching filter */
+
+
+  DEBUG_printf(("2mimeFilterLookup(mime=%p, src=%p(%s/%s), dst=%p(%s/%s))", mime,
+                src, src ? src->super : "???", src ? src->type : "???",
+               dst, dst ? dst->super : "???", dst ? dst->type : "???"));
+
+  key.src = src;
+  key.dst = dst;
+
+  filter = (mime_filter_t *)cupsArrayFind(mime->filters, &key);
+  DEBUG_printf(("3mimeFilterLookup: Returning %p(%s).", filter,
+                filter ? filter->filter : "???"));
+  return (filter);
 }
 
 
 /*
- * 'compare_filters()' - Compare two filters...
+ * 'mime_compare_filters()' - Compare two filters.
  */
 
 static int                             /* O - Comparison result */
-compare_filters(mime_filter_t *f0,     /* I - First filter */
-                mime_filter_t *f1)     /* I - Second filter */
+mime_compare_filters(mime_filter_t *f0,        /* I - First filter */
+                     mime_filter_t *f1)        /* I - Second filter */
 {
   int  i;                              /* Result of comparison */
 
@@ -214,12 +272,12 @@ compare_filters(mime_filter_t *f0,        /* I - First filter */
 
 
 /*
- * 'compare_srcs()' - Compare two srcs...
+ * 'mime_compare_srcs()' - Compare two filter source types.
  */
 
 static int                             /* O - Comparison result */
-compare_srcs(mime_filter_t *f0,                /* I - First filter */
-             mime_filter_t *f1)                /* I - Second filter */
+mime_compare_srcs(mime_filter_t *f0,   /* I - First filter */
+                  mime_filter_t *f1)   /* I - Second filter */
 {
   int  i;                              /* Result of comparison */
 
@@ -232,15 +290,17 @@ compare_srcs(mime_filter_t *f0,           /* I - First filter */
 
 
 /*
- * 'find_filters()' - Find the filters to convert from one type to another.
+ * 'mime_find_filters()' - Find the filters to convert from one type to another.
  */
 
 static cups_array_t *                  /* O - Array of filters to run */
-find_filters(mime_t           *mime,   /* I - MIME database */
-             mime_type_t      *src,    /* I - Source file type */
-            mime_type_t      *dst,     /* I - Destination file type */
-            int              *cost,    /* O - Cost of filters */
-            _mime_typelist_t *list)    /* I - Source types we've used */
+mime_find_filters(
+    mime_t           *mime,            /* I - MIME database */
+    mime_type_t      *src,             /* I - Source file type */
+    size_t           srcsize,          /* I - Size of source file */
+    mime_type_t      *dst,             /* I - Destination file type */
+    int              *cost,            /* O - Cost of filters */
+    _mime_typelist_t *list)            /* I - Source types we've used */
 {
   int                  tempcost,       /* Temporary cost */
                        mincost;        /* Current minimum */
@@ -252,34 +312,44 @@ find_filters(mime_t           *mime,      /* I - MIME database */
                        *listptr;       /* Pointer in list */
 
 
-  DEBUG_printf(("find_filters(mime=%p, src=%p(%s/%s), dst=%p(%s/%s), "
-                "cost=%p, list=%p)\n", mime, src, src->super, src->type,
-               dst, dst->super, dst->type, cost, list));
+  DEBUG_printf(("2mime_find_filters(mime=%p, src=%p(%s/%s), srcsize=" CUPS_LLFMT
+                ", dst=%p(%s/%s), cost=%p, list=%p)", mime, src, src->super,
+               src->type, CUPS_LLCAST srcsize, dst, dst->super, dst->type,
+               cost, list));
 
  /*
   * See if there is a filter that can convert the files directly...
   */
 
-  if ((current = lookup(mime, src, dst)) != NULL)
+  if ((current = mimeFilterLookup(mime, src, dst)) != NULL &&
+      (current->maxsize == 0 || srcsize <= current->maxsize))
   {
    /*
     * Got a direct filter!
     */
 
-    DEBUG_puts("Direct filter found!");
+    DEBUG_puts("3mime_find_filters: Direct filter found.");
 
     if ((mintemp = cupsArrayNew(NULL, NULL)) == NULL)
+    {
+      DEBUG_puts("3mime_find_filters: Returning NULL (out of memory).");
       return (NULL);
+    }
 
     cupsArrayAdd(mintemp, current);
 
     mincost = current->cost;
 
     if (!cost)
+    {
+      DEBUG_printf(("3mime_find_filters: Returning 1 filter, cost %d:",
+                    mincost));
+      DEBUG_printf(("3mime_find_filters: %s/%s %s/%s %d %s",
+                    current->src->super, current->src->type,
+                    current->dst->super, current->dst->type,
+                   current->cost, current->filter));
       return (mintemp);
-
-    DEBUG_puts("    Found direct filter:");
-    DEBUG_printf(("    %s (cost=%d)\n", current->filter, mincost));
+    }
   }
   else
   {
@@ -314,6 +384,8 @@ find_filters(mime_t           *mime,        /* I - MIME database */
 
     mime_type_t *current_dst;          /* Current destination type */
 
+    if (current->maxsize > 0 && srcsize > current->maxsize)
+      continue;
 
     for (listptr = list, current_dst = current->dst;
         listptr;
@@ -332,20 +404,38 @@ find_filters(mime_t           *mime,      /* I - MIME database */
     listnode.src = current->src;
 
     cupsArraySave(mime->srcs);
-    temp = find_filters(mime, current->dst, dst, &tempcost, &listnode);
+    temp = mime_find_filters(mime, current->dst, srcsize, dst, &tempcost,
+                             &listnode);
     cupsArrayRestore(mime->srcs);
 
     if (!temp)
       continue;
 
     if (!cost)
+    {
+      DEBUG_printf(("3mime_find_filters: Returning %d filter(s), cost %d:",
+                   cupsArrayCount(temp), tempcost));
+
+#ifdef DEBUG
+      for (current = (mime_filter_t *)cupsArrayFirst(temp);
+          current;
+          current = (mime_filter_t *)cupsArrayNext(temp))
+       DEBUG_printf(("3mime_find_filters: %s/%s %s/%s %d %s",
+                     current->src->super, current->src->type,
+                     current->dst->super, current->dst->type,
+                     current->cost, current->filter));
+#endif /* DEBUG */
+
       return (temp);
+    }
 
    /*
     * Found a match; see if this one is less costly than the last (if
     * any...)
     */
 
+    tempcost += current->cost;
+
     if (tempcost < mincost)
     {
       cupsArrayDelete(mintemp);
@@ -356,7 +446,7 @@ find_filters(mime_t           *mime,        /* I - MIME database */
       */
 
       mintemp = temp;
-      mincost = tempcost + current->cost;
+      mincost = tempcost;
       cupsArrayInsert(mintemp, current);
     }
     else
@@ -369,12 +459,17 @@ find_filters(mime_t           *mime,      /* I - MIME database */
     * Hey, we got a match!
     */
 
+    DEBUG_printf(("3mime_find_filters: Returning %d filter(s), cost %d:",
+                  cupsArrayCount(mintemp), mincost));
+
 #ifdef DEBUG
-    printf("    Returning %d filters:\n", cupsArrayCount(mintemp));
     for (current = (mime_filter_t *)cupsArrayFirst(mintemp);
          current;
         current = (mime_filter_t *)cupsArrayNext(mintemp))
-      printf("    %s\n", current->filter);
+      DEBUG_printf(("3mime_find_filters: %s/%s %s/%s %d %s",
+                    current->src->super, current->src->type,
+                    current->dst->super, current->dst->type,
+                   current->cost, current->filter));
 #endif /* DEBUG */
 
     if (cost)
@@ -383,31 +478,7 @@ find_filters(mime_t           *mime,       /* I - MIME database */
     return (mintemp);
   }
 
-  DEBUG_puts("    Returning zippo...");
+  DEBUG_puts("3mime_find_filters: Returning NULL (no matches).");
 
   return (NULL);
 }
-
-
-/*
- * 'lookup()' - Lookup a filter...
- */
-
-static mime_filter_t *                 /* O - Filter for src->dst */
-lookup(mime_t      *mime,              /* I - MIME database */
-       mime_type_t *src,               /* I - Source type */
-       mime_type_t *dst)               /* I - Destination type */
-{
-  mime_filter_t        key;                    /* Key record for filter search */
-
-
-  key.src = src;
-  key.dst = dst;
-
-  return ((mime_filter_t *)cupsArrayFind(mime->filters, &key));
-}
-
-
-/*
- * End of "$Id$".
- */