#include <exec/exec.h>
#include <stdio.h>
#include <stdlib.h>
#include "sc:ae/CmodGlue/glue.h"
#include "sc:ae/CmodGlue/doorheader.h"
#include <dos/dos.h>
#include <dos/dosextens.h>
#include <clib/dos_protos.h>
#include <clib/exec_protos.h>
#include <workbench/workbench.h>
#include <clib/icon_protos.h>
#include <string.h>
#define pm prompt
#define sm sendmessage
#define hk hotkey
#define gu getuserstring
void sr(char *s);
void LastCommand(void);
void end(void);
void DeleteMail(void);
void DoGetNet(void);
int LoadNetMail(char *s);
void FixIcon(void);
void ShowIcon(void);
void InitPass(void);
int netnode;
char VaultCfg[100];
char BBSLoc[100];
char *files;
struct Library *IconBase;
void MoveToInBound(void);
int Secure(char *s);
int GetPass(int num);
int GetHostInfo(char *t,int opt);
int batch;
int GotNames=0;
int LoadMap(char *s);
int LoadPack(char *s);
char Password[6][80];
struct DiskObject *showobj;
main(int argc,char *argv[])
{
   char image[200];
   char temp[100];
   if(argc!=2)
   {
      printf("LOGNET version 2.3, written by Joseph Hodge\n");
      printf("This is an XIM for /X 3.0+\n");
      printf("\n");
      exit(0);
   }
   Register(argv[1][0]-'0');
   IconBase=OpenLibrary("icon.library",0L);
   files=AllocMem(32000L,MEMF_CLEAR|MEMF_PUBLIC);
   netnode=argv[1][0]-'0';
doagain:
   pm("ANSI graphics (Y/n)? ",image,10);
if(strstr(image,"n") || strstr(image,"N"))
   PutInfo(0,DT_ANSICOLOR); else PutInfo(1,DT_ANSICOLOR);
   if(strstr(image,"q") || strstr(image,"Q"))
   PutInfo(1,DT_QUICKFLAG); else PutInfo(0,DT_QUICKFLAG);
  
   sprintf(VaultCfg,"%s",argv[0]);
   sr(VaultCfg);
   strcat(VaultCfg,".cfg");
   if(!strcmp(image,"@--NET--@"))
   {
      DoGetNet();
      sm("",1);
      goto doagain;
   }
   gu(BBSLoc,BB_LOCAL);
   strcpy(temp,"");
    ShutDown();
   end();
}

void LastCommand(void)
{
   sm("",1); sm("",1);
}
void end(void)
{ 
   if(showobj) FreeDiskObject(showobj);
   CloseLibrary(IconBase);
   FreeMem(files,32000L);
   exit(0);
}
 char netaddress[10];
  
void DoGetNet(void)
{
   FILE *fi;
   struct DiskObject *dobj;
   char image[100];
   char temp[20];
   char nodedata[20];
   sm("[33m*--LOGNET-v2.3--*",1);
   pm("[32mNET NODE[36m>:[33m ",netaddress,8);
   sm("[0m",0);
   sr(netaddress);
   gu(BBSLoc,BB_LOCAL);
   sprintf(image,"%sAmiXnet/Directory/%s",BBSLoc,netaddress);
   showobj=GetDiskObject(image);
   if(showobj==NULL)
   {
     sm("",1);
     sm("Error, Invalid Node Address!",1);
     sm("",1);
     return;
   }
   if(!Secure(netaddress)) return;
  
   ShowIcon();
   hotkey("[32mIs This Correct (Y/n) >:[0m",nodedata);
   if(nodedata[0]=='n' || nodedata[0]=='N') FixIcon();
   sm("",1);
   batch=1;
   while(batch)
   {
   if(LoadNetMail(netaddress))
   {
   
   hk("[33mPress anykey to download AmiXnet Packet[0m",temp);sm("",1);    
       if(!BatchDownload((APTR)files))
       {
         sm("",1);
         sm("[32mError, with NetMail download[0m",1);
         sm("",1);
         return;
       }
       else DeleteMail();
   }
   }
   sprintf(image,"%sNode%d/PlayPen/",BBSLoc,netnode);
   hotkey("[32mDo you have netmail to xfer [36m([33mY/n[36m) [35m>:[0m",netaddress);
   if(netaddress[0]=='N' || netaddress[0]=='n')
   {
     sm("[31mNo.[0m",1);
     return;
   }
   sm("[32mYes.[0m",1);
   sm("",1);
   hk("[33mPress anykey to upload AmiXnet Packet[0m",temp); sm("",1);
   if(!Upload(image))
   {
     sm("",1);
     sm("[32mError, with NetMail upload[0m",1);
     sm("",1);
     DeleteFile(image);
     return;
   }else MoveToInBound();
  
}
int LoadNetMail(char *s)
{
  int found=0;
 strcpy(files,"");

  if(LoadPack(s)) found=1;
  if(!batch){if(LoadMap(s)) found=1;}
  return(found);
}

