#include <exec/types.h>
#include <exec/exec.h>
#include <stdio.h>
#include <stdlib.h>
#include <intuition/intuitionbase.h>
#include <functions.h>
#define AFILE 1
#define ADIRECTORY 2
#define NL NULL
#define MEMSIZE 4096
#define SM sendmessage
#define HK hotkey
#define PM prompt
void CleanExit(int returnvalue);
#include "doorheader.h"

int Music=1;
int Menu();
int LoadFile();
void end();
void DisplayHelp();
char Date[12];
void free_pdir();
void Catalog();
void StripReturn();
void StripSpaces();
void GetDirs();
void Dir();
void StripSpace();
void StripInfo();
void EnterDir();
void ExitDir();
void StripDirectory();
void RecordInfo();
void Readit();
void GetFileName();
void Lharc();
int Flag();
void ShowFlags();
void ClearFlags();
STRPTR GetTheDate();
char Temp[255];
char RecordData[255];
int Needed=1; /*** Record info variable ***/
static struct FileLock      *pdir = NL;
static struct FileInfoBlock *dir_info = NL;
char RecordFile[100];
int CheckFile();
int expert=0; 
int ND;
extern int Enable_Abort;
extern VOID Register(int node);
int Marked=0;
void main(int argc,char *argv[])
{
     char image[120];
     char Name[40]; char Location[40];
     Enable_Abort=0;
     
     ND=(argv[1][0])-'0';
     Register(ND);

SM("\a",0);
     RecordInfo("*******************************************************");
 getuserstring(Name,DT_NAME);
 getuserstring(Location,DT_LOCATION);
   strcpy(Date,GetTheDate());
   sprintf(image,"%.32s -- %.32s -- %s",Name,Location,Date);
                  RecordInfo(image);
                 
  if ((dir_info =(struct FileInfoBlock *)AllocMem((long)sizeof(struct FileInfoBlock),0L)) == NULL)
   {
     SM("Memory Allocation Error. Please Leave message with Sysop",1);
     Delay(300L);
     CleanExit(0);
   }
   SM("[32m[40m*EXPRESS-CDROM     * Written by: Joseph Hodge[0m",1);

   Catalog(); 
   if(Music)
   {
   SM("Sorry, but the CD-ROM Device is currently configured for Audio",1);
   Delay(200L);
   CleanExit(0);
   }
  
   while(1)
   {
      switch(Menu())
      {
        case 0: 
             {
     if(Marked)SM("[31m\r\nMarked Files may now be downloaded from BBS[0m",1); 
     Delay(100L);
   if(!access("DOORS:CD-ROM/List.dta",00))
      unlink("DOORS:CD-ROM/list.dta");
   if(!access("RAM:temp.dta",00)) unlink("Ram:Temp.dta");
           CleanExit(0);
             }  
      case 1: 
            Flag(); break;
      case 2: 
            RecordInfo("Listing Directory"); GetDirs(); break;
      case 3: 
            EnterDir(); break;
      case 4: 
            RecordInfo("Returning to Previous Directory"); ExitDir(); break;
      case 5:
            RecordInfo("Displaying Help File"); DisplayHelp(); break;
      case 6:
            RecordInfo("Toggling Expert mode"); expert=!expert; break;
      case 7: Lharc(); break;
      case 8: ClearFlags(); break;
      case 9: ShowFlags(); break;
      default:
           SM("Invalid Command",1);
      }
   }
    CleanExit(0);

}
void ClearFlags()
{
   SM("Flags Cleared",1);
   unlink("DOORS:CD-ROM/Flagged");
}
void ShowFlags()
{
   FILE *fi;
   int i=1;
   char image[200];
   char CMD[200];
   if(access("DOORS:CD-ROM/Flagged",00))
   {
      SM("There are no Flagged files",1);
      return;
   }
   SM("List of Flagged Files",1);
   fi=fopen("DOORS:CD-ROM/Flagged","r");
   while(fgets(image,150,fi)!=NULL)
   {
     StripReturn(image);
     StripSpaces(image);
     GetFileName(image);
     sprintf(CMD,"%02d> %-40s",i,image); SM(CMD,1);i++;
   }
   fclose(fi);
}
void DisplayHelp()
{
  FILE *fi;
  REGISTER int i=0;
  char image[202];
  char CMD[20];
    showgfile("DOORS:CD-ROM/MenuHelp");
  SM("",1);
}


