/*
** Transfer Header
*/

#include <sys/types.h>
#include <libraries/dos.h>

#include <time.h>
#include <netinet/in.h>

#include "include/napster.h"
#include "include/thread.h"
#include "include/download.h"

#ifndef AMSTER_TRANSFER_H
#define AMSTER_TRANSFER_H

struct TransferData {
	struct MUI_InputHandlerNode ihnode;
	struct MUI_InputHandlerNode waitnode;
	struct MUI_InputHandlerNode watchnode;
	u_long *list;
	u_long *info;
	u_long *BT_Resume;
};

/* Download states
   - IMPORTANT: These states MUST be in the same order as the
     catalog string array in transfer.c
*/
enum TransferState {
	DLS_PREP,
	DLS_QUEUE,
	DLS_WAIT,
	DLS_CON,
	DLS_REQ,
	DLS_INIT,
	DLS_DOWN,
	DLS_UP,
	DLS_FIN,
	DLS_ABORT,
	DLS_ERROR
};

/* Transfer errors
   - IMPORTANT: These errors MUST be in the same order as the
     catalog string array in transfer.c
*/
enum TransferError {
	ERROR_UNKNOWN,
	ERROR_FILEOPEN,
	ERROR_FILEREAD,
	ERROR_FILEWRITE,
	ERROR_NET,
	ERROR_LOGGEDOUT,
	ERROR_NOTFOUND,
	ERROR_INVALIDREQUEST,
	ERROR_TEASER,
	ERROR_BUSY,
	ERROR_NOTREQUESTED,
	ERROR_TIMEOUT,
	ERROR_OUTOFBOUND
};

enum NetError {
	ERROR_NET_TIMEOUT,
	ERROR_NET_REFUSED,
	ERROR_NET_RESET,
	ERROR_NET_PIPE
};

enum TransferType {
	TYPE_DOWNLOAD_IN,
	TYPE_DOWNLOAD_OUT,
	TYPE_UPLOAD_IN,
	TYPE_UPLOAD_OUT
};

typedef struct songtrans_struct {
	struct songtrans_struct *next;
	song song;
	char *mynick;
	u_long ip;
	char host[512];
	int port;
	char *fname;
	u_long size, cur, resumestart;
	enum TransferType type;
	enum TransferState state;
	enum TransferError error;
	int ErrorCode;
	int RetryCount;
	thread t;
	int ts;
	int cps, stalltick;
	u_long oldsize;
	time_t reqtime;	/* Time when the request is made */
	time_t starttime, transtime, timeleft;

	/* thread data */
	struct Library *DOSBase;
	struct Library *SocketBase;
	long s;
	char *buffer;
	BPTR f;
	u_long nsig, nsigm, msigm;
	struct sockaddr_in sin;
	struct fd_set fds;
	struct timeval tv;
} *songtrans, _songtrans;


extern ULONG dl_setup(struct IClass *cl, Object *obj, Msg msg);
extern ULONG dl_muicleanup(struct IClass *cl, Object *obj, Msg msg);
extern MUIF translistdisp(REG(a2) char **array, REG(a1) songtrans sd);
extern MUIF translistdest(REG(a2) APTR pool, REG(a1) songtrans sd);
extern void CalculateCps(songtrans sd);
extern void TransferSetError(struct TransferData *data, char *title, char *user, int error);
extern void TransferInfo(struct TransferData *data);
extern void TransferAbort(struct TransferData *data);
extern void TransferCleanup(struct TransferData *data);
extern void TransferCleanupSingle(struct TransferData *data, songtrans sd);
extern void TransferWatcher(struct TransferData *data);
extern void TransferHandleError(songtrans sd);
extern BOOL InitTransferThread(thread t, songtrans sd);
extern void ExitTransferThread(songtrans sd, int ret);


#endif	/* AMSTER_TRANSFER_H */
