#include <libraries/amigaguide.h>
#include <proto/amigaguide.h>
#include <exec/memory.h>
#define __USE_SYSBASE
#include <proto/exec.h>
#include <proto/dos.h>
#include <dos/rdargs.h>
#include <proto/xfdmaster.h>
#include <libraries/xfdmaster.h>
#include <string.h>

struct ExecBase      *SysBase;

struct Library       *AmigaGuideBase;
struct xfdMasterBase *xfdMasterBase;
struct DosLibrary    *DOSBase;
static struct xfdBufferInfo *xfdbuffer;
static struct RDArgs        *rdargs;
static struct NewAmigaGuide *nag;
static struct FileInfoBlock *fib;

static char   name[100];
static BPTR lock, fh;

ULONG __saveds main(void);
int alert(void);

ULONG __saveds main(void)
{
static long                 opts[1];
static AMIGAGUIDECONTEXT    handle;

	xfdMasterBase=NULL;
	lock=NULL;
	fh=NULL;
	rdargs=NULL;
	xfdbuffer=NULL;
	nag=NULL;


   SysBase = *(struct ExecBase **)4;

	DOSBase=(struct DosLibrary *)OpenLibrary("dos.library", 0);

	if(!(xfdMasterBase=(struct xfdMasterBase *)OpenLibrary("xfdmaster.library", 36)))
	{
		Printf("No xfdmaster.library \n");
		return(20);
	}

	if(AmigaGuideBase=OpenLibrary("amigaguide.library",34))
	{
		opts[NULL]=NULL;
		rdargs=(struct RDArgs *)ReadArgs("DOCUMENT/F/A",opts,NULL);
		if(!rdargs)
			alert();

		if(!(xfdbuffer=(struct xfdBufferInfo *)xfdAllocObject(XFDOBJ_BUFFERINFO)))
			alert();

		if(!(fh=Open((STRPTR)opts[NULL], MODE_OLDFILE)))
			alert();

		if(!(lock=Lock((STRPTR)opts[NULL], -2)))
			alert();

		fib=AllocVec(sizeof(struct FileInfoBlock), MEMF_ANY);
		Examine(lock, fib);

		xfdbuffer->xfdbi_SourceBufLen=fib->fib_Size;

		xfdbuffer->xfdbi_SourceBuffer=AllocVec(fib->fib_Size, MEMF_ANY);

		UnLock(lock); lock=NULL;
		Read(fh, xfdbuffer->xfdbi_SourceBuffer, fib->fib_Size);
		Close(fh); fh=NULL;

		FreeVec(fib); fib=NULL;

		if(xfdRecogBuffer(xfdbuffer))
		{
			if(xfdbuffer->xfdbi_Flags && XFDPFF_PASSWORD)
				alert();
			xfdbuffer->xfdbi_Special=NULL;

			xfdbuffer->xfdbi_TargetBufMemType=MEMF_ANY;
			if(xfdDecrunchBuffer(xfdbuffer))
			{
				fh=Open("t:ag.temp", MODE_NEWFILE);
				Write(fh, xfdbuffer->xfdbi_TargetBuffer, xfdbuffer->xfdbi_TargetBufLen);
				Close(fh); fh=NULL;
				FreeMem(xfdbuffer->xfdbi_TargetBuffer, xfdbuffer->xfdbi_TargetBufLen);
				strcpy(name, "t:ag.temp");
			}
			else
				strcpy(name, (STRPTR)opts[NULL]);
		}
		else
			strcpy(name, (STRPTR)opts[NULL]);

		nag=AllocVec(sizeof(struct NewAmigaGuide), MEMF_ANY | MEMF_CLEAR);
		nag->nag_Name=(STRPTR)name;
		nag->nag_Node=NULL;
		nag->nag_Line=NULL;

		handle=OpenAmigaGuideA(nag,NULL);
		CloseAmigaGuide(handle);
		FreeVec(nag);
		FreeVec(xfdbuffer->xfdbi_SourceBuffer);

		DeleteFile("t:ag.temp");
	}
	else
		Printf("No amigaguide.library !\n");

	alert();
}

int alert(void)
{

	if(xfdbuffer)
		xfdFreeObject(xfdbuffer);
	if(fh)
		Close(fh);
	if(lock)
		UnLock(lock);
	if(rdargs)
		FreeArgs(rdargs);

	if(AmigaGuideBase)
		CloseLibrary(AmigaGuideBase);
	if(xfdMasterBase)
		CloseLibrary((struct Library *)xfdMasterBase);

	CloseLibrary((struct Library *)DOSBase);
	return(NULL);
}