int LoadPack(char *s)
{
  char address[20];
     char image[100];
  FILE *fi,*fo;
  struct FileInfoBlock *FBlock;
  int ishost=0;
 BPTR FLock;
 char str[100];
 int found=0;
 int filecount=0;
 sprintf(str,"%sAmiXnet/Pack",BBSLoc);
 strcpy(address,s);
 batch=0;
 if(FBlock=AllocMem((long)sizeof(struct FileInfoBlock),MEMF_CHIP)) {
exp:
	    if(FLock=Lock(str,ACCESS_READ))	{

 		if(Examine(FLock,FBlock)) {
              while(ExNext(FLock,FBlock) && filecount<8)
              {
                strcpy(image,FBlock->fib_FileName);
                if(strlen(image)>=10)
                {
                   ishost=0;
                   if(image[8]=='-') ishost=GetHostInfo(image,1);
                   if(!strncmp(&image[1],address,7) || ishost)
                   {

                     sprintf(image,"%s/%s ",str,FBlock->fib_FileName);
                     sm("[32mPreparing [33m",0); sm(FBlock->fib_FileName,0);
                     sm("[0m",1);
                     strcat(files,image); filecount++;
                     found=1;
                   }
                   else
                   if(!strnicmp(image,"Names@",6) && !GotNames)
                   {
                     sprintf(image,"%s/%s ",str,FBlock->fib_FileName);
                     sm("[32mPreparing [33m",0); sm(FBlock->fib_FileName,0);
                     sm("[0m",1);
                     strcat(files,image); filecount++; GotNames=1;
                     found=1;
                   }
                }
			}
               if(filecount==8) batch=1; else batch=0;
		}
          UnLock(FLock);   
         }
	    FreeMem(FBlock,sizeof(struct FileInfoBlock));
	}
     return(found);
} 
int LoadMap(char *s)
{
  char address[20];
     char image[100];
  FILE *fi,*fo;
  struct FileInfoBlock *FBlock;
  int ishost=0;
 BPTR FLock;
 char str[100];
 int found=0;
 int filecount=0;
 sprintf(str,"%sAmiXnet/Mapped",BBSLoc);
 strcpy(address,s);
 batch=0;
 if(FBlock=AllocMem((long)sizeof(struct FileInfoBlock),MEMF_CHIP)) {
exp:
	    if(FLock=Lock(str,ACCESS_READ))	{

 		if(Examine(FLock,FBlock)) {
              while(ExNext(FLock,FBlock) && filecount<8)
              {
                strcpy(image,FBlock->fib_FileName);
                if(strlen(image)>=10)
                {
                   ishost=0;
                   if(image[8]=='-') ishost=GetHostInfo(image,0);
                   if(!strncmp(&image[1],address,7) || ishost)
                   {

                     sprintf(image,"%s/%s ",str,FBlock->fib_FileName);
                     sm("[32mPreparing [33m",0); sm(FBlock->fib_FileName,0);
                     sm("[0m",1);
                     strcat(files,image); filecount++;
                     found=1;
                   }
                   
                }
			}
               if(filecount==8) batch=1; else batch=0;
		}
          UnLock(FLock);   
         }
	    FreeMem(FBlock,sizeof(struct FileInfoBlock));
	}
     return(found);
} 
int GetHostInfo(char *t,int opt)
{
   struct DiskObject *dobj;
   char **tooltype;
   char *s;
   char image[200];
   char nodeid[100]; char confid[100];
   sprintf(nodeid,"%7.7s",t+1);
   sprintf(confid,"%s",t+8);

   sprintf(image,"%sAmiXnet/Subs/HS%s",BBSLoc,confid);
   if(dobj=GetDiskObject(image))
   {
     tooltype=dobj->do_ToolTypes;
     if(s=FindToolType(tooltype,"HOST_ID"))
     {
       if(MatchToolValue(s,netaddress)) { FreeDiskObject(dobj); return(opt); }
     }
     if(s=FindToolType(tooltype,"MAPPED_ID"))
     {
       if(MatchToolValue(s,netaddress)) { FreeDiskObject(dobj); return(opt); }
     }
     if(s=FindToolType(tooltype,nodeid))
     {
       if(MatchToolValue(s,netaddress)) { FreeDiskObject(dobj); return(1); }
     }
     FreeDiskObject(dobj); return(0);
   }
  sprintf(image,"%sAmiXnet/Subs/RS%s",BBSLoc,confid);
   if(dobj=GetDiskObject(image))
   {
     tooltype=dobj->do_ToolTypes;
     if(s=FindToolType(tooltype,"HOST_ID"))
     {
       if(MatchToolValue(s,netaddress)) { FreeDiskObject(dobj); return(opt); }
     }
     if(s=FindToolType(tooltype,"MAPPED_ID"))
     {
       if(MatchToolValue(s,netaddress)) { FreeDiskObject(dobj); return(opt); }
     }
     if(s=FindToolType(tooltype,nodeid))
     {
       if(MatchToolValue(s,netaddress)) { FreeDiskObject(dobj); return(1); }
     }
     FreeDiskObject(dobj); return(0);
   }
   return(0);
}
void MoveToInBound(void)
{
     char image[100];
  FILE *fi,*fo;
  struct FileInfoBlock *FBlock;
 BPTR FLock;
 int i;
 char str[100];
 sprintf(str,"%sNode%d/PlayPen",BBSLoc,netnode);
 sm("",1);
 sm("[35mStandBy Transfering Mail![0m",1);
 sm("",1);

 if(FBlock=AllocMem((long)sizeof(struct FileInfoBlock),MEMF_CHIP)) {
exp:
	    if(FLock=Lock(str,ACCESS_READ))	{

 		if(Examine(FLock,FBlock)) {
              while(ExNext(FLock,FBlock))
              {
                sprintf(image,"%sAmiXnet/InBound/%s",BBSLoc,FBlock->fib_FileName);
                sprintf(str,"%sNode%d/PlayPen/%s",BBSLoc,netnode,FBlock->fib_FileName);
                fi=fopen(str,"rb");
                fo=fopen(image,"ab");
                while(fread((APTR)&image,sizeof(char),1,fi)!=NULL)
                    fwrite((APTR)&image,sizeof(char),1,fo);
                fclose(fi);
                fclose(fo);
                DeleteFile(str);
			}
		}
          UnLock(FLock);   
         }
	    FreeMem(FBlock,sizeof(struct FileInfoBlock));
	}
     return;
} 