int Menu()
{
   FILE *fi;
   int j=0;
   int k=0;
   char image[255];
   char CMD[100];
   if(!expert) showgfile("DOORS:CD-ROM/Menu");
       SM("[37mEnter Response {C,D,E,F,L,S,Q,X,-} >: ",0);
       HK("",CMD); strupr(CMD); j=CMD[0];
       SM("[0m",0);
       if(j=='Q' || j=='q'){ SM("Quit.",1); return(0);}
       if(j=='L' || j=='l'){ SM("Load flagged files.",1); return(7);}
       if(j=='F' || j=='f'){ SM("Flag files.",1);return(1);}
       if(j=='C' || j=='c'){ SM("Clear flags.",1); return(8);}
       if(j=='S' || j=='s'){ SM("Show flagged files.",1); return(9);}
       if(j=='D' || j=='d'){ SM("Directory list.",1); return(2);}
       if(j=='E' || j=='e'){ SM("Enter directory.",1);return(3);}
       if(j=='-' ){ SM("Previous directory.",1); return(4);}
       if(j=='H' || j=='h'){SM("Unknown command.",1); return(5);}
       if(j=='X' || j=='x'){SM("Expert toggle.",1); return(6);}
   return(5);
}
int Flag()
{
   char image[255];
   char Name[255];
   char Temp1[255];
   char CMD[200];
   FILE *fi,*fo;
   int i=0;
   unsigned int ch=EOF;

   SM("",1);
   SM("Please Enter File Name to Load to the BBS >:");
   PM("",image,100);
   StripReturn(Temp);
   StripSpaces(Temp);
   StripReturn(image);
   StripSpaces(image);
   if(Temp[strlen(Temp)-1]==':')
   sprintf(Temp1,"%s%s",Temp,image);
   else
   sprintf(Temp1,"%s/%s",Temp,image);
   strcpy(Name,image);

   StripReturn(Temp1);
   StripSpaces(Temp1);
   if(access(Temp1,00)) { sprintf(CMD,"Can't Locate File %s",Name); SM(CMD,1);return(0); }

   if((fi=fopen(Temp1,"rb"))==NULL)
   {
     sprintf(CMD,"Can't Locate File %s",Name); SM(CMD,1);
     Delay(100L);
     return(0);
   }
   i=0; while(i<strlen(Temp1))
   {
     Temp1[i]=toupper(Temp1[i]);
     i++;
   }
 
   if(!access("DOORS:CD-ROM/Flagged",00))
   {
      fi=fopen("DOORS:CD-ROM/Flagged","r");
      while(fgets(image,100,fi)!=NULL)
      {
         if(!strcmp(image,Temp1))
         {
           SM("That file is already flagged",1); fclose(fi);return(0);
         }
      }
      fclose(fi);
   }
   fo=fopen("DOORS:CD-ROM/Flagged","a");
   fprintf(fo,"%s\r\n",Temp1);
   sprintf(CMD,"File %s has been flagged for retrieval",Name);
   SM(CMD,1);
   fclose(fo);
   return(0);
}
void Lharc()
{
  FILE *fi,*fo,*fi1;
   int i=0;
   int Total=0,Arced=0;
   char Name[150];
   char Name2[150];
   char image[150];
  char Command[255];
  char CMD[200];
  int BBSFlagged=0;
   unsigned int ch=EOF;
   if(access("DOORS:CD-ROM/Flagged",00)){ SM("Files must be flagged first",1); return; }
    SM("Please Enter LHarc File Name for uncompressed Flagged Files >:",0);
     PM("",Name,100);
     i=0;
     StripReturn(Name);
     StripSpaces(Name);
     while(i<strlen(Name))
     {
       if(Name[i]==':' || Name[i]=='/' || strlen(Name)>12)
       {
         SM("Invalid characters or Name greater than 12 characters",1);
         SM("Aborting Load sequence",1);
         return;
       }
       i++;
     }
     i=0; while(i<strlen(Name))
     {
        Name[i]=toupper(Name[i]);
        i++;
     }
     if(!strstr(Name,".LZH"))
     {
       strcat(Name,".LZH");
     }
     sprintf(Command,"DOORS:CD-ROM/%s",Name); strcpy(Name2,Name);strcpy(Name,Command);
 fi1=fopen("DOORS:CD-ROM/Flagged","r");
 
while(fgets(image,150,fi1)!=NULL)
{
    StripReturn(image);
    StripSpaces(image);
  strupr(image);
  if(!strstr(image,".LZH") && !strstr(image,".ZOO") && !strstr(image,".ARC")
     && !strstr(image,"IFF") && !strstr(image,"GIF") && !strstr(image,"MOD."))
   {
      
     sprintf(Command,"LHARC a %s %s",Name,image);
     RecordInfo(Command);
     Execute(Command,NULL,NULL);
     if(!BBSFlagged){ FlagFile(Name2); BBSFlagged=1;}
   }
   else 
   {     
     fi=fopen(image,"rb");
     GetFileName(image);
     sprintf(CMD,"Direct load of %s from CD-ROM",image);SM(CMD,1);
     sprintf(RecordData,"Direct load of %s from CD-ROM\r\n",image);
     FlagFile(image);
     RecordInfo(RecordData);
     sprintf(CMD,"DOORS:CD-ROM/%s",image);
     fo=fopen(CMD,"wb");
     while((ch=getc(fi))!=EOF)
     {
       putc(ch,fo);
     }
     putc(EOF,fo);
     fclose(fi);
     fclose(fo);
   }
 
}
   SM("Load Complete.",1);
   Marked=1;
   sprintf(RecordData,"Flagged files loaded from CD-ROM");
   RecordInfo(RecordData);
   Delay(45L);
   fclose(fi1);
   unlink("DOORS:CD-ROM/Flagged");
}


