#ifndef LIBRARIES_PIPEUTIL_H
#define LIBRARIES_PIPEUTIL_H

// #ifndef PLFILE_H
// #include <plfile.h>
// #endif

#ifndef PLMSG_H
#include <plmsg.h>
#endif

/**********************************************************************/
/*                              BAUDLIST                              */
/**********************************************************************/

#define BE_DOWNLOADS 			 0x0001
#define BE_UPLOADS	 		 0x0002
#define BE_LOGONS			 0x0004

struct BaudEntry
{
	ULONG				 bn_BPS;
	ULONG				 bn_CPS;
	ULONG				 bn_Flags;
} ;

struct BaudNode
{
	struct Node		 	 bn_Node;
	struct BaudEntry		 bn_Entry;
} ;


/**********************************************************************/
/*                             EDITORLIST                             */
/**********************************************************************/

#define	REMOTEONLY		0
#define	LOCALONLY		1
#define	REMOTE&LOCAL		2

#define EDITORSFILE		"Pipeline:Config/PlMsg/Editors.Dat"

struct  Editor
{
	char		 	 name [EDITORNAME_LENGTH];
	int		 	 lo_access;
	int		 	 high_access;
	int		 	 type;
	int		 	 seglength;
};

struct	EditorNode
{
	struct 	Node	 	 en_Node;
	struct 	Editor		*editor;
	UBYTE			*seg;
	struct	List	 	 ScriptSegs; /* struct EdSegNode */
};

struct	EdSegData
{
	char			 esd_Name[80];
	UBYTE			*esd_Pointer;
} ;

struct	EdSegNode
{
	struct	Node	 	 esn_Node;
	struct	EdSegData	 esn_Data;
} ;

/**********************************************************************/
/*                             EDITORLINE                             */
/*                      For Message Editor's Use                      */
/**********************************************************************/

#define MESSAGE_TEXT       1
#define FILE_DESCRIPTION   2

struct  EditorLine
{
        struct  Line            *le;
        ULONG                    Flags;
        /* Message Editing Stuff */
        char                     From[36];
        char                     To[36];
        char                     Subject[36];
        BOOL                     Reply;
        struct  FiveDFido        FromAddress;
        struct  FiveDFido        DestAddress;
        ULONG                    MessageArea;
        ULONG                    MsgFlags;
        struct  WholeMessage    *ReplyMsg;
        /* File Description */
        char                     FileName[20];
        ULONG                    AreaNumber;			 
        char                    *FileDescription;
} ;

/**********************************************************************/
/*                             ARCHIVERS                              */
/**********************************************************************/

#define	ARCHIVERSFILE		"Pipeline:Config/Pipeline/Archivers.Dat"

struct	Archiver
{
	char			 Name[80];
	char			 Compress[256];
	char			 Extract[256];
	char			 Recog[256];
} ;

struct	ArchiverNode
{
	struct	Node		 an_Node;
	struct	Archiver	 an_Arc;
} ;

/**********************************************************************/
/*                              SCANINFO                              */
/*           for use with InitFileScanKey & InitMsgScanKey            */
/**********************************************************************/

#define  SA_NATURAL	1
#define  SA_ALPHA	2
#define  SA_CHRONO	3

#define	 SA_FORWARDS	1
#define  SA_BACKWARDS   2

struct	 ScanInfo
{
	/* INITFILESCANKEY() data */
	int	ScanFlag;	/* NATURAL/ALPHA/CHRONO */

	/* INITMSGSCANKEY() data  */
	ULONG	StartNumber; 	/* Message Number to start at, or 0 to start */
				/* at beginning of file.                     */

	/* GLOBAL data            */
	int	Direction;	/* FORWARDS/BACKWARDS */
	int	Buffer;		/* 32 is a nice one... */
	ULONG	Area;		/* File/Msg Area to Start At */
} ;

/**********************************************************************/
/*                             PROGRAMLOG                             */
/**********************************************************************/

#define PLFILE_LOG	1
#define PLMSG_LOG	2

/**********************************************************************/
/*                            SIG RELATED                             */
/**********************************************************************/

struct	SigNode
{
	struct	Node	sn_Node;
	char		sn_Tag[9]; /* 8 chars max! */
	char		sn_Desc[40];
	/* Access Levels */
	UWORD		sn_Low;
	UWORD		sn_High;
	struct	List	sn_MsgAreas;
	struct	List	sn_FileAreas;
} ;

