/* Lille util til at flytte info fra max's file.data over i vores eget format */

#include <proto/exec.h>
#include <proto/dos.h>
#include <exec/memory.h>
#include <utility/tagitem.h>
#include <stdio.h>
#include <strings.h>
#include <stdlib.h>

#include "/filedoor_structs_defines.h"

/* Max's struct for en fil */
struct maxfileentry {
  ULONG dato;                   /* Dato for fil anskaffelse - dage siden 01/01/78 */
  ULONG pad1;
  ULONG siz;                    /* Filstørrelse */
  ULONG dlcount;                /* Antal gange downloadet */
  UBYTE flags;
  UBYTE area;                   /* Area filen hører til i */
  UBYTE name[41];               /* Filnavn */
  UBYTE desc[60];               /* Fil desc. */
  UBYTE uploader[41];           /* Navn på uploader */
  UBYTE unknown[42];            /* ?? evt. en sysop-kommentar, jeg er ikke sikker */
};

/* Starten af file.data indeholder lidt junk, og så kommer der en masse filer (struct maxfileentry) */
struct maxfilelist {
  UBYTE max[62];                /* MAX's text */
  ULONG filetotal;              /* Antal filer på BBS */
  ULONG filesarea[100];         /* Antal filer for hver sektion */
  UBYTE the_rest;               /* Faktisk: struct maxfileentry files[?????] */
};

char *argptrs[7];
struct Area newa;
__far struct File *filesarray[10000];
filecount=0;
void *filedataptr;
ULONG filedatasiz;

BOOL LoadFile(char *filnavnet, APTR *ptrptr, ULONG *sizptr)
{
struct FileInfoBlock *fib;
BPTR filhandle;

  if (filhandle=Open(filnavnet,MODE_OLDFILE))
  {
    if (fib=AllocDosObjectTags(DOS_FIB,TAG_END))
    {
      if (ExamineFH(filhandle,fib))
      {
        if (*ptrptr=AllocVec(fib->fib_Size,MEMF_ANY))
        {
          if (fib->fib_Size==Read(filhandle,*ptrptr,fib->fib_Size))
          {
            *sizptr=fib->fib_Size;
            FreeDosObject(DOS_FIB,fib);
            Close(filhandle);
            return(TRUE);
          } else printf("Coulden't read file %s\n",filnavnet);
          FreeVec(*ptrptr);
        } else printf("No memory\n");
      FreeDosObject(DOS_FIB,fib);
      } else printf("AmigaDos won't cooperate!\n");
    } else printf("REALLY no memory\n");
    Close(filhandle);
  } else printf("Coulden't open file %s\n",filnavnet);
  return(FALSE);
}

void find(void)
{
int numfiles,i,j;
struct maxfileentry *f;

  numfiles=(filedatasiz-466)/sizeof(struct maxfileentry);
  f=(struct maxfileentry *)((UBYTE *)filedataptr+466);
  for(i=0;i<numfiles;i++)
  {
    if(f->area==*((ULONG *)argptrs[1]))
    {
      if(filesarray[filecount]=AllocVec(sizeof(struct File),MEMF_ANY|MEMF_CLEAR))
      {  
        filesarray[filecount]->dl=f->dlcount;
        filesarray[filecount]->qual=65535;
        filesarray[filecount]->date=f->dato;
        filesarray[filecount]->siz=f->siz;
        filesarray[filecount]->flags=FILEFLAG_LONGARCHIVE; /* ! */
        strcpy(filesarray[filecount]->longdesc,"FILE_ID.DIZ");
        strcpy(filesarray[filecount]->name,f->name);
        strcpy(filesarray[filecount]->shortdesc,f->desc);
        for(j=0;filesarray[filecount]->shortdesc[j]!=0;j++)
        {
          if(filesarray[filecount]->shortdesc[j]<32) filesarray[filecount]->shortdesc[j]=32;
        }
        filecount++;
      }
    }
    f++;
  }
}