void StripReturn(char *File)
{
   int i=0;
   i=strlen(File);
   while(i>-1)
   {
     if((*(File+i)<=32 || *(File+i)>128) && *(File+i)>0) *(File+i)=' ';
     --i;
   }
}
void StripSpaces(char *File)
{
   int i=0;
   i=strlen(File);
   while(i>-1)
   {
     if(*(File+i)>32) break;
     if((*(File+i)<=32 || *(File+i)>128) && *(File+i)>0) *(File+i)='\0';
     --i;
   }
}    
void Catalog()
{
  FILE *fi,*f1;
  int i=0;
  char image[255];
  char image2[255];
  char CMD[200];
  strcpy(Temp,"");
  Execute("Assign >RAM:Temp.dta",NULL,NULL);
 
  if(!access("RAM:Temp.dta",00))
  {
    fi=fopen("RAM:Temp.Dta","r");
    while(fgets(image,80,fi)!=NULL)
    {
       if(!access("DOORS:CD-ROM/paths",00))
       {
          f1=fopen("DOORS:CD-ROM/paths","r");
          while(fgets(image2,80,f1)!=NULL)
          {
             strcpy(Temp,image2);
             StripReturn(Temp);
             StripSpaces(Temp);
             StripInfo(image2);
             StripSpace(image);
             i=0;
             while(i<strlen(image))
             {
               image[i]=toupper(image[i]);
               i++;
             }
                  i=0;
             while(i<strlen(image2))
             {
               image2[i]=toupper(image2[i]);
               i++;
             }
       
             if(!strcmp(image,image2))
             {
                sprintf(CMD,"%s Directory Listing",image2);SM(CMD,1);
                StripDirectory(Temp);
                GetDirs();
                fclose(f1);
                fclose(fi);
                Music=0;
                return;
             }
          }
          fclose(f1);
        }
     }


    fclose(fi);
    unlink("Ram:Temp.dta");
  }
 
  return;
}
void GetFileName(char *Name)
{
  int i=0;
  char Path[200];
  strcpy(Path,Name);
  i=strlen(Path)-1;
  while(i>=0)
  {
    if(Path[i]=='/' || Path[i]==':')
    {
      strcpy(Name,&Path[i+1]); return;
    }
    i--;
  }
}
void StripInfo(char *image)
{
   int i=0;
   char image1[255];
   strcpy(image1,image);
   while(i<strlen(image1))
   {
      if(image1[i]==':') *(image+i)='\0';
      i++;
   }
}
void StripSpace(char *image)
{
   int i=0;
   char image1[255];
   strcpy(image1,image);
   while(i<strlen(image1))
   {
      if(image1[i]==' ') *(image+i)='\0';
      i++;
   }
}

