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