1/* 2 * "$Id: mime.h 11093 2013-07-03 20:48:42Z msweet $" 3 * 4 * MIME type/conversion database definitions for CUPS. 5 * 6 * Copyright 2007-2011 by Apple Inc. 7 * Copyright 1997-2007 by Easy Software Products, all rights reserved. 8 * 9 * These coded instructions, statements, and computer programs are the 10 * property of Apple Inc. and are protected by Federal copyright 11 * law. Distribution and use rights are outlined in the file "LICENSE.txt" 12 * which should have been included with this file. If this file is 13 * file is missing or damaged, see the license at "http://www.cups.org/". 14 */ 15 16#ifndef _CUPS_MIME_H_ 17# define _CUPS_MIME_H_ 18 19# include <cups/array.h> 20# include <cups/ipp.h> 21# include <cups/file.h> 22 23 24/* 25 * C++ magic... 26 */ 27 28# ifdef __cplusplus 29extern "C" { 30# endif /* __cplusplus */ 31 32 33/* 34 * Constants... 35 */ 36 37# define MIME_MAX_SUPER 16 /* Maximum size of supertype name */ 38# define MIME_MAX_TYPE IPP_MAX_NAME /* Maximum size of type name */ 39# define MIME_MAX_FILTER 256 /* Maximum size of filter pathname */ 40# define MIME_MAX_BUFFER 4096 /* Maximum size of file buffer */ 41 42 43/* 44 * Types/structures... 45 */ 46 47typedef enum 48{ 49 MIME_MAGIC_NOP, /* No operation */ 50 MIME_MAGIC_AND, /* Logical AND of all children */ 51 MIME_MAGIC_OR, /* Logical OR of all children */ 52 MIME_MAGIC_MATCH, /* Filename match */ 53 MIME_MAGIC_ASCII, /* ASCII characters in range */ 54 MIME_MAGIC_PRINTABLE, /* Printable characters (32-255) in range */ 55 MIME_MAGIC_STRING, /* String matches */ 56 MIME_MAGIC_CHAR, /* Character/byte matches */ 57 MIME_MAGIC_SHORT, /* Short/16-bit word matches */ 58 MIME_MAGIC_INT, /* Integer/32-bit word matches */ 59 MIME_MAGIC_LOCALE, /* Current locale matches string */ 60 MIME_MAGIC_CONTAINS, /* File contains a string */ 61 MIME_MAGIC_ISTRING /* Case-insensitive string matches */ 62} mime_op_t; 63 64typedef struct _mime_magic_s /**** MIME Magic Data ****/ 65{ 66 struct _mime_magic_s *prev, /* Previous rule */ 67 *next, /* Next rule */ 68 *parent, /* Parent rules */ 69 *child; /* Child rules */ 70 short op, /* Operation code (see above) */ 71 invert; /* Invert the result */ 72 int offset, /* Offset in file */ 73 region, /* Region length */ 74 length; /* Length of data */ 75 union 76 { 77 char matchv[64]; /* Match value */ 78 char localev[64]; /* Locale value */ 79 char stringv[64]; /* String value */ 80 unsigned char charv; /* Byte value */ 81 unsigned short shortv; /* Short value */ 82 unsigned intv; /* Integer value */ 83 } value; 84} mime_magic_t; 85 86typedef struct _mime_type_s /**** MIME Type Data ****/ 87{ 88 mime_magic_t *rules; /* Rules used to detect this type */ 89 int priority; /* Priority of this type */ 90 char super[MIME_MAX_SUPER], /* Super-type name ("image", "application", etc.) */ 91 type[MIME_MAX_TYPE]; /* Type name ("png", "postscript", etc.) */ 92} mime_type_t; 93 94typedef struct _mime_filter_s /**** MIME Conversion Filter Data ****/ 95{ 96 mime_type_t *src, /* Source type */ 97 *dst; /* Destination type */ 98 int cost; /* Relative cost */ 99 char filter[MIME_MAX_FILTER];/* Filter program to use */ 100 size_t maxsize; /* Maximum file size for this filter */ 101} mime_filter_t; 102 103typedef void (*mime_error_cb_t)(void *ctx, const char *message); 104 105typedef struct _mime_s /**** MIME Database ****/ 106{ 107 cups_array_t *types; /* File types */ 108 cups_array_t *filters; /* Type conversion filters */ 109 cups_array_t *srcs; /* Filters sorted by source type */ 110 mime_error_cb_t error_cb; /* Error message callback */ 111 void *error_ctx; /* Pointer for callback */ 112} mime_t; 113 114 115/* 116 * Functions... 117 */ 118 119extern void mimeDelete(mime_t *mime); 120extern mime_t *mimeNew(void) _CUPS_API_1_5; 121extern mime_t *mimeLoad(const char *pathname, const char *filterpath); 122extern mime_t *mimeLoadFilters(mime_t *mime, const char *pathname, 123 const char *filterpath); 124extern mime_t *mimeLoadTypes(mime_t *mime, const char *pathname); 125 126extern mime_type_t *mimeAddType(mime_t *mime, const char *super, 127 const char *type); 128extern int mimeAddTypeRule(mime_type_t *mt, const char *rule); 129extern void mimeDeleteType(mime_t *mime, mime_type_t *mt); 130extern mime_type_t *mimeFileType(mime_t *mime, const char *pathname, 131 const char *filename, int *compression); 132extern mime_type_t *mimeFirstType(mime_t *mime); 133extern mime_type_t *mimeNextType(mime_t *mime); 134extern int mimeNumTypes(mime_t *mime); 135extern mime_type_t *mimeType(mime_t *mime, const char *super, 136 const char *type); 137 138extern mime_filter_t *mimeAddFilter(mime_t *mime, mime_type_t *src, 139 mime_type_t *dst, int cost, 140 const char *filter); 141extern void mimeDeleteFilter(mime_t *mime, mime_filter_t *filter); 142extern cups_array_t *mimeFilter(mime_t *mime, mime_type_t *src, 143 mime_type_t *dst, int *cost); 144extern cups_array_t *mimeFilter2(mime_t *mime, mime_type_t *src, 145 size_t srcsize, mime_type_t *dst, 146 int *cost); 147extern mime_filter_t *mimeFilterLookup(mime_t *mime, mime_type_t *src, 148 mime_type_t *dst); 149extern mime_filter_t *mimeFirstFilter(mime_t *mime); 150extern mime_filter_t *mimeNextFilter(mime_t *mime); 151extern int mimeNumFilters(mime_t *mime); 152extern void mimeSetErrorCallback(mime_t *mime, mime_error_cb_t cb, 153 void *context) _CUPS_API_1_5; 154 155# ifdef __cplusplus 156} 157# endif /* __cplusplus */ 158#endif /* !_CUPS_MIME_H_ */ 159 160/* 161 * End of "$Id: mime.h 11093 2013-07-03 20:48:42Z msweet $". 162 */ 163