static char rcsid[] = "@(#)$Id: partial.c,v 1.12 2006/04/13 16:35:40 hurtta Exp $";
/******************************************************************************
* The Elm (ME+) Mail System - $Revision: 1.12 $ $State: Exp $
*
* Author: Kari Hurtta <hurtta+elm@posti.FMI.FI> (was hurtta+elm@ozone.FMI.FI)
*****************************************************************************/
#include "def_melib.h"
#include "s_me.h"
DEBUG_VAR(Debug,__FILE__,"mime");
void free_partial_vector(mss)
struct header_rec *mss;
{
if (mss->partial_vector) {
int i;
for (i = 0; i < mss->partial_len; i++) {
mss->partial_vector[i].reference = NULL;
if (mss->partial_vector[i].id) {
free (mss->partial_vector[i].id);
mss->partial_vector[i].id = NULL;
}
}
free(mss->partial_vector);
mss->partial_vector = NULL;
}
mss->partial_len = 0;
}
struct partial_vector *reg_partial(mss,reference)
struct header_rec *mss;
mime_t * reference;
{
int i;
CONST char *id;
CONST char *number;
CONST char *total;
/* Already collected? */
for (i = 0; i < mss->partial_len; i++) {
if (mss->partial_vector[i].reference == reference)
return (& (mss->partial_vector[i] ));
}
id = get_mime_param_compat(reference->TYPE_opts,"id");
if (!id) {
DPRINT(Debug,11,(&Debug,
"reg_partial: No id paramater -- corrupted.\n"));
return NULL;
}
number = get_mime_param_compat(reference->TYPE_opts,"number");
if (!number) {
DPRINT(Debug,11,(&Debug,
"reg_partial: No number paramater -- corrupted.\n"));
return NULL;
}
mss->partial_vector = safe_realloc(mss->partial_vector,
(mss->partial_len+1) *
sizeof (mss->partial_vector[0]));
mss->partial_vector[mss->partial_len].reference = reference;
mss->partial_vector[mss->partial_len].id = safe_strdup(id);
mss->partial_vector[mss->partial_len].number = atoi(number);
mss->partial_vector[mss->partial_len].total = -1;
total = get_mime_param_compat(reference->TYPE_opts,"total");
if (total)
mss->partial_vector[mss->partial_len].total = atoi(total);
return & (mss->partial_vector[mss->partial_len++]);
}
#if ANSI_C
mime_run_selector partial_selector;
CT_decoder partial_decode;
#endif
int partial_selector(p,hdr)
mime_t *p;
struct header_rec * hdr;
{
CONST char *id;
CONST char *number;
int ret = 0;
int fh = give_dt_enumerate_as_int(&fragment_handling);
id = get_mime_param_compat(p->TYPE_opts,"id");
if (!id) {
DPRINT(Debug,11,(&Debug,
"partial_selector: No id parameter -- corrupted.\n"));
ret |= NOTPLAIN_need_metamail;
}
number = get_mime_param_compat(p->TYPE_opts,"number");
if (!number) {
DPRINT(Debug,11,(&Debug,
"partial_selector: No number paremater -- corrupted.\n"));
ret |= NOTPLAIN_need_metamail;
}
/* fragment_handling: 0 == none,
1 == manual,
2 == auto */
if (0 == fh)
ret |= NOTPLAIN_need_metamail;
DPRINT(Debug,11,(&Debug,
"partial_selector(%p) = %d\n",
p,
ret));
return ret;
}
void partial_decode(ptr,s_in,s_out,defcharset,mss, badtype)
mime_t *ptr;
in_state_t *s_in;
out_state_t *s_out;
charset_t defcharset;
struct header_rec *mss;
type_mismatch_prompt *badtype;
{
int print = 0;
int fh = give_dt_enumerate_as_int(&fragment_handling);
state_nlputs("\n[ ",s_out);
state_printf(s_out,
CATGETS(elm_msg_cat, MeSet, MeMessageFragment,
"Message fragment"));
if (mss) {
struct partial_vector * r = reg_partial(mss,ptr);
if (r) {
state_printf(s_out,
CATGETS(elm_msg_cat, MeSet, MePartNum,
", part %d"),
r->number);
print = 1;
} else
state_printf(s_out,
CATGETS(elm_msg_cat, MeSet, MeCorrupted,
", corrupted"));
}
state_nlputs(". ]\n",s_out);
/* fragment_handling: 0 == none,
1 == manual,
2 == auto */
if (1 == fh && print &&
ptr == & mss->mime_rec && s_out->displaying)
state_printf(s_out,
CATGETS(elm_msg_cat, MeSet, MeAssembleCommand,
"[ Command 'A' assembles fragmented messages. ]\n"));
}
/*
* Local Variables:
* mode:c
* c-basic-offset:4
* buffer-file-coding-system: iso-8859-1
* End:
*/
syntax highlighted by Code2HTML, v. 0.9.1