#include <clib/alib_protos.h>
#include <pragma/dos_lib.h>
#include <pragma/exec_lib.h>
#include <pragma/icon_lib.h>
#include <pragma/intuition_lib.h>
#include <pragma/muimaster_lib.h>
#include <mui/xpk_mcc.h>
#include <tools/tools.h>
#include <stdlib.h>
#include <string.h>

struct Arg
{
char *xpk;
long *xpkmode;
char *password;
};

APTR
app,window,XPK_Obj,
BT_Save,BT_Use,BT_Quit;

enum
{
ID_BT_Save=1,
ID_BT_Use
};

void InitGUI()
{
app=ApplicationObject,
	MUIA_Application_Title,"RGFX Datatypes Preferences",
	MUIA_Application_Base,"RGFX",
	MUIA_Application_Author,"Achim Stegemann",
	MUIA_Application_Copyright,"© 1997-1999 by Achim Stegemann",
	MUIA_Application_Version,"$VER:RGFXPrefs 44.1 (21.01.00)\n",
	MUIA_Application_Description,"MUI-Preferences 44.1 for RGFX",
	MUIA_Application_UseRexx,0,
	MUIA_Application_SingleTask,1,
	SubWindow,window=WindowObject,
		MUIA_Window_Title,"RGFX MUI-Preferences",
		MUIA_Window_ID,'RGFX',
		WindowContents,VGroup,
			Child,XPK_Obj=XpkObject,
				MUIA_Xpk_Method,"NUKE",
			End,
			Child,HGroup,
				Child,BT_Save=TextObject,
					ButtonFrame,
					MUIA_Background,MUII_ButtonBack,
					MUIA_CycleChain,1,
					MUIA_ControlChar,'s',
					MUIA_InputMode,MUIV_InputMode_RelVerify,
					MUIA_Text_PreParse,MUIX_C,
					MUIA_Text_HiCharIdx,'_',
					MUIA_Text_Contents,"_Save",
				End,
				Child,BT_Use=TextObject,
					ButtonFrame,
					MUIA_Background,MUII_ButtonBack,
					MUIA_CycleChain,1,
					MUIA_ControlChar,'u',
					MUIA_InputMode,MUIV_InputMode_RelVerify,
					MUIA_Text_PreParse,MUIX_C,
					MUIA_Text_HiCharIdx,'_',
					MUIA_Text_Contents,"_Use",
				End,
				Child,BT_Quit=TextObject,
					ButtonFrame,
					MUIA_Background,MUII_ButtonBack,
					MUIA_CycleChain,1,
					MUIA_ControlChar,'c',
					MUIA_InputMode,MUIV_InputMode_RelVerify,
					MUIA_Text_PreParse,MUIX_C,
					MUIA_Text_HiCharIdx,'_',
					MUIA_Text_Contents,"_Cancel",
				End,
			End,
		End,
	End,
End;
if(!app) exit(20);
NotifyAppClose(window);
NotifyButton(BT_Save,ID_BT_Save);
NotifyButton(BT_Use,ID_BT_Use);
NotifyButton(BT_Quit,MUIV_Application_ReturnID_Quit);
}

void Ende()
{
if(app) MUI_DisposeObject(app);
}

void Save(BPTR file)
{
FPrintf(file,"%s %lu %s\n",
MyGetAttr(MUIA_Xpk_Method,XPK_Obj),
MyGetAttr(MUIA_Xpk_Mode,XPK_Obj),
MyGetAttr(MUIA_Xpk_Password,XPK_Obj));
}

void SaveENV()
{
BPTR file;
if(file=Open("ENV:DataTypes/rgfx.prefs",MODE_NEWFILE))
	{
	Save(file);
	Close(file);
	}
}

void SaveENVARC()
{
BPTR file;
if(file=Open("ENVARC:DataTypes/rgfx.prefs",MODE_NEWFILE))
	{
	Save(file);
	Close(file);
	}
}

void LoadENV()
{
char *var;
if(var=(char *)AllocVec(256,0))
	{
	if(GetVar("ENV:DataTypes/rgfx.prefs",var,256,LV_VAR|GVF_GLOBAL_ONLY)>=0)
		{
		RDArgs *rdargs;
      if(rdargs=(RDArgs *)AllocDosObject(DOS_RDARGS,0))
			{
			RDArgs *args;
			Arg para;
			rdargs->RDA_Source.CS_Buffer=var;
			rdargs->RDA_Source.CS_Length=strlen(var);
			rdargs->RDA_Source.CS_CurChr=0;
			memset(&para,0,sizeof(Arg));
			if(args=ReadArgs("XPK/A,XPKMODE/A/N,PASSWORD",(long *)&para,rdargs))
				{
				long v;
				char xpk[5];
				strncpy(xpk,para.xpk,4);
				xpk[4]=0;
				SetAttrs(XPK_Obj,MUIA_Xpk_Method,xpk,TAG_END);
				v=*para.xpkmode;
				if(v<0) v=0;
				else if(v>100) v=100;
				SetAttrs(XPK_Obj,MUIA_Xpk_Mode,v,TAG_END);
				if(para.password) SetAttrs(XPK_Obj,MUIA_Xpk_Password,para.password,TAG_END);
				FreeArgs(args);
				}
			FreeDosObject(DOS_RDARGS,rdargs);
			}
		}
	FreeVec(var);
	}
}

void main()
{
UWORD ende=0;
atexit(Ende);
InitGUI();
LoadENV();
SetAttrs(window,MUIA_Window_Open,1,TAG_END);
while(!ende)
	{
	ULONG signals;
	switch(DoMethod(app,MUIM_Application_NewInput,&signals))
		{
		case MUIV_Application_ReturnID_Quit:
			ende=1;
			break;
		case ID_BT_Save:
			SaveENVARC();
		case ID_BT_Use:
			SaveENV();
			ende=1;
		}
	if(signals) signals=Wait(signals);
	}
}

void wbmain()
{
main();
}
