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