/* Filer.h
 * Header file for the Filer program.  This file should be pre-compiled to
 * save compile time.
 */

/* .... INCLUDES .... */
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <functions.h>
#include <exec/memory.h>
#include <exec/execbase.h>
#include <libraries/dosextens.h>
#include <devices/input.h>
#include <devices/inputevent.h>
#include <rexx/rexxio.h>
#include <rexx/rxslib.h>
#include <rexx/errors.h>
#include <intuition/intuitionbase.h>

/* .... DEFINES .... */
#define DOS_REV 33
#define GRAPHICS_REV 33
#define INTUITION_REV 33
#define REXX_REV 0L
#define REXXAPP_REV 0L
#define BCOL 0
#define FCOL 1
#define RAW 1101
#define KEY 1102
#define SIZE 1103
#define NAME 1104
#define PROJECTMENU 0
#define NEWFILE 0
#define OPENFILE 1
#define SAVEFILE 2
#define QUIT 3
#define EDITMENU 1
#define ADDNEWRECORD 0
#define VIEWRECORD 1
#define ANOTHER 500
#define NUMCMDS 13
#define MAXFIELDS 12
#define REXXAPPNAME "rexxapp.library"
#define XORIGIN 0
#define YORIGIN 10
#define XLENGTH 80
#define YLENGTH 10
#define XDELTA  235
#define YDELTA  45
#define FWINDOWIDCMP CLOSEWINDOW|MENUPICK|ACTIVEWINDOW|INACTIVEWINDOW
#define FWINDOWFLAGS WINDOWCLOSE|ACTIVATE|NOCAREREFRESH
#define NFWINDOWIDCMP CLOSEWINDOW|GADGETUP
#define NFWINDOWFLAGS WINDOWCLOSE|ACTIVATE|NOCAREREFRESH|WINDOWDEPTH|WINDOWDRAG
#define NRWINDOWIDCMP NFWINDOWIDCMP
#define NRWINDOWFLAGS NFWINDOWFLAGS

/* .... STRUCTURE DECLARATIONS .... */
struct CmdEntry {
		char *CmdString;
		APTR CmdHandler;
        };

struct RexxData {
		struct MsgPort RexxPort;
		char *Exten;
		APTR Func;
		struct RxsLib *RexxLib;
		APTR Error;
		APTR Result;
		ULONG RexxMask;
		ULONG UserData;
		struct CmdEntry AsscList[NUMCMDS];
        };

struct definition {
		struct Node defNode;
		UBYTE type;
		UBYTE size;
		char Name[14];
        };

struct myGlobals {
                 char    *success_str;
                 char    *error_str;
                 char    *return_str;
                 long     return_str_length;
                 BPTR     fileptr;
                 ULONG    PortSignal;
                 ULONG    RexxSignal;
                 ULONG    ASyncSignal;
                 ULONG    waitsigs;
                 struct   Window *myWindow;
                 struct   List *deflist;
                 char     FileName[112];
                 int      fieldcount;
                 BOOL     sleeping;
                 BOOL     window_inactive;
                 BOOL     all_done;
        };

/* .... FUNCTION PROTOTYPES ....  */
void Close_Libs(void);
void freedeflist(void);
void inform(struct Window *);
void DeleteArgstring(STRPTR);
void close_input_handler(void);
void DeleteRexxMsg(struct RexxMsg *);
void FreeRexxPort(struct RexxData *);
void ReceiveRexx(struct RexxData *);
void releasegadget(struct Gadget *, UBYTE);
void error_rtn(ULONG, char *, struct RexxMsg *, struct RexxData *);
void process_rtn(ULONG, char *, struct RexxMsg *, struct RexxData *);
void SetupResults(LONG, LONG, STRPTR, struct RexxMsg *, struct RexxData *);
BOOL closeit(void);
BOOL rexxcloseit(struct RexxMsg *, char *, struct RexxData *);
BOOL wakeup(void);
BOOL rexxwakeup(struct RexxMsg *, char *, struct RexxData *);
BOOL activate(void);
BOOL rexxactivate(struct RexxMsg *, char *, struct RexxData *);
BOOL newfile(void);
BOOL rexxnewfile(struct RexxMsg *, char *, struct RexxData *);
BOOL openfile(void);
BOOL rexxopenfile(struct RexxMsg *, char *, struct RexxData *);
BOOL savefile(void);
BOOL rexxsavefile(struct RexxMsg *, char *, struct RexxData *);
BOOL quitprog(void);
BOOL rexxquitprog(struct RexxMsg *, char *, struct RexxData *);
BOOL rexxsupplyfilename(struct RexxMsg *, char *, struct RexxData *);
BOOL rexxsupplyrecordstruct(struct RexxMsg *, char *, struct RexxData *);
BOOL rexxsupplyrecordsize(struct RexxMsg *, char *, struct RexxData *);
BOOL viewrecord(void);
BOOL rexxviewrecord(struct RexxMsg *, char *, struct RexxData *);
BOOL addnewrecord(void);
BOOL rexxaddnewrecord(struct RexxMsg *, char *, struct RexxData *);
BOOL writerecord(struct Gadget *, struct Window *);
BOOL Open_Libs(void);
BOOL processmenu(USHORT);
BOOL set_up_deflist(void);
BOOL getafilename(UBYTE *);
BOOL install_input_handler(struct MsgPort *);
BOOL addlistitem(char *, unsigned int, UBYTE);
BOOL dispatch(struct RexxMsg *, BOOL (*fpt)(struct RexxMsg *, char *,\
              struct RexxData *), char *, struct RexxData *);
ULONG SetRexxPort(STRPTR, struct RexxData *);
STRPTR CreateArgstring(STRPTR, ULONG);
struct Gadget *allocategadget(UBYTE);
struct RexxMsg *ASyncRexxCmd(STRPTR, struct RexxData *);
struct RexxMsg *CreateRexxMsg(struct RexxMsgPort *, STRPTR, STRPTR);
struct RexxMsg *SyncRexxCmd(STRPTR, struct RexxMsg *, struct RexxData *);
struct RexxMsg *SendRexxCmd(LONG, APTR, STRPTR, APTR, struct RexxMsg *,\
	struct RexxData *);
struct Window *Open_Window(SHORT, SHORT, SHORT, SHORT, ULONG, ULONG, UBYTE *,\
	struct Screen *);
extern void myEventhandler(void);

/* .... AREXX PRAGMAS .... */
#pragma amicall(RexxSysBase, 0x90, CreateRexxMsg(a0,a1,d0))
#pragma amicall(RexxSysBase, 0x7e, CreateArgstring(a0,d0))
#pragma amicall(RexxSysBase, 0x84, DeleteArgstring(a0))
#pragma amicall(RexxSysBase, 0x96, DeleteRexxMsg(a0))
