static char rcsid[] = "@(#)$Id: mimewalk.c,v 1.7 2006/04/09 07:37:30 hurtta Exp $"; /****************************************************************************** * The Elm (ME+) Mail System - $Revision: 1.7 $ $State: Exp $ * * Author: Kari Hurtta (was hurtta+elm@ozone.FMI.FI) *****************************************************************************/ #include "def_melib.h" #include "s_me.h" DEBUG_VAR(Debug,__FILE__,"mime"); struct walk_handler * malloc_walk_handler(t) struct handler_type *t; { struct walk_handler *ret; if (t->magic != WALKTYPE_magic) panic("MALLOC PANIC",__FILE__,__LINE__,"malloc_walk_handler", "Bad type magic number",0); ret = safe_malloc(sizeof(*ret)); /* bzero is defined hdrs/defs.h */ bzero((void *)ret,sizeof (*ret)); ret->magic = WALKHANDLER_magic; ret->handler_type = t; ret->u.dummy = NULL; ret->handler_type->mw_init(ret); return ret; } void free_walk_handler(ptr) struct walk_handler **ptr; { if ((*ptr)->magic != WALKHANDLER_magic) panic("MIME PANIC",__FILE__,__LINE__,"free_walk_handler", "Bad magic number",0); if ((*ptr)->handler_type->magic != WALKTYPE_magic) panic("MIME PANIC",__FILE__,__LINE__,"free_walk_handler", "Bad type magic number",0); (*ptr)->handler_type->mw_free(*ptr); if ((*ptr)->u.dummy) panic("MALLOC PANIC",__FILE__,__LINE__,"free_walk_handler", "Data not free'ed",0); free(*ptr); *ptr = NULL; } void simple_mime_walk(ptr,handler,state_in,state_out) mime_t *ptr; struct walk_handler *handler; in_state_t *state_in; out_state_t *state_out; /* May be NULL */ { int count; if (handler->magic != WALKHANDLER_magic) panic("MIME PANIC",__FILE__,__LINE__,"simple_mime_walk", "Bad magic number",0); if (handler->handler_type->magic != WALKTYPE_magic) panic("MIME PANIC",__FILE__,__LINE__,"simple_mime_walk", "Bad type magic number",0); if (ptr->magic != MIME_magic) mime_panic(__FILE__,__LINE__,"simple_mime_walk", "Bad mime magic number"); if (!ptr->parser_data) return; /* DATA not parsed */ count = mime_parser_subparts(ptr->parser_data); /* Non leaf data is handled recursively */ if (count > 0) { int i; for (i = 0; i < count; i++) { mime_t *att = mime_parser_index(ptr->parser_data,i); simple_mime_walk(att,handler,state_in,state_out); } return; } DPRINT(Debug,11,(&Debug, "simple_mime_walk -> state: offset=%ld, length=%ld -- \n", (long) ptr -> offset, (long) ptr -> length)); if (state_in) { /* DECODE Content first */ in_state_t newstate2; FILE *fp; in_state_clear(&newstate2,STATE_in_file); if (!in_state_seekable(state_in)) { mime_panic(__FILE__,__LINE__,"simple_mime_walk", "unsupported input state"); } if (in_state_fseek(state_in,ptr->offset) != 0) { /* state_nlputs or state_printf is needed for EOLN_is_CRLF conversions */ if (state_out) { state_puts("[ ",state_out); state_printf(state_out, CATGETS(elm_msg_cat, MeSet, MeXSeekFailed, "%s: seek failed"), "simple_mime_walk"); state_nlputs(" ]\n",state_out); } lib_error(CATGETS(elm_msg_cat, MeSet, MeXSeekFailed, "%s: seek failed"), "simple_mime_walk"); return; } /* If state_out is NULL, or state_out->filter == NULL then charset is not converted state_out->filter tells input charset (ie. charset of mime type .... messy??? ) */ if (state_out) state_out->filter = NULL; /* FORCE no conversion */ if (NULL != (fp=arrange_decoded(ptr,state_in,state_out, &newstate2,NULL))) { handler->handler_type->mw_action(handler,ptr, &newstate2,fp,state_out); fclose(fp); /* in_state_destroy do not close file */ } in_state_destroy(&newstate2); } else handler->handler_type->mw_action(handler,ptr,NULL,NULL,state_out); } /* * Local Variables: * mode:c * c-basic-offset:4 * buffer-file-coding-system: iso-8859-1 * End: */