/*++

Copyright (c) 1996-1999 Microsoft Corporation

Module Name:

    mqmail.h

Abstract:

    Master include file for Message Queue Exchange Connector 
                            or MAPI applications

--*/
#ifndef _MQMAIL_H
#pragma option push -b -a8 -pc -A- /*P_O_Push*/
#define _MQMAIL_H

#if _MSC_VER > 1000
#pragma once
#endif

#ifdef __cplusplus
extern "C" {
#endif // __cplusplus

//----------------------------------------------------------------
//mail type-id for queues
//----------------------------------------------------------------
#include <windows.h>
#include <windowsx.h>
#include <ole2.h>

/* 5eadc0d0-7182-11cf-a8ff-0020afb8fb50 */
DEFINE_GUID(CLSID_MQMailQueueType,
			0x5eadc0d0,
			0x7182, 0x11cf,
			0xa8, 0xff, 0x00, 0x20, 0xaf, 0xb8, 0xfb, 0x50);

//----------------------------------------------------------------
//recipient type (to, cc, bcc)
//----------------------------------------------------------------
typedef enum MQMailRecipType_enum
{
	MQMailRecip_TO,
	MQMailRecip_CC,
	MQMailRecip_BCC,
} MQMailRecipType;

//----------------------------------------------------------------
//recipient data
//----------------------------------------------------------------
typedef struct MQMailRecip_tag
{
	LPSTR			szName;				//display name of recipient
	LPSTR			szQueueLabel;		//queue label of recipient
	LPSTR			szAddress;			//address, queue-label or user@queue-label
	MQMailRecipType iType;				//recipient type (to, cc, bcc)
	LPFILETIME		pftDeliveryTime;	//delivery time (incase in a delivery report recipient list)
	LPSTR			szNonDeliveryReason;//non-delivery reason (incase in a non-delivery report recipient list)
} MQMailRecip, FAR * LPMQMailRecip;

//----------------------------------------------------------------
//recipient list
//----------------------------------------------------------------
typedef struct MQMailRecipList_tag
{
	ULONG cRecips;					//number of recips
	LPMQMailRecip FAR * apRecip;	//pointer to a block of recip pointers
} MQMailRecipList, FAR * LPMQMailRecipList;

//----------------------------------------------------------------
//types of value a form field can have
//----------------------------------------------------------------
typedef enum MQMailFormFieldType_enum
{
	MQMailFormField_BOOL,		//boolean data
	MQMailFormField_STRING,		//string data
	MQMailFormField_LONG,		//long data
	MQMailFormField_CURRENCY,	//currency data
	MQMailFormField_DOUBLE,		//double data
} MQMailFormFieldType;

//----------------------------------------------------------------
//union of available types of values
//----------------------------------------------------------------
typedef union MQMailFormFieldData_tag
{
	BOOL	b;			//use when type is MQMailFormField_BOOL
	LPSTR	lpsz;		//use when type is MQMailFormField_STRING
	LONG	l;			//use when type is MQMailFormField_LONG
	CY		cy;			//use when type is MQMailFormField_CURRENCY
	double	dbl;		//use when type is MQMailFormField_DOUBLE
} MQMailFormFieldData, FAR * LPMQMailFormFieldData;

//----------------------------------------------------------------
//form field
//----------------------------------------------------------------
typedef struct MQMailFormField_tag
{
	LPSTR						szName;	//name of field
	MQMailFormFieldType			iType;	//type of value (boolean, string)
	MQMailFormFieldData			Value;	//value (union of available types)
} MQMailFormField, FAR * LPMQMailFormField;

//----------------------------------------------------------------
//list of form fields
//----------------------------------------------------------------
typedef struct MQMailFormFieldList_tag
{
	ULONG cFields;						//number of fields
	LPMQMailFormField FAR * apField;	//pointer to a block of field pointers
} MQMailFormFieldList, FAR * LPMQMailFormFieldList;

//----------------------------------------------------------------
//types of EMail
//----------------------------------------------------------------
typedef enum MQMailEMailType_enum
{
	MQMailEMail_MESSAGE,			//text message
	MQMailEMail_FORM,				//form with fields
	MQMailEMail_TNEF,				//tnef data
	MQMailEMail_DELIVERY_REPORT,	//delivery report
	MQMailEMail_NON_DELIVERY_REPORT,//non-delivery report
} MQMailEMailType;

//----------------------------------------------------------------
//message specific data
//----------------------------------------------------------------
typedef struct MQMailMessageData_tag
{
	LPSTR			szText;						//message text
} MQMailMessageData, FAR * LPMQMailMessageData;

//----------------------------------------------------------------
//form specific data
//----------------------------------------------------------------
typedef struct MQMailFormData_tag
{
	LPSTR					szName;				//name of form
	LPMQMailFormFieldList	pFields;			//list of fields
} MQMailFormData, FAR * LPMQMailFormData;

//----------------------------------------------------------------
//tnef specific data
//----------------------------------------------------------------
typedef struct MQMailTnefData_tag
{
	ULONG	cbData;						//size of tnef data
	LPBYTE	lpbData;					//tnef data buffer
} MQMailTnefData, FAR * LPMQMailTnefData;

//----------------------------------------------------------------
//delivery report specific data
//----------------------------------------------------------------
typedef struct MQMailDeliveryReportData_tag
{
	LPMQMailRecipList	pDeliveredRecips;	//delivered recipients
	LPSTR				szOriginalSubject;	//original mail subject
	LPFILETIME			pftOriginalDate;	//original mail sending time
} MQMailDeliveryReportData, FAR * LPMQMailDeliveryReportData;

//----------------------------------------------------------------
//non-delivery report specific data
//----------------------------------------------------------------
typedef struct MQMailEMail_tag MQMailEMail, FAR * LPMQMailEMail;
typedef struct MQMailNonDeliveryReportData_tag
{
	LPMQMailRecipList	pNonDeliveredRecips;//non-delivered recipients
	LPMQMailEMail		pOriginalEMail;		//original mail
} MQMailNonDeliveryReportData, FAR * LPMQMailNonDeliveryReportData;

//----------------------------------------------------------------
//EMail basic data and specific form/message data
//----------------------------------------------------------------
typedef struct MQMailEMail_tag
{
	LPMQMailRecip		pFrom;						//sender
	LPSTR				szSubject;					//subject
	BOOL				fRequestDeliveryReport;		//request delivery report
	BOOL				fRequestNonDeliveryReport;	//request non-delivery report
	LPFILETIME			pftDate;					//sending time
	LPMQMailRecipList	pRecips;					//recipients
	MQMailEMailType		iType;						//type of EMail (message, form, etc...)
	union											//union of available EMail types
	{
		MQMailFormData		form;		            //use when type is MQMailEMail_FORM
		MQMailMessageData	message;	            //use when type is MQMailEMail_MESSAGE
		MQMailTnefData		tnef;		            //use when type is MQMailEMail_TNEF
		MQMailDeliveryReportData	DeliveryReport;		//use when type is MQMailEMail_DELIVERY_REPORT
		MQMailNonDeliveryReportData NonDeliveryReport;	//use when type is MQMailEMail_NON_DELIVERY_REPORT
	};
	LPVOID				pReserved;	//should be set to NULL
} MQMailEMail, FAR * LPMQMailEMail;

//----------------------------------------------------------------
//creates a falcon message body out of an EMail structure
//----------------------------------------------------------------
STDAPI MQMailComposeBody(LPMQMailEMail		pEMail,
						 ULONG FAR *		pcbBuffer,
						 LPBYTE FAR *		ppbBuffer);

//----------------------------------------------------------------
//creates an EMail structure out of a falcon message body
//----------------------------------------------------------------
STDAPI MQMailParseBody(ULONG				cbBuffer,
					   LPBYTE				pbBuffer,
					   LPMQMailEMail FAR *	ppEMail);

//----------------------------------------------------------------
//frees memory that was allocated by MQMail like *ppEmail in MQMailParseBody
// or *ppBuffer in MQMailComposeBody.
//----------------------------------------------------------------
STDAPI_(void) MQMailFreeMemory(LPVOID lpBuffer);


#ifdef __cplusplus
}
#endif
#pragma option pop /*P_O_Pop*/
#endif //_MQMAIL_H
