#ifndef __EXTERNALMASKHANDLER_H__
#define __EXTERNALMASKHANDLER_H__

/*
E - external
M - mask
H - handler
*/

//GetVendorInfo
typedef struct
{
	DWORD cbSize;//struct size as version
	LPWSTR pszShortName;
	LPWSTR pszFullName;
	LPWSTR pszVendorName;
	LPWSTR pszDescription;
	DWORD dwFlags;
	//... other come here
}EMH_VENDORINFO_DATA,*LPEMH_VENDORINFO_DATA;

#define EMH_VENDORINFO_MAX			0x00
#define EMH_VENDORINFO_SHORTNAME	0x01
#define EMH_VENDORINFO_FULLNAME		0x02
#define EMH_VENDORINFO_VENDORNAME	0x04
#define EMH_VENDORINFO_DESCR		0x08


#define EMH_GETVENDORINFO_NAME	_T("EMH_GetVendorInfo")
typedef HRESULT (__stdcall *PFN_EMH_GETVENDORINFO)(
	EMH_VENDORINFO_DATA* pData);

#define EMH_FREEVENDORINFO_NAME	_T("EMH_FreeVendorInfo")
typedef HRESULT (__stdcall *PFN_EMH_FREEVENDORINFO)(
	EMH_VENDORINFO_DATA* pData);
//

//GetMenuInfo
typedef struct
{
	DWORD cbSize;//struct size as version
	LPWSTR pszMenuText;
	LPWSTR pszActionText;
	//... other come here
}EMH_MENUINFO_DATA,*LPEMH_MENUINFO_DATA;

#define EMH_GETMENUINFO_NAME	_T("EMH_GetMenuInfo")
typedef HRESULT (__stdcall *PFN_EMH_GETMENUINFO)(
	EMH_MENUINFO_DATA* pData);

#define EMH_FREEMENUINFO_NAME	_T("EMH_FreeMenuInfo")
typedef HRESULT (__stdcall *PFN_EMH_FREEMENUINFO)(
	EMH_MENUINFO_DATA* pData);
//

//FLProcessExtrnMask
typedef struct
{
	DWORD cbSize;//struct size as version
	//... other come here
}EMH_PROCESS_INDATA,*LPEMH_PROCESS_INDATA;

typedef struct
{
	DWORD cbSize;//struct size as version
	LPWSTR pszText;
	//... other come here
}EMH_PROCESS_OUTDATA,*LPEMH_PROCESS_OUTDATA;

#define EMH_PROCESS_NAME	_T("EMH_Process")
typedef HRESULT (__stdcall *PFN_EMH_PROCESS)(
	LPCWSTR pszCommandLine,
	EMH_PROCESS_INDATA* pInData,
	EMH_PROCESS_OUTDATA* pOutData
	);
#define EMH_FREEPROCESS_OUTDATA_NAME	_T("EMH_FreeProcess_OutData")
typedef HRESULT (__stdcall *PFN_EMH_FREEPROCESS_OUTDATA)(
	EMH_PROCESS_OUTDATA* pInData);
//

//Setup - optional
typedef struct
{
	DWORD cbSize;//struct size as version
	HWND hWnd;
	//... other come here
}EMH_SETUP_DATA,*LPEMH_SETUP_DATA;

#define EMH_SETUP_NAME	_T("EMH_Setup")
typedef HRESULT (__stdcall *PFN_EMH_SETUP)(
	EMH_SETUP_DATA * pInData);
//

#ifdef COM_VERSION

//only for COM-version plugin
interface IExternalMaskHandler : public IUnknown
{
	virtual HRESULT (__stdcall EMH_GetVendorInfo)(
		EMH_VENDORINFO_DATA* pData)=0;

	virtual HRESULT (__stdcall EMH_FreeVendorInfo)(
		EMH_VENDORINFO_DATA* pData)=0;

	virtual HRESULT (__stdcall EMH_GetMenuInfo)(
		EMH_MENUINFO_DATA* pData)=0;

	virtual HRESULT (__stdcall EMH_FreeMenuInfo)(
		EMH_MENUINFO_DATA* pData)=0;

	virtual HRESULT (__stdcall EMH_Process)(
		LPCWSTR pszCommandLine,
		EMH_PROCESS_INDATA* pInData,
		EMH_PROCESS_OUTDATA* pOutData
		)=0;
	virtual HRESULT (__stdcall EMH_FreeProcess_OutData)(
		EMH_PROCESS_OUTDATA* pInData)=0;

	virtual HRESULT (__stdcall EMH_Setup)(
		EMH_SETUP_DATA * pInData)=0;
};
// {EDD8267C-FC65-4173-8226-A6A2D2F5CEFB}
static const GUID IID_IExternalMaskHandler = 
{ 0xedd8267c, 0xfc65, 0x4173, { 0x82, 0x26, 0xa6, 0xa2, 0xd2, 0xf5, 0xce, 0xfb } };

#endif

#define KEY_EMH_DIR	_T("EMHs")

#endif //__EXTERNALMASKHANDLER_H__