#ifndef VWDEFS_H
#define VWDEFS_H

typedef struct fdesc
	{
	SHORT	 FilterId;
	CHAR	 FilterType;
	CHAR	 FileDescription[40];
	} FILTER_DESC;

typedef struct VWINFOtag
	{
	DWORD	 VwCheck;
	WORD	 VwSaveSize;
	WORD	 VwDynamicSize;
	WORD	 VwStaticSize;
	WORD	 VwSpecLevel;
	WORD	 VwFilterLevel;
	WORD	 VwIdCount;
	WORD	 VwIds[15];
	BYTE	 VwDate[12];
	BYTE	 VwTime[10];
	WORD	 VwUserSaveSize;
	} VWINFO;

#define VWINFO_SAVESIZE 		1			/* WORD */
#define VWINFO_DYNAMICSIZE		2			/* WORD */
#define VWINFO_STATICSIZE			3			/* WORD */
#define VWINFO_SPECLEVEL			4			/* WORD */
#define VWINFO_FILTERLEVEL		5			/* WORD */
#define VWINFO_IDCOUNT				6			/* WORD */
#define VWINFO_IDS					7			/* Array of IDCOUNT WORDs */
#define VWINFO_DATE					8			/* string (max 12 bytes) */
#define VWINFO_TIME					9			/* string (max 10 bytes) */
#define VWINFO_USERSAVESIZE		10			/* WORD */
#define VWINFO_SECTIONSAVESIZE	11			/* WORD */
#define VWINFO_CHECK				12			/* DWORD */

// Here's another change to piss Phil off -- OS requires the linkage to modify the element name
// and therefore must occur after the *.  Sorry...

#ifdef OS2
#define VWFUNC_ELEMENT	* VW_ENTRYMOD
#endif

#ifdef WINDOWS
#define VWFUNC_ELEMENT	VW_ENTRYMOD *
#endif

#ifdef MAC
#define VWFUNC_ELEMENT	VW_ENTRYMOD *
#endif

typedef struct VWRTNStag
	{
	SHORT	 (VWFUNC_ELEMENT StreamOpen)(SOFILE, SHORT, BYTE VWPTR *, SOFILTERINFO VWPTR * ,HPROC);
	SHORT	 (VWFUNC_ELEMENT StreamSection)(SOFILE,HPROC);
	SHORT	 (VWFUNC_ELEMENT StreamRead)(SOFILE, HPROC);
	SHORT	 (VWFUNC_ELEMENT StreamTell)(SOFILE, HPROC);
	SHORT	 (VWFUNC_ELEMENT StreamSeek)(SOFILE, HPROC);
	BOOL	 (VWFUNC_ELEMENT GetInfo)(VOID VWPTR *, WORD, HPROC);
	VOID	 (VWFUNC_ELEMENT GetData)(VOID VWPTR *, HPROC);
	VOID	 (VWFUNC_ELEMENT SetData)(VOID VWPTR *, HPROC);
	VOID	 (VWFUNC_ELEMENT LocalUp)(HIOFILE, SOFILE VWPTR *, HPROC);
	VOID	 (VWFUNC_ELEMENT LocalDown)(SOFILE, HIOFILE VWPTR *, HPROC);
	HPROC	 (VWFUNC_ELEMENT AllocProc)(VOID);
	VOID	 (VWFUNC_ELEMENT FreeProc)(HPROC);
	VOID	 (VWFUNC_ELEMENT SetUser)(DWORD,DWORD,HPROC);
#ifdef OS2
	VOID	 (VWFUNC_ELEMENT SetSoRtn)(SHORT, VOID (* SO_ENTRYMOD)(), HPROC);
#else
	VOID	 (VWFUNC_ELEMENT SetSoRtn)(SHORT, VOID (SO_ENTRYMOD *)(), HPROC);
#endif
	VOID	 (VWFUNC_ELEMENT StreamClose)(SOFILE, HPROC);
	VOID	 (VWFUNC_ELEMENT GetSectionData)(VOID VWPTR *, HPROC);
	VOID	 (VWFUNC_ELEMENT SetSectionData)(VOID VWPTR *, HPROC);
	VOID	 (VWFUNC_ELEMENT StreamReadRecord)(SOFILE, DWORD, HPROC);
	VOID	 (VWFUNC_ELEMENT DoSpecial)(SOFILE, DWORD, DWORD, DWORD, DWORD, DWORD, HPROC);
	} VWRTNS;


#define VWRTN_STREAMOPEN			1
#define VWRTN_STREAMSECTION		2
#define VWRTN_STREAMREAD			3
#define VWRTN_STREAMTELL			4
#define VWRTN_STREAMSEEK			5
#define VWRTN_GETINFO				6
#define VWRTN_GETDATA				7
#define VWRTN_SETDATA				8
#define VWRTN_LOCALUP				9
#define VWRTN_LOCALDOWN 		10
#define VWRTN_ALLOCPROC 		11
#define VWRTN_FREEPROC				12
#define VWRTN_SETUSER				13
#define VWRTN_SETSORTN				14
#define VWRTN_STREAMCLOSE			15
#define VWRTN_GETSECTIONDATA		16
#define VWRTN_SETSECTIONDATA		17
#define VWRTN_STREAMREADRECORD	18
#define VWRTN_DOSPECIAL 		19

	/*
	|	 Error returns on the Open routine
	*/

#define VWERR_OK						0		/* file is OK */
#define VWERR_BADFILE				-2		/* corrupt or unreadable file */
#define VWERR_EMPTYFILE 		-3		/* empty file */
#define VWERR_PROTECTEDFILE		-4		/* password protected or encrypted file */
#define VWERR_SUPFILEOPENFAILS	-5		/* secondary file open failed */
#define VWERR_ALLOCFAILS			-6		/* memory allocation fails */
#define VWERR_TYPENOTSUPPORTED	-7		/* this flavor of the file type is not supported */
#define VWERR_THREADCREATEFAILS     -8      /* Win32 or OS/2 sould not create a thread to run the open,section or read routine in */
#define VWERR_TIMEOUT               -9      /* The filter has taken too long, we assume it is in a loop (used with threads in Win32 and OS/2) */

#endif /*VWDEFS_H*/