/* MRBackup user preferences processing.
 * Filename:	UserPrefs.c
 * Date:		08/23/87
 */

#include "MRBackup.h"

char *fgets();

extern struct Gadget backpathgad;
extern struct Gadget excludepathgad;
extern struct Gadget homepathgad;
extern struct Gadget listpathgad;
extern struct Requester *pathrequest;
extern struct Window *pathwindow;

#define KEYMAX		20				/* max length of a keyword */
#define NKEYWORD	7				/* number of keywords supported */
#define PREFERENCES_FILE "S:MRBackup.init"

#define KW_HOME			0
#define KW_BACKUP		1
#define KW_LIST			2
#define KW_EXCLUDE		3
#define KW_COMPRESSION	4
#define KW_LISTING      5
#define KW_SPEECH		6

static char *keywords[NKEYWORD] = {
	"home", "backup", "list", "exclude", 
	"compression", "listing", "speech"
	};

/* Process the user preferences file. */

GetUserPrefs()
{
	char c;
	USHORT i;
	char keyword[KEYMAX+1];
	short keyindex;
	USHORT keyleng;

	FILE *prefs;
	char s[81];
	char *s1, *s2, *s3;

	if (!(prefs = fopen(PREFERENCES_FILE,"r"))) {
		WriteConsole("I couldn't get your preferences.\n");
		return;
	}

	while (fgets(s, 80, prefs)) {
		if (*s == '#') continue;
		WriteConsole(s);
		s1 = s;
		keyleng = 0;
		while ((c = *s1++) && isalpha(c)) {
			if (keyleng < KEYMAX) keyword[keyleng++] = tolower(c);
			else {
badkey:
				WriteConsole("Keyword error in preferences file.\n");
err:
				goto done;
			}
		}
		keyword[keyleng] = '\0';
		for (keyindex = -1, i = 0; i < NKEYWORD; ++i) {
			if (!strcmp(keyword, keywords[i])) {
				keyindex = i;		/* found it */
				break;
			}
		}
		if (keyindex < 0) goto badkey;
		while (c == ' ') c = *s1++;
		if (c != '=') {
badsyn:
			WriteConsole("Syntax error in preferences file.\n");
			goto done;
		}

		/* Get the parameter field, minus any leading or trailing
		 * blanks.
		 */

		while ((c = *s1) == ' ') ++s1; /* skip leading blanks */
		/* Delete trailing blanks. */
		s2 = s3 = s1;
		while (c && c != '\n') {
			if (c != ' ') s2 = s3; 	/* record non-blank end of string */
			c = *s3++;
		}
		*s2 = '\0';					/* truncate the string here */
		SetUserPref(keyindex, s1);
	}
done:
	fclose(prefs);
}

/* Save the current program settings in the user preferences file. */

PutUserPrefs()
{
	WriteConsole("PutUserPrefs() is not implemented\n");
}

/* Set/Clear checkmarks according to the item being set.  This routine
 * is VERY application specific and assumes that the affected menu
 * items are 
 *				1. grouped in pairs (on/off)
 *				2. adjacent (item, item+1)
 *				3. ordered in on, off order (Listing, No Listing)
 */

BOOL 
SetMenuItem(item, value)
	USHORT item; char *value;
{
	BOOL boolean;
	LONG excludebits, excludemask;
	LONG menu1, menu2;
	struct MenuItem *item1, *item2;
	short i;

	/* Get pointers and menu numbers for the affected items. */

	menu1 = SHIFTITEM((long) item) | SHIFTMENU((long) MENU_FLAGS);
	item1 = ItemAddress(&Titles[0], menu1);

	menu2 = SHIFTITEM((long) item + 1) | SHIFTMENU((long) MENU_FLAGS);
	item2 = ItemAddress(&Titles[0], menu2);

	if (item1 == NULL || item2 == NULL) {
		WriteConsole("Null menu item in SetMenuItem - call Mark!!\n");
		return false;
	}

	boolean = ( tolower(*value) == 'y' );
	if (boolean) {				/* true? */
		item1->Flags |= CHECKED;
		item2->Flags &= ~CHECKED;
	}
	else {						/* false */
		item1->Flags &= ~CHECKED;
		item2->Flags |= CHECKED;
	}
	return boolean;
}

void
SetStringGadget(gadget, value)
	struct Gadget *gadget; char *value;
{
	UBYTE *gs;							/* pointer to gadget string */

	RemoveGadget(pathwindow, gadget);
	gs = (UBYTE *) GadgetString(gadget);
	strcpy(gs, value);
	ResetStringInfo(gadget->SpecialInfo);
	AddGadget(pathwindow, gadget, -1L);
	DoGadget(pathwindow, GADGETUP, gadget);	/* simulate GADGETUP */
}

/* Set one user preference item. 
 * Called with:
 *		kw:			keyword index
 *		parm:		parameter string
 */

SetUserPref(kw, parm)
	USHORT kw; char *parm;
{

	switch (kw) {
	case KW_HOME:
		SetStringGadget(&homepathgad, parm);
		break;

	case KW_BACKUP:
		SetStringGadget(&backpathgad, parm);
		break;

	case KW_LIST:
		SetStringGadget(&listpathgad, parm);
		break;

	case KW_LISTING:
		do_listing = SetMenuItem(ITEM_LIST, parm);
		break;

	case KW_EXCLUDE:
		SetStringGadget(&excludepathgad, parm);
		break;

	case KW_COMPRESSION:
		do_compress = SetMenuItem(ITEM_COMPRESS, parm);
		break;

	case KW_SPEECH:
		do_speech = SetMenuItem(ITEM_SPEECH, parm);
		break;

	default:
		break;
	}
}