void DeleteMail(void)
{
  char filename[200];
  register int i;
  register int j;
  i=0;j=0;
  while(1)
  {
     while(*(files+i)!='\0') i++;
     strcpy(filename,files+j);
     if(!strstr(filename,"Names@"))
     DeleteFile(filename);
     j=i+1;
     if(*(files+j)=='\0') break;
     i++;
  }
}
void sr(char *s)
{
  register int i;
  i=strlen(s)-1;
  while(i>-1)
  {
    if(*(s+i)<=32) *(s+i)='\0'; else break;
    i--;
  }
}

int Secure(char *s)
{
  FILE *fi;
  char temp[100];
  BOOL found=FALSE;
  register int i;
  register int j;
  BOOL gotpass=FALSE;
  InitPass();
  fi=fopen(VaultCfg,"r");
  if(fi==NULL){ sm("",1); sm("[32mLognet Not Secure, Aborting![0m",1); sm("",1);return(0); }
  i=0;
  while(fgets(temp,80,fi)!=NULL)
  {
    sr(temp); strupr(temp);
    if(!strcmp(temp,s))
    {
       found=TRUE;
       while(fgets(temp,80,fi)!=NULL)
       {
         if(gotpass && temp[0]!='#') break;
         sr(temp);
         strupr(temp);
         if(temp[0]=='#' && i<5)
         {
           gotpass=TRUE;
           strcpy(Password[i],&temp[2]);
           i++; 
         }
       }
       fclose(fi);
       break;
    }
  }
  if(!found) { fclose(fi); 
   sm("",1);
   sm("[36mPlease notify the Sysop that you need a LogNet Password",1);
   sm("",1);
   return(0); }
  j=0;
  while(j<i)
  {
     if(!GetPass(j)) { sm("",1); return(0);}
     sm("",1);
     j++;
  }
  return(1);
         
}     

