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
|