void GetDirs()
{
  REGISTER int i=0;
  REGISTER int j=0;
  char ch;
  char CMD[200];
  free_pdir();
  if (! (pdir=(struct FileLock *)Lock(Temp,(ULONG)ACCESS_READ)) )
  {
    free_pdir();
      return;
  }
  if ( ! Examine((BPTR)pdir, dir_info) )
  {
    free_pdir();
    return;
  }
  while(ExNext((BPTR)pdir,dir_info))
  {
    if(dir_info->fib_DirEntryType < 0L )
    {
      sprintf(CMD,"[33m%-25s[36m%7ld    ",dir_info->fib_FileName,dir_info->fib_Size);
      SM(CMD,0); 
   }
    else
    {
      sprintf(CMD,"[32m%-25s           ",dir_info->fib_FileName);
      SM(CMD,0);
    }
    j++;
    if(j==2)
    {
      j=0;
      SM("[0m",1);
      i++;
    }
    SM("[0m",0);
    if(i>17)
    {
      while(1)
      {
         HK("\r\nPress <Q>uit <F>lag,  <RETURN> to continue listing >:",CMD);
         strupr(CMD);  
     switch(CMD[0])
      {
         case 'Q': 
          SM("Quit.",1);
          free_pdir();
          return;
         case 'F': SM("Flag.",1);
          Flag(); break;
         default: SM("Continue.",1); break;
      }
     
      if(ch!='F') break; 
     } 
     i=0;
    }
  }
    while(1)
    {
        HK("\r\nPress <F>lag,  <RETURN> to exit listing >:",CMD);strupr(CMD);
      switch(CMD[0])
      {
         case 'Q': 
          SM("Quit.",1);
          free_pdir();
          return;
         case 'F': SM("Flag.",1);
          Flag(); break;
         default: SM("Continue.",1); free_pdir(); return;
      }
     
      if(ch!='F') break; 
     } 
}

/*******************************************************/

void free_pdir()
{
   if ( pdir )
      {
      UnLock((BPTR)pdir);
      pdir=NL;
       }
   return;   
}

int CheckFile(char *image)
{
  free_pdir();
  if (! (pdir=(struct FileLock *)Lock(image,(ULONG)ACCESS_READ)) )
  {
    free_pdir();
      return(0);
  }
  if ( ! Examine((BPTR)pdir, dir_info) )
  {
    free_pdir();
    return(0);
  }
  if ( dir_info->fib_DirEntryType < 0L )
  {
    free_pdir();
    return(AFILE);
  }  
  else
  {
    free_pdir();
    return(ADIRECTORY);
  }
}