int GetPass(int num)
{
   char Temp[100];
   register int i;
   register int j;
   char pass[200];
 i=3;
   if(Password[num][0]=='\0') return(1);
 while(i)
 {
   sprintf(Temp,"[32mLogNet password [44m[36m([33m%d[36m)[0m >[33m: [0m",num+1);
   sm("",1);
   sm(Temp,0);
   strcpy(Temp,Password[num]);
   j=0;
   do
   {
     hk("",Temp);
     
     if(Temp[0]=='\b')
     {
        if(j==0) continue;
        sm("\b \b",0); j--; continue;
     }
strupr(Temp);
     if(Temp[0]!=13 && Temp[0]!=12) {pass[j]=Temp[0]; sm("[35mX[0m",0); j++;}
   }
   while(Temp[0]!=13 && Temp[0]!=12 && j<30);
   pass[j]='\0';
   if(!strcmp(pass,Password[num])) return(1);
   sm("",1);
   i--;
 }
 return(0);
}


void InitPass(void)
{
  register int i=0;
  while(i<5) { strcpy(Password[i],""); i++;}
}
 



void ShowIcon(void)
{
   char image[200];
   char **oldtooltypes;
   char *s;
   oldtooltypes=showobj->do_ToolTypes;
   sm("[35mNet Node Indicitive Data[0m",1);
   sm("[33m------------------------[0m",1);
   if(showobj)
   {
 if(s=FindToolType(oldtooltypes,"NODE.HEADER"))
     {
          sm("[32mBBS Name        [33m: [36m",0);
       sm(s,1);
     }
     else sm("[32mBBS Name        [33m:[0m",1);
    
     if(s=FindToolType(oldtooltypes,"NODE.SYSOP"))
     {
          sm("[32mNode Sysop      [33m: [36m",0);
          sm(s,1);
     }
     else sm("[32mNode Sysop      [33m: [0m",1);

     if(s=FindToolType(oldtooltypes,"NODE.PHONENUMBER"))
     {
          sm("[32mNode PhoneNumber[33m: [36m",0);
          sm(s,1);
     }
     else sm("[32mNode PhoneNumber[33m:[0m",1);
  
     if(s=FindToolType(oldtooltypes,"NODE.BAUD"))
     {
          sm("[32mMax Baud        [33m: [36m",0);
       sm(s,1);
     }
     else sm("[32mMax Baud        [33m:[0m",1);
  }
  sm("",1);
}

UBYTE tooltype[40][80];
UBYTE *tools[40];
void FixIcon(void)
{
  int correct=FALSE;
  char image[200];
  char image1[40];
  char image2[40];
  char image3[40];
  char image4[40];
  struct Gadget *srcgad;
  struct DiskObject new;
  
  while(1)
  {
  sm("",1);
  sm("",1);
  pm("[32mBBS Name        [33m>: [0m",image1,30); 
  pm("[32mNode Sysop      [33m>: [0m",image2,32);
  pm("[32mNode PhoneNumber[33m>: [0m",image3,30);
  pm("[32mMax Baud        [33m>: [0m",image4,30);
  hk("[36mIs this entry correct (Y/n)",image);
  sm("",1);
  if(image[0]=='N' || image[0]=='n') continue; else break;
  }
  sprintf(&tooltype[0][0],"NODE.HEADER=%s",image1);
  sprintf(&tooltype[1][0],"NODE.SYSOP=%s",image2);
  sprintf(&tooltype[2][0],"NODE.PHONENUMBER=%s",image3);
  sprintf(&tooltype[3][0],"NODE.BAUD=%s",image4);
  strcpy(&tooltype[4],"");
  tools[0]=&tooltype[0];
  tools[1]=&tooltype[1];
  tools[2]=&tooltype[2];
  tools[3]=&tooltype[3];
  tools[4]=NULL;
   srcgad=(struct Gadget *)&showobj->do_Gadget;
       CopyMem(showobj,&new,sizeof(struct DiskObject));
       new.do_Gadget.Width=srcgad->Width;
       new.do_Gadget.Height=srcgad->Height;
       new.do_Gadget.Flags=srcgad->Flags;
       new.do_Gadget.Activation=srcgad->Activation;
       new.do_Gadget.GadgetType=srcgad->GadgetType;
       new.do_Gadget.GadgetRender=srcgad->GadgetRender;
       new.do_Gadget.SelectRender=srcgad->SelectRender;
       new.do_ToolTypes=(APTR)tools;
       new.do_Type= WBPROJECT;
       new.do_CurrentX=NO_ICON_POSITION;
       new.do_CurrentY=NO_ICON_POSITION;
      sprintf(image,"%sAmiXnet/Directory/%s",BBSLoc,netaddress);
  
       PutDiskObject(image,(struct DiskObject *)&new);
 

}