/*
 * Variables controlling Yak settings.
 * Routines for initialisation at startup.
 */

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

#include "yak.h"
#include "popup.h"

#define DEF_POPCOMMAND	"NewShell CON:0/178//78/AmigaShell/CLOSE"
#define DEF_VOLUME	48
#define DEF_DATEFMT	0
#define DEF_BLANKSECS	300

char	PopCommand[POPLEN+1] = DEF_POPCOMMAND;	/* used for PopCLI */
LONG	datefmt = DEF_DATEFMT;			/* used by dateinsert */
LONG	click_volume = DEF_VOLUME;		/* used for keyclick */
LONG	blanksecs = DEF_BLANKSECS;
LONG	blanktimeout;
LONG	blankcount;				/* countdown to blank-time */
WORD	mblankcount;				/* countdown to mouse-blank-time */

TOGGLEDATA toggles[] = {
	TRUE,	GDX_CTFCheck,
	TRUE,	GDX_CTBCheck,
	TRUE,	GDX_AutoCheck,
	FALSE,	GDX_KeyActCheck,
	TRUE,	GDX_ScrCycleCheck,
	TRUE,	GDX_DayCheck,
	TRUE,	GDX_DateCheck,
	FALSE,	GDX_TimeCheck,
	TRUE,	GDX_MBlankCheck,
	FALSE,	GDX_WildStarCheck,
	TRUE,	GDX_ScrActCheck
};

HOTKEYDATA hk[NUM_HOTKEYS] = {
	{ HK_POPKEY,	NULL, "RCommand help" },
	{ HK_CLOSEKEY,	NULL, "control esc" },
	{ HK_ZIPKEY,	NULL, "control z" },
	{ HK_SHRINKKEY,	NULL, "lcommand [" },
	{ HK_ZOOMKEY,	NULL, "lcommand ]" },
	{ HK_WORKBENCH,	NULL, "lcommand w" },
	{ HK_POPPALKEY,	NULL, "lcommand p" },
	{ HK_POPCLI,	NULL, "lcommand esc" },
	{ HK_INSDATE,	NULL, "lcommand d" },
	{ HK_CYCLEWIN,	NULL, "lcommand k" },
	{ HK_CYCLESCR,	NULL, "lcommand n" },
	{ HK_CENTERSCR,	NULL, "lcommand c" },
	{ HK_SCRTOBACK,	NULL, "lcommand m" }	/* special */
};

/*
 * Routines to load/save config file for Yak.
 * Should handle config files in upward-compatible manner.
 * File format:
 * 
 * 	LONG ID
 * 	LONG NUM_TOGGLES
 * 	BOOL toggles
 * 	LONG NUM_HOTKEYS
 * 	STR hotkey1 '\n'
 * 		:
 * 	STR hotkey1 '\n'
 * 	STR popcommand '\n'
 * 	LONG datefmt, click_volume, blanksecs
 */

#define CONFIG_ID	0x594b3131	/* YK11 */

/* write a LONG to a file (in binary format) - returns success*/
BOOL
FWriteLong(BPTR fh, LONG n)
{
	return FWrite(fh, (UBYTE *)&n, sizeof(LONG), 1) == 1;
}

/* read a LONG to a file (in binary format) - returns success */
BOOL
FReadLong(BPTR fh, LONG *n)
{
	return FRead(fh, (UBYTE *)n, sizeof(LONG), 1) == 1;
}

/* write a string to a file (in binary format) - returns success*/
/* '\n' is appended */
BOOL
FWriteString(BPTR fh, char *buf)
{
	FPuts(fh, buf);
	FPutC(fh, '\n');
	return IoErr() == 0;
}

/* read a string to a file (in binary format) - returns success */
/* '\n' is stripped and buf null-terminated; assumes dest large enough */
BOOL
FReadString(BPTR fh, char *buf)
{
	char tbuf[512];

	FGets(fh, tbuf, 512);
	tbuf[strlen(tbuf)-1] = '\0';	/* '\n' --> '\0' */
	strcpy(buf, tbuf);
	return IoErr() == 0;
}

/* save current settings to config file */
void
SaveSettings(char *file)
{
	BPTR	fh;
	UWORD	i;

	if (fh = Open(file, MODE_NEWFILE))
	{
		FWriteLong(fh, CONFIG_ID);

		/* toggles */
		FWriteLong(fh, NUM_TOGGLES);
		for (i = 0; i < NUM_TOGGLES; i++)
			FWrite(fh, (UBYTE *)&toggles[i].pos, sizeof(BOOL), 1);

		/* hotkeys */
		FWriteLong(fh, NUM_HOTKEYS);
		for (i = 0; i < NUM_HOTKEYS; i++)
			FWriteString(fh, hk[i].key);

		/* miscellaneous */
		FWriteString(fh, PopCommand);
		FWriteLong(fh, datefmt);
		FWriteLong(fh, click_volume);
		FWriteLong(fh, blanksecs);

		Close(fh);
	}
	if (IoErr() != 0) PostError("Error writing config file\n");
}

/* load current settings from file */
void
LoadSettings(char *file)
{
	BPTR	fh;
	UWORD	i;
	LONG	n;

	if (fh = Open(file, MODE_OLDFILE))
	{
		FReadLong(fh, &n);
		if (n == CONFIG_ID)
		{
			/* toggles */
			FReadLong(fh, &n);
			for (i = 0; i < n; i++)
				FRead(fh, (UBYTE *)&toggles[i].pos, sizeof(BOOL), 1);

			/* hotkeys */
			FReadLong(fh, &n);
			for (i = 0; i < n; i++)
				FReadString(fh, hk[i].key);

			/* miscellaneous */
			FReadString(fh, PopCommand);
			FReadLong(fh, &datefmt);
			FReadLong(fh, &click_volume);
			FReadLong(fh, &blanksecs);
		}
		else PostError("Invalid config file\n");
		Close(fh);
	}

	/* set-up hotkeys etc */
	for (i = 0; i < NUM_HOTKEYS; i++)
		AddHotKey(NULL, i);

	if (wildstar) WILDSTARON; else WILDSTAROFF;
	blankcount = blanktimeout = 10*blanksecs;
	mblankcount = mblanktimeout;
}
