#ifndef MICRODOT_H
#define MICRODOT_H

//#define NO_RFC
#define NO_FIDO

#define __USE_SYSBASE 1
#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/graphics.h>
#include <proto/intuition.h>
#include <proto/wb.h>
#include <proto/diskfont.h>
#include <proto/reqtools.h>
#include <proto/icon.h>
#include <proto/utility.h>
#include <proto/iffparse.h>
#include <exec/memory.h>
#include <workbench/startup.h>
#include <libraries/reqtools.h>
#include <devices/console.h>
#include <devices/conunit.h>
#include <dos/stdio.h>
#include <cl/lists.h>
#define sprintf ansi_sprintf
//#ifndef MDV20
#include <stdio.h>
//#else
//typedef APTR FILE;
//#define EOF (-1)
//#endif
#undef sprintf
#define USE_BUILTIN_MATH
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>
#include <proto/datatypes.h>

#define GetIMsg(p) ((struct IntuiMessage*)GetMsg(p))

#define MDVER "1.18"
#define MDUPDVER 0x1011

#define MAILBFSIZE 16384

struct mwheader {
 UWORD chunksize;
 UWORD chunkreal;
};

#define CATCOMP_NUMBERS
#include "microdot_cat.h"
extern struct LocaleInfo localeinfo;
STRPTR __asm GetString(register __a0 struct LocaleInfo *li,
                       register __d0 LONG stringNum);
#define GS(id)	GetString(&localeinfo,id)

extern struct MsgPort *rexxport;
extern ULONG rexxsig, rexxmode;

extern char *pubscreenname;
extern char *sortinbuffer;

extern struct TagItem undertags[];
extern struct TextAttr top80;
extern UWORD screenpens[];
extern char *currentprefsname;
extern void *miscmempool;
extern int wbwindow;
extern int pgpavail;
extern struct Library *SocketBase;

/*extern UBYTE tolowertab[], touppertab[];
#undef tolower
#define tolower(x) tolowertab[x]
#undef toupper
#define toupper(x) touppertab[x]
*/

#define STUB rtEZRequest("not yet implemented","So was...",rinfo,0)

#define PLURALN(x) ((x)==1?"":"n")

/*static char *fileid="@$ID:" __FILE__ "*" __DATE__ "*" __TIME__ "*" MDVER "";*/

#define TMPMSGNAME "T:mdtemp.mdt"
#define TMPCOMMENTNAME "T:mdcomment.mdt"
#define TMPEDITNAME "T:mdeditmail.mdt"
#define TMPVIEWNAME "T:mdview.mdt"

#define LOGNAME "microdot.log"

#define MDCRYPTHEADER "X-MICRODOTCRYPT"

#define fsetbuf(f,s) setvbuf(f,NULL,_IOFBF,s)

#define XCW(xs) ((scr->Width-(xs))/2)
#define YCW(ys) ((scr->Height-(ys))/2)

#define MYPROC ((struct Process*)SysBase->ThisTask)

#define QSHIFT (IEQUALIFIER_LSHIFT|IEQUALIFIER_RSHIFT)
#define QCTRL (IEQUALIFIER_CONTROL)
#define ISSHIFT(i) ((i)->Qualifier&QSHIFT)
#define ISCTRL(i) ((i)->Qualifier&QCTRL)

#define FR_SORTIN 0
#define FR_INCLUDE 1
#define FR_EXCLUDE 2
#define FR_TERMUPLOAD 3
#define FR_PREFSMISC 4
#define FR_PROTOCOL 5
#define FR_EXCLUDE_BIN 6
extern struct rtFileRequester *fr[];

extern struct Window *w;
extern struct Screen *scr;
extern struct RastPort *rp;
extern char *progname;
extern struct MsgPort *appwindowmp;
extern ULONG appwindowsig;

extern long timezone_offset, timezone_dst;

extern int _OSERR;

struct mvnode {
	struct MinNode n;
	UBYTE	sel;
	UBYTE	pad[3];
	UBYTE *txt;
};

struct header {
	struct MinNode n;
	char *head;
	char *data;
};

/* Headerliste */
struct hlist
{
	struct MinList l;
	void *pool;
};

#ifdef MDV20
#define isv37 1
#define isv39 1
#define memf_no_expunge MEMF_NO_EXPUNGE
#else
extern USHORT isv39;
#define isv37 1
extern ULONG memf_no_expunge;
#endif

extern ULONG screenlines,screenxsize,screencols,fontysize,fontxsize,gyoffs,topoffs;
extern int topborderoffs;
extern struct TagItem menuhelpti[];

#define TH(x) ((x)/3600)
#define TM(x) (((x)/60)%60)
#define TS(x) ((x)%60)

struct reginfo {
/* 0*/ ULONG serie;
/* 4*/ void (*func1)();
/* 8*/ char *registriert_txt;
/*12*/ ULONG zero;
};
extern struct reginfo registerinfo;

struct mdprefs {
 USHORT oscantype;
 USHORT flags;

 char datadir[128];
 char transferdir[128];

 /* Pointprefs */
 char username[40];
 char userrealname[40];
 char oldpointname[12];
 char oldboxname[12];
 char boxdomain[40];
 char organisation[80];
 char postanschrift[128];
 char telefon[128];
 char password[40];
 char phone[128];

 char packer[40];
 char unpacker[40];
 char oldeditor[40];

 /* modem */
 char modemdevice[32];
 ULONG modemunit,modembaud,modemflags;
 char modeminit[80];
 char modemdial[80];
 char modemhangup[80];

 ULONG displayid; /* v37+ */
 USHORT colors[4]; /* RGB 16 */

 USHORT dialretries;
 USHORT dialtimeout; /* sekunden 90 */
 USHORT retrydelay; /* sec 5 */
 USHORT packtimeout; /* sec 20 * 60 */

 time_t firstinstalltime,
	    registertime,
        registersendkey;

 char sm_importbefore[ 128 ];
 char sm_importafter [ 128 ];
 char sm_exportbefore[ 128 ];
 char sm_exportafter [ 128 ];
 char sm_importfile  [ 128 ];
 char sm_exportfile  [ 128 ];

