/* */

#define VERSIONSTRING "tcpdl v1.04 Copyright © 1996 Patrik Nilsson"

#include <proto/dos.h>
#include <proto/exec.h>
#include <proto/locale.h>
#include <proto/utility.h>
#include <proto/intuition.h>

#include <exec/memory.h>
#include <dos/dos.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <netdb.h>
#include <fcntl.h>

#include<dos/dosasl.h>
#include<dos.h>
#include<utility/date.h>
#include<pragmas/exec_pragmas.h>
#include<dos/dostags.h>
#include<bsdsocket.h>

#include<dos/datetime.h>

#include <sys/ioctl.h>
#include <sys/time.h>
#include <signal.h>

#define BUFSIZE (8*1024)
#define NAMEDATASIZE (5*1024)
#define NUMBERPROCESSES (15)
#define PFNSIZE (1024)
#define NUMBERRETRIES 5

struct strippedurl
{
char type[12];
ULONG port;
char host[64];
char pathfilename[PFNSIZE];
};

struct mtask
{
BOOL kill;
BOOL busy;
BOOL taskinghtml;

char  information1[20];
ULONG starttime;
ULONG starttimecps;
LONG  currentsizecps;
LONG  currentsize;
LONG  finalsize;
char  information2[260];

struct namedata *curldata;
struct Task *taskid;

ULONG at_work;
ULONG at_work_time;
UWORD timeout;

struct strippedurl surl;

char newfilename[50];
char buffer[BUFSIZE];

BPTR inputfile; /* used by readhtml ONLY */
BPTR outputfile; /* used by readhtml ONLY */
BPTR titlefile; /* used by readhtml ONLY */

};

/* flag 0 to NUMBERPROCESSES (max 19) is occupied by taskes */
#define flag_Redirection     (1<<20)
#define flag_IsDL            (1<<21)
#define flag_ForceDL         (1<<22)
#define flag_IsIMG           (1<<23)
#define flag_IsHREF          (1<<24)
#define flag_Is200           (1<<25)

#define acceptflag_all       (1<<0)
#define acceptflag_text      (1<<1)
#define acceptflag_img       (1<<2)
#define acceptflag_update    (1<<3)

struct namedata
{
   struct namedata *next;
   
   struct namedata *parent;
   
   ULONG  flag_data;
   
   UBYTE  flag_maxdeep;
   UBYTE  flag_maxdiffhost;
   UBYTE  flag_maxdiffpath;
   UBYTE  acceptflag;
   
   UWORD  retriesleft;
   UWORD  numberfailed;
   
   UWORD  port;
   
   UWORD  urlnamelength;
   char   *urlname;
   
   UWORD  typenamelength;
   char   *typename;
   
   UWORD  hostnamelength;
   char   *hostname;
   
   UWORD  pathnamelength;
   char   *pathname;
   
   UWORD  urlfilenamelength;
   char   *urlfilename;
};

struct MM
{
BOOL task_safe_kill;
struct Task *task_safe_taskid;

BOOL task_update_window_kill;
struct Task *task_update_window_taskid;

struct mtask point[NUMBERPROCESSES];

struct namedata *firsturldata;
struct namedata *testurldata;

ULONG starttime;
ULONG totalbytes;

ULONG numberurldata;
ULONG numberurldatadone;

BOOL ctrlcflag;
BOOL namedatainuse;
BOOL htmlinuse;
BOOL ALLDONE;
BOOL nomodify;
char **dummy;

char realname[80];
char username[80];

ULONG crctab[256];
};

extern struct MM *mmpoint;

char*__saveds phrasestring( struct strippedurl *surl, char *urlname );
BOOL __saveds copyfileclose( int task, BPTR source, BPTR target );

void __saveds readconfig( void );
void __saveds readurlfile( char *inputfilename );
struct namedata * __saveds getfilenumber( char *filename );

void __saveds readhtmlfile( int task, struct namedata *urldata );

BOOL __saveds InfoToProcess( int );

void __saveds starttask( void );
BOOL __saveds dotcpline( int task );
void __saveds createpath( char *text );
void __saveds makefilename( char *outputstring, char *urlname );

LONG __saveds testahref( char *buffer, int task, int itext );
LONG __saveds testimg( char *buffer, int task, int itext );
LONG __saveds testtitle( char *buffer, int task, int itext );
struct namedata *__saveds createfinalurl( char *, int task );
void __saveds set( struct namedata *urldata, ULONG flag );
void __saveds clr( struct namedata *urldata, ULONG flag );
BOOL __saveds tst( struct namedata *urldata, ULONG flag );

int  __saveds OpenWnd( void );
void __saveds CloseWnd( void );
int  __saveds SetupScreen( void );
void __saveds CloseDownScreen( void );
void __saveds Render( void );

void __saveds updatetree( struct namedata *urldata, int task );

ULONG __saveds mcrc( char *filename );
void __saveds doamiganame( char *string );

void __saveds safe( void );
