#include <exec/exec.h>
#include <dos/dosextens.h>
#include <libraries/dos.h>
#include <workbench/workbench.h>
#include <clib/alib_protos.h>
#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#include <clib/icon_protos.h>
#include <stdio.h>
#include  <stdlib.h>
#include <string.h>
#include "aclvl.h"
struct Commands {
	UBYTE	AcLvl[100],
		SerDevUnit;
	char	SerDev[40],
		NEW_UserPW[15];
	long	OpeningBaud;
	BYTE	TaskPri;
	char	ConfName[9][60],
		ConfLoc[9][60],
		BBSName[41],
		BBSLoc[41],
		SysopName[41];
	UBYTE	PSAcLvl[6],
		PSRType[6],
		PSRatio[6];
	long	PSDBytes[6],
		PSTime[6];
	char	PSCnfAc[6][10],
		MInit[101],
		MReset[31],
		MRing[31],
		MAnswer[31],
		MC300[31],
		MC1200[31],
		MC2400[31],
		MC4800[31],
		MC9600[31],
		MC19200[31];
	short	NumConf;
	char	SysPass[31],
		RemotePass[31];
	USHORT	BaudTimes[10];
	char	Pad[18];
	};
struct StartOption
{
  SHORT LeftEdge;
  SHORT TopEdge;
  SHORT Width;
  SHORT Height;
  int BitPlanes;
  BOOL StatBar;
  BOOL Interlace;
  BOOL DupeCheck;
  BOOL QLogon;
  BOOL TakeCredits;
  BOOL SeenIt;
  BOOL TrapDoor;
  BOOL Iconify;
  BOOL RadBoogie;
  BOOL A2232;
  BOOL Toggles[20];
  char Logoff[80];
  char ShutDown[80];
  char CycleLock[80];
  char RamPen[80];
  char BBSConfig[80];
  char FilesNot[80];
  char UserData[80];
  char UserKey[80];
  char OffHook[80];
  char PubScreen[80];
  APTR MasterSemi;
  APTR SingleSemi;
};

extern struct Commands *Cmds[];
extern struct StartOption *Sopt[];
extern BOOL NodeIdle[];
extern char StartNode[11][80];
extern BOOL StartUp;
struct FileLock      *pdir = NULL;
struct FileInfoBlock *dir_info = NULL;
extern struct Library *IconBase;
void free_pdir(void);

#define StripInfo(x,y) x=strlen(y)-1; while(x>-1) { if(y[x]=='.') { y[x]='\0'; break; } x--; }