 ULONG counter;

 char binviewer[ 128 ];			/* Viewer für Binärfiles (i.d.R. Multiview) */

 char binex_defaulttool[ 80 ];	/* DefaultTool für Bin-Nachrichten */
 char txtex_defaulttool[ 80 ];	/* DefaultTool für Txt-Nachrichten */
 char dl_defaulttool   [ 80 ];	/* DefaultTool für Downgeloadete Dateien */

 char fkeys[20][128];			/* Funktionstastenbelegung für Terminal */

 UBYTE wz_fm, wz_fd;			/* Beginn Winterzeit */
 UBYTE sz_fm, sz_fd;			/* Beginn Sommerzeit */
 int   wz_offs, sz_offs;

 char  fontname[30];			/* Name des eingebauten Fonts */
 USHORT fontheight;

 USHORT tview_cols[2];

 /* Password */
 ULONG passwordcrc;				/* Password-Schutz für das ganze System */

 char  console_window[ 80 ];    /* MicroDOT-Konsolen-Fenster für ARexx usw. */

 ULONG zmodembuffer;			/* Z-Modem-Buffer in K */

 char maps_addprefix[ 20 ];
 char maps_delprefix[ 20 ];
 /* Reserved */
 ULONG xpkid;					/* XPK-Packer: Für Datenpacken */
 ULONG xpkmode;					/* XPK-Modus: Modus */

 UBYTE term_whichcolors;		/* 0 = Default, 1 = Custom */
 UBYTE term_reserved[ 2 ];
 UBYTE modem_dropdtr;			/* Auflegen per DTR-Drop */

 ULONG pgp_lastpassphrase;		// CRC der letzten Passphrase

 ULONG reorg_destsize;			// Zielgröße eines Puffers beim Reorg/Merge
 UBYTE reorg_merge;				// Flag: Merge-Gadget beim Reorg
 UBYTE key_violation;			// wenn 78, dann Msg rausschicken
 UBYTE sortinwin_small;
 UBYTE noixcache;				// Kein Index-Cache

 UBYTE hydra_autochat, hydra_nochattimeout;

 UBYTE rfc_control_filter;

 UBYTE checksumfailed;

 ULONG _prefs_reserved[ 5 ];

 ULONG killfile_hold;			// Days

 UBYTE quotepens[ 8 ];			// one for pad ;-)

 ULONG nextfreepuf;				/* Nächster freier Puffer in der Datenbank */

 UBYTE reqpos;					/* Requester-Position */
 UBYTE do_logfile;				/* Create microdot.log? */
 UBYTE std_maps_type;			/* Standard-Maps-Typ */
 UBYTE do_packmsg;				/* Packmodus */

 char  editor[128];				// Neuer Editor-Aufruf

 UBYTE rfc_packout;				/* efficiency and MDRFCF_GZIP */
 UBYTE rfc_window;				/* UUCICO window size */
 UBYTE rfc_flags;
 UBYTE mode;					/* MDM_JANUS, MDM_RFC */

 /* Neues Flaglongword, altes laeuft ueber */

 ULONG flags2;

 UBYTE clockmode;
 UBYTE ebmode;
 UBYTE usecustomcolors;
 UBYTE showboardtree;           /* Brettbaum anzeigen */

 UWORD swidth, sheight;

 char  binex_pfad[ 128 ];
 char  txtex_pfad[ 128 ];

 char  pointname[ 40 ];
 char  boxname[ 40 ];

 char  screenfontname[30];	/* Screen-Font */
 USHORT screenfontheight;

 char  gadfontname[30]; /* Gadgetleisten-Font */
 USHORT gadfontheight;

 char  mapsname[40];	/* Username von MAPS */
 char  mapsoutname[40]; /* Absender von MAPS-Nachrichten */
 char  maps_add[40];    /* Betreff für ADD-Kommando */
 char  maps_del[40];	/* Betreff für DEL-Kommando */
 char  maps_list[40];	/* Betreff für LIST-Kommando */
 char  maps_list_verbose[40]; /* Betreff für LIST VERBOSE-Kommando */
 char  maps_help[40];	/* Betreff für MAPS-HILFE-Kommando */
 char  maps_clearpm[40]; /* Betreff für MAPS-Clearpm-Kommando */
 char  maps_listid[40]; /* Betreff von Brettliste */
 ULONG maps_list_offs;  /* Betreff-Offset in Brettliste */

 UWORD window_x,
	   window_y;
 UWORD window_xs,
       window_ys;
 UBYTE wbwindow;
 UBYTE screendepth;

 ULONG colors32[3*8]; 	/* New V39 RGB8 Colors */

 UBYTE pointxfer;		/* Transfer-Protokoll Point */
 UBYTE netcall_save;	/* Netcall-Archive sichern? */

 UBYTE pens[ 8 * 3 ];

 ULONG sm_copybuf;		 /* Buffer for Sysop-Mode-Copy in KByte */

 ULONG maps_list_boffs;  /* Maps-Brettnamensoffset */

 ULONG editor_stack;
 ULONG viewer_stack;
 UBYTE editor_wb;
 UBYTE viewer_wb;

 UBYTE auto_ixcreate;	/* (alt!) Indizes automatisch generieren */
 UBYTE reader_tabsize;	/* Tabsize; 0 = 8 */

 char  userpassword[ 40 ];	/* Passwort für Online-Anruf */

 char  term_downloadpath[ 128 ];
 char  term_uploadpath[ 128 ];

 char  langnames[ 7 * 30 ]; /* 7 Sprachen... */

 char  pgp_userid[ 256 ];	/* Eigene UserID für PGP */
 UBYTE pgp_request;			/* siehe PGPR_* */
 UBYTE pgp_sendoneb;		/* Flag; Key bei EBs mitschicken */
 UBYTE pgp_autoaskpp;		/* Flag: Passphrase automatisch erfragen */
 UBYTE pgp_reserved;
 char  pgp_avail[ 128 ];	/* PGP-Key-Avail-Info */
 char  pgp_win[ 128 ];		/* Fenster für PGP-Aufruf */
 char  pgp_ring1[ 128 ];	/* Erster Keyring */
 char  pgp_ring2[ 128 ];	/* Zweiter Keyring */

