/*
 *	The contents of this file are subject to the Netscape Public License 
 *	Version 1.0 (the "License"); you may not use this file except in compliance 
 *	with the License. You may obtain a copy of the License at 
 *	http://www.mozilla.org/NPL/. 
 *	
 *	Software distributed under the License is distributed on an "AS IS" basis, 
 *	WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 
 *	for the specific language governing rights and limitations under the License. 
 *	
 *	The Original Code is the Netscape Messaging Access SDK Version 3.5 code, 
 *	released on or about June 15, 1998. 
 *	
 *	The Initial Developer of the Original Code is Netscape Communications 
 *	Corporation. Portions created by Netscape are Copyright (C) 1998 Netscape 
 *	Communications Corporation. All Rights Reserved. 
 *	
 *	Contributor(s): ______________________________________. 
*/
  
/*
* Copyright (c) 1997 and 1998 Netscape Communications Corporation
* (http://home.netscape.com/misc/trademarks.html)
*/

/*
* mimeparser.h
* carsonl, jan 8,97
*
*/

#ifndef MIMEPARSER_H
#define MIMEPARSER_H

#include "nsmail.h"

#ifdef __cplusplus
extern "C" {
#endif


/* ---------------------------------------------- mimeDataSink ------------------------------------------- */

/* forward declaration */
struct mime_basicPart;
struct mime_multiPart;
struct mime_messagePart;
struct mime_message;

/* Forward declaration of the MIME data sink. */
typedef struct mimeDataSink * mimeDataSinkPtr_t;


typedef struct mimeDataSink
{
    /* Client data Opaque to the API. allocated / freed and managed by the client*/
    void * pOpaqueData;   

    void (*header)(mimeDataSinkPtr_t pSink, void *pCallbackObject, char *name, char *value );	/* mime headers */
    void (*addHeader)(mimeDataSinkPtr_t pSink, void *pCallbackObject, char *name, char *value);	/* additional header value */
    void (*endMessageHeader)(mimeDataSinkPtr_t pSink, void *pCallbackObject);			/* end of message hdrs */
    void (*contentType)(mimeDataSinkPtr_t pSink, void *pCallbackObject, int nContentType );	/* content type */
    void (*contentSubType)(mimeDataSinkPtr_t pSink, void *pCallbackObject, char * contentSubType );/* content sub type */
    void (*contentTypeParams)(mimeDataSinkPtr_t pSink, void *pCallbackObject, char * contentTypeParams );/* content type parameters */
    void (*contentID)(mimeDataSinkPtr_t pSink, void *pCallbackObject, char * contentID );		/* content ID */
    void (*contentMD5)(mimeDataSinkPtr_t pSink, void *pCallbackObject, char * contentMD5 );		/* content MD5 */
    void (*contentDisposition)(mimeDataSinkPtr_t pSink, void *pCallbackObject, int nContentDisposition ); /* content disposition */
    void (*contentDispParams)(mimeDataSinkPtr_t pSink, void *pCallbackObject, char * contentDispParams ); /* content disposition parameters */
    void (*contentDescription)(mimeDataSinkPtr_t pSink, void *pCallbackObject, char * contentDescription );/* content description */
    void (*contentEncoding)(mimeDataSinkPtr_t pSink, void *pCallbackObject, int nContentEncoding );	/* content encoding */
    void *(*startMessage)(mimeDataSinkPtr_t pSink);				/* signal start of message */
    void (*endMessage)(mimeDataSinkPtr_t pSink, void *pCallbackObject );	/* signal end of message */

    void *(*startBasicPart)(mimeDataSinkPtr_t pSink);						/* signal start of basicpart */
    void (*bodyData)(mimeDataSinkPtr_t pSink, void *pCallbackObject, char bodyData[], int len );	/* message data */
    void (*endBasicPart)(mimeDataSinkPtr_t pSink, void *pCallbackObject );	/* signal end of basicpart */

    void *(*startMultiPart)(mimeDataSinkPtr_t pSink);		/* signal start of multipart */
    void (*boundary)(mimeDataSinkPtr_t pSink, void *pCallbackObject, char * boundary );			/**/
    void (*endMultiPart)(mimeDataSinkPtr_t pSink, void *pCallbackObject );		/* signal end of multipart */

    void *(*startMessagePart)(mimeDataSinkPtr_t pSink);		/* signal start of messagepart */
    void (*endMessagePart)(mimeDataSinkPtr_t pSink, void *pCallbackObject );	/* signal end of messagepart */

} mimeDataSink_t;



int mimeDataSink_new (mimeDataSink_t ** out_ppDataSink);	/* constructor */
void mimeDataSink_free (mimeDataSink_t ** in_ppDataSink);	/* destructor */


/* ---------------------------------------------- mimeParser ------------------------------------------- */


struct mimeParser;

/* constructor */
int mimeDynamicParser_new (mimeDataSink_t * in_pDataSink, 
			   struct mimeParser ** out_ppParser);

/* destructor */
void mimeDynamicParser_free (struct mimeParser ** in_ppParser);

/* begin parsing new message */
int beginDynamicParse (struct mimeParser * in_pParser);

/* parse more data  (given as an input-stream) */
int dynamicParseInputstream (struct mimeParser * in_pParser, 
			    struct nsmail_inputstream *in_pInput);		

/* parse more data  (given as a data-buffer) */
int dynamicParse (struct mimeParser * in_pParser, char * in_pData, int in_nLen);

/* Tell the parser no more data to parse */
int endDynamicParse (struct mimeParser * in_pParser);

/* Parse an entire message in one shot. Data given as an input-stream */
int parseEntireMessageInputstream (struct nsmail_inputstream * in_pInput, 
				   struct mime_message ** out_ppMimeMessage);

/* Parse an entire message in one shot. Data given as data-buffer */
int parseEntireMessage (char * in_pData, int  in_nLen, 
			struct mime_message ** in_ppMimeMessage);


#ifdef __cplusplus
}
#endif


#endif /* MIMEPARSER_H */