/* Format for Pipeline:Config/Pipeline/Sigs.cfg */

/* Format : [Header SigSavedData]->LONG FileArea... LONG FileArea... etc...
	LONG -1... LONG MsgArea... LONG MsgArea... etc... LONG -1...
	[Header SigSavedData] etc.. etc.. EOF
*/
 
struct	SigSavedData
{
	char		ssd_Tag[9]; /* including null */
	char		ssd_Desc[40];
	UWORD		ssd_Low;
	UWORD		ssd_High;
} ;

#define SIGCONFIG "Pipeline:Config/Pipeline/Sigs.Cfg"


struct	AreaPickNode
{
	struct	Node	node;
	ULONG		number;
} ;

/**********************************************************************/
/*                      Address Parsing Routines                      */
/**********************************************************************/

struct	ReadAdrNode
{
	struct	Node		 ran_Node;
	struct	FidoAddress	*ran_Address;
} ;
	
#define FIDO_STANDARD_N		1
#define FIDO_STANDARD_R 	2
#define FIDO_STANDARD_RN 	3

/**********************************************************************/
/*                  Find(File|Message)FromDate Flags                  */
/**********************************************************************/

#define FMFD_EQUAL     0x0001
#define FMFD_LESS_THAN 0x0002
#define FMFD_MORE_THAN 0x0004
#define FMFD_MONTH     0x0008
#define FMFD_HOUR      0x0010
#define FMFD_MIN       0x0020
#define FMFD_SECONDS   0x0040
#define FMFD_DAY       0x0080

/**********************************************************************/
/*                         LoadMessage Flags                          */
/**********************************************************************/

#define LM_NOFIDOINFO  0x0001
#define LM_NEXTMSG     0x0002
#define LM_NOTEXT      0x0004

/**********************************************************************/
/*                        Template Definitions                        */
/**********************************************************************/

#define TEMPLATECONFIG "Pipeline:Config/Pipeline/Templates.Cfg"

struct	TemplateData
{
	LONG	CallsDay;
	LONG	MinsCall;
	LONG	MinsDay;
	LONG	FileRatio;
	LONG	ByteRatio;
	LONG	MaxBytes;
	LONG	MaxFiles;
	LONG	FreeFiles;
	LONG	FreeBytes;
	LONG	MaxMsgs;
} ;

struct	Template
{
	LONG			te_AccessLvl;
	UBYTE			te_Description[40];
	struct	List		te_MessageAreas;
	struct	List		te_FileAreas;
	struct	TemplateData	te_Data;
} ;

struct	TemplateNode
{
	struct	Node		tn_Node;
	struct	Template	tn_Template;
} ;

struct	TemplateAreaNode
{
	struct	Node		tan_Node;
	ULONG			tan_Low;
	ULONG			tan_High;
	ULONG			tan_Flags;
	BOOL			tan_FileOrMsg; /* 0 = File, 1 = Msg */
} ;

struct	SaveTemplate
{
	LONG			st_AccessLvl;
	UBYTE			st_Description[40];
	struct	TemplateData    st_Data;
	ULONG			st_FileAreas; /* Files saved First */
	ULONG			st_MsgAreas;  /* and then Messages */
} ;

struct  SaveAreaTemplate
{
	ULONG			sat_Low;
	ULONG			sat_High;
	ULONG			sat_Flags;
} ;

/**********************************************************************/
/*                           Config Update                            */
/**********************************************************************/

struct	ConfigUpdate
{
	/* Message Areas */
	void			(*FreeMsgAreaNodes)( struct List * );
	void			(*CloseLibraries)( void );
	int			(*MsgAreasLoad)( struct List * );
	int			(*OpenLibraries)( void );

	/* File Areas */
	void			(*ScanFileAreas)( void );
	void			(*FreeAreas)( void );

	/* General Configuration */
	int			(*LoadGeneralCfg)( struct GeneralCfg * );

	/* Editors */
	void			(*FreeEditorNodes)( struct List * );

	/* Baud Rates */
	void			(*FreeBaudList)( void );

	/* Xpr Protocols */
	void			(*FreeXprNodes)( struct List * );

	/* Archivers */
	int			(*ArchiverLoad)( void );
	void			(*FreeArchivers)( void );

	/* Sigs */
	void			(*FreeSigs)( struct List * );
} ;

struct	AreaAccess
{
	UWORD			aa_Num;
	UWORD			aa_Flags;
} ;

#endif /* LIBRARIES_PIPEUTIL_H */