 ULONG term_colors[ 3 * 8 ];

 UBYTE term_currentmdt[ 20 ];

 UBYTE rfc_mailfmt, rfc_newsfmt;
 UBYTE rfc_mailbatch, rfc_newsbatch;
 UBYTE rfc_cicocon[ 256 ];
 UBYTE rfc_cicoopts[ 128 ];
 UBYTE rfc_login[ 256 ];

 UBYTE sm_init[ 128 ];

 UBYTE maps_msgprefix[ 256 ]; // Text in MAPS-Nachrichten vor den Brettern

}; 

#define PGPR_IGNORE 0
#define PGPR_ALWAYS 1
#define PGPR_ASK 2

#define PACKMODE_NONE 0
#define PACKMODE_INTFAST 1
#define PACKMODE_INTSTD 2
#define PACKMODE_INTBEST 3
#define PACKMODE_XPK 4
#define PACKMODE_XPKPW 5

#define EBMODE_ASK 1
#define EBMODE_NEVER 2
#define EBMODE_00 4

#define CLOCKMODE_HHMMSS 0
#define CLOCKMODE_HHMM 1
#define CLOCKMODE_NONE 2

#define MDM_JANUS 0
#define MDM_RFC 1
#define MDM_N38 2

#define ISRFC (prefs.mode == MDM_RFC )
#define ISN38 (prefs.mode == MDM_N38 )

//#define MDRFCF_7BITTXT 1 /* Send 7 Bit texts */
//#define MDRFCF_7BITBIN 2 /* Send uuencoded Bins */

#define MDF(x) (1L<<x)

#define MDF_INTERLACE 1 /* 1.2/1.3 only */
#define MDF_NOREADERSTYLES 2 // changed!!!
#define MDF_NOICONS 4 /* do not create icons */
#define MDF_SHOWREAL 8
#define MDF_SHOWALL 16
#define MDF_SYSOPMODE 32
#define MDF_FILTERRE 64	/* Re's filtern */
#define MDF_SORTDATE 128
#define MDF_TIME00 16384
#define MDF_PASSWORD 32768

#define MDF_TERM_IBM 256
#define MDF_TERM_LOG 512
#define MDF_TERM_AUTODL 1024
#define MDF_TERM_AUTOUL 8192

#define MDF_EB 2048
#define MDF_GADGETS 4096

/* Zweites Flaglongword */
#define MDF2_AUTOLF MDF(0)
#define MDF2_CRUNCH_DAT MDF(1)
#define MDF2_CRUNCH_NEW MDF(2)
#define MDF2_CRUNCH_ALLREAD MDF(3)
#define MDF2_REPORT MDF(4)
#define MDF2_SCROLLJUMP MDF(5)
#define MDF2_ESCCLRNEW MDF(6)
#define MDF2_OWNSCREEN MDF(7)
#define MDF2_PUBSCREEN MDF(8)
#define MDF2_PREFSLOADED MDF(9)
#define MDF2_NOPREFS MDF(10)
#define MDF2_TERM_AUTOLOGIN MDF(11)
#define MDF2_NOLINKS MDF(12)
#define MDF2_ESCCLRONLYREAD MDF(13)
#define MDF2_CRUNCH_DUPES MDF(14)
#define MDF2_AUTOCLRNEW MDF(15)
#define MDF2_NEXTNEWBOARD MDF(16)
#define MDF2_NETCALLCRLF MDF(17)
#define MDF2_BREAKLOGIN MDF(18)
#define MDF2_HOLDOWNMAILS MDF(19)
#define MDF2_HARDDEL MDF(20)
#define MDF2_TERM_ZM8K MDF(21)
#define MDF2_OWNMAILSNEW MDF(22)
#define MDF2_OWNMAILSREAD MDF(22)
#define MDF2_NEXTNEWBOARDASK MDF(23)
#define MDF2_CLIPSAUG MDF(24)
#define MDF2_JANUS2 MDF(25)

#define ZMODEMAUTODOWNLOAD "*\030B00"
#define ZMODEMAUTOUPLOAD "*\030B01"

extern struct rtReqInfo *rinfo;

struct brett
{
	char   name[80]; /* ... */
/*80*/	char   betreff[32];
/*112*/	time_t lastwrite;	/* Letzter Schreibzugriff ins Brett */
/*116*/	ULONG flags;
/*120*/	ULONG unreadmails, mails,
           newmails;
	USHORT days;		/* Haltezeit in Tagen */
	UBYTE  language;	/* Sprache des Brettes */
	UBYTE  __breserved;
	ULONG  __reserved[8];
};

struct oldbrett
{
	char   name[42]; /* ... */
	char   betreff[32];
	USHORT unreadmails;
	USHORT flags;
	USHORT days;
	USHORT mails,
           newmails;
};


struct brettinfo {
	char diskussionin[80];		/* diskussionen in diesem brett */
	char autoexpfad[128];		/* pfad fuer autoexclude */
	char antwortan[128];		/* Default-Antwort-An für ausgehende Mails */

	char expm_header[ 32 ];		/* Ex-PM-Header (def.: ABS) */
	char expm_data[ 128 ];		/* Maske */
};

#define BFLAG_NOCRUNCH 1
#define BFLAG_NOORIGIN 2
#define BFLAG_SPECIALORIGIN 4
#define BFLAG_AUTOEXCLUDE 8
#define BFLAG_HASBINFO 16
#define BFLAG_TOUCHED 32
#define BFLAG_EXTEND_PM 64		/* Brett ist erweiterte PM */
#define BFLAG_AUTOMASK 128		/* Brett ist eine Autoeintrags-Maske */

#define MAPS_CUSTOM 0
#define MAPS_CONNECTLINE4 1
#define MAPS_FASTCALL 2
#define MAPS_JOKERSYSTEM 3
#define MAPS_ZERBERUS5 4
#define MAPS_INFIMAIL 5
#define MAPS_ALPHANET 6

