/*
**	prefs.c - prefrences handling for Font DataType class
**	Copyright © 1995 Michael Letowski
*/

#include <exec/types.h>
#include <exec/memory.h>
#include <dos/dos.h>
#include <dos/rdargs.h>
#include <support/types.h>
#include <support/dos.h>

#include <stdlib.h>

#include "classbase.h"
#include "prefs.h"

#include <proto/exec.h>
#include <proto/dos.h>

#define BUF_LEN			256

#define PREFS_PATH1	"PROGDIR:Prefs/DataTypes/font.prefs"
#define PREFS_PATH2	"ENV:DataTypes/font.prefs"


STATIC LBOOL ReadPrefs(struct ClassBase *cb, struct PrefsHandle *ph,
												struct Opts *opts, STRPTR name);
STATIC struct RDArgs *ReadArgsBuf(struct ClassBase *cb, STRPTR template,
																	LONG *opts, struct RDArgs *rda);

struct PrefsHandle *GetFontPrefs(struct ClassBase *cb, struct Opts *opts)
{
	struct PrefsHandle *PH;
	LBOOL Res=FALSE;

	clear(opts);																	/* Set defaults */

	try(newv(PH,MEMF_CLEAR),												NO_PREFS);
	try(PH->ph_RDA=AllocDosObject(DOS_RDARGS,NULL),	NO_RDA);
	fset(PH->ph_RDA->RDA_Flags,RDAF_NOPROMPT);		/* Disable prompts */

	if(ThisProcessS->pr_HomeDir)									/* PROGDIR: exists? */
		Res=ReadPrefs(cb,PH,opts,PREFS_PATH1);			/* Try first path */
	unless(Res)																		/* Args not read so far */
		ReadPrefs(cb,PH,opts,PREFS_PATH2);					/* Try second path */
	return(PH);

	catch(FOO,				);
	catch(NO_RDA,		FreeDosObject(DOS_RDARGS,PH->ph_RDA));
	catch(NO_PREFS,	deletev(PH));
	return(NULL);
}	/* GetFontPrefs */

VOID FreeFontPrefs(struct ClassBase *cb, struct PrefsHandle *ph)
{
	if(ph->ph_ArgsB)		FreeArgs(ph->ph_ArgsB);		/* Free background color args */
	if(ph->ph_ArgsF)		FreeArgs(ph->ph_ArgsF);		/* Free foreground color args */
	if(ph->ph_ArgsDPI)	FreeArgs(ph->ph_ArgsDPI);	/* Free DPI args */
	if(ph->ph_Args)			FreeArgs(ph->ph_Args);		/* Free args */
	ph->ph_RDA->RDA_Buffer=NULL;									/* Don't free buffer */
	FreeDosObject(DOS_RDARGS,ph->ph_RDA);					/* Free additional args */
	deletev(ph);
}	/* FreeFontPrefs */

STATIC LBOOL ReadPrefs(struct ClassBase *cb, struct PrefsHandle *ph,
												struct Opts *opts, STRPTR name)
{
	CHAR Buffer[BUF_LEN];
	struct RDArgs *RDA=ph->ph_RDA;
	BPTR FH;
	LBOOL Result=FALSE;

	try(FH=Open(name,MODE_OLDFILE),	NO_FILE);
	RDA->RDA_Source.CS_Buffer=Buffer;							/* Set up buffer to read from */

	/* Read args */
	if(FGets(FH,Buffer,BUF_LEN-1))								/* Got line from file */
		if(ph->ph_Args=ReadArgsBuf(cb,TEMPLATE,(LONG *)opts,RDA))
		{
			if(opts->opt_DPI)													/* DPI given */	
			{
				strncpy(Buffer,opts->opt_DPI,BUF_LEN-2);
				ph->ph_ArgsDPI=ReadArgsBuf(cb,TEMPLATEDPI,(LONG *)&opts->opt_XDPI,RDA);
			}
			if(opts->opt_Foreground)									/* Foreground color given */
			{
				strncpy(Buffer,opts->opt_Foreground,BUF_LEN-2);
				ph->ph_ArgsF=ReadArgsBuf(cb,TEMPLATEF,(LONG *)&opts->opt_ForeRed,RDA);
			}
			if(opts->opt_Background)									/* Foreground color given */
			{
				strncpy(Buffer,opts->opt_Background,BUF_LEN-2);
				ph->ph_ArgsB=ReadArgsBuf(cb,TEMPLATEB,(LONG *)&opts->opt_BackRed,RDA);
			}			
		}
	Result=TRUE;

	catch(NO_FILE,	Close(FH));
	return(Result);
}	/* ReadPrefs */

STATIC struct RDArgs *ReadArgsBuf(struct ClassBase *cb, STRPTR template,
																	LONG *opts, struct RDArgs *rda)
{
	STRPTR Buffer=rda->RDA_Source.CS_Buffer;
	LONG Len;

	Len=strlen(Buffer);														/* Get size of buffer */
	Buffer[Len]='\n';															/* New line char */
	Buffer[Len+1]='\0';														/* String terminator */
	rda->RDA_Source.CS_Length=Len+1;							/* Set up string len */
	rda->RDA_Source.CS_CurChr=0;									/* Set up current char */
	rda->RDA_Buffer=NULL;													/* As documented in AutoDocs */
	return(ReadArgs(template,opts,rda));					/* Read arguments */
}	/* ReadArgsBuf */
