+struct imap_fetch_part {
+ char desired_section[256];
+ FILE *output_fp;
+};
+
/*
* Individual field functions for imap_do_fetch_msg() ...
*/
* FIXME this is TOTALLY BROKEN!!!
*/
void imap_fetch_part(char *name, char *filename, char *partnum, char *disp,
- void *content, char *cbtype, size_t length)
+ void *content, char *cbtype, size_t length,
+ void *cbuserdata)
{
+ struct imap_fetch_part *imfp;
+
+ imfp = (struct imap_fetch_part *)cbuserdata;
- if (!strcasecmp(partnum, IMAP->desired_part)) {
+ if (!strcasecmp(partnum, imfp->desired_section)) {
cprintf("part=%s|%s|%s|%s|%s|%d\r\n",
- name, filename, partnum, disp, cbtype, length);
+ name, filename, partnum, disp, cbtype, length, NULL);
}
}
long bytes_remaining = 0;
long blocksize;
long pstart, pbytes;
+ struct imap_fetch_part imfp;
/* extract section */
strcpy(section, item);
* Anything else must be a part specifier.
*/
else {
- safestrncpy(IMAP->desired_part, section,
- sizeof(IMAP->desired_part));
- mime_parser(msg->cm_fields['M'], NULL, *imap_fetch_part);
+ safestrncpy(imfp.desired_section, section,
+ sizeof(imfp.desired_section));
+ imfp.output_fp = tmp;
+
+ mime_parser(msg->cm_fields['M'], NULL,
+ *imap_fetch_part,
+ (void *)&imfp);
}
char *cbdisp,
void *cbcontent,
char *cbtype,
- size_t cblength)
+ size_t cblength,
+ void *cbuserdata),
+ void *userdata
)
{
/* If this part is not encoded, send as-is */
if (strlen(encoding) == 0) {
CallBack(name, filename, partnum, disposition, part_start,
- content_type, length);
+ content_type, length, userdata);
return;
}
if ((strcasecmp(encoding, "base64"))
if (bytes_recv > 0)
CallBack(name, filename, partnum, disposition, decoded,
- content_type, bytes_recv);
+ content_type, bytes_recv, userdata);
phree(decoded);
}
char *cbdisp,
void *cbcontent,
char *cbtype,
- size_t cblength)
+ size_t cblength,
+ void *cbuserdata),
+ void *userdata
)
{
if (is_multipart) {
/* Tell the client about this message's multipartedness */
- CallBack("", "", partnum, "", NULL, content_type, 0);
+ CallBack("", "", partnum, "", NULL, content_type, 0, userdata);
/* Figure out where the boundaries are */
sprintf(startary, "--%s", boundary);
}
the_mime_parser(nested_partnum,
part_start, part_end,
- CallBack);
+ CallBack, userdata);
}
part_start = ptr;
}
mime_decode(partnum,
part_start, length,
content_type, encoding, disposition,
- name, filename, CallBack);
+ name, filename, CallBack, userdata);
}
char *cbdisp,
void *cbcontent,
char *cbtype,
- size_t cblength)
+ size_t cblength,
+ void *cbuserdata),
+ void *userdata
)
{
lprintf(9, "mime_parser() called\n");
- the_mime_parser("", content_start, content_end, CallBack);
+ the_mime_parser("", content_start, content_end, CallBack, userdata);
}
char *cbdisp,
void *cbcontent,
char *cbtype,
- size_t cblength)
+ size_t cblength,
+ void *cbuserdata),
+ void *userdata
);
* Callback function for mime parser that simply lists the part
*/
void list_this_part(char *name, char *filename, char *partnum, char *disp,
- void *content, char *cbtype, size_t length)
+ void *content, char *cbtype, size_t length,
+ void *cbuserdata)
{
cprintf("part=%s|%s|%s|%s|%s|%d\n",
* Callback function for mime parser that opens a section for downloading
*/
void mime_download(char *name, char *filename, char *partnum, char *disp,
- void *content, char *cbtype, size_t length)
+ void *content, char *cbtype, size_t length,
+ void *cbuserdata)
{
/* Silently go away if there's already a download open... */
* Callback function for mime parser that wants to display text
*/
void fixed_output(char *name, char *filename, char *partnum, char *disp,
- void *content, char *cbtype, size_t length)
+ void *content, char *cbtype, size_t length,
+ void *cbuserdata)
{
char *ptr;
char *wptr;
} else {
/* Parse the message text component */
mptr = TheMessage->cm_fields['M'];
- mime_parser(mptr, NULL, *mime_download);
+ mime_parser(mptr, NULL, *mime_download, NULL);
/* If there's no file open by this time, the requested
* section wasn't found, so print an error
*/
/* Tell the client about the MIME parts in this message */
if (TheMessage->cm_format_type == FMT_RFC822) {
if (mode == MT_CITADEL) {
- mime_parser(mptr, NULL, *list_this_part);
+ mime_parser(mptr, NULL, *list_this_part, NULL);
}
else if (mode == MT_MIME) { /* list parts only */
- mime_parser(mptr, NULL, *list_this_part);
+ mime_parser(mptr, NULL, *list_this_part, NULL);
if (do_proto) cprintf("000\n");
CtdlFreeMessage(TheMessage);
return(om_ok);
if (TheMessage->cm_format_type == FMT_RFC822) {
CtdlAllocUserData(SYM_MA_INFO, sizeof(struct ma_info));
memset(ma, 0, sizeof(struct ma_info));
- mime_parser(mptr, NULL, *fixed_output);
+ mime_parser(mptr, NULL, *fixed_output, NULL);
}
/* now we're done */
int num_msgs; /* Number of messages being mapped */
long *msgids;
unsigned int *flags;
- char desired_part[256]; /* for part fetches */
};
/*