struct mbrett
{
	struct Node n;
/*10*/    char   viewname[ 82 ];  /* Txt to view */
/*92*/	char   lastwritedate[ 8 ];	/* Date... */
/*100*/	struct brett b;
	struct brettinfo *brettinfo;
	struct AsyncFile *ixfile;	/* Index file */
	int	   rw;					/* Lesen oder Schreiben... */
	int    newmails;
	ULONG  namecrc;
};

extern struct List brettlist;
extern struct mdprefs prefs;

struct index /* OBSOLETE! */
{
	USHORT mailcount; /* Anzahl der Mails im Brett */
	USHORT sreserved1;
	ULONG lreserved1[2];
};

struct mindex
{
	struct MinNode n;	/* Liste aller Indizies */
	ULONG mailcount; /* Anzahl der Mails im Brett */
	void *mempool;
	struct List maillist;
	UWORD  usecount;	/* Usage counter */
	UWORD  changed;
	UWORD  rlinks;		// RLinks set
	struct mbrett *mb;	/* zu welchem Brett... */
};

struct mail
{
	time_t time; /* absendezeit */
	ULONG pufferID, mailID;	/* wo steht die nachricht... */
	ULONG maillen; /* Länge des Nachrichtenbodys */
	ULONG flags;
	ULONG midcrc, bezcrc, qbezcrc; /* Msg-ID-CRC32 & Bezugs-ID-CRC32 */
	time_t incomtime; /* Eingangszeit */
	char betreff[48];
	char absender[40];
	char absenderreal[32];
	ULONG reserved[2];
};

struct oldmail
{
	time_t time; /* absendezeit */
	ULONG maillen; /* Länge des Nachrichtenbodys */
	USHORT headeroffset; /* Offset des Headers ins File */
	USHORT flags; /* mailflags */
	ULONG midcrc,bezcrc; /* Msg-ID-CRC32 & Bezugs-ID-CRC32 */
	time_t incomtime; /* Eingangszeit */
	char betreff[32];
	char absender[32];
	char absenderreal[32];
};

struct dnode
{
	struct MinNode n;
	UBYTE bold; /* quote-Zeichen */
	UBYTE len;
	UBYTE *txt;
	UBYTE *sty;
};

struct mmail
{
	struct MinNode n;
	struct mmail *parent; /* mail ist bezug auf */
	struct mmail *bezlink; /* liste aller bezugsmail */
	struct mmail *firstbez; /* erster bezug auf diese mail */
	struct mail m; /* die eigentliche Mail */
	int reoffset;
};

struct vmail
{
	struct MinNode n;
	struct mmail *m;
	UBYTE indentspace[ 64 ];
	UBYTE savedsel;
	UBYTE sel;
	UBYTE indent; /* current indent amount */
	UBYTE pad;
	UBYTE kb[ 12 ];
	UBYTE date[ 12 ];
};

/* Mailflags */
#define MMF_READ 1
#define MMF_ARCHIVE 2
#define MMF_DEL 4
#define MMF_BIN 8
#define MMF_EB 16
#define MMF_CTL 32
#define MMF_FOLD 64			/* Thread ist eingefaltet */
#define MMF_KILL 128		/* kill it */
#define MMF_HASBEZ 256 		/* mail hat bezug */
#define MMF_OUT 512 		/* Ausgehende (in PM) */
#define MMF_UNSEEN 1024		/* ganz neu */
#define MMF_SHOW 2048 		/* als N anzeigen */
#define MMF_GOTEB 4096 		/* Empfangsbestätigung eingegangen */
#define MMF_MDCRYPT 8192 	/* Nachricht war per MD-Crypt verschlüsselt */
#define MMF_HASQBEZ 16384
#define MMF_RESTORED 32768		// Nachricht wiederhergestellt
#define MMF_PGPSIGNED 65536		// Nachricht wird/ist korrekt signiert
#define MMF_PGPCRYPT (65536*2)	// Nachricht war/wird PGP-verschlüsselt
#define MMF_RX1 	(65536*4)	// ARexx-Flag 1
#define MMF_RX2 	(65536*8)	// ARexx-Flag 2

struct pindex
{
	ULONG offset;		/* Begin Header */
	ULONG headersize;
	ULONG commentsize;
	ULONG datasize;
	UWORD flags;
};

#define PIF_KILLED 1	/* Eintrag ungültig */
#define PIF_PACKED 2	/* intern gepackt */
#define PIF_XPK 4		/* mit XPK gepackt */


struct msghandle
{
	struct AsyncFile *file;			/* Pufferdatei */
	struct pfhandle *pfh;
	struct pindex pix;	/* Pufferindex der Datei */
	ULONG	readmode;	/* mode */
	LONG	readremain; /* Bytes remaining */
	LONG	buffpos;	/* current buffer position */
};

/* Flags für msg_copy */

#define MC_HEADER 1
#define MC_COMMENT 2
#define MC_DATA 4


struct olduser {
	char	net[128];	/* Complete Net Address */
	char	realname[40]; /* Realname */
	char	comment[40]; /* Kommentar */
	ULONG	flags;		/* siehe unten */
	char	telefon[32]; /* Telefonnummer für Direktanwahl */
	ULONG	reserved[2];
};
struct user {
	char	net[ 128 ];	/* Complete Net Address */
	char	realname[ 40 ]; /* Realname */
	char	comment[ 40 ]; /* Kommentar */
	ULONG	flags;		/* siehe unten */
	char	telefon[ 32 ]; /* Telefonnummer für Direktanwahl */
	char	adresse[ 64 ]; /* Adresse (POST:-Header) */
	char	pgp_id[ 40 ];  /* PGP-Id */
	ULONG	groups[ 2 ];	/* 64 Gruppen-Bits */
	ULONG	reserved[ 30 ];	/* 128 Bytes reserved */
};
#define UNAME(u) (u.realname[0]?u.realname:u.net)
#define UNAMEP(u) (u->realname[0]?u->realname:u->net)

#define UF_PGP 2

