rfc2045acchk.c
上传用户:s81996212
上传日期:2007-01-04
资源大小:722k
文件大小:3k
源码类别:

WEB邮件程序

开发平台:

C/C++

  1. /*
  2. ** Copyright 1998 - 1999 Double Precision, Inc.  See COPYING for
  3. ** distribution information.
  4. */
  5. #if HAVE_CONFIG_H
  6. #include "config.h"
  7. #endif
  8. #include "rfc2045.h"
  9. #include <string.h>
  10. #if HAVE_STRINGS_H
  11. #include <strings.h>
  12. #endif
  13. #include <stdlib.h>
  14. #include <stdio.h>
  15. /* $Id: rfc2045acchk.c,v 1.4 2000/03/13 04:43:49 mrsam Exp $ */
  16. extern void rfc2045_enomem();
  17. int rfc2045_ac_check(struct rfc2045 *p, int rwmode)
  18. {
  19. int flag=0; /* Flag - rewriting suggested */
  20. struct rfc2045 *c;
  21. int hasnon7bit=p->has8bitchars;
  22. /* hasnon7bit: 8bit chars in this section or subsections */
  23. const char *te;
  24. int is8bitte;
  25. for (c=p->firstpart; c; c=c->next)
  26. if (!c->isdummy)
  27. {
  28. if (rfc2045_ac_check(c, rwmode)) flag=1;
  29. if (strcmp(c->content_transfer_encoding, "7bit") &&
  30. strcmp(c->content_transfer_encoding, "quoted-printable"))
  31. hasnon7bit=1;
  32. if (c->has8bitchars)
  33. p->has8bitchars=1;
  34. }
  35. if (RFC2045_ISMIME1DEF(p->mime_version) && !p->content_type)
  36. {
  37. if ((p->content_type=strdup("text/plain")) == 0)
  38. rfc2045_enomem();
  39. if (p->mime_version)
  40. {
  41. flag=1;
  42. }
  43. }
  44. if (RFC2045_ISMIME1DEF(p->mime_version)
  45. && !rfc2045_getattr(p->content_type_attr, "charset")
  46. && strncasecmp(p->content_type, "text/", 5) == 0)
  47. {
  48. rfc2045_setattr(&p->content_type_attr, "charset",
  49. rfc2045_getdefaultcharset());
  50. if (p->mime_version
  51. && p->firstpart == 0 /* sam - don't trigger rewrites on changes to multipart headers */
  52. )
  53. {
  54. flag=1;
  55. }
  56. }
  57. if (RFC2045_ISMIME1DEF(p->mime_version)
  58. && !p->content_transfer_encoding)
  59. {
  60. if ((p->content_transfer_encoding=strdup(
  61. hasnon7bit ? "8bit":"7bit")) == 0)
  62. rfc2045_enomem();
  63. if (p->mime_version
  64. && p->firstpart == 0 /* sam - don't trigger rewrites on changes to multipart headers */
  65. )
  66. {
  67. flag=1;
  68. }
  69. }
  70. #if 0
  71. if (RFC2045_ISMIME1DEF(p->mime_version)
  72. && strncmp(p->content_type, "text/", 5) == 0 && !hasnon7bit
  73. && strcmp(p->content_transfer_encoding, "7bit"))
  74. {
  75. if (p->mime_version)
  76. {
  77. flag=1;
  78. }
  79. }
  80. #endif
  81. if (RFC2045_ISMIME1DEF(p->mime_version))
  82. {
  83. /* Check for conversions */
  84. te=p->content_transfer_encoding;
  85. is8bitte=strcasecmp(te, "base64") &&
  86. strcasecmp(te, "quoted-printable") &&
  87. strcasecmp(te, "7bit"); /* 8 bit contents */
  88. if (is8bitte && !p->has8bitchars && !p->haslongline)
  89. {
  90. if (p->rw_transfer_encoding)
  91. free(p->rw_transfer_encoding);
  92. if ((p->rw_transfer_encoding=strdup("7bit")) == 0)
  93. rfc2045_enomem();
  94. flag=1;
  95. is8bitte=0;
  96. }
  97. if (rwmode == RFC2045_RW_7BIT && (is8bitte || p->haslongline))
  98. {
  99. if (p->rw_transfer_encoding)
  100. free(p->rw_transfer_encoding);
  101. if ((p->rw_transfer_encoding=strdup("quoted-printable"))
  102. == 0)
  103. rfc2045_enomem();
  104. flag=1;
  105. }
  106. else if (rwmode == RFC2045_RW_8BIT &&
  107. strcasecmp(te, "quoted-printable") == 0 &&
  108. !p->haslongline)
  109. {
  110. if (p->rw_transfer_encoding)
  111. free(p->rw_transfer_encoding);
  112. if ((p->rw_transfer_encoding=strdup(hasnon7bit
  113. ? "8bit":"7bit")) == 0)
  114. rfc2045_enomem();
  115. flag=1;
  116. }
  117. }
  118. if (!p->mime_version)
  119. {
  120. if ((p->mime_version=strdup("1.0")) == 0)
  121. rfc2045_enomem();
  122. }
  123. return (flag);
  124. }