#define CMDOPT(x,y) for(j=0;j<MaxNodes;j++) Cmds[j]->AcLvl[x]=y 
#define ACS(x) s=FindToolType(oldtooltypes,x)
int GetFileName(char *path,char *buf);
void GetIconBBSInfo(int MaxNodes)
{
   struct DiskObject *dobj;
   char **oldtooltypes;
   char *s;
   register int j;
   register int i;
   int def;
   char temp[100];
   sprintf(temp,"%sCONFCONFIG",Cmds[0]->BBSLoc);
   dobj=GetDiskObject(temp);
   if(dobj)
   {
      oldtooltypes=dobj->do_ToolTypes;
      if(s=FindToolType(oldtooltypes,"RELATIVE_CONFERENCES")) for(i=0;i<MaxNodes;i++) Sopt[i]->Toggles[1]=1;
      FreeDiskObject(dobj);
   } 
   sprintf(temp,"%sACCESS",Cmds[0]->BBSLoc);
   dobj=GetDiskObject(temp);
   if(!dobj) return;
   oldtooltypes=dobj->do_ToolTypes;
   def=0;
   if(ACS("ACS.ACCOUNT_EDITING"))    CMDOPT(ACCOUNT_EDITING,1); else CMDOPT(ACCOUNT_EDITING,def);
   if(ACS("ACS.COMMENT_TO_SYSOP"))   CMDOPT(COMMENT_TO_SYSOP,1);else CMDOPT(COMMENT_TO_SYSOP,def);
   if(ACS("ACS.DOWNLOAD"))           CMDOPT(DOWNLOAD,1);        else CMDOPT(DOWNLOAD,def);
   if(ACS("ACS.ENTER_MESSAGE"))      CMDOPT(ENTER_MESSAGE,1);   else CMDOPT(ENTER_MESSAGE,def);
   if(ACS("ACS.FILE_LISTINGS"))      CMDOPT(FILE_LISTINGS,1);   else CMDOPT(FILE_LISTINGS,def);
   if(ACS("ACS.JOIN_CONFERENCE"))    CMDOPT(JOIN_CONFERENCE,1); else CMDOPT(JOIN_CONFERENCE,def);
   if(ACS("ACS.NEW_FILES_SINCE"))    CMDOPT(NEW_FILES_SINCE,1); else CMDOPT(NEW_FILES_SINCE,def);
   if(ACS("ACS.PAGE_SYSOP"))         CMDOPT(PAGE_SYSOP,1);      else CMDOPT(PAGE_SYSOP,def);
   if(ACS("ACS.READ_MESSAGE"))       CMDOPT(READ_MSG,1);    else CMDOPT(READ_MSG,def);
   if(ACS("ACS.DISPLAY_USER_STATS")) CMDOPT(DISPLAY_USER_STATS,1); else CMDOPT(DISPLAY_USER_STATS,def);
   if(ACS("ACS.UPLOAD"))             CMDOPT(UPLOAD,1); else CMDOPT(UPLOAD,def);
   if(ACS("ACS.VIEW_A_FILE"))        CMDOPT(VIEW_A_FILE,1); else CMDOPT(VIEW_A_FILE,def);
   if(ACS("ACS.EDIT_USER_INFO"))     CMDOPT(EDIT_USER_INFO,1); else CMDOPT(EDIT_USER_INFO,def);
   if(ACS("ACS.REMOTE_SHELL"))       CMDOPT(REMOTE_SHELL,1); else CMDOPT(REMOTE_SHELL,def);
   if(ACS("ACS.ZIPPY_TEXT_SEARCH"))  CMDOPT(ZIPPY_TEXT_SEARCH,1); else CMDOPT(ZIPPY_TEXT_SEARCH,def);
   if(ACS("ACS.OVERIDE_CHAT"))       CMDOPT(OVERRIDE_CHAT,1); else CMDOPT(OVERRIDE_CHAT,def);
   if(ACS("ACS.EDIT_USER_NAME"))     CMDOPT(EDIT_USER_NAME,1); else CMDOPT(EDIT_USER_NAME,def);
   if(ACS("ACS.EDIT_USER_LOCATION")) CMDOPT(EDIT_USER_LOCATION,1); else CMDOPT(EDIT_USER_LOCATION,def);
   if(ACS("ACS.EDIT_PHONE_NUMBER"))  CMDOPT(EDIT_PHONE_NUMBER,1); else CMDOPT(EDIT_PHONE_NUMBER,def);
   if(ACS("ACS.EDIT_PASSWORD"))      CMDOPT(EDIT_PASSWORD,1); else CMDOPT(EDIT_PASSWORD,def);
   if(ACS("ACS.OVERIDE_TIMES"))      CMDOPT(OVERRIDE_TIMES,1); else CMDOPT(OVERRIDE_TIMES,def);
   if(ACS("ACS.SYSOP_READ"))         CMDOPT(SYSOP_READ,1); else CMDOPT(SYSOP_READ,def);
   if(ACS("ACS.READ_BULLETINS"))     CMDOPT(BULLETINS,1); else CMDOPT(BULLETINS,def); 
   if(ACS("ACS.EALL_MESSAGES"))
   {
      for(i=0;i<MaxNodes;i++) Sopt[i]->RadBoogie=1;
   }
   else for(i=0;i<MaxNodes;i++) Sopt[i]->RadBoogie=def;
   FreeDiskObject(dobj);
}   
   
