/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the mingw-w64 runtime package.
 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
 */
#ifndef _MQMAIL_H
#define _MQMAIL_H

#ifdef __cplusplus
extern "C" {
#endif

#include <windows.h>
#include <windowsx.h>
#include <ole2.h>

  DEFINE_GUID(CLSID_MQMailQueueType,0x5eadc0d0,0x7182,0x11cf,0xa8,0xff,0x00,0x20,0xaf,0xb8,0xfb,0x50);

  typedef enum MQMailRecipType_enum {
    MQMailRecip_TO,MQMailRecip_CC,MQMailRecip_BCC
  } MQMailRecipType;

  typedef struct MQMailRecip_tag {
    LPSTR szName;
    LPSTR szQueueLabel;
    LPSTR szAddress;
    MQMailRecipType iType;
    LPFILETIME pftDeliveryTime;
    LPSTR szNonDeliveryReason;
  } MQMailRecip,*LPMQMailRecip;

  typedef struct MQMailRecipList_tag {
    ULONG cRecips;
    LPMQMailRecip *apRecip;
  } MQMailRecipList,*LPMQMailRecipList;

  typedef enum MQMailFormFieldType_enum {
    MQMailFormField_BOOL,MQMailFormField_STRING,MQMailFormField_LONG,MQMailFormField_CURRENCY,MQMailFormField_DOUBLE
  } MQMailFormFieldType;

  typedef union MQMailFormFieldData_tag {
    WINBOOL b;
    LPSTR lpsz;
    LONG l;
    CY cy;
    double dbl;
  } MQMailFormFieldData,*LPMQMailFormFieldData;

  typedef struct MQMailFormField_tag {
    LPSTR szName;
    MQMailFormFieldType iType;
    MQMailFormFieldData Value;
  } MQMailFormField,*LPMQMailFormField;

  typedef struct MQMailFormFieldList_tag {
    ULONG cFields;
    LPMQMailFormField *apField;
  } MQMailFormFieldList,*LPMQMailFormFieldList;

  typedef enum MQMailEMailType_enum {
    MQMailEMail_MESSAGE,MQMailEMail_FORM,MQMailEMail_TNEF,MQMailEMail_DELIVERY_REPORT,MQMailEMail_NON_DELIVERY_REPORT
  } MQMailEMailType;

  typedef struct MQMailMessageData_tag {
    LPSTR szText;
  } MQMailMessageData,*LPMQMailMessageData;

  typedef struct MQMailFormData_tag {
    LPSTR szName;
    LPMQMailFormFieldList pFields;
  } MQMailFormData,*LPMQMailFormData;

  typedef struct MQMailTnefData_tag {
    ULONG cbData;
    LPBYTE lpbData;
  } MQMailTnefData,*LPMQMailTnefData;

  typedef struct MQMailDeliveryReportData_tag {
    LPMQMailRecipList pDeliveredRecips;
    LPSTR szOriginalSubject;
    LPFILETIME pftOriginalDate;
  } MQMailDeliveryReportData,*LPMQMailDeliveryReportData;

  typedef struct MQMailEMail_tag MQMailEMail,*LPMQMailEMail;
  typedef struct MQMailNonDeliveryReportData_tag {
    LPMQMailRecipList pNonDeliveredRecips;
    LPMQMailEMail pOriginalEMail;
  } MQMailNonDeliveryReportData,*LPMQMailNonDeliveryReportData;

  typedef struct MQMailEMail_tag {
    LPMQMailRecip pFrom;
    LPSTR szSubject;
    WINBOOL fRequestDeliveryReport;
    WINBOOL fRequestNonDeliveryReport;
    LPFILETIME pftDate;
    LPMQMailRecipList pRecips;
    MQMailEMailType iType;
    __C89_NAMELESS union {
      MQMailFormData form;
      MQMailMessageData message;
      MQMailTnefData tnef;
      MQMailDeliveryReportData DeliveryReport;
      MQMailNonDeliveryReportData NonDeliveryReport;
    };
    LPVOID pReserved;
  } MQMailEMail,*LPMQMailEMail;

  STDAPI MQMailComposeBody(LPMQMailEMail pEMail,ULONG *pcbBuffer,LPBYTE *ppbBuffer);
  STDAPI MQMailParseBody(ULONG cbBuffer,LPBYTE pbBuffer,LPMQMailEMail *ppEMail);
  STDAPI_(void) MQMailFreeMemory(LPVOID lpBuffer);

#ifdef __cplusplus
}
#endif
#endif