int comparefiles(struct File **a,struct File **b)
{
  return(stricmp((*a)->name,(*b)->name));
}


void purge(void)
{
char filnavn[200];
int i;
BPTR handle;

  strcpy(filnavn,"bbs:cydaldoor/HDFiles/");
  strcat(filnavn,newa.filename);
  if(handle=Open(filnavn,MODE_NEWFILE))
  {
    for(i=0;i<filecount;i++)
    {
      Write(handle,filesarray[i],sizeof(struct File));
      FreeVec(filesarray[i]);
    }
    Close(handle);
  }
  else printf("%s coulden't be opened\n",filnavn);
}

int main(int argc,char *argv[])
{
char argstr[256];
char filename[100];
struct RDArgs *argstruct;
int i;
BPTR handle,lock;

  memset(&newa,0,sizeof(struct Area));
  strcpy(argstr,(char *)GetArgStr());
  if(argstr[strlen(argstr)-1]!='\n') strcat(argstr,"\n");
  for(i=0;i<5;i++) argptrs[i]=NULL;
  argstruct=ReadArgs("FileData=FD/K/A,"\
                     "Areanumber=NR/K/A/N,"\
                     "Areaname=Name/K/A,"\
                     "Accesslevel=Axxs/K/A/N,"\
                     "Filepath=Path/K/A,",(long *)argptrs,NULL);
  /* Hvis det lykkedes at parse argumenterne ordentligt */
  if(argstruct)
  {
    /* Lav superarea directory */
    if(lock=CreateDir("bbs:cydaldoor/HDFiles"))
    {
      UnLock(lock);
    }
    else
    {
      if(lock=Lock("bbs:cydaldoor/HDFiles",ACCESS_READ))
      {
        UnLock(lock);
      }
      else
      {
        printf("Warning: Superarea-directory not located\n");
      }
    }
    /* Find filen med de korte filbeskrivelser */
    if(!LoadFile(argptrs[0],&filedataptr,&filedatasiz))
    {
      printf("..Failed to locate file.data\nI need the full path, ya know.\n");
      FreeArgs(argstruct);
      return(20);
    }
    /* Kopier filnavnet på areafilen til areastruct */
    strcpy(filename,"HD");
    sprintf(filename+2,"%i",*((ULONG *)argptrs[1]));
    strcat(filename,".area");
    strcpy(newa.filename,filename);
    /* Kopier det beskrivende navn af area til areastruct */
    if(strlen(argptrs[2])<32)
      strcpy(newa.name,argptrs[2]);
    else
    {
      printf("Areaname too long\n");
      FreeArgs(argstruct);
      return(20);
    }
    /* Kopier sti til areas filer til areastruct */
    if(strlen(argptrs[4])<100)
      strcpy(newa.path,argptrs[4]);
    else
    {
      printf("Path to area's files too long\nTough luck eh?\n");
      FreeArgs(argstruct);
      return(20);
    }
    /* Kopier accesslevel påkrævet */
    if(argptrs[3])
      newa.access=*((LONG *)argptrs[3]);
    else
      newa.access=0;
    /* Tilføj den genererede areastruct til superareafilen */
    if(handle=Open("bbs:cydaldoor/hdfiles.superarea",MODE_READWRITE))
    {
      Seek(handle,0L,OFFSET_END);
      Write(handle,&newa,sizeof(struct Area));
      Close(handle);
    }
    else
    {
      printf("Couldn't open area file\n");
      FreeArgs(argstruct);
      return(20);
    }
    /* Lav en fornuftig areafil */
    find();
    qsort(filesarray,filecount,sizeof(struct File *),comparefiles);
    purge();
    /* I want to break freeeeee... (Queen) */
    FreeArgs(argstruct);
    FreeVec(filedataptr);
  }
  else
  {
    printf("Incorrect arguments specified\n%s ? for template\n",argv[0]);
    return(20);
  }
  return(0);
}