void GetIconNodeInfo(int i)
{
   struct DiskObject *dobj;
   char **oldtooltypes;
   char *s;
   char Basis[200];
   char FileName[200];
   char temp[100];
   int j;
   sprintf(Basis,"%sNode%d/Modem",Cmds[i]->BBSLoc,i);
   if(GetFileName(Basis,FileName))
   {
      StripInfo(j,FileName);
      sprintf(Basis,"%sNode%d/Modem/%s",Cmds[i]->BBSLoc,i,FileName);
      dobj=GetDiskObject(Basis);
      if(dobj!=NULL)
      {
         oldtooltypes=dobj->do_ToolTypes;
         if(s=FindToolType(oldtooltypes,"MODEM.INIT")) strcpy(Cmds[i]->MInit,s);
         if(s=FindToolType(oldtooltypes,"MODEM.RESET")) strcpy(Cmds[i]->MReset,s);
         if(s=FindToolType(oldtooltypes,"MODEM.RING")) strcpy(Cmds[i]->MRing,s);
         if(s=FindToolType(oldtooltypes,"MODEM.ANSWER")) strcpy(Cmds[i]->MAnswer,s);
         if(s=FindToolType(oldtooltypes,"MODEM.OFFHOOK")) strcpy(Sopt[i]->OffHook,s);
         if(s=FindToolType(oldtooltypes,"MODEM.CALLERID-1")) Sopt[i]->Toggles[15]=1;
         if(s=FindToolType(oldtooltypes,"MODEM.CALLERID-2")) Sopt[i]->Toggles[16]=1;
          FreeDiskObject(dobj);
      }
   }
   sprintf(Basis,"%sNode%d/Serial",Cmds[i]->BBSLoc,i);
   if(GetFileName(Basis,FileName))
   {
      StripInfo(j,FileName);
      sprintf(Basis,"%sNode%d/Serial/%s",Cmds[i]->BBSLoc,i,FileName);
      dobj=GetDiskObject(Basis);
      if(dobj!=NULL)
      {
         oldtooltypes=dobj->do_ToolTypes;
         if(s=FindToolType(oldtooltypes,"SERIAL.UNIT")) Cmds[i]->SerDevUnit=atoi(s);
         if(s=FindToolType(oldtooltypes,"SERIAL.BAUD")) Cmds[i]->OpeningBaud=atol(s);
         if(s=FindToolType(oldtooltypes,"SERIAL.DRIVER")) strcpy(Cmds[i]->SerDev,s);
         if(s=FindToolType(oldtooltypes,"SERIAL.A2232_PATCH")) Sopt[i]->A2232=TRUE;
         if(s=FindToolType(oldtooltypes,"SERIAL.NO_PURGELINE")) Sopt[i]->Toggles[11]=1;
         if(s=FindToolType(oldtooltypes,"SERIAL.REPURGE")) Sopt[i]->Toggles[12]=1;
         if(s=FindToolType(oldtooltypes,"SERIAL.LOGOFF_RESET")) Sopt[i]->Toggles[17]=1;
         if(s=FindToolType(oldtooltypes,"SERIAL.TRUE_RESET")) Sopt[i]->Toggles[0]=1;
           FreeDiskObject(dobj);
      }
    }
    sprintf(FileName,"%sNode%d/WINDOW.DEF",Cmds[i]->BBSLoc,i);
    dobj=GetDiskObject(FileName);
    if(dobj)
    {
       oldtooltypes=dobj->do_ToolTypes;
       if(s=FindToolType(oldtooltypes,"WINDOW.LEFTEDGE")) Sopt[i]->LeftEdge=atoi(s);
       if(s=FindToolType(oldtooltypes,"WINDOW.TOPEDGE")) Sopt[i]->TopEdge=atoi(s);
       if(s=FindToolType(oldtooltypes,"WINDOW.HEIGHT")) Sopt[i]->Height=atoi(s);
       if(s=FindToolType(oldtooltypes,"WINDOW.WIDTH")) Sopt[i]->Width=atoi(s);
       if(s=FindToolType(oldtooltypes,"WINDOW.STATBAR")) Sopt[i]->StatBar=TRUE;
       if(s=FindToolType(oldtooltypes,"WINDOW.ICONIFIED")) Sopt[i]->Iconify=TRUE;
       if(s=FindToolType(oldtooltypes,"WINDOW.INTERLACE")) Sopt[i]->Interlace=TRUE;
       if(s=FindToolType(oldtooltypes,"WINDOW.TO_FRONT")) Cmds[i]->AcLvl[SCREEN_TO_FRONT]=1;
       if(s=FindToolType(oldtooltypes,"WINDOW.NUM_COLORS"))
       {
          j=atoi(s);
          switch(j)
          {
            case 0: Sopt[i]->BitPlanes=0; break;
            case 1:
            case 2: Sopt[i]->BitPlanes=1; break;
            case 3:
            case 4: Sopt[i]->BitPlanes=2; break;
            case 5:
            case 6: 
            case 7:
            case 8: Sopt[i]->BitPlanes=3; break;
            default: Sopt[i]->BitPlanes=3; break; 
          }
       }
       FreeDiskObject(dobj);
    }
     sprintf(FileName,"%sNode%d",Cmds[i]->BBSLoc,i);
    dobj=GetDiskObject(FileName);
    if(dobj)
    {
       oldtooltypes=dobj->do_ToolTypes;
       if(s=FindToolType(oldtooltypes,"SYSTEM_PASSWORD")) strcpy(Cmds[i]->SysPass,s);
       if(s=FindToolType(oldtooltypes,"REMOTE_PASSWORD")) strcpy(Cmds[i]->RemotePass,s);
       if(s=FindToolType(oldtooltypes,"NEWUSER_PASSWORD")) strcpy(Cmds[i]->NEW_UserPW,s);
       if(s=FindToolType(oldtooltypes,"PRIORITY")) Cmds[i]->TaskPri=atoi(s);
       if(s=FindToolType(oldtooltypes,"QUIETNODE")) Sopt[i]->Toggles[9]=TRUE;
       if(s=FindToolType(oldtooltypes,"NODESTART")) 
       {
         strcpy(Basis,s);
         sprintf(FileName,"%s %d",Basis,i);
         strcpy(&StartNode[i][0],FileName);
         StartUp=TRUE;
       }
         
       if(s=FindToolType(oldtooltypes,"IDLENODE")) NodeIdle[i]=1;
       if(s=FindToolType(oldtooltypes,"TRAPDOOR")) Sopt[i]->TrapDoor=TRUE;
       if(s=FindToolType(oldtooltypes,"PLAYPEN")) strcpy(Sopt[i]->RamPen,s);
       if(s=FindToolType(oldtooltypes,"SENTBY_FILES")) Cmds[i]->AcLvl[SENTBY_FILES]=1;
       if(s=FindToolType(oldtooltypes,"CHAT_ON")) Cmds[i]->AcLvl[DEFAULT_CHAT_ON]=1;
       if(s=FindToolType(oldtooltypes,"CAPITOL_FILES")) Cmds[i]->AcLvl[CAPITOLS_in_FILE]=1;
       if(s=FindToolType(oldtooltypes,"SYSOP_CHAT_COLOR")) Cmds[i]->AcLvl[CHAT_COLOR_SYSOP]=atoi(s);
       if(s=FindToolType(oldtooltypes,"USER_CHAT_COLOR")) Cmds[i]->AcLvl[CHAT_COLOR_USER]=atoi(s);
       if(s=FindToolType(oldtooltypes,"KEEP_UPLOAD_CREDIT")) Cmds[i]->AcLvl[KEEP_UPLOAD_CREDIT]=atoi(s);
       if(s=FindToolType(oldtooltypes,"FREE_RESUMING")) Cmds[i]->AcLvl[ALLOW_FREE_RESUMING]=1;
       if(s=FindToolType(oldtooltypes,"CALLERS_LOG")) Cmds[i]->AcLvl[DO_CALLERSLOG]=1;
       if(s=FindToolType(oldtooltypes,"UD_LOG")) Cmds[i]->AcLvl[DO_UD_LOG]=1;
       if(s=FindToolType(oldtooltypes,"DOOR_LOG")) Sopt[i]->Toggles[2]=1;
       if(s=FindToolType(oldtooltypes,"START_LOG")) Sopt[i]->Toggles[3]=1;
       if(s=FindToolType(oldtooltypes,"NO_TIMEOUT")) Sopt[i]->Toggles[4]=1;
       if(s=FindToolType(oldtooltypes,"NO_MCI_MSG")) Sopt[i]->Toggles[5]=1; 
       if(s=FindToolType(oldtooltypes,"BREAK_CHAT")) Sopt[i]->Toggles[7]=1;
       if(s=FindToolType(oldtooltypes,"NO_WILDCARD_EXPANSION")) Sopt[i]->Toggles[14]=0; else
                                      Sopt[i]->Toggles[14]=1;
       if(s=FindToolType(oldtooltypes,"DISABLE_QUICK_LOGONS")) Sopt[i]->QLogon=1;
       if(s=FindToolType(oldtooltypes,"FILESNOTALLOWED")) strcpy(Sopt[i]->FilesNot,s);
       if(s=FindToolType(oldtooltypes,"SCREENS")) strcpy(Sopt[i]->PubScreen,s); else
       {
          sprintf(temp,"%sNode%d/",Cmds[i]->BBSLoc,i); strcpy(Sopt[i]->PubScreen,temp);
       }
       FreeDiskObject(dobj);
    }
          

}
int GetFileName(char *path,char *buf)
{
   int returnval=0;
   if ((dir_info =(struct FileInfoBlock *)AllocDosObject(DOS_FIB,NULL)) == NULL)
   {
     Delay(300L);
     return(0);
   }
  if (! (pdir=(struct FileLock *)Lock(path,(ULONG)ACCESS_READ)) )
  {
       FreeDosObject(DOS_FIB,dir_info);
       free_pdir();
       return(0);
  }
  if ( ! Examine((BPTR)pdir, dir_info) )
  {
    FreeDosObject(DOS_FIB,dir_info);
    free_pdir();
    return(0);
  }
  if(ExNext((BPTR)pdir,dir_info))
  {
    if(dir_info->fib_DirEntryType < 0L )
    {
        returnval=1; strcpy(buf,dir_info->fib_FileName);
    }
  }
   free_pdir();
   FreeDosObject(DOS_FIB,dir_info);
  return(returnval);
}
void free_pdir(void)
{
   if ( pdir )
      {
      UnLock((BPTR)pdir);
      pdir=NULL;
       }
   return;  
}