Logo Search packages:      
Sourcecode: maildrop version File versions  Download package

rfc2045acchk.c

/*
** Copyright 1998 - 2001 Double Precision, Inc.  See COPYING for
** distribution information.
*/

#if   HAVE_CONFIG_H
#include "rfc2045_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.7 2003/03/07 00:47:31 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 (c->content_transfer_encoding &&
                      strcmp(c->content_transfer_encoding, "7bit") &&
                      strcmp(c->content_transfer_encoding, "uuencode") &&
                        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, "uuencode") &&
                  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);
}

Generated by  Doxygen 1.6.0   Back to index