189 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			189 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
** Copyright 1998 - 2000 Double Precision, Inc.  See COPYING for
 | 
						|
** distribution information.
 | 
						|
*/
 | 
						|
 | 
						|
/*
 | 
						|
** $Id$
 | 
						|
*/
 | 
						|
#ifndef	rfc2045_h
 | 
						|
#define	rfc2045_h
 | 
						|
 | 
						|
#include	<sys/types.h>
 | 
						|
#include	<string.h>
 | 
						|
#include	<stdio.h>
 | 
						|
 | 
						|
#ifdef  __cplusplus
 | 
						|
extern "C" {
 | 
						|
#endif
 | 
						|
 | 
						|
#define	RFC2045_ISMIME1(p)	((p) && atoi(p) == 1)
 | 
						|
#define	RFC2045_ISMIME1DEF(p)	(!(p) || atoi(p) == 1)
 | 
						|
 | 
						|
struct rfc2045 {
 | 
						|
	struct rfc2045 *parent;
 | 
						|
	unsigned pindex;
 | 
						|
	struct rfc2045 *next;
 | 
						|
 | 
						|
	off_t	startpos,	/* At which offset in msg this section starts */
 | 
						|
		endpos,		/* Where it ends */
 | 
						|
		startbody,	/* Where the body of the msg starts */
 | 
						|
		endbody;	/* endpos - trailing CRLF terminator */
 | 
						|
	off_t	nlines;		/* Number of lines in message */
 | 
						|
	off_t	nbodylines;	/* Number of lines only in the body */
 | 
						|
	char *mime_version;
 | 
						|
	char *content_type;
 | 
						|
	struct rfc2045attr *content_type_attr;	/* Content-Type: attributes */
 | 
						|
 | 
						|
	char *content_disposition;
 | 
						|
	char *boundary;
 | 
						|
	struct rfc2045attr *content_disposition_attr;
 | 
						|
	char *content_transfer_encoding;
 | 
						|
	int content_8bit;		/*
 | 
						|
					** Set if content_transfer_encoding is
 | 
						|
					** 8bit
 | 
						|
					*/
 | 
						|
	char *content_id;
 | 
						|
	char *content_description;
 | 
						|
	char *content_language;
 | 
						|
	char *content_md5;
 | 
						|
	char *content_base;
 | 
						|
	char *content_location;
 | 
						|
	struct  rfc2045ac *rfc2045acptr;
 | 
						|
	int	has8bitchars;	/* For rewriting */
 | 
						|
	int	haslongline;	/* For rewriting */
 | 
						|
	unsigned rfcviolation;	/* Boo-boos */
 | 
						|
 | 
						|
#define	RFC2045_ERR8BITHEADER	1	/* 8 bit characters in headers */
 | 
						|
#define	RFC2045_ERR8BITCONTENT	2	/* 8 bit contents, but no 8bit
 | 
						|
					content-transfer-encoding */
 | 
						|
#define	RFC2045_ERR2COMPLEX	4	/* Too many nested contents */
 | 
						|
 | 
						|
	unsigned numparts;	/* # of parts allocated */
 | 
						|
 | 
						|
	char	*rw_transfer_encoding;	/* For rewriting */
 | 
						|
 | 
						|
#define	RFC2045_RW_7BIT	1
 | 
						|
#define	RFC2045_RW_8BIT	2
 | 
						|
 | 
						|
	/* Subsections */
 | 
						|
 | 
						|
	struct rfc2045 *firstpart, *lastpart;
 | 
						|
 | 
						|
	/* Working area */
 | 
						|
 | 
						|
	char *workbuf;
 | 
						|
	size_t workbufsize;
 | 
						|
	size_t workbuflen;
 | 
						|
	int	workinheader;
 | 
						|
	int	workclosed;
 | 
						|
	int	isdummy;
 | 
						|
	int	informdata;	/* In a middle of a long form-data part */
 | 
						|
	char *header;
 | 
						|
	size_t headersize;
 | 
						|
	size_t headerlen;
 | 
						|
 | 
						|
	int	(*decode_func)(struct rfc2045 *, const char *, size_t);
 | 
						|
	void	*misc_decode_ptr;
 | 
						|
	int	(*udecode_func)(const char *, size_t, void *);
 | 
						|
} ;
 | 
						|
 | 
						|
struct rfc2045attr {
 | 
						|
	struct rfc2045attr *next;
 | 
						|
	char *name;
 | 
						|
	char *value;
 | 
						|
	} ;
 | 
						|
 | 
						|
struct rfc2045 *rfc2045_alloc();
 | 
						|
void rfc2045_parse(struct rfc2045 *, const char *, size_t);
 | 
						|
void rfc2045_free(struct rfc2045 *);
 | 
						|
const char *rfc2045_contentname(const struct rfc2045 *);
 | 
						|
 | 
						|
void rfc2045_mimeinfo(const struct rfc2045 *,
 | 
						|
	const char **,
 | 
						|
	const char **,
 | 
						|
	const char **);
 | 
						|
 | 
						|
const char *rfc2045_boundary(const struct rfc2045 *);
 | 
						|
char *rfc2045_related_start(const struct rfc2045 *);
 | 
						|
const char *rfc2045_content_id(const struct rfc2045 *);
 | 
						|
const char *rfc2045_content_description(const struct rfc2045 *);
 | 
						|
const char *rfc2045_content_language(const struct rfc2045 *);
 | 
						|
const char *rfc2045_content_md5(const struct rfc2045 *);
 | 
						|
 | 
						|
void rfc2045_dispositioninfo(const struct rfc2045 *,
 | 
						|
	const char **,
 | 
						|
	const char **,
 | 
						|
	const char **);
 | 
						|
 | 
						|
void rfc2045_mimepos(const struct rfc2045 *, off_t *, off_t *, off_t *,
 | 
						|
	off_t *, off_t *);
 | 
						|
unsigned rfc2045_mimepartcount(const struct rfc2045 *);
 | 
						|
 | 
						|
void rfc2045_xdump(struct rfc2045 *);
 | 
						|
 | 
						|
struct rfc2045id {
 | 
						|
	struct rfc2045id *next;
 | 
						|
	int idnum;
 | 
						|
} ;
 | 
						|
 | 
						|
void rfc2045_decode(struct rfc2045 *,
 | 
						|
	void (*)(struct rfc2045 *, struct rfc2045id *, void *),
 | 
						|
	void *);
 | 
						|
 | 
						|
struct rfc2045 *rfc2045_find(struct rfc2045 *, const char *);
 | 
						|
 | 
						|
 | 
						|
void rfc2045_cdecode_start(struct rfc2045 *,
 | 
						|
	int (*)(const char *, size_t, void *), void *);
 | 
						|
int rfc2045_cdecode(struct rfc2045 *, const char *, size_t);
 | 
						|
int rfc2045_cdecode_end(struct rfc2045 *);
 | 
						|
 | 
						|
void rfc2045_base64encode_start( void (*)(const char *, size_t));
 | 
						|
void rfc2045_base64encode(const char *, size_t);
 | 
						|
void rfc2045_base64encode_end();
 | 
						|
 | 
						|
const char *rfc2045_getdefaultcharset();
 | 
						|
void rfc2045_setdefaultcharset(const char *);
 | 
						|
struct rfc2045 *rfc2045_fromfd(int);
 | 
						|
#define	rfc2045_fromfp(f)	(rfc2045_fromfd(fileno((f))))
 | 
						|
 | 
						|
extern void rfc2045_error(const char *);
 | 
						|
 | 
						|
 | 
						|
struct  rfc2045ac {
 | 
						|
	void (*start_section)(struct rfc2045 *);
 | 
						|
	void (*section_contents)(const char *, size_t);
 | 
						|
	void (*end_section)();
 | 
						|
	} ;
 | 
						|
 | 
						|
struct rfc2045 *rfc2045_alloc_ac();
 | 
						|
int rfc2045_ac_check(struct rfc2045 *, int);
 | 
						|
int rfc2045_rewrite(struct rfc2045 *, int, int, const char *);
 | 
						|
int rfc2045_rewrite_func(struct rfc2045 *p, int,
 | 
						|
	int (*)(const char *, int, void *), void *,
 | 
						|
	const char *);
 | 
						|
 | 
						|
/* Internal functions */
 | 
						|
 | 
						|
int rfc2045_try_boundary(struct rfc2045 *, int, const char *);
 | 
						|
char *rfc2045_mk_boundary(struct rfc2045 *, int);
 | 
						|
const char *rfc2045_getattr(const struct rfc2045attr *, const char *);
 | 
						|
void rfc2045_setattr(struct rfc2045attr **, const char *, const char *);
 | 
						|
 | 
						|
/* MIME content base/location */
 | 
						|
 | 
						|
char *rfc2045_content_base(struct rfc2045 *p);
 | 
						|
	/* This joins Content-Base: and Content-Location:, as best as I
 | 
						|
	** can figure it out.
 | 
						|
	*/
 | 
						|
 | 
						|
char *rfc2045_append_url(const char *, const char *);
 | 
						|
	/* Do this with two arbitrary URLs */
 | 
						|
 | 
						|
#ifdef  __cplusplus
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
#endif
 |