struct muser {
	struct MinNode n;
	struct user u;
};

//
//	Terminal settings
//

struct mdtprefs {
	char	name[ 20 ];

	char	device[ 31 ];
	UBYTE   whichcolors;
	ULONG	unit;
	ULONG	baud;
	ULONG   flags;
    char	modeminit[ 80 ];
	char	modemdial[ 80 ];
	char	modemhangup[ 80 ];

	ULONG	reserved[ 20 ];
};

#define MDTF_7WIRE 1
#define MDTF_RADBOOGIE 2
#define MDTF_SHARED 4
#define MDTF_IGNORECARRIER 8
#define MDTF_7E1 16
#define MDTF_DROPDTR (1<<30)
#define MDTF_IBM (1<<31)

//
//	Phone-Book
//

struct mdphone {
	char	name[ 40 ];

	char	prefs[ 20 ];		// Which settings to use
	char	phone[ 128 ];		// Phone number
	char	username[ 80 ];		// Username
	char	password[ 80 ];		// Password
	UBYTE	autologin;			// Do autologin?

	UBYTE	reserved[ 3 ];
	ULONG	longreserved[ 40 ];
};

struct mmdphone {
	struct MinNode n;
	struct MinNode dialnode;	// Dial
	struct mdphone mdp;
};

/* Shared access semaphore resource */
struct mdresource {
	struct Library 			lib;		/* embedded lib node */
	struct SignalSemaphore  sem;		/* list protect semaphore */
	struct MinList			list;		/* list of active MDs */
	char   name[ 18 ];
	char   id[ 30 ];
};

struct mdsysnode {
	struct MinNode 	n;		/* for link into mdresource list */
	BPTR	datapath;		
	BPTR    transferpath;
	BPTR    progdir;
};

/* proto */

/* iso.a */
void  __asm siso2ibm(register __a0 char*);
void  __asm sibm2iso(register __a0 char*);
void  __asm bibm2iso(register __a0 char*,register __d0 int);
void  __asm sibmclnl(register __a0 char*);
extern UBYTE __ib2istab[], __is2ibtab[];
#define ibm2iso(x) __ib2istab[x]
#define iso2ibm(x) __is2ibtab[x]
int __asm biso2ibmnl( register __a0 char *from, register __a1 char *to, register __d0 int len );

void __asm scpy_iso2ibm( register __a0 char *from, register __a1 char *to );
void __asm scpy_ibm2iso( register __a0 char *from, register __a1 char *to );

/* sup.a */
void __asm skillatch( register __a0 STRPTR string, register __d0 UBYTE ch );
/*void __stdargs sprintf(char*,char*,...);*/
int __asm tstblock( register __a0 UBYTE *, register __d0 int );
struct Process * __asm CreateProc13( register __a0 void *, register __a1 char *, register __d0 ULONG, register __d1 LONG );
void __asm expandtabs( register __a0 char *, register __a1 char *, register __d0 int );
void __asm skillfirstspace( register __a0 char * );
void __stdargs asprintf(char*,char*,...);
void __asm clnl(register __a0 char*);
void __asm dofmt(register __a0 char*,register __a1 char*,register __a2 void*);
void __asm dofmtextabs(register __a0 char*,register __a1 char*,register __a2 void*);
void __asm callreg(register __d0 BPTR,register __a6 void*);
void * __asm myAllocVec(register __d0 ULONG,register __d1 ULONG);
void __asm myFreeVec(register __a1 void*);
void __asm sabd13(register __a1 struct RastPort*,register __d0 int,register __d1 int,register __d2 int,register __a6 struct GfxBase*);
extern void __asm (*sabd_func)(register __a1 struct RastPort*,register __d0 int,register __d1 int,register __d2 int,register __a6 struct GfxBase*);

extern void __asm setbit( register __a0 APTR bitfield, register __d0 int bitnum );
extern ULONG __asm tstbit( register __a0 APTR bitfield, register __d0 int bitnum );
extern ULONG __asm tstbitfield( register __a0 APTR bitfield, register __d0 int bitcount );


#ifndef MDV20
void __stdargs asprintf(char*,char*,...);
void __stdargs sprintf(char*,char*,...);
void __asm replacebigd( register __a0 STRPTR string );
#endif

/* crc32.a */
ULONG __asm crc32(register __a0 void*,register __d0 int);

/* main.c */
/*void settreecolors( void );*/
void execrexx( char *cmd );
void calcmaxpen( void );
void doresetcleanup( void );
ULONG mWait( ULONG );
void mWaitPort( struct MsgPort * );
int checkprograminpath( char * );
int checkprograminpathfull( char *, char * );
void savemenustate( struct Menu * );
void resetmenustate( struct Menu * );
void dorexxshell( void );
void dorexx( int );
void dorexxcmd( int, int );
void __stdargs addlogfile( char *, ...);
void doiconify( void );
void recalcwindowsize( void );
struct Border *makebevelborder( int, int, BOOL );
void *allocchipmem( int );
void opengui( void );
void selectpubscreen( void );
void closegui( void );
void startclock( void );
void stopclock( void );
void mytzset( void );
void doregister( void );
void drawframe(struct RastPort*,int,int,int,int,int);
void exiterror(char*);
void __stdargs preport(int,int,char*,...);
void domenuhelp(char*,struct IntuiMessage*);
/*void sqf_setfont(int);
void sqf_wc(char);
void sqf_ws(char*,int);
void sqf_xy(int,int);
void sqf_ceol(int);*/
void qf_ws( int, int, UBYTE * );
void qf_wt( int, struct dnode *n);
void qf_inv( int line, int startcol, int endcol );
void qf_clr( int );
void setmenuescflag( void );
void settitletxt( void );
void displaybeep( void );

/* prefs.c */
void presetmapsprefs( UBYTE );
void getcolors( struct Screen * );
void setcolors( struct Screen * );
void term_getcolors( void );
void term_setcolors( void );
void getwbcolors( void );
void setwbcolors( struct Screen * );
void dochangepassword( void );
void docheckpassword( void );
void doprefsnewinit(void);
void loadprefs(char*);
void saveprefs(char*);
void freeprefs(void);
void docolorprefs(void);
void domodeidprefs(void);
void dofontprefs( void );
void dofontprefs13( void );

