/*								     HTHeader.c
**	EXTRA HEADER MANAGER
**
**	(c) COPYRIGHT MIT 1995.
**	Please first read the full copyright statement in the file COPYRIGH.
**	@(#) $Id: HTHeader.c,v 2.12 1998/05/04 19:36:41 frystyk Exp $
**
** HISTORY:
**	2 Nov 95 HFN	Written on a rainy night
*/

/* Library Include files */
#include "wwwsys.h"
#include "HTUtils.h"
#include "HTString.h"
#include "HTParse.h"
#include "HTString.h"
#include "HTReq.h"
#include "HTHeader.h"					 /* Implemented here */
#include "HTMIMPrs.h"

#define MIME_HASH_SIZE 101
HTMIMEParseSet * ParseSet = NULL;
PRIVATE HTList * HTGenerators = NULL;

/* --------------------------------------------------------------------------*/

/*
**	Register a Header generator to be called when we make request
*/
PUBLIC BOOL HTGenerator_add (HTList * gens, HTPostCallback * callback)
{
    return callback ? HTList_addObject(gens, (void *) callback) : NO;
}

/*
**	Unregister a Header generator
*/
PUBLIC BOOL HTGenerator_delete (HTList * gens, HTPostCallback * callback)
{
    return callback ? HTList_removeObject(gens, (void *) callback) : NO;
}

/*
**	Delete the list of registered header generators.
*/
PUBLIC BOOL HTGenerator_deleteAll (HTList * gens)
{
    return HTList_delete(gens);
}

/* ------------------------------------------------------------------------- */
/* 		     GLOBAL LIST OF PARSERS AND GENERATORS		     */
/* ------------------------------------------------------------------------- */

/*
**	Global List of parsers. list can be NULL
*/
PUBLIC void HTHeader_setMIMEParseSet (HTMIMEParseSet * list)
{
    ParseSet = list;
}

PUBLIC HTMIMEParseSet * HTHeader_MIMEParseSet (void)
{
    return ParseSet;
}

PUBLIC BOOL HTHeader_addParser (const char * token, BOOL case_sensitive,
				HTParserCallback * callback)
{
    if (!ParseSet) ParseSet = HTMIMEParseSet_new(MIME_HASH_SIZE);
    return (HTMIMEParseSet_add(ParseSet, token, case_sensitive, callback) != NULL);
}

PUBLIC BOOL HTHeader_addRegexParser (const char * token, BOOL case_sensitive,
				     HTParserCallback * callback)
{
    if (!ParseSet) ParseSet = HTMIMEParseSet_new(MIME_HASH_SIZE);
    return (HTMIMEParseSet_addRegex(ParseSet, token, case_sensitive, callback) != NULL);
}

PUBLIC BOOL HTHeader_deleteParser (const char * token)
{
    return HTMIMEParseSet_delete(ParseSet, token);
}

/*
**	Global List of header generators. list can be NULL
*/
PUBLIC void HTHeader_setGenerator (HTList * list)
{
    HTGenerators = list;
}

PUBLIC HTList * HTHeader_generator (void)
{
    return HTGenerators;
}

PUBLIC BOOL HTHeader_addGenerator (HTPostCallback  * callback)
{
    if (!HTGenerators) HTGenerators = HTList_new();
    return HTGenerator_add(HTGenerators, callback);
}

PUBLIC BOOL HTHeader_deleteGenerator (HTPostCallback  * callback)
{
    if (!HTGenerators) return NO;
    return HTGenerator_delete(HTGenerators, callback);
}

/*
**	Convenience function to clean up
*/
PUBLIC void HTHeader_deleteAll (void)
{
    HTMIMEParseSet_deleteAll(ParseSet);
    if (HTGenerators) {
	HTGenerator_deleteAll(HTGenerators);
	HTGenerators = NULL;
    }
}
