/* Display an ASL file requester */

#include <libraries/asl.h>
#include <workbench/startup.h>

#define __NOLIBBASE__
#include <proto/exec.h>
#include <proto/asl.h>

#include <stdio.h>
#include <stdlib.h>

#define MAXFILES 500

extern char *PicArray[];
extern int NumPictures;
extern short ASLPicSelect;
extern void CloseDisplay(void);
extern struct ScreenModeRequester *smr;

void ExitASL(void);

static struct FileRequester *fr = NULL;

struct TagItem frtags[] =
{
 { ASLFR_InitialPattern,"#?.(jpg|jpeg)"  },
 { ASLFR_DoMultiSelect, (ULONG)TRUE },
 { ASLFR_DoPatterns,    (ULONG)TRUE },
 { ASLFR_RejectIcons,   (ULONG)TRUE },
 { TAG_DONE,            (ULONG)TRUE }
};


extern struct Library *AslBase;

void ChooseFiles(void)
{
  struct WBArg *frargs;
  int x,i;

  ASLPicSelect=0;

  if(!AslBase) AslBase=OpenLibrary("asl.library", 39L);

  if(AslBase)
  {
    if(!fr) fr = (struct FileRequester *)AllocAslRequest(ASL_FileRequest, frtags);

    if(fr)
    {
      if( AslRequest(fr, NULL) )
      {       

        /* multiselect */
        if(fr->rf_NumArgs)
        {
          frargs=fr->rf_ArgList;
          for(x=0; x < fr->rf_NumArgs; x++)
          {
            PicArray[NumPictures] = malloc(strlen(fr->rf_Dir)+strlen(frargs[x].wa_Name)+3);
            if(!PicArray[NumPictures]) ExitASL();
            
            strcpy(PicArray[NumPictures], fr->rf_Dir);
            i = strlen(fr->rf_Dir);
            if(i)
            {
              i--;
              if(fr->rf_Dir[i] != ':' && fr->rf_Dir[i] != '/')
                strcat(PicArray[NumPictures], "/");
            }
            strcat(PicArray[NumPictures], frargs[x].wa_Name);
            /* puts(PicArray[NumPictures]); */
            NumPictures++;
            if(NumPictures == MAXFILES)
            {
              printf("Too many files!\n");
              break;
            }
            ASLPicSelect=1;
          }
        }
        else
        {
          /* only one file selected */
          PicArray[NumPictures] = malloc(strlen(fr->rf_Dir)+strlen(fr->rf_File)+3);
          if(!PicArray[NumPictures]) ExitASL();
   
          strcpy(PicArray[NumPictures], fr->rf_Dir);
          i = strlen(fr->rf_Dir);
          if(i)
          {
            i--;
            if(fr->rf_Dir[i] != ':' && fr->rf_Dir[i] != '/')
              strcat(PicArray[NumPictures], "/");
          }
          strcat(PicArray[NumPictures], fr->rf_File);
          NumPictures++;
          ASLPicSelect=1;
        }
      }  
    }
  }
}

void FreeASL(void)
{
  if(fr) FreeAslRequest(fr);
  fr = NULL;
  if(smr) FreeAslRequest(smr);
  smr = NULL;
  if(AslBase) CloseLibrary(AslBase);
  AslBase = NULL;
}


void ExitASL(void)
{
 printf("Out of memory!\n");
 FreeASL();
 CloseDisplay();
 exit(10);
}