/* brett.c */
void calcbcount( void );
struct mbrett *findpmbrett( struct hlist *hlist );
void makembrettlastwrite( struct mbrett * );
struct AsyncFile *getixfile( struct mbrett *, int rw );
void closeixfile( struct mbrett * );
void closeallixfiles( void );
void closeallwriteixfiles( void );
void makebrettview( void );
void doaskquit( void );
ULONG __stdargs askreq( char*, char*, ... );
LONG procmenu(USHORT,ULONG);
void sortbrettlist(void);
void dobretter(void);
void loadbretter(void);
void freebretter(void);
void savebretter(void);
int getbrettnextfree(struct mbrett*mb);
struct brettinfo *getbrettinfo(struct mbrett*);
void setbrettinfo(struct mbrett*,struct brettinfo*);
struct mbrett *findbrett(char*,int);
void brettpfad(char*,struct mbrett*);
/*void brettpfadfile(char*,struct mbrett*,int);*/
void showguidegads( struct IntuiMessage *, char *);


/* help.c */
void flushbuffmem( void );
void initbuffmem( void );
APTR allocbuffmem( int maxsize, int *realsize );
void freebuffmem( void );
void exitbuffmem( void );
BPTR OpenCon( char * );
int makefilelist( char *, char *, char *, int );
BPTR OpenAppend( char * );
int exists( char * );
BPTR openconsole( char *title );
void __stdargs convertstring( char *, char *, ULONG, char *, ... );
struct FileInfoBlock *allocfib( void );
void freefib( struct FileInfoBlock * );
int copyicon( char *, char * );
int procpgscroller( struct IntuiMessage *, void *, int );
void num2b64( long, char * );
int str2_7bit(UBYTE*,UBYTE*);
char *rawkeyconvert(struct IntuiMessage*);
char *errorstring( int );
int fileexistsreq( char * );
void nofilereq( char*, int );
int getrawkeycode(char*);
void sbreakword(char*,char*,int,int);
int movefile(char*,char*);
int copyfile(char*,char*);
void showguide(char*);
void closeguide( void );
void showguidenum( char *, int );
void calleditor(char*);
long checkpath(char*);
void addpart(char*,char*);
char *filepart(char*);
void lockwindow(void);
void unlockwindow(void);
long getfilelen(char*);
void makedospath(char*);
void makebrettname(char*);
char *StrDupPooled( APTR pool, char *string );

/* scroller.c */
int getscrollerselect( void );
void scrollerselect( int mode, int flg );
void findtopnode( void );
void calcnumentries( void );
int getscrollertop( void );
void makescrollergads( void );
void doscrollerclipboard( void );
void displaycurrentline( void );
void removescrollgads( void );
void resetscroller( void );
void scrollerresize( void );
void incscroller( void );
void xscroller( void );
void normalizescroller( void );
void *pushscs(void);
void popscs(void*);
void popscsnv(void*);
ULONG getscrollerstate(void);
void setscrollerstate(ULONG);
void setupscroller(struct List *,int);
void displayscroller(void);
void setscrollercurrent(int);
void setscrollercurrent_internal(int);
int getscrollercurrent(void);
int scrollerdoclick(struct IntuiMessage*);
void scrollerdomove(struct IntuiMessage*);
void setscrollertop(int);
int scrollerdogad(struct IntuiMessage*);
int scrollerdokey(struct IntuiMessage*);
void showcurrentitem(void);
void updateprop(void);

/* netcall.c */
void selectmdtprefs( char *prefsid );
void savemdtprefs( void );
void setgotfilename( char * );
int unpackdata( void );
void openlogmsg(char *);
void __stdargs printlog(char*,...);
void closelogmsg(void);
int donetcall( int mode );
void doterminal(void);
void doanswermode(void);
void inithomedir( void );
void pushhomedir( void );
int pushdir(char*);
int pushdirlock(BPTR);
void freelockstack( void );
void popdir(void);
void delpathcontents(char *,char *,char *);

/* sortin.c */
void convpgpmsg( void );
int dpem_buffer(char *inbuf, char *outbuf, int *outlength);
void header2mail( struct hlist *, struct mail * );
void __stdargs storemail2ix( struct mail *, struct mbrett *, ... );
extern void __asm makerlinks( register __a0 APTR );
void setupinfofg( char *, struct ogwin *, int );
void freeinfofg( void );
void doinfofg( void );
int isfrommicrodot( struct hlist * );
void loadmke(void);
void freemke(void);
void  loaduk(void);
void freeuk(void);
int testidmke(char*);
int testcrcidmke(long);

/*void freeheader(void);
void addheader(char*,char*);
void initheader(void);
int loadheader(struct mbrett*,int); 
struct header *findheader(char*);
struct header *findlastheader(char*);
struct header *findnextheader(struct header *);
int dumpheaderfile( BPTR );*/

void hl_clearhlist( struct hlist * );
void hl_freeheader(struct hlist*);
void hl_delheader( struct header * );
void hl_addheader(struct hlist*,char*,char*);
struct header *hl_nextheader( struct header * );
struct hlist *hl_initheader(void);
struct hlist *hl_loadheader(struct mbrett*,int); 
struct header *hl_findheader(struct hlist *,char*);
int hl_testheader( struct hlist *, char *, char * );
struct header *hl_findlastheader(struct hlist *,char*);
int hl_dumpheaderfile( struct hlist*, BPTR );
int hl_dumpheaderpf( struct hlist*, struct AsyncFile * );
int hl_dumpheaderfp( struct hlist*, FILE *);
struct header *hl_findnextheader(struct header *);

void addmke(char*);
int sortinfile(char *);
void sortinhand(void);
void dosortin(void);
struct mindex *loadbrettix(struct mbrett *);
struct mindex *loadbrettixquiet(struct mbrett *);
int savebrettix(struct mindex*,struct mbrett*);
void freebrettix(struct mindex*);
void flushbrettix( void );
void flushbrettixall( void );

