able to view the attachments in the embedded submessage. Yow.
* Brought over the updated MIME parser from the Citadel package.
+Sat Oct 22 01:01:02 EDT 2005 ajc
+* More changes required to be able to do embedded message/rfc822 and still be
+ able to view the attachments in the embedded submessage. Yow.
+* Brought over the updated MIME parser from the Citadel package.
+
Fri Oct 21 15:25:49 EDT 2005 ajc
* Handle embedded message/rfc822 submessages, using the new form of MSG4 on
the Citadel server that can extract these for us. There is still a bug or
#ifdef HAVE_ICONV
if ( (strcasecmp(charset, "us-ascii"))
- && (strcasecmp(charset, "UTF-8")) ) {
+ && (strcasecmp(charset, "UTF-8"))
+ && (strcasecmp(charset, ""))
+ ) {
ic = iconv_open("UTF-8", charset);
if (ic == (iconv_t)(-1) ) {
- lprintf(5, "iconv_open() failed: %s\n", strerror(errno));
+ lprintf(5, "%s:%d iconv_open() failed: %s\n", __FILE__, __LINE__, strerror(errno));
}
}
if (ic != (iconv_t)(-1) ) {
"TARGET=\"wc.%ld.%s\">"
"<IMG SRC=\"/static/diskette_24x.gif\" "
"BORDER=0 ALIGN=MIDDLE>\n"
- "Part %s: %s (%s, %d bytes)</A><br />\n",
+ "%s (%s, %d bytes)</A><br />\n",
msgnum, mime_partnum, mime_filename,
msgnum, mime_partnum,
- mime_partnum, mime_filename,
- mime_content_type, mime_length);
+ mime_filename,
+ mime_content_type, mime_length
+ );
}
/*** begin handler prep ***/
/* Set up a character set conversion if we need to (and if we can) */
#ifdef HAVE_ICONV
+ if (strchr(mime_charset, ';')) strcpy(strchr(mime_charset, ';'), "");
if ( (strcasecmp(mime_charset, "us-ascii"))
- && (strcasecmp(mime_charset, "UTF-8")) ) {
+ && (strcasecmp(mime_charset, "UTF-8"))
+ && (strcasecmp(mime_charset, ""))
+ ) {
ic = iconv_open("UTF-8", mime_charset);
if (ic == (iconv_t)(-1) ) {
- lprintf(5, "iconv_open() failed: %s\n", strerror(errno));
+ lprintf(5, "%s:%d iconv_open(UTF-8, %s) failed: %s\n", __FILE__, __LINE__, mime_charset, strerror(errno));
}
}
#endif
}
/* If there are attached submessages, display them now... */
- if (strlen(mime_submessages) > 0) {
+ if ( (strlen(mime_submessages) > 0) && (!section[0]) ) {
for (i=0; i<num_tokens(mime_submessages, '|'); ++i) {
extract_token(buf, mime_submessages, i, '|', sizeof buf);
/* use printable_view to suppress buttons */
}
-
/* Afterwards, offer links to download attachments 'n' such */
- if (strlen(mime_http) > 0) {
+ if ( (strlen(mime_http) > 0) && (!section[0]) ) {
wprintf("%s", mime_http);
}
/* Set up a character set conversion if we need to (and if we can) */
#ifdef HAVE_ICONV
if ( (strcasecmp(mime_charset, "us-ascii"))
- && (strcasecmp(mime_charset, "UTF-8")) ) {
+ && (strcasecmp(mime_charset, "UTF-8"))
+ && (strcasecmp(mime_charset, ""))
+ ) {
ic = iconv_open("UTF-8", mime_charset);
if (ic == (iconv_t)(-1) ) {
- lprintf(5, "iconv_open() failed: %s\n", strerror(errno));
+ lprintf(5, "%s:%d iconv_open() failed: %s\n", __FILE__, __LINE__, strerror(errno));
}
}
#endif
/*
* $Id$
*
- * This is the MIME parser for Citadel. Sometimes it actually works.
+ * This is the MIME parser for Citadel.
*
* Copyright (c) 1998-2005 by Art Cancro
* This code is distributed under the terms of the GNU General Public License.
part_start = NULL;
do {
-
next_boundary = NULL;
for (srch=ptr; srch<content_end; ++srch) {
if (!memcmp(srch, startary, startary_len)) {
++length;
}
part_end = content_end;
- /* fix an off-by-one error */
- --part_end;
- --length;
+ /* fix an off-by-one error */
+ --part_end;
+ --length;
/* Truncate if the header told us to */
if ( (content_length > 0) && (length > content_length) ) {
else {
name = content_type_name;
}
-
+
+ /*
+ lprintf(9, "mime_decode part=%s, len=%d, type=%s, charset=%s, encoding=%s\n",
+ partnum, length, content_type, charset, encoding);
+ */
+
+ /* Ok, we've got a non-multipart part here, so do something with it.
+ */
mime_decode(partnum,
- part_start, length,
- content_type, charset, encoding, disposition,
- name, filename,
- CallBack, NULL, NULL,
- userdata, dont_decode);
+ part_start, length,
+ content_type, charset, encoding, disposition,
+ name, filename,
+ CallBack, NULL, NULL,
+ userdata, dont_decode
+ );
+
+ /*
+ * Now if it's an encapsulated message/rfc822 then we have to recurse into it
+ */
+ if (!strcasecmp(content_type, "message/rfc822")) {
+
+ if (PreMultiPartCallBack != NULL) {
+ PreMultiPartCallBack("", "", partnum, "",
+ NULL, content_type, charset,
+ 0, encoding, userdata);
+ }
+ if (CallBack != NULL) {
+ if (strlen(partnum) > 0) {
+ snprintf(nested_partnum,
+ sizeof nested_partnum,
+ "%s.%d", partnum,
+ ++part_seq);
+ }
+ else {
+ snprintf(nested_partnum,
+ sizeof nested_partnum,
+ "%d", ++part_seq);
+ }
+ the_mime_parser(nested_partnum,
+ part_start, part_end,
+ CallBack,
+ PreMultiPartCallBack,
+ PostMultiPartCallBack,
+ userdata,
+ dont_decode
+ );
+ }
+ if (PostMultiPartCallBack != NULL) {
+ PostMultiPartCallBack("", "", partnum, "", NULL,
+ content_type, charset, 0, encoding, userdata);
+ }
+
+
+ }
+
}
end_parser: /* free the buffers! end the oppression!! */
/* Set up a character set conversion if we need to */
#ifdef HAVE_ICONV
- if (strcasecmp(charset, "us-ascii") && strcasecmp(charset, "utf-8")) {
+ if (strcasecmp(charset, "us-ascii") && strcasecmp(charset, "utf-8") && strcasecmp(charset, "") ) {
ic = iconv_open("UTF-8", charset);
if (ic == (iconv_t)(-1)) {
- lprintf(5, "iconv_open() failed: %s\n", strerror(errno));
+ lprintf(5, "%s:%d iconv_open() failed: %s\n", __FILE__, __LINE__, strerror(errno));
goto ENDBODY;
}
}