diff options
author | jlovell <jlovell@a1ca3aef-8c08-0410-bb20-df032aa958be> | 2006-01-26 21:39:43 +0000 |
---|---|---|
committer | jlovell <jlovell@a1ca3aef-8c08-0410-bb20-df032aa958be> | 2006-01-26 21:39:43 +0000 |
commit | fa73b22906f71080fa5056485d8204612717adac (patch) | |
tree | f2f23b68c20d1fc9a85301527690aca5efa382df /scheduler/mime.c | |
parent | 4a09f02d10d679af0b04d36c25f0dcb518e432a4 (diff) | |
download | cups-fa73b22906f71080fa5056485d8204612717adac.tar.gz |
Load cups into easysw/current.
git-svn-id: svn+ssh://src.apple.com/svn/cups/easysw/current@13 a1ca3aef-8c08-0410-bb20-df032aa958be
Diffstat (limited to 'scheduler/mime.c')
-rw-r--r-- | scheduler/mime.c | 323 |
1 files changed, 191 insertions, 132 deletions
diff --git a/scheduler/mime.c b/scheduler/mime.c index 236ae11dc..903f66f2f 100644 --- a/scheduler/mime.c +++ b/scheduler/mime.c @@ -1,9 +1,9 @@ /* - * "$Id: mime.c 4613 2005-08-30 12:41:48Z mike $" + * "$Id: mime.c 4970 2006-01-24 14:05:45Z mike $" * * MIME database file routines for the Common UNIX Printing System (CUPS). * - * Copyright 1997-2005 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 @@ -23,12 +23,22 @@ * * Contents: * - * mimeDelete() - Delete (free) a MIME database. - * mimeMerge() - Merge a MIME database from disk with the current one. - * mimeNew() - Create a new, empty MIME database. - * load_types() - Load a xyz.types file... - * delete_rules() - Free all memory for the given rule tree. - * load_convs() - Load a xyz.convs file... + * mimeDelete() - Delete (free) a MIME database. + * mimeDeleteFilter() - Delete a filter from the MIME database. + * mimeDeleteType() - Delete a type from the MIME database. + * mimeFirstFilter() - Get the first filter in the MIME database. + * mimeFirstType() - Get the first type in the MIME database. + * mimeNextType() - Get the next type in the MIME database. + * mimeLoad() - Create a new MIME database from disk. + * mimeMerge() - Merge a MIME database from disk with the current one. + * mimeNew() - Create a new, empty MIME database. + * mimeNextFilter() - Get the next filter in the MIME database. + * mimeNextType() - Get the next type in the MIME database. + * mimeNumFilters() - Get the number of filters in a MIME database. + * mimeNumTypes() - Get the number of types in a MIME database. + * load_types() - Load a xyz.types file... + * delete_rules() - Free all memory for the given rule tree. + * load_convs() - Load a xyz.convs file... */ /* @@ -39,15 +49,10 @@ #include <stdlib.h> #include <ctype.h> +#include <cups/dir.h> #include <cups/string.h> #include "mime.h" -#ifdef WIN32 -# include <windows.h> -#else -# include <dirent.h> -#endif /* WIN32 */ - /* * Local functions... @@ -64,135 +69,129 @@ static void delete_rules(mime_magic_t *rules); */ void -mimeDelete(mime_t *mime) /* I - MIME database */ +mimeDelete(mime_t *mime) /* I - MIME database */ { - int i; /* Looping var */ + mime_type_t *type; /* Current type */ + mime_filter_t *filter; /* Current filter */ - if (mime == NULL) + if (!mime) return; /* * Loop through the file types and delete any rules... */ - for (i = 0; i < mime->num_types; i ++) - { - delete_rules(mime->types[i]->rules); - free(mime->types[i]->type); - free(mime->types[i]); - } + for (type = (mime_type_t *)cupsArrayFirst(mime->types); + type; + type = (mime_type_t *)cupsArrayNext(mime->types)) + mimeDeleteType(mime, type); + + /* + * Loop through filters and free them... + */ + + for (filter = (mime_filter_t *)cupsArrayFirst(mime->filters); + filter; + filter = (mime_filter_t *)cupsArrayNext(mime->filters)) + mimeDeleteFilter(mime, filter); /* * Free the types and filters arrays, and then the MIME database structure. */ - free(mime->types); - free(mime->filters); + cupsArrayDelete(mime->types); + cupsArrayDelete(mime->filters); free(mime); } /* - * 'mimeMerge()' - Merge a MIME database from disk with the current one. + * 'mimeDeleteFilter()' - Delete a filter from the MIME database. */ -mime_t * /* O - Updated MIME database */ -mimeMerge(mime_t *mime, /* I - MIME database to add to */ - const char *pathname, /* I - Directory to load */ - const char *filterpath)/* I - Directory to load */ +void +mimeDeleteFilter(mime_t *mime, /* I - MIME database */ + mime_filter_t *filter) /* I - Filter */ { -#ifdef WIN32 - HANDLE dir; /* Directory handle */ - WIN32_FIND_DATA dent; /* Directory entry */ - char filename[1024], /* Full filename of types/converts file */ - *pathsep; /* Last character in path */ - - - /* - * First open the directory specified by pathname... Return NULL if nothing - * was read or if the pathname is NULL... - */ - - if (pathname == NULL) - return (NULL); + if (!mime || !filter) + return; - strlcpy(filename, pathname, sizeof(filename)); + cupsArrayRemove(mime->filters, filter); + free(filter); +} - pathsep = filename + strlen(filename); - if ((pathsep - filename + 9) > sizeof(filename)) - return (NULL); - if (pathsep == filename || - (pathsep[-1] != '/' && pathsep[-1] != '\\')) - { - strcpy(pathsep, "/"); - pathsep ++; - } +/* + * 'mimeDeleteType()' - Delete a type from the MIME database. + */ - strcpy(pathsep, "*.types"); - - if ((dir = FindFirstFile(filename, &dent)) == 0) - return (NULL); +void +mimeDeleteType(mime_t *mime, /* I - MIME database */ + mime_type_t *mt) /* I - Type */ +{ + if (!mime || !mt) + return; - /* - * If "mime" is NULL, make a new, blank database... - */ + cupsArrayRemove(mime->types, mt); - if (mime == NULL) - if ((mime = mimeNew()) == NULL) - return (NULL); + delete_rules(mt->rules); + free(mt); +} - /* - * Read all the .types files... - */ - do - { - /* - * Load a mime.types file... - */ +/* + * 'mimeFirstFilter()' - Get the first filter in the MIME database. + */ - if ((pathsep - filename + strlen(dent.cFileName)) >= sizeof(filename)) - continue; +mime_filter_t * /* O - Filter or NULL */ +mimeFirstFilter(mime_t *mime) /* I - MIME database */ +{ + if (!mime) + return (NULL); + else + return ((mime_filter_t *)cupsArrayFirst(mime->filters)); +} - strcpy(pathsep, dent.cFileName); - load_types(mime, filename); - } - while (FindNextFile(dir, &dent)); - FindClose(dir); +/* + * 'mimeFirstType()' - Get the first type in the MIME database. + */ - /* - * Read all the .convs files... - */ +mime_type_t * /* O - Type or NULL */ +mimeFirstType(mime_t *mime) /* I - MIME database */ +{ + if (!mime) + return (NULL); + else + return ((mime_type_t *)cupsArrayFirst(mime->types)); +} - strcpy(pathsep, "*.convs"); - - if ((dir = FindFirstFile(filename, &dent)) == 0) - return (mime); - do - { - /* - * Load a mime.convs file... - */ +/* + * 'mimeLoad()' - Create a new MIME database from disk. + */ - if ((pathsep - filename + strlen(dent.cFileName)) >= sizeof(filename)) - continue; +mime_t * /* O - New MIME database */ +mimeLoad(const char *pathname, /* I - Directory to load */ + const char *filterpath) /* I - Directory to load */ +{ + return (mimeMerge(NULL, pathname, filterpath)); +} - strcpy(pathsep, dent.cFileName); - load_convs(mime, filename); - } - while (FindNextFile(dir, &dent)); - FindClose(dir); +/* + * 'mimeMerge()' - Merge a MIME database from disk with the current one. + */ - return (mime); -#else - DIR *dir; /* Directory */ - struct dirent *dent; /* Directory entry */ - char filename[1024]; /* Full filename of types/converts file */ +mime_t * /* O - Updated MIME database */ +mimeMerge(mime_t *mime, /* I - MIME database to add to */ + const char *pathname, /* I - Directory to load */ + const char *filterpath) /* I - Directory to load */ +{ + cups_dir_t *dir; /* Directory */ + cups_dentry_t *dent; /* Directory entry */ + char filename[1024]; /* Full filename of types/converts file */ /* @@ -200,62 +199,62 @@ mimeMerge(mime_t *mime, /* I - MIME database to add to */ * was read or if the pathname is NULL... */ - if (pathname == NULL) + if (!pathname) return (NULL); - if ((dir = opendir(pathname)) == NULL) + if ((dir = cupsDirOpen(pathname)) == NULL) return (NULL); /* * If "mime" is NULL, make a new, blank database... */ - if (mime == NULL) - if ((mime = mimeNew()) == NULL) - return (NULL); + if (!mime) + mime = mimeNew(); + if (!mime) + return (NULL); /* * Read all the .types files... */ - while ((dent = readdir(dir)) != NULL) + while ((dent = cupsDirRead(dir)) != NULL) { - if (strlen(dent->d_name) > 6 && - strcmp(dent->d_name + strlen(dent->d_name) - 6, ".types") == 0) + if (strlen(dent->filename) > 6 && + !strcmp(dent->filename + strlen(dent->filename) - 6, ".types")) { /* * Load a mime.types file... */ - snprintf(filename, sizeof(filename), "%s/%s", pathname, dent->d_name); + snprintf(filename, sizeof(filename), "%s/%s", pathname, dent->filename); load_types(mime, filename); } } - rewinddir(dir); + cupsDirRewind(dir); /* * Read all the .convs files... */ - while ((dent = readdir(dir)) != NULL) + while ((dent = cupsDirRead(dir)) != NULL) { - if (strlen(dent->d_name) > 6 && - strcmp(dent->d_name + strlen(dent->d_name) - 6, ".convs") == 0) + if (strlen(dent->filename) > 6 && + !strcmp(dent->filename + strlen(dent->filename) - 6, ".convs")) { /* * Load a mime.convs file... */ - snprintf(filename, sizeof(filename), "%s/%s", pathname, dent->d_name); + snprintf(filename, sizeof(filename), "%s/%s", pathname, dent->filename); load_convs(mime, filename, filterpath); } } - closedir(dir); + cupsDirClose(dir); return (mime); -#endif /* WIN32 */ } @@ -263,7 +262,7 @@ mimeMerge(mime_t *mime, /* I - MIME database to add to */ * 'mimeNew()' - Create a new, empty MIME database. */ -mime_t * /* O - MIME database */ +mime_t * /* O - MIME database */ mimeNew(void) { return ((mime_t *)calloc(1, sizeof(mime_t))); @@ -271,6 +270,62 @@ mimeNew(void) /* + * 'mimeNextFilter()' - Get the next filter in the MIME database. + */ + +mime_filter_t * /* O - Filter or NULL */ +mimeNextFilter(mime_t *mime) /* I - MIME database */ +{ + if (!mime) + return (NULL); + else + return ((mime_filter_t *)cupsArrayNext(mime->filters)); +} + + +/* + * 'mimeNextType()' - Get the next type in the MIME database. + */ + +mime_type_t * /* O - Type or NULL */ +mimeNextType(mime_t *mime) /* I - MIME database */ +{ + if (!mime) + return (NULL); + else + return ((mime_type_t *)cupsArrayNext(mime->types)); +} + + +/* + * 'mimeNumFilters()' - Get the number of filters in a MIME database. + */ + +int +mimeNumFilters(mime_t *mime) /* I - MIME database */ +{ + if (!mime) + return (0); + else + return (cupsArrayCount(mime->filters)); +} + + +/* + * 'mimeNumTypes()' - Get the number of types in a MIME database. + */ + +int +mimeNumTypes(mime_t *mime) /* I - MIME database */ +{ + if (!mime) + return (0); + else + return (cupsArrayCount(mime->types)); +} + + +/* * 'load_types()' - Load a xyz.types file... */ @@ -369,9 +424,8 @@ load_types(mime_t *mime, /* I - MIME database */ static void load_convs(mime_t *mime, /* I - MIME database */ const char *filename, /* I - Convs file to load */ - const char *filterpath) /* I - Directory to load */ + const char *filterpath) /* I - Path for filters */ { - int i; /* Looping var */ cups_file_t *fp; /* Convs file */ char line[1024], /* Input line from file */ *lineptr, /* Current position in line */ @@ -379,10 +433,12 @@ load_convs(mime_t *mime, /* I - MIME database */ type[MIME_MAX_TYPE], /* Type name */ *temp, /* Temporary pointer */ *filter; /* Filter program */ - mime_type_t **temptype, /* MIME type looping var */ + mime_type_t *temptype, /* MIME type looping var */ *dsttype; /* Destination MIME type */ int cost; /* Cost of filter */ +#ifndef WIN32 char filterprog[1024]; /* Full path of filter... */ +#endif /* !WIN32 */ /* @@ -475,7 +531,7 @@ load_convs(mime_t *mime, /* I - MIME database */ filter = lineptr; #ifndef WIN32 - if (strcmp(filter, "-") != 0) + if (strcmp(filter, "-")) { /* * Verify that the filter exists and is executable... @@ -483,8 +539,9 @@ load_convs(mime_t *mime, /* I - MIME database */ if (filter[0] == '/') strlcpy(filterprog, filter, sizeof(filterprog)); - else - snprintf(filterprog, sizeof(filterprog), "%s/%s", filterpath, filter); + else if (!cupsFileFind(filter, filterpath, filterprog, + sizeof(filterprog))) + continue; if (access(filterprog, X_OK)) continue; @@ -517,7 +574,7 @@ load_convs(mime_t *mime, /* I - MIME database */ *temp = '\0'; - if (strcmp(super, "*") == 0 && strcmp(type, "*") == 0) + if (!strcmp(super, "*") && !strcmp(type, "*")) { /* * Force * / * to be "application/octet-stream"... @@ -531,10 +588,12 @@ load_convs(mime_t *mime, /* I - MIME database */ * Add the filter to the MIME database, supporting wildcards as needed... */ - for (temptype = mime->types, i = 0; i < mime->num_types; i ++, temptype ++) - if ((super[0] == '*' || strcmp((*temptype)->super, super) == 0) && - (type[0] == '*' || strcmp((*temptype)->type, type) == 0)) - mimeAddFilter(mime, *temptype, dsttype, cost, filter); + for (temptype = (mime_type_t *)cupsArrayFirst(mime->types); + temptype; + temptype = (mime_type_t *)cupsArrayNext(mime->types)) + if ((super[0] == '*' || !strcmp(temptype->super, super)) && + (type[0] == '*' || !strcmp(temptype->type, type))) + mimeAddFilter(mime, temptype, dsttype, cost, filter); } cupsFileClose(fp); @@ -569,5 +628,5 @@ delete_rules(mime_magic_t *rules) /* I - Rules to free */ /* - * End of "$Id: mime.c 4613 2005-08-30 12:41:48Z mike $". + * End of "$Id: mime.c 4970 2006-01-24 14:05:45Z mike $". */ |