/* spool.c */
void sendshortmail(char*,char*,char*,char*,char*,char*,ULONG);
void copyff(FILE*,FILE*,long);
char *makemid(void);
void makedateheader(char*,long);
int dospool(void);
void delspool(void);
void sendmapsreq(int c);
void dobugreport(void);
void domailinglist( void );
void doregisterform(void);

/* req... */
void newdofrselfile( struct ogwin *ogw, UWORD, char * );
void newdofrseldir( struct ogwin *ogw, UWORD, char * );

int dobrettwildreq( struct brett*, struct brettinfo*, int );
/*void dofrsel(void*,char*);
void dofrselfile(void*,char*);*/
int dopointcfg( void );
void doserialcfg( void );
int donetcfg(void);
int dobrettprefs(struct mbrett*,int,char*);
char *dobrettreq(void);
char *dobrettreqmulti(void);
char *dobrettreqtitle( char * );
char *douserreq(void);
char *douserreqmulti(void);
int douserrequser(struct user*);
void dosysopmodereq(void);
void douserkillwin(void);
void doulwin(void);
char *getuserpgpid( struct user * );

struct mdphone * dotermphonesel( void );
void dotermfkey(void);
void dotermterm( void );
void dotermtransfer( void );
int dotermsel( void );
void dotermphone( void );
int dotermserial( void );

/* msg.c */
void calcmcount( void );
void makevnodemlist( struct List *what );
void excludemail(struct msghandle*,char *,BOOL,int);
struct vmail * getcurrentmail( void );
struct msghandle * opencurrentmail( void );
struct mbrett * getcurrentbrett( void );
void expandpattern( char *, char * );
//char *skipre( char * );
void doinhalt(struct mbrett*,int);
void freeinhalt(void);
void doorigin(FILE *,int,struct mbrett*);

/* sendwin.c */
/*void linkmail(char*,char*);*/
/*void congadget(struct EmbossedGadget*,struct Window*);*/
int doeditheader( struct hlist *, char *);
int dosendwin(char*,char*,char*,char*,char**,long,char*,char**,char*,char*,char*,char*,char*,char*);
int dosendweiter( char **emplist, char **oem, char *oab, char *betreff, char *comment, int bin );
char *dat2str(long);
long str2dat(char*);

/* crunch.c */
void doreorg2( int );
void calcmcount_mb( struct mindex *mix, struct mbrett *mb );
void docrunchkillfile( void );
void doreorg( void );
void docrunch(struct mbrett *);
void setallold( void );
void restoremindex( struct mbrett *mb );

/* dataicon.c */
void createdataicon(char*,char*);

/* xpr.c */
void setzmodemmode( int );
long xpr_send(struct IOExtSer*,struct IOExtSer*,long,char**);
long xpr_receive(struct IOExtSer*,struct IOExtSer*,long);

/* Hydra.c */
int hydra_xfer( struct MinList *sendfiles );

/* sonstiges */

/*void * __stdargs LibCreatePool(ULONG,ULONG,ULONG);
void * __stdargs LibAllocPooled(void*,ULONG);
void __stdargs LibFreePooled(void*,void*,ULONG);
void __stdargs LibDeletePool(void*);*/

#ifndef MDV20
#define LibCreatePool(x,y,z) AsmCreatePool(x,y,z,SysBase)
#define LibAllocPooled(x,y) AsmAllocPooled(x,y,SysBase)
#define LibFreePooled(x,y,z) AsmFreePooled(x,y,z,SysBase)
#define LibDeletePool(x) AsmDeletePool(x,SysBase)
#endif

void * __asm AsmCreatePool(register __d0 ULONG,
	                           register __d1 ULONG,
	                           register __d2 ULONG,
	                           register __a6 struct ExecBase *);

void __asm AsmDeletePool(register __a0 void *,
	                         register __a6 struct ExecBase *);

void __asm AsmFreePooled(register __a0 void *,
	                         register __a1 void *,
	                         register __d0 ULONG,
	                         register __a6 struct ExecBase *);

void * __asm AsmAllocPooled(register __a0 void *,
	                            register __d0 ULONG,
	                            register __a6 struct ExecBase *);

void freeuserlist(BOOL);
void loaduserlist(void);
int getuser(char*,struct user*);
/*void ul2sl(void*);*/
void ul2ogl(struct ogwin*,UWORD);
struct user *getusernum(int);

/* bedwin.c */
void dobedprefs( void );
void dobed2prefs( void );
void dobed3prefs( void );
void doexternprefs( void );
void domapsprefs( void );
void dolanguagecfg( void );


/* list.a */
long __asm GetNumEntries(register __a0 struct List*);
long __asm GetEntryNum(register __a0 struct List*,register __a1 struct Node*);
struct Node * __asm GetEntry(register __a0 struct List*, register __d0 long);
struct Node * __asm GetEntryFromHere(register __a0 APTR *node, register __d0 long);

void __asm myAddHead(register __a0 void*,register __a1 void*);
void __asm myAddTail(register __a0 void*,register __a1 void*);
struct Node * __asm myRemHead(register __a0 void*);
struct Node * __asm myRemTail(register __a0 void*);
void __asm myRemove( register __a1 void * );
void __asm SaveNewList( register __a0 void * );

long __asm IterateList( register __a0 APTR, register __a1 long (*)(), register __a2 APTR ); 

#define AddHead myAddHead
#define AddTail myAddTail
#define Remove myRemove
#define RemHead myRemHead
#define RemTail myRemTail

/* tview.c */
void tv_init( void );
void tv_exit( void );
void tv_add( char *, int );
ULONG tv_open( struct Window * );
int tv_save( void );
int tv_save_proto( void );
void tv_clear( void );
void tv_proc( void );
void tv_update( void );
int tv_changed( void );

/* lwz.c */
int lzw_pack( void*, void*, ULONG, ULONG );
int lzw_unpack( void*, void* );

/* xpk.c */
void makexpkpw( void );
int xpkpack( void *, void *, int );
int xpkunpack( void *, void *, int );
void selectxpk( void );
char *xpkinfostring( void );
void xpknotinstalled( void );

