#ifndef _MAILEXT_H
#define _MAILEXT_H

/*
 *	_ M A I L E X T . H
 *
 *	Microsoft Mail 4.0 for Windows, Windows NT, and Macintosh
 *	Copyright (C) 1993, Microsoft Corporation
 *
 *	Information in this document is subject to change without notice and does
 *	not represent a commitment on the part of Microsoft Corporation.
 *
 *	This header file contains internal Capone extensibility declarations, and
 *	should not be exported beyond the Capone project.  Most of these will
 *	change as the full extensibility infrastructure arrives.
 */


/*
 *	D o u b l e   S e c r e t   M e s s a g e   E x t e n s i b i l i t y
 */


/*
 *	IMailExtMessages
 *
 *	Purpose:
 *		Interface implemented by mail client super extensions that wish to
 *		handle the behavior of messages.
 */
#undef INTERFACE
#define INTERFACE   IMailExtMessages

DECLARE_INTERFACE_(IMailExtMessages, IUnknown)
{
    // *** IUnknown methods ***
    STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * lppvObj) PURE;
    STDMETHOD_(ULONG,AddRef) (THIS) PURE;
    STDMETHOD_(ULONG,Release) (THIS) PURE;

    // *** IMailExtMessages methods ***
	STDMETHOD(DoVerb) (THIS_ LPMAPISESSION pses, LPMDB pmdb, LPMESSAGE pmsg,
					   LPENTRYID peid, ULONG cbEid, LPTSTR szMessageClass,
					   LONG iVerb, LPMAPIVIEWCONTEXT lpViewContext,
					   ULONG hwndParent, LPCRECT lprcPosRect, 
					   ULONG ulFlags) PURE;
	STDMETHOD(Print) (THIS_ LPMAPISESSION pses, LPMDB pmdb, LPMESSAGE pmsg,
					  LPENTRYID peid, ULONG cbEid, LPTSTR szMessageClass,
					  const TCHAR* szDriver, const TCHAR* szDevice,
					  const TCHAR* szPort, DWORD dwPrintQuality, 
					  DWORD dwFlags, ULONG ulFlags) PURE;
};
typedef IMailExtMessages FAR * LPMAILEXTMESSAGES;


#ifndef MAC
DEFINE_MAILEXTGUID(IID_IMailExtMessages, 0x18);
#endif


/*
 *	I n t e r n a l   E x t e n s i b i l i t y   A P I
 */


// Extension structure
typedef struct _mx
{
	HINSTANCE hinst;					// Instance handle of DLL

	LPMAILEXT pme;						// MailExt interfaces of extension
	LPMAILEXTCOMMANDS pmec;				//
	LPMAILEXTEVENTS pmee;				//
	LPMAILEXTPROPERTYSHEETS pmeps;		//
	LPMAILEXTADVANCEDCRITERIA pmeac;	//
	LPMAILEXTMESSAGEEVENTS pmeme;		//
	LPMAILEXTATTACHEDFILEEVENTS pmeafe;	//
	LPMAILEXTMESSAGES pmem;				//
}
MX;

// Extensibility structure
typedef struct _exten
{
	int cRef;
	int cmx;
	MX * pmx;
}
EXTEN;

// Shared extensibility information structure
typedef struct _shar
{
	ULONG cRef;
	LPTSTR szSharServ;
	LPTSTR szSharDir;
}
SHAR;

typedef struct IVlbEnum IVlbEnum;
// Initialization
SCODE ScMailExtInit(EXTEN * pexten, ULONG mecontext, HWND hwnd, 
							 LPMAPISESSION pses, LPADRBOOK pab,
							 LPMDB pmdb, LPMAPIPROP pmp);
VOID MailExtDeinit(EXTEN * pexten);

// Commands support
SCODE ScMailExtInstallCommands(EXTEN * pexten, LPMAILEXTCALLBACK pmecb, 
				HWND hwnd, HMENU hmenu, HWND hwndToolbar, 
				UINT dxToolbarButton, UINT ctbbBase);
VOID MailExtInitMenu(EXTEN * pexten, LPMAILEXTCALLBACK pmecb);
SCODE ScMailExtCommand(EXTEN * pexten, LPMAILEXTCALLBACK pmecb, UINT mni);
SCODE ScMailExtHelp(EXTEN * pexten, UINT mni, LPMAILEXTCALLBACK pmecb);
VOID MailExtQueryHelpText(EXTEN * pexten, UINT mni, ULONG ulFlags,
								   LPTSTR sz, UINT cch);
BOOL FMailExtQueryButtonInfo(EXTEN * pexten, UINT itbb, UINT ctbb, 
			   TBBUTTON const * pargtbb, HMENU hmenu, TBBUTTON * ptbb,
			   LPTSTR sz, ULONG cch);
SCODE ScMailExtResetToolbar(EXTEN * pexten, UINT dxToolbarButton);
SCODE ScMailExtOnNewMail(EXTEN *pexten,LPMAILEXTCALLBACK pmecb);

// Callback support
STDAPI_(LPMAILEXTCALLBACK) PmecbMailExtNew(HWND hwnd, LPMAPISESSION pses, 
										   LPADRBOOK pab, LPMDB pmdb, 
										   LPMAPIPROP pmp, IVlbEnum * pve,
										   HMENU * rghmenuMniMap);

// Additional helper in mapin\prop\prop.c
int MailExtPropertySheet(LPPROPSHEETHEADER ppshdr, EXTEN * pexten,
								  LPMAPISESSION pses, LPADRBOOK pab,
								  LPMDB pmdb, LPMAPIPROP pmp);

// Menu ID helper
STDAPI_(UINT) MniOfHmenu(HMENU hmenu, HMENU * rghmenuMniMap);
#ifdef WIN16
#define MniOfMenuSelect(_hmenu, _uitem, _rghmenuMniMap) \
	MniOfHmenu((HMENU) (_uitem), (_rghmenuMniMap))
#else
#define MniOfMenuSelect(_hmenu, _uitem, _rghmenuMniMap) \
	MniOfHmenu(GetSubMenu((_hmenu), (_uitem)), (_rghmenuMniMap))
#endif

#endif // _MAILEXT_H