static char rcsid[] = "@(#)$Id: headers.c,v 1.5 2006/05/30 16:33:21 hurtta Exp $";

/******************************************************************************
 *  The Elm (ME+) Mail System  -  $Revision: 1.5 $   $State: Exp $
 *
 *  Author: Kari Hurtta <hurtta+elm@posti.FMI.FI> (was hurtta+elm@ozone.FMI.FI)
 *****************************************************************************/

#include "def_mbox.h"
#include "hdr_imp.h"
#include "s_me.h"

DEBUG_VAR(Debug,__FILE__,"header");

void read_folder_headers_helper(entry,result)
     struct header_rec *entry;
     header_list_ptr result;
{
    header_list_ptr tmphdr;

    if (NULL != (tmphdr = locate_header_by_name(result,"Return-Path"))) {
	/* Required for POP or 
	 * when env_from_source == 2
	 */
	if (!entry->env_from[0]) {
	    return_path_to_env_from(entry,tmphdr->body);
	}
    }	

    if (NULL != (tmphdr = locate_header_by_name(result,"Message-Id"))) {
	strfcpy(entry->messageid, tmphdr->body, 
		sizeof entry->messageid);
    }

    if (NULL != (tmphdr = locate_header_by_name(result,"Content-Length"))) {
	entry->content_length = atol(tmphdr->body);
    }

    if (NULL != (tmphdr = locate_header_by_name(result,"Expires"))) {
	process_expiration_date(tmphdr->body, &(entry->status));
    }

    if (NULL != (tmphdr = locate_header_by_name(result,"Date"))) {
	parse_arpa_date(tmphdr->body, entry);
    }
    
    /* We need accept headers like:
     *    MIME-Version: (MetaSend v1.7) 1.0
     * and
     *    Mime-Version: 1.0 (NeXT Mail 4.2mach_patches v148.2)
     * And if version number is something other accept it but give 
     * warning when message is viewed or replied.
     */
    
    if (NULL != (tmphdr = locate_header_by_name(result,"MIME-Version"))) {

	char ** tokens = rfc822_tokenize(tmphdr->body);

	remove_space_tokenized(tokens);
	
	if (!tokens[0] || 0 != strcmp(tokens[0],"1") ||
	    !tokens[1] || 0 != strcmp(tokens[1],".") ||
	    !tokens[2] || 0 != strcmp(tokens[2],"0") ||
	    tokens[3]) {
	    int i;
	    entry->status |= MIME_MESSAGE|MIME_UNSUPPORTED;
	    DPRINT(Debug,9,(&Debug, 
			    "read_folder_headers_helper: Unsupported mime version '%s'\n",
			    tmphdr->body));
	    DPRINT(Debug,10,(&Debug, 
			    "      tokens:"));
	    for (i = 0; tokens[i]; i++) {
		DPRINT(Debug,10,(&Debug, 
				 " [%d]=%s",i,tokens[i]));
	    }
	    DPRINT(Debug,10,(&Debug, 
			     "\n"));
	} else {
	    entry->status |= MIME_MESSAGE;
	    DPRINT(Debug,9,(&Debug, 
			    "read_folder_headers_helper: MIME message\n"));
	}

	if (tmphdr->next_this_header &&
	    0 != istrcmp(tmphdr->body,tmphdr->next_this_header->body)) 
	    process_header_error(&(entry->header_error),
				 CATGETS(elm_msg_cat, MeSet, 
					 MeParseErrorMIMEVersion,
					 "PARSE ERROR: Several MIME-Version headers!"));
        

	free_rfc822tokenized(tokens);
    }    

    if (NULL != (tmphdr = locate_header_by_name(result,
						"X-ELM-OSV"))) {
	char value [20];
	
	if (mime_get_param("no-hdr-encoding",value,tmphdr->body,
			   sizeof value)) {
	    int i = atoi(value);
	    DPRINT(Debug,9,(&Debug,"-- no-hdr-encoding=%d\n",i));
	    if (i) 
		entry->status |= NOHDRENCODING;
	}
	
	if (mime_get_param("hdr-charset",value,tmphdr->body,
			   sizeof value)) {
	    entry->header_charset = MIME_name_to_charset(value,CHARSET_create);
	    DPRINT(Debug,9,(&Debug,"-- header-charset=%s\n",
			    entry->header_charset->MIME_name));
	}
    }
}

header_list_ptr read_folder_headers(read_state_ptr,folder,entry)
     READ_STATE read_state_ptr;
     struct folder_info *folder;
     struct header_rec *entry;
{
    char *buffer;
    int len;

    header_list_ptr result = NULL, last = NULL;

    while (copy_header_folder(folder,read_state_ptr, &buffer,&len)) {
	char * val;
	
	unfold_header(buffer,&len,entry);
	val = strchr(buffer,':');

	if (!val) {
	    panic("HEADERS PANIC",__FILE__,__LINE__,"read_folder_headers",
		  "bad return from copy_header_folder -- ':' not found",0);
	}

	*val = '\0';
	val++;

	while (whitespace(*val))
	    val++;

	no_ret(val);

	update_header_list(&result,&last,buffer,val);

	free(buffer); buffer = NULL;
    }
    
    read_folder_headers_helper(entry,result);

    return result;
}




/*
 * Local Variables:
 *  mode:c
 *  c-basic-offset:4
 *  buffer-file-coding-system: iso-8859-1
 * End:
 */



syntax highlighted by Code2HTML, v. 0.9.1