summaryrefslogtreecommitdiff
path: root/scheduler/filter.c
diff options
context:
space:
mode:
authormsweet <msweet@a1ca3aef-8c08-0410-bb20-df032aa958be>2011-04-11 18:53:27 +0000
committermsweet <msweet@a1ca3aef-8c08-0410-bb20-df032aa958be>2011-04-11 18:53:27 +0000
commit07ed0e9a4385437b52e7195b681e600c2f1c5623 (patch)
tree6dda615ae2f467bbc8c311ba8066bf63c20ec1d7 /scheduler/filter.c
parent84315f460a5c9eb38f7fcc4204acf98ed2b29406 (diff)
downloadcups-07ed0e9a4385437b52e7195b681e600c2f1c5623.tar.gz
Merge changes from CUPS 1.5svn-r9675.
git-svn-id: svn+ssh://src.apple.com/svn/cups/easysw/current@3122 a1ca3aef-8c08-0410-bb20-df032aa958be
Diffstat (limited to 'scheduler/filter.c')
-rw-r--r--scheduler/filter.c69
1 files changed, 48 insertions, 21 deletions
diff --git a/scheduler/filter.c b/scheduler/filter.c
index 1234de52a..9f734da56 100644
--- a/scheduler/filter.c
+++ b/scheduler/filter.c
@@ -17,8 +17,10 @@
* mimeAddFilter() - Add a filter to the current MIME database.
* mimeFilter() - Find the fastest way to convert from one type to
* another.
- * mimeFilterLookup() - Lookup a filter...
- * compare_filters() - Compare two filters...
+ * mimeFilter2() - Find the fastest way to convert from one type to
+ * another, including the file size.
+ * mimeFilterLookup() - Lookup a filter.
+ * compare_filters() - Compare two filters.
* find_filters() - Find the filters to convert from one type to another.
*/
@@ -49,8 +51,8 @@ typedef struct _mime_typelist_s /**** List of source types ****/
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);
+ size_t srcsize, mime_type_t *dst,
+ int *cost, _mime_typelist_t *visited);
/*
@@ -137,16 +139,37 @@ mimeFilter(mime_t *mime, /* I - MIME database */
mime_type_t *dst, /* I - Destination file type */
int *cost) /* O - Cost of filters */
{
- /*
- * Range-check the input...
- */
-
DEBUG_printf(("mimeFilter(mime=%p, src=%p(%s/%s), dst=%p(%s/%s), "
- "cost=%p(%d))\n",
+ "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 */
+{
+ /*
+ * Range-check the input...
+ */
+
+ 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;
@@ -162,7 +185,6 @@ mimeFilter(mime_t *mime, /* I - MIME database */
{
mime_filter_t *current; /* Current filter */
-
mime->srcs = cupsArrayNew((cups_array_func_t)compare_srcs, NULL);
for (current = mimeFirstFilter(mime);
@@ -175,12 +197,12 @@ mimeFilter(mime_t *mime, /* I - MIME database */
* Find the filters...
*/
- return (find_filters(mime, src, dst, cost, NULL));
+ return (find_filters(mime, src, srcsize, dst, cost, NULL));
}
/*
- * 'mimeFilterLookup()' - Lookup a filter...
+ * 'mimeFilterLookup()' - Lookup a filter.
*/
mime_filter_t * /* O - Filter for src->dst */
@@ -199,7 +221,7 @@ mimeFilterLookup(mime_t *mime, /* I - MIME database */
/*
- * 'compare_filters()' - Compare two filters...
+ * 'compare_filters()' - Compare two filters.
*/
static int /* O - Comparison result */
@@ -243,6 +265,7 @@ compare_srcs(mime_filter_t *f0, /* I - First filter */
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 */
+ 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 */
@@ -257,21 +280,23 @@ 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(("2find_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 = mimeFilterLookup(mime, src, dst)) != NULL)
+ if ((current = mimeFilterLookup(mime, src, dst)) != NULL &&
+ (current->maxsize == 0 || srcsize <= current->maxsize))
{
/*
* Got a direct filter!
*/
- DEBUG_puts("find_filters: Direct filter found!");
+ DEBUG_puts("2find_filters: Direct filter found!");
if ((mintemp = cupsArrayNew(NULL, NULL)) == NULL)
return (NULL);
@@ -283,8 +308,8 @@ find_filters(mime_t *mime, /* I - MIME database */
if (!cost)
return (mintemp);
- DEBUG_puts("find_filters: Found direct filter:");
- DEBUG_printf(("find_filters: %s (cost=%d)\n", current->filter, mincost));
+ DEBUG_puts("2find_filters: Found direct filter:");
+ DEBUG_printf(("2find_filters: %s (cost=%d)", current->filter, mincost));
}
else
{
@@ -319,6 +344,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;
@@ -337,7 +364,7 @@ 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 = find_filters(mime, current->dst, srcsize, dst, &tempcost, &listnode);
cupsArrayRestore(mime->srcs);
if (!temp)