void EnterDir()
{
   char Name[255];
   char TempPath[255];
   char CMD[200];
   strcpy(Name,"");
   strcpy(TempPath,"");
   PM("[32mPlease enter Directory Name >:",Name,100);
   SM("",1);
   StripReturn(Name);
   StripSpaces(Name);
   
   StripSpaces(Temp);
 if(Temp[strlen(Temp)-1]==':')
   sprintf(TempPath,"%s%s",Temp,Name);
   else
   sprintf(TempPath,"%s/%s",Temp,Name);
  
   switch(CheckFile(TempPath))
   {
     case 0:
          SM("Invalid Directory Name",1);
          return;
     case 1:
          SM("Sorry but can't enter a File",1);
          return;
     case 2:
          if(Name[0]=='\0')
          {
            sprintf(CMD,"Current Directory Now %s",Temp);
            SM(CMD,1);
          }
           else
          {
            sprintf(CMD,"Current Directory Now %s",Name);
            SM(CMD,1);
          }
   }
   Delay(100L);
   strcpy(Temp,TempPath);
   RecordInfo("Changing Directory to:");
   RecordInfo(Temp);
   GetDirs();
   return;
}
void ExitDir()
{
  char TempPath[255];
  strcpy(TempPath,Temp);
  StripDirectory(TempPath);
  if(CheckFile(TempPath)==2)
  {
    
    SM("Now in previous Directory",1);
    strcpy(Temp,TempPath);
    GetDirs();
  }
  else
  {
    SM("Error Reading Previous Directory",1);
  }
  return;
}
  
void StripDirectory(char *Path)
{
  int i=0;
  i=strlen(Path)-1;
  while(*(Path+i)!=':' && *(Path+i)!='/' && i>-1)
  {
    *(Path+i)='\0';
    i--;
  }
  if(*(Path+i)=='/') *(Path+i)='\0';
}
 

void RecordInfo(char *image)
{
   FILE *fo;
   char CMD[200];
   sprintf(CMD,"DOORS:CD-ROM/DoorLog%d",ND);
   fo=fopen(CMD,"a");
   fprintf(fo,"%s\r\n",image);
   fclose(fo);
}
 
void CleanExit(int a)
{
  ShutDown();
  end();
}

STRPTR GetTheDate()
{
  struct tm *tp;
  long t;
  int M,D,Y;
  char Day[4],Month[5],Year[3];
  char TheTime[27];
  char Date[12];
  time(&t);
  tp=localtime(&t);
  sprintf(TheTime,"%s",asctime(tp));
  sprintf(Day,"%.2s",&TheTime[8]);
  sprintf(Month,"%.3s",&TheTime[4]);
  sprintf(Year,"%.2s",&TheTime[22]);
   D=atoi(Day);
   Y=atoi(Year);

  if(!strncmp(Month,"Jan",3)) M=1;
  if(!strncmp(Month,"Feb",3)) M=2;
  if(!strncmp(Month,"Mar",3)) M=3;
  if(!strncmp(Month,"Apr",3)) M=4;
  if(!strncmp(Month,"May",3)) M=5;
  if(!strncmp(Month,"Jun",3)) M=6;
  if(!strncmp(Month,"Jul",3)) M=7;
  if(!strncmp(Month,"Aug",3)) M=8;
  if(!strncmp(Month,"Sep",3)) M=9;
  if(!strncmp(Month,"Oct",3)) M=10;
  if(!strncmp(Month,"Nov",3)) M=11;
  if(!strncmp(Month,"Dec",3)) M=12; 
  sprintf(Date,"%02d-%02d-%02d",M,D,Y);
  return(Date); 
}

void end()
{
  if(dir_info!=NL)
  {
   free_pdir();
   FreeMem(dir_info,(long)sizeof(struct FileInfoBlock));
  }
 exit(0);
}