/* Prototypes for functions defined in
mail.c
 */

void ixc_flush( void );
void ixc_init( void );
void ixc_exit( void );

/*UBYTE *msg_copymem( struct msghandle *, UBYTE *, ULONG );*/
ULONG msg_getsize( struct msghandle *, int );
struct msghandle * msg_open(ULONG , ULONG );
void msg_close(struct msghandle * );
int msg_copy(struct msghandle * , char * , ULONG );
struct hlist *msg_loadheader(struct msghandle * );
int msg_initread(struct msghandle * , int );
void msg_endread(struct msghandle * );
int msg_read(struct msghandle * , UBYTE * , int );
struct pindex *msg_store( char *, LONG, char *, LONG, ULONG *, ULONG *, struct hlist * );
struct pindex *msg_replace( char *, LONG, char *, LONG, ULONG, ULONG, struct hlist * );
int msg_copyfh( struct msghandle *, BPTR , ULONG );
int msg_copyfp( struct msghandle *, FILE *, ULONG );

/* Prototypes for functions defined in
msgpack.c
 */

struct pfhandle * pf_open(struct AsyncFile * , int , int , int * );
int pf_readch(struct pfhandle * );
int pf_read(struct pfhandle * , UBYTE * , int );
int pf_writech(struct pfhandle * , int );
int pf_write(struct pfhandle * , UBYTE * , int );
int pf_close(struct pfhandle * );

/* pgp.c */
void pgp_addb64hl( struct hlist *, char *, UBYTE *, int );
void pgp_addb64hlfile( struct hlist *, char *, char * );
void pgp_addpubkey( struct hlist * );
void pgp_init( void );
void pgp_setpassphrase( void );
void pgp_prefs( void );
void pgp_procincoming( void );
int runpgp( char *, int, int );
void pgp_showkeys( int verbose );
void pgp_checkkeys( void );
int getpubkey( char *, char * );
void pgp_changepassphrase( void );
void pgp_rereadownkey( void );

/* genconv.c */
void genconvtables( void );

/* rfc.c */
void convrfc( void );

#define PEN_TEXT     ( ( 0 * 3 ) + 0 )
#define PEN_TEXTBAK  ( ( 0 * 3 ) + 1 )
#define PEN_TEXTBOLD ( ( 0 * 3 ) + 2 )

#define PEN_SEL      ( ( 1 * 3 ) + 0 )
#define PEN_SELBAK   ( ( 1 * 3 ) + 1 )
#define PEN_SELBOLD  ( ( 1 * 3 ) + 2 )

#define PEN_MARK     ( ( 2 * 3 ) + 0 )
#define PEN_MARKBAK  ( ( 2 * 3 ) + 1 )
#define PEN_MARKBOLD ( ( 2 * 3 ) + 2 )

#define PEN_MARKSEL  ( ( 3 * 3 ) + 0 )
#define PEN_MARKSELBAK  ( ( 3 * 3 ) + 1 )
#define PEN_MARKSELBOLD ( ( 3 * 3 ) + 2 )

#define PEN_READ     ( ( 4 * 3 ) + 0 )
#define PEN_READBAK  ( ( 4 * 3 ) + 1 )
#define PEN_READBOLD ( ( 4 * 3 ) + 2 )

#define PEN_QUOTE    ( ( 5 * 3 ) + 0 )
#define PEN_QUOTEBAK ( ( 5 * 3 ) + 1 )
#define PEN_QUOTEBOLD ( ( 5 * 3 ) + 2 )

#define PEN_HEAD     ( ( 6 * 3 ) + 0 )
#define PEN_HEADBAK  ( ( 6 * 3 ) + 1 )
#define PEN_HEADBOLD ( ( 6 * 3 ) + 2 )

#define sabd(r,a,b,d) sabd_func(r,a,b,d,GfxBase)

/* 3.0-Support */
#ifdef MDV20
#define myAllocVec AllocVec
#define myFreeVec FreeVec
#define LibCreatePool CreatePool
#define LibDeletePool DeletePool
#define LibAllocPooled AllocPooled
#define LibFreePooled FreePooled
#undef sabd
#define sabd(r,a,b,d) SetABPenDrMd(r,a,b,d)

/*#define FILE void
#define fopen _internalfopen
void *_internalfopen(char*,char*);
#define fseek _internalfseek
int _internalfseek(void*,int,int);
#define fread(b,v1,v2,f) FRead((BPTR)f,b,v1,v2)
#define fwrite(b,v1,v2,f) FWrite((BPTR)f,b,v1,v2)
#define fgets(b,l,f) FGets((BPTR)f,b,l)
#define fputs(t,f) FPuts((BPTR)f,t)
#undef tolower
#define tolower ToLower
#undef toupper
#define toupper ToUpper
#define stricmp Stricmp
#define strnicmp Strnicmp
#undef getc
#define getc(f) FGetC((BPTR)f)
#undef putc
#define putc(ch,f) FPutC((BPTR)f,ch)
#define fgetc(f) FGetC((BPTR)f)
#define fputc(ch,f) FPutC((BPTR)f,ch)
#define fprintf FPrintf
#define vfprintf VFPrintf
#define ftell(f) Seek((BPTR)f,0,OFFSET_CURRENT)
#define fclose(f) Close((BPTR)f)
#undef fsetbuf
#define fsetbuf(f,s) SetVBuf((BPTR)f,0,BUF_FULL,s)
*/
#endif

//
// Auto memory
//

#include <constructor.h>

extern void outofmem( void);
#define ALLOCSTATIC(v,s,f) CONSTRUCTOR_P(alloc##v,100){/*PutStr("entering " #v "\n"); Delay(50);*/ v=AllocMem(s,f);if(!v)outofmem();/*Printf("exit %lx\n", v);Delay(50);*/return(v?0:1);} DESTRUCTOR_P(alloc##v,100){if(v)FreeMem(v,s);}

#define OldOpenLibrary(x) OpenLibrary(x,0)

#endif
