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(("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; if (!mime || !src || !dst) return (NULL); /* * (Re)build the source lookup array as needed... */ if (!mime->srcs) { mime_filter_t *current; /* Current filter */ mime->srcs = cupsArrayNew((cups_array_func_t)mime_compare_srcs, NULL); for (current = mimeFirstFilter(mime); current; current = mimeNextFilter(mime)) cupsArrayAdd(mime->srcs, current); } /* * Find the filters... */ 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); }
int /* O - Exit status */ main(int argc, /* I - Number of command-line args */ char *argv[]) /* I - Command-line arguments */ { int i; /* Looping vars */ const char *filter_path; /* Filter path */ char super[MIME_MAX_SUPER], /* Super-type name */ type[MIME_MAX_TYPE]; /* Type name */ int compression; /* Compression of file */ int cost; /* Cost of filters */ mime_t *mime; /* MIME database */ mime_type_t *src, /* Source type */ *dst; /* Destination type */ struct stat srcinfo; /* Source information */ ppd_file_t *ppd; /* PPD file */ cups_array_t *filters; /* Filters for the file */ mime_filter_t *filter; /* Current filter */ mime = NULL; src = NULL; dst = NULL; ppd = NULL; filter_path = "../filter:" CUPS_SERVERBIN "/filter"; srcinfo.st_size = 0; for (i = 1; i < argc; i ++) if (!strcmp(argv[i], "-d")) { i ++; if (i < argc) { mime = mimeLoad(argv[i], filter_path); if (ppd) add_ppd_filters(mime, ppd); } } else if (!strcmp(argv[i], "-f")) { i ++; if (i < argc) filter_path = argv[i]; } else if (!strcmp(argv[i], "-p")) { i ++; if (i < argc) { ppd = ppdOpenFile(argv[i]); if (mime) add_ppd_filters(mime, ppd); } } else if (!src) { if (!mime) mime = mimeLoad("../conf", filter_path); if (ppd) add_ppd_filters(mime, ppd); src = mimeFileType(mime, argv[i], NULL, &compression); stat(argv[i], &srcinfo); if (src) printf("%s: %s/%s%s\n", argv[i], src->super, src->type, compression ? " (gzipped)" : ""); else if ((src = mimeType(mime, "application", "octet-stream")) != NULL) printf("%s: application/octet-stream\n", argv[i]); else { printf("%s: unknown\n", argv[i]); if (mime) mimeDelete(mime); return (1); } } else { sscanf(argv[i], "%15[^/]/%31s", super, type); dst = mimeType(mime, super, type); filters = mimeFilter2(mime, src, srcinfo.st_size, dst, &cost); if (!filters) { printf("No filters to convert from %s/%s to %s.\n", src->super, src->type, argv[i]); } else { int first = 1; /* First filter shown? */ printf("Filter cost = %d\n", cost); for (filter = (mime_filter_t *)cupsArrayFirst(filters); filter; filter = (mime_filter_t *)cupsArrayNext(filters)) { if (!strcmp(filter->filter, "-")) continue; if (first) { first = 0; fputs(filter->filter, stdout); } else printf(" | %s", filter->filter); } putchar('\n'); cupsArrayDelete(filters); } } if (!mime) { mime = mimeLoad("../conf", filter_path); if (ppd) add_ppd_filters(mime, ppd); } if (!src) { puts("MIME database types:"); for (src = mimeFirstType(mime); src; src = mimeNextType(mime)) { printf("\t%s/%s (%d):\n", src->super, src->type, src->priority); print_rules(src->rules); puts(""); } puts(""); puts("MIME database filters:"); for (filter = mimeFirstFilter(mime); filter; filter = mimeNextFilter(mime)) printf("\t%s/%s to %s/%s: %s (%d)\n", filter->src->super, filter->src->type, filter->dst->super, filter->dst->type, filter->filter, filter->cost); type_dir(mime, "../doc"); } return (0); }