// Loaders.c - Copyright © 1994 Mike Austin

#include <string.h>
#include <exec/memory.h>
#include <dos/exall.h>
#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/gadtools.h>
#include <proto/multiuser.h>
#include <pragmas/nofrag_pragmas.h>
#include <proto/nofrag_protos.h>
#include "MFileMode.h"
#include "GUI.h"

VOID LoadVolumes(struct List *List)
{
	static struct DosList	*DosList;
	static struct Node		*Node;
	static UWORD			NumNodes = 0, Num;

	GT_SetGadgetAttrs(MainGadgets[GD_GAD_FILE], MainWnd, NULL,
			GTLV_Labels,	~0,
			TAG_END);

	GT_SetGadgetAttrs(MainGadgets[GD_GAD_FILE], MainWnd, NULL,
			GTLV_Top,	0,
			TAG_END);

	FreeList(&FileList);

	if(DosList = LockDosList(LDF_VOLUMES | LDF_ASSIGNS | LDF_READ))
	{
		while(DosList = NextDosEntry(DosList, LDF_VOLUMES | LDF_ASSIGNS | LDF_READ))
		{
			if(Node = AllocVecItem(MemChain, sizeof(struct Node) +
					sizeof(UBYTE *) + strlen(BSTR2CSTR(DosList->dol_Name)) +
					2, MEMF_CLEAR))
			{
				Node->ln_Name = (char *)(&(Node->ln_Name) + 1);
				strcpy((char *)(&(Node->ln_Name) + 1), BSTR2CSTR(DosList->dol_Name));
				strcat((char *)(&(Node->ln_Name) + 1), ":");

				AddTail(&FileList, Node);
			}
			else
				AlertUser(MainWnd, "Can't allocate memory", "");

			NumNodes++;
		}

		UnLockDosList(LDF_VOLUMES | LDF_ASSIGNS | LDF_READ);

		if(FileNames = AllocVecItem(MemChain, sizeof(UBYTE *) * NumNodes, 0L))
		{
			Node = FileList.lh_Head;

			for(Num = 0; Num < NumNodes; Num++)
			{
				FileNames[Num] = Node->ln_Name;
				Node = Node->ln_Succ;
			}
		}
		else
			AlertUser(MainWnd, "Can't allocate memroy", "");
	}
	else
		AlertUser(MainWnd, "Can't lock dos list", "");

	GT_SetGadgetAttrs(MainGadgets[GD_GAD_FILE], MainWnd, NULL,
			GTLV_Labels,	&FileList,
			TAG_END);

	GT_SetGadgetAttrs(MainGadgets[GD_GAD_PATH], MainWnd, NULL,
			GTTX_Text,	NULL,
			TAG_END);
}

VOID LoadDirectory(BPTR Lock, struct List *List)
{
	struct ExAllControl	*EAControl;
	struct ExAllData	EAData[4];
	struct ExAllData	*Data;
	struct Node			*Node;
	UWORD				NumNodes = 0, Num;
	BOOL				More;

	GT_SetGadgetAttrs(MainGadgets[GD_GAD_FILE], MainWnd, NULL,
			GTLV_Labels,	~0,
			TAG_END);

	GT_SetGadgetAttrs(MainGadgets[GD_GAD_FILE], MainWnd, NULL,
			GTLV_Top,	0,
			TAG_END);

	FreeList(&FileList);

	if(EAControl = AllocDosObject(DOS_EXALLCONTROL, NULL))
	{
		EAControl->eac_LastKey = 0;

		do
		{
			More = ExAll(Lock, EAData, sizeof(struct ExAllData) * 4,
					ED_TYPE, EAControl);

			if(EAControl->eac_Entries != 0)
			{
				Data = EAData;

				do
				{
					if(Node = AllocVecItem(MemChain, sizeof(struct Node) +
							sizeof(UBYTE *) + strlen(Data->ed_Name) + 2,
							MEMF_CLEAR))
					{
						Node->ln_Name = (char *)(&(Node->ln_Name) + 1);
						strcpy((char *)(&(Node->ln_Name) + 1), Data->ed_Name);
						if(Data->ed_Type >= 0)
							strcat((char *)(&(Node->ln_Name) + 1), "/");

						AddTail(&FileList, Node);
					}
					else
						AlertUser(MainWnd, "Can't allocate memory", "");

					NumNodes++;

					Data = Data->ed_Next;
				}
				while(Data);
			}
			else
				More = FALSE;
		}
		while(More);

		FreeDosObject(DOS_EXALLCONTROL, EAControl);

		if(FileNames = AllocVecItem(MemChain, sizeof(UBYTE *) * NumNodes, 0L))
		{
			Node = FileList.lh_Head;

			for(Num = 0; Num < NumNodes; Num++)
			{
				FileNames[Num] = Node->ln_Name;
				Node = Node->ln_Succ;
			}
		}
		else
			AlertUser(MainWnd, "Can't allocate memory", "");
	}
	else
		AlertUser(MainWnd, "Can't allocate dos object", "");

	GT_SetGadgetAttrs(MainGadgets[GD_GAD_FILE], MainWnd, NULL,
			GTLV_Labels,	&FileList,
			TAG_END);
}
