rfc2045acchk.c
上传用户:s81996212
上传日期:2007-01-04
资源大小:722k
文件大小:3k
- /*
- ** Copyright 1998 - 1999 Double Precision, Inc. See COPYING for
- ** distribution information.
- */
- #if HAVE_CONFIG_H
- #include "config.h"
- #endif
- #include "rfc2045.h"
- #include <string.h>
- #if HAVE_STRINGS_H
- #include <strings.h>
- #endif
- #include <stdlib.h>
- #include <stdio.h>
- /* $Id: rfc2045acchk.c,v 1.4 2000/03/13 04:43:49 mrsam Exp $ */
- extern void rfc2045_enomem();
- int rfc2045_ac_check(struct rfc2045 *p, int rwmode)
- {
- int flag=0; /* Flag - rewriting suggested */
- struct rfc2045 *c;
- int hasnon7bit=p->has8bitchars;
- /* hasnon7bit: 8bit chars in this section or subsections */
- const char *te;
- int is8bitte;
- for (c=p->firstpart; c; c=c->next)
- if (!c->isdummy)
- {
- if (rfc2045_ac_check(c, rwmode)) flag=1;
- if (strcmp(c->content_transfer_encoding, "7bit") &&
- strcmp(c->content_transfer_encoding, "quoted-printable"))
- hasnon7bit=1;
- if (c->has8bitchars)
- p->has8bitchars=1;
- }
- if (RFC2045_ISMIME1DEF(p->mime_version) && !p->content_type)
- {
- if ((p->content_type=strdup("text/plain")) == 0)
- rfc2045_enomem();
- if (p->mime_version)
- {
- flag=1;
- }
- }
- if (RFC2045_ISMIME1DEF(p->mime_version)
- && !rfc2045_getattr(p->content_type_attr, "charset")
- && strncasecmp(p->content_type, "text/", 5) == 0)
- {
- rfc2045_setattr(&p->content_type_attr, "charset",
- rfc2045_getdefaultcharset());
- if (p->mime_version
- && p->firstpart == 0 /* sam - don't trigger rewrites on changes to multipart headers */
- )
- {
- flag=1;
- }
- }
- if (RFC2045_ISMIME1DEF(p->mime_version)
- && !p->content_transfer_encoding)
- {
- if ((p->content_transfer_encoding=strdup(
- hasnon7bit ? "8bit":"7bit")) == 0)
- rfc2045_enomem();
- if (p->mime_version
- && p->firstpart == 0 /* sam - don't trigger rewrites on changes to multipart headers */
- )
- {
- flag=1;
- }
- }
- #if 0
- if (RFC2045_ISMIME1DEF(p->mime_version)
- && strncmp(p->content_type, "text/", 5) == 0 && !hasnon7bit
- && strcmp(p->content_transfer_encoding, "7bit"))
- {
- if (p->mime_version)
- {
- flag=1;
- }
- }
- #endif
- if (RFC2045_ISMIME1DEF(p->mime_version))
- {
- /* Check for conversions */
- te=p->content_transfer_encoding;
- is8bitte=strcasecmp(te, "base64") &&
- strcasecmp(te, "quoted-printable") &&
- strcasecmp(te, "7bit"); /* 8 bit contents */
- if (is8bitte && !p->has8bitchars && !p->haslongline)
- {
- if (p->rw_transfer_encoding)
- free(p->rw_transfer_encoding);
- if ((p->rw_transfer_encoding=strdup("7bit")) == 0)
- rfc2045_enomem();
- flag=1;
- is8bitte=0;
- }
- if (rwmode == RFC2045_RW_7BIT && (is8bitte || p->haslongline))
- {
- if (p->rw_transfer_encoding)
- free(p->rw_transfer_encoding);
- if ((p->rw_transfer_encoding=strdup("quoted-printable"))
- == 0)
- rfc2045_enomem();
- flag=1;
- }
- else if (rwmode == RFC2045_RW_8BIT &&
- strcasecmp(te, "quoted-printable") == 0 &&
- !p->haslongline)
- {
- if (p->rw_transfer_encoding)
- free(p->rw_transfer_encoding);
- if ((p->rw_transfer_encoding=strdup(hasnon7bit
- ? "8bit":"7bit")) == 0)
- rfc2045_enomem();
- flag=1;
- }
- }
- if (!p->mime_version)
- {
- if ((p->mime_version=strdup("1.0")) == 0)
- rfc2045_enomem();
- }
- return (flag);
- }